state-hub/api
tegwick 70c585bb39
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 0s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 24s
fix(projection): retirement must release the identifier it holds
`slug` is unique across the whole table, so retiring a row by timestamp alone
leaves its identifier locked to a record nothing derives any more — and the
repository that legitimately owns it can never claim it. core-hub's inherited
REPO-WP-0001/0002 rows retired cleanly and repo-seed stayed refused with
"slug already belongs to another repository", pointing at two retired rows.

Retirement now stamps the slug `<slug>@retired-YYYYMMDD`. The row, its UUID and
its progress events are untouched, so history stays attached to the record it
happened under; only the human-facing identifier is freed. Re-retiring an
already-stamped row replaces the mark rather than stacking it, or the 100-char
column overflows after a few passes.

The UUIDs never collided here: core-hub's rows predate derived identity and
carry v4 UUIDs, while repo-seed derives v5 ones. The identifier was the only
thing in the way.

733 pass.

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-28 01:15:02 +02:00
..
edge feat(edge): add offline read cache for allowlisted State Hub GET routes 2026-07-09 01:04:15 +02:00
events chore: update standalone state hub wiring 2026-05-17 20:01:21 +02:00
models feat(tasks): give task rows a canonical record identifier 2026-08-26 02:05:51 +02:00
routers feat(deploy): run migrations as part of the release, and report schema state 2026-08-26 00:00:09 +02:00
schemas fix(classification): harden registration updates 2026-08-23 11:30:36 +02:00
services fix(projection): retirement must release the identifier it holds 2026-08-28 01:15:02 +02:00
classification.py fix(classification): allow the allowed-values path to be configured 2026-08-24 23:34:34 +02:00
config.py fix(config): bind the instance-identity settings to the env vars the chart sets 2026-08-25 12:55:11 +02:00
database.py Add state-hub v0.1 — local-first state service for the Custodian 2026-02-24 17:47:49 +01:00
doi_engine.py Production todo-md scan: sweep hostname + deploy tag main-d8808bf 2026-07-08 14:38:07 +02:00
flow_defs.py Complete workplan state model cleanup 2026-05-18 01:31:36 +02:00
main.py fix(retirement): close projection and launch contract gaps 2026-08-23 00:52:18 +02:00
task_status.py feat(tasks): adopt canonical task statuses 2026-05-26 01:32:50 +02:00
workplan_status.py feat(classification-spine): implement STATE-WP-0065 repo-anchored model 2026-06-22 13:52:13 +02:00