instar 1.3.511 → 1.3.512

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.
Files changed (69) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +67 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +24 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/CoherenceJournal.d.ts +31 -1
  8. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  9. package/dist/core/CoherenceJournal.js +49 -2
  10. package/dist/core/CoherenceJournal.js.map +1 -1
  11. package/dist/core/JournalSyncApplier.d.ts.map +1 -1
  12. package/dist/core/JournalSyncApplier.js +18 -0
  13. package/dist/core/JournalSyncApplier.js.map +1 -1
  14. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  15. package/dist/core/PostUpdateMigrator.js +44 -0
  16. package/dist/core/PostUpdateMigrator.js.map +1 -1
  17. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  18. package/dist/core/devGatedFeatures.js +5 -0
  19. package/dist/core/devGatedFeatures.js.map +1 -1
  20. package/dist/core/types.d.ts +27 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/core/types.js.map +1 -1
  23. package/dist/monitoring/GreenPrAutoMerger.d.ts +188 -0
  24. package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -0
  25. package/dist/monitoring/GreenPrAutoMerger.js +393 -0
  26. package/dist/monitoring/GreenPrAutoMerger.js.map +1 -0
  27. package/dist/monitoring/GuardLatchStore.d.ts +134 -0
  28. package/dist/monitoring/GuardLatchStore.d.ts.map +1 -0
  29. package/dist/monitoring/GuardLatchStore.js +255 -0
  30. package/dist/monitoring/GuardLatchStore.js.map +1 -0
  31. package/dist/monitoring/MergeRunner.d.ts +126 -0
  32. package/dist/monitoring/MergeRunner.d.ts.map +1 -0
  33. package/dist/monitoring/MergeRunner.js +296 -0
  34. package/dist/monitoring/MergeRunner.js.map +1 -0
  35. package/dist/monitoring/floorDriftCanary.d.ts +88 -0
  36. package/dist/monitoring/floorDriftCanary.d.ts.map +1 -0
  37. package/dist/monitoring/floorDriftCanary.js +89 -0
  38. package/dist/monitoring/floorDriftCanary.js.map +1 -0
  39. package/dist/monitoring/greenPrAutomergeWiring.d.ts +73 -0
  40. package/dist/monitoring/greenPrAutomergeWiring.d.ts.map +1 -0
  41. package/dist/monitoring/greenPrAutomergeWiring.js +273 -0
  42. package/dist/monitoring/greenPrAutomergeWiring.js.map +1 -0
  43. package/dist/monitoring/greenPrLogic.d.ts +121 -0
  44. package/dist/monitoring/greenPrLogic.d.ts.map +1 -0
  45. package/dist/monitoring/greenPrLogic.js +198 -0
  46. package/dist/monitoring/greenPrLogic.js.map +1 -0
  47. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  48. package/dist/monitoring/guardManifest.js +12 -0
  49. package/dist/monitoring/guardManifest.js.map +1 -1
  50. package/dist/server/AgentServer.d.ts +2 -0
  51. package/dist/server/AgentServer.d.ts.map +1 -1
  52. package/dist/server/AgentServer.js +2 -0
  53. package/dist/server/AgentServer.js.map +1 -1
  54. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  55. package/dist/server/CapabilityIndex.js +16 -0
  56. package/dist/server/CapabilityIndex.js.map +1 -1
  57. package/dist/server/routes.d.ts +5 -0
  58. package/dist/server/routes.d.ts.map +1 -1
  59. package/dist/server/routes.js +112 -1
  60. package/dist/server/routes.js.map +1 -1
  61. package/dist/server/stopGate.d.ts +45 -0
  62. package/dist/server/stopGate.d.ts.map +1 -1
  63. package/dist/server/stopGate.js +74 -0
  64. package/dist/server/stopGate.js.map +1 -1
  65. package/package.json +1 -1
  66. package/scripts/safe-merge.mjs +449 -59
  67. package/src/data/builtin-manifest.json +64 -64
  68. package/upgrades/1.3.512.md +65 -0
  69. package/upgrades/side-effects/green-pr-automerge-enforcement.md +171 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * GreenPrAutoMerger — the background watcher that merges a green, mergeable,
