@telora/daemon 0.21.83 → 0.21.134
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 +10 -3
- package/dist/audit/audit-hooks.d.ts +106 -0
- package/dist/audit/audit-hooks.d.ts.map +1 -1
- package/dist/audit/audit-hooks.js +149 -17
- package/dist/audit/audit-hooks.js.map +1 -1
- package/dist/ci/ci-sensor-loop.d.ts +6 -0
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +50 -3
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/ci/ci-status.d.ts +63 -11
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +94 -27
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/completion/coverage-drift-state.d.ts +29 -2
- package/dist/completion/coverage-drift-state.d.ts.map +1 -1
- package/dist/completion/coverage-drift-state.js +42 -2
- package/dist/completion/coverage-drift-state.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts +58 -0
- package/dist/completion/coverage-stabilized.d.ts.map +1 -0
- package/dist/completion/coverage-stabilized.js +84 -0
- package/dist/completion/coverage-stabilized.js.map +1 -0
- package/dist/completion/delivery-advancement-guard.d.ts +21 -0
- package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
- package/dist/completion/delivery-advancement-guard.js +31 -3
- package/dist/completion/delivery-advancement-guard.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +15 -0
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +42 -4
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +10 -5
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +74 -0
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -0
- package/dist/completion/machine-remediable-demotion.js +147 -0
- package/dist/completion/machine-remediable-demotion.js.map +1 -0
- package/dist/completion/review-exit-escalations.d.ts +36 -1
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-escalations.js +81 -0
- package/dist/completion/review-exit-escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +4 -2
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +49 -54
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/settle-injection-sweep.d.ts +55 -0
- package/dist/completion/settle-injection-sweep.d.ts.map +1 -0
- package/dist/completion/settle-injection-sweep.js +88 -0
- package/dist/completion/settle-injection-sweep.js.map +1 -0
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +41 -0
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +28 -30
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts +42 -0
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +79 -2
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +19 -33
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +26 -160
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts +46 -0
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -0
- package/dist/delivery/delivery-merge-ops.js +154 -0
- package/dist/delivery/delivery-merge-ops.js.map +1 -0
- package/dist/delivery/delivery-reconciler-apply.d.ts +108 -66
- package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.js +87 -61
- package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +7 -2
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +34 -5
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/delivery/external-hold-surface.d.ts +32 -0
- package/dist/delivery/external-hold-surface.d.ts.map +1 -0
- package/dist/delivery/external-hold-surface.js +67 -0
- package/dist/delivery/external-hold-surface.js.map +1 -0
- package/dist/delivery/external-hold.d.ts +38 -0
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +69 -6
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +1 -2
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +1 -2
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/delivery/paused-revival.d.ts +140 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -0
- package/dist/delivery/paused-revival.js +229 -0
- package/dist/delivery/paused-revival.js.map +1 -0
- package/dist/delivery/wait-reachability.d.ts +149 -0
- package/dist/delivery/wait-reachability.d.ts.map +1 -0
- package/dist/delivery/wait-reachability.js +193 -0
- package/dist/delivery/wait-reachability.js.map +1 -0
- package/dist/directive/close-loop-dispatcher.d.ts +16 -263
- package/dist/directive/close-loop-dispatcher.d.ts.map +1 -1
- package/dist/directive/close-loop-dispatcher.js +21 -259
- package/dist/directive/close-loop-dispatcher.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts +19 -0
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +18 -0
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-executor.d.ts +1 -3
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +23 -21
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +28 -15
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +28 -36
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive/resolver-dispatch.d.ts +19 -92
- package/dist/directive/resolver-dispatch.d.ts.map +1 -1
- package/dist/directive/resolver-dispatch.js +19 -65
- package/dist/directive/resolver-dispatch.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +26 -0
- 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 +290 -256
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +43 -1
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus/focus-respawn-guard.js +11 -2
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts +11 -0
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +17 -0
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts +13 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +112 -76
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +141 -75
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/tick-deadline.d.ts +55 -0
- package/dist/focus/tick-deadline.d.ts.map +1 -0
- package/dist/focus/tick-deadline.js +91 -0
- package/dist/focus/tick-deadline.js.map +1 -0
- package/dist/focus-stage-lifecycle/index.d.ts +18 -25
- package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/index.js +26 -38
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts +52 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js +94 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +18 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +57 -7
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +12 -3
- package/dist/git/merge.js.map +1 -1
- package/dist/guard/condition-evaluators.d.ts +9 -0
- package/dist/guard/condition-evaluators.d.ts.map +1 -1
- package/dist/guard/condition-evaluators.js +15 -0
- package/dist/guard/condition-evaluators.js.map +1 -1
- package/dist/guard/guard-evaluator.d.ts +17 -1
- package/dist/guard/guard-evaluator.d.ts.map +1 -1
- package/dist/guard/guard-evaluator.js +61 -2
- package/dist/guard/guard-evaluator.js.map +1 -1
- package/dist/guard/trigger-executor.d.ts +30 -18
- package/dist/guard/trigger-executor.d.ts.map +1 -1
- package/dist/guard/trigger-executor.js +55 -31
- package/dist/guard/trigger-executor.js.map +1 -1
- package/dist/prompt/team-prompt-base.d.ts +1 -1
- package/dist/prompt/team-prompt-base.d.ts.map +1 -1
- package/dist/prompt/team-prompt-base.js +1 -1
- package/dist/prompt/team-prompt-base.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +0 -32
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +19 -88
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/queries/deliveries.d.ts +33 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +7 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +46 -0
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +60 -0
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/guards.d.ts +10 -0
- package/dist/queries/guards.d.ts.map +1 -1
- package/dist/queries/guards.js +14 -1
- package/dist/queries/guards.js.map +1 -1
- package/dist/queries/issues.d.ts +65 -1
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +135 -2
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/schemas.d.ts +53 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +38 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/verification.d.ts +5 -6
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +5 -6
- package/dist/queries/verification.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +1 -11
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +2 -16
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/shell/heartbeat.d.ts +7 -0
- package/dist/shell/heartbeat.d.ts.map +1 -1
- package/dist/shell/heartbeat.js +1 -1
- package/dist/shell/heartbeat.js.map +1 -1
- package/dist/shell/unified-shell-provisioning.d.ts +40 -0
- package/dist/shell/unified-shell-provisioning.d.ts.map +1 -1
- package/dist/shell/unified-shell-provisioning.js +72 -0
- package/dist/shell/unified-shell-provisioning.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +18 -1
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +6 -1
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +7 -0
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.d.ts +41 -0
- package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -0
- package/dist/spawn/respawn-cycle-escalation.js +83 -0
- package/dist/spawn/respawn-cycle-escalation.js.map +1 -0
- package/dist/spawn/spawn-cooldown.d.ts +119 -2
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +120 -10
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +33 -1
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/testing/fixtures/index.d.ts +64 -0
- package/dist/testing/fixtures/index.d.ts.map +1 -0
- package/dist/testing/fixtures/index.js +220 -0
- package/dist/testing/fixtures/index.js.map +1 -0
- package/dist/update/build-info.d.ts +1 -0
- package/dist/update/build-info.d.ts.map +1 -1
- package/dist/update/build-info.js +1 -1
- package/dist/update/build-info.js.map +1 -1
- package/dist/verify/stall-detector-config.d.ts +8 -0
- package/dist/verify/stall-detector-config.d.ts.map +1 -1
- package/dist/verify/stall-detector-config.js +40 -0
- package/dist/verify/stall-detector-config.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +57 -14
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +72 -55
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +3 -4
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +3 -12
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/workflow/gate-failure-policy.d.ts +48 -0
- package/dist/workflow/gate-failure-policy.d.ts.map +1 -0
- package/dist/workflow/gate-failure-policy.js +57 -0
- package/dist/workflow/gate-failure-policy.js.map +1 -0
- package/dist/workflow/pipeline-config.d.ts +2 -2
- package/dist/workflow/pipeline-config.js +2 -2
- package/package.json +3 -3
- package/dist/directive/close-loop-stage.d.ts +0 -50
- package/dist/directive/close-loop-stage.d.ts.map +0 -1
- package/dist/directive/close-loop-stage.js +0 -210
- package/dist/directive/close-loop-stage.js.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.d.ts +0 -133
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.js +0 -237
- package/dist/focus-stage-lifecycle/review-convergence.js.map +0 -1
package/build-info.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commitSha": "
|
|
3
|
-
"builtAt": "2026-08-
|
|
2
|
+
"commitSha": "527da95f0",
|
|
3
|
+
"builtAt": "2026-08-20T02:32:32.919Z",
|
|
4
4
|
"expectedMigrations": [
|
|
5
5
|
"20250829113330_create_org_nodes_table.sql",
|
|
6
6
|
"20250829113402_fix_function_security_search_path.sql",
|
|
@@ -753,6 +753,13 @@
|
|
|
753
753
|
"20260816162200_retention_sweep_recording.sql",
|
|
754
754
|
"20260816172138_fix_retention_sweep_ambiguous_column.sql",
|
|
755
755
|
"20260816181820_retention_enforced_by_heartbeat_derived.sql",
|
|
756
|
-
"20260817030910_server_now.sql"
|
|
756
|
+
"20260817030910_server_now.sql",
|
|
757
|
+
"20260818164401_add_review_handoff_count.sql",
|
|
758
|
+
"20260818164402_agent_escalations_kind_review_handoff_exhausted.sql",
|
|
759
|
+
"20260818164403_agent_escalations_kind_respawn_cycle_exhausted.sql",
|
|
760
|
+
"20260818201246_agent_escalations_kind_restore_promoted_add_propagation_stale.sql",
|
|
761
|
+
"20260819164725_iteration_count_exempt_instrument_fault.sql",
|
|
762
|
+
"20260819183306_add_durable_spawn_cooldown_columns.sql",
|
|
763
|
+
"20260819191559_add_durable_advancement_and_coverage_bounds.sql"
|
|
757
764
|
]
|
|
758
765
|
}
|
|
@@ -13,6 +13,111 @@
|
|
|
13
13
|
* `installExecutionWorktreeGuards` is the single entry point that applies the
|
|
14
14
|
* right set for a worktree given its read-only flag.
|
|
15
15
|
*/
|
|
16
|
+
import type { GitResult } from '../git/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* The git-runner seam. Defaults to the real `runGitSync`; tests inject a fake
|
|
19
|
+
* to drive the (otherwise hard-to-provoke) `extensions.worktreeConfig` /
|
|
20
|
+
* `--worktree` write-failure branches deterministically and to observe that no
|
|
21
|
+
* shared `core.hooksPath` write is ever attempted on any path.
|
|
22
|
+
*/
|
|
23
|
+
type GitRunner = (args: string[], cwd: string) => GitResult;
|
|
24
|
+
/**
|
|
25
|
+
* Point THIS worktree's git hooks at its own `.telora-hooks/` dir, scoped so it
|
|
26
|
+
* cannot depend on -- or govern -- any OTHER worktree of the same repository.
|
|
27
|
+
*
|
|
28
|
+
* A plain `git config core.hooksPath ...` writes the SHARED `.git/config`
|
|
29
|
+
* (verified 2026-08-18 on git 2.47.3: a value set from a linked worktree reads
|
|
30
|
+
* back from the main checkout), so one focus's ephemeral worktree would govern
|
|
31
|
+
* hook execution for the whole repo -- and when that worktree is removed, git
|
|
32
|
+
* runs NO hooks anywhere and the attribution guard silently disappears. Instead
|
|
33
|
+
* we enable `extensions.worktreeConfig` (repo-global, idempotent) and write
|
|
34
|
+
* core.hooksPath with `git config --worktree`, so each worktree carries its own
|
|
35
|
+
* hooksPath and another worktree's create/reuse/removal cannot touch it.
|
|
36
|
+
*
|
|
37
|
+
* We NEVER write a shared `core.hooksPath` -- not even as a fallback. That write
|
|
38
|
+
* is the exact defect the migration/verification siblings exist to undo, and a
|
|
39
|
+
* fallback here would let the next provisioning cycle re-damage a repo the
|
|
40
|
+
* migration just repaired. So this fails CLOSED: if per-worktree scoping cannot
|
|
41
|
+
* be established (worktreeConfig will not enable, or the `--worktree` write
|
|
42
|
+
* fails), the repo's shared config is left untouched and this worktree simply
|
|
43
|
+
* runs WITHOUT the attribution guard.
|
|
44
|
+
*
|
|
45
|
+
* The enforcement self-check runs on EVERY path (there is no early return before
|
|
46
|
+
* it): on a failed path it finds the guard is not in effect and logs the loud
|
|
47
|
+
* "failing OPEN" WARN, which is how an unguarded worktree is reported.
|
|
48
|
+
*/
|
|
49
|
+
export declare function configureWorktreeHooksPath(worktreePath: string, hooksDir: string, runGit?: GitRunner): void;
|
|
50
|
+
/**
|
|
51
|
+
* Migrate away a stale, daemon-written SHARED `core.hooksPath` that a pre-0.21.62
|
|
52
|
+
* daemon wrote pointing into a daemon worktree's `.telora-hooks` dir -- an
|
|
53
|
+
* ephemeral agent worktree under `.telora/worktrees/`, or the persistent merge
|
|
54
|
+
* worktree under `.telora/merge-worktree/`.
|
|
55
|
+
*
|
|
56
|
+
* `f629f3e63` (2026-08-18) switched new writes to per-worktree config
|
|
57
|
+
* (`git config --worktree`, see configureWorktreeHooksPath), fixing the CAUSE but
|
|
58
|
+
* leaving every already-damaged repo damaged: nothing unsets the stale shared
|
|
59
|
+
* value. That value is the single cause of both faces of the defect --
|
|
60
|
+
* - while the worktree it names still exists, the guard is wrongly enforced in
|
|
61
|
+
* the MAIN checkout (where it was never meant to apply); and
|
|
62
|
+
* - once that worktree is deleted, git resolves a dangling hooksPath and runs
|
|
63
|
+
* NO hooks anywhere, so the attribution guard silently disappears.
|
|
64
|
+
* Removing the stale shared value resolves both.
|
|
65
|
+
*
|
|
66
|
+
* Conservative about ownership. We read the SHARED value SPECIFICALLY via
|
|
67
|
+
* `git config --local --get core.hooksPath` (which reads `.git/config` and
|
|
68
|
+
* EXCLUDES the per-worktree `config.worktree` scope) -- NOT the plain
|
|
69
|
+
* `git config --get`, which layers worktree config on top and could report (and
|
|
70
|
+
* then delete) a live per-worktree value. We act only when that shared value
|
|
71
|
+
* carries the daemon's own hooks-dir SIGNATURE -- a `.telora-hooks` directory
|
|
72
|
+
* inside this repo's `.telora/` tree (under `.telora/worktrees/` for an ephemeral
|
|
73
|
+
* agent worktree, or `.telora/merge-worktree/` for the persistent merge worktree).
|
|
74
|
+
* Recognising by that signature, not by an agent-worktree path prefix, is what
|
|
75
|
+
* reaches the persistent merge worktree's value. A `core.hooksPath` pointing
|
|
76
|
+
* anywhere else (husky, lefthook, a hand-rolled setup, or a non-hooks path under
|
|
77
|
+
* `.telora/`) is left strictly alone; we err toward leaving it.
|
|
78
|
+
*
|
|
79
|
+
* The unset applies whether or not the pointed-at directory still exists: an
|
|
80
|
+
* alive-but-stale path is exactly the wrongful-enforcement face and must also be
|
|
81
|
+
* cleared. Per-worktree (`--worktree`) values the current code writes are never
|
|
82
|
+
* touched -- `--local` does not read or write that scope. Idempotent: a repo with
|
|
83
|
+
* no matching shared value is a no-op.
|
|
84
|
+
*
|
|
85
|
+
* Returns the removed value (for logging/tests) or null when nothing was cleared.
|
|
86
|
+
*/
|
|
87
|
+
export declare function migrateStaleSharedHooksPath(repoPath: string): {
|
|
88
|
+
removed: string | null;
|
|
89
|
+
};
|
|
90
|
+
/** How a repo's EFFECTIVE core.hooksPath resolves, from the checkout it runs in. */
|
|
91
|
+
export type RepoHookEnforcementState = 'unset' | 'dangling' | 'enforced';
|
|
92
|
+
/**
|
|
93
|
+
* Classify the git-hook enforcement state a repo is actually IN, evaluated from
|
|
94
|
+
* the checkout `repoPath` names -- not the state just written at worktree
|
|
95
|
+
* provisioning (that is `verifyHookEnforcementInEffect`).
|
|
96
|
+
*
|
|
97
|
+
* This closes the blind spot that let a silent fail-open survive the fix written
|
|
98
|
+
* to prevent silent fail-open: `verifyHookEnforcementInEffect` only ever inspects
|
|
99
|
+
* a worktree the daemon just configured, so the one place enforcement is silently
|
|
100
|
+
* absent -- the main checkout that inherited a stale shared value -- is the one
|
|
101
|
+
* place it never looks.
|
|
102
|
+
*
|
|
103
|
+
* Reads the EFFECTIVE value with `git config --get core.hooksPath` (worktree
|
|
104
|
+
* config layered over shared -- what git will actually use in this directory), so
|
|
105
|
+
* it must be run in the directory whose state you want to judge (the main
|
|
106
|
+
* checkout, to see what the main checkout inherits).
|
|
107
|
+
*
|
|
108
|
+
* - unset -> no core.hooksPath configured. This is the CORRECT steady state
|
|
109
|
+
* for a main checkout after the stale-value migration; NOT a
|
|
110
|
+
* fault, no warning.
|
|
111
|
+
* - dangling -> configured but the directory does not exist. git runs NO hooks
|
|
112
|
+
* here: the attribution guard is failing OPEN. Logged as a loud
|
|
113
|
+
* WARN naming the repo, the resolved path, and the consequence.
|
|
114
|
+
* - enforced -> configured and the directory exists (live enforcement). Fine.
|
|
115
|
+
*
|
|
116
|
+
* Files NO escalation for any state: this is observable repo state the daemon
|
|
117
|
+
* resolves itself via migrateStaleSharedHooksPath (config gaps are state, not
|
|
118
|
+
* escalations).
|
|
119
|
+
*/
|
|
120
|
+
export declare function checkRepoHookEnforcementState(repoPath: string): RepoHookEnforcementState;
|
|
16
121
|
/**
|
|
17
122
|
* Install a pre-commit hook in a worktree that blocks all commits.
|
|
18
123
|
* Used for read-only audit sessions.
|
|
@@ -124,4 +229,5 @@ export declare function installDeliveryTrailerCommitMsgHook(worktreePath: string
|
|
|
124
229
|
* read-only guarantee.
|
|
125
230
|
*/
|
|
126
231
|
export declare function installExecutionWorktreeGuards(worktreePath: string, readOnly: boolean): void;
|
|
232
|
+
export {};
|
|
127
233
|
//# sourceMappingURL=audit-hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../../src/audit/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../../src/audit/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD;;;;;GAKG;AACH,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,SAAsB,GAC7B,IAAI,CAsBN;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA8CxF;AAED,oFAAoF;AACpF,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,wBAAwB,CAiBxF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAmCpE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA0BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA8BpE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAuE9E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAK5F"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* right set for a worktree given its read-only flag.
|
|
15
15
|
*/
|
|
16
16
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
17
|
-
import { join } from 'node:path';
|
|
17
|
+
import { basename, isAbsolute, join, resolve } from 'node:path';
|
|
18
18
|
import { runGitSync } from '../git/index.js';
|
|
19
19
|
import { buildClaudeSettings, mergeClaudeSettings } from '../templates/claude-settings.js';
|
|
20
20
|
import { ensureCodexConfigIgnoredInWorktree } from '../worktree/provision.js';
|
|
@@ -35,27 +35,37 @@ const CODEX_READ_ONLY_BLOCK_END = '# END TELORA CODEX READ-ONLY';
|
|
|
35
35
|
* core.hooksPath with `git config --worktree`, so each worktree carries its own
|
|
36
36
|
* hooksPath and another worktree's create/reuse/removal cannot touch it.
|
|
37
37
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
38
|
+
* We NEVER write a shared `core.hooksPath` -- not even as a fallback. That write
|
|
39
|
+
* is the exact defect the migration/verification siblings exist to undo, and a
|
|
40
|
+
* fallback here would let the next provisioning cycle re-damage a repo the
|
|
41
|
+
* migration just repaired. So this fails CLOSED: if per-worktree scoping cannot
|
|
42
|
+
* be established (worktreeConfig will not enable, or the `--worktree` write
|
|
43
|
+
* fails), the repo's shared config is left untouched and this worktree simply
|
|
44
|
+
* runs WITHOUT the attribution guard.
|
|
45
|
+
*
|
|
46
|
+
* The enforcement self-check runs on EVERY path (there is no early return before
|
|
47
|
+
* it): on a failed path it finds the guard is not in effect and logs the loud
|
|
48
|
+
* "failing OPEN" WARN, which is how an unguarded worktree is reported.
|
|
40
49
|
*/
|
|
41
|
-
function configureWorktreeHooksPath(worktreePath, hooksDir) {
|
|
50
|
+
export function configureWorktreeHooksPath(worktreePath, hooksDir, runGit = runGitSync) {
|
|
42
51
|
// extensions.worktreeConfig must be enabled before `git config --worktree`
|
|
43
52
|
// will accept a write; enabling it is repo-global and idempotent.
|
|
44
|
-
const enable =
|
|
53
|
+
const enable = runGit(['config', 'extensions.worktreeConfig', 'true'], worktreePath);
|
|
45
54
|
if (!enable.success) {
|
|
46
55
|
log.warn(`[audit-hooks] Could not enable extensions.worktreeConfig for ${worktreePath}: ` +
|
|
47
|
-
`${enable.error}.
|
|
48
|
-
`
|
|
49
|
-
|
|
50
|
-
return;
|
|
56
|
+
`${enable.error}. NOT writing a shared core.hooksPath (that would leak across ` +
|
|
57
|
+
`worktrees and undo the stale-value migration); this worktree will run WITHOUT ` +
|
|
58
|
+
`the attribution guard. Shared config left untouched.`);
|
|
51
59
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
else {
|
|
61
|
+
const set = runGit(['config', '--worktree', 'core.hooksPath', hooksDir], worktreePath);
|
|
62
|
+
if (!set.success) {
|
|
63
|
+
log.warn(`[audit-hooks] Could not set per-worktree core.hooksPath for ${worktreePath}: ` +
|
|
64
|
+
`${set.error}. NOT falling back to a shared core.hooksPath; this worktree will ` +
|
|
65
|
+
`run WITHOUT the attribution guard. Shared config left untouched.`);
|
|
66
|
+
}
|
|
57
67
|
}
|
|
58
|
-
verifyHookEnforcementInEffect(worktreePath, hooksDir);
|
|
68
|
+
verifyHookEnforcementInEffect(worktreePath, hooksDir, runGit);
|
|
59
69
|
}
|
|
60
70
|
/**
|
|
61
71
|
* Confirm the commit-msg guard is actually in force for a worktree: its resolved
|
|
@@ -63,8 +73,8 @@ function configureWorktreeHooksPath(worktreePath, hooksDir) {
|
|
|
63
73
|
* exists there. When enforcement is EXPECTED but not in effect, log a loud WARN
|
|
64
74
|
* -- the guard must not fail open unnoticed.
|
|
65
75
|
*/
|
|
66
|
-
function verifyHookEnforcementInEffect(worktreePath, hooksDir) {
|
|
67
|
-
const resolved =
|
|
76
|
+
function verifyHookEnforcementInEffect(worktreePath, hooksDir, runGit = runGitSync) {
|
|
77
|
+
const resolved = runGit(['config', '--get', 'core.hooksPath'], worktreePath);
|
|
68
78
|
const resolvedPath = resolved.success ? resolved.output.trim() : '';
|
|
69
79
|
const hookFile = join(hooksDir, 'commit-msg');
|
|
70
80
|
const hookPresent = existsSync(hookFile);
|
|
@@ -75,6 +85,128 @@ function verifyHookEnforcementInEffect(worktreePath, hooksDir) {
|
|
|
75
85
|
`commits in this worktree are not being checked.`);
|
|
76
86
|
}
|
|
77
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Migrate away a stale, daemon-written SHARED `core.hooksPath` that a pre-0.21.62
|
|
90
|
+
* daemon wrote pointing into a daemon worktree's `.telora-hooks` dir -- an
|
|
91
|
+
* ephemeral agent worktree under `.telora/worktrees/`, or the persistent merge
|
|
92
|
+
* worktree under `.telora/merge-worktree/`.
|
|
93
|
+
*
|
|
94
|
+
* `f629f3e63` (2026-08-18) switched new writes to per-worktree config
|
|
95
|
+
* (`git config --worktree`, see configureWorktreeHooksPath), fixing the CAUSE but
|
|
96
|
+
* leaving every already-damaged repo damaged: nothing unsets the stale shared
|
|
97
|
+
* value. That value is the single cause of both faces of the defect --
|
|
98
|
+
* - while the worktree it names still exists, the guard is wrongly enforced in
|
|
99
|
+
* the MAIN checkout (where it was never meant to apply); and
|
|
100
|
+
* - once that worktree is deleted, git resolves a dangling hooksPath and runs
|
|
101
|
+
* NO hooks anywhere, so the attribution guard silently disappears.
|
|
102
|
+
* Removing the stale shared value resolves both.
|
|
103
|
+
*
|
|
104
|
+
* Conservative about ownership. We read the SHARED value SPECIFICALLY via
|
|
105
|
+
* `git config --local --get core.hooksPath` (which reads `.git/config` and
|
|
106
|
+
* EXCLUDES the per-worktree `config.worktree` scope) -- NOT the plain
|
|
107
|
+
* `git config --get`, which layers worktree config on top and could report (and
|
|
108
|
+
* then delete) a live per-worktree value. We act only when that shared value
|
|
109
|
+
* carries the daemon's own hooks-dir SIGNATURE -- a `.telora-hooks` directory
|
|
110
|
+
* inside this repo's `.telora/` tree (under `.telora/worktrees/` for an ephemeral
|
|
111
|
+
* agent worktree, or `.telora/merge-worktree/` for the persistent merge worktree).
|
|
112
|
+
* Recognising by that signature, not by an agent-worktree path prefix, is what
|
|
113
|
+
* reaches the persistent merge worktree's value. A `core.hooksPath` pointing
|
|
114
|
+
* anywhere else (husky, lefthook, a hand-rolled setup, or a non-hooks path under
|
|
115
|
+
* `.telora/`) is left strictly alone; we err toward leaving it.
|
|
116
|
+
*
|
|
117
|
+
* The unset applies whether or not the pointed-at directory still exists: an
|
|
118
|
+
* alive-but-stale path is exactly the wrongful-enforcement face and must also be
|
|
119
|
+
* cleared. Per-worktree (`--worktree`) values the current code writes are never
|
|
120
|
+
* touched -- `--local` does not read or write that scope. Idempotent: a repo with
|
|
121
|
+
* no matching shared value is a no-op.
|
|
122
|
+
*
|
|
123
|
+
* Returns the removed value (for logging/tests) or null when nothing was cleared.
|
|
124
|
+
*/
|
|
125
|
+
export function migrateStaleSharedHooksPath(repoPath) {
|
|
126
|
+
// Read the SHARED value only. `--local` targets `.git/config` and never the
|
|
127
|
+
// per-worktree `config.worktree`, so a live `--worktree` value cannot be seen
|
|
128
|
+
// (or clobbered) here.
|
|
129
|
+
const read = runGitSync(['config', '--local', '--get', 'core.hooksPath'], repoPath);
|
|
130
|
+
if (!read.success) {
|
|
131
|
+
// Not set in the shared scope (git exits non-zero) -- nothing to migrate.
|
|
132
|
+
return { removed: null };
|
|
133
|
+
}
|
|
134
|
+
const value = read.output.trim();
|
|
135
|
+
if (!value)
|
|
136
|
+
return { removed: null };
|
|
137
|
+
// Resolve the value to an absolute path (git may have stored a relative one)
|
|
138
|
+
// and require it to carry the daemon's own hooks-dir SIGNATURE: a `.telora-hooks`
|
|
139
|
+
// directory inside THIS repo's `.telora/` tree. That recognises a daemon write
|
|
140
|
+
// wherever the worktree lives -- an ephemeral agent worktree
|
|
141
|
+
// (`.telora/worktrees/<name>/.telora-hooks`) OR the persistent merge worktree
|
|
142
|
+
// (`.telora/merge-worktree/.telora-hooks`), which the daemon configures the same
|
|
143
|
+
// way. Matching the `.telora-hooks` signature rather than the `.telora/worktrees/`
|
|
144
|
+
// path PREFIX is what reaches the merge-worktree value; because that worktree
|
|
145
|
+
// persists, its stale shared value would otherwise never resolve itself.
|
|
146
|
+
// Anything else is foreign (husky, lefthook, a hand-rolled setup, or a non-hooks
|
|
147
|
+
// path under `.telora/`); leave it alone.
|
|
148
|
+
const resolvedValue = isAbsolute(value) ? resolve(value) : resolve(repoPath, value);
|
|
149
|
+
const teloraRoot = resolve(repoPath, '.telora');
|
|
150
|
+
const underTelora = resolvedValue === teloraRoot || resolvedValue.startsWith(teloraRoot + '/');
|
|
151
|
+
const isDaemonHooksDir = underTelora && basename(resolvedValue) === '.telora-hooks';
|
|
152
|
+
if (!isDaemonHooksDir) {
|
|
153
|
+
return { removed: null };
|
|
154
|
+
}
|
|
155
|
+
const unset = runGitSync(['config', '--local', '--unset', 'core.hooksPath'], repoPath);
|
|
156
|
+
if (!unset.success) {
|
|
157
|
+
log.warn(`[audit-hooks] Failed to unset stale shared core.hooksPath='${value}' in ${repoPath}: ` +
|
|
158
|
+
`${unset.error}. The stale value remains and the guard may still misfire in the main checkout.`);
|
|
159
|
+
return { removed: null };
|
|
160
|
+
}
|
|
161
|
+
log.info(`[audit-hooks] Unset stale shared core.hooksPath='${value}' in ${repoPath}: it pointed inside ` +
|
|
162
|
+
`.telora/worktrees/ (a pre-0.21.62 daemon write). The main checkout no longer inherits a ` +
|
|
163
|
+
`dangling/leaked hooks path.`);
|
|
164
|
+
return { removed: value };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Classify the git-hook enforcement state a repo is actually IN, evaluated from
|
|
168
|
+
* the checkout `repoPath` names -- not the state just written at worktree
|
|
169
|
+
* provisioning (that is `verifyHookEnforcementInEffect`).
|
|
170
|
+
*
|
|
171
|
+
* This closes the blind spot that let a silent fail-open survive the fix written
|
|
172
|
+
* to prevent silent fail-open: `verifyHookEnforcementInEffect` only ever inspects
|
|
173
|
+
* a worktree the daemon just configured, so the one place enforcement is silently
|
|
174
|
+
* absent -- the main checkout that inherited a stale shared value -- is the one
|
|
175
|
+
* place it never looks.
|
|
176
|
+
*
|
|
177
|
+
* Reads the EFFECTIVE value with `git config --get core.hooksPath` (worktree
|
|
178
|
+
* config layered over shared -- what git will actually use in this directory), so
|
|
179
|
+
* it must be run in the directory whose state you want to judge (the main
|
|
180
|
+
* checkout, to see what the main checkout inherits).
|
|
181
|
+
*
|
|
182
|
+
* - unset -> no core.hooksPath configured. This is the CORRECT steady state
|
|
183
|
+
* for a main checkout after the stale-value migration; NOT a
|
|
184
|
+
* fault, no warning.
|
|
185
|
+
* - dangling -> configured but the directory does not exist. git runs NO hooks
|
|
186
|
+
* here: the attribution guard is failing OPEN. Logged as a loud
|
|
187
|
+
* WARN naming the repo, the resolved path, and the consequence.
|
|
188
|
+
* - enforced -> configured and the directory exists (live enforcement). Fine.
|
|
189
|
+
*
|
|
190
|
+
* Files NO escalation for any state: this is observable repo state the daemon
|
|
191
|
+
* resolves itself via migrateStaleSharedHooksPath (config gaps are state, not
|
|
192
|
+
* escalations).
|
|
193
|
+
*/
|
|
194
|
+
export function checkRepoHookEnforcementState(repoPath) {
|
|
195
|
+
const resolved = runGitSync(['config', '--get', 'core.hooksPath'], repoPath);
|
|
196
|
+
const resolvedPath = resolved.success ? resolved.output.trim() : '';
|
|
197
|
+
if (!resolvedPath) {
|
|
198
|
+
return 'unset';
|
|
199
|
+
}
|
|
200
|
+
const absPath = isAbsolute(resolvedPath) ? resolvedPath : resolve(repoPath, resolvedPath);
|
|
201
|
+
if (!existsSync(absPath)) {
|
|
202
|
+
log.warn(`[audit-hooks] Hook enforcement is failing OPEN in ${repoPath}: resolved ` +
|
|
203
|
+
`core.hooksPath='${resolvedPath}' points at a directory that does not exist, so git runs ` +
|
|
204
|
+
`NO hooks here and the attribution guard is not running. ` +
|
|
205
|
+
`(The stale-shared-value migration clears this when the value points inside .telora/worktrees/.)`);
|
|
206
|
+
return 'dangling';
|
|
207
|
+
}
|
|
208
|
+
return 'enforced';
|
|
209
|
+
}
|
|
78
210
|
/**
|
|
79
211
|
* Install a pre-commit hook in a worktree that blocks all commits.
|
|
80
212
|
* Used for read-only audit sessions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../../src/audit/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../../src/audit/audit-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
*/
|
|
43
43
|
import type { DaemonConfig } from '../types/index.js';
|
|
44
44
|
import { type CiStatusReader } from './ci-status.js';
|
|
45
|
+
/** Health-event code for a red integration run that has no team to route to. */
|
|
46
|
+
export declare const MERGE_HELD_NO_RECEIVER_CODE = "merge.held_no_receiver";
|
|
47
|
+
/** Test-only: clear the held-gate dedup state. */
|
|
48
|
+
export declare function __resetCiSensorHealthStateForTests(): void;
|
|
45
49
|
/** escalation_kind for a red CI run on integration. */
|
|
46
50
|
export declare const CI_RUN_RED_ESCALATION_KIND = "ci_run_red";
|
|
47
51
|
/** Minimal open-escalation row shape the sensor's dedup / resolve reads. */
|
|
@@ -134,6 +138,8 @@ export interface CiSensorTickCounts {
|
|
|
134
138
|
productsChecked: number;
|
|
135
139
|
escalationsFiled: number;
|
|
136
140
|
escalationsResolved: number;
|
|
141
|
+
/** Red integration runs surfaced as a held-merge-gate health event this tick. */
|
|
142
|
+
heldGatesSurfaced: number;
|
|
137
143
|
}
|
|
138
144
|
/**
|
|
139
145
|
* One CI-result sensor tick over every configured product. Per product: resolve
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-sensor-loop.d.ts","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAuD,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ci-sensor-loop.d.ts","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,9 +48,22 @@ import { getDeliveryContext, getActiveFocuses } from '../queries/deliveries.js';
|
|
|
48
48
|
import { readDeliveryTrailer, resolveRecordedMergeRange, listRangeCommits } from '../resolvers/shared/git-diff.js';
|
|
49
49
|
import { callApi } from '../queries/shared.js';
|
|
50
50
|
import { ciRunRedCauseKey } from '../queries/cause-key.js';
|
|
51
|
-
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS } from '@telora/daemon-core';
|
|
51
|
+
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, healthEvents } from '@telora/daemon-core';
|
|
52
52
|
import { createLogger } from '../shell/log.js';
|
|
53
53
|
const log = createLogger({ module: 'ci-sensor' });
|
|
54
|
+
/** Health-event code for a red integration run that has no team to route to. */
|
|
55
|
+
export const MERGE_HELD_NO_RECEIVER_CODE = 'merge.held_no_receiver';
|
|
56
|
+
/**
|
|
57
|
+
* Keys (`${productId}:${sha}`) already surfaced as a held-merge-gate health
|
|
58
|
+
* event, so the sensor emits once per red episode instead of every tick. Cleared
|
|
59
|
+
* per product when integration goes green (the gate is no longer held), so a
|
|
60
|
+
* later red re-surfaces. Module-level so it persists across ticks; reset in tests.
|
|
61
|
+
*/
|
|
62
|
+
const surfacedHeldGates = new Set();
|
|
63
|
+
/** Test-only: clear the held-gate dedup state. */
|
|
64
|
+
export function __resetCiSensorHealthStateForTests() {
|
|
65
|
+
surfacedHeldGates.clear();
|
|
66
|
+
}
|
|
54
67
|
/** escalation_kind for a red CI run on integration. */
|
|
55
68
|
export const CI_RUN_RED_ESCALATION_KIND = 'ci_run_red';
|
|
56
69
|
const OPEN_STATUSES = new Set(['pending', 'in_review']);
|
|
@@ -224,7 +237,7 @@ const defaultDeps = {
|
|
|
224
237
|
* failure on one product never aborts the others.
|
|
225
238
|
*/
|
|
226
239
|
export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
227
|
-
const counts = { productsChecked: 0, escalationsFiled: 0, escalationsResolved: 0 };
|
|
240
|
+
const counts = { productsChecked: 0, escalationsFiled: 0, escalationsResolved: 0, heldGatesSurfaced: 0 };
|
|
228
241
|
for (const product of config.products) {
|
|
229
242
|
const pc = configForProduct(config, product);
|
|
230
243
|
try {
|
|
@@ -244,7 +257,27 @@ export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
|
244
257
|
// unanchored agent_resolvable would be invisible forever (never
|
|
245
258
|
// ridden, never promoted); a direct needs_operator is exactly the
|
|
246
259
|
// inbox line this focus removes.
|
|
247
|
-
|
|
260
|
+
//
|
|
261
|
+
// But the held gate must not be SILENT (TEL-6): surface it as durable
|
|
262
|
+
// operator-visible STATE (a health event, not an escalation -- there is
|
|
263
|
+
// no human-only act to file, and the hold clears itself when a focus is
|
|
264
|
+
// armed or the run goes green). Emitted once per red episode; cleared
|
|
265
|
+
// when integration goes green below. This gives the held merge gate a
|
|
266
|
+
// receiver even with no focus to anchor an escalation to.
|
|
267
|
+
const heldKey = `${pc.productId}:${sha}`;
|
|
268
|
+
if (!surfacedHeldGates.has(heldKey)) {
|
|
269
|
+
surfacedHeldGates.add(heldKey);
|
|
270
|
+
counts.heldGatesSurfaced++;
|
|
271
|
+
healthEvents.emit({
|
|
272
|
+
severity: 'error',
|
|
273
|
+
source: `ci:${pc.productId}`,
|
|
274
|
+
code: MERGE_HELD_NO_RECEIVER_CODE,
|
|
275
|
+
message: `Integration '${pc.integrationBranch}' is RED at ${sha.slice(0, 12)} and the ` +
|
|
276
|
+
'merge gate is holding main out, but no armed focus owns the fix -- there is no ' +
|
|
277
|
+
'team to route it to. Arm a focus on this product (or push a green fix) to clear the hold.',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
log.warn(`CI red on ${pc.integrationBranch} @ ${sha.slice(0, 12)} but no armed focus to route the fix to; holding (merge gate still fail-closed, surfaced as ${MERGE_HELD_NO_RECEIVER_CODE}), will retry.`);
|
|
248
281
|
continue;
|
|
249
282
|
}
|
|
250
283
|
await deps.fileCiRedEscalation({ organizationId: pc.organizationId, productId: pc.productId, focusId, sha, branch: pc.integrationBranch });
|
|
@@ -255,6 +288,20 @@ export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
|
255
288
|
counts.escalationsResolved += await deps.resolveCiRedEscalations(pc.productId);
|
|
256
289
|
log.info(`integration green for product ${pc.productId} -- resolved open ci_run_red escalation(s).`);
|
|
257
290
|
}
|
|
291
|
+
// Integration green (any action -- 'resolve' OR 'none'): the held merge
|
|
292
|
+
// gate is no longer held, so clear any held-gate health state for this
|
|
293
|
+
// product and pair its resolution (TEL-6). A future red re-surfaces cleanly.
|
|
294
|
+
if (status === 'green') {
|
|
295
|
+
let clearedAny = false;
|
|
296
|
+
for (const key of surfacedHeldGates) {
|
|
297
|
+
if (key.startsWith(`${pc.productId}:`)) {
|
|
298
|
+
surfacedHeldGates.delete(key);
|
|
299
|
+
clearedAny = true;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (clearedAny)
|
|
303
|
+
healthEvents.resolveByCode(MERGE_HELD_NO_RECEIVER_CODE);
|
|
304
|
+
}
|
|
258
305
|
}
|
|
259
306
|
catch (err) {
|
|
260
307
|
log.warn(`tick failed for product ${product.id}: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAuB,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"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"}
|