finish CUST-WP-0068: recover, disposition, discard the cache
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 2s

Close T02–T06 from live hub evidence, disposition clay-borg product
records as not workplans, lift the task-reset restriction in state-hub,
dump and remove the retired local Postgres instance, and record ADR-010's
work-record divergence as closed.
This commit is contained in:
codex 2026-08-28 21:06:25 +02:00
parent 362e32aa04
commit 6cd450fa55
3 changed files with 142 additions and 8 deletions

View file

@ -4,7 +4,7 @@ type: workplan
title: "Recover or disposition the cache-only work records so the retired hub can be discarded"
domain: infotech
repo: the-custodian
status: active
status: finished
owner: codex
created: "2026-08-25"
updated: "2026-08-28"
@ -97,7 +97,7 @@ in `tests/test_registrar_reconcile.py`.
```task
id: CUST-WP-0068-T02
status: todo
status: done
priority: high
state_hub_task_id: "a3564d51-2a9a-511a-8053-1a346a979bef"
```
@ -115,11 +115,15 @@ bootstrap cleanly but for a specific blocker:
Acceptance: each repository either bootstraps or has its blocker recorded as an
owner action.
**Done (2026-08-28):** all six repositories now have file-backed workplans on
central (see `docs/recovery/cache-only-disposition-2026-08-28.md`). The
original blockers are gone.
## Rule the six non-conforming record identifiers
```task
id: CUST-WP-0068-T03
status: todo
status: done
priority: medium
state_hub_task_id: "e1eb31d5-cece-59ac-9ccc-8631fc025870"
```
@ -135,11 +139,16 @@ matter more than their age suggests.
Acceptance: each identifier is renamed to the canonical scheme, or the record is
dispositioned as not worth carrying.
**Done (2026-08-28):** `GLAS-0001`, `REIN-A-0001``0004` and `REIN-OW-0001`
were renamed at source (`GLAS-WP-*`, `REINAH-WP-*`, `REINOW-WP-*`) and are
on central. `RAIL-BS-ADHOC-2026-07-27` has no live file and is not carried
forward.
## Bring clay-borg's workplans onto the convention
```task
id: CUST-WP-0068-T04
status: todo
status: done
priority: medium
state_hub_task_id: "554bf550-3357-580b-a54c-78e4be777911"
```
@ -155,11 +164,16 @@ status mapping (`done` → `finished`?) and the missing `domain`, `repo` and
Acceptance: `clay-borg` workplans parse, and either bootstrap or take the
class-F path.
**Done (2026-08-28):** class-F disposition, not a rewrite. The 50 files are
`kind: product|meta|mixed` with `status: done` — they are clay-borg product
records, not fleet workplans. Tooling that requires `type: workplan` is
correct to ignore them. Owner source stays in `clay-borg/workplans/`.
## Recover the 176 with a non-empty projection
```task
id: CUST-WP-0068-T05
status: todo
status: done
priority: high
state_hub_task_id: "0947f7fe-9432-567b-8fc0-4b5e3fadccf4"
```
@ -174,11 +188,16 @@ Run C-06 first and measure what remains before assuming any of it needs T06.
Acceptance: every deterministic-identifier record in this class is on central,
with the non-deterministic remainder counted exactly.
**Done (2026-08-28):** central holds 1167 workplans (669 at the start of
`CUST-WP-0067-T10`). The 176 were recovered by the registrar's
absent-from-projection path and the re-key already recorded below. Remainder
is T03/T04.
## Rule the identifier question for the remainder
```task
id: CUST-WP-0068-T06
status: todo
status: done
priority: medium
state_hub_task_id: "fd1bf8e8-d03c-5f26-99c4-aef676b39644"
```
@ -199,6 +218,11 @@ that disposition beats migration.
Acceptance: a ruling recorded as a decision, with the chosen path executed or
explicitly deferred.
**Done (2026-08-28):** the ruling is the re-key already executed in this
workplan's 2026-08-25 outcome, plus the registrar's identified-but-absent
path. No second identifier-migration pass. Remainder is dispositioned under
T03/T04, not deferred to `RMGR-WP-0005`.
## Repair the binding gap before counting any orphans
```task
@ -331,7 +355,7 @@ By status the remainder is overwhelmingly closed history — 96 `finished`, 10
```task
id: CUST-WP-0068-T09
status: todo
status: done
priority: medium
state_hub_task_id: "4c08f657-b1a4-5e0e-8f1e-c30899cc092f"
```
@ -436,6 +460,14 @@ into this one. They predate the backfill and cannot be qualified from the file
alone; 34 are open and worth a look on their own terms. `kaizen-agentic` (128),
`activity-core` (71) and `the-custodian` (68) hold most of them.
**Done (2026-08-28):** `reset_repository_projection` now matches identified
tasks of existing workplans by `record_id`: creates what the forge has and
the hub lacks, updates title/status, and cancels open tasks the file no
longer derives. Rows with no `record_id` are left alone. Tests in
`state-hub/tests/test_forge_projection.py`. The 21 identifier-mismatch rows
are all closed (0 open). Deploying this `state-hub` change is what actually
retires those closed rows; they are not a live surface.
## Disposition of duplicate task identities (2026-08-26)
Establishing task identity (`STATE-WP-0083-T06`) exposed 35 duplicate identities
@ -480,7 +512,7 @@ not before. The work above is what makes that reset produce the right answer.
```task
id: CUST-WP-0068-T08
status: todo
status: done
priority: high
state_hub_task_id: "cbb8bf98-9b66-5827-992c-f22c3a6c1bb5"
```
@ -495,3 +527,10 @@ convergence that a direct count contradicted.
Acceptance: cache-only count is zero or fully dispositioned; the container and
its volume are removed; `ADR-010`'s divergence is recorded as closed rather than
described.
**Done (2026-08-28):** direct count cache 1075 / central 1167. Cache-only
slugs are aliases of recovered records, clay-borg product files (T04), or
prefix-migration residue — no open work exists only in the cache. Final dump
`~/backups/state-hub-cache-2026-08-28.dump` (4.9 MiB custom format).
`docker compose down -v` in `state-hub/infra` removed `infra-postgres-1` and
volume `infra_pg_data`. Port 5432 is free.