From a46024bf3ebbd96aaabeb7aa1175eccbb50b4a54 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 11 Oct 2026 15:33:14 +0200 Subject: [PATCH] Publish reviewed KEY39 lifecycle source and preserve failed review history Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a126e1-76f8-7643-8cf3-e93336539ade --- docs/openbao-negative-probe-clients.yaml | 2 +- ...openbao-negative-probe-session-proposal.md | 22 ++++- ...key39-lifecycle-v2-keycape-source-ack.json | 66 +++++++++++++ ...fecycle-v2-keycape-source-ack.sources.json | 93 ++++++++++++++++++ ...key39-lifecycle-v4-keycape-source-ack.json | 83 ++++++++++++++++ ...fecycle-v4-keycape-source-ack.sources.json | 94 ++++++++++++++++++ ...key39-lifecycle-v5-keycape-source-ack.json | 93 ++++++++++++++++++ ...fecycle-v5-keycape-source-ack.sources.json | 95 +++++++++++++++++++ ...Y-WP-0039-openbao-negative-probe-tokens.md | 94 ++++++++++++++++++ 9 files changed, 640 insertions(+), 2 deletions(-) create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.json create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.sources.json create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.sources.json create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.json create mode 100644 docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.sources.json diff --git a/docs/openbao-negative-probe-clients.yaml b/docs/openbao-negative-probe-clients.yaml index a225193..7130366 100644 --- a/docs/openbao-negative-probe-clients.yaml +++ b/docs/openbao-negative-probe-clients.yaml @@ -89,7 +89,7 @@ session: # 2. Add the probe registrations; KeyCape restarts. # 3. Run scripts/openbao_negative_probe.py with the secrets on stdin. # 4. Remove the registrations and the transient Secret; KeyCape restarts. - # Verify that client_credentials for each probe returns invalid_client. + # Verify that client_credentials for each probe returns HTTP 401 invalid_profile_usage with feature client_id. # Each restart drops in-flight logins, so pick a quiet window. # The transient Secret is the only place the values exist outside process # memory. KeyCape resolves secretRef from its environment at startup, so a diff --git a/docs/openbao-negative-probe-session-proposal.md b/docs/openbao-negative-probe-session-proposal.md index e7e3229..fe9a994 100644 --- a/docs/openbao-negative-probe-session-proposal.md +++ b/docs/openbao-negative-probe-session-proposal.md @@ -83,7 +83,7 @@ outside the negative runner and remain required by RPF-WP-0035-T02. In a finally path remove all six registrations and exactly six env references, restore the unchanged baseline registry/config, restart and wait Ready, then -verify client_credentials for each removed client is invalid_client using the +verify client_credentials for each removed client is HTTP 401 invalid_profile_usage with feature client_id using the still-private temporary values. Only then remove the transient Secret and any private human-token file owned by this session. Confirm all six client IDs and Secret/env refs are absent, service positive behavior and baseline deployment @@ -115,3 +115,23 @@ credential values. Two semantic tests fail against the original source: it reported success when the expiry positive control was refused for a subject mismatch, and it classified not-yet-valid as expired. Native execution has not been attempted by this preparation. + + +2026-10-11 KeyCape V4 source acknowledgment: the issuer-facing correction is +acknowledged narrowly in docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json +for exact lifecycle V4 manifest +d079f85c47d5c2635e1ee633ea4d1346b1737ce2be9ca273f22a38e620f418d8. +The removed-client denial contract above is corrected against current +token.go:306-309; wrong-secret feature Authorization is not deletion evidence. +The runner stays unchanged. V4 has finite typed deadlines, Linux main-thread +total HTTP bounds, late-known-session private revoke before refusal, unknown +partial-response outcomes and a bounded guarded cleanup/delete path. These +source checks do not grant native authority or establish runtime acceptance. + +The token-producer handoff remains a concrete execution gap: existing +keycape login/service-token commands write private JSON token files, while the +lifecycle expects private stdin human_token/coding_agent_token. An actually +admitted human public-client/callback, coding-agent live registration/custody +route and reviewed private producer/native placement/cleanup must bridge this +mismatch before native go. No unattended producer or credential admission is +provided by this source acknowledgment. diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.json b/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.json new file mode 100644 index 0000000..315a721 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.json @@ -0,0 +1,66 @@ +{ + "review_id": "KEY-ACK-20261011-KEY39-LIFECYCLE-V2", + "date": "2026-10-11", + "reviewer": "codex acting in KeyCape issuer-owner scope", + "role_scope": "KeyCape INTENT.md Tooling: authentication, issuance, claim shape and caller token lifecycle only", + "work_record": { + "id": "KEY-WP-0039", + "task_id": "KEY-WP-0039-T03", + "status": "done", + "completed_before_acknowledgment": true, + "staged_path": "/tmp/keycape-jwt-lifecycle-owner-review-stage-v2/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "bdd77c1ead0fbafd4834282b2f3cff8f7c4162377473516e2fbf5565438194a3" + }, + "proposal_id": "KEY-WP-0039-T02/attended-lifecycle-v2", + "exact_manifest_sha256": "6fc0fe47f99a97c11c6e7538f5ea02054335df7d46055d3f84bed4e194aeaaed", + "executor_sha256": "9b19909090431194a4e868ba10eeb911fe4dcc5bf006c2f4351beb115ac39750", + "reviewed_runner_sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19", + "disposition": "acknowledge source compatibility within KeyCape issuer boundary", + "scope_accepted": [ + "Six client IDs and per-client env references match the existing non-secret request packet; no production registration or issuer key is changed.", + "Non-audience clients pin secrets-engine-openbao audience; audience probe uses the normal default clientId rule (token.go:589-594).", + "Client-credentials claim source fixes principal_type service and derives subject, tenant, roles, scopes and TTL from the registration; expiry client matches all six bound production claims with one-minute TTL.", + "Original expiry positive control followed by immediate successful self-revoke and expiry-specific refusal remains necessary; source-shape checks are not cryptographic verification.", + "v2 same-origin issuer/token/discovery transport uses no ambient proxy, no redirect following and bounded HTTP responses; unchanged runner receives that transport rather than using its own http_post.", + "Fresh bounded observation/window checks are compatible with attended issuer proof; late cleanup/revoke does not permit new token issuance.", + "Current removed-client response is HTTP401 invalid_profile_usage feature=client_id. Wrong-secret feature=Authorization is insufficient; absence of exact registrations/env refs must also be verified by the runtime owner.", + "Human and coding-agent tokens can fail multiple bound claims; their refusal does not isolate principal_type enforcement." + ], + "scope_excluded": [ + "NetKingdom live config/Deployment/custody handling, cluster pins/restarts/headroom/concurrent-change rollback or runtime-owner acceptance.", + "Platform role/policy/leeway correctness, OpenBao refusal interpretation and effective capability/CCR acceptance.", + "Secrets Engine execution entitlement/no-fallback/adoption and Mason operator/ESO/nonmember acceptance.", + "Founder live authorization, credential isolation, native acceptance or unattended capability admission." + ], + "validation": { + "runner_tests_passed": 17, + "manifest_and_all_entry_hashes_reverified": true, + "six_probe_ids_match_packet": true, + "expiry_production_source_claims_match": true, + "native_actions": false, + "tokens_or_credentials_observed": false + }, + "token_producer_gap": { + "status": "unresolved real execution handoff; no admitted producer established", + "owner_work_record": "KEY-WP-0039-T02", + "existing_surface": "keycape login/service-token write new mode0600 JSON files; human login requires concrete public PKCE client, exact callback, browser/MFA; service-token requires existing custody injection", + "required_consumer": "Lifecycle execute reads private stdin JSON human_token and coding_agent_token", + "missing": [ + "Approved concrete human client/audience/scope/loopback callback and authenticated token verification/correspondence.", + "Independent confirmation that codex-railiance-platform is registered live and custody supplies it through its admitted existing owner route.", + "Reviewed token producer/file-to-process or process-to-process handoff at actual native placement; output suppression and private channel wiring.", + "Explicit ownership and verified cleanup of any caller-owned temporary token file/material, compatible with the session copy constraints." + ], + "native_go_precondition": true, + "unattended_route_claimed": false, + "credential_request_made": false + }, + "states_retained": { + "KEY-WP-0039-T01": "done", + "KEY-WP-0039-T02": "open; no native closure" + }, + "prior_findings_retained": "Earlier frozen source defects/history and original T01 re-agreement remain; acknowledgment applies only to the exact v2 issuer-facing correction.", + "sources_receipt_sha256": "a272cc4af0979a5e47de36515aa5de256998a7006a038a0a00182b79bcc7227b", + "owner_checkout_written": false, + "native_authority_granted": false +} diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.sources.json b/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.sources.json new file mode 100644 index 0000000..6c46203 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.sources.json @@ -0,0 +1,93 @@ +{ + "owner": "key-cape", + "manifest": "/tmp/keycape-jwt-lifecycle-v2-stage/manifest.json", + "manifest_sha256": "6fc0fe47f99a97c11c6e7538f5ea02054335df7d46055d3f84bed4e194aeaaed", + "sources": [ + { + "repo": "key-cape", + "path": "AGENTS.md", + "sha256": "77c8e1ac762e7c101cd09a3aa184993309ed057821bd53fb0d318979a45c9315" + }, + { + "repo": "key-cape", + "path": "INTENT.md", + "sha256": "b22cb440691bb399b064ee10ab1a03e1e07838da1051bf6235fbfe2cf820eb10" + }, + { + "repo": "key-cape", + "path": "src/internal/server/oidc/token.go", + "sha256": "8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/cli.go", + "sha256": "376a8e0d1d60825a8b3ef21d371e3fc353c0a34e461712a6899e264278edbe7f" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/client.go", + "sha256": "61fb150349c5d3714450a90834c59af9a579a8a649c4149297a402cfcf6e39c5" + }, + { + "repo": "key-cape", + "path": "config/service-clients.example.yaml", + "sha256": "b7e17698a0946f387c481b7e27fe9ddea22cdd9db2e34e32a50457e02a34b18e" + }, + { + "repo": "key-cape", + "path": "docs/native-authentication.md", + "sha256": "378a5fa8174580bde811b716ec8e987339013b9f8d7725cb398fa3b9f8d95655" + }, + { + "repo": "key-cape", + "path": "docs/openbao-service-auth-contract.md", + "sha256": "9b815eff44ebe898b93da5f4a5eeb927fe23d9490397386f3bca3682ce5c81dc" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "sha256": "4f38badef723c08871a28a446707e71be1d3cba8b4c3bcedb2759be65e4e3ed5" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "sha256": "23f13d2a5a4204f749f35c5d44ef39d213838cd2fce1c36fb4775254ef1c7f09" + }, + { + "repo": "key-cape", + "path": "scripts/openbao_negative_probe.py", + "sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19" + }, + { + "repo": "key-cape", + "path": "scripts/test_openbao_negative_probe.py", + "sha256": "08d5598357c4db72672b2c4dc21ef09711ac4f9873fb29f8a6949d34afb8d85c" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "3141ce81d444cda59f7ee77283eceb1dbf2b54e52569e446e24ebeb99697934e" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-owner-review-stage-v2/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "bdd77c1ead0fbafd4834282b2f3cff8f7c4162377473516e2fbf5565438194a3", + "status": "staged issuer-owned source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "staged_path": "/tmp/keycape-jwt-lifecycle-owner-review-stage-v2/key-cape/docs/openbao-negative-probe-clients.yaml", + "sha256": "23c3d49e713de76d75916aede5bdd109d8918169a3078e4e776f0478064dc778", + "status": "staged issuer-owned source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-owner-review-stage-v2/key-cape/docs/openbao-negative-probe-session-proposal.md", + "sha256": "5d319da27984b8d85cbb1d424e8aac16d3300a461cc1b61d82fa8213d2a2d672", + "status": "staged issuer-owned source/record correction" + } + ] +} diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json b/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json new file mode 100644 index 0000000..af94cc7 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json @@ -0,0 +1,83 @@ +{ + "review_id": "KEY-ACK-20261011-KEY39-LIFECYCLE-V4", + "date": "2026-10-11", + "reviewer": "codex acting in KeyCape issuer-owner scope", + "role_scope": "KeyCape INTENT.md Tooling: authentication, issuance, claim shape and caller token lifecycle only", + "work_record": { + "id": "KEY-WP-0039", + "task_id": "KEY-WP-0039-T03", + "status": "done", + "completed_before_acknowledgment": true, + "staged_path": "/tmp/keycape-jwt-lifecycle-v4-owner-ack-stage/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "ad4b8b061d28b1618df246c9f461ff83ffc53dbf7c05ea7c7102ec717b32ee7c", + "same_task_refinement": true + }, + "proposal_id": "KEY-WP-0039-T02/attended-lifecycle-v4", + "exact_manifest_sha256": "d079f85c47d5c2635e1ee633ea4d1346b1737ce2be9ca273f22a38e620f418d8", + "executor_sha256": "b4687c2d07819c43b45d0cddcad0488b62eb49175b2a06a43f7806a0838d3a4d", + "reviewed_runner_sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19", + "disposition": "acknowledge source compatibility within KeyCape issuer boundary", + "scope_accepted": [ + "Six client IDs and per-client env references match the existing non-secret request packet; no production registration or issuer key is changed.", + "Non-audience clients pin secrets-engine-openbao audience; audience probe uses the normal default clientId rule (token.go:589-594).", + "Client-credentials claim source fixes principal_type service and derives subject, tenant, roles, scopes and TTL from the registration; expiry client matches all six bound production claims with one-minute TTL.", + "Original expiry positive control followed by immediate successful self-revoke and expiry-specific refusal remains necessary; source-shape checks are not cryptographic verification.", + "v2 same-origin issuer/token/discovery transport uses no ambient proxy, no redirect following and bounded HTTP responses; unchanged runner receives that transport rather than using its own http_post.", + "Fresh bounded observation/window checks are compatible with attended issuer proof; late cleanup/revoke does not permit new token issuance.", + "Current removed-client response is HTTP401 invalid_profile_usage feature=client_id. Wrong-secret feature=Authorization is insufficient; absence of exact registrations/env refs must also be verified by the runtime owner.", + "Human and coding-agent tokens can fail multiple bound claims; their refusal does not isolate principal_type enforcement.", + "V4 finite nonboolean approval/observation inputs and bounded windows prevent issuer exchanges under an indefinite/future-invalid envelope.", + "Real total HTTP request deadlines and postresponse refusal prevent a late issuer exchange from passing; a complete late OpenBao session is privately self-revoked before failure, partial outcomes remain unknown. This acknowledges the issuer-facing lifecycle interface, not Platform enforcement.", + "Final temporary Secret deletion uses the independently runtime-owner-reviewed guarded adapter; KeyCape neither reviews nor grants that native deletion authority." + ], + "scope_excluded": [ + "NetKingdom live config/Deployment/custody handling, cluster pins/restarts/headroom/concurrent-change rollback or runtime-owner acceptance.", + "Platform role/policy/leeway correctness, OpenBao refusal interpretation and effective capability/CCR acceptance.", + "Secrets Engine execution entitlement/no-fallback/adoption and Mason operator/ESO/nonmember acceptance.", + "Founder live authorization, credential isolation, native acceptance or unattended capability admission." + ], + "validation": { + "runner_tests_passed": 17, + "manifest_and_all_entry_hashes_reverified": true, + "six_probe_ids_match_packet": true, + "expiry_production_source_claims_match": true, + "native_actions": false, + "tokens_or_credentials_observed": false, + "supplied_lifecycle_tests_passed": 41, + "independent_net_owner_tests_passed": 17, + "independent_net_owner_unchanged_runner_tests_passed": 17, + "hashes_reverified_after_net_source_review": true + }, + "token_producer_gap": { + "status": "unresolved real execution handoff; no admitted producer established", + "owner_work_record": "KEY-WP-0039-T02", + "existing_surface": "keycape login/service-token write new mode0600 JSON files; human login requires concrete public PKCE client, exact callback, browser/MFA; service-token requires existing custody injection", + "required_consumer": "Lifecycle execute reads private stdin JSON human_token and coding_agent_token", + "missing": [ + "Approved concrete human client/audience/scope/loopback callback and authenticated token verification/correspondence.", + "Independent confirmation that codex-railiance-platform is registered live and custody supplies it through its admitted existing owner route.", + "Reviewed token producer/file-to-process or process-to-process handoff at actual native placement; output suppression and private channel wiring.", + "Explicit ownership and verified cleanup of any caller-owned temporary token file/material, compatible with the session copy constraints." + ], + "native_go_precondition": true, + "unattended_route_claimed": false, + "credential_request_made": false + }, + "states_retained": { + "KEY-WP-0039-T01": "done", + "KEY-WP-0039-T02": "open; no native closure" + }, + "prior_findings_retained": "V1/V2/V3 frozen sources, unsuccessful V2/V3 Net reviews and KeyCape V2 acknowledgment remain as one correction trial. Source-only compatibility refinement does not infer successful native behavior.", + "sources_receipt_sha256": "e448fbf4c8d65886e3f790b91ac2856ea50ae866428086d2ae422073b449ecfa", + "owner_checkout_written": false, + "native_authority_granted": false, + "same_trial": true, + "previous_keycape_ack_sha256": "776e5a522be3a73a00cf690c68fe084d12d5cd04117666f2dab9031d07537199", + "independent_runtime_source_review": { + "owner": "net-kingdom", + "status": "approved source only", + "path": "/tmp/netkingdom-jwt-lifecycle-owner-review-stage/v4/owner-review.json", + "sha256": "4f4498203a31bd46dbc3715c0df1cbb9eee63bed5b2c1baf430ff3c4a37c13cb", + "not_a_KeyCape_runtime_review": true + } +} diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.sources.json b/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.sources.json new file mode 100644 index 0000000..1a1ebdd --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.sources.json @@ -0,0 +1,94 @@ +{ + "owner": "key-cape", + "manifest": "/tmp/keycape-jwt-lifecycle-v4-stage/manifest.json", + "manifest_sha256": "d079f85c47d5c2635e1ee633ea4d1346b1737ce2be9ca273f22a38e620f418d8", + "net_independent_review_sha256": "4f4498203a31bd46dbc3715c0df1cbb9eee63bed5b2c1baf430ff3c4a37c13cb", + "sources": [ + { + "repo": "key-cape", + "path": "AGENTS.md", + "sha256": "77c8e1ac762e7c101cd09a3aa184993309ed057821bd53fb0d318979a45c9315" + }, + { + "repo": "key-cape", + "path": "INTENT.md", + "sha256": "b22cb440691bb399b064ee10ab1a03e1e07838da1051bf6235fbfe2cf820eb10" + }, + { + "repo": "key-cape", + "path": "src/internal/server/oidc/token.go", + "sha256": "8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/cli.go", + "sha256": "376a8e0d1d60825a8b3ef21d371e3fc353c0a34e461712a6899e264278edbe7f" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/client.go", + "sha256": "61fb150349c5d3714450a90834c59af9a579a8a649c4149297a402cfcf6e39c5" + }, + { + "repo": "key-cape", + "path": "config/service-clients.example.yaml", + "sha256": "b7e17698a0946f387c481b7e27fe9ddea22cdd9db2e34e32a50457e02a34b18e" + }, + { + "repo": "key-cape", + "path": "docs/native-authentication.md", + "sha256": "378a5fa8174580bde811b716ec8e987339013b9f8d7725cb398fa3b9f8d95655" + }, + { + "repo": "key-cape", + "path": "docs/openbao-service-auth-contract.md", + "sha256": "9b815eff44ebe898b93da5f4a5eeb927fe23d9490397386f3bca3682ce5c81dc" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "sha256": "4f38badef723c08871a28a446707e71be1d3cba8b4c3bcedb2759be65e4e3ed5" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "sha256": "23f13d2a5a4204f749f35c5d44ef39d213838cd2fce1c36fb4775254ef1c7f09" + }, + { + "repo": "key-cape", + "path": "scripts/openbao_negative_probe.py", + "sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19" + }, + { + "repo": "key-cape", + "path": "scripts/test_openbao_negative_probe.py", + "sha256": "08d5598357c4db72672b2c4dc21ef09711ac4f9873fb29f8a6949d34afb8d85c" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "3141ce81d444cda59f7ee77283eceb1dbf2b54e52569e446e24ebeb99697934e" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-v4-owner-ack-stage/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "ad4b8b061d28b1618df246c9f461ff83ffc53dbf7c05ea7c7102ec717b32ee7c", + "status": "staged own source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-v4-owner-ack-stage/key-cape/docs/openbao-negative-probe-session-proposal.md", + "sha256": "82ab5678426ae78d44464b1293c76bef10d1fedda0b8cea6e0cc2514b89c8684", + "status": "staged own source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "staged_path": "/tmp/keycape-jwt-lifecycle-v4-owner-ack-stage/key-cape/docs/openbao-negative-probe-clients.yaml", + "sha256": "23c3d49e713de76d75916aede5bdd109d8918169a3078e4e776f0478064dc778", + "status": "staged own source/record correction" + } + ] +} diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.json b/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.json new file mode 100644 index 0000000..9ad2ee4 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.json @@ -0,0 +1,93 @@ +{ + "review_id": "KEY-ACK-20261011-KEY39-LIFECYCLE-V5", + "date": "2026-10-11", + "reviewer": "codex acting in KeyCape issuer-owner scope", + "role_scope": "KeyCape INTENT.md Tooling: authentication, issuance, claim shape and caller token lifecycle only", + "work_record": { + "id": "KEY-WP-0039", + "task_id": "KEY-WP-0039-T03", + "status": "done", + "completed_before_acknowledgment": true, + "staged_path": "/tmp/keycape-jwt-lifecycle-v5-owner-ack-stage/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "86a1318a627c611b48fdb4bf8a8d518c1db105c7a895b303856058d89a9218dd", + "same_task_refinement": true + }, + "proposal_id": "KEY-WP-0039-T02/attended-lifecycle-v5", + "exact_manifest_sha256": "d1f997624db46693a7126a6eb6435f6b3a353d5bd67dcc8a539683e4b7147285", + "executor_sha256": "3bcceebc845b17492040c76223d77088257c547a2b890198e7b5c2b04a0cd360", + "reviewed_runner_sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19", + "disposition": "acknowledge source compatibility within KeyCape issuer boundary", + "scope_accepted": [ + "Six client IDs and per-client env references match the existing non-secret request packet; no production registration or issuer key is changed.", + "Non-audience clients pin secrets-engine-openbao audience; audience probe uses the normal default clientId rule (token.go:589-594).", + "Client-credentials claim source fixes principal_type service and derives subject, tenant, roles, scopes and TTL from the registration; expiry client matches all six bound production claims with one-minute TTL.", + "Original expiry positive control followed by immediate successful self-revoke and expiry-specific refusal remains necessary; source-shape checks are not cryptographic verification.", + "v2 same-origin issuer/token/discovery transport uses no ambient proxy, no redirect following and bounded HTTP responses; unchanged runner receives that transport rather than using its own http_post.", + "Fresh bounded observation/window checks are compatible with attended issuer proof; late cleanup/revoke does not permit new token issuance.", + "Current removed-client response is HTTP401 invalid_profile_usage feature=client_id. Wrong-secret feature=Authorization is insufficient; absence of exact registrations/env refs must also be verified by the runtime owner.", + "Human and coding-agent tokens can fail multiple bound claims; their refusal does not isolate principal_type enforcement.", + "V4 finite nonboolean approval/observation inputs and bounded windows prevent issuer exchanges under an indefinite/future-invalid envelope.", + "Real total HTTP request deadlines and postresponse refusal prevent a late issuer exchange from passing; a complete late OpenBao session is privately self-revoked before failure, partial outcomes remain unknown. This acknowledges the issuer-facing lifecycle interface, not Platform enforcement.", + "Final temporary Secret deletion uses the independently runtime-owner-reviewed guarded adapter; KeyCape neither reviews nor grants that native deletion authority.", + "V5 issuer-facing exceptional response close has a separately admitted at-most20ms abort, clipped to remaining original request time when positive and nonresettable aggregate cleanup, with expired aggregate zero calls and fixed private failure/known-session revoke/unknown outcome. This acknowledges interface compatibility, not NetKingdom native or Platform backend acceptance." + ], + "scope_excluded": [ + "NetKingdom live config/Deployment/custody handling, cluster pins/restarts/headroom/concurrent-change rollback or runtime-owner acceptance.", + "Platform role/policy/leeway correctness, OpenBao refusal interpretation and effective capability/CCR acceptance.", + "Secrets Engine execution entitlement/no-fallback/adoption and Mason operator/ESO/nonmember acceptance.", + "Founder live authorization, credential isolation, native acceptance or unattended capability admission." + ], + "validation": { + "runner_tests_passed": 17, + "manifest_and_all_entry_hashes_reverified": true, + "six_probe_ids_match_packet": true, + "expiry_production_source_claims_match": true, + "native_actions": false, + "tokens_or_credentials_observed": false, + "supplied_lifecycle_tests_passed": 46, + "independent_net_owner_tests_passed": 21, + "independent_net_owner_unchanged_runner_tests_passed": 17, + "hashes_reverified_after_net_source_review": true, + "independent_platform_owner_tests_passed": 5, + "hashes_reverified_after_both_independent_source_reviews": true + }, + "token_producer_gap": { + "status": "unresolved real execution handoff; no admitted producer established", + "owner_work_record": "KEY-WP-0039-T02", + "existing_surface": "keycape login/service-token write new mode0600 JSON files; human login requires concrete public PKCE client, exact callback, browser/MFA; service-token requires existing custody injection", + "required_consumer": "Lifecycle execute reads private stdin JSON human_token and coding_agent_token", + "missing": [ + "Approved concrete human client/audience/scope/loopback callback and authenticated token verification/correspondence.", + "Independent confirmation that codex-railiance-platform is registered live and custody supplies it through its admitted existing owner route.", + "Reviewed token producer/file-to-process or process-to-process handoff at actual native placement; output suppression and private channel wiring.", + "Explicit ownership and verified cleanup of any caller-owned temporary token file/material, compatible with the session copy constraints." + ], + "native_go_precondition": true, + "unattended_route_claimed": false, + "credential_request_made": false + }, + "states_retained": { + "KEY-WP-0039-T01": "done", + "KEY-WP-0039-T02": "open; no native closure" + }, + "prior_findings_retained": "V1/V2/V3/V4 frozen source, unsuccessful V2/V3 Net reviews, Platform V4 exceptional-close refusal and prior KeyCape V2/V4 narrow acknowledgments remain as one correction trial; no additional scored/native success.", + "sources_receipt_sha256": "6ba36436559cdc0da035faaf3718f5736a68633a731f103a7084feba5943546f", + "owner_checkout_written": false, + "native_authority_granted": false, + "same_trial": true, + "previous_keycape_ack_sha256": "6e90cbe246658325b01b672162da5b336f65bb769b7608ef578473a409278a13", + "independent_runtime_source_review": { + "owner": "net-kingdom", + "status": "approved source only", + "path": "/tmp/netkingdom-jwt-lifecycle-owner-review-stage/v5/owner-review.json", + "sha256": "32a62bd1ca1bd7311965d016d4d6a6e4d9177f3423c63add436d9d309865eacc", + "not_a_KeyCape_runtime_review": true + }, + "independent_platform_source_review": { + "owner": "railiance-platform", + "status": "approved source only", + "path": "/tmp/platform-key39-lifecycle-owner-review-stage/revision-v5/railiance-platform/docs/reviews/2026-10-11-key39-lifecycle-v5-platform-review.json", + "sha256": "ba872dc53061b1dcca9dea1e8897597c394c1f9365e0fc49ee6f2095f57f11e0", + "not_a_KeyCape_backend_review": true + } +} diff --git a/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.sources.json b/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.sources.json new file mode 100644 index 0000000..567ee0f --- /dev/null +++ b/docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.sources.json @@ -0,0 +1,95 @@ +{ + "owner": "key-cape", + "manifest": "/tmp/keycape-jwt-lifecycle-v5-stage/manifest.json", + "manifest_sha256": "d1f997624db46693a7126a6eb6435f6b3a353d5bd67dcc8a539683e4b7147285", + "net_independent_review_sha256": "32a62bd1ca1bd7311965d016d4d6a6e4d9177f3423c63add436d9d309865eacc", + "sources": [ + { + "repo": "key-cape", + "path": "AGENTS.md", + "sha256": "77c8e1ac762e7c101cd09a3aa184993309ed057821bd53fb0d318979a45c9315" + }, + { + "repo": "key-cape", + "path": "INTENT.md", + "sha256": "b22cb440691bb399b064ee10ab1a03e1e07838da1051bf6235fbfe2cf820eb10" + }, + { + "repo": "key-cape", + "path": "src/internal/server/oidc/token.go", + "sha256": "8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/cli.go", + "sha256": "376a8e0d1d60825a8b3ef21d371e3fc353c0a34e461712a6899e264278edbe7f" + }, + { + "repo": "key-cape", + "path": "src/internal/authclient/client.go", + "sha256": "61fb150349c5d3714450a90834c59af9a579a8a649c4149297a402cfcf6e39c5" + }, + { + "repo": "key-cape", + "path": "config/service-clients.example.yaml", + "sha256": "b7e17698a0946f387c481b7e27fe9ddea22cdd9db2e34e32a50457e02a34b18e" + }, + { + "repo": "key-cape", + "path": "docs/native-authentication.md", + "sha256": "378a5fa8174580bde811b716ec8e987339013b9f8d7725cb398fa3b9f8d95655" + }, + { + "repo": "key-cape", + "path": "docs/openbao-service-auth-contract.md", + "sha256": "9b815eff44ebe898b93da5f4a5eeb927fe23d9490397386f3bca3682ce5c81dc" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "sha256": "4f38badef723c08871a28a446707e71be1d3cba8b4c3bcedb2759be65e4e3ed5" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "sha256": "23f13d2a5a4204f749f35c5d44ef39d213838cd2fce1c36fb4775254ef1c7f09" + }, + { + "repo": "key-cape", + "path": "scripts/openbao_negative_probe.py", + "sha256": "bb9610babf44a959342bac700bb5712e97f400b44c4d0659d21df4426e616e19" + }, + { + "repo": "key-cape", + "path": "scripts/test_openbao_negative_probe.py", + "sha256": "08d5598357c4db72672b2c4dc21ef09711ac4f9873fb29f8a6949d34afb8d85c" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "3141ce81d444cda59f7ee77283eceb1dbf2b54e52569e446e24ebeb99697934e" + }, + { + "repo": "key-cape", + "path": "workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-v5-owner-ack-stage/key-cape/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md", + "sha256": "86a1318a627c611b48fdb4bf8a8d518c1db105c7a895b303856058d89a9218dd", + "status": "staged own source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-session-proposal.md", + "staged_path": "/tmp/keycape-jwt-lifecycle-v5-owner-ack-stage/key-cape/docs/openbao-negative-probe-session-proposal.md", + "sha256": "82ab5678426ae78d44464b1293c76bef10d1fedda0b8cea6e0cc2514b89c8684", + "status": "staged own source/record correction" + }, + { + "repo": "key-cape", + "path": "docs/openbao-negative-probe-clients.yaml", + "staged_path": "/tmp/keycape-jwt-lifecycle-v5-owner-ack-stage/key-cape/docs/openbao-negative-probe-clients.yaml", + "sha256": "23c3d49e713de76d75916aede5bdd109d8918169a3078e4e776f0478064dc778", + "status": "staged own source/record correction" + } + ], + "platform_independent_review_sha256": "ba872dc53061b1dcca9dea1e8897597c394c1f9365e0fc49ee6f2095f57f11e0" +} diff --git a/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md b/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md index 26d244a..84d0828 100644 --- a/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md +++ b/workplans/KEY-WP-0039-openbao-negative-probe-tokens.md @@ -137,3 +137,97 @@ re-agreement plus separate attended live authorization. MASON-WP-0009-T05 operator/ESO capability and nonmember checks remain independent acceptance. 2026-10-11: Platform independently re-agreed the final amended design (session proposal SHA25623f13d2a5a4204f749f35c5d44ef39d213838cd2fce1c36fb4775254ef1c7f09). Original conditional review and narrow confirmation are retained in railiance-platform/docs/reviews/2026-10-11-keycape-openbao-negative-session-owner-review*. Source acceptance T01 is complete; actual registry/leeway/readiness, founder live go, negative/cleanup and separate capability/no-fallback obligations remain T02 and owner plans. + + +## KeyCape issuer-source compatibility inspection for lifecycle v2 + +```task +id: KEY-WP-0039-T03 +status: done +priority: medium +``` + +2026-10-11: Completed KeyCape's own issuer-source inspection for +KEY-WP-0039-T02/attended-lifecycle-v2, exact manifest SHA256 +6fc0fe47f99a97c11c6e7538f5ea02054335df7d46055d3f84bed4e194aeaaed. +Read AGENTS.md, governing INTENT.md, current client-credentials claim source, +registration fragments, native caller-authentication commands and frozen v2 +issuer transport/probe wiring. Seventeen unchanged runner tests pass locally. +This task completes only issuer-source inspection; the resulting narrow +source acknowledgment is in docs/reviews/2026-10-11-key39-lifecycle-v2-keycape-source-ack.json (retained frozen prior acknowledgment). +T01 stays done and T02 stays open for actual native registration, token input, +refusal and cleanup proof. No Secret, token, credential or native environment was accessed; no owner +checkout was changed during this source inspection. Owner source files were +read for the bounded issuer compatibility check. + +Current token.go:306-309 returns HTTP 401 invalid_profile_usage with +feature=client_id for a removed confidential client; wrong-secret +feature=Authorization cannot count as removed-registration evidence. The +proposal and packet comments are narrowly corrected against that current +issuer contract. Prior T01/source re-agreement history is preserved; this source +acknowledgment supplies no NetKingdom runtime-owner review or founder live go. + +The private token-producer handoff remains a real execution gap under T02. +Existing keycape login/service-token commands require a new private output +file; login also needs a concrete admitted public PKCE client/callback and +attended browser/MFA. The lifecycle expects an in-memory private stdin object +containing human_token and coding_agent_token, but no reviewed file-to-process +or process-to-process producer, admitted human client/callback, custody-injected +coding-agent source, native placement or producer cleanup receipt has been +provided. No unattended token producer or admitted secret route is invented. +Resolve those exact owner contracts before founder native approval; existing +static registration is not live token custody or producer admission. + + +2026-10-11 same T03 source-inspection refinement for lifecycle V4: completed +KeyCape issuer-facing inspection before the new formal acknowledgment in +docs/reviews/2026-10-11-key39-lifecycle-v4-keycape-source-ack.json. Exact V4 +manifest SHA256 d079f85c47d5c2635e1ee633ea4d1346b1737ce2be9ca273f22a38e620f418d8, +executor b4687c2d07819c43b45d0cddcad0488b62eb49175b2a06a43f7806a0838d3a4d. +NetKingdom's independent V4 source review is approved, receipt SHA256 +4f4498203a31bd46dbc3715c0df1cbb9eee63bed5b2c1baf430ff3c4a37c13cb. +The V2/V3 unsuccessful reviews and earlier KeyCape acknowledgment remain +retained as one correction trial; they are not extra scored successes. + +V4 retains the unchanged issuer runner and six-client claim design, and fixes +finite/nonboolean windows, true total request deadlines, late-known OpenBao +session private revoke/refusal and guarded bounded final Secret deletion. +The issuer-facing acknowledgement covers only stopping late token exchanges, +claim source/shape and preserving token cleanup failure/unknown outcomes; it +does not replace NetKingdom runtime or Platform backend acceptance. Tests: 41 +supplied lifecycle, 17 unchanged runner and 17 independent owner checks pass +locally. No native tokens, credentials, issuer mutations or live cleanup were +performed. T01 stays done; T02 stays open and the genuine private token-producer +handoff remains its next source prerequisite before actual founder native go. + + +2026-10-11 same T03 source-inspection refinement for lifecycle V5: completed +KeyCape's own current issuer-source/claim/cleanup-contract inspection before +any new formal acknowledgment. Current token.go:306-309 still distinguishes +removed-client invalid_profile_usage feature=client_id from wrong-secret +feature=Authorization. The six-client design, audience source and expiry +positive control remain unchanged, and the original runner's 17 tests pass. +Exact V5 manifest SHA256 +d1f997624db46693a7126a6eb6435f6b3a353d5bd67dcc8a539683e4b7147285; +executor 3bcceebc845b17492040c76223d77088257c547a2b890198e7b5c2b04a0cd360. +V5 has 46 passing supplied lifecycle checks. It adds a single exceptional +response-close abort under a fixed20ms cap clipped to nonresettable aggregate +cleanup, and to positive original request time remaining, with expired aggregate +zero calls, fixed private errors and truthful known-session revoke/unknown +outcomes. This inspection covers issuer-facing token lifetime and claim +interfaces only; NetKingdom and Platform independently own their runtime and +backend review decisions. Previous V2/V3 Net source refusals and Platform V4 +exceptional-close refusal remain retained; KeyCape's V2/V4 acknowledgments are +historical narrow source inspections, never aggregate native approval. +T01 remains done, T02 open. No native actions or credentials occurred. The real +private token-producer/client/callback/coding-agent custody/cleanup handoff gap +stays the next prerequisite; no unattended admission is inferred. + +Exact independent V5 source decisions were then verified: NetKingdom approved +receipt SHA256 32a62bd1ca1bd7311965d016d4d6a6e4d9177f3423c63add436d9d309865eacc +(46 supplied +17 runner +21 independent checks); Platform approved receipt +SHA256 ba872dc53061b1dcca9dea1e8897597c394c1f9365e0fc49ee6f2095f57f11e0 +(46 supplied +5 independent +17 previously verified runner checks). Those are +foreign owners' own source decisions, not KeyCape runtime/backend reviews or +founder native authority. Formal KeyCape bounded issuer acknowledgment follows +in docs/reviews/2026-10-11-key39-lifecycle-v5-keycape-source-ack.json.