diff --git a/workplans/STATE-WP-0083-forge-derived-projection-reset.md b/workplans/STATE-WP-0083-forge-derived-projection-reset.md index c7c4fde..26e1368 100644 --- a/workplans/STATE-WP-0083-forge-derived-projection-reset.md +++ b/workplans/STATE-WP-0083-forge-derived-projection-reset.md @@ -184,7 +184,7 @@ so partial convergence cannot be mistaken for full. 678 tests pass. ```task id: STATE-WP-0083-T04 -status: progress +status: done priority: medium ``` @@ -631,3 +631,37 @@ exists`. The identifier refusal added earlier checks `id`; `slug` carries its ow unique constraint across the whole table, so two repositories can derive different identifiers whose slugs still collide. Now refused with the holder named, and covered by test. + + +## Second fleet pass — idempotent (2026-08-26) + +Re-run after the slug-collision refusal deployed. + +| | first pass | second | +|---|---|---| +| applied | 91 | 0 | +| **noop** | 2 | **93** | +| refused | 16 repos / 64 | 19 repos / 69 | +| errored | 12 | **9** | +| created / updated / retired | 8 / 737 / 0 | **0 / 0 / 0** | + +**Idempotence demonstrated rather than asserted.** 93 repositories changed +nothing on the second run: `ADR-012` decision 7 requires that reset twice +produces the same projection, and it does. + +The slug fix helped more than predicted. Errors fell 12 → 9, not 12 → 11 — three +repositories were erroring on slug collisions rather than only +`disaster-control`. They now refuse with the holder named: + +| Refusal reason | Count | +|---|---| +| would be retired; the forge no longer derives it | 60 | +| slug already belongs to another repository | 9 | + +**60 records across 13 repositories no longer derive from any file.** That is the +retirement work `CUST-WP-0068-T09` waits on, now enumerated per repository: +`railiance-platform` (20), `vergabe-teilnahme` (16), `railiance-apps` (8), then +single figures elsewhere. + +All 9 remaining errors are private repositories the pod cannot clone +anonymously — unchanged, and not a code problem.