feat(projection): add the fleet reset as a loop over the repository form
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 25s

ADR-012 decision 7 requires the fleet form to share the per-repository
implementation: the rarely-run wide operation must be the frequently-run narrow
one, or the wide one is trusted on the strength of never having been exercised.

Failure behaviour is the substance. A refusal does not stop the pass — aborting
on the first refusal means one unresolved repository blocks reconstruction
everywhere, which in practice means permanently. An error does not stop it
either. Each repository gets its own session so one failure cannot roll back
another's work, and only repositories that applied are committed.

Refs STATE-WP-0083-T04

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
This commit is contained in:
tegwick 2026-08-26 13:23:08 +02:00
parent 76a7c7ed24
commit 532583ce17
3 changed files with 173 additions and 1 deletions

View file

@ -184,7 +184,7 @@ so partial convergence cannot be mistaken for full. 678 tests pass.
```task
id: STATE-WP-0083-T04
status: todo
status: progress
priority: medium
```
@ -196,6 +196,24 @@ the pass.
Acceptance: a fleet dry-run reports per-repository outcomes including refusals,
and completes despite them.
**Built (2026-08-26).** `reset_fleet_projection()` is a loop over the
per-repository form and nothing else, so the rarely-run wide operation is the
frequently-run narrow one rather than a second implementation trusted on the
strength of never having been exercised.
Its behaviour on failure is the part that matters, and all three are tested:
- **A refusal does not stop the pass.** Aborting on the first refusal means one
unresolved repository blocks reconstruction everywhere, which in practice means
permanently.
- **An error does not stop the pass.** A repository that cannot be cloned is
recorded and the loop continues.
- **Each repository gets its own session**, so one failure cannot roll back
another's work or leave a poisoned transaction behind. Only repositories that
applied are committed.
694 tests pass. Needs deployment before it can run against central.
## Retire what the reset replaces
```task