@mobrienv/autoloop-harness 0.8.0 → 0.9.2

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 (116) hide show
  1. package/dist/acceptance.d.ts +31 -0
  2. package/dist/acceptance.js +69 -0
  3. package/dist/acceptance.js.map +1 -0
  4. package/dist/ask.d.ts +16 -0
  5. package/dist/ask.js +47 -0
  6. package/dist/ask.js.map +1 -0
  7. package/dist/backend/types.d.ts +3 -0
  8. package/dist/backend/types.js +3 -0
  9. package/dist/backend/types.js.map +1 -1
  10. package/dist/circuit-breaker.d.ts +27 -0
  11. package/dist/circuit-breaker.js +41 -0
  12. package/dist/circuit-breaker.js.map +1 -0
  13. package/dist/completion-lint.d.ts +29 -0
  14. package/dist/completion-lint.js +51 -0
  15. package/dist/completion-lint.js.map +1 -0
  16. package/dist/config-helpers.js +141 -8
  17. package/dist/config-helpers.js.map +1 -1
  18. package/dist/control/command-adapter.d.ts +19 -0
  19. package/dist/control/command-adapter.js +57 -0
  20. package/dist/control/command-adapter.js.map +1 -0
  21. package/dist/control/dispatch.js +14 -0
  22. package/dist/control/dispatch.js.map +1 -1
  23. package/dist/control/types.d.ts +11 -2
  24. package/dist/display.d.ts +9 -2
  25. package/dist/display.js +37 -1
  26. package/dist/display.js.map +1 -1
  27. package/dist/emit.d.ts +27 -0
  28. package/dist/emit.js +321 -2
  29. package/dist/emit.js.map +1 -1
  30. package/dist/events.d.ts +36 -3
  31. package/dist/fanout-runner.d.ts +25 -0
  32. package/dist/fanout-runner.js +54 -0
  33. package/dist/fanout-runner.js.map +1 -0
  34. package/dist/file-mod-audit.d.ts +29 -0
  35. package/dist/file-mod-audit.js +63 -0
  36. package/dist/file-mod-audit.js.map +1 -0
  37. package/dist/git-diff.d.ts +19 -0
  38. package/dist/git-diff.js +74 -0
  39. package/dist/git-diff.js.map +1 -0
  40. package/dist/hooks.d.ts +78 -0
  41. package/dist/hooks.js +239 -0
  42. package/dist/hooks.js.map +1 -0
  43. package/dist/index.d.ts +15 -2
  44. package/dist/index.js +181 -5
  45. package/dist/index.js.map +1 -1
  46. package/dist/intent.d.ts +45 -0
  47. package/dist/intent.js +127 -0
  48. package/dist/intent.js.map +1 -0
  49. package/dist/iteration-diff.d.ts +32 -0
  50. package/dist/iteration-diff.js +92 -0
  51. package/dist/iteration-diff.js.map +1 -0
  52. package/dist/iteration.d.ts +20 -0
  53. package/dist/iteration.js +383 -16
  54. package/dist/iteration.js.map +1 -1
  55. package/dist/metareview.d.ts +9 -1
  56. package/dist/metareview.js +68 -30
  57. package/dist/metareview.js.map +1 -1
  58. package/dist/notify.d.ts +9 -2
  59. package/dist/notify.js +16 -4
  60. package/dist/notify.js.map +1 -1
  61. package/dist/parallel.d.ts +16 -0
  62. package/dist/parallel.js +28 -1
  63. package/dist/parallel.js.map +1 -1
  64. package/dist/postconditions.d.ts +25 -0
  65. package/dist/postconditions.js +107 -0
  66. package/dist/postconditions.js.map +1 -0
  67. package/dist/postfire-verify.d.ts +31 -0
  68. package/dist/postfire-verify.js +64 -0
  69. package/dist/postfire-verify.js.map +1 -0
  70. package/dist/premature-quit.d.ts +25 -0
  71. package/dist/premature-quit.js +54 -0
  72. package/dist/premature-quit.js.map +1 -0
  73. package/dist/progress.d.ts +20 -0
  74. package/dist/progress.js +56 -0
  75. package/dist/progress.js.map +1 -0
  76. package/dist/prompt.js +8 -2
  77. package/dist/prompt.js.map +1 -1
  78. package/dist/provisional.d.ts +42 -0
  79. package/dist/provisional.js +92 -0
  80. package/dist/provisional.js.map +1 -0
  81. package/dist/registry-bridge.js +25 -0
  82. package/dist/registry-bridge.js.map +1 -1
  83. package/dist/resume.d.ts +61 -0
  84. package/dist/resume.js +226 -0
  85. package/dist/resume.js.map +1 -0
  86. package/dist/scratchpad.js +27 -8
  87. package/dist/scratchpad.js.map +1 -1
  88. package/dist/stage.d.ts +21 -0
  89. package/dist/stage.js +131 -0
  90. package/dist/stage.js.map +1 -0
  91. package/dist/stop.d.ts +29 -2
  92. package/dist/stop.js +106 -0
  93. package/dist/stop.js.map +1 -1
  94. package/dist/suspend-state.d.ts +32 -0
  95. package/dist/suspend-state.js +104 -0
  96. package/dist/suspend-state.js.map +1 -0
  97. package/dist/tamper.d.ts +21 -0
  98. package/dist/tamper.js +88 -0
  99. package/dist/tamper.js.map +1 -0
  100. package/dist/types.d.ts +247 -2
  101. package/dist/types.js +91 -1
  102. package/dist/types.js.map +1 -1
  103. package/dist/wave/finalize-wave.d.ts +15 -5
  104. package/dist/wave/finalize-wave.js +56 -2
  105. package/dist/wave/finalize-wave.js.map +1 -1
  106. package/dist/wave/launch-branches.d.ts +23 -2
  107. package/dist/wave/launch-branches.js +56 -3
  108. package/dist/wave/launch-branches.js.map +1 -1
  109. package/dist/wave/stage-branch-runner.d.ts +12 -0
  110. package/dist/wave/stage-branch-runner.js +130 -0
  111. package/dist/wave/stage-branch-runner.js.map +1 -0
  112. package/dist/wave/types.d.ts +40 -2
  113. package/dist/wave.d.ts +32 -1
  114. package/dist/wave.js +163 -34
  115. package/dist/wave.js.map +1 -1
  116. package/package.json +83 -3
