@telora/daemon 0.22.208 → 0.22.226
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 +2 -2
- 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/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/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/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/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/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 +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Verify honors
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Verify honors SHORTFALL RULINGS: a node ruled MET or EXCUSED on a delivery
|
|
3
|
+
* (queries/shortfall-rulings.ts) no longer holds its verify gate, and a ruling
|
|
4
|
+
* recorded since a shortfall park is a change verify re-judges.
|
|
5
5
|
*
|
|
6
6
|
* Why: before rulings were read, an operator's "these nodes are met, re-verify"
|
|
7
7
|
* lived only in an escalation's resolution notes. The next verify pass re-judged
|
|
@@ -9,6 +9,33 @@
|
|
|
9
9
|
* repeating shortfall (verify/shortfall-park.ts) stayed parked: nothing but a new
|
|
10
10
|
* commit re-armed its verify.
|
|
11
11
|
*
|
|
12
|
+
* TWO SOURCES OF A RULING, one read. The edge (`daemon_get_delivery_shortfall_-
|
|
13
|
+
* rulings`) returns the union of:
|
|
14
|
+
* - an OPERATOR row on `delivery_shortfall_rulings` (`ruledByKind` = the
|
|
15
|
+
* recording credential's kind, `user` / `ai_tracker`), and
|
|
16
|
+
* - a node verdict of the focus's latest APPROVING focus_review
|
|
17
|
+
* (`ruledByKind: 'review'`, `focusReviewId` naming the review row).
|
|
18
|
+
* An OPERATOR ruling on a node WINS -- the edge emits a review verdict only for
|
|
19
|
+
* a node no operator ruled -- so nothing here has to break a tie. A `not_met`
|
|
20
|
+
* verdict rules NOTHING and never reaches this module: a node review called
|
|
21
|
+
* not_met and verify judges short is the two channels AGREEING, and the gate
|
|
22
|
+
* holding it is correct.
|
|
23
|
+
*
|
|
24
|
+
* Why this module treats both identically: the review verdict is the SAME
|
|
25
|
+
* judgement an operator was transcribing by hand. On 2026-09-24 a review excused
|
|
26
|
+
* a node at 01:13Z; verify failed the delivery on that node 41 times over three
|
|
27
|
+
* and a half hours, bouncing it verify -> verify_failed -> coding to iteration 17
|
|
28
|
+
* -- each cycle spawning a coding team with nothing to change -- until a human
|
|
29
|
+
* recorded the ruling the review had already rendered. The only asymmetry kept is
|
|
30
|
+
* in the RECORD: `withRulingEvidence` names which source ruled, so the injection
|
|
31
|
+
* evidence says whether a human recorded it or a review ruled it, and which
|
|
32
|
+
* review.
|
|
33
|
+
*
|
|
34
|
+
* A review-sourced ruling feeds the same FINGERPRINT (its id is
|
|
35
|
+
* `review:<focusReviewId>:<nodeId>` -- stable across re-reads, new per approving
|
|
36
|
+
* review), so `withShortfallRulingRearm` re-judges a park exactly once when a
|
|
37
|
+
* review lands, by the same mechanism a recorded row uses.
|
|
38
|
+
*
|
|
12
39
|
* APPLYING rulings (applyShortfallRulings, called by the verification engine
|
|
13
40
|
* between the reconciliation and the shortfall routing):
|
|
14
41
|
* - MET: the node counts as achieved. It leaves the shortfall set and joins the
|
|
@@ -51,6 +78,52 @@
|
|
|
51
78
|
* the edge nulls, so daemon_get_pending_verifications lists a parked explicit row
|
|
52
79
|
* again every tick and its next dispatch applies the rulings.
|
|
53
80
|
*
|
|
81
|
+
* WHAT ELSE MAY RE-SELECT A PARKED DELIVERY AT AN UNCHANGED HEAD: nothing but a
|
|
82
|
+
* new commit, and this re-arm. That claim stood in this header before it was
|
|
83
|
+
* true. On 2026-09-24 delivery 8ae80225 sat parked at an unchanged focus HEAD and
|
|
84
|
+
* was re-dispatched every ~60s for ~30 ticks: the run-mark prune ran once per
|
|
85
|
+
* PRODUCT over guards keyed by delivery id alone, so a sibling product's scan
|
|
86
|
+
* wiped this one's marks every tick (verify/default-on-guards.ts, which now
|
|
87
|
+
* scopes the prune, carries the incident and the fix). Reading a rule here that
|
|
88
|
+
* the code did not keep is what made the log look impossible rather than merely
|
|
89
|
+
* undiagnosed, so the rule is now pinned from two sides: the prune is scoped, and
|
|
90
|
+
* EVERY path that re-selects a delivery in verify writes one line naming itself
|
|
91
|
+
* (verify/reselection-log.ts, whose exported path union a test enumerates -- this
|
|
92
|
+
* module's re-arm logs 'ruling-rearm'). And the cost of any re-dispatch that does
|
|
93
|
+
* reach a parked delivery is now bounded independently: a dispatch whose park
|
|
94
|
+
* matches the current commit set and rulings fingerprint reuses the parked
|
|
95
|
+
* shortfall and makes NO model call (verify/parked-shortfall-reuse.ts), so a
|
|
96
|
+
* ruling landing here is what re-judges it -- once -- rather than every tick
|
|
97
|
+
* paying a ~28s reconciliation to re-derive a shortfall the park already records.
|
|
98
|
+
*
|
|
99
|
+
* THE CLOSED LIST, stated once and pinned through the real tick composition
|
|
100
|
+
* (verification-default-on.test.ts, commit-verdict-pull.test.ts). Of the eight
|
|
101
|
+
* declared re-selection paths, a parked delivery at an unchanged HEAD is
|
|
102
|
+
* re-selected by exactly two, and both ARE the rule: 'ruling-rearm' (this
|
|
103
|
+
* module -- a new ruling) and a genuinely new commit, which reaches it as
|
|
104
|
+
* 'credit-rearm' (a commit credited to THIS delivery; a sibling's credit does
|
|
105
|
+
* not re-arm it) or as a changed commit set at dispatch. Three paths CANNOT fire
|
|
106
|
+
* on a parked delivery: 'run-mark-prune' (a parked delivery is in verify, and a
|
|
107
|
+
* partial scan prunes nothing), 'run-mark-release' (not a path of its own -- the
|
|
108
|
+
* silent fallback when a caller names itself) and 'pending-relisting' (which
|
|
109
|
+
* drops a parked explicit row, verify/explicit-row-selection.ts, and writes
|
|
110
|
+
* its re-selection line once per dispatch that routes a verdict). The remaining
|
|
111
|
+
* three DECLINE while the park's facts are unchanged, each saying so in its own
|
|
112
|
+
* line: 'checkout-unavailable-unmark', 'model-unavailable-unmark'
|
|
113
|
+
* (verify/default-on-guards.ts noteDefaultOnResult) and 'commit-verdict-pull'
|
|
114
|
+
* (verify/commit-verdict-pull.ts).
|
|
115
|
+
*
|
|
116
|
+
* NONE OF THE THREE CAN WEDGE, and each reason is a STATE, not an exemption. A
|
|
117
|
+
* model-unavailable hold that landed on gate_state refuses the park
|
|
118
|
+
* ('awaiting-model'), so the retry proceeds; the decline fires only where a real
|
|
119
|
+
* judgement on these same facts still stands. The pull declines only where this
|
|
120
|
+
* process judged the held commit itself AND the release pass's own read finds
|
|
121
|
+
* that commit's verdict 'passed' -- a park is written only after the gate passed
|
|
122
|
+
* there, but the record write is best-effort, so the park alone does not prove
|
|
123
|
+
* the verdict persisted -- and a commit it already pulled for is pulled again
|
|
124
|
+
* while that read stays 'pending' (verify/commit-verdict-pull.ts). And every
|
|
125
|
+
* UNKNOWN fact re-selects.
|
|
126
|
+
*
|
|
54
127
|
* @module verify/shortfall-rulings
|
|
55
128
|
*/
|
|
56
129
|
import type { getFocusDeliveries } from '../queries/focuses.js';
|
|
@@ -59,8 +132,12 @@ import type { PendingVerification } from '../queries/verification.js';
|
|
|
59
132
|
import type { TargetRestatement, TargetShortfall } from './verify-restatement.js';
|
|
60
133
|
/** Read a delivery's active shortfall rulings (queries/shortfall-rulings.ts getDeliveryShortfallRulings). */
|
|
61
134
|
export type ShortfallRulingsReader = (deliveryId: string) => Promise<DeliveryShortfallRulings>;
|
|
62
|
-
/**
|
|
63
|
-
|
|
135
|
+
/**
|
|
136
|
+
* A ruling that cleared one of this judgement's shortfalls, carrying WHO ruled:
|
|
137
|
+
* a reader of the injection evidence or the log must be able to tell an operator
|
|
138
|
+
* row from a review verdict without a second query.
|
|
139
|
+
*/
|
|
140
|
+
export type HonoredRuling = Pick<ShortfallRuling, 'nodeId' | 'verdict' | 'rationale' | 'ruledByKind' | 'ruledSessionId' | 'focusReviewId'>;
|
|
64
141
|
/** A reconciliation with the delivery's rulings applied. */
|
|
65
142
|
export interface RuledReconciliation {
|
|
66
143
|
restatements: TargetRestatement[];
|
|
@@ -81,7 +158,17 @@ export declare function applyShortfallRulings(v: Pick<PendingVerification, 'deli
|
|
|
81
158
|
restatements: readonly TargetRestatement[];
|
|
82
159
|
shortfalls: readonly TargetShortfall[];
|
|
83
160
|
}, read: ShortfallRulingsReader | undefined): Promise<RuledReconciliation>;
|
|
84
|
-
/**
|
|
161
|
+
/**
|
|
162
|
+
* The injection evidence with the honored rulings appended, each NAMING ITS
|
|
163
|
+
* SOURCE -- an operator row by the credential kind that recorded it, a review
|
|
164
|
+
* verdict by the focus_review that ruled and the session that rendered it.
|
|
165
|
+
* Unchanged when none were honored. Pure.
|
|
166
|
+
*
|
|
167
|
+
* Why the source is in the evidence: this note is the only durable place a
|
|
168
|
+
* `match` carried by a ruling can state its reason (the injection edge persists a
|
|
169
|
+
* reason only on a legitimate_divergence), so "who lowered the bar on this node"
|
|
170
|
+
* has to be legible there or it is legible nowhere.
|
|
171
|
+
*/
|
|
85
172
|
export declare function withRulingEvidence(evidence: string, honored: readonly HonoredRuling[]): string;
|
|
86
173
|
/** The delivery fields the re-arm reads. */
|
|
87
174
|
type ParkedCandidate = Pick<Awaited<ReturnType<typeof getFocusDeliveries>>[number], 'id' | 'name' | 'executionStatus' | 'gateState' | 'verificationMethod'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-rulings.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-rulings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shortfall-rulings.d.ts","sourceRoot":"","sources":["../../src/verify/shortfall-rulings.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+HG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AASlF,6GAA6G;AAC7G,MAAM,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,eAAe,EACf,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,gBAAgB,GAAG,eAAe,CACxF,CAAC;AAOF,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,mEAAmE;IACnE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,iHAAiH;IACjH,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iGAAiG;IACjG,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iEAAiE;IACjE,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,cAAc,CAAC,EAC3D,UAAU,EAAE;IAAE,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,EAClG,IAAI,EAAE,sBAAsB,GAAG,SAAS,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAuD9B;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAK9F;AAMD,4CAA4C;AAC5C,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CAAC,CAAC;AAoB5J;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS;IAAE,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAAC,oBAAoB,CAAC,EAAE,sBAAsB,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAS/J;AAED,wDAAwD;AACxD,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D"}
|
|
@@ -1,14 +1,21 @@
|
|
|
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/held-route-pull-dispatch.test.ts,
|
|
3
|
+
// packages/daemon/src/integration/review-verdict-ruling-release.test.ts,
|
|
3
4
|
// packages/daemon/src/integration/shortfall-ruling-disposes-proposals-regression.test.ts,
|
|
4
5
|
// packages/daemon/src/integration/shortfall-ruling-release.test.ts,
|
|
5
|
-
// packages/daemon/src/verify/shortfall-rulings.test.ts
|
|
6
|
+
// packages/daemon/src/verify/reselection-log.test.ts, packages/daemon/src/verify/shortfall-rulings.test.ts,
|
|
7
|
+
// packages/daemon/src/verify/verification-default-on.test.ts
|
|
6
8
|
// PINNED-BY-END
|
|
7
9
|
import { isShortfallParkReleased, shortfallParkRefusingRework } from './shortfall-park.js';
|
|
8
10
|
import { releaseDefaultOnMark } from './default-on-guards.js';
|
|
11
|
+
import { logReselection } from './reselection-log.js';
|
|
9
12
|
import { isGateRunSelected } from './gate-run-registry.js';
|
|
10
13
|
import { createLogger } from '../shell/log.js';
|
|
11
14
|
const log = createLogger({ module: 'verification' });
|
|
15
|
+
/** Is this ruling a review verdict rather than a recorded operator row? */
|
|
16
|
+
function isReviewSourced(h) {
|
|
17
|
+
return h.ruledByKind === 'review' || (typeof h.focusReviewId === 'string' && h.focusReviewId !== '');
|
|
18
|
+
}
|
|
12
19
|
/**
|
|
13
20
|
* Apply the delivery's active rulings to this judgement's reconciliation (see the
|
|
14
21
|
* module header). Never throws: a failed read applies nothing.
|
|
@@ -40,7 +47,14 @@ export async function applyShortfallRulings(v, reconciled, read) {
|
|
|
40
47
|
ruled.shortfalls.push(s);
|
|
41
48
|
continue;
|
|
42
49
|
}
|
|
43
|
-
ruled.honored.push({
|
|
50
|
+
ruled.honored.push({
|
|
51
|
+
nodeId: s.nodeId,
|
|
52
|
+
verdict: ruling.verdict,
|
|
53
|
+
rationale: ruling.rationale,
|
|
54
|
+
ruledByKind: ruling.ruledByKind,
|
|
55
|
+
ruledSessionId: ruling.ruledSessionId,
|
|
56
|
+
focusReviewId: ruling.focusReviewId ?? null,
|
|
57
|
+
});
|
|
44
58
|
if (ruling.verdict === 'met') {
|
|
45
59
|
ruled.restatements.push({ nodeId: s.nodeId, statement: s.declaredStatement, classification: 'match', originalClaim: s.declaredStatement });
|
|
46
60
|
}
|
|
@@ -49,22 +63,62 @@ export async function applyShortfallRulings(v, reconciled, read) {
|
|
|
49
63
|
}
|
|
50
64
|
}
|
|
51
65
|
if (ruled.honored.length > 0) {
|
|
52
|
-
|
|
53
|
-
|
|
66
|
+
const reviewCount = ruled.honored.filter(isReviewSourced).length;
|
|
67
|
+
const sources = reviewCount === 0
|
|
68
|
+
? 'operator rulings'
|
|
69
|
+
: reviewCount === ruled.honored.length
|
|
70
|
+
? 'approving-review verdicts'
|
|
71
|
+
: `rulings (${ruled.honored.length - reviewCount} operator, ${reviewCount} review-sourced)`;
|
|
72
|
+
log.info(`[verification] delivery "${v.deliveryName}" (${v.deliveryId}): ${sources} cleared ${ruled.honored.length} `
|
|
73
|
+
+ `shortfall node(s) -- ${ruled.honored.map((h) => `${h.nodeId} ${h.verdict} (${rulingSourceLabel(h)})`).join(', ')}; `
|
|
54
74
|
+ `${ruled.shortfalls.length} shortfall(s) still hold`);
|
|
55
75
|
}
|
|
56
76
|
return ruled;
|
|
57
77
|
}
|
|
58
|
-
/**
|
|
78
|
+
/** How one honored ruling names its source, in a log line or a line of evidence. */
|
|
79
|
+
function rulingSourceLabel(h) {
|
|
80
|
+
if (!isReviewSourced(h))
|
|
81
|
+
return `operator ruling, ${h.ruledByKind}`;
|
|
82
|
+
const session = h.ruledSessionId !== null ? `, review session ${h.ruledSessionId}` : '';
|
|
83
|
+
return `approving review ${h.focusReviewId ?? 'unknown'}${session}`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The injection evidence with the honored rulings appended, each NAMING ITS
|
|
87
|
+
* SOURCE -- an operator row by the credential kind that recorded it, a review
|
|
88
|
+
* verdict by the focus_review that ruled and the session that rendered it.
|
|
89
|
+
* Unchanged when none were honored. Pure.
|
|
90
|
+
*
|
|
91
|
+
* Why the source is in the evidence: this note is the only durable place a
|
|
92
|
+
* `match` carried by a ruling can state its reason (the injection edge persists a
|
|
93
|
+
* reason only on a legitimate_divergence), so "who lowered the bar on this node"
|
|
94
|
+
* has to be legible there or it is legible nowhere.
|
|
95
|
+
*/
|
|
59
96
|
export function withRulingEvidence(evidence, honored) {
|
|
60
97
|
if (honored.length === 0)
|
|
61
98
|
return evidence;
|
|
62
|
-
const lines = honored.map((h) => `- node ${h.nodeId} ruled ${h.verdict}: ${h.rationale}`);
|
|
63
|
-
const note = `
|
|
99
|
+
const lines = honored.map((h) => `- node ${h.nodeId} ruled ${h.verdict} by ${rulingSourceLabel(h)}: ${h.rationale}`);
|
|
100
|
+
const note = `Shortfall rulings honored:\n${lines.join('\n')}`;
|
|
64
101
|
return evidence.trim() === '' ? note : `${evidence}\n${note}`;
|
|
65
102
|
}
|
|
66
103
|
/** The rulings fingerprint each delivery was last re-armed on in this process. */
|
|
67
104
|
const rearmedOn = new Map();
|
|
105
|
+
/**
|
|
106
|
+
* What CHANGED, worded by what the reader actually knows. The re-arm decides on a
|
|
107
|
+
* fingerprint, which says only "the ruling set differs"; it must not claim "an
|
|
108
|
+
* operator ruling was recorded" when the change was a review verdict landing, or
|
|
109
|
+
* a revocation removing one. So the wording is derived from the rulings the read
|
|
110
|
+
* returned, and says the neutral thing when they name nothing.
|
|
111
|
+
*/
|
|
112
|
+
function describeRulingSources(rulings) {
|
|
113
|
+
if (rulings.length === 0)
|
|
114
|
+
return 'the rulings on it changed';
|
|
115
|
+
const review = rulings.filter((r) => r.ruledByKind === 'review').length;
|
|
116
|
+
if (review === 0)
|
|
117
|
+
return 'an operator ruling was recorded';
|
|
118
|
+
if (review === rulings.length)
|
|
119
|
+
return "an approving review's verdict ruled its nodes";
|
|
120
|
+
return 'an operator ruling and an approving review verdict are in force';
|
|
121
|
+
}
|
|
68
122
|
/**
|
|
69
123
|
* For each delivery in verify carrying a shortfall park, drop its default-on run
|
|
70
124
|
* mark when its rulings release the park and it was not already re-armed on that
|
|
@@ -78,21 +132,24 @@ export async function rearmRuledShortfallParks(deliveries, read) {
|
|
|
78
132
|
continue;
|
|
79
133
|
if (isGateRunSelected(d.id))
|
|
80
134
|
continue;
|
|
81
|
-
let
|
|
135
|
+
let read_;
|
|
82
136
|
try {
|
|
83
|
-
|
|
137
|
+
read_ = await read(d.id);
|
|
84
138
|
}
|
|
85
139
|
catch (err) {
|
|
86
140
|
log.warn(`[verification] shortfall rulings for parked delivery "${d.name}" (${d.id}) could not be read -- its park is not re-judged this tick: ${err.message}`);
|
|
87
141
|
continue;
|
|
88
142
|
}
|
|
143
|
+
const fingerprint = read_.fingerprint;
|
|
89
144
|
if (!isShortfallParkReleased(park, { commitSet: null, rulingsFingerprint: fingerprint }) || rearmedOn.get(d.id) === fingerprint)
|
|
90
145
|
continue;
|
|
91
146
|
rearmedOn.set(d.id, fingerprint);
|
|
92
|
-
releaseDefaultOnMark
|
|
147
|
+
// Named path, so releaseDefaultOnMark stays silent and this richer line
|
|
148
|
+
// stands alone (verify/reselection-log.ts: one line per re-selection).
|
|
149
|
+
releaseDefaultOnMark(d.id, 'ruling-rearm');
|
|
93
150
|
rearmed.push(d.id);
|
|
94
|
-
|
|
95
|
-
+
|
|
151
|
+
logReselection('ruling-rearm', d.id, `parked delivery "${d.name}" re-armed at the unchanged focus HEAD -- `
|
|
152
|
+
+ `${describeRulingSources(read_.rulings)} since its park (nodes ${park.nodeIds.join(', ')}); verify re-judges it`);
|
|
96
153
|
}
|
|
97
154
|
return rearmed;
|
|
98
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortfall-rulings.js","sourceRoot":"","sources":["../../src/verify/shortfall-rulings.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAC/E,4FAA4F;AAC5F,sEAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"shortfall-rulings.js","sourceRoot":"","sources":["../../src/verify/shortfall-rulings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stall-detector-config.d.ts","sourceRoot":"","sources":["../../src/verify/stall-detector-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stall-detector-config.d.ts","sourceRoot":"","sources":["../../src/verify/stall-detector-config.ts"],"names":[],"mappings":"AAoCA,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wFAAwF;AACxF,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AASD,wEAAwE;AACxE,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,kFAAkF;AAClF,wBAAgB,kCAAkC,IAAI,MAAM,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,IAAI,MAAM,CAE9D;AAED,yFAAyF;AACzF,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,4FAA4F;AAC5F,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,IAAI,MAAM,CAE1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by: packages/daemon/src/
|
|
2
|
+
// Pinned by: packages/daemon/src/completion/stall-guard-time-floor.test.ts,
|
|
3
|
+
// packages/daemon/src/focus/listener-auto-advance-teamless-wedge.test.ts
|
|
3
4
|
// PINNED-BY-END
|
|
4
5
|
/**
|
|
5
6
|
* Single in-daemon source for the stall-detector thresholds.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stall-detector-config.js","sourceRoot":"","sources":["../../src/verify/stall-detector-config.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"stall-detector-config.js","sourceRoot":"","sources":["../../src/verify/stall-detector-config.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,4EAA4E;AAC5E,2EAA2E;AAC3E,gBAAgB;AAEhB;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,GAAuB,EAAE,QAAgB;IAC9D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,sBAAsB;IACpC,OAAO,aAAa,EAAE,CAAC,kCAAkC,CAAC;AAC5D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,6BAA6B;IAC3C,OAAO,aAAa,EAAE,CAAC,gCAAgC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAa,EAAE,CAAC,uBAAuB,CAAC;AACjD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB;IACvC,OAAO,aAAa,EAAE,CAAC,4BAA4B,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,2BAA2B;AAE3B,wEAAwE;AACxE,MAAM,UAAU,uBAAuB;IACrC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,kCAAkC;IAChD,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mCAAmC;IACjD,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qCAAqC;IACnD,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,2BAA2B;IACzC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,2BAA2B;IACzC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iCAAiC;IAC/C,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -199,10 +199,12 @@ export declare function decideReviewWindowClose(reviewRequestedAt: string | null
|
|
|
199
199
|
export declare function checkReviewWindowStaleForFocus(ctx: FocusStallContext, reviewRequestedAt: string | null, deps?: ReviewWindowDeps): Promise<void>;
|
|
200
200
|
export interface IdleTeamStallDeps {
|
|
201
201
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
202
|
+
* When the team last showed progress by the ONE progress measure -- its last
|
|
203
|
+
* agent event, or the last measured movement of its diff, HEAD, issues or
|
|
204
|
+
* delivery statuses (completion/team-stillness.ts) -- or null when nothing has
|
|
205
|
+
* been recorded yet (a team still initializing before its first agent event).
|
|
204
206
|
*/
|
|
205
|
-
|
|
207
|
+
getLastProgressAt: (focusId: string) => number | null;
|
|
206
208
|
/**
|
|
207
209
|
* True when the focus has a live team ELIGIBLE for idle recovery: it exists in
|
|
208
210
|
* activeTeams and is in the `executing` phase. A team already tearing down
|
|
@@ -251,7 +253,7 @@ export declare function isTeamIdleStalled(lastActivityMs: number | null, nowMs:
|
|
|
251
253
|
* team is never recovered: its clock keeps advancing, so its idle age stays
|
|
252
254
|
* under the threshold.
|
|
253
255
|
*/
|
|
254
|
-
export declare function checkIdleTeamStallForFocus(ctx: FocusStallContext,
|
|
256
|
+
export declare function checkIdleTeamStallForFocus(ctx: FocusStallContext, overrides?: Partial<IdleTeamStallDeps>): void;
|
|
255
257
|
/**
|
|
256
258
|
* Grace after a terminal-error outcome (or after a tracked team's PID vanishes)
|
|
257
259
|
* before the outcome backstop recovers it. Deliberately MINUTES, not the hours
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stall-detectors.d.ts","sourceRoot":"","sources":["../../src/verify/stall-detectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stall-detectors.d.ts","sourceRoot":"","sources":["../../src/verify/stall-detectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// packages/daemon/src/verify/stall-detectors-clock-wiring.test.ts,
|
|
8
8
|
// packages/daemon/src/verify/stall-detectors.test.ts,
|
|
9
9
|
// packages/daemon/src/verify/team-outcome-stall-detector.test.ts,
|
|
10
|
+
// packages/daemon/src/verify/team-stall-reapers.test.ts,
|
|
10
11
|
// packages/daemon/src/verify/unreviewed-settle-detector.test.ts
|
|
11
12
|
// PINNED-BY-END
|
|
12
13
|
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, withRetry, } from '@telora/daemon-core';
|
|
@@ -15,6 +16,7 @@ import { deliveryGuardCauseKey } from '../queries/cause-key.js';
|
|
|
15
16
|
import { NO_HUMAN_ACT } from '../queries/filing-observation.js';
|
|
16
17
|
import { getActiveTeams, terminateTeam } from '../focus/focus-executor.js';
|
|
17
18
|
import { getTeamLastActivityAt, getTeamErrorResultAt, getTeamLeadPid } from '../focus/focus-team-state.js';
|
|
19
|
+
import { readTeamLastProgressAt } from '../completion/team-stillness.js';
|
|
18
20
|
import { isProcessAlive } from '../spawn/liveness.js';
|
|
19
21
|
import { clearReviewRequestedAt } from '../queries/focuses.js';
|
|
20
22
|
import { buildVerifyGateStallEscalation, decideVerifyGateStall, VERIFY_GATE_STALL_REPEAT_THRESHOLD, } from './verify-gate-stall.js';
|
|
@@ -268,7 +270,7 @@ export function isTeamRecoverable(focusId) {
|
|
|
268
270
|
return team !== undefined && team.phase === 'executing';
|
|
269
271
|
}
|
|
270
272
|
const defaultIdleTeamStallDeps = {
|
|
271
|
-
|
|
273
|
+
getLastProgressAt: readTeamLastProgressAt,
|
|
272
274
|
isTeamRecoverable,
|
|
273
275
|
recoverTeam: (focusId) => terminateTeam(focusId, 'teardown'),
|
|
274
276
|
now: () => Date.now(),
|
|
@@ -301,20 +303,21 @@ export function isTeamIdleStalled(lastActivityMs, nowMs, thresholdMs) {
|
|
|
301
303
|
* team is never recovered: its clock keeps advancing, so its idle age stays
|
|
302
304
|
* under the threshold.
|
|
303
305
|
*/
|
|
304
|
-
export function checkIdleTeamStallForFocus(ctx,
|
|
306
|
+
export function checkIdleTeamStallForFocus(ctx, overrides = {}) {
|
|
307
|
+
const deps = { ...defaultIdleTeamStallDeps, ...overrides };
|
|
305
308
|
if (!deps.isTeamRecoverable(ctx.focusId))
|
|
306
309
|
return;
|
|
307
310
|
const thresholdHours = deps.thresholdHours ?? resolveIdleTeamStallHours();
|
|
308
311
|
const thresholdMs = thresholdHours * 3_600_000;
|
|
309
312
|
const nowMs = (deps.now ?? Date.now)();
|
|
310
|
-
const
|
|
311
|
-
if (!isTeamIdleStalled(
|
|
313
|
+
const lastProgressMs = deps.getLastProgressAt(ctx.focusId);
|
|
314
|
+
if (!isTeamIdleStalled(lastProgressMs, nowMs, thresholdMs))
|
|
312
315
|
return;
|
|
313
|
-
const idleHours = Math.floor((nowMs -
|
|
316
|
+
const idleHours = Math.floor((nowMs - lastProgressMs) / 3_600_000);
|
|
314
317
|
const recovered = deps.recoverTeam(ctx.focusId);
|
|
315
318
|
if (recovered) {
|
|
316
319
|
log.info(`[stall-detectors] Recovered idle-stalled team for focus "${ctx.focusName}" ` +
|
|
317
|
-
`(no agent event for ~${idleHours}h > ${thresholdHours}h): terminated so merge-back, ` +
|
|
320
|
+
`(no agent event and no diff/HEAD/issue/status movement for ~${idleHours}h > ${thresholdHours}h): terminated so merge-back, ` +
|
|
318
321
|
`slot release, and delivery re-gating resume with no human action.`);
|
|
319
322
|
}
|
|
320
323
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stall-detectors.js","sourceRoot":"","sources":["../../src/verify/stall-detectors.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"stall-detectors.js","sourceRoot":"","sources":["../../src/verify/stall-detectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,13 @@ import { type FocusStallContext } from './stall-detectors.js';
|
|
|
9
9
|
* team_failure escalation through the same cause-keyed idempotent gate.
|
|
10
10
|
*/
|
|
11
11
|
export interface StalledTeamBackstopDeps {
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* When the team last showed progress by the ONE progress measure: its last
|
|
14
|
+
* agent event, or the last time the cascade pass saw its diff, HEAD, issues
|
|
15
|
+
* or delivery statuses move (completion/team-stillness.ts). Null while the
|
|
16
|
+
* team has produced no event yet.
|
|
17
|
+
*/
|
|
18
|
+
getLastProgressAt: (focusId: string) => number | null;
|
|
13
19
|
isTeamRecoverable: (focusId: string) => boolean;
|
|
14
20
|
getLeadSessionId: (focusId: string) => string | null;
|
|
15
21
|
recoverTeam: (focusId: string) => boolean;
|
|
@@ -39,5 +45,5 @@ export declare function isStalledTeamBackstopEligible(lastActivityMs: number | n
|
|
|
39
45
|
* completion event. A genuinely working team is never reaped: its clock keeps
|
|
40
46
|
* advancing, so its idle age stays under the window.
|
|
41
47
|
*/
|
|
42
|
-
export declare function checkStalledTeamBackstopForFocus(ctx: FocusStallContext,
|
|
48
|
+
export declare function checkStalledTeamBackstopForFocus(ctx: FocusStallContext, overrides?: Partial<StalledTeamBackstopDeps>): Promise<void>;
|
|
43
49
|
//# sourceMappingURL=stalled-team-backstop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stalled-team-backstop.d.ts","sourceRoot":"","sources":["../../src/verify/stalled-team-backstop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stalled-team-backstop.d.ts","sourceRoot":"","sources":["../../src/verify/stalled-team-backstop.ts"],"names":[],"mappings":"AAoCA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACpC,MAAM,sCAAsC,CAAC;AAW9C,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKjF;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,cAAc,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACpG,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAYD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAGT;AAED;;;;GAIG;AACH,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,iBAAiB,EACtB,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAAC,IAAI,CAAC,CAsFf"}
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
* readable, like the mechanisms it backstops), reaps via terminateTeam (whose
|
|
21
21
|
* normal close path gives the same uncommitted-work preservation a
|
|
22
22
|
* completion-handler teardown does), and files ONE idempotent team_failure so the
|
|
23
|
-
* wedge is visible.
|
|
23
|
+
* wedge is visible. "Stalled" is judged by the ONE progress measure
|
|
24
|
+
* (completion/team-stillness.ts): no agent event AND no movement of the diff,
|
|
25
|
+
* HEAD, issues or delivery statuses for the whole window. Extracted from stall-detectors.ts to keep that file under the
|
|
24
26
|
* file-size floor.
|
|
25
27
|
*
|
|
26
28
|
* @module verify/stalled-team-backstop
|
|
@@ -30,13 +32,13 @@ import { fileEscalationIdempotent as defaultFileEscalationIdempotent, } from '..
|
|
|
30
32
|
import { focusBlockageCauseKey } from '../queries/cause-key.js';
|
|
31
33
|
import { recordFiring, isMechanismDemoted, markLatestFiringUnacted, SUPERVISION_MECHANISM, } from '../completion/supervision-firing-record.js';
|
|
32
34
|
import { getActiveTeams, terminateTeam } from '../focus/focus-executor.js';
|
|
33
|
-
import {
|
|
35
|
+
import { readTeamLastProgressAt } from '../completion/team-stillness.js';
|
|
34
36
|
import { resolveStalledTeamBackstopMinutes } from './stall-detector-config.js';
|
|
35
37
|
import { isTeamRecoverable } from './stall-detectors.js';
|
|
36
38
|
import { createLogger } from '../shell/log.js';
|
|
37
39
|
const log = createLogger({ module: 'stall-detectors' });
|
|
38
40
|
const defaultStalledTeamBackstopDeps = {
|
|
39
|
-
|
|
41
|
+
getLastProgressAt: readTeamLastProgressAt,
|
|
40
42
|
isTeamRecoverable,
|
|
41
43
|
getLeadSessionId: (focusId) => getActiveTeams().get(focusId)?.leadSessionId ?? null,
|
|
42
44
|
recoverTeam: (focusId) => terminateTeam(focusId, 'teardown'),
|
|
@@ -60,22 +62,23 @@ export function isStalledTeamBackstopEligible(lastActivityMs, nowMs, windowMs) {
|
|
|
60
62
|
* completion event. A genuinely working team is never reaped: its clock keeps
|
|
61
63
|
* advancing, so its idle age stays under the window.
|
|
62
64
|
*/
|
|
63
|
-
export async function checkStalledTeamBackstopForFocus(ctx,
|
|
65
|
+
export async function checkStalledTeamBackstopForFocus(ctx, overrides = {}) {
|
|
66
|
+
const deps = { ...defaultStalledTeamBackstopDeps, ...overrides };
|
|
64
67
|
if (!deps.isTeamRecoverable(ctx.focusId))
|
|
65
68
|
return;
|
|
66
69
|
const windowMinutes = deps.windowMinutes ?? resolveStalledTeamBackstopMinutes();
|
|
67
70
|
const windowMs = windowMinutes * 60_000;
|
|
68
71
|
const nowMs = (deps.now ?? Date.now)();
|
|
69
|
-
const
|
|
70
|
-
if (!isStalledTeamBackstopEligible(
|
|
72
|
+
const lastProgressMs = deps.getLastProgressAt(ctx.focusId);
|
|
73
|
+
if (!isStalledTeamBackstopEligible(lastProgressMs, nowMs, windowMs))
|
|
71
74
|
return;
|
|
72
|
-
const idleMinutes = Math.floor((nowMs -
|
|
75
|
+
const idleMinutes = Math.floor((nowMs - lastProgressMs) / 60_000);
|
|
73
76
|
// Record the firing whether or not we act -- the rate must be readable even
|
|
74
77
|
// when the mechanism is demoted to observe-only.
|
|
75
78
|
recordFiring({
|
|
76
79
|
mechanism: SUPERVISION_MECHANISM.STALLED_TEAM_REAP,
|
|
77
80
|
focusId: ctx.focusId,
|
|
78
|
-
predicted: `team wedged: executing but no agent event for ~${idleMinutes}m ` +
|
|
81
|
+
predicted: `team wedged: executing but no progress (no agent event, no diff/HEAD/issue/status movement) for ~${idleMinutes}m ` +
|
|
79
82
|
`(> ${windowMinutes}m backstop), completion event not fired`,
|
|
80
83
|
now: nowMs,
|
|
81
84
|
});
|
|
@@ -96,8 +99,8 @@ export async function checkStalledTeamBackstopForFocus(ctx, deps = defaultStalle
|
|
|
96
99
|
`the backstop window but terminateTeam found no live team to recover (already torn down?).`);
|
|
97
100
|
return;
|
|
98
101
|
}
|
|
99
|
-
log.warn(`[stall-detectors] Reaped stalled team for focus "${ctx.focusName}" (no agent event ` +
|
|
100
|
-
`for ~${idleMinutes}m > ${windowMinutes}m backstop) WITHOUT a completion event: ` +
|
|
102
|
+
log.warn(`[stall-detectors] Reaped stalled team for focus "${ctx.focusName}" (no agent event and no ` +
|
|
103
|
+
`diff/HEAD/issue/status movement for ~${idleMinutes}m > ${windowMinutes}m backstop) WITHOUT a completion event: ` +
|
|
101
104
|
`terminated so wip-preserve, slot release, and delivery re-gating resume; filing a ` +
|
|
102
105
|
`team_failure so the wedge is visible.`);
|
|
103
106
|
// File ONE team_failure escalation (idempotent by cause key -- at most one open
|
|
@@ -115,7 +118,8 @@ export async function checkStalledTeamBackstopForFocus(ctx, deps = defaultStalle
|
|
|
115
118
|
disposition: ESCALATION_DISPOSITIONS.AGENT_RESOLVABLE,
|
|
116
119
|
anchor: { focusId: ctx.focusId },
|
|
117
120
|
escalationKind: 'team_failure',
|
|
118
|
-
description: `Team for focus "${ctx.focusName}"
|
|
121
|
+
description: `Team for focus "${ctx.focusName}" showed no progress -- no agent event and no ` +
|
|
122
|
+
`worktree, HEAD, issue or delivery-status movement -- for ~${idleMinutes} ` +
|
|
119
123
|
`minutes (> ${windowMinutes}m backstop) while still holding the focus and a ` +
|
|
120
124
|
`governor slot, with no completion event. The daemon reaped it directly from the ` +
|
|
121
125
|
`poll loop (reading liveness, not the completion event), preserving its ` +
|