feat(repair): repairIndex narrates every phase and its receipt carries the walls
On a production store (14,647 nouns / 73,070 verbs) a repairIndex() ran for more than thirty minutes at roughly a full core with ZERO log lines between its start and its end, while the read doors kept serving. The operator could tell it was alive only from `top`, and could not tell which of its single-threaded walks it was inside. Same law as the open, applied to the repair: - every phase announces itself BEFORE it works, naming what it is about to walk (each canonical walk, the VFS containment reconciliation, each provider's invariant pass); - an unref'd heartbeat names the phase still running every 5s, for as long as it runs; - every phase reports its own wall, and that wall is carried in the TYPED receipt as RepairFamilyReport.durationMs — a receipt that cannot say where the time went is not a receipt; - the whole repair's narration moves to the always-visible channel, so a production log level cannot silence it. The phases move into runRepairIndexPhases() so the heartbeat can live in a finally around them; the public door and its report shape are unchanged apart from the added durationMs. Pins: tests/integration/repair-narration.test.ts — every checked family has a start line, a finish line with its wall, and a numeric durationMs in the receipt; a phase slowed to 6.5s produces a heartbeat naming it, with the logger clamped to ERROR.
This commit is contained in:
parent
f4e2d34b4e
commit
3fffd9c6e6
3 changed files with 240 additions and 14 deletions
|
|
@ -1217,6 +1217,13 @@ export interface RepairFamilyReport {
|
|||
skipped?: string
|
||||
/** Why the outcome is what it is when neither `detail` nor `skipped` says it. */
|
||||
reason?: string
|
||||
/**
|
||||
* The phase's own wall, in milliseconds. A repair on a production store ran
|
||||
* for over thirty minutes without a single line of output; an operator had
|
||||
* to read `top` to know it was alive. A receipt that cannot say WHERE the
|
||||
* time went is not a receipt — every row carries its own.
|
||||
*/
|
||||
durationMs?: number
|
||||
}
|
||||
|
||||
/** The full receipt returned by repairIndex(). */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue