@telora/daemon 0.22.144 → 0.22.160
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 +8 -3
- package/dist/audit/audit-phase.d.ts +34 -1
- package/dist/audit/audit-phase.d.ts.map +1 -1
- package/dist/audit/audit-phase.js +77 -9
- package/dist/audit/audit-phase.js.map +1 -1
- package/dist/backends/codex/codex-mcp-proxy.d.ts +4 -6
- package/dist/backends/codex/codex-mcp-proxy.d.ts.map +1 -1
- package/dist/backends/codex/codex-mcp-proxy.js.map +1 -1
- package/dist/backends/codex/mcp-preflight.d.ts +2 -2
- package/dist/backends/codex/mcp-preflight.d.ts.map +1 -1
- package/dist/backends/codex/mcp-preflight.js.map +1 -1
- package/dist/completion/completion-phase-registry.d.ts +1 -0
- package/dist/completion/completion-phase-registry.d.ts.map +1 -1
- package/dist/completion/completion-phase-registry.js +7 -5
- package/dist/completion/completion-phase-registry.js.map +1 -1
- package/dist/completion/escalation-provenance.d.ts.map +1 -1
- package/dist/completion/escalation-provenance.js +5 -2
- package/dist/completion/escalation-provenance.js.map +1 -1
- package/dist/completion/exit-classification.d.ts +1 -1
- package/dist/completion/exit-classification.d.ts.map +1 -1
- package/dist/completion/exit-classification.js +7 -1
- package/dist/completion/exit-classification.js.map +1 -1
- package/dist/completion/review-cycle-cap.d.ts +81 -35
- package/dist/completion/review-cycle-cap.d.ts.map +1 -1
- package/dist/completion/review-cycle-cap.js +60 -132
- package/dist/completion/review-cycle-cap.js.map +1 -1
- package/dist/completion/review-exit-deps.d.ts +3 -1
- package/dist/completion/review-exit-deps.d.ts.map +1 -1
- package/dist/completion/review-exit-deps.js +3 -1
- package/dist/completion/review-exit-deps.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +5 -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 +3 -7
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/delivery/delivery-review-coverage.d.ts +16 -0
- package/dist/delivery/delivery-review-coverage.d.ts.map +1 -1
- package/dist/delivery/delivery-review-coverage.js +16 -0
- package/dist/delivery/delivery-review-coverage.js.map +1 -1
- package/dist/focus/focus-engine.d.ts +16 -0
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +37 -17
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +7 -0
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-spawn-decision.d.ts +5 -3
- package/dist/focus/focus-spawn-decision.d.ts.map +1 -1
- package/dist/focus/focus-spawn-decision.js.map +1 -1
- package/dist/focus/listener-spawn.d.ts.map +1 -1
- package/dist/focus/listener-spawn.js +4 -3
- package/dist/focus/listener-spawn.js.map +1 -1
- package/dist/focus/listener.d.ts +15 -0
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +58 -9
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/review-cycle-cap-hold.d.ts +15 -94
- package/dist/focus/review-cycle-cap-hold.d.ts.map +1 -1
- package/dist/focus/review-cycle-cap-hold.js +54 -112
- package/dist/focus/review-cycle-cap-hold.js.map +1 -1
- package/dist/focus/session-health.d.ts +22 -1
- package/dist/focus/session-health.d.ts.map +1 -1
- package/dist/focus/session-health.js +28 -3
- package/dist/focus/session-health.js.map +1 -1
- package/dist/focus/session-process-reap.d.ts +3 -1
- package/dist/focus/session-process-reap.d.ts.map +1 -1
- package/dist/focus/session-process-reap.js +20 -0
- package/dist/focus/session-process-reap.js.map +1 -1
- package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/index.js +1 -0
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +10 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +27 -3
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/focus-integration-sync.d.ts +42 -3
- package/dist/git/focus-integration-sync.d.ts.map +1 -1
- package/dist/git/focus-integration-sync.js +38 -2
- package/dist/git/focus-integration-sync.js.map +1 -1
- package/dist/merge/abandoned-merge-recovery.d.ts.map +1 -1
- package/dist/merge/abandoned-merge-recovery.js +10 -0
- package/dist/merge/abandoned-merge-recovery.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts +1 -0
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +3 -3
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/prompt/team-prompt-base.d.ts +2 -1
- package/dist/prompt/team-prompt-base.d.ts.map +1 -1
- package/dist/prompt/team-prompt-base.js +5 -19
- package/dist/prompt/team-prompt-base.js.map +1 -1
- package/dist/prompt-sections/integration-reconcile-section.d.ts +45 -0
- package/dist/prompt-sections/integration-reconcile-section.d.ts.map +1 -0
- package/dist/prompt-sections/integration-reconcile-section.js +69 -0
- package/dist/prompt-sections/integration-reconcile-section.js.map +1 -0
- package/dist/prompt-sections/persona-sections.d.ts +0 -20
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +4 -49
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/prompt-sections/testing-standard.d.ts +51 -0
- package/dist/prompt-sections/testing-standard.d.ts.map +1 -0
- package/dist/prompt-sections/testing-standard.js +132 -0
- package/dist/prompt-sections/testing-standard.js.map +1 -0
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +7 -5
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/ended-arm.d.ts +47 -0
- package/dist/queries/ended-arm.d.ts.map +1 -0
- package/dist/queries/ended-arm.js +35 -0
- package/dist/queries/ended-arm.js.map +1 -0
- package/dist/queries/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalation-consumption.js +0 -1
- package/dist/queries/escalation-consumption.js.map +1 -1
- package/dist/queries/focus-discovery.d.ts +14 -0
- package/dist/queries/focus-discovery.d.ts.map +1 -1
- package/dist/queries/focus-discovery.js +1 -0
- package/dist/queries/focus-discovery.js.map +1 -1
- package/dist/queries/focus-integration-conflict.d.ts +78 -0
- package/dist/queries/focus-integration-conflict.d.ts.map +1 -0
- package/dist/queries/focus-integration-conflict.js +136 -0
- package/dist/queries/focus-integration-conflict.js.map +1 -0
- package/dist/queries/focuses.d.ts +6 -3
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +13 -5
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/incident-correlation.d.ts +1 -2
- package/dist/queries/incident-correlation.d.ts.map +1 -1
- package/dist/queries/incident-correlation.js +1 -3
- package/dist/queries/incident-correlation.js.map +1 -1
- package/dist/queries/local-models.js +1 -1
- package/dist/queries/local-models.js.map +1 -1
- package/dist/queries/schemas-local-model.d.ts +47 -0
- package/dist/queries/schemas-local-model.d.ts.map +1 -0
- package/dist/queries/schemas-local-model.js +57 -0
- package/dist/queries/schemas-local-model.js.map +1 -0
- package/dist/queries/schemas.d.ts +10 -32
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +10 -41
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/sessions.d.ts +120 -12
- package/dist/queries/sessions.d.ts.map +1 -1
- package/dist/queries/sessions.js +104 -11
- package/dist/queries/sessions.js.map +1 -1
- package/dist/queries/shared.d.ts +1 -0
- package/dist/queries/shared.d.ts.map +1 -1
- package/dist/queries/shared.js +1 -1
- package/dist/queries/shared.js.map +1 -1
- package/dist/queries/system-session.d.ts.map +1 -1
- package/dist/queries/system-session.js +3 -1
- package/dist/queries/system-session.js.map +1 -1
- package/dist/resolvers/assembly-engine.d.ts +71 -1
- package/dist/resolvers/assembly-engine.d.ts.map +1 -1
- package/dist/resolvers/assembly-engine.js +82 -43
- package/dist/resolvers/assembly-engine.js.map +1 -1
- package/dist/resolvers/branch-work-arming.d.ts +133 -0
- package/dist/resolvers/branch-work-arming.d.ts.map +1 -0
- package/dist/resolvers/branch-work-arming.js +67 -0
- package/dist/resolvers/branch-work-arming.js.map +1 -0
- package/dist/resolvers/focus-review-coverage.d.ts.map +1 -1
- package/dist/resolvers/focus-review-coverage.js +31 -2
- package/dist/resolvers/focus-review-coverage.js.map +1 -1
- package/dist/resolvers/wiki-topic.d.ts +6 -5
- package/dist/resolvers/wiki-topic.d.ts.map +1 -1
- package/dist/resolvers/wiki-topic.js +43 -27
- package/dist/resolvers/wiki-topic.js.map +1 -1
- package/dist/session/session-lineage.d.ts.map +1 -1
- package/dist/session/session-lineage.js +1 -0
- package/dist/session/session-lineage.js.map +1 -1
- package/dist/shell/crash-recovery.d.ts +4 -2
- package/dist/shell/crash-recovery.d.ts.map +1 -1
- package/dist/shell/crash-recovery.js +15 -14
- package/dist/shell/crash-recovery.js.map +1 -1
- package/dist/shell/daemon-instance.d.ts +176 -0
- package/dist/shell/daemon-instance.d.ts.map +1 -0
- package/dist/shell/daemon-instance.js +281 -0
- package/dist/shell/daemon-instance.js.map +1 -0
- package/dist/shell/graceful-shutdown.d.ts +12 -1
- package/dist/shell/graceful-shutdown.d.ts.map +1 -1
- package/dist/shell/graceful-shutdown.js +7 -4
- package/dist/shell/graceful-shutdown.js.map +1 -1
- package/dist/shell/shutdown-ownership.d.ts +34 -0
- package/dist/shell/shutdown-ownership.d.ts.map +1 -0
- package/dist/shell/shutdown-ownership.js +51 -0
- package/dist/shell/shutdown-ownership.js.map +1 -0
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +12 -5
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/shell/worker-pidfile.d.ts +127 -11
- package/dist/shell/worker-pidfile.d.ts.map +1 -1
- package/dist/shell/worker-pidfile.js +349 -58
- package/dist/shell/worker-pidfile.js.map +1 -1
- package/dist/spawn/lead-launch.d.ts +17 -1
- package/dist/spawn/lead-launch.d.ts.map +1 -1
- package/dist/spawn/lead-launch.js +56 -7
- package/dist/spawn/lead-launch.js.map +1 -1
- package/dist/spawn/lead-process-ownership.d.ts +5 -4
- package/dist/spawn/lead-process-ownership.d.ts.map +1 -1
- package/dist/spawn/lead-process-ownership.js +7 -4
- package/dist/spawn/lead-process-ownership.js.map +1 -1
- package/dist/spawn/lifecycle.d.ts +0 -12
- package/dist/spawn/lifecycle.d.ts.map +1 -1
- package/dist/spawn/lifecycle.js +76 -19
- package/dist/spawn/lifecycle.js.map +1 -1
- package/dist/spawn/liveness.d.ts.map +1 -1
- package/dist/spawn/liveness.js +3 -1
- package/dist/spawn/liveness.js.map +1 -1
- package/dist/spawn/one-shot-process-ownership.d.ts +46 -2
- package/dist/spawn/one-shot-process-ownership.d.ts.map +1 -1
- package/dist/spawn/one-shot-process-ownership.js +78 -3
- package/dist/spawn/one-shot-process-ownership.js.map +1 -1
- package/dist/spawn/process-group-kill.d.ts.map +1 -1
- package/dist/spawn/process-group-kill.js +3 -1
- package/dist/spawn/process-group-kill.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts +5 -15
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +2 -1
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/prompt-assembly.d.ts +27 -2
- package/dist/spawn/prompt-assembly.d.ts.map +1 -1
- package/dist/spawn/prompt-assembly.js +65 -43
- package/dist/spawn/prompt-assembly.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +46 -2
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +57 -4
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/testing/fixtures/conflicting-repo.d.ts +30 -0
- package/dist/testing/fixtures/conflicting-repo.d.ts.map +1 -0
- package/dist/testing/fixtures/conflicting-repo.js +89 -0
- package/dist/testing/fixtures/conflicting-repo.js.map +1 -0
- package/dist/testing/fixtures/index.d.ts.map +1 -1
- package/dist/testing/fixtures/index.js +2 -1
- package/dist/testing/fixtures/index.js.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.js +2 -2
- package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
- package/dist/types/exit-category.d.ts +59 -0
- package/dist/types/exit-category.d.ts.map +1 -0
- package/dist/types/exit-category.js +133 -0
- package/dist/types/exit-category.js.map +1 -0
- package/dist/types/index.js +1 -1
- package/dist/types/session.d.ts +5 -1
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/verify/stall-detector-config.d.ts +5 -1
- package/dist/verify/stall-detector-config.d.ts.map +1 -1
- package/dist/verify/stall-detector-config.js +5 -1
- package/dist/verify/stall-detector-config.js.map +1 -1
- package/dist/worktree/state.d.ts +75 -1
- package/dist/worktree/state.d.ts.map +1 -1
- package/dist/worktree/state.js +89 -17
- package/dist/worktree/state.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-classification.d.ts","sourceRoot":"","sources":["../../src/completion/exit-classification.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEjF;AAID,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;;OAYG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;CACjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;CAClD,GAAG,sBAAsB,CAezB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,CAAC,aAAa,CAAC,EAClD,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAC/C,YAAY,
|
|
1
|
+
{"version":3,"file":"exit-classification.d.ts","sourceRoot":"","sources":["../../src/completion/exit-classification.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEjF;AAID,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;;OAYG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;CACjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;CAClD,GAAG,sBAAsB,CAezB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,CAAC,aAAa,CAAC,EAClD,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAC/C,YAAY,CAsBd"}
|
|
@@ -56,7 +56,13 @@ export function classifyTeamExit(params) {
|
|
|
56
56
|
export function deriveExitCategory(disposition, shutdownReason) {
|
|
57
57
|
switch (disposition) {
|
|
58
58
|
case 'completed':
|
|
59
|
-
|
|
59
|
+
// A clean exit whose PASS continues is 'segment_complete', not null. It
|
|
60
|
+
// used to be null, which is how a close with no category stayed
|
|
61
|
+
// expressible at all -- and a categoryless row is decided on the
|
|
62
|
+
// dashboard by matching prose in exit_reason. It is deliberately NOT a
|
|
63
|
+
// member of PASS_ENDING_EXIT_CATEGORIES, so it still makes no readiness
|
|
64
|
+
// claim: the behaviour is unchanged, the reason for it is now declared.
|
|
65
|
+
return shutdownReason === 'work_complete' ? 'work_complete' : 'segment_complete';
|
|
60
66
|
case 'stopped':
|
|
61
67
|
switch (shutdownReason) {
|
|
62
68
|
case 'no_actionable_work': return 'no_actionable_work';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-classification.js","sourceRoot":"","sources":["../../src/completion/exit-classification.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAC/E,oEAAoE;AACpE,sFAAsF;AACtF,8EAA8E;AAC9E,uEAAuE;AACvE,gBAAgB;AAahB;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,IAAmB,EAAE,MAAqB;IACtE,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;AACrD,CAAC;AAgDD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAKhC;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,qBAAqB,GACzB,MAAM,CAAC,SAAS,KAAK,eAAe;QACpC,UAAU;QACV,MAAM,CAAC,cAAc,KAAK,eAAe,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,IAAI,qBAAqB,CAAC;IAC1D,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,KAAK,eAAe,IAAI,UAAU,CAAC;IAC1E,MAAM,WAAW,GACf,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACjG,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAkD,EAClD,cAAgD;IAEhD,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,cAAc,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"exit-classification.js","sourceRoot":"","sources":["../../src/completion/exit-classification.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAC/E,oEAAoE;AACpE,sFAAsF;AACtF,8EAA8E;AAC9E,uEAAuE;AACvE,gBAAgB;AAahB;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,IAAmB,EAAE,MAAqB;IACtE,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;AACrD,CAAC;AAgDD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAKhC;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,qBAAqB,GACzB,MAAM,CAAC,SAAS,KAAK,eAAe;QACpC,UAAU;QACV,MAAM,CAAC,cAAc,KAAK,eAAe,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,IAAI,qBAAqB,CAAC;IAC1D,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,KAAK,eAAe,IAAI,UAAU,CAAC;IAC1E,MAAM,WAAW,GACf,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACjG,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAkD,EAClD,cAAgD;IAEhD,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,WAAW;YACd,wEAAwE;YACxE,gEAAgE;YAChE,iEAAiE;YACjE,uEAAuE;YACvE,wEAAwE;YACxE,wEAAwE;YACxE,OAAO,cAAc,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACnF,KAAK,SAAS;YACZ,QAAQ,cAAc,EAAE,CAAC;gBACvB,KAAK,oBAAoB,CAAC,CAAC,OAAO,oBAAoB,CAAC;gBACvD,KAAK,aAAa,CAAC,CAAC,OAAO,aAAa,CAAC;gBACzC,KAAK,cAAc,CAAC,CAAC,OAAO,cAAc,CAAC;gBAC3C,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;gBACjC,KAAK,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC;gBACnC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;YAC5B,CAAC;QACH,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1,12 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The review-cycle BUDGET: count the review cycles a focus spends without
|
|
3
|
+
* converging, and at TELORA_REVIEW_CYCLE_CAP END THE ARMED RUN.
|
|
4
|
+
*
|
|
5
|
+
* WHAT ENDING THE RUN MEANS. The daemon releases the focus's assigned agent
|
|
6
|
+
* role -- the ONE state in which no team may run (spawn/null-role-spawn.ts
|
|
7
|
+
* focusMayRunTeam) -- and records WHY, durably, on the focus:
|
|
8
|
+
* arm_ended_reason = 'review_budget_spent', with the cycle count, the cap, the
|
|
9
|
+
* open blocking review-filed findings, and (added at the edge, which owns the
|
|
10
|
+
* shape they live in) the acceptance criteria the last verdict-bearing review
|
|
11
|
+
* called not_met. Nothing closes those issues: they stay open work. Only a NEW
|
|
12
|
+
* ARM grants further cycles, and the arm edge resets the count to 0 in the
|
|
13
|
+
* database (migration 20260920140801), so every arm writer grants a fresh
|
|
14
|
+
* budget without any of them knowing about this module.
|
|
15
|
+
*
|
|
16
|
+
* WHY NOT AN OBSERVATION. The previous crossing filed ONE
|
|
17
|
+
* review_cycle_cap_exceeded observation and HELD the spawn gates on it. The
|
|
18
|
+
* promotion sweep handed that observation to a routing decider, and on
|
|
19
|
+
* 2026-09-19/20 the decider granted three foci eight more cycles each within
|
|
20
|
+
* minutes of crossing; one ran 25 team spawns and ~$242 of coding spend with
|
|
21
|
+
* nothing merged, stopping only when the operator killed the daemon. A stop
|
|
22
|
+
* answered from inside the loop it is meant to stop is not a stop. The budget
|
|
23
|
+
* is a BACKSTOP, not the convergence mechanism, so it now ends the run and
|
|
24
|
+
* hands the decision back to a human at the only lever that grants cycles: the
|
|
25
|
+
* arm.
|
|
26
|
+
*
|
|
27
|
+
* What the count measures (recordReviewCycleAndMaybeEndArm, on every routed exit
|
|
28
|
+
* of a REVIEW session -- a routed coding exit, e.g. the open-work self-heal, is
|
|
29
|
+
* not a review cycle and leaves the count, the window and the arm alone):
|
|
30
|
+
* - a CONVERGED cycle -- a delivery reached done, nothing re-opened to
|
|
31
|
+
* verify_failed, and no open blocking review-filed finding is left on the
|
|
32
|
+
* focus -- resets it to 0. The budget measures consecutive unconverged
|
|
33
|
+
* cycles, not lifetime cycles, so a focus shipping many deliveries one clean
|
|
34
|
+
* review at a time never nears it.
|
|
35
|
+
* - any other routed cycle increments it. Below the budget nothing else
|
|
36
|
+
* happens, so cycling below it is unchanged.
|
|
37
|
+
* - at the budget: the count is written FIRST (so a failed un-arm still stops
|
|
38
|
+
* by count -- focus/review-cycle-cap-hold.ts), then the arm is released with
|
|
39
|
+
* its reason, then the review window is closed. The count is NOT reset: it
|
|
40
|
+
* is the fail-closed backstop for an un-arm write that did not land, and the
|
|
41
|
+
* arm edge is what clears it.
|
|
42
|
+
*
|
|
43
|
+
* A DAEMON SHUTDOWN SPENDS NOTHING. A review team killed by a shutdown exits
|
|
44
|
+
* with no inspection evidence, which routes exactly like a bounce -- so without
|
|
45
|
+
* this guard a restart cycle would burn budget a review never spent. The whole
|
|
46
|
+
* record is skipped while the daemon is shutting down: no climb, no reset, no
|
|
47
|
+
* un-arm.
|
|
48
|
+
*
|
|
49
|
+
* @module completion/review-cycle-cap
|
|
50
|
+
*/
|
|
51
|
+
import { setReviewCycleCount, releaseFocusArm, type clearReviewRequestedAt } from '../queries/focuses.js';
|
|
52
|
+
import type { ReviewFiledFindingSummary } from './review-exit-escalations.js';
|
|
3
53
|
/** The routed review exit's facts the cycle count is decided from. */
|
|
4
54
|
export interface ReviewCycleOutcome {
|
|
5
55
|
/**
|
|
6
56
|
* The EXITING session's type. Only a review-session exit is a review cycle: a
|
|
7
57
|
* coding exit that routes verify work (the open-work self-heal) can neither fail
|
|
8
58
|
* nor converge a review's verdict, so it leaves the count untouched (no climb, no
|
|
9
|
-
* reset),
|
|
59
|
+
* reset), closes no window and ends no arm. Absent counts, as the hand-off
|
|
10
60
|
* breaker's absent sessionType does (recordHandoffAndMaybeTerminate): a caller
|
|
11
61
|
* that cannot name its lineage must not be able to switch off the billing stop.
|
|
12
62
|
*/
|
|
@@ -22,41 +72,37 @@ export interface ReviewCycleOutcome {
|
|
|
22
72
|
}
|
|
23
73
|
/** Pure: whether a routed review exit converged -- it resets the count instead of climbing it. */
|
|
24
74
|
export declare function reviewCycleConverged(outcome: Pick<ReviewCycleOutcome, 'convergedAny' | 'anyReopenedToVerifyFailed' | 'openBlockingFindings'>): boolean;
|
|
25
|
-
/** Deps of the crossing: the escalation deps plus the window writer it closes. */
|
|
26
|
-
export interface ReviewCycleCapDeps extends ReviewExitEscalationDeps {
|
|
27
|
-
clearReviewRequestedAt: typeof clearReviewRequestedAt;
|
|
28
|
-
}
|
|
29
75
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
76
|
+
* Deps of the budget. Every writer is injectable so the crossing can be driven
|
|
77
|
+
* in a test without a network; `isShuttingDown` too, because a shutdown must be
|
|
78
|
+
* assertable rather than reproducible.
|
|
33
79
|
*/
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
getFocusReviewFiledIssueIds: typeof getFocusReviewFiledIssueIds;
|
|
80
|
+
export interface ReviewCycleCapDeps {
|
|
81
|
+
setReviewCycleCount?: typeof setReviewCycleCount;
|
|
82
|
+
resolveReviewCycleCap?: () => number;
|
|
83
|
+
clearReviewRequestedAt: typeof clearReviewRequestedAt;
|
|
84
|
+
/**
|
|
85
|
+
* The un-arm writer (queries/focuses.ts releaseFocusArm), which carries the
|
|
86
|
+
* ended-arm record in the SAME edge call as the release. OPTIONAL in the type
|
|
87
|
+
* so a partial test deps object type-checks, but a deps object that omits it
|
|
88
|
+
* cannot stop the run -- so the crossing REFUSES to pretend: it logs that the
|
|
89
|
+
* arm was not ended and leaves the count at the budget, which holds every
|
|
90
|
+
* spawn gate by itself. defaultReviewExitDeps always supplies it (pinned by
|
|
91
|
+
* review-cycle-churn-meter.test.ts).
|
|
92
|
+
*/
|
|
93
|
+
releaseFocusArm?: typeof releaseFocusArm;
|
|
94
|
+
isShuttingDown?: () => boolean;
|
|
50
95
|
}
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
* stands at or past the cap is held by count; file (or find) its observation and
|
|
54
|
-
* reset the count, so the routing decider has the observation to take and its
|
|
55
|
-
* resolution lifts the hold. A no-op below the cap (no read). Best-effort.
|
|
56
|
-
*/
|
|
57
|
-
export declare function reconcileReviewCycleCapFiling(ctx: {
|
|
58
|
-
organizationId: string;
|
|
96
|
+
/** The focus this exit belongs to. */
|
|
97
|
+
export interface ReviewCycleCapContext {
|
|
59
98
|
focusId: string;
|
|
60
99
|
focusName: string;
|
|
61
|
-
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Record one routed review cycle: reset on convergence, climb otherwise, and at
|
|
103
|
+
* the budget end the armed run. Best-effort -- never aborts the routing that
|
|
104
|
+
* already ran. A deps object without the count writer or the budget value skips
|
|
105
|
+
* the whole budget.
|
|
106
|
+
*/
|
|
107
|
+
export declare function recordReviewCycleAndMaybeEndArm(deps: ReviewCycleCapDeps, ctx: ReviewCycleCapContext, priorCycleCount: number, outcome: ReviewCycleOutcome): Promise<void>;
|
|
62
108
|
//# sourceMappingURL=review-cycle-cap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-cycle-cap.d.ts","sourceRoot":"","sources":["../../src/completion/review-cycle-cap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review-cycle-cap.d.ts","sourceRoot":"","sources":["../../src/completion/review-cycle-cap.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG1G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAK9E,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;IACtB,uDAAuD;IACvD,yBAAyB,EAAE,OAAO,CAAC;IACnC,6FAA6F;IAC7F,cAAc,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD;AAED,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,2BAA2B,GAAG,sBAAsB,CAAC,GAAG,OAAO,CAEtJ;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACjD,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAC;IACrC,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,eAAe,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;CAChC;AAED,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8CD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,qBAAqB,EAC1B,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyDf"}
|
|
@@ -1,53 +1,8 @@
|
|
|
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/completion/review-cycle-
|
|
3
|
-
// packages/daemon/src/completion/review-cycle-churn-meter.test.ts
|
|
2
|
+
// Pinned by: packages/daemon/src/completion/review-cycle-churn-meter.test.ts
|
|
4
3
|
// PINNED-BY-END
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* converging, and at TELORA_REVIEW_CYCLE_CAP stop the loop.
|
|
8
|
-
*
|
|
9
|
-
* Replaces the churn METER that used to live in review-exit-escalations.ts. That
|
|
10
|
-
* meter filed one review_cycle_cap_exceeded observation and let the loop keep
|
|
11
|
-
* spawning; the hand-off breaker it deferred to never advances on a cycle that
|
|
12
|
-
* files a new finding, so a non-converging loop billed passes until an operator
|
|
13
|
-
* disarmed it (2026-09-15). Now the crossing holds every spawn gate
|
|
14
|
-
* (focus/review-cycle-cap-hold.ts).
|
|
15
|
-
*
|
|
16
|
-
* What the count measures (recordReviewCycleAndMaybeHold, on every routed exit of
|
|
17
|
-
* a REVIEW session -- a routed coding exit, e.g. the open-work self-heal, is not a
|
|
18
|
-
* review cycle and leaves the count, the window and the filings alone):
|
|
19
|
-
* - a CONVERGED cycle -- a delivery reached done, nothing re-opened to
|
|
20
|
-
* verify_failed, and no open blocking review-filed finding is left on the
|
|
21
|
-
* focus -- resets it to 0. The cap measures consecutive unconverged cycles,
|
|
22
|
-
* not lifetime cycles, so a focus shipping many deliveries one clean review at
|
|
23
|
-
* a time never nears it.
|
|
24
|
-
* - any other routed cycle increments it. Below the cap nothing else happens:
|
|
25
|
-
* the count's only reader is the hold, so cycling below the cap is unchanged.
|
|
26
|
-
* - at the cap: the count is written first (a failed filing still holds by
|
|
27
|
-
* count), the review window is closed, and ONE observation is filed
|
|
28
|
-
* enumerating the open blocking review-filed findings. Nothing closes those
|
|
29
|
-
* issues: they stay open work, and the observation carries them to the agent
|
|
30
|
-
* routing decision (the promotion sweep hands a held focus's observations to
|
|
31
|
-
* the routing decider). Once the observation is filed the count resets to 0,
|
|
32
|
-
* so resolving it -- or, once a routing decider made it human-facing,
|
|
33
|
-
* resolving that filing (focus/review-cycle-cap-hold.ts reads the lineage
|
|
34
|
-
* carrier) -- lifts the hold, and a fresh cap of cycles is needed to re-cross:
|
|
35
|
-
* the review_handoff_exhausted precedent.
|
|
36
|
-
*
|
|
37
|
-
* reconcileReviewCycleCapFiling is the failed-filing half: a focus whose count
|
|
38
|
-
* stands at or past the cap with no observation filed would otherwise be held
|
|
39
|
-
* with nothing for the routing decider to take. The cascade re-files each poll
|
|
40
|
-
* until the filing lands.
|
|
41
|
-
*
|
|
42
|
-
* @module completion/review-cycle-cap
|
|
43
|
-
*/
|
|
44
|
-
import { createEscalation, hasOpenFocusEscalation } from '../queries/escalations.js';
|
|
45
|
-
import { setReviewCycleCount, getFocusIssues, getFocusReviewFiledIssueIds } from '../queries/focuses.js';
|
|
46
|
-
import { resolveReviewCycleCap } from '../verify/stall-detector-config.js';
|
|
47
|
-
import { NO_HUMAN_ACT } from '../queries/filing-observation.js';
|
|
48
|
-
import { REVIEW_CYCLE_CAP_EXCEEDED_KIND } from '../focus/review-cycle-cap-hold.js';
|
|
49
|
-
import { fileDedupedFocusEscalation, } from './review-exit-escalations.js';
|
|
50
|
-
import { filterBlockingReviewFiledComplete } from './review-defect-detector.js';
|
|
4
|
+
import { ARM_ENDED_REVIEW_BUDGET_SPENT } from '../queries/ended-arm.js';
|
|
5
|
+
import { isDaemonShuttingDown } from '../shell/shutdown-state.js';
|
|
51
6
|
import { createLogger } from '../shell/log.js';
|
|
52
7
|
const log = createLogger({ module: 'focus-executor' });
|
|
53
8
|
/** Pure: whether a routed review exit converged -- it resets the count instead of climbing it. */
|
|
@@ -66,13 +21,47 @@ async function writeCycleCount(setCount, ctx, count) {
|
|
|
66
21
|
}
|
|
67
22
|
}
|
|
68
23
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
24
|
+
* End the armed run: release the role and record WHY, atomically, in one edge
|
|
25
|
+
* call. Returns whether the write landed -- a failure leaves the count standing
|
|
26
|
+
* at the budget, which is what holds the spawn gates until the write succeeds on
|
|
27
|
+
* a later crossing or an operator acts.
|
|
72
28
|
*/
|
|
73
|
-
|
|
29
|
+
async function endArmForSpentBudget(release, ctx, args) {
|
|
30
|
+
try {
|
|
31
|
+
await release(ctx.focusId, {
|
|
32
|
+
reason: ARM_ENDED_REVIEW_BUDGET_SPENT,
|
|
33
|
+
detail: {
|
|
34
|
+
reviewCycleCount: args.cycleCount,
|
|
35
|
+
cap: args.cap,
|
|
36
|
+
openBlockingFindings: args.openBlockingFindings.map((f) => ({
|
|
37
|
+
id: f.id, key: f.key, title: f.title, deliveryId: f.deliveryId ?? null,
|
|
38
|
+
})),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
log.warn(`[focus-executor] releaseFocusArm (review budget) failed for "${ctx.focusName}": ${err.message}`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Record one routed review cycle: reset on convergence, climb otherwise, and at
|
|
50
|
+
* the budget end the armed run. Best-effort -- never aborts the routing that
|
|
51
|
+
* already ran. A deps object without the count writer or the budget value skips
|
|
52
|
+
* the whole budget.
|
|
53
|
+
*/
|
|
54
|
+
export async function recordReviewCycleAndMaybeEndArm(deps, ctx, priorCycleCount, outcome) {
|
|
74
55
|
if (!deps.setReviewCycleCount || !deps.resolveReviewCycleCap)
|
|
75
56
|
return;
|
|
57
|
+
// A shutdown is not a review cycle. The teams it kills exit as clean reviews
|
|
58
|
+
// with no inspection evidence, which routes like a bounce -- counting those
|
|
59
|
+
// would let a restart spend a budget no review ever spent.
|
|
60
|
+
if ((deps.isShuttingDown ?? isDaemonShuttingDown)()) {
|
|
61
|
+
log.info(`[focus-executor] "${ctx.focusName}" review exit observed during daemon shutdown -- ` +
|
|
62
|
+
`review-cycle count left at ${priorCycleCount} (a shutdown spends no budget).`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
76
65
|
// MEASURE, don't assume: only a review-session exit moves the count (ReviewCycleOutcome.sessionType).
|
|
77
66
|
if (outcome.sessionType && outcome.sessionType !== 'review') {
|
|
78
67
|
log.info(`[focus-executor] "${ctx.focusName}" ${outcome.sessionType} session exit routed -- not a review pass; ` +
|
|
@@ -86,95 +75,34 @@ export async function recordReviewCycleAndMaybeHold(deps, ctx, priorCycleCount,
|
|
|
86
75
|
}
|
|
87
76
|
const cycleCount = priorCycleCount + 1;
|
|
88
77
|
const cap = deps.resolveReviewCycleCap();
|
|
89
|
-
// Durable first: if the
|
|
78
|
+
// Durable first: if the un-arm below fails, count >= cap is what stops the run.
|
|
90
79
|
await writeCycleCount(deps.setReviewCycleCount, ctx, cycleCount);
|
|
91
80
|
if (cycleCount < cap)
|
|
92
81
|
return;
|
|
93
|
-
//
|
|
94
|
-
//
|
|
82
|
+
// The arm goes FIRST, before the window. Closing the review window fires
|
|
83
|
+
// clear_focus_team_on_review_window_close(), which nulls the role WITHOUT a
|
|
84
|
+
// reason -- so a focus disarmed by that trigger would read as a lifecycle
|
|
85
|
+
// clear. Releasing the arm here means the trigger finds the role already null
|
|
86
|
+
// and the recorded reason stands.
|
|
87
|
+
const armEnded = deps.releaseFocusArm
|
|
88
|
+
? await endArmForSpentBudget(deps.releaseFocusArm, ctx, { cycleCount, cap, openBlockingFindings: outcome.openBlockingFindings })
|
|
89
|
+
: false;
|
|
90
|
+
// Close the window unless a delivery awaits its gate verdict -- that replay
|
|
91
|
+
// converges without a spawn and needs the window.
|
|
95
92
|
if (!outcome.verdictHeldAny) {
|
|
96
93
|
try {
|
|
97
94
|
await deps.clearReviewRequestedAt(ctx.focusId);
|
|
98
95
|
}
|
|
99
96
|
catch (err) {
|
|
100
|
-
log.warn(`[focus-executor] clearReviewRequestedAt (review
|
|
97
|
+
log.warn(`[focus-executor] clearReviewRequestedAt (review budget) failed for "${ctx.focusName}": ${err.message}`);
|
|
101
98
|
}
|
|
102
99
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* File the review_cycle_cap_exceeded observation (at most one open per focus).
|
|
112
|
-
* Returns whether one is now open (filed, or already open). NO_HUMAN_ACT: what the
|
|
113
|
-
* unconverged findings need -- route, re-scope, descope -- is planning work an
|
|
114
|
-
* agent performs; the hold is keyed on this observation's kind, not on an act.
|
|
115
|
-
*/
|
|
116
|
-
export async function fileReviewCycleCapObservation(deps, ctx, args) {
|
|
117
|
-
const findings = args.openBlockingFindings;
|
|
118
|
-
const findingsBlock = findings.length > 0
|
|
119
|
-
? `\n\nMEASURED: ${findings.length} open blocking review-filed finding(s) remain on this focus, still open ` +
|
|
120
|
-
`(the daemon closed none):\n` +
|
|
121
|
-
findings.map(f => ` - ${f.key} (${f.id}): ${f.title}${f.deliveryId ? ` (delivery ${f.deliveryId})` : ''}`).join('\n')
|
|
122
|
-
: `\n\nMEASURED: 0 open blocking review-filed findings on this focus at the capped exit -- the cycles ` +
|
|
123
|
-
`failed to converge for another reason (e.g. uninspected reviews or deliveries re-opening).`;
|
|
124
|
-
return fileDedupedFocusEscalation(deps, ctx, {
|
|
125
|
-
escalationKind: REVIEW_CYCLE_CAP_EXCEEDED_KIND,
|
|
126
|
-
label: 'review-cycle-cap',
|
|
127
|
-
description: `Focus "${ctx.focusName}" completed ${args.cycleCount} review cycle(s) without converging ` +
|
|
128
|
-
`(cap ${args.cap}, TELORA_REVIEW_CYCLE_CAP). The daemon has STOPPED its review loop: the review ` +
|
|
129
|
-
`window is closed and no coding or review pass spawns while this observation is open.` +
|
|
130
|
-
findingsBlock +
|
|
131
|
-
`\n\nDecide what the unconverged findings need -- route or re-scope them onto a delivery, descope ` +
|
|
132
|
-
`them, or re-scope the focus -- then resolve this observation. Resolving it lifts the hold and the ` +
|
|
133
|
-
`focus gets a fresh ${args.cap} review cycles; a focus that converges retires it automatically. ` +
|
|
134
|
-
`If what they need is an act only a human can perform, a filing made human-facing from this ` +
|
|
135
|
-
`observation (sourceEscalationId naming it) keeps the hold standing until THAT filing is resolved.`,
|
|
136
|
-
humanAct: NO_HUMAN_ACT,
|
|
137
|
-
metadata: {
|
|
138
|
-
review_cycle_count: args.cycleCount,
|
|
139
|
-
cap: args.cap,
|
|
140
|
-
routed_via: 'review_cycle_cap_hold',
|
|
141
|
-
holds_spawns: true,
|
|
142
|
-
open_blocking_review_filed_count: findings.length,
|
|
143
|
-
open_blocking_review_filed_findings: findings.map(f => ({ key: f.key, id: f.id, delivery_id: f.deliveryId })),
|
|
144
|
-
terminates_when: 'focus_converged',
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
const defaultReconcileDeps = {
|
|
149
|
-
createEscalation,
|
|
150
|
-
hasOpenFocusEscalation,
|
|
151
|
-
setReviewCycleCount,
|
|
152
|
-
resolveReviewCycleCap,
|
|
153
|
-
getFocusIssues,
|
|
154
|
-
getFocusReviewFiledIssueIds,
|
|
155
|
-
};
|
|
156
|
-
/**
|
|
157
|
-
* The failed-filing half, run by the cascade each poll: a focus whose count
|
|
158
|
-
* stands at or past the cap is held by count; file (or find) its observation and
|
|
159
|
-
* reset the count, so the routing decider has the observation to take and its
|
|
160
|
-
* resolution lifts the hold. A no-op below the cap (no read). Best-effort.
|
|
161
|
-
*/
|
|
162
|
-
export async function reconcileReviewCycleCapFiling(ctx, reviewCycleCount, deps = defaultReconcileDeps) {
|
|
163
|
-
const cap = (deps.resolveReviewCycleCap ?? resolveReviewCycleCap)();
|
|
164
|
-
if (reviewCycleCount < cap || !deps.setReviewCycleCount)
|
|
165
|
-
return;
|
|
166
|
-
let openBlockingFindings = [];
|
|
167
|
-
try {
|
|
168
|
-
const [issues, reviewFiledIds] = await Promise.all([deps.getFocusIssues(ctx.focusId), deps.getFocusReviewFiledIssueIds(ctx.focusId)]);
|
|
169
|
-
openBlockingFindings = filterBlockingReviewFiledComplete(issues, new Set(reviewFiledIds), null)
|
|
170
|
-
.map(i => ({ id: i.id, key: i.key, title: i.title, deliveryId: i.deliveryId ?? null, description: i.description ?? null }));
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
log.warn(`[focus-executor] review-cycle cap re-file could not read findings for "${ctx.focusName}": ${err.message}`);
|
|
174
|
-
}
|
|
175
|
-
const filed = await fileReviewCycleCapObservation(deps, { ...ctx, sessionId: '' }, { cycleCount: reviewCycleCount, cap, openBlockingFindings });
|
|
176
|
-
if (filed && await writeCycleCount(deps.setReviewCycleCount, ctx, 0)) {
|
|
177
|
-
log.info(`[focus-executor] "${ctx.focusName}" review-cycle cap observation re-filed (count ${reviewCycleCount} >= cap ${cap}); count reset to 0.`);
|
|
178
|
-
}
|
|
100
|
+
log.warn(`[focus-executor] "${ctx.focusName}" spent its review-cycle budget without converging (${cycleCount} >= cap ${cap}): ` +
|
|
101
|
+
(armEnded
|
|
102
|
+
? `the armed run has ENDED -- the focus is un-armed with arm_ended_reason='review_budget_spent' ` +
|
|
103
|
+
`(${outcome.openBlockingFindings.length} open blocking review-filed finding(s), none closed). Only a new arm grants further cycles.`
|
|
104
|
+
: `the arm was NOT ended (${deps.releaseFocusArm ? 'the release write failed' : 'no release writer was supplied'}) -- ` +
|
|
105
|
+
`the count stands at the budget, which holds every spawn gate until a release lands or the focus is re-armed.`) +
|
|
106
|
+
` Review window ${outcome.verdictHeldAny ? 'left open for a pending gate verdict' : 'closed'}.`);
|
|
179
107
|
}
|
|
180
108
|
//# sourceMappingURL=review-cycle-cap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-cycle-cap.js","sourceRoot":"","sources":["../../src/completion/review-cycle-cap.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"review-cycle-cap.js","sourceRoot":"","sources":["../../src/completion/review-cycle-cap.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import { type ReviewWindowCommit } from '../resolvers/shared/review-window-commi
|
|
|
15
15
|
import { getActiveFocuses } from '../queries/focus-discovery.js';
|
|
16
16
|
import { hasPendingSpawnDirective } from '../directive/directive-queue.js';
|
|
17
17
|
import { emitLoopTrigger } from '../loops/index.js';
|
|
18
|
-
import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, setReviewCycleCount, setReviewHandoffCount, getFocusReviewReportForSession, getFocusReviewFiledIssueIds } from '../queries/focuses.js';
|
|
18
|
+
import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, releaseFocusArm, setReviewCycleCount, setReviewHandoffCount, getFocusReviewReportForSession, getFocusReviewFiledIssueIds } from '../queries/focuses.js';
|
|
19
19
|
import { resolveReviewCycleCap, resolveReviewHandoffCap } from '../verify/stall-detector-config.js';
|
|
20
20
|
import { getDeliveryIssues, rehomeIssueToDelivery } from '../queries/issues.js';
|
|
21
21
|
import { createEscalation, hasOpenFocusEscalation, hasOpenEscalationForDelivery } from '../queries/escalations.js';
|
|
@@ -57,6 +57,8 @@ export interface ReviewExitDeps {
|
|
|
57
57
|
setReviewedThroughSha: (focusId: string, sha: string) => Promise<void>;
|
|
58
58
|
setReviewCycleCount?: typeof setReviewCycleCount;
|
|
59
59
|
resolveReviewCycleCap?: typeof resolveReviewCycleCap;
|
|
60
|
+
releaseFocusArm?: typeof releaseFocusArm;
|
|
61
|
+
isShuttingDown?: () => boolean;
|
|
60
62
|
setReviewHandoffCount?: typeof setReviewHandoffCount;
|
|
61
63
|
resolveReviewHandoffCap?: typeof resolveReviewHandoffCap;
|
|
62
64
|
resolveHandoffExhaustedHold?: (focusId: string, notes: string) => Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-exit-deps.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review-exit-deps.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
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/completion/review-coverage-seam.test.ts,
|
|
3
|
+
// packages/daemon/src/completion/review-cycle-churn-meter.test.ts,
|
|
3
4
|
// packages/daemon/src/integration/failed-verdict-review-exit-respawn-regression.test.ts
|
|
4
5
|
// PINNED-BY-END
|
|
5
6
|
/**
|
|
@@ -20,7 +21,7 @@ import { blameLineCommits, listReviewWindowCommits } from '../resolvers/shared/r
|
|
|
20
21
|
import { getActiveFocuses } from '../queries/focus-discovery.js';
|
|
21
22
|
import { clearPendingReviewDirective, hasPendingSpawnDirective } from '../directive/directive-queue.js';
|
|
22
23
|
import { emitLoopTrigger } from '../loops/index.js';
|
|
23
|
-
import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, setReviewCycleCount, setReviewHandoffCount, getFocusReviewReportForSession, getFocusReviewFiledIssueIds, } from '../queries/focuses.js';
|
|
24
|
+
import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, releaseFocusArm, setReviewCycleCount, setReviewHandoffCount, getFocusReviewReportForSession, getFocusReviewFiledIssueIds, } from '../queries/focuses.js';
|
|
24
25
|
import { resolveReviewCycleCap, resolveReviewHandoffCap } from '../verify/stall-detector-config.js';
|
|
25
26
|
import { getDeliveryIssues, rehomeIssueToDelivery } from '../queries/issues.js';
|
|
26
27
|
import { createEscalation, hasOpenFocusEscalation, hasOpenEscalationForDelivery, resolveOpenFocusEscalationsOfKind, resolveConvergedFocusEscalations } from '../queries/escalations.js';
|
|
@@ -51,6 +52,7 @@ export const defaultReviewExitDeps = {
|
|
|
51
52
|
setReviewedThroughSha: stampReviewCoverage,
|
|
52
53
|
setReviewCycleCount,
|
|
53
54
|
resolveReviewCycleCap,
|
|
55
|
+
releaseFocusArm,
|
|
54
56
|
setReviewHandoffCount,
|
|
55
57
|
resolveReviewHandoffCap,
|
|
56
58
|
resolveHandoffExhaustedHold: (focusId, notes) => resolveOpenFocusEscalationsOfKind(focusId, 'review_handoff_exhausted', 'agent_session', notes),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-exit-deps.js","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,0FAA0F;AAC1F,gBAAgB;AAEhB;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChI,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAA2B,MAAM,8CAA8C,CAAC;AAClI,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,iCAAiC,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AACxL,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAA2B,MAAM,kCAAkC,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAqB,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"review-exit-deps.js","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-exit-phase.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"AAiDA,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAMD,OAAO,EACL,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMnE;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,cAAsC,GAC3C,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"review-exit-phase.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"AAiDA,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAMD,OAAO,EACL,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMnE;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,cAAsC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA+lBf"}
|
|
@@ -19,7 +19,7 @@ import { resolveOperatorHold, writeOperatorHoldGateState, describeOperatorHold }
|
|
|
19
19
|
import { resolveExternalHold, makeDeferredRequestClosureEvaluator, describeExternalHold } from '../delivery/external-hold.js';
|
|
20
20
|
import { surfaceStaleReferenceLessExternalHold } from '../delivery/external-hold-surface.js';
|
|
21
21
|
import { resolveShortfallHold, writeShortfallGateState, describeShortfallHold, } from './review-exit-shortfall.js';
|
|
22
|
-
import {
|
|
22
|
+
import { recordReviewCycleAndMaybeEndArm } from './review-cycle-cap.js';
|
|
23
23
|
import { fileCoverageIncompleteEscalation, fileGapsWithoutIssueEscalation, fileMissingReportNotice, recordHandoffAndMaybeTerminate, } from './review-exit-escalations.js';
|
|
24
24
|
import { forceFullPassReviewFocuses, recordBelowCoverageDrift, resetCoverageDriftState } from './coverage-drift-state.js';
|
|
25
25
|
import { resolveReviewCycleProgress, emitReviewCompleted, logLeftInVerifyWithoutSignal } from './review-exit-progress.js';
|
|
@@ -499,9 +499,10 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
|
|
|
499
499
|
sessionType,
|
|
500
500
|
openBlockingFindings,
|
|
501
501
|
});
|
|
502
|
-
// Review-cycle
|
|
503
|
-
// and at the
|
|
504
|
-
|
|
502
|
+
// Review-cycle BUDGET (review-cycle-cap.ts): a converged review cycle resets the count; an unconverged one
|
|
503
|
+
// climbs it, and at the budget the armed run ENDS -- the focus is un-armed with a recorded reason, so only a
|
|
504
|
+
// new arm grants further cycles. A coding exit touches none of it. Best-effort.
|
|
505
|
+
await recordReviewCycleAndMaybeEndArm(deps, escalationCtx, current.review_cycle_count ?? 0, { convergedAny, anyReopenedToVerifyFailed, verdictHeldAny, openBlockingFindings, sessionType });
|
|
505
506
|
emitReviewCompleted(deps, escalationCtx, {
|
|
506
507
|
gapsWithoutIssue, reportExists, hasBlockingIssueEvidence, sessionType, succeeded, reviewInspected,
|
|
507
508
|
});
|