@telora/daemon 0.24.42 → 0.24.55
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 +9 -3
- package/dist/completion/completion-event/unfinished-work.d.ts +3 -3
- package/dist/completion/review-cycle-budget/review-loop-detection.d.ts.map +1 -1
- package/dist/completion/review-cycle-budget/review-loop-detection.js +2 -1
- package/dist/completion/review-cycle-budget/review-loop-detection.js.map +1 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts +1 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.d.ts.map +1 -1
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.js +2 -3
- package/dist/completion/review-exit-holds/review-exit-verdict-gate.js.map +1 -1
- package/dist/completion/state-cascade/focus-next-step-read.d.ts +38 -0
- package/dist/completion/state-cascade/focus-next-step-read.d.ts.map +1 -0
- package/dist/completion/state-cascade/focus-next-step-read.js +188 -0
- package/dist/completion/state-cascade/focus-next-step-read.js.map +1 -0
- package/dist/completion/state-cascade/review-request-gate.d.ts.map +1 -1
- package/dist/completion/state-cascade/review-request-gate.js +1 -0
- package/dist/completion/state-cascade/review-request-gate.js.map +1 -1
- package/dist/completion/state-cascade/review-request-next-step.d.ts +56 -0
- package/dist/completion/state-cascade/review-request-next-step.d.ts.map +1 -0
- package/dist/completion/state-cascade/review-request-next-step.js +47 -0
- package/dist/completion/state-cascade/review-request-next-step.js.map +1 -0
- package/dist/completion/state-cascade/review-verify-judgment-gate.d.ts +1 -1
- package/dist/completion/state-cascade/review-verify-judgment-gate.d.ts.map +1 -1
- package/dist/completion/state-cascade/review-verify-judgment-gate.js +1 -0
- package/dist/completion/state-cascade/review-verify-judgment-gate.js.map +1 -1
- package/dist/completion/state-cascade/state-cascade.d.ts +12 -7
- package/dist/completion/state-cascade/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade/state-cascade.js +36 -105
- package/dist/completion/state-cascade/state-cascade.js.map +1 -1
- package/dist/composition/commit-gate-context.d.ts.map +1 -1
- package/dist/composition/commit-gate-context.js +1 -0
- package/dist/composition/commit-gate-context.js.map +1 -1
- package/dist/composition/daemon-contexts.js +1 -1
- package/dist/composition/execution-migrations-context.d.ts.map +1 -1
- package/dist/composition/execution-migrations-context.js +3 -1
- package/dist/composition/execution-migrations-context.js.map +1 -1
- package/dist/composition/execution-process-context.js +1 -1
- package/dist/composition/execution-recovery-context.d.ts +4 -3
- package/dist/composition/execution-recovery-context.d.ts.map +1 -1
- package/dist/composition/execution-recovery-context.js +6 -3
- package/dist/composition/execution-recovery-context.js.map +1 -1
- package/dist/composition/execution-worktree-context.js +1 -1
- package/dist/composition/focus-next-step-context.d.ts +19 -0
- package/dist/composition/focus-next-step-context.d.ts.map +1 -0
- package/dist/composition/focus-next-step-context.js +51 -0
- package/dist/composition/focus-next-step-context.js.map +1 -0
- package/dist/composition/runtime-contexts.d.ts.map +1 -1
- package/dist/composition/runtime-contexts.js +6 -18
- package/dist/composition/runtime-contexts.js.map +1 -1
- package/dist/composition/runtime-poll-context.d.ts +8 -53
- package/dist/composition/runtime-poll-context.d.ts.map +1 -1
- package/dist/composition/runtime-poll-context.js +35 -94
- package/dist/composition/runtime-poll-context.js.map +1 -1
- package/dist/composition/runtime-prd-context.d.ts +8 -0
- package/dist/composition/runtime-prd-context.d.ts.map +1 -1
- package/dist/composition/runtime-prd-context.js +32 -0
- package/dist/composition/runtime-prd-context.js.map +1 -1
- package/dist/composition/runtime-spawn-pass-context.d.ts.map +1 -1
- package/dist/composition/runtime-spawn-pass-context.js +2 -3
- package/dist/composition/runtime-spawn-pass-context.js.map +1 -1
- package/dist/composition/state-cascade-context.d.ts +2 -0
- package/dist/composition/state-cascade-context.d.ts.map +1 -1
- package/dist/composition/state-cascade-context.js +9 -0
- package/dist/composition/state-cascade-context.js.map +1 -1
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +15 -3
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/config/live-daemon-config.js +1 -1
- package/dist/daemon-state/branch-removal-record.d.ts +30 -0
- package/dist/daemon-state/branch-removal-record.d.ts.map +1 -0
- package/dist/daemon-state/branch-removal-record.js +103 -0
- package/dist/daemon-state/branch-removal-record.js.map +1 -0
- package/dist/delivery/advance-hold.d.ts +8 -19
- package/dist/delivery/advance-hold.d.ts.map +1 -1
- package/dist/delivery/advance-hold.js +11 -36
- package/dist/delivery/advance-hold.js.map +1 -1
- package/dist/delivery/commit-verdict-hold.d.ts +1 -1
- package/dist/delivery/commit-verdict-hold.js +1 -1
- package/dist/delivery/recorded-concerns.d.ts.map +1 -1
- package/dist/delivery/recorded-concerns.js +0 -2
- package/dist/delivery/recorded-concerns.js.map +1 -1
- package/dist/directive/directive-queue.d.ts +4 -16
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +5 -13
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +1 -1
- package/dist/directive/phase-sync.js +1 -1
- package/dist/focus/crash-recovery.d.ts +10 -32
- package/dist/focus/crash-recovery.d.ts.map +1 -1
- package/dist/focus/crash-recovery.js +55 -150
- package/dist/focus/crash-recovery.js.map +1 -1
- package/dist/focus/daemon-contexts-runtime.d.ts +3 -3
- package/dist/focus/daemon-contexts-runtime.d.ts.map +1 -1
- package/dist/focus/daemon-contexts.js +1 -1
- package/dist/focus/directive-executor.d.ts.map +1 -1
- package/dist/focus/directive-executor.js +3 -7
- package/dist/focus/directive-executor.js.map +1 -1
- package/dist/focus/failed-head-rework-start.d.ts +61 -0
- package/dist/focus/failed-head-rework-start.d.ts.map +1 -0
- package/dist/focus/failed-head-rework-start.js +52 -0
- package/dist/focus/failed-head-rework-start.js.map +1 -0
- package/dist/focus/focus-activity-record.d.ts +4 -2
- package/dist/focus/focus-activity-record.d.ts.map +1 -1
- package/dist/focus/focus-activity-record.js +4 -2
- package/dist/focus/focus-activity-record.js.map +1 -1
- package/dist/focus/focus-liveness-pass.d.ts +62 -0
- package/dist/focus/focus-liveness-pass.d.ts.map +1 -0
- package/dist/focus/focus-liveness-pass.js +197 -0
- package/dist/focus/focus-liveness-pass.js.map +1 -0
- package/dist/focus/focus-poller-spawn.js +1 -1
- package/dist/focus/focus-poller-state.js +1 -1
- package/dist/focus/live-branch-preservation.d.ts +123 -0
- package/dist/focus/live-branch-preservation.d.ts.map +1 -0
- package/dist/focus/live-branch-preservation.js +192 -0
- package/dist/focus/live-branch-preservation.js.map +1 -0
- package/dist/focus/migration-claim-pass.d.ts +2 -0
- package/dist/focus/migration-claim-pass.d.ts.map +1 -1
- package/dist/focus/migration-claim-pass.js +57 -22
- package/dist/focus/migration-claim-pass.js.map +1 -1
- package/dist/focus/migration-held-set-publish.d.ts +28 -2
- package/dist/focus/migration-held-set-publish.d.ts.map +1 -1
- package/dist/focus/migration-held-set-publish.js +14 -0
- package/dist/focus/migration-held-set-publish.js.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.d.ts +5 -11
- package/dist/focus/pending-spawn-review-next-step.d.ts.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.js +26 -72
- package/dist/focus/pending-spawn-review-next-step.js.map +1 -1
- package/dist/focus/review-refire-gate.d.ts +25 -0
- package/dist/focus/review-refire-gate.d.ts.map +1 -0
- package/dist/focus/review-refire-gate.js +68 -0
- package/dist/focus/review-refire-gate.js.map +1 -0
- package/dist/focus/verify-routing-passes.d.ts +8 -11
- package/dist/focus/verify-routing-passes.d.ts.map +1 -1
- package/dist/focus/verify-routing-passes.js +1 -2
- package/dist/focus/verify-routing-passes.js.map +1 -1
- package/dist/git/types.js +1 -1
- package/dist/prd/arm-refusal-streak.d.ts +102 -0
- package/dist/prd/arm-refusal-streak.d.ts.map +1 -0
- package/dist/prd/arm-refusal-streak.js +136 -0
- package/dist/prd/arm-refusal-streak.js.map +1 -0
- package/dist/prd/arm-refusal.d.ts.map +1 -1
- package/dist/prd/arm-refusal.js +7 -4
- package/dist/prd/arm-refusal.js.map +1 -1
- package/dist/prd/controller-shared.d.ts +40 -1
- package/dist/prd/controller-shared.d.ts.map +1 -1
- package/dist/prd/controller-shared.js +28 -2
- package/dist/prd/controller-shared.js.map +1 -1
- package/dist/prd/controller.d.ts.map +1 -1
- package/dist/prd/controller.js +3 -1
- package/dist/prd/controller.js.map +1 -1
- package/dist/prd/frontier-arming.d.ts +10 -2
- package/dist/prd/frontier-arming.d.ts.map +1 -1
- package/dist/prd/frontier-arming.js +91 -7
- package/dist/prd/frontier-arming.js.map +1 -1
- package/dist/prd/scoping-prompt.d.ts +8 -0
- package/dist/prd/scoping-prompt.d.ts.map +1 -1
- package/dist/prd/scoping-prompt.js +18 -0
- package/dist/prd/scoping-prompt.js.map +1 -1
- package/dist/prompt-sections/qa-failure-section.d.ts.map +1 -1
- package/dist/prompt-sections/qa-failure-section.js +3 -1
- package/dist/prompt-sections/qa-failure-section.js.map +1 -1
- package/dist/queries/api-client/shared.js +1 -1
- package/dist/queries/deliveries/deliveries.js +1 -1
- package/dist/queries/delivery-gate-state/delivery-gate-holds.d.ts +4 -3
- package/dist/queries/delivery-gate-state/delivery-gate-holds.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state/delivery-gate-state.js +1 -1
- package/dist/queries/escalations/escalations.d.ts.map +1 -1
- package/dist/queries/escalations/escalations.js +0 -1
- package/dist/queries/escalations/escalations.js.map +1 -1
- package/dist/queries/escalations/incident-record.d.ts.map +1 -1
- package/dist/queries/escalations/incident-record.js +1 -0
- package/dist/queries/escalations/incident-record.js.map +1 -1
- package/dist/queries/focus-review/review-criterion-verdicts.d.ts.map +1 -1
- package/dist/queries/focus-review/review-criterion-verdicts.js +1 -0
- package/dist/queries/focus-review/review-criterion-verdicts.js.map +1 -1
- package/dist/queries/migrations/live-focus-branches.d.ts +23 -0
- package/dist/queries/migrations/live-focus-branches.d.ts.map +1 -1
- package/dist/queries/migrations/live-focus-branches.js +32 -1
- package/dist/queries/migrations/live-focus-branches.js.map +1 -1
- package/dist/queries/prd/prd.d.ts.map +1 -1
- package/dist/queries/prd/prd.js +1 -16
- package/dist/queries/prd/prd.js.map +1 -1
- package/dist/queries/qa-packets/focus-qa-failure.d.ts +18 -0
- package/dist/queries/qa-packets/focus-qa-failure.d.ts.map +1 -1
- package/dist/queries/qa-packets/focus-qa-failure.js +14 -1
- package/dist/queries/qa-packets/focus-qa-failure.js.map +1 -1
- package/dist/queries/tower-decisions/tower-decisions.d.ts.map +1 -1
- package/dist/queries/tower-decisions/tower-decisions.js +1 -0
- package/dist/queries/tower-decisions/tower-decisions.js.map +1 -1
- package/dist/queries/verification/verification.d.ts +10 -0
- package/dist/queries/verification/verification.d.ts.map +1 -1
- package/dist/queries/verification/verification.js +1 -1
- package/dist/queries/verification/verification.js.map +1 -1
- package/dist/supervision/escalation-suppression.js +1 -1
- package/dist/supervision/failed-head-rerun.d.ts +7 -0
- package/dist/supervision/failed-head-rerun.d.ts.map +1 -0
- package/dist/supervision/failed-head-rerun.js +41 -0
- package/dist/supervision/failed-head-rerun.js.map +1 -0
- package/dist/supervision/focus-delivery-aggregate-phase.js +1 -1
- package/dist/supervision/focus-delivery-aggregate-phase.js.map +1 -1
- package/dist/supervision/focus-liveness.d.ts +89 -0
- package/dist/supervision/focus-liveness.d.ts.map +1 -0
- package/dist/supervision/focus-liveness.js +94 -0
- package/dist/supervision/focus-liveness.js.map +1 -0
- package/dist/supervision/focus-next-step.d.ts +175 -0
- package/dist/supervision/focus-next-step.d.ts.map +1 -0
- package/dist/supervision/focus-next-step.js +129 -0
- package/dist/supervision/focus-next-step.js.map +1 -0
- package/dist/supervision/prd-frontier-rule.d.ts +52 -0
- package/dist/supervision/prd-frontier-rule.d.ts.map +1 -0
- package/dist/supervision/prd-frontier-rule.js +51 -0
- package/dist/supervision/prd-frontier-rule.js.map +1 -0
- package/dist/supervision/prt-frontier.d.ts +22 -7
- package/dist/supervision/prt-frontier.d.ts.map +1 -1
- package/dist/supervision/prt-frontier.js +17 -7
- package/dist/supervision/prt-frontier.js.map +1 -1
- package/dist/supervision/review-loop-detector.d.ts.map +1 -1
- package/dist/supervision/review-loop-detector.js +2 -1
- package/dist/supervision/review-loop-detector.js.map +1 -1
- package/dist/supervision/spawn-cooldown.js +1 -1
- package/dist/supervision/stop-registry.d.ts +1 -0
- package/dist/supervision/stop-registry.d.ts.map +1 -1
- package/dist/supervision/stop-rows-focus-health.d.ts +14 -0
- package/dist/supervision/stop-rows-focus-health.d.ts.map +1 -1
- package/dist/supervision/stop-rows-focus-health.js +32 -0
- package/dist/supervision/stop-rows-focus-health.js.map +1 -1
- package/dist/supervision/stop-rows-spawn.d.ts +3 -2
- package/dist/supervision/stop-rows-spawn.d.ts.map +1 -1
- package/dist/supervision/stop-rows-spawn.js +9 -6
- package/dist/supervision/stop-rows-spawn.js.map +1 -1
- package/dist/supervision/team-work.js +1 -1
- package/dist/supervision/team-work.js.map +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/testing/fixtures/migration-namespace-repo.d.ts.map +1 -1
- package/dist/testing/fixtures/migration-namespace-repo.js +1 -0
- package/dist/testing/fixtures/migration-namespace-repo.js.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.d.ts +24 -0
- package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.js +46 -19
- package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
- package/dist/testing/fixtures/recording-api-client.js +1 -1
- package/dist/testing/fixtures/verification-deps.d.ts +27 -0
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +77 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.js +1 -0
- package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
- package/dist/tower/tower-supervisor-history.d.ts.map +1 -1
- package/dist/tower/tower-supervisor-history.js +2 -1
- package/dist/tower/tower-supervisor-history.js.map +1 -1
- package/dist/tower/tower-supervisor-prompt.d.ts.map +1 -1
- package/dist/tower/tower-supervisor-prompt.js +40 -8
- package/dist/tower/tower-supervisor-prompt.js.map +1 -1
- package/dist/tower/tower-supervisor-session.d.ts.map +1 -1
- package/dist/tower/tower-supervisor-session.js +1 -0
- package/dist/tower/tower-supervisor-session.js.map +1 -1
- package/dist/types/issue-status.d.ts.map +1 -1
- package/dist/types/issue-status.js +6 -1
- package/dist/types/issue-status.js.map +1 -1
- package/dist/verify/attribution/code-failure-evidence.d.ts +77 -0
- package/dist/verify/attribution/code-failure-evidence.d.ts.map +1 -0
- package/dist/verify/attribution/code-failure-evidence.js +92 -0
- package/dist/verify/attribution/code-failure-evidence.js.map +1 -0
- package/dist/verify/attribution/verification-attribution.d.ts +18 -0
- package/dist/verify/attribution/verification-attribution.d.ts.map +1 -1
- package/dist/verify/attribution/verification-attribution.js +49 -2
- package/dist/verify/attribution/verification-attribution.js.map +1 -1
- package/dist/verify/attribution/verification-baseline.d.ts.map +1 -1
- package/dist/verify/attribution/verification-baseline.js +1 -0
- package/dist/verify/attribution/verification-baseline.js.map +1 -1
- package/dist/verify/attribution/verification-diagnostics.d.ts +10 -0
- package/dist/verify/attribution/verification-diagnostics.d.ts.map +1 -1
- package/dist/verify/attribution/verification-diagnostics.js +39 -10
- package/dist/verify/attribution/verification-diagnostics.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.d.ts +19 -0
- package/dist/verify/deterministic-gate/verification-deterministic.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +36 -4
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +7 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/engine/verification-engine.d.ts.map +1 -1
- package/dist/verify/engine/verification-engine.js +6 -3
- package/dist/verify/engine/verification-engine.js.map +1 -1
- package/dist/verify/escaped-tests/escaped-test-run.d.ts +5 -1
- package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -1
- package/dist/verify/escaped-tests/escaped-test-run.js +24 -2
- package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -1
- package/dist/verify/failing-test-rerun/failing-test-retry.d.ts +4 -1
- package/dist/verify/failing-test-rerun/failing-test-retry.d.ts.map +1 -1
- package/dist/verify/failing-test-rerun/failing-test-retry.js.map +1 -1
- package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
- package/dist/verify/gate-verdicts/commit-verdict-record.js.map +1 -1
- package/dist/verify/gate-verdicts/no-verdict-record.d.ts +27 -3
- package/dist/verify/gate-verdicts/no-verdict-record.d.ts.map +1 -1
- package/dist/verify/gate-verdicts/no-verdict-record.js +36 -6
- package/dist/verify/gate-verdicts/no-verdict-record.js.map +1 -1
- package/dist/verify/outcome-routing/verification-rework-issue.d.ts.map +1 -1
- package/dist/verify/outcome-routing/verification-rework-issue.js +5 -4
- package/dist/verify/outcome-routing/verification-rework-issue.js.map +1 -1
- package/dist/verify/run-selection/default-on-guards.d.ts +15 -4
- package/dist/verify/run-selection/default-on-guards.d.ts.map +1 -1
- package/dist/verify/run-selection/default-on-guards.js +14 -4
- package/dist/verify/run-selection/default-on-guards.js.map +1 -1
- package/dist/verify/run-selection/explicit-next-step-gate.d.ts +39 -0
- package/dist/verify/run-selection/explicit-next-step-gate.d.ts.map +1 -0
- package/dist/verify/run-selection/explicit-next-step-gate.js +70 -0
- package/dist/verify/run-selection/explicit-next-step-gate.js.map +1 -0
- package/dist/verify/run-selection/pre-review-gate-dispatch.d.ts +0 -9
- package/dist/verify/run-selection/pre-review-gate-dispatch.d.ts.map +1 -1
- package/dist/verify/run-selection/pre-review-gate-dispatch.js +21 -62
- package/dist/verify/run-selection/pre-review-gate-dispatch.js.map +1 -1
- package/dist/verify/run-selection/reselection-log-line.d.ts +1 -1
- package/dist/verify/run-selection/reselection-log-line.d.ts.map +1 -1
- package/dist/verify/run-selection/reselection-log-line.js +2 -0
- package/dist/verify/run-selection/reselection-log-line.js.map +1 -1
- package/dist/verify/run-selection/verification-default-on.d.ts +32 -4
- package/dist/verify/run-selection/verification-default-on.d.ts.map +1 -1
- package/dist/verify/run-selection/verification-default-on.js +83 -19
- package/dist/verify/run-selection/verification-default-on.js.map +1 -1
- package/dist/verify/shortfalls/shortfall-park.js +1 -1
- package/dist/worktree/focus-worktree-state.js +1 -1
- package/dist/worktree/focus-worktree-state.js.map +1 -1
- package/package.json +3 -3
- package/dist/completion/state-cascade/review-next-step.d.ts +0 -107
- package/dist/completion/state-cascade/review-next-step.d.ts.map +0 -1
- package/dist/completion/state-cascade/review-next-step.js +0 -90
- package/dist/completion/state-cascade/review-next-step.js.map +0 -1
- package/dist/focus/failed-head-wedge.d.ts +0 -124
- package/dist/focus/failed-head-wedge.d.ts.map +0 -1
- package/dist/focus/failed-head-wedge.js +0 -120
- package/dist/focus/failed-head-wedge.js.map +0 -1
- package/dist/focus/stranded-review-reroute.d.ts +0 -70
- package/dist/focus/stranded-review-reroute.d.ts.map +0 -1
- package/dist/focus/stranded-review-reroute.js +0 -193
- package/dist/focus/stranded-review-reroute.js.map +0 -1
- package/dist/focus/uncommitted-work-backstop.d.ts +0 -115
- package/dist/focus/uncommitted-work-backstop.d.ts.map +0 -1
- package/dist/focus/uncommitted-work-backstop.js +0 -259
- package/dist/focus/uncommitted-work-backstop.js.map +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/focus/focus-liveness-pass.test.ts,
|
|
3
|
+
// packages/daemon/src/focus/held-review-window-not-stranded.test.ts,
|
|
4
|
+
// packages/daemon/src/focus/stranded-review-refire-bound.test.ts,
|
|
5
|
+
// packages/daemon/src/integration/failed-verdict-review-exit-respawn-regression.test.ts,
|
|
6
|
+
// packages/daemon/src/integration/failed-verdict-review-loop-regression.test.ts
|
|
7
|
+
// PINNED-BY-END
|
|
8
|
+
/**
|
|
9
|
+
* Whether the stranded-review re-fire queues the review directive again for a
|
|
10
|
+
* focus whose review stage was already processed (focus/directive-executor.ts
|
|
11
|
+
* checkDirectives).
|
|
12
|
+
*
|
|
13
|
+
* The re-fire recovers a review a crash or teardown dropped: a window open, no
|
|
14
|
+
* team. It re-fires only when, in order:
|
|
15
|
+
* 1. the pure rule holds (directive/phase-sync.ts shouldRefireStrandedReview):
|
|
16
|
+
* a review stage, a window, no live team, no operator stop, and no gate
|
|
17
|
+
* verdict the window is HELD for -- read here, fail closed: an unreadable
|
|
18
|
+
* hold reads held, so the release pass (commit-verdict-release.ts) routes it;
|
|
19
|
+
* 2. the liveness detector has not reported this focus stalled
|
|
20
|
+
* (supervision/focus-liveness.ts): a review that started LIVENESS_STALL_STARTS
|
|
21
|
+
* times on an unchanged (HEAD, window) without moving the focus is not queued
|
|
22
|
+
* again -- its observation is the route, and a new commit, step or window
|
|
23
|
+
* starts over;
|
|
24
|
+
* 3. the focus's ONE next step (supervision/focus-next-step.ts) is a review: a
|
|
25
|
+
* failed gate at HEAD is its coding team's rework, a verdict still owed is a
|
|
26
|
+
* gate run -- re-queueing the review there would re-judge a commit nothing
|
|
27
|
+
* changed.
|
|
28
|
+
*
|
|
29
|
+
* @module focus/review-refire-gate
|
|
30
|
+
*/
|
|
31
|
+
import { shouldRefireStrandedReview } from '../directive/phase-sync.js';
|
|
32
|
+
import { commitVerdictHeldDeliveryIds } from '../delivery/commit-verdict-hold.js';
|
|
33
|
+
import { focusLivenessStalled } from '../supervision/focus-liveness.js';
|
|
34
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
35
|
+
const log = createLogger({ module: 'directive-executor' });
|
|
36
|
+
/**
|
|
37
|
+
* The gate-verdict hold read, tri-state: 'held' when some verify delivery carries
|
|
38
|
+
* the commit-verdict hold marker the review exit wrote (delivery/commit-verdict-hold.ts),
|
|
39
|
+
* 'clear' when the deliveries read and none does, 'unreadable' when the read failed.
|
|
40
|
+
*/
|
|
41
|
+
export async function readReviewWindowGateHold(focus, deps) {
|
|
42
|
+
try {
|
|
43
|
+
return commitVerdictHeldDeliveryIds(await deps.getFocusDeliveries(focus.focus_id)).size > 0 ? 'held' : 'clear';
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
log.debug(`[directive-executor] gate-verdict hold unreadable for "${focus.focus_name}": ${err.message}`);
|
|
47
|
+
return 'unreadable';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** True = re-fire the review directive (module header). Never throws. */
|
|
51
|
+
export async function reviewMayRefire(focus, stageName, hasActiveTeam, deps) {
|
|
52
|
+
const rule = shouldRefireStrandedReview({
|
|
53
|
+
stageName,
|
|
54
|
+
reviewRequestedAt: focus.review_requested_at,
|
|
55
|
+
hasActiveTeam,
|
|
56
|
+
operatorStopped: !!focus.operator_stopped_at,
|
|
57
|
+
awaitingGateVerdict: (await readReviewWindowGateHold(focus, deps)) !== 'clear',
|
|
58
|
+
});
|
|
59
|
+
if (!rule)
|
|
60
|
+
return false;
|
|
61
|
+
if (focusLivenessStalled(focus.focus_id)) {
|
|
62
|
+
log.info(`[directive-executor] Not re-firing the review for "${focus.focus_name}": the liveness detector reported it stalled on this HEAD and window`);
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const read = await deps.readNextStep(focus).catch(() => null);
|
|
66
|
+
return read?.readable === true && read.next.step === 'review';
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=review-refire-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-refire-gate.js","sourceRoot":"","sources":["../../src/focus/review-refire-gate.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,oEAAoE;AACpE,uEAAuE;AACvE,oEAAoE;AACpE,2FAA2F;AAC3F,kFAAkF;AAClF,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAe3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAyD,EACzD,IAAkD;IAElD,IAAI,CAAC;QACH,OAAO,4BAA4B,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACjH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,0DAA0D,KAAK,CAAC,UAAU,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpH,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAwB,EACxB,SAA6B,EAC7B,aAAsB,EACtB,IAAsB;IAEtB,MAAM,IAAI,GAAG,0BAA0B,CAAC;QACtC,SAAS;QACT,iBAAiB,EAAE,KAAK,CAAC,mBAAmB;QAC5C,aAAa;QACb,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB;QAC5C,mBAAmB,EAAE,CAAC,MAAM,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO;KAC/E,CAAC,CAAC;IACH,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,sDAAsD,KAAK,CAAC,UAAU,sEAAsE,CAAC,CAAC;QACvJ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,IAAI,EAAE,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;AAChE,CAAC"}
|
|
@@ -7,15 +7,13 @@
|
|
|
7
7
|
* 2. releaseCommitVerdictHolds: a review exit held on its commit's gate verdict
|
|
8
8
|
* is replayed once that verdict lands (held re-work: once the run is over),
|
|
9
9
|
* or its held evidence is dropped when HEAD moved;
|
|
10
|
-
* 3.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* worktree-dirty record naming the paths (focus/uncommitted-work-backstop.ts);
|
|
18
|
-
* 5. reopenFalsifiedDoneDeliveries: a done delivery carrying an open Bug that
|
|
10
|
+
* 3. detectFocusLivenessStalls: an armed focus whose one next step names an
|
|
11
|
+
* actor that does not move it -- a coding team, a gate run, a review -- gets
|
|
12
|
+
* a coding respawn when that actor is a coding team that never started, and
|
|
13
|
+
* ONE agent-resolvable observation at the stall (focus/focus-liveness-pass.ts).
|
|
14
|
+
* It runs after the release pass, so a held exit the release routes this poll
|
|
15
|
+
* is never read as a stall;
|
|
16
|
+
* 4. reopenFalsifiedDoneDeliveries: a done delivery carrying an open Bug that
|
|
19
17
|
* names the met effects it falsifies re-opens to verify_failed -- verify
|
|
20
18
|
* was wrong (verify/outcome-routing/falsified-effect-reopen.ts).
|
|
21
19
|
*
|
|
@@ -36,8 +34,7 @@ import type { DaemonConfig } from '../types/index.js';
|
|
|
36
34
|
export interface VerifyRoutingPasses {
|
|
37
35
|
checkVerifyDeliveriesForOpenIssues: (config: DaemonConfig) => Promise<void>;
|
|
38
36
|
releaseCommitVerdictHolds: (config: DaemonConfig) => Promise<unknown>;
|
|
39
|
-
|
|
40
|
-
recoverUncommittedWork: (config: DaemonConfig) => Promise<unknown>;
|
|
37
|
+
detectFocusLivenessStalls: (config: DaemonConfig) => Promise<unknown>;
|
|
41
38
|
reopenFalsifiedDoneDeliveries: (config: DaemonConfig) => Promise<unknown>;
|
|
42
39
|
}
|
|
43
40
|
/** Run the verify-routing phase for one product-scoped config, over the given passes. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-routing-passes.d.ts","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAMA
|
|
1
|
+
{"version":3,"file":"verify-routing-passes.d.ts","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,yBAAyB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,yBAAyB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,6BAA6B,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED,yFAAyF;AACzF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -7,8 +7,7 @@
|
|
|
7
7
|
export async function runVerifyRoutingPasses(config, passes) {
|
|
8
8
|
await passes.checkVerifyDeliveriesForOpenIssues(config);
|
|
9
9
|
await passes.releaseCommitVerdictHolds(config);
|
|
10
|
-
await passes.
|
|
11
|
-
await passes.recoverUncommittedWork(config);
|
|
10
|
+
await passes.detectFocusLivenessStalls(config);
|
|
12
11
|
await passes.reopenFalsifiedDoneDeliveries(config);
|
|
13
12
|
}
|
|
14
13
|
//# sourceMappingURL=verify-routing-passes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-routing-passes.js","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,6DAA6D;AAC7D,0EAA0E;AAC1E,gBAAgB;
|
|
1
|
+
{"version":3,"file":"verify-routing-passes.js","sourceRoot":"","sources":["../../src/focus/verify-routing-passes.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,0EAA0E;AAC1E,6DAA6D;AAC7D,0EAA0E;AAC1E,gBAAgB;AA4ChB,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAoB,EACpB,MAA2B;IAE3B,MAAM,MAAM,CAAC,kCAAkC,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/git/types.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by:
|
|
2
|
+
// Pinned by: 23 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/git/types.ts
|
|
3
3
|
// PINNED-BY-END
|
|
4
4
|
/**
|
|
5
5
|
* Shared types and utilities for the git subsystem.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A refused frontier arm that no scoping agent can fix reaches the machine lane.
|
|
3
|
+
*
|
|
4
|
+
* WHY IT EXISTS. The frontier records every refused arm on the focus Debug tab
|
|
5
|
+
* (./arm-refusal.ts) and retries it each tick. That is enough for the refusal
|
|
6
|
+
* the record was written for -- `arm_criteria_required`, fixed by the tree
|
|
7
|
+
* restatement the re-spawned scoping agent writes. It is not enough for the
|
|
8
|
+
* rest: `prd_member_focus` from a daemon older than the refusal, a
|
|
9
|
+
* `daemon_credential_required`, a frontier-rule disagreement answered as a
|
|
10
|
+
* `state_conflict`, an opaque `backend_error`. No agent the frontier spawns can
|
|
11
|
+
* fix those, so without this a refused arm waits on the Debug tab until someone
|
|
12
|
+
* reads it. History: docs/daemon/history-platform.md (prd/arm-refusal-streak.ts).
|
|
13
|
+
*
|
|
14
|
+
* WHAT IT DOES. Per focus it counts consecutive refused arms carrying the SAME
|
|
15
|
+
* refusal code, with no successful arm between them. A different code starts a
|
|
16
|
+
* new streak; a successful arm ends it. When a streak of any code other than
|
|
17
|
+
* `arm_criteria_required` reaches the bound it files ONE agent_resolvable
|
|
18
|
+
* observation, cause-keyed on (focus, code) through the cause-keyed filer, so a
|
|
19
|
+
* re-observation while it is open is suppressed. It reads the filer's result:
|
|
20
|
+
* only a filing that left the observation on record (`observationRecorded`)
|
|
21
|
+
* ends the attempts -- a filing the server refused is re-sent, unchanged, on
|
|
22
|
+
* every later refusal until one is recorded. It names the focus, the PRD,
|
|
23
|
+
* the refusal code and the daemon version. A successful arm resolves any
|
|
24
|
+
* observation this process filed for the focus. The Debug-tab record is
|
|
25
|
+
* untouched: this is added beside it, not instead of it.
|
|
26
|
+
*
|
|
27
|
+
* A daemon restart forgets the counts (the streak is re-earned, and the
|
|
28
|
+
* cause-keyed filer suppresses a second row while the first is open).
|
|
29
|
+
*
|
|
30
|
+
* NEVER THROWS into the tick: a filing, list or resolve failure is logged and
|
|
31
|
+
* retried on the next report. Production I/O is bound at the composition root
|
|
32
|
+
* (composition/runtime-prd-context.ts).
|
|
33
|
+
*
|
|
34
|
+
* @module prd/arm-refusal-streak
|
|
35
|
+
*/
|
|
36
|
+
import type { IncidentRow } from '../queries/escalations/incident-record.js';
|
|
37
|
+
import type { FileEscalationIdempotentParams, FileEscalationIdempotentResult } from '../supervision/escalation-suppression.js';
|
|
38
|
+
import { type ArmFailure } from './arm-refusal.js';
|
|
39
|
+
/** Consecutive refused arms of one code, with no success between, that file the observation. */
|
|
40
|
+
export declare const ARM_REFUSAL_OBSERVATION_THRESHOLD = 5;
|
|
41
|
+
/** The cause-key kind every frontier arm-refusal observation carries. */
|
|
42
|
+
export declare const ARM_REFUSAL_CAUSE_KIND = "prd_frontier_arm_refused";
|
|
43
|
+
/** The code a refusal that carried none is counted under. */
|
|
44
|
+
export declare const UNCODED_REFUSAL = "uncoded";
|
|
45
|
+
/** One refused frontier arm, as the streak counts it. */
|
|
46
|
+
export interface RefusedArm {
|
|
47
|
+
focusId: string;
|
|
48
|
+
/** The overcome node whose focus this is. */
|
|
49
|
+
nodeId: string;
|
|
50
|
+
prdId: string;
|
|
51
|
+
prdTitle: string;
|
|
52
|
+
/** The PRD's product, stamped as the observation's provenance. */
|
|
53
|
+
productId: string | null;
|
|
54
|
+
failure: ArmFailure;
|
|
55
|
+
}
|
|
56
|
+
/** What the frontier reports about each arm it attempts. */
|
|
57
|
+
export interface ArmRefusalStreakReporter {
|
|
58
|
+
recordRefusal(arm: RefusedArm): Promise<void>;
|
|
59
|
+
recordSuccess(focusId: string): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/** The tracker's I/O and bound, all required (production: composition/runtime-prd-context.ts). */
|
|
62
|
+
export interface ArmRefusalStreakDeps {
|
|
63
|
+
fileObservation: (params: FileEscalationIdempotentParams) => Promise<FileEscalationIdempotentResult>;
|
|
64
|
+
listOpenEscalations: () => Promise<IncidentRow[]>;
|
|
65
|
+
resolveEscalation: (escalationId: string, notes: string) => Promise<void>;
|
|
66
|
+
organizationId: () => string | Promise<string>;
|
|
67
|
+
/** The running daemon's version -- the fact an operator needs for a deploy-order refusal. */
|
|
68
|
+
daemonVersion: () => string;
|
|
69
|
+
threshold: number;
|
|
70
|
+
}
|
|
71
|
+
/** The refusal code a failure is counted under. */
|
|
72
|
+
export declare function refusalCodeOf(failure: ArmFailure): string;
|
|
73
|
+
/** Does a streak of this code ever file? The criteria refusal is the scoping agent's to fix. */
|
|
74
|
+
export declare function refusalCodeFiles(code: string): boolean;
|
|
75
|
+
/** The cause key of the observation for one (focus, refusal code). */
|
|
76
|
+
export declare function armRefusalCauseKey(focusId: string, code: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Did this filing leave the observation on record? A new row, a correlation
|
|
79
|
+
* onto an open incident row, or an open/dismissed row of the same cause key that
|
|
80
|
+
* suppressed it all do. A filing the server REFUSED did not -- whether or not its
|
|
81
|
+
* refusal record landed -- nor did one that reports nothing at all, so the
|
|
82
|
+
* streak keeps retrying it.
|
|
83
|
+
*/
|
|
84
|
+
export declare function observationRecorded(result: FileEscalationIdempotentResult): boolean;
|
|
85
|
+
export declare class ArmRefusalStreakTracker implements ArmRefusalStreakReporter {
|
|
86
|
+
private readonly io;
|
|
87
|
+
private readonly streaks;
|
|
88
|
+
/** Cause keys this process recorded per focus, resolved on the focus's next successful arm. */
|
|
89
|
+
private readonly filedKeys;
|
|
90
|
+
constructor(io: ArmRefusalStreakDeps);
|
|
91
|
+
/** The current streak for a focus (read-only view, for tests and logs). */
|
|
92
|
+
streakOf(focusId: string): {
|
|
93
|
+
code: string;
|
|
94
|
+
consecutive: number;
|
|
95
|
+
recorded: boolean;
|
|
96
|
+
} | null;
|
|
97
|
+
recordRefusal(arm: RefusedArm): Promise<void>;
|
|
98
|
+
recordSuccess(focusId: string): Promise<void>;
|
|
99
|
+
}
|
|
100
|
+
/** The observation for one streak. PURE. */
|
|
101
|
+
export declare function buildObservation(arm: RefusedArm, code: string, causeKey: string, consecutive: number, daemonVersion: string, organizationId: string): FileEscalationIdempotentParams;
|
|
102
|
+
//# sourceMappingURL=arm-refusal-streak.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arm-refusal-streak.d.ts","sourceRoot":"","sources":["../../src/prd/arm-refusal-streak.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/prd/prd-frontier-arm-refusal-streak.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
import { DISPOSITION_AGENT_RESOLVABLE } from '../queries/escalations/escalation-dispositions.js';
|
|
5
|
+
import { computeCauseKey } from '../queries/escalations/cause-key.js';
|
|
6
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
7
|
+
import { ARM_CRITERIA_REQUIRED_CODE } from './arm-refusal.js';
|
|
8
|
+
const log = createLogger({ module: 'prd-controller' });
|
|
9
|
+
/** Consecutive refused arms of one code, with no success between, that file the observation. */
|
|
10
|
+
export const ARM_REFUSAL_OBSERVATION_THRESHOLD = 5;
|
|
11
|
+
/** The cause-key kind every frontier arm-refusal observation carries. */
|
|
12
|
+
export const ARM_REFUSAL_CAUSE_KIND = 'prd_frontier_arm_refused';
|
|
13
|
+
/** The code a refusal that carried none is counted under. */
|
|
14
|
+
export const UNCODED_REFUSAL = 'uncoded';
|
|
15
|
+
/** Longest refusal text carried into the observation. */
|
|
16
|
+
const MAX_REFUSAL_DETAIL = 1000;
|
|
17
|
+
/** The refusal code a failure is counted under. */
|
|
18
|
+
export function refusalCodeOf(failure) {
|
|
19
|
+
return failure.code ?? UNCODED_REFUSAL;
|
|
20
|
+
}
|
|
21
|
+
/** Does a streak of this code ever file? The criteria refusal is the scoping agent's to fix. */
|
|
22
|
+
export function refusalCodeFiles(code) {
|
|
23
|
+
return code !== ARM_CRITERIA_REQUIRED_CODE;
|
|
24
|
+
}
|
|
25
|
+
/** The cause key of the observation for one (focus, refusal code). */
|
|
26
|
+
export function armRefusalCauseKey(focusId, code) {
|
|
27
|
+
return computeCauseKey(ARM_REFUSAL_CAUSE_KIND, { focus_id: focusId, refusal_code: code });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Did this filing leave the observation on record? A new row, a correlation
|
|
31
|
+
* onto an open incident row, or an open/dismissed row of the same cause key that
|
|
32
|
+
* suppressed it all do. A filing the server REFUSED did not -- whether or not its
|
|
33
|
+
* refusal record landed -- nor did one that reports nothing at all, so the
|
|
34
|
+
* streak keeps retrying it.
|
|
35
|
+
*/
|
|
36
|
+
export function observationRecorded(result) {
|
|
37
|
+
if (result.refused === true)
|
|
38
|
+
return false;
|
|
39
|
+
return result.filed || result.suppressed || result.correlated === true;
|
|
40
|
+
}
|
|
41
|
+
export class ArmRefusalStreakTracker {
|
|
42
|
+
io;
|
|
43
|
+
streaks = new Map();
|
|
44
|
+
/** Cause keys this process recorded per focus, resolved on the focus's next successful arm. */
|
|
45
|
+
filedKeys = new Map();
|
|
46
|
+
constructor(io) {
|
|
47
|
+
this.io = io;
|
|
48
|
+
}
|
|
49
|
+
/** The current streak for a focus (read-only view, for tests and logs). */
|
|
50
|
+
streakOf(focusId) {
|
|
51
|
+
const s = this.streaks.get(focusId);
|
|
52
|
+
return s ? { code: s.code, consecutive: s.consecutive, recorded: s.recorded } : null;
|
|
53
|
+
}
|
|
54
|
+
async recordRefusal(arm) {
|
|
55
|
+
const code = refusalCodeOf(arm.failure);
|
|
56
|
+
let streak = this.streaks.get(arm.focusId);
|
|
57
|
+
if (!streak || streak.code !== code) {
|
|
58
|
+
streak = { code, consecutive: 0, recorded: false, pending: null };
|
|
59
|
+
this.streaks.set(arm.focusId, streak);
|
|
60
|
+
}
|
|
61
|
+
streak.consecutive += 1;
|
|
62
|
+
if (!refusalCodeFiles(code) || streak.recorded || streak.consecutive < this.io.threshold)
|
|
63
|
+
return;
|
|
64
|
+
try {
|
|
65
|
+
const key = armRefusalCauseKey(arm.focusId, code);
|
|
66
|
+
streak.pending ??= buildObservation(arm, code, key, streak.consecutive, this.io.daemonVersion(), await this.io.organizationId());
|
|
67
|
+
const result = await this.io.fileObservation(streak.pending);
|
|
68
|
+
if (!observationRecorded(result)) {
|
|
69
|
+
log.warn(`[prd-controller] the refused-arm observation for focus ${arm.focusId} [${code}] was not recorded ` +
|
|
70
|
+
`(${result.refused === true ? 'the server refused the filing' : 'no row was written'}) -- ` +
|
|
71
|
+
'retried on the next refusal');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
streak.recorded = true;
|
|
75
|
+
streak.pending = null;
|
|
76
|
+
const keys = this.filedKeys.get(arm.focusId) ?? new Set();
|
|
77
|
+
keys.add(key);
|
|
78
|
+
this.filedKeys.set(arm.focusId, keys);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
log.warn(`[prd-controller] could not file the refused-arm observation for focus ${arm.focusId} ` +
|
|
82
|
+
`[${code}]: ${err.message} -- retried on the next refusal`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async recordSuccess(focusId) {
|
|
86
|
+
this.streaks.delete(focusId);
|
|
87
|
+
const keys = this.filedKeys.get(focusId);
|
|
88
|
+
if (!keys || keys.size === 0)
|
|
89
|
+
return;
|
|
90
|
+
try {
|
|
91
|
+
const open = (await this.io.listOpenEscalations()).filter((row) => keys.has(String(row.metadata?.cause_key ?? '')));
|
|
92
|
+
for (const row of open) {
|
|
93
|
+
await this.io.resolveEscalation(row.id, `Auto-resolved by the daemon: the PRD frontier armed focus ${focusId}.`);
|
|
94
|
+
}
|
|
95
|
+
this.filedKeys.delete(focusId);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
log.warn(`[prd-controller] could not resolve the refused-arm observation for focus ${focusId}: ` +
|
|
99
|
+
`${err.message} -- retried on the next successful arm`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** The observation for one streak. PURE. */
|
|
104
|
+
export function buildObservation(arm, code, causeKey, consecutive, daemonVersion, organizationId) {
|
|
105
|
+
const detail = arm.failure.detail.slice(0, MAX_REFUSAL_DETAIL);
|
|
106
|
+
return {
|
|
107
|
+
causeKey,
|
|
108
|
+
organizationId,
|
|
109
|
+
issueId: null,
|
|
110
|
+
focusId: arm.focusId,
|
|
111
|
+
...(arm.productId ? { productId: arm.productId } : {}),
|
|
112
|
+
reasonType: 'error_encountered',
|
|
113
|
+
disposition: DISPOSITION_AGENT_RESOLVABLE,
|
|
114
|
+
description: `The PRD frontier of "${arm.prdTitle}" (${arm.prdId}) has been refused ${consecutive} consecutive times ` +
|
|
115
|
+
`arming focus ${arm.focusId} (overcome ${arm.nodeId}), every time with refusal code ${code}, by daemon ` +
|
|
116
|
+
`${daemonVersion}. A refusal with this code is not one the frontier's scoping agent can fix, so the focus ` +
|
|
117
|
+
`stays materialized and un-armed. Most recent refusal: ${detail}`,
|
|
118
|
+
whatWasTried: 'The frontier recorded each refusal on the focus Debug tab (section arm_refused) and re-attempted the arm ' +
|
|
119
|
+
'every tick; nothing else acted on it.',
|
|
120
|
+
helpNeeded: `Find why the server refuses this arm (code ${code}) and fix the cause: a host below a refusal's floor ` +
|
|
121
|
+
`(daemon ${daemonVersion} here) is updated, a daemon credential that does not serve the PRD's product is ` +
|
|
122
|
+
'fixed, a frontier-rule disagreement between the daemon and the product-api is reconciled. This observation ' +
|
|
123
|
+
'closes itself when the frontier next arms the focus.',
|
|
124
|
+
metadata: {
|
|
125
|
+
focus_id: arm.focusId,
|
|
126
|
+
prd_id: arm.prdId,
|
|
127
|
+
prd_title: arm.prdTitle,
|
|
128
|
+
overcome_node_id: arm.nodeId,
|
|
129
|
+
refusal_code: code,
|
|
130
|
+
daemon_version: daemonVersion,
|
|
131
|
+
consecutive_refusals: consecutive,
|
|
132
|
+
last_refusal: detail,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=arm-refusal-streak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arm-refusal-streak.js","sourceRoot":"","sources":["../../src/prd/arm-refusal-streak.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arm-refusal.d.ts","sourceRoot":"","sources":["../../src/prd/arm-refusal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arm-refusal.d.ts","sourceRoot":"","sources":["../../src/prd/arm-refusal.ts"],"names":[],"mappings":"AAyDA,gEAAgE;AAChE,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AAErE,8DAA8D;AAC9D,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,IAAI,EAAE,mBAAmB,GAAG,cAAc,CAAC;IAC3C,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAc3D;AAQD,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,GACZ,MAAM,CA4BR;AASD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC,GACA,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpE"}
|
package/dist/prd/arm-refusal.js
CHANGED
|
@@ -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/prd/prd-frontier-arm-
|
|
2
|
+
// Pinned by: packages/daemon/src/prd/prd-frontier-arm-refusal-streak.test.ts,
|
|
3
|
+
// packages/daemon/src/prd/prd-frontier-arm-refused.test.ts
|
|
3
4
|
// PINNED-BY-END
|
|
4
5
|
/**
|
|
5
6
|
* A refused arm, SURVIVED: classify it, and record it where an operator reads it.
|
|
@@ -39,9 +40,11 @@
|
|
|
39
40
|
* record degrades to.
|
|
40
41
|
*
|
|
41
42
|
* NOTHING HERE ESCALATES. A refused arm is a recoverable state the machine
|
|
42
|
-
* re-tries
|
|
43
|
-
*
|
|
44
|
-
*
|
|
43
|
+
* re-tries. For `arm_criteria_required` the fix is a restatement on a tree node,
|
|
44
|
+
* and the scoping agent the frontier re-spawns is the actor that writes it. For
|
|
45
|
+
* every other code no agent the frontier spawns can fix it, so the refusal
|
|
46
|
+
* streak (./arm-refusal-streak.ts) -- beside this record, not instead of it --
|
|
47
|
+
* files one agent_resolvable observation once such a refusal outlasts its bound.
|
|
45
48
|
*
|
|
46
49
|
* History: docs/daemon/history-platform.md (prd/arm-refusal.ts).
|
|
47
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arm-refusal.js","sourceRoot":"","sources":["../../src/prd/arm-refusal.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"arm-refusal.js","sourceRoot":"","sources":["../../src/prd/arm-refusal.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import type { Prd, PrtNode, PrtEdge, Pathway } from '../queries/prd/prd.js';
|
|
|
3
3
|
import type { FileEscalationInput } from '../nexus/file-escalation.js';
|
|
4
4
|
import type { StewardJudgmentInput, StewardDecision } from './steward.js';
|
|
5
5
|
import type { FocusArmReadiness } from './arm-readiness.js';
|
|
6
|
+
import type { FocusQaStandingRead } from '../queries/qa-packets/focus-qa-failure.js';
|
|
6
7
|
import type { ArmRefusalRecord } from './arm-refusal.js';
|
|
8
|
+
import type { ArmRefusalStreakReporter } from './arm-refusal-streak.js';
|
|
7
9
|
/**
|
|
8
10
|
* Steward cadence: the minimum interval between proactive steward monitoring
|
|
9
11
|
* runs for a Played PRD -- the "runs on a cadence" path of the AC. 15 minutes
|
|
@@ -53,12 +55,31 @@ export declare function computeCompletedFocusIds(deliveries: Array<{
|
|
|
53
55
|
focusId: string;
|
|
54
56
|
executionStatus: string;
|
|
55
57
|
}>, containment: ReadonlyMap<string, FocusBranchContainment>): Set<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Whether a QA read holds a focus OUT of the landed set: its QA state is
|
|
60
|
+
* failed, or could not be read (fail closed -- a failed verdict must never be
|
|
61
|
+
* overwritten on an unproven read). PURE.
|
|
62
|
+
*
|
|
63
|
+
* WHY QA-FAILED IS NOT LANDED. A person's failed verdict leaves every delivery
|
|
64
|
+
* done and the branch merged -- exactly the landed facts -- so without this the
|
|
65
|
+
* completion bridge would re-clear the overcome the verdict reopened, and the
|
|
66
|
+
* limbo self-heal would finalize the focus straight back to complete over it.
|
|
67
|
+
* qa_state stays failed until the team armed AFTER the fail finishes (the
|
|
68
|
+
* enter_focus_qa_on_team_finish trigger moves it to awaiting), so "work
|
|
69
|
+
* finished after the failed verdict" is precisely qa_state leaving failed; from
|
|
70
|
+
* then on the focus lands, clears and finalizes like any other.
|
|
71
|
+
* QA still gates nothing on the pass side: awaiting, passed and never-QA'd foci
|
|
72
|
+
* land on their delivery and branch facts alone (docs/DECISIONS.md 2026-10-26).
|
|
73
|
+
*/
|
|
74
|
+
export declare function qaHoldsFocusUnlanded(read: FocusQaStandingRead): boolean;
|
|
56
75
|
/**
|
|
57
76
|
* Load the deliveries and branch containment of each focus and return those
|
|
58
77
|
* that have LANDED (computeCompletedFocusIds). Containment is read only for a
|
|
59
78
|
* focus whose deliveries could have landed, so a running focus costs no git.
|
|
79
|
+
* A focus a person failed at QA is not landed (qaHoldsFocusUnlanded); its QA is
|
|
80
|
+
* read only once its deliveries could have landed.
|
|
60
81
|
*/
|
|
61
|
-
export declare function loadLandedFocusIds(focusIds: readonly string[], deps: Pick<PrdControllerDeps, 'loadFocusDeliveries' | 'readFocusBranchContainment'>): Promise<Set<string>>;
|
|
82
|
+
export declare function loadLandedFocusIds(focusIds: readonly string[], deps: Pick<PrdControllerDeps, 'loadFocusDeliveries' | 'readFocusBranchContainment' | 'loadFocusQa'>): Promise<Set<string>>;
|
|
62
83
|
/**
|
|
63
84
|
* One PRD scoping run, as the controller's process-lifetime ledger holds it.
|
|
64
85
|
*
|
|
@@ -188,6 +209,15 @@ export interface PrdControllerDeps {
|
|
|
188
209
|
* frontier re-tries, and `fileEscalation` is deliberately not reached here.
|
|
189
210
|
*/
|
|
190
211
|
recordArmRefusal: (record: ArmRefusalRecord) => Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Counts consecutive refused arms per focus and refusal code and, past its
|
|
214
|
+
* bound, files ONE agent_resolvable observation for any code but
|
|
215
|
+
* arm_criteria_required (`prd/arm-refusal-streak.ts`); told of every
|
|
216
|
+
* successful arm so the streak ends. Bound at the composition root to one
|
|
217
|
+
* process-lifetime tracker shared by every product. Never throws. Absent in a
|
|
218
|
+
* harness that does not exercise it: then nothing is counted.
|
|
219
|
+
*/
|
|
220
|
+
armRefusalStreak?: ArmRefusalStreakReporter;
|
|
191
221
|
/**
|
|
192
222
|
* Clear that record once an arm lands. Bound at the composition root to the
|
|
193
223
|
* live `clearArmRefusal`. Unconditional on a successful arm, exactly as a
|
|
@@ -246,6 +276,15 @@ export interface PrdControllerDeps {
|
|
|
246
276
|
* When ABSENT no stop is known -- the binding is what makes it real.
|
|
247
277
|
*/
|
|
248
278
|
loadFocusOperatorStop?: (focusId: string) => Promise<string | null>;
|
|
279
|
+
/**
|
|
280
|
+
* The focus's human QA standing (product-api focus_qa_get); never throws.
|
|
281
|
+
* A QA-failed focus is not landed (qaHoldsFocusUnlanded), is armed by the
|
|
282
|
+
* frontier only once work has been scoped since the failed verdict, and its
|
|
283
|
+
* scoping run is handed the cases the person did not pass
|
|
284
|
+
* (prd/frontier-arming.ts). Optional; bound at the composition root. When
|
|
285
|
+
* ABSENT no QA is known and every focus is judged on its delivery facts.
|
|
286
|
+
*/
|
|
287
|
+
loadFocusQa?: (focusId: string) => Promise<FocusQaStandingRead>;
|
|
249
288
|
/**
|
|
250
289
|
* Spawn the ONE-SHOT PRD scoping agent for a materialized frontier focus
|
|
251
290
|
* (fire-and-forget: resolves on spawn, reports the exit via `onExit`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller-shared.d.ts","sourceRoot":"","sources":["../../src/prd/controller-shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"controller-shared.d.ts","sourceRoot":"","sources":["../../src/prd/controller-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
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/prd/prd-
|
|
2
|
+
// Pinned by: packages/daemon/src/prd/prd-controller-qa-failed.test.ts,
|
|
3
|
+
// packages/daemon/src/prd/prd-frontier-arm-covers-stated-effects.test.ts,
|
|
4
|
+
// packages/daemon/src/prd/prd-frontier-arm-refusal-streak.test.ts,
|
|
3
5
|
// packages/daemon/src/prd/prd-frontier-arm-refused.test.ts,
|
|
4
6
|
// packages/daemon/src/prd/prd-frontier-arming.test.ts, packages/daemon/src/tower/tower-prd-arm.test.ts
|
|
5
7
|
// PINNED-BY-END
|
|
@@ -15,6 +17,7 @@
|
|
|
15
17
|
* History: docs/daemon/history-platform.md (prd/controller-shared.ts).
|
|
16
18
|
*/
|
|
17
19
|
import { judgeFocusLanded } from '../tower/focus-landed.js';
|
|
20
|
+
import { QA_STATE } from '@telora/daemon-core';
|
|
18
21
|
/**
|
|
19
22
|
* Steward cadence: the minimum interval between proactive steward monitoring
|
|
20
23
|
* runs for a Played PRD -- the "runs on a cadence" path of the AC. 15 minutes
|
|
@@ -80,20 +83,43 @@ export function computeCompletedFocusIds(deliveries, containment) {
|
|
|
80
83
|
}
|
|
81
84
|
return complete;
|
|
82
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Whether a QA read holds a focus OUT of the landed set: its QA state is
|
|
88
|
+
* failed, or could not be read (fail closed -- a failed verdict must never be
|
|
89
|
+
* overwritten on an unproven read). PURE.
|
|
90
|
+
*
|
|
91
|
+
* WHY QA-FAILED IS NOT LANDED. A person's failed verdict leaves every delivery
|
|
92
|
+
* done and the branch merged -- exactly the landed facts -- so without this the
|
|
93
|
+
* completion bridge would re-clear the overcome the verdict reopened, and the
|
|
94
|
+
* limbo self-heal would finalize the focus straight back to complete over it.
|
|
95
|
+
* qa_state stays failed until the team armed AFTER the fail finishes (the
|
|
96
|
+
* enter_focus_qa_on_team_finish trigger moves it to awaiting), so "work
|
|
97
|
+
* finished after the failed verdict" is precisely qa_state leaving failed; from
|
|
98
|
+
* then on the focus lands, clears and finalizes like any other.
|
|
99
|
+
* QA still gates nothing on the pass side: awaiting, passed and never-QA'd foci
|
|
100
|
+
* land on their delivery and branch facts alone (docs/DECISIONS.md 2026-10-26).
|
|
101
|
+
*/
|
|
102
|
+
export function qaHoldsFocusUnlanded(read) {
|
|
103
|
+
return read.kind === 'unreadable' || read.state === QA_STATE.FAILED;
|
|
104
|
+
}
|
|
83
105
|
/**
|
|
84
106
|
* Load the deliveries and branch containment of each focus and return those
|
|
85
107
|
* that have LANDED (computeCompletedFocusIds). Containment is read only for a
|
|
86
108
|
* focus whose deliveries could have landed, so a running focus costs no git.
|
|
109
|
+
* A focus a person failed at QA is not landed (qaHoldsFocusUnlanded); its QA is
|
|
110
|
+
* read only once its deliveries could have landed.
|
|
87
111
|
*/
|
|
88
112
|
export async function loadLandedFocusIds(focusIds, deps) {
|
|
89
113
|
const focusDeliveries = [];
|
|
90
114
|
const containment = new Map();
|
|
91
115
|
for (const fid of focusIds) {
|
|
92
116
|
const ds = await deps.loadFocusDeliveries(fid);
|
|
93
|
-
focusDeliveries.push(...ds);
|
|
94
117
|
if (judgeFocusLanded(ds.map((d) => d.executionStatus), 'contained') === 'landed') {
|
|
118
|
+
if (deps.loadFocusQa && qaHoldsFocusUnlanded(await deps.loadFocusQa(fid)))
|
|
119
|
+
continue;
|
|
95
120
|
containment.set(fid, await deps.readFocusBranchContainment(fid));
|
|
96
121
|
}
|
|
122
|
+
focusDeliveries.push(...ds);
|
|
97
123
|
}
|
|
98
124
|
return computeCompletedFocusIds(focusDeliveries, containment);
|
|
99
125
|
}
|