@dzhechkov/harness-core 0.3.150 → 0.4.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 (111) hide show
  1. package/.dz-manifest.json +410 -62
  2. package/README.md +81 -3
  3. package/dist/agentdb-index.d.ts.map +1 -1
  4. package/dist/agentdb-index.js +10 -2
  5. package/dist/agentdb-index.js.map +1 -1
  6. package/dist/backlog-embed.d.ts +94 -0
  7. package/dist/backlog-embed.d.ts.map +1 -0
  8. package/dist/backlog-embed.js +138 -0
  9. package/dist/backlog-embed.js.map +1 -0
  10. package/dist/backlog.d.ts +180 -7
  11. package/dist/backlog.d.ts.map +1 -1
  12. package/dist/backlog.js +429 -26
  13. package/dist/backlog.js.map +1 -1
  14. package/dist/challenge-panel.d.ts +3 -0
  15. package/dist/challenge-panel.d.ts.map +1 -1
  16. package/dist/challenge-panel.js +3 -0
  17. package/dist/challenge-panel.js.map +1 -1
  18. package/dist/export-holdout.d.ts +149 -0
  19. package/dist/export-holdout.d.ts.map +1 -0
  20. package/dist/export-holdout.js +198 -0
  21. package/dist/export-holdout.js.map +1 -0
  22. package/dist/feature-adr-checkpoints.d.ts +127 -0
  23. package/dist/feature-adr-checkpoints.d.ts.map +1 -1
  24. package/dist/feature-adr-checkpoints.js +199 -1
  25. package/dist/feature-adr-checkpoints.js.map +1 -1
  26. package/dist/feature-adr-routing.d.ts +3 -0
  27. package/dist/feature-adr-routing.d.ts.map +1 -1
  28. package/dist/feature-adr-routing.js +3 -0
  29. package/dist/feature-adr-routing.js.map +1 -1
  30. package/dist/guard.d.ts +42 -0
  31. package/dist/guard.d.ts.map +1 -1
  32. package/dist/guard.js +73 -1
  33. package/dist/guard.js.map +1 -1
  34. package/dist/index.d.ts +16 -3
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +28 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/loop-blobs.generated.d.ts +33 -0
  39. package/dist/loop-blobs.generated.d.ts.map +1 -0
  40. package/dist/loop-blobs.generated.js +101 -0
  41. package/dist/loop-blobs.generated.js.map +1 -0
  42. package/dist/loop-lint.d.ts +63 -0
  43. package/dist/loop-lint.d.ts.map +1 -0
  44. package/dist/loop-lint.js +606 -0
  45. package/dist/loop-lint.js.map +1 -0
  46. package/dist/loop-plan.d.ts +416 -0
  47. package/dist/loop-plan.d.ts.map +1 -0
  48. package/dist/loop-plan.js +1151 -0
  49. package/dist/loop-plan.js.map +1 -0
  50. package/dist/loop-render.d.ts +104 -0
  51. package/dist/loop-render.d.ts.map +1 -0
  52. package/dist/loop-render.js +1068 -0
  53. package/dist/loop-render.js.map +1 -0
  54. package/dist/loop-trace.d.ts +229 -0
  55. package/dist/loop-trace.d.ts.map +1 -0
  56. package/dist/loop-trace.js +614 -0
  57. package/dist/loop-trace.js.map +1 -0
  58. package/dist/mutation-gate.d.ts +247 -0
  59. package/dist/mutation-gate.d.ts.map +1 -0
  60. package/dist/mutation-gate.js +535 -0
  61. package/dist/mutation-gate.js.map +1 -0
  62. package/dist/no-stubs.d.ts +53 -0
  63. package/dist/no-stubs.d.ts.map +1 -0
  64. package/dist/no-stubs.js +190 -0
  65. package/dist/no-stubs.js.map +1 -0
  66. package/dist/package-skill-layouts.d.ts +67 -0
  67. package/dist/package-skill-layouts.d.ts.map +1 -0
  68. package/dist/package-skill-layouts.js +81 -0
  69. package/dist/package-skill-layouts.js.map +1 -0
  70. package/dist/patterns.d.ts.map +1 -1
  71. package/dist/patterns.js +156 -75
  72. package/dist/patterns.js.map +1 -1
  73. package/dist/recall-domain-boost.d.ts.map +1 -1
  74. package/dist/recall-domain-boost.js +6 -0
  75. package/dist/recall-domain-boost.js.map +1 -1
  76. package/dist/statusline.d.ts +10 -2
  77. package/dist/statusline.d.ts.map +1 -1
  78. package/dist/statusline.js +122 -36
  79. package/dist/statusline.js.map +1 -1
  80. package/dist/store-lock.d.ts +108 -0
  81. package/dist/store-lock.d.ts.map +1 -0
  82. package/dist/store-lock.js +231 -0
  83. package/dist/store-lock.js.map +1 -0
  84. package/dist/workflows.d.ts +16 -22
  85. package/dist/workflows.d.ts.map +1 -1
  86. package/dist/workflows.js +17 -98
  87. package/dist/workflows.js.map +1 -1
  88. package/package.json +6 -4
  89. package/sbom.json +1073 -203
  90. package/src/agentdb-index.ts +10 -1
  91. package/src/backlog-embed.ts +156 -0
  92. package/src/backlog.ts +536 -28
  93. package/src/challenge-panel.ts +4 -0
  94. package/src/export-holdout.ts +235 -0
  95. package/src/feature-adr-checkpoints.ts +291 -1
  96. package/src/feature-adr-routing.ts +4 -0
  97. package/src/guard.ts +106 -1
  98. package/src/index.ts +62 -2
  99. package/src/loop-blobs.generated.ts +114 -0
  100. package/src/loop-lint.ts +643 -0
  101. package/src/loop-plan.ts +1419 -0
  102. package/src/loop-render.ts +1126 -0
  103. package/src/loop-trace.ts +727 -0
  104. package/src/mutation-gate.ts +701 -0
  105. package/src/no-stubs.ts +204 -0
  106. package/src/package-skill-layouts.ts +107 -0
  107. package/src/patterns.ts +135 -60
  108. package/src/recall-domain-boost.ts +6 -0
  109. package/src/statusline.ts +117 -30
  110. package/src/store-lock.ts +258 -0
  111. package/src/workflows.ts +18 -117
