state-hub/api/services
tegwick 97c8762a71
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 27s
feat(deploy): run migrations as part of the release, and report schema state
Central was serving two revisions behind the code it shipped: review_contracts
did not exist there although its migration was inside the running image. There
was no migration mechanism at all — bare uvicorn CMD, nothing chart-declared —
and nothing surfaced the mismatch. The API starts happily against a schema it
was not built for and only fails when a request touches a missing table.

Adds a chart-managed Helm pre-install/pre-upgrade hook running alembic upgrade
head, weighted to complete before the API rolls. A hook rather than an init
container: init containers run per pod, so more than one replica means
concurrent alembic upgrade with no locking. Failed jobs are deliberately
retained — a migration that fails and vanishes is how this drifted in the first
place.

/state/health now reports applied and expected revisions. "unknown" is
deliberately not "ok": an instance that cannot establish agreement must not
claim it, the same principle as instance_role defaulting to unknown.

Refs STATE-WP-0083-T07

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

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 2583210@bnt-lap001
Assistant-Session: f2bff2d5-e9b2-4338-92ca-10282a927006
2026-08-26 00:00:09 +02:00
..
token_sources Fixed and improved token tracking 2026-05-23 13:59:05 +02:00
__init__.py Implement RecentlyOnScope domain digest 2026-05-22 13:45:53 +02:00
consistency_sweep.py finish(STATE-WP-0064): cut over scheduler and split sweep errors from failures 2026-06-22 01:20:59 +02:00
execution_queue.py fix(retirement): close projection and launch contract gaps 2026-08-23 00:52:18 +02:00
fabric_graph.py Implement financial Fabric vNext read model 2026-05-24 02:52:59 +02:00
forge_projection.py feat(projection): derive a repository's projection from the forge 2026-08-25 23:34:25 +02:00
legacy_compat.py feat(api): retire phase-1/2 /workstreams REST aliases with 410 stranglers 2026-07-10 13:31:57 +02:00
legacy_meter.py feat(legacy-meter): scale retirement quiet period to call volume 2026-08-20 07:13:44 +02:00
lifecycle.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
markitect_templates.py Implement RecentlyOnScope domain digest 2026-05-22 13:45:53 +02:00
ops_run_projection.py Prepare State Hub retirement baseline 2026-08-09 16:19:53 +02:00
recently_on_scope.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
reconciliation.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
repo_manager_dual_run.py feat(retirement): route SBOM scans through repo-manager 2026-08-21 23:15:34 +02:00
review_contracts.py feat(review): add multi-owner contracts and receipts 2026-08-22 20:57:51 +02:00
sbom_nexus.py feat: route SBOM writes to Nexus behind flag 2026-08-22 19:55:08 +02:00
schema_state.py feat(deploy): run migrations as part of the release, and report schema state 2026-08-26 00:00:09 +02:00
suggestion_relevance.py Finish CUST-WP-0011 and implement STATE-WP-0061 suggestion backlog. 2026-07-06 10:52:49 +02:00
suggestion_wsjf.py Finish CUST-WP-0011 and implement STATE-WP-0061 suggestion backlog. 2026-07-06 10:52:49 +02:00
summary_cache.py feat: project Nexus SBOM state into summaries 2026-08-22 20:12:16 +02:00
work_record_identifier_migration.py fix(retirement): close projection and launch contract gaps 2026-08-23 00:52:18 +02:00
workplan_files.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00
write_idempotency.py feat(STATE-WP-0079): retire the suggestion-backlog surface (slice E1) 2026-08-20 08:11:14 +02:00