package/dist/stop.js CHANGED
@@ -48,6 +48,31 @@ export function stopBackendFailed(loop, iteration, output) {
48
48
  registryStop(loop, iteration, "backend_failed");
49
49
  return { iterations: iteration, stopReason: "backend_failed" };
50
50
  }
51
+ /**
52
+ * Stop with a typed backend-error reason (rate_limited / quota_exhausted /
53
+ * auth_failed / transient_error) instead of a generic backend_failed, so the
54
+ * disposition reflects an availability/auth/quota issue rather than an agent
55
+ * failure — and downstream (retry ladder, quarantine) can key off it.
56
+ */
57
+ export function stopBackendErrorClass(loop, iteration, reason, output) {
58
+ log(loop, "error", `loop stop reason=${reason} iteration=${iteration}`);
59
+ loop.onEvent?.({
60
+ type: "progress",
61
+ runId: loop.runtime.runId,
62
+ iteration,
63
+ recentEvent: "loop.stop",
64
+ allowedRoles: [],
65
+ outcome: `stop:${reason}`,
66
+ });
67
+ loop.onEvent?.({ type: "failure.diagnostic", output, stopReason: reason });
68
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "loop.stop", jsonField("reason", reason) +
69
+ ", " +
70
+ jsonField("iteration", String(iteration)) +
71
+ ", " +
72
+ jsonField("output_tail", lastNChars(output, 500)));
73
+ registryStop(loop, iteration, reason);
74
+ return { iterations: iteration, stopReason: reason };
75
+ }
51
76
  export function stopBackendTimeout(loop, iteration, output) {
52
77
  log(loop, "error", `loop stop reason=backend_timeout iteration=${iteration}`);
53
78
  loop.onEvent?.({
@@ -135,6 +160,87 @@ export function stopMaxRuntime(loop, completed, elapsedMs, maxRuntimeMs, outputT
135
160
  registryStop(loop, completed, "max_runtime");
136
161
  return { iterations: completed, stopReason: "max_runtime" };
137
162
  }
163
+ /**
164
+ * Fail-closed stop for an UNKNOWN metareview verdict under `on_error = hold`.
165
+ * The reviewer gave no trustworthy signal, so the loop halts and raises
166
+ * attention (failure.diagnostic + notify-class "failed") instead of silently
167
+ * advancing — a human decides whether to resume.
168
+ */
169
+ export function stopReviewUnknown(loop, iteration, reasoning) {
170
+ log(loop, "warn", `loop stop reason=review_unknown iteration=${iteration} detail=${reasoning}`);
171
+ loop.onEvent?.({
172
+ type: "progress",
173
+ runId: loop.runtime.runId,
174
+ iteration,
175
+ recentEvent: "loop.stop",
176
+ allowedRoles: [],
177
+ outcome: "stop:review_unknown",
178
+ });
179
+ loop.onEvent?.({
180
+ type: "failure.diagnostic",
181
+ output: `Metareview returned UNKNOWN and held the loop: ${reasoning}`,
182
+ stopReason: "review_unknown",
183
+ });
184
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "loop.stop", jsonField("reason", "review_unknown") +
185
+ ", " +
186
+ jsonField("iteration", String(iteration)) +
187
+ ", " +
188
+ jsonField("detail", reasoning));
189
+ registryStop(loop, iteration, "review_unknown");
190
+ return { iterations: iteration, stopReason: "review_unknown" };
191
+ }
192
+ /**
193
+ * Escalate a premature quit that exhausted its re-arm budget: stop with a
194
+ * distinct reason and raise attention rather than silently accepting a
195
+ * false-finish that left authorized work undone.
196
+ */
197
+ export function stopPrematureQuit(loop, completed, reasons) {
198
+ log(loop, "warn", `loop stop reason=premature_quit completed_iterations=${completed} remaining=${reasons.join("; ")}`);
199
+ loop.onEvent?.({
200
+ type: "progress",
201
+ runId: loop.runtime.runId,
202
+ iteration: completed,
203
+ recentEvent: "loop.stop",
204
+ allowedRoles: [],
205
+ outcome: "stop:premature_quit",
206
+ });
207
+ loop.onEvent?.({
208
+ type: "failure.diagnostic",
209
+ output: `Premature quit: authorized work remained with no blocker and the re-arm budget was exhausted.\nRemaining:\n- ${reasons.join("\n- ")}`,
210
+ stopReason: "premature_quit",
211
+ });
212
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, "", "loop.stop", jsonField("reason", "premature_quit") +
213
+ ", " +
214
+ jsonField("completed_iterations", String(completed)) +
215
+ ", " +
216
+ jsonField("remaining", reasons.join("; ")));
217
+ registryStop(loop, completed, "premature_quit");
218
+ return { iterations: completed, stopReason: "premature_quit" };
219
+ }
220
+ /**
221
+ * Stop for a `suspend`-policy hook that fired and could not (or was not
222
+ * configured to) block in-process. Durable suspend state has already been
223
+ * written by the hooks engine (`writeSuspendState`); this only journals the
224
+ * typed stop reason and registry status so `autoloop resume` can pick it up.
225
+ */
226
+ export function stopSuspended(loop, iteration, reason) {
227
+ log(loop, "warn", `loop stop reason=suspended iteration=${iteration} detail=${reason}`);
228
+ loop.onEvent?.({
229
+ type: "progress",
230
+ runId: loop.runtime.runId,
231
+ iteration,
232
+ recentEvent: "loop.stop",
233
+ allowedRoles: [],
234
+ outcome: "stop:suspended",
235
+ });
236
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "loop.stop", jsonField("reason", "suspended") +
237
+ ", " +
238
+ jsonField("iteration", String(iteration)) +
239
+ ", " +
240
+ jsonField("detail", reason));
241
+ registryStop(loop, iteration, "suspended");
242
+ return { iterations: iteration, stopReason: "suspended" };
243
+ }
138
244
  export function completeLoop(loop, iteration, reason) {
139
245
  log(loop, "info", `loop complete reason=${reason}`);
140
246
  appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "loop.complete", jsonField("reason", reason));