3
+ * non-held PR this agent authored, surviving session death (Phase 7 becomes
4
+ * machinery, not memory). green-pr-automerge-enforcement R1–R11.
5
+ *
6
+ * Layer 1 (the guarantee). Ticks run ONLY on the multi-machine lease holder;
7
+ * the first tick after acquiring the lease is OBSERVE-ONLY (warm-up: seed hold
8
+ * memory, build the snapshot, read peer latches). At most one merge attempt per
9
+ * tick, single-flight with a liveness guarantee that survives a server restart
10
+ * (the MergeRunner owns the durable in-flight record + orphan reap). Everything
11
+ * that decides "is this change good" already happened upstream; safe-merge
12
+ * re-verifies at act time. Tier-0 supervision — the only discretionary call is
13
+ * hold/candidate status and its failure direction is fail-toward-skip.
14
+ *
15
+ * All I/O is injected (deps) so every decision path is unit-testable without gh,
16
+ * real processes, or a real lease.
17
+ */
18
+ import { EventEmitter } from 'node:events';
19
+ import { type PrSummary, type Episode, type BreakerState, type HoldMemoryEntry } from './greenPrLogic.js';
20
+ import type { GuardLatchStore } from './GuardLatchStore.js';
21
+ /** The arguments a merge attempt is launched with. */
22
+ export interface MergeAttempt {
23
+ pr: number;
24
+ headRefOid: string;
25
+ repo: string;
26
+ }
27
+ /** The classified result of a merge attempt (from the MergeRunner). */
28
+ export interface MergeRunResult {
29
+ /** safe-merge's classified result slug, e.g. merged / refused:* / error:* / already-merged / closed. */
30
+ outcome: string;
31
+ /** True only when an INDEPENDENT gh pr view confirmed MERGED (B10). */
32
+ confirmedMerged: boolean;
33
+ /** Set when the watcher hard-killed the child at the deadline. */
34
+ deadlineKilled?: boolean;
35
+ }
36
+ /**
37
+ * The act-path engine (Step 4): probes the safe-merge contract, records a
38
+ * durable in-flight attempt, spawns safe-merge in its own process group, hard-
39
+ * kills at the deadline, and independently confirms the merge. Injected so the
40
+ * orchestrator is testable; the real one lives in MergeRunner.ts.
41
+ */
42
+ export interface MergeRunner {
43
+ /** Probe `safe-merge --capabilities`; false → refuse to drive a legacy script. */
44
+ probeContract(): Promise<{
45
+ ok: boolean;
46
+ version?: number;
47
+ }>;
48
+ /** Run one merge attempt to completion (or deadline-kill). */
49
+ run(attempt: MergeAttempt): Promise<MergeRunResult>;
50
+ /** Reap any surviving orphan from a prior crash; re-verify PR state. Boot/warm-up only. */
51
+ reapOrphan(): Promise<{
52
+ reaped: boolean;
53
+ outcome?: string;
54
+ }>;
55
+ }
56
+ export interface ProtectedPathsVerdict {
57
+ touches: boolean;
58
+ unverifiable: boolean;
59
+ }
60
+ export interface GreenPrAutoMergerDeps {
61
+ holdsLease(): boolean;
62
+ leaseEpoch(): number;
63
+ /** The single oldest-first GraphQL list call. Throws → tick-failed canary. */
64
+ listOpenPrs(): Promise<PrSummary[]>;
65
+ /** Did this PR's diff touch protected paths? Enumerated to exhaustion. */
66
+ protectedPaths(pr: PrSummary): Promise<ProtectedPathsVerdict>;
67
+ /** Re-fetch hold-relevant + state fields immediately before acting. null → vanished. */
68
+ refetchPr(pr: number): Promise<Pick<PrSummary, 'title' | 'labels' | 'isDraft' | 'headRefOid'> & {
69
+ state: string;
70
+ } | null>;
71
+ /** gh api user login (async, never blocks boot). null → unresolved. */
72
+ resolveGhLogin(): Promise<string | null>;
73
+ /**
74
+ * Apply a `[HOLD: …]` title prefix to a PR via gh (the conversational-hold
75
+ * assist, R3). Returns whether it landed; the caller validated namespace + open.
76
+ */
77
+ applyHoldMarker(pr: number, reason: string): Promise<boolean>;
78
+ /** Re-fetch a PR's head namespace + open state for the /hold route's guard. */
79
+ holdEligible(pr: number): Promise<{
80
+ ok: boolean;
81
+ status?: number;
82
+ detail?: string;
83
+ }>;
84
+ runner: MergeRunner;
85
+ latches: Pick<GuardLatchStore, 'isMergeAllowed'>;
86
+ /** Raise/refresh the ONE aggregated attention item (machine-stable id). */
87
+ postAttentionAggregate(lines: string[]): Promise<void>;
88
+ /** Append one transition audit line. */
89
+ audit(event: Record<string, unknown>): void;
90
+ loadState(): GreenPrState;
91
+ saveState(state: GreenPrState): void;
92
+ now(): number;
93
+ }
94
+ export interface GreenPrSnapshotEntry {
95
+ pr: number;
96
+ headRefName: string;
97
+ headRefOid: string;
98
+ /** 'mergeable' | 'protected-paths' — Layer 2 routes protected to the operator. */
99
+ kind: 'mergeable' | 'protected-paths';
100
+ }
101
+ export interface GreenPrState {
102
+ lastTickAt?: number;
103
+ lastSuccessfulListAt?: number;
104
+ /** Lease epoch observed at the last acting tick — warm-up detection. */
105
+ lastActingEpoch?: number;
106
+ consecutiveWarmupOnlyTenures: number;
107
+ breaker: BreakerState;
108
+ /** Per-PR ladder episodes, keyed by PR number. */
109
+ episodes: Record<number, Episode>;
110
+ /** Hold-release debounce memory, keyed by PR number. */
111
+ holdMemory: Record<number, HoldMemoryEntry>;
112
+ /** Last-tick snapshot for Layer 2 (the stop-gate belt). */
113
+ snapshot: {
114
+ at: number;
115
+ entries: GreenPrSnapshotEntry[];
116
+ };
117
+ /** Cached gh identity resolution. */
118
+ identity?: {
119
+ login: string | null;
120
+ resolvedAt: number;
121
+ };
122
+ /** Episodes that gave up (surfaced via attention), for the aggregate. */
123
+ attentionLines?: string[];
124
+ }
125
+ export interface GreenPrAutoMergerConfig {
126
+ enabled?: boolean;
127
+ dryRun?: boolean;
128
+ tickIntervalMs?: number;
129
+ maxAttempts?: number;
130
+ maxRearmEpisodes?: number;
131
+ breakerThreshold?: number;
132
+ deadlineKillBreakerThreshold?: number;
133
+ busySkipBreakerThreshold?: number;
134
+ breakerCooldownMin?: number;
135
+ mergeTimeoutMs?: number;
136
+ mergeKillGraceMs?: number;
137
+ expectedGhLogin?: string;
138
+ identityRecheckTicks?: number;
139
+ holdReleaseTicks?: number;
140
+ staleHoldDays?: number;
141
+ /** The agent's branch namespace, e.g. "echo". */
142
+ agentNamespace: string;
143
+ repo: string;
144
+ backoffBaseMs?: number;
145
+ }
146
+ export declare function freshState(): GreenPrState;
147
+ export declare class GreenPrAutoMerger extends EventEmitter {
148
+ private readonly deps;
149
+ private readonly cfg;
150
+ private tickHandle;
151
+ private inFlight;
152
+ private tickCount;
153
+ /** Resolved at boot: does the timeout invariant hold? */
154
+ readonly invariantOk: boolean;
155
+ readonly invariantReason?: string;
156
+ constructor(deps: GreenPrAutoMergerDeps, cfg: GreenPrAutoMergerConfig);
157
+ start(): void;
158
+ stop(): void;
159
+ snapshot(): GreenPrState;
160
+ /**
161
+ * The /hold route's handler (R3): validate the PR is open + in this agent's
162
+ * namespace, then apply the marker via gh. Lease-INDEPENDENT — a hold
163
+ * originates wherever the session lives. Honest non-2xx on failure (a hold
164
+ * that silently failed to apply would be merged ~10 minutes later).
165
+ */
166
+ applyHold(pr: number, reason: string): Promise<{
167
+ ok: boolean;
168
+ status?: number;
169
+ detail?: string;
170
+ pr: number;
171
+ }>;
172
+ /** The cron / manual-trigger entry point. Lease-gated; single-flight; warm-up. */
173
+ tick(opts?: {
174
+ manual?: boolean;
175
+ }): Promise<{
176
+ acted: boolean;
177
+ reason: string;
178
+ }>;
179
+ private gather;
180
+ private act;
181
+ private recordOutcome;
182
+ private identityOk;
183
+ private warmupReap;
184
+ private refreshAggregate;
185
+ private breakerCfg;
186
+ private ladderCfg;
187
+ }
188
+ //# sourceMappingURL=GreenPrAutoMerger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GreenPrAutoMerger.d.ts","sourceRoot":"","sources":["../../src/monitoring/GreenPrAutoMerger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,393 @@
1
+ /**
2
+ * GreenPrAutoMerger — the background watcher that merges a green, mergeable,
3
+ * non-held PR this agent authored, surviving session death (Phase 7 becomes
4
+ * machinery, not memory). green-pr-automerge-enforcement R1–R11.
5
+ *
6
+ * Layer 1 (the guarantee). Ticks run ONLY on the multi-machine lease holder;
7
+ * the first tick after acquiring the lease is OBSERVE-ONLY (warm-up: seed hold
8
+ * memory, build the snapshot, read peer latches). At most one merge attempt per
9
+ * tick, single-flight with a liveness guarantee that survives a server restart
10
+ * (the MergeRunner owns the durable in-flight record + orphan reap). Everything
11
+ * that decides "is this change good" already happened upstream; safe-merge
12
+ * re-verifies at act time. Tier-0 supervision — the only discretionary call is
13
+ * hold/candidate status and its failure direction is fail-toward-skip.
14
+ *
15
+ * All I/O is injected (deps) so every decision path is unit-testable without gh,
16
+ * real processes, or a real lease.
17
+ */
18
+ import { EventEmitter } from 'node:events';
19
+ import { classifyCandidate, holdReasonOf, selectOldest, debounceHoldRelease, applyOutcome, maybeRearm, episodeEligible, freshBreaker, feedBreaker, breakerBlocking, validateTimeoutInvariant, } from './greenPrLogic.js';
20
+ const DEFAULTS = {
21
+ enabled: false,
22
+ dryRun: false,
23
+ tickIntervalMs: 600_000,
24
+ maxAttempts: 3,
25
+ maxRearmEpisodes: 3,
26
+ breakerThreshold: 3,
27
+ deadlineKillBreakerThreshold: 3,
28
+ busySkipBreakerThreshold: 3,
29
+ breakerCooldownMin: 60,
30
+ mergeTimeoutMs: 1_500_000,
31
+ mergeKillGraceMs: 60_000,
32
+ expectedGhLogin: '',
33
+ identityRecheckTicks: 6,
34
+ holdReleaseTicks: 2,
35
+ staleHoldDays: 7,
36
+ backoffBaseMs: 30_000,
37
+ };
38
+ export function freshState() {
39
+ return {
40
+ consecutiveWarmupOnlyTenures: 0,
41
+ breaker: freshBreaker(),
42
+ episodes: {},
43
+ holdMemory: {},
44
+ snapshot: { at: 0, entries: [] },
45
+ };
46
+ }
47
+ export class GreenPrAutoMerger extends EventEmitter {
48
+ deps;
49
+ cfg;
50
+ tickHandle = null;
51
+ inFlight = false;
52
+ tickCount = 0;
53
+ /** Resolved at boot: does the timeout invariant hold? */
54
+ invariantOk;
55
+ invariantReason;
56
+ constructor(deps, cfg) {
57
+ super();
58
+ this.deps = deps;
59
+ this.cfg = {
60
+ ...DEFAULTS,
61
+ ...cfg,
62
+ agentNamespace: cfg.agentNamespace,
63
+ repo: cfg.repo,
64
+ expectedGhLogin: cfg.expectedGhLogin ?? '',
65
+ };
66
+ const inv = validateTimeoutInvariant(this.cfg.busySkipBreakerThreshold, this.cfg.tickIntervalMs, this.cfg.mergeTimeoutMs, this.cfg.mergeKillGraceMs);
67
+ this.invariantOk = inv.ok;
68
+ this.invariantReason = inv.reason;
69
+ }
70
+ start() {
71
+ if (!this.cfg.enabled || this.tickHandle)
72
+ return;
73
+ if (!this.invariantOk) {
74
+ // Boot refusal must be LOUD (B24) — never start with an inverted invariant.
75
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'boot-refused-invariant', reason: this.invariantReason });
76
+ return;
77
+ }
78
+ // Warm-up + orphan reap happens on the first acting tick.
79
+ this.tickHandle = setInterval(() => { void this.tick(); }, this.cfg.tickIntervalMs);
80
+ if (typeof this.tickHandle.unref === 'function')
81
+ this.tickHandle.unref();
82
+ }
83
+ stop() {
84
+ if (this.tickHandle) {
85
+ clearInterval(this.tickHandle);
86
+ this.tickHandle = null;
87
+ }
88
+ }
89
+ snapshot() { return this.deps.loadState(); }
90
+ /**
91
+ * The /hold route's handler (R3): validate the PR is open + in this agent's
92
+ * namespace, then apply the marker via gh. Lease-INDEPENDENT — a hold
93
+ * originates wherever the session lives. Honest non-2xx on failure (a hold
94
+ * that silently failed to apply would be merged ~10 minutes later).
95
+ */
96
+ async applyHold(pr, reason) {
97
+ const elig = await this.deps.holdEligible(pr);
98
+ if (!elig.ok)
99
+ return { ok: false, status: elig.status ?? 404, detail: elig.detail ?? 'PR not eligible for hold', pr };
100
+ try {
101
+ const applied = await this.deps.applyHoldMarker(pr, reason);
102
+ if (!applied)
103
+ return { ok: false, status: 502, detail: 'gh failed to apply the hold marker', pr };
104
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'hold-applied', pr });
105
+ return { ok: true, pr };
106
+ }
107
+ catch (e) { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
108
+ return { ok: false, status: 502, detail: String(e?.message).slice(0, 200), pr };
109
+ }
110
+ }
111
+ /** The cron / manual-trigger entry point. Lease-gated; single-flight; warm-up. */
112
+ async tick(opts = {}) {
113
+ this.tickCount += 1;
114
+ const state = this.deps.loadState();
115
+ state.lastTickAt = this.deps.now();
116
+ // Lease gate (R10): ticks run only on the holder.
117
+ if (!safeBool(() => this.deps.holdsLease())) {
118
+ this.deps.saveState(state);
119
+ return { acted: false, reason: 'not-lease-holder' };
120
+ }
121
+ // Single-flight (R5): never overlap an in-flight attempt.
122
+ if (this.inFlight) {
123
+ state.breaker = feedBreaker(state.breaker, 'busy-skip', this.deps.now(), this.breakerCfg());
124
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'tick-skipped-busy' });
125
+ this.deps.saveState(state);
126
+ return { acted: false, reason: 'busy' };
127
+ }
128
+ // Dual-latch gate (R9): rollback / emergency-pause / unreadable → no merge.
129
+ const gate = this.deps.latches.isMergeAllowed();
130
+ if (!gate.allowed) {
131
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'tick-skipped-disabled', reason: gate.reason });
132
+ this.deps.saveState(state);
133
+ return { acted: false, reason: `disabled:${gate.reason}` };
134
+ }
135
+ // Breaker open within cooldown → skip.
136
+ if (breakerBlocking(state.breaker, this.deps.now(), this.cfg.breakerCooldownMin * 60_000)) {
137
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'tick-skipped-breaker-open' });
138
+ this.deps.saveState(state);
139
+ return { acted: false, reason: 'breaker-open' };
140
+ }
141
+ // Warm-up (R10): the first tick of a new lease tenure is OBSERVE-ONLY.
142
+ const epoch = safeNum(() => this.deps.leaseEpoch());
143
+ const isWarmup = state.lastActingEpoch !== epoch;
144
+ let candidates;
145
+ try {
146
+ candidates = await this.deps.listOpenPrs();
147
+ state.lastSuccessfulListAt = this.deps.now();
148
+ state.breaker = feedBreaker(state.breaker, 'reset', this.deps.now(), this.breakerCfg());
149
+ }
150
+ catch (e) { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
151
+ // Tick-failed canary (L5(b)): a failed/unparseable list call feeds the breaker.
152
+ state.breaker = feedBreaker(state.breaker, 'tick-failed', this.deps.now(), this.breakerCfg());
153
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'tick-failed', class: 'list', detail: String(e?.message).slice(0, 200) });
154
+ this.deps.saveState(state);
155
+ return { acted: false, reason: 'list-failed' };
156
+ }
157
+ // Build the candidate set (cheap fields) + the Layer-2 snapshot.
158
+ const { eligible, snapshotEntries } = await this.gather(candidates, state);
159
+ state.snapshot = { at: this.deps.now(), entries: snapshotEntries };
160
+ if (isWarmup) {
161
+ // Seed hold memory + snapshot + reap any orphan; begin merges next tick.
162
+ await this.warmupReap(state);
163
+ state.lastActingEpoch = epoch;
164
+ state.consecutiveWarmupOnlyTenures += 1;
165
+ if (state.consecutiveWarmupOnlyTenures >= 3) {
166
+ await this.refreshAggregate(state, [`waiting:lease-flap — ${state.consecutiveWarmupOnlyTenures} consecutive warm-up-only tenures (running, seeing PRs, never permitted to act)`]);
167
+ }
168
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'tick-warm-up', candidates: eligible.length });
169
+ this.deps.saveState(state);
170
+ return { acted: false, reason: 'warm-up' };
171
+ }
172
+ state.lastActingEpoch = epoch;
173
+ state.consecutiveWarmupOnlyTenures = 0;
174
+ const target = selectOldest(eligible);
175
+ if (!target) {
176
+ this.deps.saveState(state);
177
+ return { acted: false, reason: 'no-candidate' };
178
+ }
179
+ // Act (Step 4 engine). dryRun observes only.
180
+ if (this.cfg.dryRun) {
181
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'would-merge', pr: target.number, head: target.headRefOid });
182
+ this.deps.saveState(state);
183
+ return { acted: false, reason: 'dry-run' };
184
+ }
185
+ const acted = await this.act(target, state);
186
+ this.deps.saveState(state);
187
+ return { acted, reason: acted ? 'acted' : 'skipped' };
188
+ }
189
+ // ---- candidate gathering -----------------------------------------------
190
+ async gather(prs, state) {
191
+ const eligible = [];
192
+ const snapshotEntries = [];
193
+ const nowMs = this.deps.now();
194
+ for (const pr of prs) {
195
+ const verdict = classifyCandidate(pr, this.cfg.agentNamespace);
196
+ // Hold-release debounce (R3): a PR that WAS held resumes only after the
197
+ // marker is absent for holdReleaseTicks AND tickIntervalMs elapsed.
198
+ const heldNow = holdReasonOf(pr) !== null;
199
+ const deb = debounceHoldRelease(state.holdMemory[pr.number], heldNow, nowMs, this.cfg.holdReleaseTicks, this.cfg.tickIntervalMs);
200
+ if (deb.mem)
201
+ state.holdMemory[pr.number] = deb.mem;
202
+ else
203
+ delete state.holdMemory[pr.number];
204
+ if (!verdict.eligible) {
205
+ if (verdict.skip === 'held' && deb.transition === 'released') {
206
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'hold-released', pr: pr.number });
207
+ }
208
+ continue;
209
+ }
210
+ // verdict.eligible but the hold debounce may still hold it back this tick.
211
+ if (heldNow || !deb.resumeEligible)
212
+ continue;
213
+ // Protected-paths gate (enumerated to exhaustion).
214
+ let pp;
215
+ try {
216
+ pp = await this.deps.protectedPaths(pr);
217
+ }
218
+ catch { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
219
+ pp = { touches: false, unverifiable: true };
220
+ }
221
+ if (pp.unverifiable) {
222
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'waiting', class: 'protected-paths-unverifiable', pr: pr.number });
223
+ continue;
224
+ }
225
+ if (pp.touches) {
226
+ // Excluded from auto-merge; surfaced to the operator + included in the
227
+ // Layer-2 snapshot as the operator-routed variant (round-5/6).
228
+ snapshotEntries.push({ pr: pr.number, headRefName: pr.headRefName, headRefOid: pr.headRefOid, kind: 'protected-paths' });
229
+ await this.refreshAggregate(state, [`PR #${pr.number} is green but touches protected paths — it needs your manual review and merge`]);
230
+ continue;
231
+ }
232
+ eligible.push(pr);
233
+ snapshotEntries.push({ pr: pr.number, headRefName: pr.headRefName, headRefOid: pr.headRefOid, kind: 'mergeable' });
234
+ }
235
+ return { eligible, snapshotEntries };
236
+ }
237
+ // ---- act ----------------------------------------------------------------
238
+ async act(target, state) {
239
+ // Identity contract (R4): verify gh login matches expectedGhLogin (TTL cached).
240
+ const idOk = await this.identityOk(state);
241
+ if (idOk !== 'ok') {
242
+ this.deps.audit({ kind: 'green-pr-automerge', event: `skipped:${idOk}` });
243
+ return false;
244
+ }
245
+ // Episode ladder eligibility.
246
+ let ep = state.episodes[target.number];
247
+ if (ep && ep.headRefOid !== target.headRefOid) {
248
+ const re = maybeRearm(ep, target.headRefOid, this.ladderCfg());
249
+ if (re === null) {
250
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'gave-up-rearm-exhausted', pr: target.number });
251
+ return false;
252
+ }
253
+ ep = re;
254
+ state.episodes[target.number] = ep;
255
+ }
256
+ if (!episodeEligible(ep, this.deps.now()))
257
+ return false;
258
+ // Contract probe BEFORE every attempt (round-3: mid-run checkout swap).
259
+ const probe = await this.deps.runner.probeContract();
260
+ if (!probe.ok) {
261
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'skipped:safe-merge-contract' });
262
+ return false;
263
+ }
264
+ // Re-fetch hold/state immediately before acting (R3 residual window bound).
265
+ const live = await this.deps.refetchPr(target.number);
266
+ if (!live) {
267
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'skipped:vanished', pr: target.number });
268
+ return false;
269
+ }
270
+ if (live.state !== 'OPEN') {
271
+ this.recordOutcome(state, target, live.state === 'MERGED' ? 'merged-by-other' : 'closed-by-other');
272
+ return false;
273
+ }
274
+ if (live.isDraft || holdReasonOf({ isDraft: live.isDraft, title: live.title, labels: live.labels })) {
275
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'skipped:held-on-refetch', pr: target.number });
276
+ return false;
277
+ }
278
+ if (live.headRefOid !== target.headRefOid) {
279
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'skipped:head-moved', pr: target.number });
280
+ return false;
281
+ }
282
+ // Single-flight + spawn (the MergeRunner owns the durable in-flight record).
283
+ this.inFlight = true;
284
+ let result;
285
+ try {
286
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'merge-attempted', pr: target.number, head: target.headRefOid });
287
+ result = await this.deps.runner.run({ pr: target.number, headRefOid: target.headRefOid, repo: this.cfg.repo });
288
+ }
289
+ catch (e) { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
290
+ result = { outcome: `error:runner-${String(e?.message).slice(0, 40)}`, confirmedMerged: false };
291
+ }
292
+ finally {
293
+ this.inFlight = false;
294
+ }
295
+ if (result.deadlineKilled) {
296
+ state.breaker = feedBreaker(state.breaker, 'deadline-kill', this.deps.now(), this.breakerCfg());
297
+ }
298
+ // B10: classify "merged" ONLY on independent confirmation.
299
+ const outcome = result.outcome === 'merged' && !result.confirmedMerged ? 'error:merge-unconfirmed' : result.outcome;
300
+ this.recordOutcome(state, target, outcome);
301
+ return outcome === 'merged';
302
+ }
303
+ recordOutcome(state, target, outcome) {
304
+ const ep = state.episodes[target.number] ?? { pr: target.number, headRefOid: target.headRefOid, attempts: 0, rearmEpisodes: 0, state: 'active' };
305
+ const folded = applyOutcome(ep, outcome, this.deps.now(), this.ladderCfg());
306
+ state.episodes[target.number] = folded.ep;
307
+ if (folded.feedsBreaker) {
308
+ // Per-PR ladder failures do NOT feed the global breaker directly (that is
309
+ // for tick/deadline/busy classes); they advance the per-PR ladder only.
310
+ }
311
+ this.deps.audit({ kind: 'green-pr-automerge', event: outcome, pr: target.number });
312
+ if (outcome === 'merged') {
313
+ // Reap the episode on success.
314
+ delete state.episodes[target.number];
315
+ }
316
+ else if (folded.ep.state === 'gave-up' && outcome !== 'merged-by-other' && outcome !== 'closed-by-other') {
317
+ void this.refreshAggregate(state, [`PR #${target.number} could not be auto-merged after ${folded.ep.attempts} attempts (${outcome}) — needs a look`]);
318
+ }
319
+ else if (outcome === 'closed-by-other') {
320
+ void this.refreshAggregate(state, [`PR #${target.number} was closed without merging — discarded work`]);
321
+ }
322
+ }
323
+ // ---- identity (R4) ------------------------------------------------------
324
+ async identityOk(state) {
325
+ if (!this.cfg.expectedGhLogin)
326
+ return 'identity-unconfigured';
327
+ const ttlMs = this.cfg.identityRecheckTicks * this.cfg.tickIntervalMs;
328
+ const cached = state.identity;
329
+ const fresh = cached && (this.deps.now() - cached.resolvedAt) < ttlMs;
330
+ let login = fresh ? cached.login : null;
331
+ if (!fresh) {
332
+ login = await this.deps.resolveGhLogin();
333
+ state.identity = { login, resolvedAt: this.deps.now() };
334
+ }
335
+ if (login === null)
336
+ return 'identity-unresolved';
337
+ if (login !== this.cfg.expectedGhLogin)
338
+ return 'identity-mismatch';
339
+ return 'ok';
340
+ }
341
+ // ---- warm-up orphan reap (R5) ------------------------------------------
342
+ async warmupReap(state) {
343
+ try {
344
+ const r = await this.deps.runner.reapOrphan();
345
+ if (r.reaped)
346
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'orphan-reaped', outcome: r.outcome });
347
+ }
348
+ catch (e) { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
349
+ this.deps.audit({ kind: 'green-pr-automerge', event: 'orphan-reap-incomplete', detail: String(e?.message).slice(0, 120) });
350
+ }
351
+ }
352
+ // ---- aggregated attention (P17) ----------------------------------------
353
+ async refreshAggregate(state, addLines) {
354
+ const lines = new Set([...(state.attentionLines ?? []), ...addLines]);
355
+ state.attentionLines = [...lines].slice(-50);
356
+ try {
357
+ await this.deps.postAttentionAggregate(state.attentionLines);
358
+ }
359
+ catch { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */ /* attention delivery failure is non-fatal to the tick */ }
360
+ }
361
+ // ---- runtime control (R9, via GuardLatchStore wired at boot) ------------
362
+ // rollback / enable / pool-disarm are driven through the routes against the
363
+ // GuardLatchStore directly; the watcher only READS the gate each tick.
364
+ breakerCfg() {
365
+ return {
366
+ busySkipBreakerThreshold: this.cfg.busySkipBreakerThreshold,
367
+ deadlineKillBreakerThreshold: this.cfg.deadlineKillBreakerThreshold,
368
+ breakerThreshold: this.cfg.breakerThreshold,
369
+ breakerCooldownMs: this.cfg.breakerCooldownMin * 60_000,
370
+ };
371
+ }
372
+ ladderCfg() {
373
+ return { maxAttempts: this.cfg.maxAttempts, maxRearmEpisodes: this.cfg.maxRearmEpisodes, backoffBaseMs: this.cfg.backoffBaseMs };
374
+ }
375
+ }
376
+ function safeBool(fn) {
377
+ try {
378
+ return !!fn();
379
+ }
380
+ catch { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
381
+ return false;
382
+ }
383
+ }
384
+ function safeNum(fn) {
385
+ try {
386
+ const n = fn();
387
+ return Number.isFinite(n) ? n : 0;
388
+ }
389
+ catch { /* @silent-fallback-ok: green-pr-automerge fail-safe — skip/refuse, never over-merge; safe-merge is the act-time authority */
390
+ return 0;
391
+ }
392
+ }
393
+ //# sourceMappingURL=GreenPrAutoMerger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GreenPrAutoMerger.js","sourceRoot":"","sources":["../../src/monitoring/GreenPrAutoMerger.ts"],"names":[],"mappings":"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"}