@farmslot/agent-runtime 0.17.5 → 0.18.0
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/CHANGELOG.md +8 -0
- package/dist/execution-template/infer.d.ts +2 -2
- package/dist/execution-template/infer.d.ts.map +1 -1
- package/dist/execution-template/infer.js +3 -3
- package/dist/execution-template/infer.js.map +1 -1
- package/dist/task-init/index.d.ts.map +1 -1
- package/dist/task-init/index.js +1 -0
- package/dist/task-init/index.js.map +1 -1
- package/dist/task-init/task-document.d.ts.map +1 -1
- package/dist/task-init/task-document.js +7 -0
- package/dist/task-init/task-document.js.map +1 -1
- package/dist/task-init/write.d.ts +2 -0
- package/dist/task-init/write.d.ts.map +1 -1
- package/dist/task-init/write.js +11 -1
- package/dist/task-init/write.js.map +1 -1
- package/package.json +3 -3
- package/scripts/acceptance-cli.cjs +4 -0
- package/scripts/acceptance-ledger.cjs +81 -143
- package/scripts/check-task-artifact-contract.mjs +31 -7
- package/scripts/checklist-target.cjs +10 -10
- package/scripts/mark-checklist-step.cjs +21 -20
- package/scripts/worker-terminal-contract.cjs +345 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.18.0 - 2026-10-12
|
|
6
|
+
|
|
7
|
+
- Consume the shared acceptance contract and engine-derived claims; automatic ledgers permit only audited untestable overrides (ADR-062).
|
|
8
|
+
- Execute declared deterministic checklist commands through mark and refuse completion without current passing receipts and logs. Track submodule revisions too; require submodule changes to be committed before checking the parent repository.
|
|
9
|
+
- Use neutral review/review-fix task and terminal contracts across execution templates and checklist helpers.
|
|
10
|
+
|
|
11
|
+
- Successful task completion requires verdicts for every registered acceptance criterion, including older contracts without an acceptance opt-in. Missing or unreadable ledgers fail closed; no-change and review outcomes retain their existing contracts.
|
|
12
|
+
|
|
5
13
|
## 0.17.5 - 2026-10-11
|
|
6
14
|
|
|
7
15
|
- Align the protocol dependency with 0.37.0 so consumers resolve one copy.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ExecutionTemplateEntry, ExecutionTemplateLayout, ExecutionTemplateSource } from './types.js';
|
|
2
|
-
/** Longest-first so `fix-bug` / `pr-complete` / `
|
|
3
|
-
export declare const FARMSLOT_FLOW_PREFIXES: readonly ["
|
|
2
|
+
/** Longest-first so `fix-bug` / `pr-complete` / `review` win over shorter prefixes. */
|
|
3
|
+
export declare const FARMSLOT_FLOW_PREFIXES: readonly ["review-fix", "pr-complete", "fix-bug", "review-pr", "update-branch", "review", "validate-dep", "ci-fix", "dev", "qa"];
|
|
4
4
|
export declare function humanizeBasename(basename: string): string;
|
|
5
5
|
export declare function inferFlowFromBasename(basename: string): string | null;
|
|
6
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,sBAAsB,EAEtB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,
|
|
1
|
+
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,sBAAsB,EAEtB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,kIAWzB,CAAC;AAIX,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOrE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAS/F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAsD7C"}
|
|
@@ -2,14 +2,14 @@ import path from 'node:path';
|
|
|
2
2
|
import { EXECUTION_TEMPLATE_DOMAIN_LABEL_PREFIX } from '@farmslot/protocol';
|
|
3
3
|
import { frontmatterPlatforms, parseMarkdownDocument, } from './frontmatter.js';
|
|
4
4
|
import { sha256Text } from './snapshot.js';
|
|
5
|
-
/** Longest-first so `fix-bug` / `pr-complete` / `
|
|
5
|
+
/** Longest-first so `fix-bug` / `pr-complete` / `review` win over shorter prefixes. */
|
|
6
6
|
export const FARMSLOT_FLOW_PREFIXES = [
|
|
7
|
-
'
|
|
7
|
+
'review-fix',
|
|
8
8
|
'pr-complete',
|
|
9
9
|
'fix-bug',
|
|
10
10
|
'review-pr',
|
|
11
11
|
'update-branch',
|
|
12
|
-
'
|
|
12
|
+
'review',
|
|
13
13
|
'validate-dep',
|
|
14
14
|
'ci-fix',
|
|
15
15
|
'dev',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,sCAAsC,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EACL,oBAAoB,EAEpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,
|
|
1
|
+
{"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/execution-template/infer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task-init/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAUhE,mGAAmG;AACnG,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,8BAA8B,CAMhC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,UAAU,EAAE,iBAAiB,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task-init/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAUhE,mGAAmG;AACnG,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,8BAA8B,CAMhC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,UAAU,EAAE,iBAAiB,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAqF1E;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,wBAAwB,GAAG,0BAA0B,CAAC;IAC1E,kBAAkB,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;CACpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgBzE"}
|
package/dist/task-init/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task-init/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task-init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-document.d.ts","sourceRoot":"","sources":["../../src/task-init/task-document.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,aAAa,wBAAwB,CAAC;AACnD,eAAO,MAAM,SAAS,0BAA0B,CAAC;AACjD,wFAAwF;AACxF,eAAO,MAAM,+BAA+B,qBAAqB,CAAC;AAwClE;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAgBlF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAO7E;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iEAAiE;IACjE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"task-document.d.ts","sourceRoot":"","sources":["../../src/task-init/task-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,6 +92,13 @@ export function buildTaskDocument(input) {
|
|
|
92
92
|
if (input.modePreamble.trim())
|
|
93
93
|
sections.push(input.modePreamble, '');
|
|
94
94
|
sections.push('## Task', '', '```text', taskBlock, '```', '', '## Description', '', input.description || '_No description_', '', '## Acceptance Criteria', '', renderAcceptanceCriteria(input.acceptanceCriteria));
|
|
95
|
+
if (normalizeAcceptanceCriteria(input.acceptanceCriteria).length > 0) {
|
|
96
|
+
const agentRoot = vars.farmslot_dir?.replace(/^~(?=\/)/, '${HOME}');
|
|
97
|
+
const agent = agentRoot
|
|
98
|
+
? `node "${agentRoot}/packages/agent-runtime/bin/farmslot-agent.mjs"`
|
|
99
|
+
: 'farmslot-agent';
|
|
100
|
+
sections.push('', '## Acceptance verdicts + recipe coverage', '', `Before successful completion or handing off a PR, set TASK_DIR to \`${taskDir}\` and run \`${agent} ac list\`. Record an honest verdict for every registered AC with \`${agent} ac set AC-N proven --proof-mode state --recipe-node <node-id> --evidence <task-relative-path>\`; choose the actual state, visual or mixed mode and existing evidence, and omit the recipe node when no recipe applies. Use \`untestable --note <reason>\` only when proof is unavailable.`, `Run \`ac list\` again. When recipe.json exists, render coverage with \`${agent} ac render\` to a temporary file, then replace \`artifacts/recipe-coverage.md\` only after a successful render. Run \`${agent} artifact-check ${taskDir} --require-recipe-coverage-if-recipe --require-acceptance-status\` before \`mark complete\`. Missing or unrecorded verdicts refuse completion; checked checklist items alone do not assess an AC.`);
|
|
101
|
+
}
|
|
95
102
|
if (input.affectedArea && input.affectedArea !== '_Not specified_') {
|
|
96
103
|
sections.push('', '## Affected Area', '', input.affectedArea);
|
|
97
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-document.js","sourceRoot":"","sources":["../../src/task-init/task-document.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"task-document.js","sourceRoot":"","sources":["../../src/task-init/task-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ export interface WriteTaskDirInput {
|
|
|
26
26
|
markCommand?: string;
|
|
27
27
|
handoff: HandoffMetadata;
|
|
28
28
|
terminalContract: WorkerTerminalContractDocument;
|
|
29
|
+
/** Project command references made available to the selected checklist. */
|
|
30
|
+
deterministicCommands?: Record<string, string>;
|
|
29
31
|
/** Ticket data as fetched, written to inputs/bug-input.json when present. */
|
|
30
32
|
bugInput?: unknown;
|
|
31
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/task-init/write.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/task-init/write.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,SAAS,SAAS,CAAC;AAChC,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAepD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,8FAA8F;AAC9F,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;IACzB,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAepF;AAED,gFAAgF;AAChF,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,EAC9C,eAAe,UAAQ,GACtB,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CA8F/C"}
|
package/dist/task-init/write.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// The task-dir writer: the only code that lays out a task directory. A control
|
|
2
2
|
// plane and a harness both call it, so the two surfaces cannot drift.
|
|
3
3
|
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
4
5
|
import path from 'node:path';
|
|
5
6
|
import { fileURLToPath } from 'node:url';
|
|
6
7
|
import { isDeepStrictEqual } from 'node:util';
|
|
@@ -11,6 +12,8 @@ export const MARK_SHIM = 'mark';
|
|
|
11
12
|
/** Whole-command env override honoured by every `mark` shim. */
|
|
12
13
|
export const MARK_COMMAND_ENV = 'FARMSLOT_MARK_CMD';
|
|
13
14
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
const { deterministicChecks } = require('../../scripts/worker-terminal-contract.cjs');
|
|
14
17
|
/**
|
|
15
18
|
* Quote one word for the shim's default command: double quotes keep spaces
|
|
16
19
|
* together while `$HOME` (a remote slot's home) still expands.
|
|
@@ -42,11 +45,18 @@ export async function writeTaskDir(input) {
|
|
|
42
45
|
await mkdir(path.join(taskDir, 'artifacts'), { recursive: true });
|
|
43
46
|
const taskDocument = path.join(taskDir, TASK_DOCUMENT);
|
|
44
47
|
await writeFile(taskDocument, input.taskMarkdown, 'utf-8');
|
|
45
|
-
|
|
48
|
+
const terminalContract = deterministicChecks.freeze(input.terminalContract, input.checklistMarkdown ?? input.taskMarkdown, input.checklistMarkdown === null ? TASK_DOCUMENT : EXECUTION_CHECKLIST_DOCUMENT, input.deterministicCommands);
|
|
49
|
+
return { taskDocument, ...(await ensureTaskRuntime({ ...input, terminalContract }, true)) };
|
|
46
50
|
}
|
|
47
51
|
/** Initialize existing author-owned tasks through the same runtime producer. */
|
|
48
52
|
export async function ensureTaskRuntime(input, replaceExisting = false) {
|
|
49
53
|
const taskDir = path.resolve(input.taskDir);
|
|
54
|
+
if (input.checklistMarkdown !== null) {
|
|
55
|
+
input = {
|
|
56
|
+
...input,
|
|
57
|
+
terminalContract: deterministicChecks.freeze(input.terminalContract, input.checklistMarkdown, EXECUTION_CHECKLIST_DOCUMENT, input.deterministicCommands),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
50
60
|
if (!replaceExisting) {
|
|
51
61
|
const existing = async (name) => {
|
|
52
62
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/task-init/write.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,sEAAsE;AAEtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAE/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,aAAa,EAEb,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAChC,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/task-init/write.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,sEAAsE;AAEtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAE/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,aAAa,EAEb,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAChC,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3F,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,4CAA4C,CASnF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC;AAClD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,kBAAkB;IAChC,OAAO,QAAQ,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;AACtG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO;QACL,qBAAqB;QACrB,mBAAmB;QACnB,oDAAoD;QACpD,WAAW,gBAAgB,KAAK,WAAW,eAAe;QAC1D,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AA2BD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE3D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CACjD,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,EAC7C,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B,EAC/E,KAAK,CAAC,qBAAqB,CAC5B,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA8C,EAC9C,eAAe,GAAG,KAAK;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACrC,KAAK,GAAG;YACN,GAAG,KAAK;YACR,gBAAgB,EAAE,mBAAmB,CAAC,MAAM,CAC1C,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,iBAAiB,EACvB,4BAA4B,EAC5B,KAAK,CAAC,qBAAqB,CAC5B;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;YAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC1B,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM;YAC1B,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,IAAI,EAAE,CAAC;YAC3E,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzF,MAAM,IAAI,KAAK,CACb,sIAAsI,CACvI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,8BAA8B,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,CAAC,EACxB,UAAU,EAAE,WAAW,EACvB,GAAG,KAAK,EACuB,EAAE,EAAE,CAAC,KAAK,CAAC;QAC5C,IACE,QAAQ,KAAK,SAAS;YACtB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAExF,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAC;IACN,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAE,IAAY,EAAoB,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACzF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACrC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACtB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,+EAA+E;QAC/E,IACE,OAAO,CAAC,UAAU,CAAC,8CAA8C,CAAC;YAClE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAEzC,MAAM,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;IAC5E,MAAM,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtF,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AAC3E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farmslot/agent-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"typecheck": "yarn workspace @farmslot/protocol build && tsc --noEmit --project tsconfig.json",
|
|
37
|
-
"test": "node test/mark-checklist-step.test.cjs && node test/mark-subtask.test.cjs && node test/acceptance-ledger.test.cjs && node test/checklist-target-sync.test.mjs && node test/acceptance-ledger-sync.test.mjs && node test/package-exports.test.cjs && node test/check-task-artifact-contract.test.cjs && node test/recipe-quality-builder.test.cjs && node test/task-init.test.mjs && node --import tsx ../../scripts/e2e-subtask-mark.mts && node --import tsx ../../scripts/e2e-acceptance-ledger.mts && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/execution-template && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/task-init && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/native",
|
|
37
|
+
"test": "node --test test/deterministic-checks.test.cjs && node test/mark-checklist-step.test.cjs && node test/mark-subtask.test.cjs && node test/acceptance-ledger.test.cjs && node test/checklist-target-sync.test.mjs && node test/acceptance-ledger-sync.test.mjs && node test/package-exports.test.cjs && node test/check-task-artifact-contract.test.cjs && node test/recipe-quality-builder.test.cjs && node test/task-init.test.mjs && node --import tsx ../../scripts/e2e-subtask-mark.mts && node --import tsx ../../scripts/e2e-acceptance-ledger.mts && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/execution-template && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/task-init && node ../../scripts/quality/run-tsx-tests.mjs --cwd . --tsconfig tsconfig.json src/native",
|
|
38
38
|
"format": "prettier --write --ignore-path ../../.prettierignore .",
|
|
39
39
|
"format:check": "prettier --check --ignore-path ../../.prettierignore .",
|
|
40
40
|
"lint": "eslint \"src/**/*.ts\"",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"prepublishOnly": "node ../../scripts/quality/check-farmslot-package-readiness.mjs --publish --packages @farmslot/agent-runtime"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@farmslot/protocol": "0.
|
|
48
|
+
"@farmslot/protocol": "0.39.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^22.0.0",
|
|
@@ -29,6 +29,7 @@ const USAGE = [
|
|
|
29
29
|
` --proof-mode <${ACCEPTANCE_PROOF_MODES.join('|')}> how the criterion is proven`,
|
|
30
30
|
' --evidence <task-dir relative path> repeatable; the file must exist',
|
|
31
31
|
' --recipe-node <id> repeatable; recipe node proving it',
|
|
32
|
+
' --actor <identity> required for an automatic-ledger override',
|
|
32
33
|
' --note "..." why, especially for untestable',
|
|
33
34
|
' ac list every criterion with its current verdict (JSON, verdict null when unrecorded)',
|
|
34
35
|
' ac render the coverage table, ending with the Overall recipe coverage line',
|
|
@@ -55,6 +56,7 @@ function parseArgs(argv) {
|
|
|
55
56
|
evidence: [],
|
|
56
57
|
recipeNodes: [],
|
|
57
58
|
note: undefined,
|
|
59
|
+
actor: undefined,
|
|
58
60
|
};
|
|
59
61
|
for (let i = 0; i < argv.length; i += 1) {
|
|
60
62
|
const arg = argv[i];
|
|
@@ -62,6 +64,7 @@ function parseArgs(argv) {
|
|
|
62
64
|
else if (arg === '--proof-mode') opts.proofMode = takeValue(argv, i++, arg);
|
|
63
65
|
else if (arg === '--evidence') opts.evidence.push(takeValue(argv, i++, arg));
|
|
64
66
|
else if (arg === '--recipe-node') opts.recipeNodes.push(takeValue(argv, i++, arg));
|
|
67
|
+
else if (arg === '--actor') opts.actor = takeValue(argv, i++, arg);
|
|
65
68
|
else if (arg === '--note') opts.note = takeValue(argv, i++, arg);
|
|
66
69
|
else if (arg === '-h' || arg === '--help') usage(0);
|
|
67
70
|
else if (arg.startsWith('-')) throw new AcceptanceRefusal(`unknown option ${arg}`, 2);
|
|
@@ -98,6 +101,7 @@ function main(argv) {
|
|
|
98
101
|
evidence: opts.evidence,
|
|
99
102
|
recipeNodes: opts.recipeNodes,
|
|
100
103
|
note: opts.note,
|
|
104
|
+
actor: opts.actor,
|
|
101
105
|
});
|
|
102
106
|
const entry = ledger.criteria.find((criterion) => criterion.id === id);
|
|
103
107
|
console.log(`${id}: ${entry.verdict}${entry.proofMode ? ` (${entry.proofMode})` : ''}`);
|
|
@@ -12,16 +12,20 @@ const { atomicWrite, readJson } = require('./mark-io.cjs');
|
|
|
12
12
|
// (@farmslot/recipe-cli). The ids come from task init, which records the criteria in
|
|
13
13
|
// inputs/handoff.json; this module never invents one.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
// of @farmslot/protocol/contracts/acceptance (see test/acceptance-ledger-sync.test.mjs).
|
|
17
|
-
// The mirror exists because the mark engine and this CLI are CJS and must run on a
|
|
18
|
-
// slot without a built protocol package.
|
|
15
|
+
// Portable contract helpers are shared with protocol clients, including unbuilt slot scripts.
|
|
19
16
|
|
|
20
17
|
const HANDOFF_INPUT = path.join('inputs', 'handoff.json');
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
const {
|
|
19
|
+
ACCEPTANCE_STATUS_ARTIFACT,
|
|
20
|
+
ACCEPTANCE_VERDICTS,
|
|
21
|
+
ACCEPTANCE_PROOF_MODES,
|
|
22
|
+
ACCEPTANCE_CRITERION_ID_PATTERN,
|
|
23
|
+
acceptanceCriterionId,
|
|
24
|
+
validateAcceptanceStatusLedger,
|
|
25
|
+
acceptanceCriteriaView,
|
|
26
|
+
summarizeAcceptanceStatus,
|
|
27
|
+
renderAcceptanceCoverage,
|
|
28
|
+
} = require('@farmslot/protocol/scripts/acceptance.mjs');
|
|
25
29
|
|
|
26
30
|
/** A refused command: the message is worker-facing, the code is the exit code. */
|
|
27
31
|
class AcceptanceRefusal extends Error {
|
|
@@ -36,142 +40,10 @@ class AcceptanceRefusal extends Error {
|
|
|
36
40
|
* `AC-<N>` for a criterion's position in the handoff array.
|
|
37
41
|
* @param {number} index 0-based position in inputs/handoff.json task.acceptanceCriteria.
|
|
38
42
|
*/
|
|
39
|
-
function acceptanceCriterionId(index) {
|
|
40
|
-
return `AC-${index + 1}`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
43
|
function isRecord(value) {
|
|
44
44
|
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
function isNonEmptyString(value) {
|
|
48
|
-
return typeof value === 'string' && value.trim().length > 0;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function validateAcceptanceStatusLedger(value) {
|
|
52
|
-
const issues = [];
|
|
53
|
-
if (!isRecord(value)) return ['acceptance ledger: expected object'];
|
|
54
|
-
if (value.schemaVersion !== 1) issues.push('acceptance ledger schemaVersion: expected 1');
|
|
55
|
-
if (!Array.isArray(value.criteria)) {
|
|
56
|
-
issues.push('acceptance ledger criteria: expected array');
|
|
57
|
-
return issues;
|
|
58
|
-
}
|
|
59
|
-
const seen = new Set();
|
|
60
|
-
value.criteria.forEach((entry, index) => {
|
|
61
|
-
const prefix = `acceptance ledger criteria[${index}]`;
|
|
62
|
-
if (!isRecord(entry)) {
|
|
63
|
-
issues.push(`${prefix}: expected object`);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (!isNonEmptyString(entry.id) || !ACCEPTANCE_CRITERION_ID_PATTERN.test(entry.id)) {
|
|
67
|
-
issues.push(`${prefix}.id: expected AC-<N>`);
|
|
68
|
-
} else if (seen.has(entry.id)) {
|
|
69
|
-
issues.push(`${prefix}.id: duplicate ${entry.id}`);
|
|
70
|
-
} else {
|
|
71
|
-
seen.add(entry.id);
|
|
72
|
-
}
|
|
73
|
-
if (typeof entry.text !== 'string') issues.push(`${prefix}.text: expected string`);
|
|
74
|
-
if (!ACCEPTANCE_VERDICTS.includes(entry.verdict)) {
|
|
75
|
-
issues.push(`${prefix}.verdict: expected one of ${ACCEPTANCE_VERDICTS.join(', ')}`);
|
|
76
|
-
}
|
|
77
|
-
if (entry.proofMode !== undefined && !ACCEPTANCE_PROOF_MODES.includes(entry.proofMode)) {
|
|
78
|
-
issues.push(`${prefix}.proofMode: expected one of ${ACCEPTANCE_PROOF_MODES.join(', ')}`);
|
|
79
|
-
}
|
|
80
|
-
for (const key of ['evidence', 'recipeNodes']) {
|
|
81
|
-
const list = entry[key];
|
|
82
|
-
if (!Array.isArray(list) || list.some((item) => !isNonEmptyString(item))) {
|
|
83
|
-
issues.push(`${prefix}.${key}: expected an array of non-empty strings`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (entry.note !== undefined && typeof entry.note !== 'string') {
|
|
87
|
-
issues.push(`${prefix}.note: expected string`);
|
|
88
|
-
}
|
|
89
|
-
if (!isNonEmptyString(entry.updatedAt)) {
|
|
90
|
-
issues.push(`${prefix}.updatedAt: expected non-empty string`);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
return issues;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function acceptanceCriteriaView(criteria, ledger) {
|
|
97
|
-
const byId = new Map((ledger?.criteria ?? []).map((entry) => [entry.id, entry]));
|
|
98
|
-
const rows = criteria.map((criterion) => ({
|
|
99
|
-
...criterion,
|
|
100
|
-
status: byId.get(criterion.id) ?? null,
|
|
101
|
-
}));
|
|
102
|
-
for (const entry of ledger?.criteria ?? []) {
|
|
103
|
-
if (!criteria.some((criterion) => criterion.id === entry.id)) {
|
|
104
|
-
rows.push({ id: entry.id, text: entry.text, status: entry });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return rows;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function summarizeAcceptanceStatus(ledger, criteria) {
|
|
111
|
-
const total = criteria
|
|
112
|
-
? Math.max(criteria.length, ledger.criteria.length)
|
|
113
|
-
: ledger.criteria.length;
|
|
114
|
-
const summary = {
|
|
115
|
-
proven: 0,
|
|
116
|
-
weak: 0,
|
|
117
|
-
missing: 0,
|
|
118
|
-
untestable: 0,
|
|
119
|
-
unrecorded: 0,
|
|
120
|
-
total,
|
|
121
|
-
};
|
|
122
|
-
for (const criterion of ledger.criteria) summary[criterion.verdict] += 1;
|
|
123
|
-
summary.unrecorded =
|
|
124
|
-
total - (summary.proven + summary.weak + summary.missing + summary.untestable);
|
|
125
|
-
return summary;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function cell(value) {
|
|
129
|
-
return (
|
|
130
|
-
value
|
|
131
|
-
.replace(/\|/g, '\\|')
|
|
132
|
-
.replace(/\s*\n\s*/g, ' ')
|
|
133
|
-
.trim() || '-'
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function list(values) {
|
|
138
|
-
return values.length > 0 ? cell(values.join(', ')) : '-';
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function renderAcceptanceCoverage(ledger, criteria = ledger.criteria) {
|
|
142
|
-
const summary = summarizeAcceptanceStatus(ledger, criteria);
|
|
143
|
-
const rows = acceptanceCriteriaView(criteria, ledger);
|
|
144
|
-
const untestable = ledger.criteria
|
|
145
|
-
.filter((criterion) => criterion.verdict === 'untestable')
|
|
146
|
-
.map((criterion) => criterion.id);
|
|
147
|
-
const lines = [
|
|
148
|
-
'## Recipe coverage',
|
|
149
|
-
'',
|
|
150
|
-
'| AC | Criterion | Verdict | Proof mode | Recipe nodes | Evidence | Note |',
|
|
151
|
-
'| --- | --- | --- | --- | --- | --- | --- |',
|
|
152
|
-
];
|
|
153
|
-
for (const row of rows) {
|
|
154
|
-
const status = row.status;
|
|
155
|
-
lines.push(
|
|
156
|
-
`| ${row.id} | ${cell(row.text)} | ${status ? status.verdict.toUpperCase() : 'NO VERDICT'} | ` +
|
|
157
|
-
`${status?.proofMode ?? '-'} | ${list(status?.recipeNodes ?? [])} | ` +
|
|
158
|
-
`${list(status?.evidence ?? [])} | ${cell(status?.note ?? '')} |`,
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
lines.push(
|
|
162
|
-
'',
|
|
163
|
-
`Overall recipe coverage: ${summary.proven}/${summary.total} ACs PROVEN ` +
|
|
164
|
-
`(untestable: ${untestable.length > 0 ? untestable.join(', ') : 'none'}, ` +
|
|
165
|
-
`weak: ${summary.weak}, missing: ${summary.missing}` +
|
|
166
|
-
`${summary.unrecorded > 0 ? `, no verdict: ${summary.unrecorded}` : ''})`,
|
|
167
|
-
'',
|
|
168
|
-
);
|
|
169
|
-
return lines.join('\n');
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// ---------------------------------------------------------------------------
|
|
173
|
-
// task-dir IO
|
|
174
|
-
|
|
175
47
|
function ledgerPath(taskDir) {
|
|
176
48
|
return path.join(taskDir, ACCEPTANCE_STATUS_ARTIFACT);
|
|
177
49
|
}
|
|
@@ -305,6 +177,35 @@ function setAcceptanceVerdict(taskDir, input) {
|
|
|
305
177
|
);
|
|
306
178
|
}
|
|
307
179
|
}
|
|
180
|
+
if (stored?.schemaVersion === 2) {
|
|
181
|
+
if (input.verdict !== 'untestable' || !input.note?.trim() || !input.actor?.trim())
|
|
182
|
+
throw new AcceptanceRefusal(
|
|
183
|
+
'Automatic claim verdicts are engine-owned; an untestable override requires actor and reason.',
|
|
184
|
+
);
|
|
185
|
+
const prior = stored.criteria.find((entry) => entry.id === input.id);
|
|
186
|
+
if (!prior) throw new AcceptanceRefusal(`No automatic claim ${input.id} to override.`);
|
|
187
|
+
const override = {
|
|
188
|
+
actor: input.actor,
|
|
189
|
+
reason: input.note,
|
|
190
|
+
priorVerdict: prior.verdict,
|
|
191
|
+
at: input.now ?? new Date().toISOString(),
|
|
192
|
+
};
|
|
193
|
+
const updated = {
|
|
194
|
+
...stored,
|
|
195
|
+
criteria: stored.criteria.map((entry) =>
|
|
196
|
+
entry.id === input.id
|
|
197
|
+
? {
|
|
198
|
+
...entry,
|
|
199
|
+
verdict: 'untestable',
|
|
200
|
+
note: input.note,
|
|
201
|
+
overrides: [...(entry.overrides ?? []), override],
|
|
202
|
+
}
|
|
203
|
+
: entry,
|
|
204
|
+
),
|
|
205
|
+
};
|
|
206
|
+
writeAcceptanceLedger(taskDir, updated);
|
|
207
|
+
return updated;
|
|
208
|
+
}
|
|
308
209
|
const byId = new Map((stored?.criteria ?? []).map((entry) => [entry.id, entry]));
|
|
309
210
|
byId.set(criterion.id, {
|
|
310
211
|
id: criterion.id,
|
|
@@ -325,6 +226,29 @@ function setAcceptanceVerdict(taskDir, input) {
|
|
|
325
226
|
return ledger;
|
|
326
227
|
}
|
|
327
228
|
|
|
229
|
+
/** Transfer one engine-owned execution. Never aggregate sibling attempts. */
|
|
230
|
+
function setDerivedClaims(taskDir, claims) {
|
|
231
|
+
if (claims.schemaVersion !== 2) throw new AcceptanceRefusal('Derived claims require schema 2.');
|
|
232
|
+
const registered = handoffAcceptanceCriteria(taskDir);
|
|
233
|
+
for (const criterion of registered) {
|
|
234
|
+
const claim = claims.criteria.find((entry) => entry.id === criterion.id);
|
|
235
|
+
if (!claim || claim.text !== criterion.text)
|
|
236
|
+
throw new AcceptanceRefusal(
|
|
237
|
+
`Engine claim ${criterion.id} does not match the registered task.`,
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
for (const claim of claims.criteria) {
|
|
241
|
+
if (
|
|
242
|
+
ACCEPTANCE_CRITERION_ID_PATTERN.test(claim.id) &&
|
|
243
|
+
!registered.some((entry) => entry.id === claim.id)
|
|
244
|
+
)
|
|
245
|
+
throw new AcceptanceRefusal(`Unknown task claim ${claim.id}.`);
|
|
246
|
+
for (const file of claim.evidence) assertEvidencePath(taskDir, file);
|
|
247
|
+
}
|
|
248
|
+
writeAcceptanceLedger(taskDir, claims);
|
|
249
|
+
return claims;
|
|
250
|
+
}
|
|
251
|
+
|
|
328
252
|
/** Every handoff criterion with its current verdict, or null when unrecorded. */
|
|
329
253
|
function acceptanceStatusList(taskDir) {
|
|
330
254
|
const stored = readAcceptanceLedger(taskDir);
|
|
@@ -350,7 +274,13 @@ function acceptanceStatusList(taskDir) {
|
|
|
350
274
|
* (`acceptance.allowWeak`). Returns an empty array when the run has no criteria.
|
|
351
275
|
*/
|
|
352
276
|
function acceptanceContractIssues(taskDir, options = {}) {
|
|
353
|
-
|
|
277
|
+
let criteria;
|
|
278
|
+
try {
|
|
279
|
+
criteria = requireHandoffAcceptanceCriteria(taskDir);
|
|
280
|
+
} catch (err) {
|
|
281
|
+
if (!(err instanceof AcceptanceRefusal)) throw err;
|
|
282
|
+
return [err.message];
|
|
283
|
+
}
|
|
354
284
|
if (criteria.length === 0) return [];
|
|
355
285
|
let stored;
|
|
356
286
|
try {
|
|
@@ -369,7 +299,10 @@ function acceptanceContractIssues(taskDir, options = {}) {
|
|
|
369
299
|
if (issues.length > 0) return issues;
|
|
370
300
|
const known = new Set(criteria.map((criterion) => criterion.id));
|
|
371
301
|
for (const entry of stored.criteria) {
|
|
372
|
-
if (
|
|
302
|
+
if (
|
|
303
|
+
!known.has(entry.id) &&
|
|
304
|
+
(stored.schemaVersion === 1 || ACCEPTANCE_CRITERION_ID_PATTERN.test(entry.id))
|
|
305
|
+
) {
|
|
373
306
|
issues.push(
|
|
374
307
|
`${ACCEPTANCE_STATUS_ARTIFACT}: ${entry.id} is not an acceptance criterion of this task`,
|
|
375
308
|
);
|
|
@@ -384,7 +317,11 @@ function acceptanceContractIssues(taskDir, options = {}) {
|
|
|
384
317
|
);
|
|
385
318
|
continue;
|
|
386
319
|
}
|
|
387
|
-
if (
|
|
320
|
+
if (
|
|
321
|
+
entry.verdict === 'failed' ||
|
|
322
|
+
entry.verdict === 'awaiting-review' ||
|
|
323
|
+
(!options.allowWeak && (entry.verdict === 'missing' || entry.verdict === 'weak'))
|
|
324
|
+
) {
|
|
388
325
|
issues.push(
|
|
389
326
|
`${criterion.id} is ${entry.verdict}: prove it, or record \`untestable\` with a note ` +
|
|
390
327
|
'(a flow may waive this with worker_terminal.acceptance.allowWeak)',
|
|
@@ -409,6 +346,7 @@ module.exports = {
|
|
|
409
346
|
readAcceptanceLedger,
|
|
410
347
|
renderAcceptanceCoverage,
|
|
411
348
|
setAcceptanceVerdict,
|
|
349
|
+
setDerivedClaims,
|
|
412
350
|
summarizeAcceptanceStatus,
|
|
413
351
|
validateAcceptanceStatusLedger,
|
|
414
352
|
writeAcceptanceLedger,
|
|
@@ -5,7 +5,10 @@ import path from 'node:path';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
|
|
7
7
|
const require = createRequire(import.meta.url);
|
|
8
|
-
const {
|
|
8
|
+
const {
|
|
9
|
+
expandedArtifactsForCommand,
|
|
10
|
+
deterministicChecks,
|
|
11
|
+
} = require('./worker-terminal-contract.cjs');
|
|
9
12
|
const { SUBTASK_INDEX_REL, openSubtaskUnits } = require('./subtask-unit.cjs');
|
|
10
13
|
const { acceptanceContractIssues } = require('./acceptance-ledger.cjs');
|
|
11
14
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
@@ -590,13 +593,13 @@ if (contractPath && terminalCommand && existsSync(contractPath)) {
|
|
|
590
593
|
issues.push(`${contractPath}: invalid worker terminal contract JSON (${error.message})`);
|
|
591
594
|
}
|
|
592
595
|
}
|
|
593
|
-
const
|
|
596
|
+
const isReviewTerminal = terminalContract?.flowType === 'review';
|
|
594
597
|
const hasRecipe = fileExists('artifacts/recipe.json');
|
|
595
598
|
|
|
596
599
|
// A reviewer must be able to report ISSUES when worker-owned proof is invalid.
|
|
597
600
|
// Its terminal gate validates only the reviewer-owned feedback artifact below;
|
|
598
601
|
// contribution and fix flows still validate the complete proof package.
|
|
599
|
-
if (!
|
|
602
|
+
if (!isReviewTerminal) {
|
|
600
603
|
const hasRecipeDecision = fileExists('artifacts/recipe-decision.json');
|
|
601
604
|
const recipeDecisionText = readText('artifacts/recipe-decision.json');
|
|
602
605
|
if (hasRecipeDecision) {
|
|
@@ -689,7 +692,10 @@ if (fileExists(SUBTASK_INDEX_REL)) {
|
|
|
689
692
|
// The acceptance ledger is the run's proof record (ADR-060): every criterion task
|
|
690
693
|
// init registered in inputs/handoff.json needs a verdict, and `weak` / `missing`
|
|
691
694
|
// fails unless the flow's terminal contract waives it.
|
|
692
|
-
if (
|
|
695
|
+
if (
|
|
696
|
+
flags.has('--require-acceptance-status') ||
|
|
697
|
+
(terminalCommand === 'complete' && !isReviewTerminal)
|
|
698
|
+
) {
|
|
693
699
|
for (const issue of acceptanceContractIssues(taskDir, {
|
|
694
700
|
allowWeak: terminalContract?.acceptance?.allowWeak === true,
|
|
695
701
|
})) {
|
|
@@ -707,9 +713,7 @@ if (flags.has('--require-learnings')) {
|
|
|
707
713
|
if (contractPath && terminalCommand && !existsSync(contractPath)) {
|
|
708
714
|
issues.push(`${contractPath}: explicit worker terminal contract missing`);
|
|
709
715
|
} else if (terminalContract && terminalCommand) {
|
|
710
|
-
const contract =
|
|
711
|
-
? { ...terminalContract, whenPresent: [] }
|
|
712
|
-
: terminalContract;
|
|
716
|
+
const contract = isReviewTerminal ? { ...terminalContract, whenPresent: [] } : terminalContract;
|
|
713
717
|
const expanded = expandedArtifactsForCommand(contract, terminalCommand, fileExists);
|
|
714
718
|
for (const artifactPath of expanded.artifacts) {
|
|
715
719
|
if (flags.has('--skip-learnings') && artifactPath === 'artifacts/learnings.md') continue;
|
|
@@ -728,9 +732,29 @@ if (contractPath && terminalCommand && !existsSync(contractPath)) {
|
|
|
728
732
|
}
|
|
729
733
|
}
|
|
730
734
|
|
|
735
|
+
const deterministicResults = [];
|
|
736
|
+
if (terminalCommand !== 'blocked') {
|
|
737
|
+
const checklists = new Set(
|
|
738
|
+
(terminalContract?.deterministicChecks ?? []).map((step) => step.checklist),
|
|
739
|
+
);
|
|
740
|
+
if (checklists.size === 0) checklists.add(undefined);
|
|
741
|
+
for (const checklist of checklists) {
|
|
742
|
+
try {
|
|
743
|
+
const result = deterministicChecks.evaluate(taskDir, checklist);
|
|
744
|
+
issues.push(...result.issues);
|
|
745
|
+
deterministicResults.push(...result.checks);
|
|
746
|
+
} catch (error) {
|
|
747
|
+
issues.push(`Deterministic checks cannot be validated: ${error.message}`);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
731
752
|
if (issues.length > 0) {
|
|
732
753
|
console.error('TASK_ARTIFACT_CONTRACT_FAIL');
|
|
733
754
|
for (const issue of issues) console.error(`- ${issue}`);
|
|
734
755
|
process.exit(1);
|
|
735
756
|
}
|
|
736
757
|
console.log('TASK_ARTIFACT_CONTRACT_PASS');
|
|
758
|
+
if (deterministicResults.length > 0) {
|
|
759
|
+
console.log(`${deterministicChecks.outputPrefix}${JSON.stringify(deterministicResults)}`);
|
|
760
|
+
}
|
|
@@ -14,8 +14,8 @@ const SUBTASKS_DIR = 'subtasks';
|
|
|
14
14
|
const SUBTASK_INDEX_FILE = 'index.json';
|
|
15
15
|
const SUBTASK_ID_PATTERN = /^[a-z0-9-]+$/;
|
|
16
16
|
|
|
17
|
-
const
|
|
18
|
-
const
|
|
17
|
+
const REVIEW_CHECKLIST = 'REVIEW.md';
|
|
18
|
+
const REVIEW_FIX_CHECKLIST = 'REVIEW-FIX.md';
|
|
19
19
|
const CI_FIX_CHECKLIST = 'CI-FIX.md';
|
|
20
20
|
// Sections whose checkboxes are informational (ACs, descriptions, upstream
|
|
21
21
|
// PR-template fields) — not task steps. Canonical copy lives in
|
|
@@ -181,13 +181,13 @@ function defaultWorkerTarget(taskDir) {
|
|
|
181
181
|
return targetForChecklistBasename(checklist);
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
const
|
|
185
|
-
const
|
|
184
|
+
const REVIEW_CHECKLIST_TARGET = targetForChecklistBasename(REVIEW_CHECKLIST);
|
|
185
|
+
const REVIEW_FIX_CHECKLIST_TARGET = targetForChecklistBasename(REVIEW_FIX_CHECKLIST);
|
|
186
186
|
const CI_FIX_CHECKLIST_TARGET = targetForChecklistBasename(CI_FIX_CHECKLIST);
|
|
187
187
|
|
|
188
188
|
const CHECKLIST_TARGET_BY_AGENT_ROLE = {
|
|
189
|
-
|
|
190
|
-
'
|
|
189
|
+
review: REVIEW_CHECKLIST_TARGET,
|
|
190
|
+
'review-fix': REVIEW_FIX_CHECKLIST_TARGET,
|
|
191
191
|
'ci-fix': CI_FIX_CHECKLIST_TARGET,
|
|
192
192
|
};
|
|
193
193
|
|
|
@@ -338,11 +338,11 @@ module.exports = {
|
|
|
338
338
|
INTERACTIVE_CHECKLIST_MARKDOWN,
|
|
339
339
|
WORKER_SIGNAL_FILE,
|
|
340
340
|
ROLE_SIGNAL_SUFFIX,
|
|
341
|
-
|
|
342
|
-
|
|
341
|
+
REVIEW_CHECKLIST,
|
|
342
|
+
REVIEW_FIX_CHECKLIST,
|
|
343
343
|
CI_FIX_CHECKLIST,
|
|
344
|
-
|
|
345
|
-
|
|
344
|
+
REVIEW_CHECKLIST_TARGET,
|
|
345
|
+
REVIEW_FIX_CHECKLIST_TARGET,
|
|
346
346
|
CI_FIX_CHECKLIST_TARGET,
|
|
347
347
|
CHECKLIST_TARGET_BY_AGENT_ROLE,
|
|
348
348
|
DEFAULT_CHECKLIST_TARGET_REGISTRY,
|
|
@@ -6,6 +6,7 @@ const { spawnSync } = require('node:child_process');
|
|
|
6
6
|
const {
|
|
7
7
|
expandedArtifactsForCommand,
|
|
8
8
|
resolveWorkerTerminalContract,
|
|
9
|
+
deterministicChecks,
|
|
9
10
|
} = require('./worker-terminal-contract.cjs');
|
|
10
11
|
const {
|
|
11
12
|
parseTaskDirMarkArgs,
|
|
@@ -42,8 +43,8 @@ const FLOW_REPORT_ARTIFACTS = {
|
|
|
42
43
|
'pr-complete': ['comments-report.md', 'report.md'],
|
|
43
44
|
'update-branch': ['branch-update-report.md', 'report.md'],
|
|
44
45
|
'ci-fix': ['report.md'],
|
|
45
|
-
|
|
46
|
-
'
|
|
46
|
+
review: ['review-feedback.md', 'report.md'],
|
|
47
|
+
'review-fix': ['report.md'],
|
|
47
48
|
};
|
|
48
49
|
const FALLBACK_REPORT_ARTIFACTS = [
|
|
49
50
|
'report.md',
|
|
@@ -61,16 +62,16 @@ function printHelp() {
|
|
|
61
62
|
usageLine,
|
|
62
63
|
'',
|
|
63
64
|
'Task-dir mode: farmslot-agent mark <task-dir> <step> — marks CHECKLIST.md (or TASK.md) unless checklist-target.json, written by a role switch, points elsewhere.',
|
|
64
|
-
'Override: farmslot-agent mark <task-dir> --checklist
|
|
65
|
+
'Override: farmslot-agent mark <task-dir> --checklist REVIEW.md <step> — optional --signal; signal defaults from checklist name.',
|
|
65
66
|
'Bootstrap: ./mark start — role-owned signal with status running (no checklist box).',
|
|
66
67
|
'Progress: ./mark 1, ./mark 2, ... — checks the box and appends checklistTiming.',
|
|
67
68
|
'Child units: ./mark sub start <id> --step N --from <path|inline:text>, then ./mark sub <id> <n> | complete [--report PATH] [--mark-last] | blocked --reason "..." | status.',
|
|
68
69
|
' While a child owns step N, ./mark N is refused; the child complete ticks it. Run ./mark sub --help for the child verbs.',
|
|
69
70
|
'Terminal:',
|
|
70
|
-
' ./mark complete [--mark-last] [--no-
|
|
71
|
+
' ./mark complete [--mark-last] [--no-review] [--skip-learnings] [--skip-checklist]',
|
|
71
72
|
' ./mark no-change --reason "..." [--already-fixed] [--mark-last] [--skip-learnings] [--skip-checklist]',
|
|
72
73
|
' ./mark blocked --reason "..." [--mark-last]',
|
|
73
|
-
'Terminal success paths require the flow contract artifacts: contribution flows need non-empty artifacts/learnings.md plus a flow outcome artifact (complete) or no-change-report (no-change); reviewer flows (
|
|
74
|
+
'Terminal success paths require the flow contract artifacts: contribution flows need non-empty artifacts/learnings.md plus a flow outcome artifact (complete) or no-change-report (no-change); reviewer flows (review, review-fix) need their feedback/report artifact instead of learnings.',
|
|
74
75
|
'PR flows (dev, fix-bug): write artifacts/pr-description.md. Other flows: review.md, review-feedback.md, branch-update-report.md, report.md, etc.',
|
|
75
76
|
'With --mark-last, every checklist box must be [x] unless --skip-checklist. complete also runs check-task-artifact-contract.mjs.',
|
|
76
77
|
'Do not write SIGNAL.json by hand or with echo.',
|
|
@@ -131,7 +132,7 @@ for (let i = 0; i < rest.length; i += 1) {
|
|
|
131
132
|
if (
|
|
132
133
|
key === '--mark-last' ||
|
|
133
134
|
key === '--already-fixed' ||
|
|
134
|
-
key === '--no-
|
|
135
|
+
key === '--no-review' ||
|
|
135
136
|
key === '--skip-learnings' ||
|
|
136
137
|
key === '--skip-checklist'
|
|
137
138
|
) {
|
|
@@ -276,9 +277,8 @@ function inferFlowType(taskPath) {
|
|
|
276
277
|
if (label.includes('pr-complete') || label.includes('pr complete')) return 'pr-complete';
|
|
277
278
|
if (label.includes('update-branch') || label.includes('update branch')) return 'update-branch';
|
|
278
279
|
if (label.includes('ci-fix') || label.includes('ci fix')) return 'ci-fix';
|
|
279
|
-
if (label.includes('
|
|
280
|
-
|
|
281
|
-
if (label.includes('self-review') || label.includes('self review')) return 'self-review';
|
|
280
|
+
if (label.includes('review fix') || label.includes('review-fix')) return 'review-fix';
|
|
281
|
+
if (label.includes('review')) return 'review';
|
|
282
282
|
if (label.includes('interactive dev')) return 'dev';
|
|
283
283
|
if (/\bdev\b/.test(label) && !label.includes('review')) return 'dev';
|
|
284
284
|
}
|
|
@@ -321,11 +321,9 @@ function assertArtifactContract(taskDir, taskPath, contract, terminalCommand) {
|
|
|
321
321
|
}
|
|
322
322
|
const contractPath = terminalContractPath(taskDir, taskPath);
|
|
323
323
|
const args = [ARTIFACT_CONTRACT_SCRIPT, taskDir];
|
|
324
|
-
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
// still completes; the ledger is watched, projected and preferred for coverage
|
|
328
|
-
// either way.
|
|
324
|
+
if (terminalCommand) args.push('--terminal', terminalCommand);
|
|
325
|
+
// This explicit flag keeps project opt-ins compatible with older checkers.
|
|
326
|
+
// Current checkers also enforce registered verdicts on terminal complete.
|
|
329
327
|
if (terminalCommand === 'complete' && contract?.acceptance?.require === true) {
|
|
330
328
|
let criteria;
|
|
331
329
|
try {
|
|
@@ -342,11 +340,10 @@ function assertArtifactContract(taskDir, taskPath, contract, terminalCommand) {
|
|
|
342
340
|
}
|
|
343
341
|
if (fs.existsSync(contractPath)) {
|
|
344
342
|
args.push('--contract', contractPath);
|
|
345
|
-
if (terminalCommand) args.push('--terminal', terminalCommand);
|
|
346
343
|
if (opts['skip-learnings']) args.push('--skip-learnings');
|
|
347
344
|
} else {
|
|
348
345
|
// No persisted contract file — honor the resolved builtin contract instead of
|
|
349
|
-
// assuming learnings: reviewer flows (
|
|
346
|
+
// assuming learnings: reviewer flows (review, review-fix) require their
|
|
350
347
|
// feedback/report artifact, not artifacts/learnings.md.
|
|
351
348
|
const contractRequiresLearnings = contract
|
|
352
349
|
? (contract.commands?.[terminalCommand ?? 'complete']?.artifacts ?? []).includes(
|
|
@@ -387,7 +384,7 @@ function assertTerminalPackagedEvidence(taskPath, taskDir, terminalCommand) {
|
|
|
387
384
|
}
|
|
388
385
|
|
|
389
386
|
if (terminalCommand === 'complete' || terminalCommand === 'no-change') {
|
|
390
|
-
assertArtifactContract(taskDir, taskPath);
|
|
387
|
+
assertArtifactContract(taskDir, taskPath, undefined, terminalCommand);
|
|
391
388
|
}
|
|
392
389
|
}
|
|
393
390
|
|
|
@@ -417,9 +414,7 @@ function buildSignalUpdate(signal, terminal, target, timing, events, now, taskPa
|
|
|
417
414
|
outcome: preset.outcome,
|
|
418
415
|
disposition: preset.disposition,
|
|
419
416
|
...(opts.reason ? { reason: opts.reason } : {}),
|
|
420
|
-
...(terminal.command === 'complete' && opts['no-
|
|
421
|
-
? { needsSelfReview: false }
|
|
422
|
-
: {}),
|
|
417
|
+
...(terminal.command === 'complete' && opts['no-review'] ? { needsReview: false } : {}),
|
|
423
418
|
...(opts['skip-learnings'] ? { artifactWaivers: { learnings: true } } : {}),
|
|
424
419
|
};
|
|
425
420
|
|
|
@@ -455,6 +450,12 @@ function resolveTarget(taskPath, stepNumber, markLast) {
|
|
|
455
450
|
// Also covers `--mark-last`: the parent must not tick a box whose child is
|
|
456
451
|
// still open, whichever way the row was chosen.
|
|
457
452
|
assertStepNotOwnedBySubtask(item.stepNumber);
|
|
453
|
+
try {
|
|
454
|
+
deterministicChecks.execute(path.dirname(taskPath), path.basename(taskPath), item.stepNumber);
|
|
455
|
+
} catch (error) {
|
|
456
|
+
console.error(error.message);
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
458
459
|
const nextLines = [...parsed.lines];
|
|
459
460
|
markStepInLines(nextLines, item);
|
|
460
461
|
updated = nextLines.join('\n');
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
const fs = require('node:fs');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const { createHash, randomUUID } = require('node:crypto');
|
|
4
|
+
const { spawnSync } = require('node:child_process');
|
|
5
|
+
const {
|
|
6
|
+
enumerateChecklistCheckboxes,
|
|
7
|
+
terminalContractInputForChecklist,
|
|
8
|
+
resolveChecklistTarget,
|
|
9
|
+
} = require('./checklist-target.cjs');
|
|
10
|
+
const { atomicWrite } = require('./mark-io.cjs');
|
|
11
|
+
|
|
1
12
|
/** @typedef {'complete' | 'no-change' | 'blocked'} WorkerTerminalCommand */
|
|
2
13
|
|
|
3
14
|
/**
|
|
@@ -122,7 +133,7 @@ const BUILTIN_FLOW_COMMANDS = {
|
|
|
122
133
|
// reviewer evaluates someone else's work, so the learnings requirement that
|
|
123
134
|
// applies to contribution flows does not apply here (matches the templates
|
|
124
135
|
// and the runtime FLOW_REPORT_ARTIFACTS mapping).
|
|
125
|
-
|
|
136
|
+
review: {
|
|
126
137
|
complete: {
|
|
127
138
|
report: 'artifacts/review-feedback.md',
|
|
128
139
|
artifacts: ['artifacts/review-feedback.md'],
|
|
@@ -133,7 +144,7 @@ const BUILTIN_FLOW_COMMANDS = {
|
|
|
133
144
|
},
|
|
134
145
|
blocked: { artifacts: [] },
|
|
135
146
|
},
|
|
136
|
-
'
|
|
147
|
+
'review-fix': {
|
|
137
148
|
complete: { report: 'artifacts/report.md', artifacts: ['artifacts/report.md'] },
|
|
138
149
|
'no-change': {
|
|
139
150
|
report: 'artifacts/no-change-report.md',
|
|
@@ -319,7 +330,7 @@ function templateBodyScope(content) {
|
|
|
319
330
|
* Deterministic structure checks beyond terminal artifact contract.
|
|
320
331
|
* @param {string} templateContent
|
|
321
332
|
* @param {{ roleChecklist?: boolean }} [options] roleChecklist: a nested-loop role
|
|
322
|
-
* checklist (
|
|
333
|
+
* checklist (review, review-fix, ci-fix) rendered beside an existing
|
|
323
334
|
* task dir; it may keep its own `## Task` block.
|
|
324
335
|
*/
|
|
325
336
|
function lintWorkerTemplateStructure(templateContent, options = {}) {
|
|
@@ -415,6 +426,336 @@ function expandedArtifactsForCommand(contract, command, fileExists) {
|
|
|
415
426
|
};
|
|
416
427
|
}
|
|
417
428
|
|
|
429
|
+
const DETERMINISTIC_REFERENCE = /\[DETERMINISTIC:\s*([A-Za-z_][A-Za-z0-9_.]*)\s*\]/;
|
|
430
|
+
|
|
431
|
+
function deterministicDeclarations(markdown, checklist) {
|
|
432
|
+
return enumerateChecklistCheckboxes(markdown).flatMap((item) => {
|
|
433
|
+
const match = item.rawLabel.match(DETERMINISTIC_REFERENCE);
|
|
434
|
+
if (!match && item.rawLabel.includes('[DETERMINISTIC')) {
|
|
435
|
+
throw new Error(`Invalid deterministic declaration in ${checklist} step ${item.stepNumber}`);
|
|
436
|
+
}
|
|
437
|
+
return match ? [{ checklist, stepNumber: item.stepNumber, reference: match[1] }] : [];
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function freezeDeterministicChecks(contract, markdown, checklist, commands = {}) {
|
|
442
|
+
const steps = deterministicDeclarations(markdown, checklist).map((step) => {
|
|
443
|
+
const command = commands[step.reference]?.trim();
|
|
444
|
+
if (!command)
|
|
445
|
+
throw new Error(
|
|
446
|
+
`Deterministic step ${step.stepNumber}: ${step.reference} requires a configured command`,
|
|
447
|
+
);
|
|
448
|
+
return { ...step, command };
|
|
449
|
+
});
|
|
450
|
+
return steps.length ? { ...contract, deterministicChecks: steps } : contract;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function readOptionalJson(file) {
|
|
454
|
+
try {
|
|
455
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
456
|
+
} catch (error) {
|
|
457
|
+
if (error.code === 'ENOENT') return null;
|
|
458
|
+
throw error;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function deterministicContract(taskDir, checklist) {
|
|
463
|
+
return (
|
|
464
|
+
readOptionalJson(path.join(taskDir, terminalContractInputForChecklist(checklist))) ??
|
|
465
|
+
readOptionalJson(path.join(taskDir, 'inputs', 'worker-terminal-contract.json')) ??
|
|
466
|
+
{}
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function recordedDeterministicSteps(taskDir, checklist) {
|
|
471
|
+
const contract = deterministicContract(taskDir, checklist);
|
|
472
|
+
const frozen = (contract.deterministicChecks ?? []).filter(
|
|
473
|
+
(step) => step.checklist === checklist,
|
|
474
|
+
);
|
|
475
|
+
const file = path.join(taskDir, checklist);
|
|
476
|
+
const actual = fs.existsSync(file)
|
|
477
|
+
? deterministicDeclarations(fs.readFileSync(file, 'utf8'), checklist)
|
|
478
|
+
: [];
|
|
479
|
+
const steps = [...frozen];
|
|
480
|
+
for (const step of actual) {
|
|
481
|
+
if (
|
|
482
|
+
!steps.some(
|
|
483
|
+
(candidate) =>
|
|
484
|
+
candidate.stepNumber === step.stepNumber && candidate.reference === step.reference,
|
|
485
|
+
)
|
|
486
|
+
) {
|
|
487
|
+
steps.push({ ...step, command: null });
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return steps;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
function deterministicCheckout(taskDir) {
|
|
494
|
+
for (const cwd of [taskDir, process.cwd()]) {
|
|
495
|
+
const result = spawnSync('git', ['rev-parse', '--show-toplevel'], { cwd, encoding: 'utf8' });
|
|
496
|
+
if (result.status === 0 && result.stdout.trim()) return fs.realpathSync(result.stdout.trim());
|
|
497
|
+
}
|
|
498
|
+
throw new Error(
|
|
499
|
+
'Deterministic checks require a Git checkout. Invoke mark from the target checkout.',
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
function deterministicInputHash(checkout, taskDir) {
|
|
504
|
+
const result = spawnSync(
|
|
505
|
+
'git',
|
|
506
|
+
['ls-files', '-z', '--cached', '--others', '--exclude-standard'],
|
|
507
|
+
{
|
|
508
|
+
cwd: checkout,
|
|
509
|
+
encoding: 'utf8',
|
|
510
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
511
|
+
},
|
|
512
|
+
);
|
|
513
|
+
if (result.status !== 0)
|
|
514
|
+
throw new Error('Cannot enumerate publishable inputs for deterministic checks');
|
|
515
|
+
const indexed = spawnSync('git', ['ls-files', '--stage', '-z'], {
|
|
516
|
+
cwd: checkout,
|
|
517
|
+
encoding: 'utf8',
|
|
518
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
519
|
+
});
|
|
520
|
+
if (indexed.status !== 0)
|
|
521
|
+
throw new Error('Cannot enumerate tracked submodules for deterministic checks');
|
|
522
|
+
const gitlinks = new Map();
|
|
523
|
+
for (const entry of indexed.stdout.split('\0').filter(Boolean)) {
|
|
524
|
+
const tab = entry.indexOf('\t');
|
|
525
|
+
const [mode, commit, stage] = entry.slice(0, tab).split(' ');
|
|
526
|
+
if (mode !== '160000') continue;
|
|
527
|
+
const name = entry.slice(tab + 1);
|
|
528
|
+
if (stage !== '0') throw new Error(`Resolve submodule conflict ${name} before CI parity`);
|
|
529
|
+
gitlinks.set(name, commit);
|
|
530
|
+
}
|
|
531
|
+
const hash = createHash('sha256');
|
|
532
|
+
const task = fs.realpathSync(taskDir);
|
|
533
|
+
for (const name of [...new Set(result.stdout.split('\0').filter(Boolean))].sort()) {
|
|
534
|
+
const file = path.join(checkout, name);
|
|
535
|
+
if (file === task || file.startsWith(task + path.sep)) continue;
|
|
536
|
+
let stat;
|
|
537
|
+
try {
|
|
538
|
+
stat = fs.lstatSync(file);
|
|
539
|
+
} catch (error) {
|
|
540
|
+
if (error.code !== 'ENOENT') throw error;
|
|
541
|
+
}
|
|
542
|
+
if (gitlinks.has(name)) {
|
|
543
|
+
let commit = gitlinks.get(name);
|
|
544
|
+
if (stat) {
|
|
545
|
+
if (!stat.isDirectory()) throw new Error(`Tracked submodule ${name} is not a directory`);
|
|
546
|
+
const top = spawnSync('git', ['-C', file, 'rev-parse', '--show-toplevel'], {
|
|
547
|
+
encoding: 'utf8',
|
|
548
|
+
});
|
|
549
|
+
if (top.status !== 0) throw new Error(`Cannot inspect tracked submodule ${name}`);
|
|
550
|
+
// Uninitialized submodule directories resolve to the parent checkout.
|
|
551
|
+
if (fs.realpathSync(top.stdout.trim()) === fs.realpathSync(file)) {
|
|
552
|
+
const head = spawnSync('git', ['-C', file, 'rev-parse', 'HEAD'], { encoding: 'utf8' });
|
|
553
|
+
const dirty = spawnSync(
|
|
554
|
+
'git',
|
|
555
|
+
[
|
|
556
|
+
'-C',
|
|
557
|
+
file,
|
|
558
|
+
'status',
|
|
559
|
+
'--porcelain=v1',
|
|
560
|
+
'--untracked-files=all',
|
|
561
|
+
'--ignore-submodules=none',
|
|
562
|
+
],
|
|
563
|
+
{ encoding: 'utf8' },
|
|
564
|
+
);
|
|
565
|
+
if (head.status !== 0 || dirty.status !== 0)
|
|
566
|
+
throw new Error(`Cannot fingerprint tracked submodule ${name}`);
|
|
567
|
+
if (dirty.stdout.trim())
|
|
568
|
+
throw new Error(
|
|
569
|
+
`Submodule ${name} has uncommitted work; commit its changes, then rerun CI parity`,
|
|
570
|
+
);
|
|
571
|
+
commit = head.stdout.trim();
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
hash.update(name + '\0gitlink\0' + commit + '\0');
|
|
575
|
+
continue;
|
|
576
|
+
}
|
|
577
|
+
if (!stat) continue;
|
|
578
|
+
hash.update(name + '\0');
|
|
579
|
+
hash.update(String(stat.mode & 0o777) + '\0');
|
|
580
|
+
if (stat.isSymbolicLink()) hash.update(fs.readlinkSync(file));
|
|
581
|
+
else if (stat.isFile()) hash.update(fs.readFileSync(file));
|
|
582
|
+
else throw new Error(`Cannot fingerprint publishable input ${name}`);
|
|
583
|
+
hash.update('\0');
|
|
584
|
+
}
|
|
585
|
+
return hash.digest('hex');
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function deterministicReceiptPath(taskDir, step) {
|
|
589
|
+
return path.join(
|
|
590
|
+
taskDir,
|
|
591
|
+
'artifacts',
|
|
592
|
+
'deterministic-checks',
|
|
593
|
+
step.checklist,
|
|
594
|
+
`${step.stepNumber}.json`,
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
function logHash(file) {
|
|
599
|
+
return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
function executeDeterministicStep(taskDir, checklist, stepNumber) {
|
|
603
|
+
const step = recordedDeterministicSteps(taskDir, checklist).find(
|
|
604
|
+
(item) => item.stepNumber === stepNumber,
|
|
605
|
+
);
|
|
606
|
+
if (!step) return;
|
|
607
|
+
if (!step.command)
|
|
608
|
+
throw new Error(
|
|
609
|
+
`Deterministic step ${stepNumber}: ${step.reference} has no frozen command; initialize the task again`,
|
|
610
|
+
);
|
|
611
|
+
const checkout = deterministicCheckout(taskDir);
|
|
612
|
+
const inputHash = deterministicInputHash(checkout, taskDir);
|
|
613
|
+
const logPath = path.posix.join(
|
|
614
|
+
'artifacts',
|
|
615
|
+
'deterministic-checks',
|
|
616
|
+
checklist,
|
|
617
|
+
`${stepNumber}-${randomUUID()}.log`,
|
|
618
|
+
);
|
|
619
|
+
const logFile = path.join(taskDir, logPath);
|
|
620
|
+
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
621
|
+
const receiptFile = deterministicReceiptPath(taskDir, step);
|
|
622
|
+
const receipt = {
|
|
623
|
+
schemaVersion: 1,
|
|
624
|
+
...step,
|
|
625
|
+
inputHash,
|
|
626
|
+
startedAt: new Date().toISOString(),
|
|
627
|
+
finishedAt: null,
|
|
628
|
+
status: 'running',
|
|
629
|
+
exitCode: null,
|
|
630
|
+
logPath,
|
|
631
|
+
};
|
|
632
|
+
atomicWrite(receiptFile, JSON.stringify(receipt, null, 2) + '\n');
|
|
633
|
+
const fd = fs.openSync(logFile, 'wx', 0o644);
|
|
634
|
+
let result;
|
|
635
|
+
try {
|
|
636
|
+
result = spawnSync('bash', ['-c', step.command], { cwd: checkout, stdio: ['ignore', fd, fd] });
|
|
637
|
+
} finally {
|
|
638
|
+
fs.closeSync(fd);
|
|
639
|
+
}
|
|
640
|
+
const afterHash = deterministicInputHash(checkout, taskDir);
|
|
641
|
+
const passed = result.status === 0 && inputHash === afterHash;
|
|
642
|
+
const completed = {
|
|
643
|
+
...receipt,
|
|
644
|
+
finishedAt: new Date().toISOString(),
|
|
645
|
+
status: result.signal ? 'interrupted' : passed ? 'passed' : 'failed',
|
|
646
|
+
exitCode: result.status,
|
|
647
|
+
signal: result.signal ?? null,
|
|
648
|
+
logHash: logHash(logFile),
|
|
649
|
+
};
|
|
650
|
+
atomicWrite(receiptFile, JSON.stringify(completed, null, 2) + '\n');
|
|
651
|
+
if (!passed)
|
|
652
|
+
throw new Error(
|
|
653
|
+
`Deterministic step ${stepNumber} failed${inputHash !== afterHash ? ': command changed publishable inputs' : ` with exit ${result.status ?? result.signal ?? 'unknown'}`}. See ${logPath}`,
|
|
654
|
+
);
|
|
655
|
+
console.log(`Deterministic step ${stepNumber} passed, exit 0. Log: ${logPath}`);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
function readDeterministicChecks(taskDir, checklist, options = {}) {
|
|
659
|
+
if (checklist === undefined) {
|
|
660
|
+
const target = resolveChecklistTarget(taskDir).checklist;
|
|
661
|
+
const contract = deterministicContract(taskDir, target);
|
|
662
|
+
const sources = [
|
|
663
|
+
...new Set([target, ...(contract.deterministicChecks ?? []).map((step) => step.checklist)]),
|
|
664
|
+
];
|
|
665
|
+
const hasSteps = sources.some(
|
|
666
|
+
(source) => recordedDeterministicSteps(taskDir, source).length > 0,
|
|
667
|
+
);
|
|
668
|
+
if (!hasSteps) return [];
|
|
669
|
+
const inputHash =
|
|
670
|
+
options.inputHash ?? deterministicInputHash(deterministicCheckout(taskDir), taskDir);
|
|
671
|
+
return sources.flatMap((source) => readDeterministicChecks(taskDir, source, { inputHash }));
|
|
672
|
+
}
|
|
673
|
+
const steps = recordedDeterministicSteps(taskDir, checklist);
|
|
674
|
+
if (!steps.length) return [];
|
|
675
|
+
const inputHash =
|
|
676
|
+
options.inputHash ?? deterministicInputHash(deterministicCheckout(taskDir), taskDir);
|
|
677
|
+
return steps.map((step) => {
|
|
678
|
+
let receipt;
|
|
679
|
+
let error;
|
|
680
|
+
try {
|
|
681
|
+
receipt = readOptionalJson(deterministicReceiptPath(taskDir, step));
|
|
682
|
+
} catch (cause) {
|
|
683
|
+
error = `Invalid execution receipt: ${cause.message}`;
|
|
684
|
+
}
|
|
685
|
+
let status = error ? 'failed' : receipt ? receipt.status : 'missing';
|
|
686
|
+
let message = error ?? (receipt ? '' : 'Execution receipt is missing');
|
|
687
|
+
if (receipt) {
|
|
688
|
+
if (
|
|
689
|
+
receipt.schemaVersion !== 1 ||
|
|
690
|
+
receipt.checklist !== checklist ||
|
|
691
|
+
receipt.stepNumber !== step.stepNumber ||
|
|
692
|
+
receipt.command !== step.command ||
|
|
693
|
+
receipt.reference !== step.reference ||
|
|
694
|
+
receipt.inputHash !== inputHash
|
|
695
|
+
) {
|
|
696
|
+
status = 'stale';
|
|
697
|
+
message = 'Command or publishable inputs changed; rerun this mark step';
|
|
698
|
+
} else if (receipt.status !== 'passed' || receipt.exitCode !== 0 || !receipt.finishedAt) {
|
|
699
|
+
status =
|
|
700
|
+
receipt.status === 'interrupted' || receipt.status === 'running'
|
|
701
|
+
? 'interrupted'
|
|
702
|
+
: 'failed';
|
|
703
|
+
message = `Command did not pass, exit ${receipt.exitCode ?? 'unavailable'}`;
|
|
704
|
+
} else {
|
|
705
|
+
const logFile =
|
|
706
|
+
typeof receipt.logPath === 'string' ? path.resolve(taskDir, receipt.logPath) : '';
|
|
707
|
+
if (
|
|
708
|
+
!logFile.startsWith(
|
|
709
|
+
path.resolve(taskDir, 'artifacts', 'deterministic-checks') + path.sep,
|
|
710
|
+
) ||
|
|
711
|
+
!fs.existsSync(logFile) ||
|
|
712
|
+
receipt.logHash !== logHash(logFile)
|
|
713
|
+
) {
|
|
714
|
+
status = 'failed';
|
|
715
|
+
message = 'Execution log is missing or changed';
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
if (!step.command) {
|
|
720
|
+
status = 'missing';
|
|
721
|
+
message = 'Declared command is missing from the frozen task contract';
|
|
722
|
+
}
|
|
723
|
+
return {
|
|
724
|
+
...step,
|
|
725
|
+
status,
|
|
726
|
+
exitCode: receipt?.exitCode ?? null,
|
|
727
|
+
logPath: receipt?.logPath ?? null,
|
|
728
|
+
inputHash,
|
|
729
|
+
message,
|
|
730
|
+
};
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
function evaluateDeterministicChecks(taskDir, checklist) {
|
|
735
|
+
const checks = readDeterministicChecks(taskDir, checklist);
|
|
736
|
+
const issues = checks
|
|
737
|
+
.filter((step) => step.status !== 'passed')
|
|
738
|
+
.map(
|
|
739
|
+
(step) =>
|
|
740
|
+
`${step.checklist} step ${step.stepNumber} (${step.reference}): ${step.message || step.status}`,
|
|
741
|
+
);
|
|
742
|
+
return { checks, issues };
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
function deterministicContractIssues(taskDir, checklist) {
|
|
746
|
+
return evaluateDeterministicChecks(taskDir, checklist).issues;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
const deterministicChecks = {
|
|
750
|
+
outputPrefix: 'TASK_DETERMINISTIC_CHECKS ',
|
|
751
|
+
declarations: deterministicDeclarations,
|
|
752
|
+
freeze: freezeDeterministicChecks,
|
|
753
|
+
execute: executeDeterministicStep,
|
|
754
|
+
read: readDeterministicChecks,
|
|
755
|
+
issues: deterministicContractIssues,
|
|
756
|
+
evaluate: evaluateDeterministicChecks,
|
|
757
|
+
};
|
|
758
|
+
|
|
418
759
|
module.exports = {
|
|
419
760
|
TERMINAL_COMMANDS,
|
|
420
761
|
BUILTIN_FLOW_COMMANDS,
|
|
@@ -425,4 +766,5 @@ module.exports = {
|
|
|
425
766
|
templateTerminalCommands,
|
|
426
767
|
templateBodyScope,
|
|
427
768
|
expandedArtifactsForCommand,
|
|
769
|
+
deterministicChecks,
|
|
428
770
|
};
|