@@ -0,0 +1,606 @@
1
+ /**
2
+ * `dz workflow-lint` — the layer-1 deterministic gate over Workflow loop scripts (FR-3, ADR-001).
3
+ *
4
+ * `lint(scriptText, {plan?, blobRegistry?, mode?}) → LintRun`. PURE — no fs (the CLI reads files).
5
+ * Three verdicts per rule AND overall: `pass` / `fail` / `inconclusive`, and **inconclusive is
6
+ * never a pass** (INV-13; the CLI exits 0/1/3 mirroring the consult-gate convention).
7
+ *
8
+ * The plan-anchored vs script-only split (architecture §5.3 — the honest scope): the hard
9
+ * structural rules (`barrier-postdominates`, `budget-before-spawn`, `retry-idempotent`,
10
+ * `resume-fingerprint`, `fanout-bounded` at FAIL strength, `pause-wired`, `dispatch-by-deliverable`)
11
+ * are decidable on the PLAN graph (via `toLintProjection` — never the raw plan, AM-3). For a
12
+ * plan-less script a full path-sensitive CFG over arbitrary JS is not honestly promisable; those
13
+ * rules report `inconclusive` with reason `no-plan-binding` — never a silent pass.
14
+ * Modes: `require-plan` (generated-loop CI) turns every inconclusive into a FAIL;
15
+ * `legacy` (the two existing workflows) accepts the enumerated warn/inconclusive rows as-is.
16
+ *
17
+ * `barrier-postdominates` is real CFG POST-dominator analysis over the projection's synthetic
18
+ * entry/exit (plain dominance is explicitly insufficient — Codex 04/Q1): the join must post-
19
+ * dominate the FORK it closes, the join policy must come from the closed set, and every ACTIVATED
20
+ * branch is an effective prerequisite (declared-but-never-dispatched branches are not required;
21
+ * dispatched branches are never skippable).
22
+ */
23
+ import { createHash } from 'node:crypto';
24
+ import { toLintProjection, JOIN_POLICIES, QUORUM_RE } from './loop-plan.js';
25
+ export const LINT_RULES = [
26
+ 'meta-complete',
27
+ 'phase-parity',
28
+ 'sandbox-bans',
29
+ 'shq-hygiene',
30
+ 'agent-labelled',
31
+ 'no-partial-checkpoint',
32
+ 'plan-binding',
33
+ 'blob-hash',
34
+ 'fanout-bounded',
35
+ 'barrier-postdominates',
36
+ 'budget-before-spawn',
37
+ 'retry-idempotent',
38
+ 'resume-fingerprint',
39
+ 'pause-wired',
40
+ 'dispatch-by-deliverable',
41
+ 'no-agent-outside-runstep',
42
+ 'size-budget',
43
+ ];
44
+ /** size-budget (WARN ONLY — FR-3.10, the fa-improvements reaffirmed lesson: a blocking wc-l cap is
45
+ * theater). Threshold chosen so both battle-grown legacy loops surface the advisory. */
46
+ export const SIZE_BUDGET_WARN_LINES = 350;
47
+ function stripComments(script) {
48
+ // block comments, then line comments (a // preceded by start/whitespace — keeps https:// URLs
49
+ // inside strings intact well enough for ban tokens, which never look like URLs)
50
+ return script.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^|\s)\/\/.*$/gm, '$1');
51
+ }
52
+ const NO_PLAN = {
53
+ rule: '',
54
+ severity: 'inconclusive',
55
+ message: 'no-plan-binding: this rule is decidable only on the plan graph; bind a sidecar plan (--plan) or run --legacy to accept the inconclusive row',
56
+ };
57
+ function noPlan(rule) {
58
+ return [{ ...NO_PLAN, rule }];
59
+ }
60
+ // ── rule implementations (each returns findings; empty = pass) ───────────────
61
+ function ruleMetaComplete(ctx) {
62
+ const out = [];
63
+ if (!/export const meta\s*=\s*\{/.test(ctx.script)) {
64
+ return [{ rule: 'meta-complete', severity: 'fail', message: 'no `export const meta = {…}` block', anchor: 'export const meta' }];
65
+ }
66
+ const metaText = ctx.script.slice(ctx.script.indexOf('export const meta')).slice(0, 4000);
67
+ for (const field of ['name', 'description', 'whenToUse', 'phases']) {
68
+ if (!new RegExp(`\\b${field}\\s*:`).test(metaText)) {
69
+ out.push({ rule: 'meta-complete', severity: 'fail', message: `meta.${field} missing`, anchor: `meta.${field}` });
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+ function metaPhaseTitles(script) {
75
+ const metaStart = script.indexOf('export const meta');
76
+ if (metaStart === -1)
77
+ return [];
78
+ const phasesStart = script.indexOf('phases', metaStart);
79
+ if (phasesStart === -1)
80
+ return [];
81
+ const seg = script.slice(phasesStart, script.indexOf(']', phasesStart) + 1);
82
+ return [...seg.matchAll(/title:\s*['"]([^'"]+)['"]/g)].map((m) => m[1]);
83
+ }
84
+ function rulePhaseParity(ctx) {
85
+ const titles = metaPhaseTitles(ctx.script);
86
+ const calls = [];
87
+ for (const m of ctx.code.matchAll(/(?<![.\w])phase\(\s*['"]([^'"]+)['"]\s*\)/g)) {
88
+ const p = m[1];
89
+ if (!calls.includes(p))
90
+ calls.push(p);
91
+ }
92
+ if (titles.length === 0 || calls.length === 0)
93
+ return []; // meta-complete owns the missing-block case
94
+ const inTitles = calls.filter((c) => titles.includes(c));
95
+ const expectedOrder = titles.filter((t) => inTitles.includes(t));
96
+ if (JSON.stringify(inTitles) !== JSON.stringify(expectedOrder)) {
97
+ return [{ rule: 'phase-parity', severity: 'fail', message: `phase() first-call order [${inTitles.join(', ')}] contradicts meta.phases order [${expectedOrder.join(', ')}] (INV-7)`, anchor: `phase('${inTitles[0]}')` }];
98
+ }
99
+ const unknown = calls.filter((c) => !titles.includes(c));
100
+ if (unknown.length > 0) {
101
+ return [{ rule: 'phase-parity', severity: 'fail', message: `phase(${unknown.map((u) => `'${u}'`).join(', ')}) not listed in meta.phases (INV-7)`, anchor: `phase('${unknown[0]}')` }];
102
+ }
103
+ return [];
104
+ }
105
+ const SANDBOX_BANS = ['Date.now(', 'new Date', 'Math.random(', 'require(', 'process.', 'child_process'];
106
+ function ruleSandboxBans(ctx) {
107
+ const out = [];
108
+ for (const token of SANDBOX_BANS) {
109
+ if (ctx.code.includes(token)) {
110
+ out.push({ rule: 'sandbox-bans', severity: 'fail', message: `sandbox-banned token \`${token}\` in script code (INV-12 — the workflow sandbox has no clock/randomness/require/process)`, anchor: token });
111
+ }
112
+ }
113
+ // fs.: property-access form only (never the prose word "fs")
114
+ if (/(?<![\w.])fs\.[a-zA-Z]/.test(ctx.code)) {
115
+ out.push({ rule: 'sandbox-bans', severity: 'fail', message: 'sandbox-banned `fs.*` access in script code (the agent is the fs)', anchor: 'fs.' });
116
+ }
117
+ return out;
118
+ }
119
+ function ruleShqHygiene(ctx) {
120
+ const bashPrompt = /Run EXACTLY this/i.test(ctx.script);
121
+ const hasQuoter = /function (shq|shellQuote|shqRt|traceShellQuote)\s*\(/.test(ctx.script);
122
+ if (bashPrompt && !hasQuoter) {
123
+ return [{ rule: 'shq-hygiene', severity: 'fail', message: 'the script builds Bash prompts but declares no shq-shaped single-quote escaper — every interpolated value must ride through one', anchor: 'Run EXACTLY this' }];
124
+ }
125
+ if (/sh -c ['"]\s*\+/.test(ctx.code)) {
126
+ return [{ rule: 'shq-hygiene', severity: 'fail', message: 'ad-hoc `sh -c` string concatenation — build commands through the shq-shaped quoter', anchor: 'sh -c' }];
127
+ }
128
+ return [];
129
+ }
130
+ /** Split the argument text of a call starting right after `agent(` by balancing parens/braces and
131
+ * skipping string literals. Returns the top-level comma-separated argument texts (bounded scan). */
132
+ function callArguments(code, openIdx) {
133
+ const args = [];
134
+ let depth = 1;
135
+ let cur = '';
136
+ let i = openIdx;
137
+ let quote = null;
138
+ const limit = Math.min(code.length, openIdx + 6000);
139
+ for (; i < limit && depth > 0; i++) {
140
+ const c = code[i];
141
+ const prev = i > 0 ? code[i - 1] : '';
142
+ if (quote !== null) {
143
+ cur += c;
144
+ if (c === quote && prev !== '\\')
145
+ quote = null;
146
+ continue;
147
+ }
148
+ if (c === "'" || c === '"' || c === '`') {
149
+ quote = c;
150
+ cur += c;
151
+ continue;
152
+ }
153
+ if (c === '(' || c === '{' || c === '[')
154
+ depth++;
155
+ if (c === ')' || c === '}' || c === ']') {
156
+ depth--;
157
+ if (depth === 0)
158
+ break;
159
+ }
160
+ if (c === ',' && depth === 1) {
161
+ args.push(cur);
162
+ cur = '';
163
+ continue;
164
+ }
165
+ cur += c;
166
+ }
167
+ if (cur.trim() !== '')
168
+ args.push(cur);
169
+ return args;
170
+ }
171
+ function ruleAgentLabelled(ctx) {
172
+ const out = [];
173
+ let n = 0;
174
+ for (const m of ctx.code.matchAll(/(?<![.\w])agent\(/g)) {
175
+ const idx = (m.index ?? 0) + 'agent('.length;
176
+ const args = callArguments(ctx.code, idx);
177
+ const opts = args[1]?.trim();
178
+ let bad = null;
179
+ if (opts === undefined) {
180
+ // Regex literals inside the argument text (e.g. `DESC.replace(/'/g, "'\\''")`) defeat the
181
+ // string-aware splitter — an UNDECIDABLE parse is accepted, never guessed into a finding.
182
+ const consumed = args[0] ?? '';
183
+ if (/\.(replace|match|split|test|exec)\s*\(\s*\//.test(consumed))
184
+ continue;
185
+ bad = 'no opts argument at all';
186
+ }
187
+ else if (opts.startsWith('{')) {
188
+ // inline object literal — label + phase must be present in it
189
+ if (!/label\s*:/.test(opts))
190
+ bad = 'no label in opts';
191
+ else if (!/phase\s*:/.test(opts))
192
+ bad = 'no phase in opts';
193
+ }
194
+ // an identifier opts (e.g. `agent(prompt, routerOpts)`) is statically undecidable — accepted
195
+ // (the opts object is built upstream; a full data-flow pass is not honestly promisable here)
196
+ if (bad !== null) {
197
+ n++;
198
+ if (n <= 3) {
199
+ out.push({ rule: 'agent-labelled', severity: 'fail', message: `agent() call with ${bad}`, anchor: ctx.code.slice(m.index ?? 0, (m.index ?? 0) + 60).split('\n')[0] ?? 'agent(' });
200
+ }
201
+ }
202
+ }
203
+ if (n > 3)
204
+ out.push({ rule: 'agent-labelled', severity: 'fail', message: `…and ${n - 3} more unlabelled agent() call(s)` });
205
+ return out;
206
+ }
207
+ function ruleNoPartialCheckpoint(ctx) {
208
+ const out = [];
209
+ const writesCheckpoints = ctx.script.includes('checkpoints.jsonl') || ctx.script.includes('serializeCheckpoint(');
210
+ const hasParallel = /(?<![.\w])parallel\(/.test(ctx.code);
211
+ if (writesCheckpoints && hasParallel) {
212
+ const hasNullGuard = /some\(\s*(?:function\s*\([^)]*\)\s*\{\s*return\s+[^}]*null|\([^)]*\)\s*=>\s*[^,)]*null)/.test(ctx.code) || ctx.code.includes('=== null') || ctx.code.includes('== null');
213
+ if (!hasNullGuard) {
214
+ out.push({ rule: 'no-partial-checkpoint', severity: 'fail', message: 'the script checkpoints results and runs parallel() but carries no null-element guard — a parallel() result holding null must never be checkpointed (seeded defect #4)', anchor: 'parallel(' });
215
+ }
216
+ }
217
+ // a catch that neither logs nor rethrows — ADVISORY (warn): an empty catch on a best-effort
218
+ // probe is an established idiom in the legacy loops; the FAIL half of this rule is the
219
+ // parallel-null-guard above (seeded defect #4)
220
+ for (const m of ctx.code.matchAll(/catch\s*(?:\(([^)]*)\))?\s*\{\s*\}/g)) {
221
+ out.push({ rule: 'no-partial-checkpoint', severity: 'warn', message: 'a catch block that neither logs nor rethrows swallows a failure silently (advisory)', anchor: m[0].slice(0, 40) });
222
+ break;
223
+ }
224
+ return out;
225
+ }
226
+ const HEADER_RE = /\/\/ ── LOOP-PLAN plan=loop-plan\/1 digest=sha256:([0-9a-f]{64}) exec-fp=sha256:([0-9a-f]{64}) generator=(\S+) ──/;
227
+ function rulePlanBinding(ctx, digestOfPlan) {
228
+ const m = HEADER_RE.exec(ctx.script);
229
+ if (ctx.plan === null)
230
+ return noPlan('plan-binding');
231
+ if (!m)
232
+ return [{ rule: 'plan-binding', severity: 'fail', message: 'plan given but the script carries no LOOP-PLAN header line', anchor: 'LOOP-PLAN' }];
233
+ if (digestOfPlan !== null && m[1] !== digestOfPlan) {
234
+ return [{ rule: 'plan-binding', severity: 'fail', message: `header digest sha256:${m[1].slice(0, 12)}… does not match planDigest sha256:${digestOfPlan.slice(0, 12)}… — the script was rendered from a DIFFERENT plan`, anchor: 'LOOP-PLAN' }];
235
+ }
236
+ return [];
237
+ }
238
+ const BLOB_RE = /\/\/ ── BEGIN BLOB (\S+)@(\S+) sha256:([0-9a-f]{64}) src=(\S+) ──\n([\s\S]*?)\n\/\/ ── END BLOB \1@\2 ──/g;
239
+ function ruleBlobHash(ctx) {
240
+ const out = [];
241
+ for (const m of ctx.script.matchAll(BLOB_RE)) {
242
+ const [, name, version, declaredHash, , body] = m;
243
+ const actual = createHash('sha256').update(body, 'utf8').digest('hex');
244
+ if (actual !== declaredHash) {
245
+ out.push({ rule: 'blob-hash', severity: 'fail', message: `BLOB ${name}@${version} body hashes to sha256:${actual.slice(0, 12)}… but the marker declares sha256:${declaredHash.slice(0, 12)}… — the blob was hand-edited (INV-10); edit the canonical source and regenerate`, anchor: `BEGIN BLOB ${name}@${version}` });
246
+ continue;
247
+ }
248
+ const reg = ctx.blobRegistry?.[name];
249
+ if (reg && reg.contentHash !== actual) {
250
+ out.push({ rule: 'blob-hash', severity: 'fail', message: `BLOB ${name}@${version} matches its own marker but NOT the registry (registry sha256:${reg.contentHash.slice(0, 12)}…) — stale blob; re-render`, anchor: `BEGIN BLOB ${name}@${version}` });
251
+ }
252
+ }
253
+ return out;
254
+ }
255
+ /** Two-hop assignment resolution for the script-only fanout heuristic. */
256
+ function resolveAssignChain(ctx, name, hops) {
257
+ if (hops <= 0)
258
+ return '';
259
+ const m = new RegExp(`(?:const|let|var)\\s+${name}\\s*=\\s*([^\\n]+)`).exec(ctx.code);
260
+ if (!m)
261
+ return '';
262
+ const rhs = m[1];
263
+ const base = /^([A-Za-z_$][\w$]*)/.exec(rhs.trim());
264
+ const deeper = base && base[1] !== name ? resolveAssignChain(ctx, base[1], hops - 1) : '';
265
+ return rhs + '\n' + deeper;
266
+ }
267
+ function ruleFanoutBounded(ctx) {
268
+ const out = [];
269
+ if (ctx.projection) {
270
+ for (const pair of ctx.projection.forkJoinPairs) {
271
+ if (pair.maxFanout < 1 || pair.registrySize === 0) {
272
+ out.push({ rule: 'fanout-bounded', severity: 'fail', message: `fanout ${pair.fork}: unbounded (maxFanout=${pair.maxFanout}, registry size ${pair.registrySize}) — a fanout without maxFanout>=1 AND a non-empty registry is a hard FAIL (INV-2)`, anchor: pair.fork });
273
+ }
274
+ }
275
+ }
276
+ // script-only heuristic (K7 — WARN, never FAIL): args-derived .map( into parallel( with no cap
277
+ for (const m of ctx.code.matchAll(/parallel\(\s*([A-Za-z_$][\w$]*)\s*[),]/g)) {
278
+ const arg = m[1];
279
+ const chain = resolveAssignChain(ctx, arg, 3);
280
+ if (!chain.includes('.map('))
281
+ continue;
282
+ const argsDerived = /\b(?:A|args)\s*\.|\bargs\b/.test(chain);
283
+ const capped = /slice\(\s*0\s*,|maxFanout/i.test(chain);
284
+ const suppressed = ctx.script.includes('// loop-lint: fanout-bound');
285
+ if (argsDerived && !capped && !suppressed) {
286
+ out.push({ rule: 'fanout-bounded', severity: 'warn', message: `parallel(${arg}) fans out over an args-derived .map( with no visible cap — bound it (slice(0, maxFanout)) or annotate \`// loop-lint: fanout-bound <expr>\``, anchor: `parallel(${arg})` });
287
+ }
288
+ }
289
+ for (const m of ctx.code.matchAll(/parallel\(\s*([A-Za-z_$][\w$]*(?:\.[\w$]+)*)\.map\(/g)) {
290
+ const base = m[1].split('.')[0];
291
+ const chain = base + '\n' + resolveAssignChain(ctx, base, 3);
292
+ const argsDerived = /\b(?:A|args)\s*\./.test(chain) || base === 'A' || base === 'args';
293
+ const capped = /slice\(\s*0\s*,|maxFanout/i.test(String(m[0]) + chain);
294
+ const suppressed = ctx.script.includes('// loop-lint: fanout-bound');
295
+ if (argsDerived && !capped && !suppressed) {
296
+ out.push({ rule: 'fanout-bounded', severity: 'warn', message: `parallel(${m[1]}.map(…)) fans out over args-derived data with no visible cap`, anchor: `parallel(${m[1]}.map(` });
297
+ }
298
+ }
299
+ if (ctx.projection === null && out.length === 0) {
300
+ // plan half undecidable, script half clean → the FAIL-strength half is inconclusive
301
+ return noPlan('fanout-bounded');
302
+ }
303
+ return out;
304
+ }
305
+ // ── post-dominator analysis (the load-bearing rule) ──────────────────────────
306
+ function successors(projection) {
307
+ const succ = new Map();
308
+ for (const n of projection.nodes)
309
+ succ.set(n, []);
310
+ for (const e of projection.edges) {
311
+ const arr = succ.get(e.from) ?? [];
312
+ arr.push(e.to);
313
+ succ.set(e.from, arr);
314
+ }
315
+ return succ;
316
+ }
317
+ /** Classic iterative post-dominator computation over the projection CFG (exit post-dominates all). */
318
+ export function postDominators(projection) {
319
+ const succ = successors(projection);
320
+ const nodes = projection.nodes;
321
+ const pdom = new Map();
322
+ for (const n of nodes)
323
+ pdom.set(n, n === 'exit' ? new Set(['exit']) : new Set(nodes));
324
+ let changed = true;
325
+ while (changed) {
326
+ changed = false;
327
+ for (const n of nodes) {
328
+ if (n === 'exit')
329
+ continue;
330
+ const succs = succ.get(n) ?? [];
331
+ let inter = null;
332
+ for (const s of succs) {
333
+ const sd = pdom.get(s) ?? new Set();
334
+ if (inter === null) {
335
+ inter = new Set(sd);
336
+ }
337
+ else {
338
+ const cur = inter;
339
+ inter = new Set([...cur].filter((x) => sd.has(x)));
340
+ }
341
+ }
342
+ const next = new Set(inter ?? []);
343
+ next.add(n);
344
+ const prev = pdom.get(n) ?? new Set();
345
+ if (next.size !== prev.size || [...next].some((x) => !prev.has(x))) {
346
+ pdom.set(n, next);
347
+ changed = true;
348
+ }
349
+ }
350
+ }
351
+ return pdom;
352
+ }
353
+ /** Plain (forward) dominators — kept ONLY as the mutation seam for AM-1's weakening entry
354
+ * (`barrier-postdominates-weakened-to-dominance`): swapping the call site to this function is the
355
+ * registered mutation, and the discrimination seed must then go green (proving the gate measures
356
+ * the analysis, not the rule's registration). Never called in production. */
357
+ export function dominators(projection) {
358
+ const pred = new Map();
359
+ for (const n of projection.nodes)
360
+ pred.set(n, []);
361
+ for (const e of projection.edges) {
362
+ const arr = pred.get(e.to) ?? [];
363
+ arr.push(e.from);
364
+ pred.set(e.to, arr);
365
+ }
366
+ const nodes = projection.nodes;
367
+ const dom = new Map();
368
+ for (const n of nodes)
369
+ dom.set(n, n === 'entry' ? new Set(['entry']) : new Set(nodes));
370
+ let changed = true;
371
+ while (changed) {
372
+ changed = false;
373
+ for (const n of nodes) {
374
+ if (n === 'entry')
375
+ continue;
376
+ const preds = pred.get(n) ?? [];
377
+ let inter = null;
378
+ for (const p of preds) {
379
+ const pd = dom.get(p) ?? new Set();
380
+ if (inter === null) {
381
+ inter = new Set(pd);
382
+ }
383
+ else {
384
+ const cur = inter;
385
+ inter = new Set([...cur].filter((x) => pd.has(x)));
386
+ }
387
+ }
388
+ const next = new Set(inter ?? []);
389
+ next.add(n);
390
+ const prev = dom.get(n) ?? new Set();
391
+ if (next.size !== prev.size || [...next].some((x) => !prev.has(x))) {
392
+ dom.set(n, next);
393
+ changed = true;
394
+ }
395
+ }
396
+ }
397
+ return dom;
398
+ }
399
+ function ruleBarrierPostdominates(ctx) {
400
+ if (ctx.projection === null)
401
+ return noPlan('barrier-postdominates');
402
+ const out = [];
403
+ const pdom = postDominators(ctx.projection);
404
+ for (const pair of ctx.projection.forkJoinPairs) {
405
+ if (pair.join === '') {
406
+ out.push({ rule: 'barrier-postdominates', severity: 'fail', message: `fork ${pair.fork} has no join — a parallel region without a barrier is unclosable`, anchor: pair.fork });
407
+ continue;
408
+ }
409
+ const policyOk = JOIN_POLICIES.includes(pair.policy) || QUORUM_RE.test(pair.policy);
410
+ if (!policyOk) {
411
+ out.push({ rule: 'barrier-postdominates', severity: 'fail', message: `join ${pair.join}: policy "${pair.policy}" is not from the closed set`, anchor: pair.join });
412
+ }
413
+ // (a) the join POST-dominates the fork it closes — plain dominance of a consumer is NOT enough
414
+ const forkPdom = pdom.get(pair.fork) ?? new Set();
415
+ if (!forkPdom.has(pair.join)) {
416
+ out.push({ rule: 'barrier-postdominates', severity: 'fail', message: `join ${pair.join} does NOT post-dominate fork ${pair.fork} — a path exits the region without passing the barrier (plain dominance is insufficient)`, anchor: pair.fork });
417
+ }
418
+ // (c) every activated branch is an effective prerequisite of the join
419
+ for (const b of pair.branches) {
420
+ const bPdom = pdom.get(b) ?? new Set();
421
+ if (!bPdom.has(pair.join)) {
422
+ out.push({ rule: 'barrier-postdominates', severity: 'fail', message: `activated branch ${b} can bypass join ${pair.join} — a dispatched branch is never skippable`, anchor: b });
423
+ }
424
+ }
425
+ }
426
+ return out;
427
+ }
428
+ function ruleBudgetBeforeSpawn(ctx) {
429
+ if (ctx.projection === null)
430
+ return noPlan('budget-before-spawn');
431
+ const out = [];
432
+ for (const f of ctx.projection.facts) {
433
+ if ((f.kind === 'agent' || f.kind === 'fanout') && (f.budgetMaxAgents === null || f.budgetMaxAgents < 1)) {
434
+ out.push({ rule: 'budget-before-spawn', severity: 'fail', message: `step ${f.id} declares no budget.maxAgents — every spawn path needs a budget guard, and retries consume budget`, anchor: f.id });
435
+ }
436
+ }
437
+ // script cross-check: the generated guard must exist when the script came from a plan
438
+ if (out.length === 0 && !ctx.code.includes('__spendBudget(')) {
439
+ out.push({ rule: 'budget-before-spawn', severity: 'fail', message: 'plan-bound script carries no __spendBudget guard on the spawn path', anchor: '__spendBudget(' });
440
+ }
441
+ return out;
442
+ }
443
+ function ruleRetryIdempotent(ctx) {
444
+ if (ctx.projection === null)
445
+ return noPlan('retry-idempotent');
446
+ const out = [];
447
+ for (const f of ctx.projection.facts) {
448
+ if (f.maxAttempts > 1 && !f.idempotent) {
449
+ out.push({ rule: 'retry-idempotent', severity: 'fail', message: `step ${f.id}: maxAttempts ${f.maxAttempts} > 1 on a non-idempotent step (INV-4; maxAttempts includes the initial attempt)`, anchor: f.id });
450
+ }
451
+ }
452
+ return out;
453
+ }
454
+ function ruleResumeFingerprint(ctx) {
455
+ const hasResume = ctx.script.includes('checkpoints.jsonl');
456
+ if (!hasResume) {
457
+ return ctx.projection === null ? [] : []; // no resume machinery — nothing to check
458
+ }
459
+ const referencesFp = /EXEC_FP|exec-fp|execFingerprint|execFp/.test(ctx.script);
460
+ if (referencesFp)
461
+ return [];
462
+ if (ctx.projection !== null) {
463
+ return [{ rule: 'resume-fingerprint', severity: 'fail', message: 'plan-bound script resumes on inputHash alone — the resume guard must include the FULL execution fingerprint (topology+prompts+models+tools, FR-1.6/AM-10)', anchor: 'checkpoints.jsonl' }];
464
+ }
465
+ return [{ rule: 'resume-fingerprint', severity: 'warn', message: 'legacy resume guard hashes inputs (CKPT_SCHEMA_VERSION + inputHash) but not the full execution fingerprint (topology+prompts+models+tools) — a model/prompt edit alone will not invalidate a resume', anchor: 'checkpoints.jsonl' }];
466
+ }
467
+ function rulePauseWired(ctx) {
468
+ if (ctx.projection === null)
469
+ return noPlan('pause-wired');
470
+ const out = [];
471
+ for (const p of ctx.projection.pauses) {
472
+ const returned = ctx.script.includes(`'${p.state}'`) || ctx.script.includes(`"${p.state}"`);
473
+ const resumeRead = ctx.code.includes(`A['${p.resumeArg}']`) || ctx.code.includes(`A["${p.resumeArg}"]`) || ctx.code.includes(`A.${p.resumeArg}`) || ctx.code.includes(`args.${p.resumeArg}`);
474
+ if (!returned)
475
+ out.push({ rule: 'pause-wired', severity: 'fail', message: `declared pause state "${p.state}" is returned nowhere in the script (INV-5)`, anchor: p.state });
476
+ if (!resumeRead)
477
+ out.push({ rule: 'pause-wired', severity: 'fail', message: `pause "${p.state}": resumeArg "${p.resumeArg}" is read nowhere — a re-invoke could never resume`, anchor: p.resumeArg });
478
+ }
479
+ return out;
480
+ }
481
+ function ruleDispatchByDeliverable(ctx) {
482
+ if (ctx.projection === null) {
483
+ // script-only: the wrapper's presence is not a violation by itself (a file deliverable behind
484
+ // the landed barrier is the legitimate use) — undecidable without the plan
485
+ return ctx.script.includes('codex-rescue') ? noPlan('dispatch-by-deliverable') : [];
486
+ }
487
+ const out = [];
488
+ for (const f of ctx.projection.facts) {
489
+ if (f.deliverable === 'return-value' && f.dispatch === 'codex-wrapper') {
490
+ out.push({ rule: 'dispatch-by-deliverable', severity: 'fail', message: `step ${f.id}: return-value deliverable routed to the fire-and-forget wrapper — its stub return would read as a clean result (INV-8)`, anchor: f.id });
491
+ }
492
+ }
493
+ return out;
494
+ }
495
+ function ruleNoAgentOutsideRunstep(ctx) {
496
+ const declaresRunStep = /async function runStep\s*\(/.test(ctx.script);
497
+ if (!declaresRunStep) {
498
+ // legacy/hand-written script — the choke-point contract only binds generated loops
499
+ return ctx.projection === null ? noPlan('no-agent-outside-runstep') : [{ rule: 'no-agent-outside-runstep', severity: 'fail', message: 'plan-bound script declares no runStep choke point — every agent() call must ride through it', anchor: 'runStep' }];
500
+ }
501
+ const out = [];
502
+ // find the runStep body extent (brace matching from its declaration)
503
+ const start = ctx.script.search(/async function runStep\s*\(/);
504
+ let depth = 0;
505
+ let i = ctx.script.indexOf('{', start);
506
+ let end = i;
507
+ for (; i < ctx.script.length; i++) {
508
+ const c = ctx.script[i];
509
+ if (c === '{')
510
+ depth++;
511
+ if (c === '}') {
512
+ depth--;
513
+ if (depth === 0) {
514
+ end = i;
515
+ break;
516
+ }
517
+ }
518
+ }
519
+ for (const m of ctx.script.matchAll(/(?<![.\w])agent\(/g)) {
520
+ const idx = m.index ?? 0;
521
+ if (idx >= start && idx <= end)
522
+ continue; // inside runStep
523
+ const lineStart = ctx.script.lastIndexOf('\n', idx) + 1;
524
+ const lineEnd = ctx.script.indexOf('\n', idx);
525
+ const line = ctx.script.slice(lineStart, lineEnd === -1 ? undefined : lineEnd);
526
+ if (line.includes('loop-lint: infra-agent'))
527
+ continue; // marked infra (trace flush / ckpt write)
528
+ if (line.includes('runStep('))
529
+ continue; // a thunk handed TO runStep — the choke point wraps it
530
+ const commentAt = line.indexOf('//');
531
+ if (commentAt !== -1 && lineStart + commentAt < idx)
532
+ continue; // prose mention in a comment
533
+ out.push({ rule: 'no-agent-outside-runstep', severity: 'fail', message: 'agent() call outside the runStep choke point (and not marked `// loop-lint: infra-agent`) — it would escape seq/retry/budget/checkpoint discipline', anchor: line.trim().slice(0, 80) });
534
+ }
535
+ return out;
536
+ }
537
+ function ruleSizeBudget(ctx) {
538
+ const n = ctx.lines.length;
539
+ if (n > SIZE_BUDGET_WARN_LINES) {
540
+ return [{ rule: 'size-budget', severity: 'warn', message: `${n} lines > ${SIZE_BUDGET_WARN_LINES} advisory budget — consider splitting phases or moving judgment into skills (WARN only, never blocking — FR-3.10)`, anchor: 'wc -l' }];
541
+ }
542
+ return [];
543
+ }
544
+ export function lint(scriptText, opts = {}) {
545
+ const mode = opts.mode ?? 'default';
546
+ const plan = opts.plan ?? null;
547
+ const ctx = {
548
+ script: scriptText,
549
+ code: stripComments(scriptText),
550
+ lines: scriptText.split('\n'),
551
+ plan,
552
+ projection: plan === null ? null : toLintProjection(plan),
553
+ blobRegistry: opts.blobRegistry ?? null,
554
+ mode,
555
+ };
556
+ const findings = [];
557
+ const rules = {};
558
+ const run = (id, fn) => {
559
+ const fs = fn();
560
+ let sev = 'pass';
561
+ for (const f of fs) {
562
+ findings.push(f);
563
+ if (f.severity === 'fail')
564
+ sev = 'fail';
565
+ else if (f.severity === 'inconclusive' && sev !== 'fail')
566
+ sev = 'inconclusive';
567
+ else if (f.severity === 'warn' && sev === 'pass')
568
+ sev = 'warn';
569
+ }
570
+ rules[id] = sev;
571
+ };
572
+ run('meta-complete', () => ruleMetaComplete(ctx));
573
+ run('phase-parity', () => rulePhaseParity(ctx));
574
+ run('sandbox-bans', () => ruleSandboxBans(ctx));
575
+ run('shq-hygiene', () => ruleShqHygiene(ctx));
576
+ run('agent-labelled', () => ruleAgentLabelled(ctx));
577
+ run('no-partial-checkpoint', () => ruleNoPartialCheckpoint(ctx));
578
+ run('plan-binding', () => rulePlanBinding(ctx, opts.planDigestValue ?? null));
579
+ run('blob-hash', () => ruleBlobHash(ctx));
580
+ run('fanout-bounded', () => ruleFanoutBounded(ctx));
581
+ run('barrier-postdominates', () => ruleBarrierPostdominates(ctx));
582
+ run('budget-before-spawn', () => ruleBudgetBeforeSpawn(ctx));
583
+ run('retry-idempotent', () => ruleRetryIdempotent(ctx));
584
+ run('resume-fingerprint', () => ruleResumeFingerprint(ctx));
585
+ run('pause-wired', () => rulePauseWired(ctx));
586
+ run('dispatch-by-deliverable', () => ruleDispatchByDeliverable(ctx));
587
+ run('no-agent-outside-runstep', () => ruleNoAgentOutsideRunstep(ctx));
588
+ run('size-budget', () => ruleSizeBudget(ctx));
589
+ const severities = Object.values(rules);
590
+ let verdict;
591
+ if (severities.includes('fail'))
592
+ verdict = 'fail';
593
+ else if (severities.includes('inconclusive')) {
594
+ // INV-13: inconclusive is NEVER a pass. require-plan hardens it to fail; legacy ACCEPTS the
595
+ // enumerated rows as the known honest gap of a plan-less script (still reported, never hidden).
596
+ verdict = mode === 'require-plan' ? 'fail' : mode === 'legacy' ? 'pass' : 'inconclusive';
597
+ }
598
+ else
599
+ verdict = 'pass';
600
+ return { verdict, mode, findings, rules };
601
+ }
602
+ /** CLI exit-code convention (mirrors consult-gate: 0 pass / 1 fail / 3 inconclusive). */
603
+ export function lintExitCode(run) {
604
+ return run.verdict === 'pass' ? 0 : run.verdict === 'fail' ? 1 : 3;
605
+ }
606
+ //# sourceMappingURL=loop-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-lint.js","sourceRoot":"","sources":["../src/loop-lint.ts"],"names":[],"mappings":"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"}