From 1f7f42b277467e49794f7895e6e48940b9020b23 Mon Sep 17 00:00:00 2001 From: tegwick Date: Mon, 14 Sep 2026 01:08:50 +0200 Subject: [PATCH] Prepare exact native recipient and record approval service activation Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a09cbb-87c6-7900-a145-4ce53ba9f1a6 --- ...2026-09-14-approval-engine-deployment.json | 84 ++++++++++++++ ...-09-14-openrouter-final-apply-request.json | 100 +++++++++++++++++ ...6-09-14-openrouter-final-exec-request.json | 103 ++++++++++++++++++ ...09-14-openrouter-final-verify-request.json | 102 +++++++++++++++++ ...26-09-14-openrouter-recipient-install.json | 32 ++++++ docs/native-lane-cutover.md | 6 - docs/openrouter-native-access.md | 25 +++-- docs/proposals/openrouter-key-check.yaml | 96 ++++++++-------- ...ECRETS-WP-0010-openrouter-native-access.md | 28 +++++ 9 files changed, 514 insertions(+), 62 deletions(-) create mode 100644 docs/evidence/2026-09-14-approval-engine-deployment.json create mode 100644 docs/evidence/2026-09-14-openrouter-final-apply-request.json create mode 100644 docs/evidence/2026-09-14-openrouter-final-exec-request.json create mode 100644 docs/evidence/2026-09-14-openrouter-final-verify-request.json create mode 100644 docs/evidence/2026-09-14-openrouter-recipient-install.json diff --git a/docs/evidence/2026-09-14-approval-engine-deployment.json b/docs/evidence/2026-09-14-approval-engine-deployment.json new file mode 100644 index 0000000..319174d --- /dev/null +++ b/docs/evidence/2026-09-14-approval-engine-deployment.json @@ -0,0 +1,84 @@ +{ + "storage": { + "schema_version": 5, + "expected_schema_version": 5, + "schema_current": true, + "persistent": true, + "required_tables": { + "approvals": true, + "entries": true, + "outbox": true + }, + "integrity": [ + "ok" + ], + "foreign_key_violations": 0, + "ok": true + }, + "outbox": { + "total": 1, + "pending": 0, + "max_age_seconds": 0, + "attempts": 1, + "failed_pending": 0, + "counts": { + "issuance": 0, + "use": 0, + "supersession": 0, + "revocation": 0, + "heartbeat": 1 + } + }, + "restored": { + "schema_version": 5, + "expected_schema_version": 5, + "schema_current": true, + "persistent": true, + "required_tables": { + "approvals": true, + "entries": true, + "outbox": true + }, + "integrity": [ + "ok" + ], + "foreign_key_violations": 0, + "ok": true + }, + "readiness": 200, + "anonymous_refusal": 401, + "invalid_bearer_refusal": 401, + "jwks_reachable": true, + "timestamp": "2026-09-13T23:06:37.566144+00:00", + "status": "deployed_and_restart_restore_verified", + "cluster_uid": "a553c742-0115-43d4-99a4-a5ca56fe0786", + "pod_uid_before_restart": "95215659-3b17-4ccf-ab8c-98418439cdbe", + "pod_uid_after_restart": "7b8c05d9-f1d5-403d-abb3-2250bff9db5e", + "image": "forgejo.coulomb.social/coulomb/approval-engine@sha256:251941a5cb2724b57cc32cff6b693b1ab0be695bee4f56f02d51961189c0fa49", + "resources": { + "limits": { + "cpu": "500m", + "memory": "256Mi" + }, + "requests": { + "cpu": "25m", + "memory": "64Mi" + } + }, + "caller_token_automount": false, + "tests": { + "repository": 156, + "changed_manifest": 6 + }, + "backup": { + "persistent_path": "/data/t03-initial-backup-20260914.sqlite", + "independent_local_copy": "/tmp/t03-approval-backup/restored.sqlite", + "restore_exercise": "isolated copy opened with actual engine; live database was not overwritten", + "retention": "initial test backups only; long-term backup schedule/retention not established" + }, + "limitations": [ + "No real approval created, human entry supplied, or credential consumed.", + "Consumer client-side reader and requesting identity remain unadmitted.", + "Heartbeat acknowledgment/outbox persistence proved; independent audit archive retrieval remains Audit Core owner work." + ] +} diff --git a/docs/evidence/2026-09-14-openrouter-final-apply-request.json b/docs/evidence/2026-09-14-openrouter-final-apply-request.json new file mode 100644 index 0000000..eaabeec --- /dev/null +++ b/docs/evidence/2026-09-14-openrouter-final-apply-request.json @@ -0,0 +1,100 @@ +{ + "tenant": "tenant:platform", + "subject": { + "id": "secrets-engine", + "type": "service" + }, + "action": "apply", + "resource": { + "id": "catalog:openrouter-llm-connect", + "type": "secret-catalog-lane", + "system": "secrets-engine", + "attributes": { + "stage": "prod", + "fields": [], + "policy_targets": [ + "se-prod-openrouter-llm-connect" + ], + "auth_targets": [ + "se-prod-openrouter-llm-connect" + ] + } + }, + "context": { + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference", + "catalog_target": { + "kind": "kv", + "org": "coulomb", + "repo": "llm-connect", + "mount": "platform", + "path": "workloads/activity-core/llm-connect/llm-connect-provider-secrets", + "fields": [ + "OPENROUTER_API_KEY" + ], + "mount_management": "existing", + "consumers": [ + { + "name": "llm-connect-activity-core", + "auth": "kubernetes", + "claim": "serviceaccount:external-secrets/external-secrets", + "purpose": "sync llm-connect-provider-secrets for the activity-core deployment" + }, + { + "name": "intelligence-radar-key-check", + "auth": "approle", + "claim": "catalog:openrouter-llm-connect", + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference" + } + ], + "delivery_modes": [ + "exec-env", + "read-check" + ], + "delivery_auth": { + "method": "approle", + "management": "engine", + "policy_name": "se-prod-openrouter-llm-connect", + "role_name": "se-prod-openrouter-llm-connect", + "token_ttl": "15m", + "token_max_ttl": "30m", + "secret_id_ttl": "15m", + "secret_id_num_uses": 1, + "token_num_uses": 8 + }, + "delivery_config": { + "exec_owner": { + "status": "configured", + "owner": "intelligence-radar-key-check", + "command": [ + "/usr/bin/python3.12", + "-I", + "-B", + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py" + ], + "cwd": "/run/user/1000/secrets-engine-openrouter-check", + "environment": { + "LANG": "C.UTF-8" + }, + "files": { + "/usr/bin/python3.12": { + "sha256": "e50d468e8b0adfb05733f5b87b3cff34829c4a8c1aea50c865aa8bdfe4bb150f", + "private": false + }, + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py": { + "sha256": "dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253", + "private": true + } + } + } + }, + "auth_capability": {}, + "workload_delivery": [ + { + "mode": "external-secrets", + "owner": "railiance-platform + llm-connect" + } + ] + }, + "human_control": true + } +} diff --git a/docs/evidence/2026-09-14-openrouter-final-exec-request.json b/docs/evidence/2026-09-14-openrouter-final-exec-request.json new file mode 100644 index 0000000..c729524 --- /dev/null +++ b/docs/evidence/2026-09-14-openrouter-final-exec-request.json @@ -0,0 +1,103 @@ +{ + "tenant": "tenant:platform", + "subject": { + "id": "secrets-engine", + "type": "service" + }, + "action": "exec", + "resource": { + "id": "catalog:openrouter-llm-connect", + "type": "secret-catalog-lane", + "system": "secrets-engine", + "attributes": { + "stage": "prod", + "fields": [ + "OPENROUTER_API_KEY" + ], + "policy_targets": [ + "se-prod-openrouter-llm-connect" + ], + "auth_targets": [ + "se-prod-openrouter-llm-connect" + ] + } + }, + "context": { + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference", + "catalog_target": { + "kind": "kv", + "org": "coulomb", + "repo": "llm-connect", + "mount": "platform", + "path": "workloads/activity-core/llm-connect/llm-connect-provider-secrets", + "fields": [ + "OPENROUTER_API_KEY" + ], + "mount_management": "existing", + "consumers": [ + { + "name": "llm-connect-activity-core", + "auth": "kubernetes", + "claim": "serviceaccount:external-secrets/external-secrets", + "purpose": "sync llm-connect-provider-secrets for the activity-core deployment" + }, + { + "name": "intelligence-radar-key-check", + "auth": "approle", + "claim": "catalog:openrouter-llm-connect", + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference" + } + ], + "delivery_modes": [ + "exec-env", + "read-check" + ], + "delivery_auth": { + "method": "approle", + "management": "engine", + "policy_name": "se-prod-openrouter-llm-connect", + "role_name": "se-prod-openrouter-llm-connect", + "token_ttl": "15m", + "token_max_ttl": "30m", + "secret_id_ttl": "15m", + "secret_id_num_uses": 1, + "token_num_uses": 8 + }, + "delivery_config": { + "exec_owner": { + "status": "configured", + "owner": "intelligence-radar-key-check", + "command": [ + "/usr/bin/python3.12", + "-I", + "-B", + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py" + ], + "cwd": "/run/user/1000/secrets-engine-openrouter-check", + "environment": { + "LANG": "C.UTF-8" + }, + "files": { + "/usr/bin/python3.12": { + "sha256": "e50d468e8b0adfb05733f5b87b3cff34829c4a8c1aea50c865aa8bdfe4bb150f", + "private": false + }, + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py": { + "sha256": "dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253", + "private": true + } + } + } + }, + "auth_capability": {}, + "workload_delivery": [ + { + "mode": "external-secrets", + "owner": "railiance-platform + llm-connect" + } + ] + }, + "human_control": true, + "exec_owner_sha256": "22393c7e751e458fa64bb24305ee66a26bbe3993c5aba03ae1fc1a488e777b42" + } +} diff --git a/docs/evidence/2026-09-14-openrouter-final-verify-request.json b/docs/evidence/2026-09-14-openrouter-final-verify-request.json new file mode 100644 index 0000000..709236a --- /dev/null +++ b/docs/evidence/2026-09-14-openrouter-final-verify-request.json @@ -0,0 +1,102 @@ +{ + "tenant": "tenant:platform", + "subject": { + "id": "secrets-engine", + "type": "service" + }, + "action": "verify", + "resource": { + "id": "catalog:openrouter-llm-connect", + "type": "secret-catalog-lane", + "system": "secrets-engine", + "attributes": { + "stage": "prod", + "fields": [ + "OPENROUTER_API_KEY" + ], + "policy_targets": [ + "se-prod-openrouter-llm-connect" + ], + "auth_targets": [ + "se-prod-openrouter-llm-connect" + ] + } + }, + "context": { + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference", + "catalog_target": { + "kind": "kv", + "org": "coulomb", + "repo": "llm-connect", + "mount": "platform", + "path": "workloads/activity-core/llm-connect/llm-connect-provider-secrets", + "fields": [ + "OPENROUTER_API_KEY" + ], + "mount_management": "existing", + "consumers": [ + { + "name": "llm-connect-activity-core", + "auth": "kubernetes", + "claim": "serviceaccount:external-secrets/external-secrets", + "purpose": "sync llm-connect-provider-secrets for the activity-core deployment" + }, + { + "name": "intelligence-radar-key-check", + "auth": "approle", + "claim": "catalog:openrouter-llm-connect", + "purpose": "IR-WP-0004 read-only OpenRouter key authentication check; no inference" + } + ], + "delivery_modes": [ + "exec-env", + "read-check" + ], + "delivery_auth": { + "method": "approle", + "management": "engine", + "policy_name": "se-prod-openrouter-llm-connect", + "role_name": "se-prod-openrouter-llm-connect", + "token_ttl": "15m", + "token_max_ttl": "30m", + "secret_id_ttl": "15m", + "secret_id_num_uses": 1, + "token_num_uses": 8 + }, + "delivery_config": { + "exec_owner": { + "status": "configured", + "owner": "intelligence-radar-key-check", + "command": [ + "/usr/bin/python3.12", + "-I", + "-B", + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py" + ], + "cwd": "/run/user/1000/secrets-engine-openrouter-check", + "environment": { + "LANG": "C.UTF-8" + }, + "files": { + "/usr/bin/python3.12": { + "sha256": "e50d468e8b0adfb05733f5b87b3cff34829c4a8c1aea50c865aa8bdfe4bb150f", + "private": false + }, + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py": { + "sha256": "dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253", + "private": true + } + } + } + }, + "auth_capability": {}, + "workload_delivery": [ + { + "mode": "external-secrets", + "owner": "railiance-platform + llm-connect" + } + ] + }, + "human_control": true + } +} diff --git a/docs/evidence/2026-09-14-openrouter-recipient-install.json b/docs/evidence/2026-09-14-openrouter-recipient-install.json new file mode 100644 index 0000000..ab3afc7 --- /dev/null +++ b/docs/evidence/2026-09-14-openrouter-recipient-install.json @@ -0,0 +1,32 @@ +{ + "status": "recipient_installed_pending_admission", + "owner_digest": "22393c7e751e458fa64bb24305ee66a26bbe3993c5aba03ae1fc1a488e777b42", + "script_sha256": "dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253", + "binding": { + "status": "configured", + "owner": "intelligence-radar-key-check", + "command": [ + "/usr/bin/python3.12", + "-I", + "-B", + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py" + ], + "cwd": "/run/user/1000/secrets-engine-openrouter-check", + "environment": { + "LANG": "C.UTF-8" + }, + "files": { + "/usr/bin/python3.12": { + "sha256": "e50d468e8b0adfb05733f5b87b3cff34829c4a8c1aea50c865aa8bdfe4bb150f", + "private": false + }, + "/home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py": { + "sha256": "dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253", + "private": true + } + } + }, + "credential_values_read": false, + "active_catalog_changed": false, + "runtime_trust": "system Python/stdlib maintained by root; executable and script pinned; -I -B isolates Python configuration" +} diff --git a/docs/native-lane-cutover.md b/docs/native-lane-cutover.md index fc74fd8..eef3fbe 100644 --- a/docs/native-lane-cutover.md +++ b/docs/native-lane-cutover.md @@ -4,12 +4,6 @@ > live PDP receipt and remaining service/reader gates are in > docs/openrouter-native-access.md (SECRETS-WP-0010). -> Current protocol correction (2026-09-14): follow claim → validated PDP Check → -> CAS consume, as implemented in docs/approval-consumption.md. ActionAuthorization -> is deferred and never ratified. The OpenRouter-specific current implementation, -> live PDP receipt and remaining service/reader gates are in -> docs/openrouter-native-access.md (SECRETS-WP-0010). - # Native lane cutover (SECRETS-WP-0006-T05 / T06) Status: procedure only. Live apply is still fail-closed until diff --git a/docs/openrouter-native-access.md b/docs/openrouter-native-access.md index 29ce286..17f179b 100644 --- a/docs/openrouter-native-access.md +++ b/docs/openrouter-native-access.md @@ -32,10 +32,10 @@ A successful check does not reconcile radar's existing spend reservation. `docs/proposals/openrouter-key-check.yaml` is an inactive proposed catalog overlay. It retains the existing lane id/KV/policy/AppRole and ESO consumer, declares human -control, and names the key-check recipient with a pending exec-owner binding. +control, and names the key-check recipient with an installed, configured exec-owner binding. The active `catalog/openrouter-llm-connect.yaml` remains limited to its admitted -llm-connect purpose. The proposal is outside the active catalog and pending exec -refuses before consume/backend. Do not copy it into the active catalog until +llm-connect purpose. The proposal is outside the active catalog; configuration is not approval. +Its exact interpreter/script paths and pins are recorded in the install receipt. Do not copy it into the active catalog until custody-owner admission and the exact protected recipient installation are reviewed. ## Verification @@ -57,14 +57,15 @@ state their scope and cleanup. This removes the outdated PDP image dependency. ## Remaining admitted execution sequence (SECRETS-WP-0010-T03) -1. Complete APPROVAL-WP-0002-T01/T03/T05 and its identity/audit dependencies; - its declared namespace currently has no StatefulSet, pod or Service. Complete +1. APPROVAL-WP-0002-T03 is now deployed, with existing audit custody and current + JWKS verified (2026-09-14 deployment receipt). T01/T05 still require the + admitted requesting/human/consumer path. Complete RPF-WP-0035-T06 / CCR-2026-0019 client-side reader admission for the secrets-engine approval-client. Keep secrets outside Git and use the existing attended procedure in `docs/approval-service-auth.md`; do not read the verifier's Secret. -2. Have the custody owner admit this exact read-only recipient. Install and pin - its Python runtime and script, exact argv, private working directory and fixed - environment via `docs/exec-owner-binding.md`. Obtain the scoped attended +2. Have the custody owner admit this exact read-only recipient. The configured local installation already pins + its Python executable and script, exact argv, private working directory and fixed + environment; review the installation receipt against `docs/exec-owner-binding.md`. Obtain the scoped attended platform authority; no standing bootstrap credential or sibling identity. 3. Render the finalized request, use the evaluator-origin digest to create a declared-human-control approval, obtain the real human entry, observe claim, @@ -80,3 +81,11 @@ state their scope and cleanup. This removes the outdated PDP image dependency. approval. Reconcile the existing USD 0.023712 reservation in campaign `ir-openrouter-pilot-20260913`; preserve the authorized USD 10 ceiling. This task did not execute the key check or spend campaign funds. + + +The finalized request artifacts are `docs/evidence/2026-09-14-openrouter-final-*-request.json`. +They replace the earlier pending-recipient proposal as review inputs, not as an +issued approval. Recipient proof is in `2026-09-14-openrouter-recipient-install.json`. +The exact operator-group question is pending user input. Native requesting +identity (`approval:create`) and Informed Decision human review are also needed; +do not reuse the withdrawn combined operator client or seed a production approval. diff --git a/docs/proposals/openrouter-key-check.yaml b/docs/proposals/openrouter-key-check.yaml index 4a2156a..f523cdb 100644 --- a/docs/proposals/openrouter-key-check.yaml +++ b/docs/proposals/openrouter-key-check.yaml @@ -1,36 +1,32 @@ -# PROPOSED reviewed-input template; not active catalog or credential admission. -# SECRETS-WP-0010; retain the existing KV and AppRole names. +# Configured local recipient proposal; not active catalog or credential admission. id: openrouter-llm-connect kind: kv org: coulomb repo: llm-connect stage: prod -description: >- - OpenRouter provider credential used by llm-connect for activity-core. The - proposed native recipient checks key authentication only; trial delivery - requires a separate reviewed recipient and exact-action approval. - +description: OpenRouter provider credential used by llm-connect for activity-core. + The proposed native recipient checks key authentication only; trial delivery requires + a separate reviewed recipient and exact-action approval. mount: platform path: workloads/activity-core/llm-connect/llm-connect-provider-secrets mount_management: existing fields: - - OPENROUTER_API_KEY - +- OPENROUTER_API_KEY consumers: - - name: llm-connect-activity-core - auth: kubernetes - claim: serviceaccount:external-secrets/external-secrets - purpose: sync llm-connect-provider-secrets for the activity-core deployment - - name: intelligence-radar-key-check - auth: approle - claim: catalog:openrouter-llm-connect - purpose: IR-WP-0004 read-only OpenRouter key authentication check; no inference - +- name: llm-connect-activity-core + auth: kubernetes + claim: serviceaccount:external-secrets/external-secrets + purpose: sync llm-connect-provider-secrets for the activity-core deployment +- name: intelligence-radar-key-check + auth: approle + claim: catalog:openrouter-llm-connect + purpose: IR-WP-0004 read-only OpenRouter key authentication check; no inference workload_delivery: - - mode: external-secrets - owner: railiance-platform + llm-connect - -delivery_modes: [exec-env, read-check] +- mode: external-secrets + owner: railiance-platform + llm-connect +delivery_modes: +- exec-env +- read-check delivery_auth: method: approle management: engine @@ -41,47 +37,51 @@ delivery_auth: secret_id_ttl: 15m secret_id_num_uses: 1 token_num_uses: 8 - approval: model: ccr human_control: true purpose: IR-WP-0004 read-only OpenRouter key authentication check; no inference decision_ref: CCR-2026-0003 - notes: >- - CCR-2026-0003 approves the existing workload lane. A live native AppRole - apply remains gated by SECRETS-WP-0006-T05 review and operator approval. - First native-cutover candidate (docs/native-lane-cutover.md); not an - authorization to apply. - + notes: CCR-2026-0003 approves the existing workload lane. A live native AppRole + apply remains gated by SECRETS-WP-0006-T05 review and operator approval. First + native-cutover candidate (docs/native-lane-cutover.md); not an authorization to + apply. verification: - positive: approved delivery AppRole can read OPENROUTER_API_KEY without printing it + positive: approved delivery AppRole can read OPENROUTER_API_KEY without printing + it negative: unrelated token is denied on platform/data/workloads/activity-core/llm-connect/llm-connect-provider-secrets - risk: classification: high - notes: provider key can incur spend and remains valid outside OpenBao until revoked at OpenRouter - + notes: provider key can incur spend and remains valid outside OpenBao until revoked + at OpenRouter rotation: owner: railiance-platform + llm-connect provider operator - expectation: >- - Mint a replacement at OpenRouter, update every live cluster copy, wait for - ESO refresh, restart llm-connect, verify, and revoke the old provider key. + expectation: Mint a replacement at OpenRouter, update every live cluster copy, wait + for ESO refresh, restart llm-connect, verify, and revoke the old provider key. ttl: provider-defined - deactivation: owner: railiance-platform + llm-connect - expectation: >- - Disable the front door and workload read path, remove materialized Secrets, - stop consumers, and revoke the provider key at OpenRouter. - + expectation: Disable the front door and workload read path, remove materialized + Secrets, stop consumers, and revoke the provider key at OpenRouter. audit: - evidence: CCR id, actor, exact path, field name, provider key identifier if non-secret, timestamps, and pass/fail only - + evidence: CCR id, actor, exact path, field name, provider key identifier if non-secret, + timestamps, and pass/fail only delivery_config: exec_owner: - status: pending + status: configured owner: intelligence-radar-key-check - reason: >- - Pin tools/openrouter_key_check.py and its protected Python runtime, exact - argv, private cwd and fixed environment after custody-owner admission. - The pending binding refuses exec before consume or secret retrieval. + command: + - /usr/bin/python3.12 + - -I + - -B + - /home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py + cwd: /run/user/1000/secrets-engine-openrouter-check + environment: + LANG: C.UTF-8 + files: + /usr/bin/python3.12: + sha256: e50d468e8b0adfb05733f5b87b3cff34829c4a8c1aea50c865aa8bdfe4bb150f + private: false + /home/worsch/.local/share/secrets-engine/recipients/openrouter-key-check-dc1569f63ef7/openrouter_key_check.py: + sha256: dc1569f63ef74d73f0a735548c0573db2a1493f7ffc86945f52d0be9b27a3253 + private: true diff --git a/workplans/SECRETS-WP-0010-openrouter-native-access.md b/workplans/SECRETS-WP-0010-openrouter-native-access.md index 87f23be..99406bc 100644 --- a/workplans/SECRETS-WP-0010-openrouter-native-access.md +++ b/workplans/SECRETS-WP-0010-openrouter-native-access.md @@ -70,3 +70,31 @@ SECRETS-WP-0007-T04/T07 and SECRETS-WP-0006-T05/T06 remain wait; this workplan must not close them from synthetic evidence. Keep WARDEN-WP-0039-T03 and IR-WP-0004-T02 waiting until the native route passes. Trials require a separately bound recipient and the existing campaign/budget reconciliation. + +### T03 continuation — 2026-09-14 + +User explicitly requested execution of T03. Completed the independently runnable +prerequisites: Approval Engine is now deployed and restart/backup/restore verified +(APPROVAL-WP-0002-T03 done). Existing audit sender custody/ESO and KeyCape +consumer registration were already complete; neither was reprovisioned. Live +JWKS/readiness/anonymous and invalid-bearer refusal plus durable heartbeat/outbox +checks pass. See `docs/evidence/2026-09-14-approval-engine-deployment.json`. + +Installed the read-only checker in the owner-private versioned local directory, +using pinned `/usr/bin/python3.12 -I -B