@telora/daemon 0.22.208 → 0.22.227
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build-info.json +4 -3
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +3 -1
- package/dist/backends/index.js.map +1 -1
- package/dist/completion/advancement-stall-watchdog.d.ts.map +1 -1
- package/dist/completion/advancement-stall-watchdog.js +6 -2
- package/dist/completion/advancement-stall-watchdog.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +10 -1
- package/dist/completion/completion-decision.d.ts.map +1 -1
- package/dist/completion/completion-decision.js +1 -1
- package/dist/completion/completion-decision.js.map +1 -1
- package/dist/completion/delivery-advancement-guard.d.ts +31 -16
- package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
- package/dist/completion/delivery-advancement-guard.js +22 -37
- package/dist/completion/delivery-advancement-guard.js.map +1 -1
- package/dist/completion/detector.d.ts.map +1 -1
- package/dist/completion/detector.js +3 -1
- package/dist/completion/detector.js.map +1 -1
- package/dist/completion/event-phases.d.ts +19 -8
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +67 -88
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts +12 -9
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +6 -3
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/index.js +1 -1
- package/dist/completion/progress-snapshot.d.ts +13 -9
- package/dist/completion/progress-snapshot.d.ts.map +1 -1
- package/dist/completion/progress-snapshot.js +16 -13
- package/dist/completion/progress-snapshot.js.map +1 -1
- package/dist/completion/reengagement-redrive.d.ts +8 -1
- package/dist/completion/reengagement-redrive.d.ts.map +1 -1
- package/dist/completion/reengagement-redrive.js +16 -2
- package/dist/completion/reengagement-redrive.js.map +1 -1
- package/dist/completion/review-defect-detector.d.ts +58 -18
- package/dist/completion/review-defect-detector.d.ts.map +1 -1
- package/dist/completion/review-defect-detector.js +62 -27
- package/dist/completion/review-defect-detector.js.map +1 -1
- package/dist/completion/review-exit-attribution.d.ts +6 -3
- package/dist/completion/review-exit-attribution.d.ts.map +1 -1
- package/dist/completion/review-exit-attribution.js +9 -7
- package/dist/completion/review-exit-attribution.js.map +1 -1
- package/dist/completion/review-exit-deps.d.ts +2 -0
- package/dist/completion/review-exit-deps.d.ts.map +1 -1
- package/dist/completion/review-exit-deps.js +3 -0
- package/dist/completion/review-exit-deps.js.map +1 -1
- package/dist/completion/review-exit-evidence.d.ts +8 -0
- package/dist/completion/review-exit-evidence.d.ts.map +1 -1
- package/dist/completion/review-exit-evidence.js +39 -27
- package/dist/completion/review-exit-evidence.js.map +1 -1
- package/dist/completion/review-exit-foreign-findings.d.ts +5 -1
- package/dist/completion/review-exit-foreign-findings.d.ts.map +1 -1
- package/dist/completion/review-exit-foreign-findings.js +4 -4
- package/dist/completion/review-exit-foreign-findings.js.map +1 -1
- package/dist/completion/review-exit-phase.js +4 -4
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +11 -19
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/team-progress-measure.d.ts +70 -0
- package/dist/completion/team-progress-measure.d.ts.map +1 -0
- package/dist/completion/team-progress-measure.js +285 -0
- package/dist/completion/team-progress-measure.js.map +1 -0
- package/dist/completion/team-stillness.d.ts +76 -0
- package/dist/completion/team-stillness.d.ts.map +1 -0
- package/dist/completion/team-stillness.js +96 -0
- package/dist/completion/team-stillness.js.map +1 -0
- package/dist/completion/worker-wait.d.ts +84 -0
- package/dist/completion/worker-wait.d.ts.map +1 -0
- package/dist/completion/worker-wait.js +89 -0
- package/dist/completion/worker-wait.js.map +1 -0
- package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery/delivery-advance-block.js +1 -2
- package/dist/delivery/delivery-advance-block.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +3 -3
- package/dist/focus/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus/focus-lifecycle.js +7 -1
- package/dist/focus/focus-lifecycle.js.map +1 -1
- package/dist/focus/focus-team-state.js +1 -1
- package/dist/focus/focus-worktree-state.d.ts.map +1 -1
- package/dist/focus/focus-worktree-state.js +2 -1
- package/dist/focus/focus-worktree-state.js.map +1 -1
- package/dist/git/focus-integration-sync.d.ts +42 -4
- package/dist/git/focus-integration-sync.d.ts.map +1 -1
- package/dist/git/focus-integration-sync.js +53 -9
- package/dist/git/focus-integration-sync.js.map +1 -1
- package/dist/git/types.d.ts.map +1 -1
- package/dist/git/types.js +4 -2
- package/dist/git/types.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +0 -1
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +14 -0
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +50 -19
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/prompt-sections/testing-standard.d.ts +4 -1
- package/dist/prompt-sections/testing-standard.d.ts.map +1 -1
- package/dist/prompt-sections/testing-standard.js +14 -4
- package/dist/prompt-sections/testing-standard.js.map +1 -1
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +3 -1
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.js +1 -1
- package/dist/queries/escalation-suppression.js +1 -1
- package/dist/queries/escalations.js +1 -1
- package/dist/queries/focus-integration-conflict.d.ts +7 -4
- package/dist/queries/focus-integration-conflict.d.ts.map +1 -1
- package/dist/queries/focus-integration-conflict.js +6 -3
- package/dist/queries/focus-integration-conflict.js.map +1 -1
- package/dist/queries/review-finding-facts.d.ts +38 -0
- package/dist/queries/review-finding-facts.d.ts.map +1 -0
- package/dist/queries/review-finding-facts.js +43 -0
- package/dist/queries/review-finding-facts.js.map +1 -0
- package/dist/queries/schemas.d.ts +15 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +12 -1
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/shortfall-park-record.d.ts +6 -1
- package/dist/queries/shortfall-park-record.d.ts.map +1 -1
- package/dist/queries/shortfall-park-record.js.map +1 -1
- package/dist/queries/shortfall-rulings.d.ts +14 -2
- package/dist/queries/shortfall-rulings.d.ts.map +1 -1
- package/dist/queries/shortfall-rulings.js +17 -3
- package/dist/queries/shortfall-rulings.js.map +1 -1
- package/dist/queries/verification.js +1 -1
- package/dist/queries/verify-own-holds.d.ts.map +1 -1
- package/dist/queries/verify-own-holds.js +1 -0
- package/dist/queries/verify-own-holds.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +9 -1
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/lead-continuation.d.ts +10 -2
- package/dist/spawn/lead-continuation.d.ts.map +1 -1
- package/dist/spawn/lead-continuation.js +39 -22
- package/dist/spawn/lead-continuation.js.map +1 -1
- package/dist/spawn/one-shot-model.d.ts.map +1 -1
- package/dist/spawn/one-shot-model.js +1 -0
- package/dist/spawn/one-shot-model.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +11 -1
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/testing/fixtures/conflicting-repo.d.ts +17 -0
- package/dist/testing/fixtures/conflicting-repo.d.ts.map +1 -1
- package/dist/testing/fixtures/conflicting-repo.js +31 -0
- package/dist/testing/fixtures/conflicting-repo.js.map +1 -1
- package/dist/testing/fixtures/index.d.ts.map +1 -1
- package/dist/testing/fixtures/index.js +1 -2
- package/dist/testing/fixtures/index.js.map +1 -1
- package/dist/types/focus.d.ts +59 -26
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/verify/commit-verdict-pull.d.ts +28 -3
- package/dist/verify/commit-verdict-pull.d.ts.map +1 -1
- package/dist/verify/commit-verdict-pull.js +160 -23
- package/dist/verify/commit-verdict-pull.js.map +1 -1
- package/dist/verify/credit-rearm.d.ts.map +1 -1
- package/dist/verify/credit-rearm.js +72 -17
- package/dist/verify/credit-rearm.js.map +1 -1
- package/dist/verify/default-on-guards.d.ts +54 -8
- package/dist/verify/default-on-guards.d.ts.map +1 -1
- package/dist/verify/default-on-guards.js +132 -17
- package/dist/verify/default-on-guards.js.map +1 -1
- package/dist/verify/explicit-rearm.d.ts.map +1 -1
- package/dist/verify/explicit-rearm.js +1 -0
- package/dist/verify/explicit-rearm.js.map +1 -1
- package/dist/verify/explicit-row-selection.d.ts +47 -0
- package/dist/verify/explicit-row-selection.d.ts.map +1 -0
- package/dist/verify/explicit-row-selection.js +37 -0
- package/dist/verify/explicit-row-selection.js.map +1 -0
- package/dist/verify/gate-run-registry.d.ts.map +1 -1
- package/dist/verify/gate-run-registry.js +2 -0
- package/dist/verify/gate-run-registry.js.map +1 -1
- package/dist/verify/parked-shortfall-reuse.d.ts +194 -0
- package/dist/verify/parked-shortfall-reuse.d.ts.map +1 -0
- package/dist/verify/parked-shortfall-reuse.js +310 -0
- package/dist/verify/parked-shortfall-reuse.js.map +1 -0
- package/dist/verify/reselection-log.d.ts +22 -0
- package/dist/verify/reselection-log.d.ts.map +1 -0
- package/dist/verify/reselection-log.js +87 -0
- package/dist/verify/reselection-log.js.map +1 -0
- package/dist/verify/shortfall-park.d.ts +8 -1
- package/dist/verify/shortfall-park.d.ts.map +1 -1
- package/dist/verify/shortfall-park.js +17 -3
- package/dist/verify/shortfall-park.js.map +1 -1
- package/dist/verify/shortfall-repeat.d.ts.map +1 -1
- package/dist/verify/shortfall-repeat.js +7 -2
- package/dist/verify/shortfall-repeat.js.map +1 -1
- package/dist/verify/shortfall-rulings.d.ts +93 -6
- package/dist/verify/shortfall-rulings.d.ts.map +1 -1
- package/dist/verify/shortfall-rulings.js +69 -12
- package/dist/verify/shortfall-rulings.js.map +1 -1
- package/dist/verify/stall-detector-config.d.ts.map +1 -1
- package/dist/verify/stall-detector-config.js +2 -1
- package/dist/verify/stall-detector-config.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +6 -4
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +9 -6
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/stalled-team-backstop.d.ts +8 -2
- package/dist/verify/stalled-team-backstop.d.ts.map +1 -1
- package/dist/verify/stalled-team-backstop.js +15 -11
- package/dist/verify/stalled-team-backstop.js.map +1 -1
- package/dist/verify/team-stall-reapers.d.ts +28 -0
- package/dist/verify/team-stall-reapers.d.ts.map +1 -0
- package/dist/verify/team-stall-reapers.js +23 -0
- package/dist/verify/team-stall-reapers.js.map +1 -0
- package/dist/verify/verification-attribution-deps.d.ts +1 -1
- package/dist/verify/verification-attribution-deps.d.ts.map +1 -1
- package/dist/verify/verification-attribution-deps.js +20 -1
- package/dist/verify/verification-attribution-deps.js.map +1 -1
- package/dist/verify/verification-boundary-env.d.ts.map +1 -1
- package/dist/verify/verification-boundary-env.js +23 -9
- package/dist/verify/verification-boundary-env.js.map +1 -1
- package/dist/verify/verification-checkout.d.ts +1 -1
- package/dist/verify/verification-checkout.d.ts.map +1 -1
- package/dist/verify/verification-checkout.js.map +1 -1
- package/dist/verify/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/verification-commit-sharing.js +14 -3
- package/dist/verify/verification-commit-sharing.js.map +1 -1
- package/dist/verify/verification-config.d.ts.map +1 -1
- package/dist/verify/verification-config.js +1 -20
- package/dist/verify/verification-config.js.map +1 -1
- package/dist/verify/verification-default-on.d.ts +4 -1
- package/dist/verify/verification-default-on.d.ts.map +1 -1
- package/dist/verify/verification-default-on.js +29 -2
- package/dist/verify/verification-default-on.js.map +1 -1
- package/dist/verify/verification-deps-default.d.ts.map +1 -1
- package/dist/verify/verification-deps-default.js +13 -0
- package/dist/verify/verification-deps-default.js.map +1 -1
- package/dist/verify/verification-deps.d.ts +38 -0
- package/dist/verify/verification-deps.d.ts.map +1 -1
- package/dist/verify/verification-deps.js +2 -1
- package/dist/verify/verification-deps.js.map +1 -1
- package/dist/verify/verification-engine.d.ts.map +1 -1
- package/dist/verify/verification-engine.js +44 -15
- package/dist/verify/verification-engine.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +1 -19
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/verify/verify-restatement.d.ts.map +1 -1
- package/dist/verify/verify-restatement.js +5 -1
- package/dist/verify/verify-restatement.js.map +1 -1
- package/dist/worktree/provision.d.ts.map +1 -1
- package/dist/worktree/provision.js +3 -1
- package/dist/worktree/provision.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/commit-verdict-pull.test.ts,
|
|
3
|
+
// packages/daemon/src/verify/explicit-row-selection.test.ts,
|
|
4
|
+
// packages/daemon/src/verify/parked-shortfall-reuse.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
/**
|
|
7
|
+
* A PARKED shortfall is REUSED, not re-judged, while its commit set and its
|
|
8
|
+
* rulings are unchanged.
|
|
9
|
+
*
|
|
10
|
+
* WHY. The verify gate already works this way about the SUITE: a commit whose
|
|
11
|
+
* verdict is recorded is not run again (verify/verification-commit-sharing.ts
|
|
12
|
+
* readReusableVerdict). The RECONCILIATION did not: the engine called
|
|
13
|
+
* `authorTargetRestatements` -- a ~28s `claude --print` one-shot -- on every
|
|
14
|
+
* dispatch whose gate verdict was passed, and consulted the delivery's shortfall
|
|
15
|
+
* park only afterwards, in routing. So however a parked delivery reached dispatch
|
|
16
|
+
* it paid a model call to re-derive a shortfall the park already records by commit
|
|
17
|
+
* set and signature. Measured 2026-09-24: delivery 8ae80225, parked at 06:25Z on
|
|
18
|
+
* commit set `15:2b25de49`, made ~30 reconciliation calls (median 28s) between
|
|
19
|
+
* 06:08Z and 06:54Z at an unchanged HEAD; the one at 06:50Z failed with
|
|
20
|
+
* "verify-reconciliation: model unavailable (auth)", proving each dispatch really
|
|
21
|
+
* was calling the model. A sibling delivery closed the re-dispatch path that fed
|
|
22
|
+
* that loop; this module bounds the COST of any re-dispatch path, including ones
|
|
23
|
+
* not yet found.
|
|
24
|
+
*
|
|
25
|
+
* WHAT IS REUSED. Not a cached verdict -- the park's OWN record. The gaps are
|
|
26
|
+
* rebuilt VERBATIM from the shortfall detail standing on the same gate_state
|
|
27
|
+
* (`shortfallReconciliation.shortfalls`: declared / achieved / reason /
|
|
28
|
+
* diffCitation as the judging pass wrote them), and the rebuild is accepted only
|
|
29
|
+
* when it reproduces the park's own signature (`sameShortfallSignature`). So the
|
|
30
|
+
* routing that follows is the routing a fresh IDENTICAL judgement would produce:
|
|
31
|
+
* the same demotion to 'failed', the same park re-hold with its original
|
|
32
|
+
* `parkedAt`, the same cause-keyed escalation (already deduped in
|
|
33
|
+
* verify/shortfall-park-escalation.ts, so nothing is re-filed) and the same
|
|
34
|
+
* gate_state detail. What it does NOT do is call the model.
|
|
35
|
+
*
|
|
36
|
+
* WHEN IT IS REFUSED -- every one of these judges instead, so the reuse can only
|
|
37
|
+
* ever remove a model call, never a judgement:
|
|
38
|
+
* - no standing park refusing re-work (verify/shortfall-park.ts
|
|
39
|
+
* shortfallParkRefusingRework: a park on a delivery in verify);
|
|
40
|
+
* - the CURRENT commit set could not be read, or differs from the park's, or
|
|
41
|
+
* the park itself recorded none. A null fingerprint means the read FAILED and
|
|
42
|
+
* must never match;
|
|
43
|
+
* - the CURRENT rulings fingerprint could not be read, or differs from the
|
|
44
|
+
* park's, or the PARK carries none. A park's fingerprint is PRESENT exactly
|
|
45
|
+
* when the judgement that recorded it could READ the rulings: '' is a
|
|
46
|
+
* succeeded read of an empty set ("no ruling was in force"), and the field is
|
|
47
|
+
* absent only where the read FAILED (shortfall-park.ts classifyShortfallPark).
|
|
48
|
+
* So an absent one is a park whose ruling history is UNKNOWN and is refused
|
|
49
|
+
* ('park-rulings-unknown') rather than coerced to '' -- coercing it would let
|
|
50
|
+
* a park recorded while the rulings were unreadable be answered from after a
|
|
51
|
+
* later successful EMPTY read, as though the unknown had been known-empty.
|
|
52
|
+
* The recorder is why this can be strict: the previous cycle read an absent
|
|
53
|
+
* fingerprint as '' because requiring presence would otherwise have made the
|
|
54
|
+
* reuse inert for the measured incident (an ordinary no-rulings park wrote no
|
|
55
|
+
* field at all). With the recorder fixed there is no such dilemma -- a
|
|
56
|
+
* known-empty park records '' and reuses, an unknown one judges. A park
|
|
57
|
+
* WRITTEN BY THE OLD RECORDER carries no field even where the rulings were
|
|
58
|
+
* readable and empty: it refuses ONCE, that judgement re-holds it carrying
|
|
59
|
+
* '', and reuse resumes -- the one reconciliation after recovery, no more.
|
|
60
|
+
* Any ruling landing since (an operator row, or an approving review's node
|
|
61
|
+
* verdict arriving through the same reader as `ruledByKind: 'review'`)
|
|
62
|
+
* changes the fingerprint and re-judges exactly once, after which the park
|
|
63
|
+
* carries the new fingerprint and matches again;
|
|
64
|
+
* - the gate_state carries an AWAITED-MODEL hold (`modelUnavailable`,
|
|
65
|
+
* verify/verification-model-unavailable-hold.ts). A park is never WRITTEN by
|
|
66
|
+
* that path -- the engine routes no shortfall when the model was not reached
|
|
67
|
+
* -- but a later tick can leave the hold standing beside a park, and then the
|
|
68
|
+
* last thing that happened to this delivery was a non-judgement. The hold
|
|
69
|
+
* exists precisely so the next tick re-judges the same commit, so this
|
|
70
|
+
* refuses rather than answering from a record the hold sits on top of. It is
|
|
71
|
+
* self-clearing: the first reconciliation that renders rebuilds gate_state
|
|
72
|
+
* without it, and reuse resumes on the tick after;
|
|
73
|
+
* - the gaps cannot be rebuilt from the standing detail, or the rebuild does
|
|
74
|
+
* not reproduce the park's signature (a legacy park, or a writer that
|
|
75
|
+
* replaced the live detail). One judgement re-establishes the detail;
|
|
76
|
+
* - the rebuilt gaps look like a FAILED reconciliation rather than a judgement:
|
|
77
|
+
* a non-ModelUnavailable throw is signed as a whole-injection shortfall
|
|
78
|
+
* (classifyReconciliationThrow), which names the INJECTION node and carries
|
|
79
|
+
* the '(unknown -- reconciliation failed)' declared statement. That is an
|
|
80
|
+
* error, not a verdict, so it is re-attempted rather than reused.
|
|
81
|
+
*
|
|
82
|
+
* WHAT STAYS REACHABLE, AND WHAT DOES NOT. The engine resolves the delivery's
|
|
83
|
+
* evidence before asking this: those are git and record reads every dispatch pays
|
|
84
|
+
* anyway, and leaving them unconditional keeps the pass path one shape. Their
|
|
85
|
+
* instrument-fault branch is then unreachable on a reused dispatch, on purpose --
|
|
86
|
+
* it routes the delivery to bounded RE-WORK, which is exactly what a standing park
|
|
87
|
+
* refuses (shortfallParkRefusingRework), so a blind bundle on a parked delivery
|
|
88
|
+
* must re-hold the park rather than send it back to coding. Everything after the
|
|
89
|
+
* reconciliation is reached exactly as a fresh judgement reaches it: the inward
|
|
90
|
+
* shortfall drift, the routing, the park's escalation, the recorded-targets report
|
|
91
|
+
* (left untouched -- a reused dispatch learned nothing new about arm coverage).
|
|
92
|
+
*
|
|
93
|
+
* WHAT IT DELIBERATELY DOES NOT WIDEN. Reuse is keyed on exactly the two facts
|
|
94
|
+
* the park's own release rule is keyed on (shortfall-park.ts
|
|
95
|
+
* isShortfallParkReleased: the commit set and the rulings fingerprint). Anything
|
|
96
|
+
* that does not release the park does not release the reuse either -- the park
|
|
97
|
+
* already governs whether such a delivery is judged at all, and a second,
|
|
98
|
+
* differently-keyed opinion here would be a way for the two to disagree.
|
|
99
|
+
*
|
|
100
|
+
* The DECISION is pure (decideParkedShortfallReuse) and takes the facts; only
|
|
101
|
+
* resolveParkedShortfallReuse reads them, through the engine's dep seam.
|
|
102
|
+
*
|
|
103
|
+
* @module verify/parked-shortfall-reuse
|
|
104
|
+
*/
|
|
105
|
+
import { commitSetFingerprint, shortfallParkRefusingRework } from './shortfall-park.js';
|
|
106
|
+
import { sameShortfallSignature, shortfallSignature } from './shortfall-repeat.js';
|
|
107
|
+
import { hasModelUnavailableHold } from '../queries/verify-own-holds.js';
|
|
108
|
+
import { createLogger } from '../shell/log.js';
|
|
109
|
+
const log = createLogger({ module: 'verification' });
|
|
110
|
+
/**
|
|
111
|
+
* The declared statement classifyReconciliationThrow
|
|
112
|
+
* (verify/verification-model-unavailable-hold.ts) signs a FAILED reconciliation
|
|
113
|
+
* with. Duplicated as a sentinel rather than imported so this module keeps no
|
|
114
|
+
* edge to the hold module; the structural test beside it (the shortfall names the
|
|
115
|
+
* INJECTION node, which a judged target never is) stands on its own if the
|
|
116
|
+
* wording drifts.
|
|
117
|
+
*/
|
|
118
|
+
const RECONCILIATION_FAILED_DECLARED = '(unknown -- reconciliation failed)';
|
|
119
|
+
function lower(id) {
|
|
120
|
+
return id.trim().toLowerCase();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The park's gaps, rebuilt VERBATIM from the standing shortfall detail; null when
|
|
124
|
+
* they cannot be. Accepted only when the detail's node set is a BIJECTION with
|
|
125
|
+
* the park's -- no node missing and none extra -- AND the rebuild re-hashes to
|
|
126
|
+
* the park's own signature, so the routing that follows re-holds THIS park
|
|
127
|
+
* rather than opening a new one, and routes exactly what a fresh judgement would.
|
|
128
|
+
* Pure.
|
|
129
|
+
*/
|
|
130
|
+
export function reconstructParkedShortfalls(park, detail) {
|
|
131
|
+
if (!detail || !Array.isArray(detail.shortfalls))
|
|
132
|
+
return null;
|
|
133
|
+
const parked = new Set(park.nodeIds.map(lower));
|
|
134
|
+
const nodesSeen = new Set();
|
|
135
|
+
const identities = new Set();
|
|
136
|
+
const gaps = [];
|
|
137
|
+
for (const s of detail.shortfalls) {
|
|
138
|
+
if (typeof s?.nodeId !== 'string' || typeof s.declared !== 'string')
|
|
139
|
+
return null;
|
|
140
|
+
const id = lower(s.nodeId);
|
|
141
|
+
// An EXTRA node: the standing detail holds a gap this park does not. Skipping
|
|
142
|
+
// it would reuse a judgement that routes STRICTLY LESS than a fresh one would
|
|
143
|
+
// (park [A] with detail [A,B] routed A alone, where judging routes A and B),
|
|
144
|
+
// and the signature check below cannot catch it -- the reconstruction would
|
|
145
|
+
// re-hash to the park's own signature precisely BECAUSE the extra was
|
|
146
|
+
// dropped. So refuse and let the reconciliation run.
|
|
147
|
+
if (!parked.has(id))
|
|
148
|
+
return null;
|
|
149
|
+
// Deduped on (nodeId, declared) -- the SIGNATURE's own key
|
|
150
|
+
// (verify/shortfall-repeat.ts canonicalSignature), not nodeId alone -- so an
|
|
151
|
+
// identical repeat collapses to one gap while two DIFFERING declarations for
|
|
152
|
+
// one node stay two and are caught by the signature comparison.
|
|
153
|
+
const identity = JSON.stringify([s.nodeId, s.declared]);
|
|
154
|
+
if (identities.has(identity))
|
|
155
|
+
continue;
|
|
156
|
+
identities.add(identity);
|
|
157
|
+
nodesSeen.add(id);
|
|
158
|
+
gaps.push({
|
|
159
|
+
nodeId: s.nodeId,
|
|
160
|
+
declaredStatement: s.declared,
|
|
161
|
+
achievedStatement: typeof s.achieved === 'string' ? s.achieved : '',
|
|
162
|
+
reason: typeof s.reason === 'string' ? s.reason : '',
|
|
163
|
+
...(s.diffCitation ? { diffCitation: s.diffCitation } : {}),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// A BIJECTION, both directions: the loop above refused every node the park does
|
|
167
|
+
// not hold, and this refuses a park node the detail does not carry.
|
|
168
|
+
if (nodesSeen.size !== parked.size)
|
|
169
|
+
return null;
|
|
170
|
+
return sameShortfallSignature(shortfallSignature(gaps), park.signature) ? gaps : null;
|
|
171
|
+
}
|
|
172
|
+
/** Whether one rebuilt gap is a signed reconciliation FAILURE rather than a judgement. Pure. */
|
|
173
|
+
function isFailedReconciliation(gap, injectionNodeId) {
|
|
174
|
+
return lower(gap.nodeId) === lower(injectionNodeId)
|
|
175
|
+
|| gap.declaredStatement === RECONCILIATION_FAILED_DECLARED;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Decide whether this dispatch may answer from the park instead of calling the
|
|
179
|
+
* model (see the module header for each refusal). Pure: every fact is supplied,
|
|
180
|
+
* and every unknown fact refuses.
|
|
181
|
+
*/
|
|
182
|
+
export function decideParkedShortfallReuse(facts) {
|
|
183
|
+
const { park } = facts;
|
|
184
|
+
if (park === null)
|
|
185
|
+
return { reuse: false, refusal: 'no-park' };
|
|
186
|
+
if (facts.awaitingModel)
|
|
187
|
+
return { reuse: false, refusal: 'awaiting-model' };
|
|
188
|
+
if (park.commitSet === null)
|
|
189
|
+
return { reuse: false, refusal: 'park-commit-set-unknown' };
|
|
190
|
+
if (facts.commitSet === null)
|
|
191
|
+
return { reuse: false, refusal: 'commit-set-unknown' };
|
|
192
|
+
if (facts.commitSet !== park.commitSet)
|
|
193
|
+
return { reuse: false, refusal: 'commit-set-changed' };
|
|
194
|
+
// PRESENT on the park means its recorder could READ the rulings ('' = a
|
|
195
|
+
// succeeded read of an empty set). Absent means unknown, which never matches.
|
|
196
|
+
if (park.rulingsFingerprint === undefined)
|
|
197
|
+
return { reuse: false, refusal: 'park-rulings-unknown' };
|
|
198
|
+
if (facts.rulingsFingerprint === null)
|
|
199
|
+
return { reuse: false, refusal: 'rulings-unknown' };
|
|
200
|
+
if (facts.rulingsFingerprint !== park.rulingsFingerprint)
|
|
201
|
+
return { reuse: false, refusal: 'rulings-changed' };
|
|
202
|
+
const shortfalls = reconstructParkedShortfalls(park, facts.detail);
|
|
203
|
+
if (shortfalls === null)
|
|
204
|
+
return { reuse: false, refusal: 'gaps-not-reconstructable' };
|
|
205
|
+
if (shortfalls.some((gap) => isFailedReconciliation(gap, facts.injectionNodeId))) {
|
|
206
|
+
return { reuse: false, refusal: 'not-a-judgement' };
|
|
207
|
+
}
|
|
208
|
+
return { reuse: true, park, shortfalls, rulingsFingerprint: facts.rulingsFingerprint };
|
|
209
|
+
}
|
|
210
|
+
/** The current commit-set fingerprint; null (logged) when unreadable -- which refuses reuse. */
|
|
211
|
+
async function readCommitSet(deps, v, judgedSha) {
|
|
212
|
+
if (!deps.resolveDeliveryCommitSet)
|
|
213
|
+
return null;
|
|
214
|
+
try {
|
|
215
|
+
const ids = await deps.resolveDeliveryCommitSet(v, judgedSha);
|
|
216
|
+
return ids === null ? null : commitSetFingerprint(ids);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
log.warn(`[verification] parked delivery ${v.deliveryId}: commit set unreadable, re-judging:`, err.message);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** The current rulings fingerprint; null (logged) when unreadable -- which refuses reuse. */
|
|
224
|
+
async function readRulingsFingerprint(deps, deliveryId) {
|
|
225
|
+
if (!deps.readShortfallRulings)
|
|
226
|
+
return null;
|
|
227
|
+
try {
|
|
228
|
+
return (await deps.readShortfallRulings(deliveryId)).fingerprint;
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
log.warn(`[verification] parked delivery ${deliveryId}: rulings unreadable, re-judging:`, err.message);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** The delivery's gate record; null (logged) when the read failed -- which refuses reuse. */
|
|
236
|
+
async function readGateRecord(deps, deliveryId) {
|
|
237
|
+
if (!deps.readDeliveryGateRecord)
|
|
238
|
+
return null;
|
|
239
|
+
try {
|
|
240
|
+
return await deps.readDeliveryGateRecord(deliveryId);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
log.warn(`[verification] delivery ${deliveryId}: gate_state unreadable, re-judging:`, err.message);
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Read the delivery's park and decide about it; null when NO park stands, so an
|
|
249
|
+
* ordinary dispatch pays one gate_state read and nothing else. The single
|
|
250
|
+
* decision point: both the cost bound (reuse the judgement) and the re-selection
|
|
251
|
+
* rule (`parkHoldsOnUnchangedFacts`) ask through here, so the two cannot answer
|
|
252
|
+
* differently about the same park. Never throws: every read failure refuses.
|
|
253
|
+
*/
|
|
254
|
+
async function decideForDelivery(v, judgedSha, deps) {
|
|
255
|
+
const record = await readGateRecord(deps, v.deliveryId);
|
|
256
|
+
const park = record === null ? null : shortfallParkRefusingRework(record);
|
|
257
|
+
if (park === null)
|
|
258
|
+
return null;
|
|
259
|
+
const decision = decideParkedShortfallReuse({
|
|
260
|
+
park,
|
|
261
|
+
detail: record?.gateState?.shortfallReconciliation ?? null,
|
|
262
|
+
awaitingModel: hasModelUnavailableHold(record?.gateState),
|
|
263
|
+
commitSet: await readCommitSet(deps, v, judgedSha),
|
|
264
|
+
rulingsFingerprint: await readRulingsFingerprint(deps, v.deliveryId),
|
|
265
|
+
injectionNodeId: v.injectionNodeId,
|
|
266
|
+
});
|
|
267
|
+
return { park, decision };
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Whether a park stands on this delivery whose facts are ALL unchanged -- the
|
|
271
|
+
* question every re-selection path asks before dropping a run mark.
|
|
272
|
+
*
|
|
273
|
+
* TRUE means re-selecting it would re-derive exactly what the park already
|
|
274
|
+
* records, so the path declines. FALSE means the park is absent, its facts moved
|
|
275
|
+
* (a new commit, a new ruling), or SOMETHING IS UNKNOWN -- and unknown must
|
|
276
|
+
* re-select, never suppress: this gate may only ever remove a re-selection it can
|
|
277
|
+
* PROVE is pointless. Never throws.
|
|
278
|
+
*/
|
|
279
|
+
export async function parkHoldsOnUnchangedFacts(v, judgedSha, deps) {
|
|
280
|
+
const decided = await decideForDelivery(v, judgedSha, deps);
|
|
281
|
+
return decided !== null && decided.decision.reuse;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* The park this dispatch may answer from instead of calling the model, or null to
|
|
285
|
+
* judge. Never throws: every read failure refuses.
|
|
286
|
+
*/
|
|
287
|
+
export async function resolveParkedShortfallReuse(v, judgedSha, deps) {
|
|
288
|
+
const decided = await decideForDelivery(v, judgedSha, deps);
|
|
289
|
+
if (decided === null)
|
|
290
|
+
return null;
|
|
291
|
+
const { park, decision } = decided;
|
|
292
|
+
if (!decision.reuse) {
|
|
293
|
+
log.debug(`[verification] delivery "${v.deliveryName}" (${v.deliveryId}) is parked but re-judged this dispatch ` +
|
|
294
|
+
`(${decision.refusal}); the reconciliation runs`);
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
log.info(`[verification] delivery "${v.deliveryName}" (${v.deliveryId}): re-holding the shortfall park recorded ` +
|
|
298
|
+
`${park.parkedAt} on commit set ${park.commitSet} -- unchanged commit set and rulings, so its ` +
|
|
299
|
+
`${decision.shortfalls.length} shortfall(s) are reused as judged and NO MODEL CALL WAS MADE ` +
|
|
300
|
+
`(no reconciliation this dispatch)`);
|
|
301
|
+
return {
|
|
302
|
+
restatements: [],
|
|
303
|
+
shortfalls: decision.shortfalls,
|
|
304
|
+
rulingsFingerprint: decision.rulingsFingerprint,
|
|
305
|
+
withheldNodeIds: [],
|
|
306
|
+
honored: [],
|
|
307
|
+
park,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=parked-shortfall-reuse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parked-shortfall-reuse.js","sourceRoot":"","sources":["../../src/verify/parked-shortfall-reuse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every path that can re-select a delivery already sitting in verify. A new path
|
|
3
|
+
* belongs here AND at a `logReselection` call site; the enumeration test fails
|
|
4
|
+
* on a member with no driver.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RESELECTION_PATHS: readonly ["run-mark-prune", "run-mark-release", "commit-verdict-pull", "credit-rearm", "ruling-rearm", "pending-relisting", "model-unavailable-unmark", "checkout-unavailable-unmark"];
|
|
7
|
+
/** One of {@link RESELECTION_PATHS}. */
|
|
8
|
+
export type ReselectionPath = (typeof RESELECTION_PATHS)[number];
|
|
9
|
+
/** Test-only: forget every de-duplicated line written so far. */
|
|
10
|
+
export declare function __resetReselectionLogForTests(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Write the one line for this re-selection.
|
|
13
|
+
*
|
|
14
|
+
* `dedupeKey` is for a line that fires REPEATEDLY for the same (delivery,
|
|
15
|
+
* reason) WITHOUT re-selecting anything -- a DECLINED re-selection, e.g. a parked
|
|
16
|
+
* row the edge re-lists every tick. Pass it and the line is written once per
|
|
17
|
+
* (path, delivery, key). A line for a re-selection that happens -- a dispatch
|
|
18
|
+
* follows -- is never de-duplicated: the repetition IS the information (the
|
|
19
|
+
* incident's ~30 re-dispatches should have produced ~30 lines, not one).
|
|
20
|
+
*/
|
|
21
|
+
export declare function logReselection(path: ReselectionPath, deliveryId: string, detail: string, dedupeKey?: string): void;
|
|
22
|
+
//# sourceMappingURL=reselection-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reselection-log.d.ts","sourceRoot":"","sources":["../../src/verify/reselection-log.ts"],"names":[],"mappings":"AA0CA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,wLAiBpB,CAAC;AAEX,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAKjE,iEAAiE;AACjE,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAON"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/explicit-row-selection.test.ts,
|
|
3
|
+
// packages/daemon/src/verify/reselection-log.test.ts,
|
|
4
|
+
// packages/daemon/src/verify/verification-default-on.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
/**
|
|
7
|
+
* ONE line per re-selection of a delivery sitting in verify, naming the PATH
|
|
8
|
+
* that re-selected it.
|
|
9
|
+
*
|
|
10
|
+
* Why this module exists. On 2026-09-24 delivery 8ae80225 sat parked in verify
|
|
11
|
+
* at an unchanged focus HEAD (88cd9d77) and was re-dispatched every ~60s for
|
|
12
|
+
* ~30 ticks. Every tick logged the dispatch ("takes the 'passed' verdict
|
|
13
|
+
* recorded for focus HEAD 88cd9d77") and, ~28s later, its outcome -- and NOTHING
|
|
14
|
+
* said why the delivery had been selected again. The five paths that re-arm a
|
|
15
|
+
* delivery either log per FOCUS (credit-rearm), log nothing at all
|
|
16
|
+
* (pruneGuardsOutsideVerify -- which turned out to be the one at fault), or log
|
|
17
|
+
* in their own private shape. So the re-dispatch could not be attributed from
|
|
18
|
+
* ~/.telora/daemon.log: the incident had to be reasoned out of the source.
|
|
19
|
+
*
|
|
20
|
+
* The rule: a delivery whose guards are dropped is a delivery that WILL be
|
|
21
|
+
* selected again, and exactly one line says which path dropped them. The path
|
|
22
|
+
* names are an exported const union, so the shape cannot drift and a path added
|
|
23
|
+
* later without a log line is a visible hole (verify/reselection-log.test.ts
|
|
24
|
+
* enumerates the union).
|
|
25
|
+
*
|
|
26
|
+
* WHO LOGS. Each path logs at its OWN call site, because only there is the
|
|
27
|
+
* reason known. The guard mutators in verify/default-on-guards.ts are the
|
|
28
|
+
* fallback, not a second voice: `releaseDefaultOnMark(id)` called with no path
|
|
29
|
+
* logs 'run-mark-release', and called WITH a path stays silent so the caller's
|
|
30
|
+
* own richer line stands alone.
|
|
31
|
+
*
|
|
32
|
+
* A line is only written when something was actually dropped -- a release that
|
|
33
|
+
* found no mark suppressed nothing and re-selected nothing.
|
|
34
|
+
*
|
|
35
|
+
* @module verify/reselection-log
|
|
36
|
+
*/
|
|
37
|
+
import { createLogger } from '../shell/log.js';
|
|
38
|
+
const log = createLogger({ module: 'verification' });
|
|
39
|
+
/**
|
|
40
|
+
* Every path that can re-select a delivery already sitting in verify. A new path
|
|
41
|
+
* belongs here AND at a `logReselection` call site; the enumeration test fails
|
|
42
|
+
* on a member with no driver.
|
|
43
|
+
*/
|
|
44
|
+
export const RESELECTION_PATHS = [
|
|
45
|
+
/** The default-on scan no longer observed the delivery in verify (default-on-guards.ts pruneGuardsOutsideVerify). */
|
|
46
|
+
'run-mark-prune',
|
|
47
|
+
/** The run mark was dropped by a caller that named no path of its own (default-on-guards.ts releaseDefaultOnMark). */
|
|
48
|
+
'run-mark-release',
|
|
49
|
+
/** A route held for a verdict on the current HEAD pulled the run (commit-verdict-pull.ts). */
|
|
50
|
+
'commit-verdict-pull',
|
|
51
|
+
/** The focus's commit-credit set changed, so the same commit is judged again (credit-rearm.ts). */
|
|
52
|
+
'credit-rearm',
|
|
53
|
+
/** An operator ruling released a shortfall park (shortfall-rulings.ts rearmRuledShortfallParks). */
|
|
54
|
+
'ruling-rearm',
|
|
55
|
+
/** The edge re-listed an explicit-method row in the pending queue (verification-engine.ts). */
|
|
56
|
+
'pending-relisting',
|
|
57
|
+
/** The reconciliation's model could not be reached: no verdict to guard (default-on-guards.ts noteDefaultOnResult). */
|
|
58
|
+
'model-unavailable-unmark',
|
|
59
|
+
/** No checkout could be made, or the verdict was discarded mid-run (default-on-guards.ts noteDefaultOnResult). */
|
|
60
|
+
'checkout-unavailable-unmark',
|
|
61
|
+
];
|
|
62
|
+
/** `${path}@${deliveryId}@${dedupeKey}` triples already written. */
|
|
63
|
+
const written = new Set();
|
|
64
|
+
/** Test-only: forget every de-duplicated line written so far. */
|
|
65
|
+
export function __resetReselectionLogForTests() {
|
|
66
|
+
written.clear();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Write the one line for this re-selection.
|
|
70
|
+
*
|
|
71
|
+
* `dedupeKey` is for a line that fires REPEATEDLY for the same (delivery,
|
|
72
|
+
* reason) WITHOUT re-selecting anything -- a DECLINED re-selection, e.g. a parked
|
|
73
|
+
* row the edge re-lists every tick. Pass it and the line is written once per
|
|
74
|
+
* (path, delivery, key). A line for a re-selection that happens -- a dispatch
|
|
75
|
+
* follows -- is never de-duplicated: the repetition IS the information (the
|
|
76
|
+
* incident's ~30 re-dispatches should have produced ~30 lines, not one).
|
|
77
|
+
*/
|
|
78
|
+
export function logReselection(path, deliveryId, detail, dedupeKey) {
|
|
79
|
+
if (dedupeKey !== undefined) {
|
|
80
|
+
const key = `${path}@${deliveryId}@${dedupeKey}`;
|
|
81
|
+
if (written.has(key))
|
|
82
|
+
return;
|
|
83
|
+
written.add(key);
|
|
84
|
+
}
|
|
85
|
+
log.info(`[verification] re-selection (${path}): delivery ${deliveryId} -- ${detail}`);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=reselection-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reselection-log.js","sourceRoot":"","sources":["../../src/verify/reselection-log.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wEAAwE;AACxE,wDAAwD;AACxD,+DAA+D;AAC/D,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,qHAAqH;IACrH,gBAAgB;IAChB,sHAAsH;IACtH,kBAAkB;IAClB,8FAA8F;IAC9F,qBAAqB;IACrB,mGAAmG;IACnG,cAAc;IACd,oGAAoG;IACpG,cAAc;IACd,+FAA+F;IAC/F,mBAAmB;IACnB,uHAAuH;IACvH,0BAA0B;IAC1B,kHAAkH;IAClH,6BAA6B;CACrB,CAAC;AAKX,oEAAoE;AACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;AAElC,iEAAiE;AACjE,MAAM,UAAU,6BAA6B;IAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAqB,EACrB,UAAkB,EAClB,MAAc,EACd,SAAkB;IAElB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,gCAAgC,IAAI,eAAe,UAAU,OAAO,MAAM,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -86,7 +86,14 @@ export interface ShortfallParkClassification {
|
|
|
86
86
|
* rules follow:
|
|
87
87
|
* - the park records it (null keeps the standing park's), so a park re-held by
|
|
88
88
|
* the judgement a ruling re-armed is no longer released by that ruling -- the
|
|
89
|
-
* re-judgement happens once per new ruling, not on every tick
|
|
89
|
+
* re-judgement happens once per new ruling, not on every tick. A SUCCEEDED
|
|
90
|
+
* read of an EMPTY ruling set records '' -- "no ruling was in force", a fact
|
|
91
|
+
* that was KNOWN -- and the field is ABSENT only where the read FAILED (or on
|
|
92
|
+
* a record written before this rule). The two used to be one absence, so a
|
|
93
|
+
* park recorded while the rulings were unreadable could not be told from one
|
|
94
|
+
* recorded under a known-empty set; a reader that must not answer from an
|
|
95
|
+
* unknown history (verify/parked-shortfall-reuse.ts) requires the field to be
|
|
96
|
+
* PRESENT, which only this recorder can make meaningful;
|
|
90
97
|
* - a NEW ruling that disposed of SOME of the parked nodes on an unchanged
|
|
91
98
|
* commit set narrows the park to the rest instead of ending it: those nodes
|
|
92
99
|
* already repeated unchanged, so sending them back to coding would restart the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-park.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-park.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shortfall-park.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-park.ts"],"names":[],"mappings":"AA2DA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAE3B,MAAM,mCAAmC,CAAC;AAO3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAK/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAInE;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAE1E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,GAAG,IAAI,CAEpI;AAED,mEAAmE;AACnE,MAAM,WAAW,yBAAyB;IACxC,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAIxG;AAED,0DAA0D;AAC1D,MAAM,WAAW,2BAA2B;IAC1C,mGAAmG;IACnG,MAAM,EAAE,qBAAqB,CAAC;IAC9B,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;IAChB,sGAAsG;IACtG,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5B;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACpD,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,GAAE,MAAoC,EAC3C,GAAG,GAAE,MAAiC,EACtC,kBAAkB,GAAE,MAAM,GAAG,IAAW,GACvC,2BAA2B,CAoC7B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,iBAAiB,CAO7G"}
|
|
@@ -9,10 +9,14 @@
|
|
|
9
9
|
// packages/daemon/src/integration/shortfall-ruling-release.test.ts,
|
|
10
10
|
// packages/daemon/src/prompt/prompt-listing.test.ts,
|
|
11
11
|
// packages/daemon/src/spawn/review-hold-park-shortfall.test.ts,
|
|
12
|
+
// packages/daemon/src/verify/commit-verdict-pull.test.ts,
|
|
12
13
|
// packages/daemon/src/verify/delivery-commit-set.test.ts,
|
|
14
|
+
// packages/daemon/src/verify/explicit-row-selection.test.ts,
|
|
15
|
+
// packages/daemon/src/verify/parked-shortfall-reuse.test.ts,
|
|
13
16
|
// packages/daemon/src/verify/shortfall-park-escalation.test.ts,
|
|
14
17
|
// packages/daemon/src/verify/shortfall-park.test.ts, packages/daemon/src/verify/shortfall-routing.test.ts,
|
|
15
|
-
// packages/daemon/src/verify/shortfall-rulings.test.ts
|
|
18
|
+
// packages/daemon/src/verify/shortfall-rulings.test.ts,
|
|
19
|
+
// packages/daemon/src/verify/verification-default-on.test.ts
|
|
16
20
|
// PINNED-BY-END
|
|
17
21
|
/**
|
|
18
22
|
* The SHORTFALL PARK: a delivery whose identical verify shortfall re-holds on an
|
|
@@ -145,7 +149,14 @@ function narrowedByRuling(standing, shortfalls, rulingsFingerprint) {
|
|
|
145
149
|
* rules follow:
|
|
146
150
|
* - the park records it (null keeps the standing park's), so a park re-held by
|
|
147
151
|
* the judgement a ruling re-armed is no longer released by that ruling -- the
|
|
148
|
-
* re-judgement happens once per new ruling, not on every tick
|
|
152
|
+
* re-judgement happens once per new ruling, not on every tick. A SUCCEEDED
|
|
153
|
+
* read of an EMPTY ruling set records '' -- "no ruling was in force", a fact
|
|
154
|
+
* that was KNOWN -- and the field is ABSENT only where the read FAILED (or on
|
|
155
|
+
* a record written before this rule). The two used to be one absence, so a
|
|
156
|
+
* park recorded while the rulings were unreadable could not be told from one
|
|
157
|
+
* recorded under a known-empty set; a reader that must not answer from an
|
|
158
|
+
* unknown history (verify/parked-shortfall-reuse.ts) requires the field to be
|
|
159
|
+
* PRESENT, which only this recorder can make meaningful;
|
|
149
160
|
* - a NEW ruling that disposed of SOME of the parked nodes on an unchanged
|
|
150
161
|
* commit set narrows the park to the rest instead of ending it: those nodes
|
|
151
162
|
* already repeated unchanged, so sending them back to coding would restart the
|
|
@@ -178,6 +189,9 @@ export function classifyShortfallPark(priorGateState, shortfalls, commitSet, lim
|
|
|
178
189
|
const repeat = { signature, count, ...(knownSet !== null ? { commitSet: knownSet } : {}) };
|
|
179
190
|
if (count < limit)
|
|
180
191
|
return { repeat, parked: false, park: null };
|
|
192
|
+
// PRESENT means KNOWN: '' is a succeeded read of an empty ruling set, and the
|
|
193
|
+
// field is omitted only when this judgement could not read the rulings and no
|
|
194
|
+
// standing park carries a known one.
|
|
181
195
|
const applied = rulingsFingerprint ?? (holding ? standing.rulingsFingerprint : undefined);
|
|
182
196
|
const park = {
|
|
183
197
|
// A re-hold of the same shortfall keeps the standing park's signature text, so
|
|
@@ -187,7 +201,7 @@ export function classifyShortfallPark(priorGateState, shortfalls, commitSet, lim
|
|
|
187
201
|
nodeIds: sortedNodeIds(shortfalls),
|
|
188
202
|
count,
|
|
189
203
|
parkedAt: holding ? standing.parkedAt : now,
|
|
190
|
-
...(applied ? { rulingsFingerprint: applied } : {}),
|
|
204
|
+
...(applied !== undefined ? { rulingsFingerprint: applied } : {}),
|
|
191
205
|
};
|
|
192
206
|
return { repeat, parked: true, park };
|
|
193
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-park.js","sourceRoot":"","sources":["../../src/verify/shortfall-park.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAC/E,uEAAuE;AACvE,0EAA0E;AAC1E,8DAA8D;AAC9D,6DAA6D;AAC7D,gFAAgF;AAChF,4FAA4F;AAC5F,sEAAsE;AACtE,uDAAuD;AACvD,kEAAkE;AAClE,4DAA4D;AAC5D,kEAAkE;AAClE,6GAA6G;AAC7G,
|
|
1
|
+
{"version":3,"file":"shortfall-park.js","sourceRoot":"","sources":["../../src/verify/shortfall-park.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-repeat.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shortfall-repeat.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,kIAAkI;IAClI,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,mFAAmF;AACnF,eAAO,MAAM,sCAAsC,IAA8B,CAAC;AAmBlF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAEjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAerE;AAED,oGAAoG;AACpG,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAE5G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACpD,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,SAAS,GAAE,MAAoC,GAC9C;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAKnD"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
2
|
// Pinned by: packages/daemon/src/integration/verification-history-round-trip.test.ts,
|
|
3
|
-
// packages/daemon/src/verify/
|
|
4
|
-
// packages/daemon/src/verify/
|
|
3
|
+
// packages/daemon/src/verify/commit-verdict-pull.test.ts,
|
|
4
|
+
// packages/daemon/src/verify/explicit-row-selection.test.ts,
|
|
5
|
+
// packages/daemon/src/verify/misattributed-hold.test.ts,
|
|
6
|
+
// packages/daemon/src/verify/parked-shortfall-reuse.test.ts,
|
|
7
|
+
// packages/daemon/src/verify/shortfall-park.test.ts, packages/daemon/src/verify/shortfall-repeat.test.ts,
|
|
8
|
+
// packages/daemon/src/verify/shortfall-routing.test.ts,
|
|
9
|
+
// packages/daemon/src/verify/verification-default-on.test.ts
|
|
5
10
|
// PINNED-BY-END
|
|
6
11
|
/**
|
|
7
12
|
* Shortfall REPETITION discriminator for the verify gate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-repeat.js","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,sFAAsF;AACtF,
|
|
1
|
+
{"version":3,"file":"shortfall-repeat.js","sourceRoot":"","sources":["../../src/verify/shortfall-repeat.ts"],"names":[],"mappings":"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"}
|