package/dist/stop.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stop.js","sourceRoot":"","sources":["../src/stop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../src/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { SUSPEND_STATE_SCHEMA_VERSION, type SuspendState } from "@mobrienv/autoloop-core/hooks-schema";
2
+ export type { SuspendState };
3
+ export { SUSPEND_STATE_SCHEMA_VERSION };
4
+ export declare function suspendStatePath(stateDir: string): string;
5
+ export declare function resumeRequestPath(stateDir: string): string;
6
+ /**
7
+ * Write the suspend state atomically (tmp file + rename) so a reader never
8
+ * observes a torn write, and journal `hook.suspend` for observability.
9
+ */
10
+ export declare function writeSuspendState(stateDir: string, state: Omit<SuspendState, "schemaVersion">, journalFile?: string): SuspendState;
11
+ /** Read the durable suspend state, or null when absent/unreadable/invalid. */
12
+ export declare function readSuspendState(stateDir: string): SuspendState | null;
13
+ /** Remove the suspend-state file. No-op if absent. */
14
+ export declare function clearSuspendState(stateDir: string): boolean;
15
+ /** Drop the resume-requested signal file (operator says "go"). */
16
+ export declare function requestResume(stateDir: string): void;
17
+ export declare function resumeRequested(stateDir: string): boolean;
18
+ /** Remove the resume-requested signal file. No-op if absent. */
19
+ export declare function clearResumeRequest(stateDir: string): boolean;
20
+ export interface WaitForResumeOptions {
21
+ pollMs?: number;
22
+ /** Abort signal, honoured the same way `ask.ts:awaitHumanResponse` does. */
23
+ signal?: AbortSignal;
24
+ /** Optional wall-clock cap in ms; 0/undefined = wait indefinitely. */
25
+ timeoutMs?: number;
26
+ }
27
+ /**
28
+ * Block until `resume-requested` appears, the run is aborted, or (if set)
29
+ * `timeoutMs` elapses. Returns `true` when resumed, `false` on abort/timeout.
30
+ * Mirrors `ask.ts:awaitHumanResponse`'s signal-aware poll loop.
31
+ */
32
+ export declare function waitForResume(stateDir: string, opts?: WaitForResumeOptions): Promise<boolean>;
@@ -0,0 +1,104 @@
1
+ // Durable suspend/resume signalling for the lifecycle hooks engine.
2
+ //
3
+ // `on_error = "suspend"` writes a versioned `.autoloop/suspend-state.json`
4
+ // and (for in-process phases) blocks the harness until an operator drops
5
+ // `.autoloop/resume-requested` (or `autoloop hooks clear-suspend` / `resume`
6
+ // clears it). This lets a hook halt the loop for out-of-band remediation
7
+ // (e.g. a human approval gate) without losing the run's position.
8
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
9
+ import { dirname, join } from "node:path";
10
+ import { jsonField } from "@mobrienv/autoloop-core";
11
+ import { isSuspendState, SUSPEND_STATE_SCHEMA_VERSION, } from "@mobrienv/autoloop-core/hooks-schema";
12
+ import { appendEvent } from "@mobrienv/autoloop-core/journal";
13
+ export { SUSPEND_STATE_SCHEMA_VERSION };
14
+ export function suspendStatePath(stateDir) {
15
+ return join(stateDir, "suspend-state.json");
16
+ }
17
+ export function resumeRequestPath(stateDir) {
18
+ return join(stateDir, "resume-requested");
19
+ }
20
+ /**
21
+ * Write the suspend state atomically (tmp file + rename) so a reader never
22
+ * observes a torn write, and journal `hook.suspend` for observability.
23
+ */
24
+ export function writeSuspendState(stateDir, state, journalFile) {
25
+ mkdirSync(stateDir, { recursive: true });
26
+ const full = {
27
+ schemaVersion: SUSPEND_STATE_SCHEMA_VERSION,
28
+ ...state,
29
+ };
30
+ const path = suspendStatePath(stateDir);
31
+ const tmp = `${path}.tmp-${process.pid}-${Date.now()}`;
32
+ writeFileSync(tmp, `${JSON.stringify(full, null, 2)}\n`, "utf-8");
33
+ renameSync(tmp, path);
34
+ if (journalFile) {
35
+ appendEvent(journalFile, state.runId, state.iteration ? String(state.iteration) : "", "hook.suspend", jsonField("phase", state.phase) +
36
+ ", " +
37
+ jsonField("reason", state.reason) +
38
+ ", " +
39
+ jsonField("hook_command", state.hookCommand) +
40
+ ", " +
41
+ jsonField("resume_iteration", String(state.resumeIteration)));
42
+ }
43
+ return full;
44
+ }
45
+ /** Read the durable suspend state, or null when absent/unreadable/invalid. */
46
+ export function readSuspendState(stateDir) {
47
+ const path = suspendStatePath(stateDir);
48
+ if (!existsSync(path))
49
+ return null;
50
+ try {
51
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
52
+ return isSuspendState(parsed) ? parsed : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /** Remove the suspend-state file. No-op if absent. */
59
+ export function clearSuspendState(stateDir) {
60
+ const path = suspendStatePath(stateDir);
61
+ if (!existsSync(path))
62
+ return false;
63
+ rmSync(path, { force: true });
64
+ return true;
65
+ }
66
+ /** Drop the resume-requested signal file (operator says "go"). */
67
+ export function requestResume(stateDir) {
68
+ mkdirSync(dirname(resumeRequestPath(stateDir)), { recursive: true });
69
+ writeFileSync(resumeRequestPath(stateDir), `${new Date().toISOString()}\n`);
70
+ }
71
+ export function resumeRequested(stateDir) {
72
+ return existsSync(resumeRequestPath(stateDir));
73
+ }
74
+ /** Remove the resume-requested signal file. No-op if absent. */
75
+ export function clearResumeRequest(stateDir) {
76
+ const path = resumeRequestPath(stateDir);
77
+ if (!existsSync(path))
78
+ return false;
79
+ rmSync(path, { force: true });
80
+ return true;
81
+ }
82
+ /**
83
+ * Block until `resume-requested` appears, the run is aborted, or (if set)
84
+ * `timeoutMs` elapses. Returns `true` when resumed, `false` on abort/timeout.
85
+ * Mirrors `ask.ts:awaitHumanResponse`'s signal-aware poll loop.
86
+ */
87
+ export async function waitForResume(stateDir, opts = {}) {
88
+ const pollMs = opts.pollMs && opts.pollMs > 0 ? opts.pollMs : 1000;
89
+ const deadline = opts.timeoutMs && opts.timeoutMs > 0 ? Date.now() + opts.timeoutMs : null;
90
+ for (;;) {
91
+ if (opts.signal?.aborted)
92
+ return false;
93
+ if (resumeRequested(stateDir))
94
+ return true;
95
+ if (deadline !== null && Date.now() >= deadline)
96
+ return false;
97
+ const wait = deadline !== null ? Math.min(pollMs, deadline - Date.now()) : pollMs;
98
+ await sleep(Math.max(0, wait));
99
+ }
100
+ }
101
+ function sleep(ms) {
102
+ return new Promise((resolve) => setTimeout(resolve, ms));
103
+ }
104
+ //# sourceMappingURL=suspend-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspend-state.js","sourceRoot":"","sources":["../src/suspend-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { LoopContext } from "./types.js";
2
+ export interface TamperViolation {
3
+ id: string;
4
+ detail: string;
5
+ }
6
+ export interface TamperResult {
7
+ ran: boolean;
8
+ passed: boolean;
9
+ violations: TamperViolation[];
10
+ }
11
+ /** Heuristic test-file detector across common ecosystems. */
12
+ export declare function isTestFile(path: string): boolean;
13
+ /**
14
+ * Anti-reward-hack tamper screen. With `screen_test_tamper` on, a test-backed
15
+ * done-claim is blocked when the run touched gating tests or inserted
16
+ * tamper patterns on test paths — harness-side and maker-uninfluenceable.
17
+ * Returns `{ ran: false, passed: true }` when disabled or outside a git tree.
18
+ */
19
+ export declare function runTamperScreen(loop: LoopContext, iteration: number): TamperResult;
20
+ /** Re-inject a tamper-screen failure as operator guidance. */
21
+ export declare function reinjectTamperFailure(loop: LoopContext, iteration: number, result: TamperResult): void;
package/dist/tamper.js ADDED
@@ -0,0 +1,88 @@
1
+ import { jsonBool, jsonField, jsonFieldRaw } from "@mobrienv/autoloop-core";
2
+ import { appendEvent, appendOperatorEvent, } from "@mobrienv/autoloop-core/journal";
3
+ import { changedFiles, collectAddedLines, isGitRepo, } from "./git-diff.js";
4
+ const MAX_SAMPLE = 10;
5
+ /** Heuristic test-file detector across common ecosystems. */
6
+ export function isTestFile(path) {
7
+ return (/\.(test|spec)\.[cm]?[jt]sx?$/.test(path) ||
8
+ /(^|\/)test_[^/]*\.py$/.test(path) ||
9
+ /_test\.(py|go|rb)$/.test(path) ||
10
+ /(^|\/)(tests?|__tests__|spec)\//.test(path) ||
11
+ /Test\.(java|kt|cs)$/.test(path) ||
12
+ /_spec\.rb$/.test(path));
13
+ }
14
+ // Patterns that, when introduced on a test path, weaken or short-circuit the
15
+ // gating tests. Each is scoped to added lines inside test files.
16
+ const TAMPER_PATTERNS = [
17
+ [
18
+ "test_skip_or_only",
19
+ /(\b(it|describe|test)\.(only|skip)\b|\bx(it|describe)\b|\bf(it|describe)\b|@pytest\.mark\.(skip|xfail)|\bunittest\.skip\b|#\[ignore\])/,
20
+ ],
21
+ [
22
+ "test_early_exit",
23
+ /\b(process\.exit|os\._?exit|sys\.exit|System\.exit)\s*\(/,
24
+ ],
25
+ [
26
+ "tautological_assert",
27
+ /(expect\(\s*(true|1|"")\s*\)\s*\.\s*toBe(Truthy)?\(|assert\s+true\b|assertTrue\(\s*true\s*\)|assert\s+1\s*==\s*1\b|expect\(\s*true\s*\)\.toBeTruthy\()/i,
28
+ ],
29
+ ];
30
+ function sample(items) {
31
+ return items.slice(0, MAX_SAMPLE).join("\n");
32
+ }
33
+ /**
34
+ * Anti-reward-hack tamper screen. With `screen_test_tamper` on, a test-backed
35
+ * done-claim is blocked when the run touched gating tests or inserted
36
+ * tamper patterns on test paths — harness-side and maker-uninfluenceable.
37
+ * Returns `{ ran: false, passed: true }` when disabled or outside a git tree.
38
+ */
39
+ export function runTamperScreen(loop, iteration) {
40
+ if (!loop.acceptance.screenTestTamper) {
41
+ return { ran: false, passed: true, violations: [] };
42
+ }
43
+ const workDir = loop.paths.workDir;
44
+ const iter = String(iteration);
45
+ if (!isGitRepo(workDir)) {
46
+ // No baseline to diff against — cannot screen deterministically.
47
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, iter, "tamper.result", jsonFieldRaw("passed", jsonBool(true)) +
48
+ ", " +
49
+ jsonField("skipped", "no_git"));
50
+ return { ran: true, passed: true, violations: [] };
51
+ }
52
+ const violations = [];
53
+ // 1. Deterministic: did the gating test files change this run?
54
+ const touchedTests = changedFiles(workDir).filter(isTestFile);
55
+ if (touchedTests.length) {
56
+ violations.push({
57
+ id: "test_files_changed",
58
+ detail: `Test files were modified during the run that claims completion:\n${sample(touchedTests)}`,
59
+ });
60
+ }
61
+ // 2. Tamper patterns inserted on test paths.
62
+ const addedInTests = collectAddedLines(workDir).filter((l) => isTestFile(l.file));
63
+ for (const [id, re] of TAMPER_PATTERNS) {
64
+ const hits = addedInTests.filter((l) => re.test(l.text));
65
+ if (hits.length)
66
+ violations.push({
67
+ id,
68
+ detail: `${id} in test files:\n${sample(hits.map((l) => ` ${l.file}: ${l.text.trim()}`))}`,
69
+ });
70
+ }
71
+ const passed = violations.length === 0;
72
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, iter, "tamper.result", jsonFieldRaw("passed", jsonBool(passed)) +
73
+ ", " +
74
+ jsonField("violations", violations.map((v) => v.id).join(",")));
75
+ return { ran: true, passed, violations };
76
+ }
77
+ /** Re-inject a tamper-screen failure as operator guidance. */
78
+ export function reinjectTamperFailure(loop, iteration, result) {
79
+ const detail = result.violations
80
+ .map((v) => `- [${v.id}] ${v.detail}`)
81
+ .join("\n\n");
82
+ const message = "Completion was blocked: the test-tamper screen detected that gating " +
83
+ "tests were changed or weakened this run. Do not modify the tests that " +
84
+ "verify the work; make the implementation pass the existing tests.\n\n" +
85
+ detail;
86
+ appendOperatorEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "operator.guidance", message);
87
+ }
88
+ //# sourceMappingURL=tamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tamper.js","sourceRoot":"","sources":["../src/tamper.ts"],"names":[],"mappings":"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"}