WP-0039: record partial cutover; declare the worker map, keep the API image
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 4s

T02 was done by railiance-platform (CCR-2026-0029/0030). The worker-token
ExternalSecret is live, and the claim-loop token is rotated. The new API image
failed because production is at alembic 0009 and main needs 0010 (WP-0038,
never deployed). It was rolled back within about one minute, and the loop
claims again with HTTP 200. The manifest now declares ACTIVITY_CORE_WORKERS
and keeps the live API image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 151606@bnt-lap001
Assistant-Session: 3c0a4ad5-bb8b-4bf7-b9f0-fa5f29204e48
This commit is contained in:
tegwick 2026-09-23 22:40:54 +02:00
parent 1a20c8595b
commit ca17afad7f
2 changed files with 35 additions and 2 deletions

View file

@ -26,6 +26,9 @@ data:
OPS_RUN_SLA_HOURS: "1"
# Non-secret identity bound to ACTIVITY_CORE_WORKER_TOKEN at the API boundary.
ACTIVITY_CORE_WORKER_ID: rein-aharness@railiance01
# ACTIVITY-WP-0039: token-to-identity map; each token env is synced from its
# own OpenBao path by 15-externalsecret-worker-tokens.yaml.
ACTIVITY_CORE_WORKERS: "rein-aharness@railiance01=ACTIVITY_CORE_WORKER_TOKEN,rein-aharness-metered@railiance01=ACTIVITY_CORE_WORKER_TOKEN_METERED"
# ACTIVITY_CORE_WORKER_TOKEN lives in actcore-runtime-secret.
ACTIVITY_DEFINITION_DIRS: /etc/activity-core/external-definitions
CUSTODIAN_REPO_ROOT: /var/custodian

View file

@ -81,7 +81,7 @@ fail-closed case, and operator access under broken worker configuration.
```task
id: ACTIVITY-WP-0039-T02
status: wait
status: done
priority: high
state_hub_task_id: "1400bf41-e00a-56cc-9ccf-a1cf023b220a"
```
@ -166,7 +166,7 @@ lands.
```task
id: ACTIVITY-WP-0039-T04
status: wait
status: progress
priority: high
state_hub_task_id: "13e90456-02ff-52e7-9296-1fd80761fab4"
```
@ -196,3 +196,33 @@ The pods read `actcore-runtime-secret` only at start.
returns HTTP 200.
Report the revision to secrets-engine on threads `914853d9` and `6e694682`.
**Cutover attempt, 2026-09-23 (founder go-ahead, build mode).**
T02 was done by railiance-platform at 18:06:29Z (CCR-2026-0029/0030, commit
`fe1665d`).
1. The ExternalSecret `actcore-ops-run-worker-tokens` is applied. Both keys
synced at 20:35:35Z, and ESO now owns `ACTIVITY_CORE_WORKER_TOKEN`.
2. No `ops_run` was claimed. The claim-loop env file was backed up
(`claim-loop.env.bak-wp0039-20260923T203559`) and given the new loop
token without printing it.
3. The image `activity-core:wp0039-20260923` (built from `main` at `1a20c85`)
was imported. The ConfigMap with `ACTIVITY_CORE_WORKERS` and the API
Deployment were applied, and the claim loop was restarted.
4. **The new API returned HTTP 500** (`column ops_runs.repository_grant does
not exist`). Production is at alembic `0009`, and `main` needs `0010` (the
WP-0038 columns). The running `fi-publication-20260914` image contains no
WP-0038 code, so WP-0038 was never deployed. The API was rolled back to
`fi-publication-20260914`, and the loop claimed again with HTTP 200 at
20:39:23Z. The outage lasted about 1 minute, and no run was affected.
Live state now: the option-(b) loop token rotation is complete. The old code
reads the ESO-synced `ACTIVITY_CORE_WORKER_TOKEN`, which is the new value.
`ACTIVITY_CORE_WORKERS` is in the ConfigMap and is ignored by the old image.
The metered identity is not live yet.
Remaining: run migration `0010`, which is additive (two nullable columns).
That also takes WP-0038's close reconciliation live for the first time. Then
redeploy the API on `wp0039-20260923`, and prove the metered identity and the
403 cross-identity rejection. Both need the founder's decision because they go
beyond the worker-identity change.