@farmslot/agent-runtime 0.18.1 → 0.20.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 +15 -0
- package/dist/execution-template/source-config.d.ts +6 -1
- package/dist/execution-template/source-config.d.ts.map +1 -1
- package/dist/execution-template/source-config.js +15 -1
- package/dist/execution-template/source-config.js.map +1 -1
- package/dist/task-init/index.d.ts.map +1 -1
- package/dist/task-init/index.js +6 -1
- package/dist/task-init/index.js.map +1 -1
- package/dist/task-init/runtime-command.d.ts +9 -0
- package/dist/task-init/runtime-command.d.ts.map +1 -0
- package/dist/task-init/runtime-command.js +16 -0
- package/dist/task-init/runtime-command.js.map +1 -0
- package/dist/task-init/task-document.d.ts +2 -0
- package/dist/task-init/task-document.d.ts.map +1 -1
- package/dist/task-init/task-document.js +18 -5
- package/dist/task-init/task-document.js.map +1 -1
- package/dist/task-init/write.d.ts +1 -5
- package/dist/task-init/write.d.ts.map +1 -1
- package/dist/task-init/write.js +3 -10
- package/dist/task-init/write.js.map +1 -1
- package/package.json +9 -3
- package/scripts/acceptance-ledger.cjs +15 -32
- package/scripts/check-task-artifact-contract.mjs +85 -15
- package/scripts/claim-review-gate.mjs +43 -0
- package/scripts/retained-recipe-attempt.cjs +48 -0
- package/scripts/retained-recipe-attempt.d.cts +4 -0
- package/scripts/worker-terminal-contract.cjs +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
- Active-development baseline; add user-facing changes here before release or package publication.
|
|
6
|
+
|
|
7
|
+
## 0.20.0 - 2026-10-14
|
|
8
|
+
|
|
9
|
+
- Show the supplied publication base and leased rebase instructions for branch-maintenance tasks.
|
|
10
|
+
- Generate recipe-owned acceptance instructions using supplied helper commands; retain authorized untestable review and completion checks.
|
|
11
|
+
- Resolve publication manifest requirements and media references inside the selected recipe attempt.
|
|
12
|
+
- Route valid unresolved engine claims to human review and refuse local schema-2 verdict overrides.
|
|
13
|
+
|
|
14
|
+
## 0.19.0 - 2026-10-13
|
|
15
|
+
|
|
16
|
+
- Validate the current retained recipe attempt selected by the task pointer while keeping earlier packages intact.
|
|
17
|
+
- Resolve declared execution-template sources through an attested source binding.
|
|
18
|
+
- Accept the reviewer feedback path binding in template lint while retaining the required feedback artifact check.
|
|
19
|
+
|
|
5
20
|
## 0.18.1 - 2026-10-12
|
|
6
21
|
|
|
7
22
|
- Update shared runtime dependencies for bounded recipe log observations.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProjectExecutionTemplatesConfig, UnavailableExecutionTemplateSource } from '@farmslot/protocol';
|
|
1
|
+
import type { ProjectExecutionTemplatesConfig, SourceEntryRef, UnavailableExecutionTemplateSource } from '@farmslot/protocol';
|
|
2
2
|
import type { ExecutionTemplateSource } from './types.js';
|
|
3
3
|
export type { UnavailableExecutionTemplateSource } from '@farmslot/protocol';
|
|
4
4
|
export interface ResolvedExecutionTemplateSources {
|
|
@@ -6,6 +6,11 @@ export interface ResolvedExecutionTemplateSources {
|
|
|
6
6
|
unavailable: UnavailableExecutionTemplateSource[];
|
|
7
7
|
}
|
|
8
8
|
export interface ResolveConfiguredExecutionTemplateSourcesOptions {
|
|
9
|
+
resolveSourceBinding?: (selection: SourceEntryRef) => {
|
|
10
|
+
root: string;
|
|
11
|
+
commit: string;
|
|
12
|
+
lockDigest: string;
|
|
13
|
+
};
|
|
9
14
|
projectPackRoot: string;
|
|
10
15
|
env?: NodeJS.ProcessEnv;
|
|
11
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-config.d.ts","sourceRoot":"","sources":["../../src/execution-template/source-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,+BAA+B,EAC/B,kCAAkC,EACnC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,YAAY,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,WAAW,EAAE,kCAAkC,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,gDAAgD;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAUD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQhF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAO9E;
|
|
1
|
+
{"version":3,"file":"source-config.d.ts","sourceRoot":"","sources":["../../src/execution-template/source-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,+BAA+B,EAC/B,cAAc,EACd,kCAAkC,EACnC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,YAAY,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,WAAW,EAAE,kCAAkC,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,gDAAgD;IAC/D,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK;QACpD,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAUD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQhF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAO9E;AA2BD;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,MAAM,EAAE,+BAA+B,GAAG,SAAS,EACnD,OAAO,EAAE,gDAAgD,GACxD,gCAAgC,CAoDlC"}
|
|
@@ -26,7 +26,19 @@ export function executionTemplateSourceDirty(root) {
|
|
|
26
26
|
return result.stdout.trim().length > 0;
|
|
27
27
|
}
|
|
28
28
|
function configuredRoot(source, options) {
|
|
29
|
+
if (source.root.sourceId) {
|
|
30
|
+
if (!options.resolveSourceBinding)
|
|
31
|
+
return { reason: 'invalid-root' };
|
|
32
|
+
return {
|
|
33
|
+
path: options.resolveSourceBinding({
|
|
34
|
+
sourceId: source.root.sourceId,
|
|
35
|
+
entry: source.root.entry,
|
|
36
|
+
}).root,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
29
39
|
if (typeof source.root.env === 'string') {
|
|
40
|
+
if (options.resolveSourceBinding)
|
|
41
|
+
return { reason: 'invalid-root' };
|
|
30
42
|
const value = (options.env ?? process.env)[source.root.env]?.trim();
|
|
31
43
|
if (!value)
|
|
32
44
|
return { reason: 'missing-environment' };
|
|
@@ -34,7 +46,9 @@ function configuredRoot(source, options) {
|
|
|
34
46
|
return { reason: 'invalid-root' };
|
|
35
47
|
return { path: value };
|
|
36
48
|
}
|
|
37
|
-
return
|
|
49
|
+
return source.root.projectPath
|
|
50
|
+
? { path: path.resolve(options.projectPackRoot, source.root.projectPath) }
|
|
51
|
+
: { reason: 'invalid-root' };
|
|
38
52
|
}
|
|
39
53
|
/**
|
|
40
54
|
* Resolve optional configured sources only when catalog options are requested.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-config.js","sourceRoot":"","sources":["../../src/execution-template/source-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"source-config.js","sourceRoot":"","sources":["../../src/execution-template/source-config.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;
|
|
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;AAG9E,OAAO,EAKL,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,CAyF1E;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
|
@@ -11,7 +11,8 @@ import path from 'node:path';
|
|
|
11
11
|
import { renderTemplatePlaceholders, } from '@farmslot/protocol';
|
|
12
12
|
import { selectExecutionTemplate } from '../execution-template/select.js';
|
|
13
13
|
import { executionTemplateReference, readExecutionTemplateSnapshot, } from '../execution-template/snapshot.js';
|
|
14
|
-
import {
|
|
14
|
+
import { installedTaskCommands } from './runtime-command.js';
|
|
15
|
+
import { buildBranchUpdateInstructions, buildHandoffMetadata, buildTaskDocument, HANDOFF_INPUT, } from './task-document.js';
|
|
15
16
|
import { writeTaskDir } from './write.js';
|
|
16
17
|
export * from './discover.js';
|
|
17
18
|
export * from './task-document.js';
|
|
@@ -46,6 +47,7 @@ export async function taskInit(spec) {
|
|
|
46
47
|
...(spec.domain ? { DOMAIN: spec.domain } : {}),
|
|
47
48
|
TEMPLATE: selected.entry.id,
|
|
48
49
|
TASK_DIR: taskDirLabel,
|
|
50
|
+
...installedTaskCommands(),
|
|
49
51
|
...(spec.task.sourceRef
|
|
50
52
|
? /^https?:\/\//.test(spec.task.sourceRef)
|
|
51
53
|
? { TICKET_URL: spec.task.sourceRef }
|
|
@@ -53,6 +55,9 @@ export async function taskInit(spec) {
|
|
|
53
55
|
: {}),
|
|
54
56
|
...(spec.vars ?? {}),
|
|
55
57
|
};
|
|
58
|
+
if (vars.PUBLICATION_BASE?.trim()) {
|
|
59
|
+
vars.BRANCH_UPDATE_INSTRUCTIONS = buildBranchUpdateInstructions(vars.PUBLICATION_BASE);
|
|
60
|
+
}
|
|
56
61
|
const source = `Execution template ${selected.entry.id} (${selected.entry.sourceId})`;
|
|
57
62
|
const checklistMarkdown = renderTemplatePlaceholders(readExecutionTemplateSnapshot(selected.entry).markdown, vars, source);
|
|
58
63
|
const reference = executionTemplateReference(selected.entry, checklistMarkdown);
|
|
@@ -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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Double quotes preserve spaces and the remote slot's $HOME expansion. */
|
|
2
|
+
export declare function quoteMarkCommandWord(word: string): string;
|
|
3
|
+
/** Use the SDK installation that writes the task. */
|
|
4
|
+
export declare function installedRuntimeScriptCommand(filename: string): string;
|
|
5
|
+
export declare function installedTaskCommands(): {
|
|
6
|
+
AC_CMD: string;
|
|
7
|
+
ARTIFACT_CHECK_CMD: string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=runtime-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-command.d.ts","sourceRoot":"","sources":["../../src/task-init/runtime-command.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,qDAAqD;AACrD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,qBAAqB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAGtF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
4
|
+
/** Double quotes preserve spaces and the remote slot's $HOME expansion. */
|
|
5
|
+
export function quoteMarkCommandWord(word) {
|
|
6
|
+
return `"${word.replace(/(["\\`])/g, '\\$1')}"`;
|
|
7
|
+
}
|
|
8
|
+
/** Use the SDK installation that writes the task. */
|
|
9
|
+
export function installedRuntimeScriptCommand(filename) {
|
|
10
|
+
return `node ${quoteMarkCommandWord(path.join(packageRoot, 'scripts', filename))}`;
|
|
11
|
+
}
|
|
12
|
+
export function installedTaskCommands() {
|
|
13
|
+
const entry = installedRuntimeScriptCommand('../bin/farmslot-agent.mjs');
|
|
14
|
+
return { AC_CMD: `${entry} ac`, ARTIFACT_CHECK_CMD: `${entry} artifact-check` };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=runtime-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-command.js","sourceRoot":"","sources":["../../src/task-init/runtime-command.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,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;AAE3F,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC;AAClD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,6BAA6B,CAAC,QAAgB;IAC5D,OAAO,QAAQ,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,6BAA6B,CAAC,2BAA2B,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,KAAK,EAAE,kBAAkB,EAAE,GAAG,KAAK,iBAAiB,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -3,6 +3,8 @@ export declare const HANDOFF_INPUT = "inputs/handoff.json";
|
|
|
3
3
|
export declare const BUG_INPUT = "inputs/bug-input.json";
|
|
4
4
|
/** Optional project-owned addendum rendered into TASK.md (relative to `templates/`). */
|
|
5
5
|
export declare const TASK_DOCUMENT_ADDENDUM_TEMPLATE = "task-document.md";
|
|
6
|
+
/** Shared instructions for a maintenance task and an inline CI-fix checklist. */
|
|
7
|
+
export declare function buildBranchUpdateInstructions(publicationBase: string): string;
|
|
6
8
|
/**
|
|
7
9
|
* Acceptance criteria arrive as plain strings, but ticket adapters keep the
|
|
8
10
|
* author's list markers. Strip them and drop empty entries, so one input entry
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"task-document.d.ts","sourceRoot":"","sources":["../../src/task-init/task-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,20 @@ import { existsSync } from 'node:fs';
|
|
|
9
9
|
import { readFile } from 'node:fs/promises';
|
|
10
10
|
import path from 'node:path';
|
|
11
11
|
import { EXECUTION_CHECKLIST_DOCUMENT, } from '@farmslot/protocol';
|
|
12
|
+
import { installedTaskCommands } from './runtime-command.js';
|
|
12
13
|
export const HANDOFF_INPUT = 'inputs/handoff.json';
|
|
13
14
|
export const BUG_INPUT = 'inputs/bug-input.json';
|
|
14
15
|
/** Optional project-owned addendum rendered into TASK.md (relative to `templates/`). */
|
|
15
16
|
export const TASK_DOCUMENT_ADDENDUM_TEMPLATE = 'task-document.md';
|
|
17
|
+
/** Shared instructions for a maintenance task and an inline CI-fix checklist. */
|
|
18
|
+
export function buildBranchUpdateInstructions(publicationBase) {
|
|
19
|
+
return [
|
|
20
|
+
'## Branch update base',
|
|
21
|
+
'',
|
|
22
|
+
`The publication base is \`${publicationBase}\`. Branch updates target \`origin/${publicationBase}\`; follow the update method in the selected checklist. Follow-up runs use their contribution family's base; after retargeting they use the recorded retarget branch. Keep default-branch freshness checks separate.`,
|
|
23
|
+
'For a rebase, first fetch the PR head and record its exact remote SHA in `artifacts/pre-rebase-remote-sha.txt` under this task. Refuse an update if local HEAD omits remote commits. After conflict resolution and the required checks, push the rebased branch with an explicit lease against that recorded SHA. Never infer the update base from a PR body or replace it with the default branch while the upstream PR remains open.',
|
|
24
|
+
].join('\n');
|
|
25
|
+
}
|
|
16
26
|
/**
|
|
17
27
|
* Ordered keys of the `## Task` block. A key renders only when the caller set
|
|
18
28
|
* it, except the four every surface knows. Farmslot sets its slot facts; a
|
|
@@ -35,6 +45,7 @@ const TASK_BLOCK_KEYS = [
|
|
|
35
45
|
{ key: 'REVIEW_TIER' },
|
|
36
46
|
{ key: 'RECIPE_STRATEGY' },
|
|
37
47
|
{ key: 'BRANCH_UPDATE_STRATEGY' },
|
|
48
|
+
{ key: 'PUBLICATION_BASE' },
|
|
38
49
|
{ key: 'HAS_RECIPE' },
|
|
39
50
|
{ key: 'RECIPE_SOURCE' },
|
|
40
51
|
{ key: 'TASK_DIR', required: true },
|
|
@@ -92,12 +103,14 @@ export function buildTaskDocument(input) {
|
|
|
92
103
|
if (input.modePreamble.trim())
|
|
93
104
|
sections.push(input.modePreamble, '');
|
|
94
105
|
sections.push('## Task', '', '```text', taskBlock, '```', '', '## Description', '', input.description || '_No description_', '', '## Acceptance Criteria', '', renderAcceptanceCriteria(input.acceptanceCriteria));
|
|
106
|
+
if (vars.PUBLICATION_BASE?.trim()) {
|
|
107
|
+
sections.push('', buildBranchUpdateInstructions(vars.PUBLICATION_BASE));
|
|
108
|
+
}
|
|
95
109
|
if (normalizeAcceptanceCriteria(input.acceptanceCriteria).length > 0) {
|
|
96
|
-
const
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
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.`);
|
|
110
|
+
const defaults = installedTaskCommands();
|
|
111
|
+
const acceptance = vars.AC_CMD?.trim() || defaults.AC_CMD;
|
|
112
|
+
const artifactCheck = vars.ARTIFACT_CHECK_CMD?.trim() || defaults.ARTIFACT_CHECK_CMD;
|
|
113
|
+
sections.push('', '## Recipe proof + acceptance review', '', `Prefix every task proof invocation with \`RECIPE_TASK_DIR="$(cd "${taskDir}" && pwd)"\` in the same shell call as the configured recipe command. A separate export does not survive a later shell call. Direct host invocations must use a fresh directory under \`${taskDir}/artifacts/recipe-runs/\`; fixed or diagnostic output directories do not select task proof. Independent diagnostics must omit task binding.`, `Inspect registered criteria with \`${acceptance} list --task-dir "${taskDir}"\`. Declare their IDs and claims in the recipe's \`proofTargets\` and bind qualifying assertion nodes through \`proves\`. Run the recipe through the configured command and inspect its retained results. Recipe execution produces normal verdicts; never set a proven verdict by hand or edit acceptance ledger rows. Retain unresolved results. When the captured completion contract permits human review, present them at the run gate and ask an authorized person for an untestable override with a reason. Without that gate, completion still refuses.`, `Inspect the criteria again. When recipe.json exists, render coverage with \`${acceptance} render --task-dir "${taskDir}"\` to a temporary file, then replace \`artifacts/recipe-coverage.md\` only after a successful render. Run \`${artifactCheck} "${taskDir}" --contract "${taskDir}/inputs/worker-terminal-contract.json" --terminal complete --require-recipe-coverage-if-recipe --require-acceptance-status\` before \`mark complete\`. Missing ledgers, unrecorded criterion rows and integrity failures refuse completion. Valid selected unresolved verdicts can reach the configured human gate; they do not grant approval. Checked checklist items alone do not assess an AC.`);
|
|
101
114
|
}
|
|
102
115
|
if (input.affectedArea && input.affectedArea !== '_Not specified_') {
|
|
103
116
|
sections.push('', '## Affected Area', '', input.affectedArea);
|
|
@@ -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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"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { type WorkerTerminalContractDocument } from '@farmslot/protocol';
|
|
2
2
|
import { type HandoffMetadata } from './task-document.js';
|
|
3
|
+
export { quoteMarkCommandWord } from './runtime-command.js';
|
|
3
4
|
export declare const TASK_DOCUMENT = "TASK.md";
|
|
4
5
|
export declare const MARK_SHIM = "mark";
|
|
5
6
|
/** Whole-command env override honoured by every `mark` shim. */
|
|
6
7
|
export declare const MARK_COMMAND_ENV = "FARMSLOT_MARK_CMD";
|
|
7
|
-
/**
|
|
8
|
-
* Quote one word for the shim's default command: double quotes keep spaces
|
|
9
|
-
* together while `$HOME` (a remote slot's home) still expands.
|
|
10
|
-
*/
|
|
11
|
-
export declare function quoteMarkCommandWord(word: string): string;
|
|
12
8
|
/** Generic default: this package's mark engine. A control plane or harness passes its own. */
|
|
13
9
|
export declare function defaultMarkCommand(): string;
|
|
14
10
|
/**
|
|
@@ -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":"AAQA,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,SAAS,SAAS,CAAC;AAChC,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAcpD,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
|
@@ -3,27 +3,20 @@
|
|
|
3
3
|
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { createRequire } from 'node:module';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
6
|
import { isDeepStrictEqual } from 'node:util';
|
|
8
7
|
import { EXECUTION_CHECKLIST_DOCUMENT, WORKER_TERMINAL_CONTRACT_INPUT, } from '@farmslot/protocol';
|
|
8
|
+
import { installedRuntimeScriptCommand } from './runtime-command.js';
|
|
9
9
|
import { BUG_INPUT, HANDOFF_INPUT, normalizeAcceptanceCriteria, } from './task-document.js';
|
|
10
|
+
export { quoteMarkCommandWord } from './runtime-command.js';
|
|
10
11
|
export const TASK_DOCUMENT = 'TASK.md';
|
|
11
12
|
export const MARK_SHIM = 'mark';
|
|
12
13
|
/** Whole-command env override honoured by every `mark` shim. */
|
|
13
14
|
export const MARK_COMMAND_ENV = 'FARMSLOT_MARK_CMD';
|
|
14
|
-
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
15
15
|
const require = createRequire(import.meta.url);
|
|
16
16
|
const { deterministicChecks } = require('../../scripts/worker-terminal-contract.cjs');
|
|
17
|
-
/**
|
|
18
|
-
* Quote one word for the shim's default command: double quotes keep spaces
|
|
19
|
-
* together while `$HOME` (a remote slot's home) still expands.
|
|
20
|
-
*/
|
|
21
|
-
export function quoteMarkCommandWord(word) {
|
|
22
|
-
return `"${word.replace(/(["\\`])/g, '\\$1')}"`;
|
|
23
|
-
}
|
|
24
17
|
/** Generic default: this package's mark engine. A control plane or harness passes its own. */
|
|
25
18
|
export function defaultMarkCommand() {
|
|
26
|
-
return
|
|
19
|
+
return installedRuntimeScriptCommand('mark-checklist-step.cjs');
|
|
27
20
|
}
|
|
28
21
|
/**
|
|
29
22
|
* The `mark` shim. One env override, one recorded default; `markCommand` is a
|
|
@@ -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,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/task-init/write.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farmslot/agent-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,6 +21,10 @@
|
|
|
21
21
|
"./scripts/subtask-unit.cjs": "./scripts/subtask-unit.cjs",
|
|
22
22
|
"./scripts/worker-terminal-contract.cjs": "./scripts/worker-terminal-contract.cjs",
|
|
23
23
|
"./scripts/check-task-artifact-contract.mjs": "./scripts/check-task-artifact-contract.mjs",
|
|
24
|
+
"./scripts/retained-recipe-attempt.cjs": {
|
|
25
|
+
"types": "./scripts/retained-recipe-attempt.d.cts",
|
|
26
|
+
"default": "./scripts/retained-recipe-attempt.cjs"
|
|
27
|
+
},
|
|
24
28
|
"./scripts/execution-template-cli.mjs": "./scripts/execution-template-cli.mjs",
|
|
25
29
|
"./scripts/task-init-cli.mjs": "./scripts/task-init-cli.mjs",
|
|
26
30
|
"./native": {
|
|
@@ -34,7 +38,7 @@
|
|
|
34
38
|
},
|
|
35
39
|
"scripts": {
|
|
36
40
|
"typecheck": "yarn workspace @farmslot/protocol build && tsc --noEmit --project tsconfig.json",
|
|
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",
|
|
41
|
+
"test": "node --test test/claim-review-gate.test.mjs 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
42
|
"format": "prettier --write --ignore-path ../../.prettierignore .",
|
|
39
43
|
"format:check": "prettier --check --ignore-path ../../.prettierignore .",
|
|
40
44
|
"lint": "eslint \"src/**/*.ts\"",
|
|
@@ -45,7 +49,8 @@
|
|
|
45
49
|
"prepublishOnly": "node ../../scripts/quality/check-farmslot-package-readiness.mjs --publish --packages @farmslot/agent-runtime"
|
|
46
50
|
},
|
|
47
51
|
"dependencies": {
|
|
48
|
-
"@farmslot/
|
|
52
|
+
"@farmslot/adapter-sdk": "0.11.0",
|
|
53
|
+
"@farmslot/protocol": "0.42.0"
|
|
49
54
|
},
|
|
50
55
|
"devDependencies": {
|
|
51
56
|
"@types/node": "^22.0.0",
|
|
@@ -82,6 +87,7 @@
|
|
|
82
87
|
"dist/**/*.js.map",
|
|
83
88
|
"scripts/**/*.cjs",
|
|
84
89
|
"scripts/**/*.mjs",
|
|
90
|
+
"scripts/retained-recipe-attempt.d.cts",
|
|
85
91
|
"scripts/execution-template-cli.mjs"
|
|
86
92
|
],
|
|
87
93
|
"publishConfig": {
|
|
@@ -178,33 +178,9 @@ function setAcceptanceVerdict(taskDir, input) {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
if (stored?.schemaVersion === 2) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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;
|
|
181
|
+
throw new AcceptanceRefusal(
|
|
182
|
+
'Automatic verdicts are engine-owned. Request human review; a verified person uses farmslot run gate --action mark-untestable.',
|
|
183
|
+
);
|
|
208
184
|
}
|
|
209
185
|
const byId = new Map((stored?.criteria ?? []).map((entry) => [entry.id, entry]));
|
|
210
186
|
byId.set(criterion.id, {
|
|
@@ -309,6 +285,10 @@ function acceptanceContractIssues(taskDir, options = {}) {
|
|
|
309
285
|
}
|
|
310
286
|
}
|
|
311
287
|
const byId = new Map(stored.criteria.map((entry) => [entry.id, entry]));
|
|
288
|
+
if (stored.schemaVersion === 2 && stored.criteria.some((entry) => entry.overrides !== undefined))
|
|
289
|
+
issues.push(
|
|
290
|
+
'Unverified local overrides require a canonical engine projection; they grant no review authority.',
|
|
291
|
+
);
|
|
312
292
|
for (const criterion of criteria) {
|
|
313
293
|
const entry = byId.get(criterion.id);
|
|
314
294
|
if (!entry) {
|
|
@@ -318,13 +298,16 @@ function acceptanceContractIssues(taskDir, options = {}) {
|
|
|
318
298
|
continue;
|
|
319
299
|
}
|
|
320
300
|
if (
|
|
321
|
-
|
|
322
|
-
entry.verdict === '
|
|
323
|
-
|
|
301
|
+
!(stored.schemaVersion === 2 && options.deferClaimVerdicts === true) &&
|
|
302
|
+
(entry.verdict === 'failed' ||
|
|
303
|
+
entry.verdict === 'awaiting-review' ||
|
|
304
|
+
(!options.allowWeak && (entry.verdict === 'missing' || entry.verdict === 'weak')))
|
|
324
305
|
) {
|
|
325
306
|
issues.push(
|
|
326
|
-
|
|
327
|
-
|
|
307
|
+
stored.schemaVersion === 2
|
|
308
|
+
? `${criterion.id} is ${entry.verdict}: run an eligible recipe assertion or request human evidence review.`
|
|
309
|
+
: `${criterion.id} is ${entry.verdict}: prove it, or record \`untestable\` with a note ` +
|
|
310
|
+
'(a flow may waive this with worker_terminal.acceptance.allowWeak)',
|
|
328
311
|
);
|
|
329
312
|
}
|
|
330
313
|
}
|
|
@@ -10,7 +10,7 @@ const {
|
|
|
10
10
|
deterministicChecks,
|
|
11
11
|
} = require('./worker-terminal-contract.cjs');
|
|
12
12
|
const { SUBTASK_INDEX_REL, openSubtaskUnits } = require('./subtask-unit.cjs');
|
|
13
|
-
const { acceptanceContractIssues } = require('./acceptance-ledger.cjs');
|
|
13
|
+
const { acceptanceContractIssues, readAcceptanceLedger } = require('./acceptance-ledger.cjs');
|
|
14
14
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
15
15
|
const workspaceProtocolRoot = path.resolve(packageRoot, '../protocol');
|
|
16
16
|
|
|
@@ -155,7 +155,7 @@ function isMissingPathError(error) {
|
|
|
155
155
|
|
|
156
156
|
function resolveTaskArtifactPath(rel) {
|
|
157
157
|
const root = realpathSync(taskDir);
|
|
158
|
-
const candidate = realpathSync(path.resolve(taskDir, rel));
|
|
158
|
+
const candidate = realpathSync(path.resolve(taskDir, publicationArtifactPath(rel)));
|
|
159
159
|
const relative = path.relative(root, candidate);
|
|
160
160
|
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
161
161
|
throw new Error(`${rel} resolves outside the task directory`);
|
|
@@ -163,6 +163,21 @@ function resolveTaskArtifactPath(rel) {
|
|
|
163
163
|
return candidate;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
function publicationArtifactPath(rel) {
|
|
167
|
+
if (rel !== 'artifacts/evidence-manifest.json') return rel;
|
|
168
|
+
const pointerPath = path.join(taskDir, 'artifacts/latest-valid-recipe-run.json');
|
|
169
|
+
if (!existsSync(pointerPath)) return rel;
|
|
170
|
+
const pointer = recipeProtocol?.sanitizeLatestValidRecipeRunPointer?.(
|
|
171
|
+
JSON.parse(readFileSync(pointerPath, 'utf8')),
|
|
172
|
+
);
|
|
173
|
+
if (!pointer) throw new Error('latest-valid-recipe-run.json: invalid pointer.');
|
|
174
|
+
const selected = `artifacts/${pointer.relativeArtifactRoot}/evidence-manifest.json`;
|
|
175
|
+
const version = terminalContract ? (terminalContract.recordedEvidenceContractVersion ?? 0) : 1;
|
|
176
|
+
if (version !== 0 && version !== 1) throw new Error('Unsupported recorded evidence contract.');
|
|
177
|
+
if (version === 0 && !existsSync(path.resolve(taskDir, selected))) return rel;
|
|
178
|
+
return selected;
|
|
179
|
+
}
|
|
180
|
+
|
|
166
181
|
function isRecord(value) {
|
|
167
182
|
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
168
183
|
}
|
|
@@ -274,7 +289,7 @@ function optionalStringArray(record, key, prefix) {
|
|
|
274
289
|
}
|
|
275
290
|
}
|
|
276
291
|
|
|
277
|
-
function normalizeArtifactPath(value) {
|
|
292
|
+
function normalizeArtifactPath(value, mediaOnly = true) {
|
|
278
293
|
if (typeof value !== 'string') return null;
|
|
279
294
|
const trimmed = value.trim();
|
|
280
295
|
if (!trimmed || /^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(trimmed)) return null;
|
|
@@ -285,12 +300,15 @@ function normalizeArtifactPath(value) {
|
|
|
285
300
|
if (segments.some((segment) => segment === '.' || segment === '..')) return null;
|
|
286
301
|
const withoutArtifacts =
|
|
287
302
|
segments[0] === 'artifacts' ? segments.slice(1).join('/') : segments.join('/');
|
|
288
|
-
if (!withoutArtifacts || !mediaExt.test(withoutArtifacts)) return null;
|
|
303
|
+
if (!withoutArtifacts || (mediaOnly && !mediaExt.test(withoutArtifacts))) return null;
|
|
289
304
|
return `artifacts/${withoutArtifacts}`;
|
|
290
305
|
}
|
|
291
306
|
|
|
292
|
-
function addRef(refs, value) {
|
|
293
|
-
const
|
|
307
|
+
function addRef(refs, value, artifactRoot = 'artifacts') {
|
|
308
|
+
const relative = normalizeArtifactPath(value);
|
|
309
|
+
const normalized = relative
|
|
310
|
+
? path.posix.join(artifactRoot, relative.slice('artifacts/'.length))
|
|
311
|
+
: null;
|
|
294
312
|
if (!normalized) return;
|
|
295
313
|
if (internalArtifactPath.test(normalized)) {
|
|
296
314
|
issues.push(`evidence-manifest references internal artifact: ${normalized}`);
|
|
@@ -324,14 +342,52 @@ function validateRecipeDocumentArtifact() {
|
|
|
324
342
|
if (authoredRecipe === undefined) return;
|
|
325
343
|
validateRecipeDocumentValue(authoredRecipe, 'recipe.json', { skipRecipeCallResolution: true });
|
|
326
344
|
|
|
327
|
-
|
|
345
|
+
let packageRoot = 'artifacts/recipe-run';
|
|
346
|
+
const pointerValue = readJsonArtifact(
|
|
347
|
+
'artifacts/latest-valid-recipe-run.json',
|
|
348
|
+
'latest-valid-recipe-run.json',
|
|
349
|
+
);
|
|
350
|
+
if (pointerValue !== undefined) {
|
|
351
|
+
const pointer = recipeProtocol?.sanitizeLatestValidRecipeRunPointer?.(pointerValue);
|
|
352
|
+
if (!pointer) {
|
|
353
|
+
issues.push(
|
|
354
|
+
'latest-valid-recipe-run.json: invalid pointer or current @farmslot/protocol is unavailable',
|
|
355
|
+
);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
packageRoot = `artifacts/${pointer.relativeArtifactRoot}`;
|
|
359
|
+
}
|
|
360
|
+
// QA registers its smoke package in qa-result, independently of managed task selection.
|
|
361
|
+
// This locates the existing execution; QA admission still verifies the full frozen suite.
|
|
362
|
+
const qaResult = readJsonArtifact('artifacts/qa-result.json', 'qa-result.json');
|
|
363
|
+
if (qaResult !== undefined) {
|
|
364
|
+
const smokePackage =
|
|
365
|
+
isRecord(qaResult) &&
|
|
366
|
+
qaResult.version === 1 &&
|
|
367
|
+
isRecord(qaResult.packages) &&
|
|
368
|
+
isRecord(qaResult.smoke) &&
|
|
369
|
+
typeof qaResult.smoke.caseId === 'string'
|
|
370
|
+
? qaResult.packages[qaResult.smoke.caseId]
|
|
371
|
+
: undefined;
|
|
372
|
+
const smokeRecipe =
|
|
373
|
+
typeof smokePackage === 'string'
|
|
374
|
+
? normalizeArtifactPath(`${smokePackage}/recipe.json`, false)
|
|
375
|
+
: null;
|
|
376
|
+
if (!smokeRecipe) {
|
|
377
|
+
issues.push(
|
|
378
|
+
'qa-result.json: the registered smoke package must identify a confined relative directory',
|
|
379
|
+
);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
packageRoot = path.posix.dirname(smokeRecipe);
|
|
383
|
+
}
|
|
328
384
|
const recipe = readJsonArtifact(`${packageRoot}/recipe.json`, 'recipe-run/recipe.json');
|
|
329
385
|
if (recipe === undefined) {
|
|
330
|
-
issues.push(
|
|
386
|
+
issues.push(`${packageRoot}/recipe.json is missing`);
|
|
331
387
|
return;
|
|
332
388
|
}
|
|
333
389
|
if (canonicalJson(authoredRecipe) !== canonicalJson(recipe)) {
|
|
334
|
-
issues.push(
|
|
390
|
+
issues.push(`${packageRoot}/recipe.json does not match artifacts/recipe.json`);
|
|
335
391
|
}
|
|
336
392
|
const manifest = readJsonArtifact(
|
|
337
393
|
`${packageRoot}/artifact-manifest.json`,
|
|
@@ -473,7 +529,7 @@ function listArtifactPaths(root) {
|
|
|
473
529
|
}
|
|
474
530
|
|
|
475
531
|
function parseManifest() {
|
|
476
|
-
const relPath = 'artifacts/evidence-manifest.json';
|
|
532
|
+
const relPath = publicationArtifactPath('artifacts/evidence-manifest.json');
|
|
477
533
|
if (!fileExists(relPath)) return null;
|
|
478
534
|
const text = readText(relPath) ?? '';
|
|
479
535
|
let manifest;
|
|
@@ -571,13 +627,14 @@ function parseManifest() {
|
|
|
571
627
|
}
|
|
572
628
|
|
|
573
629
|
const refs = new Set();
|
|
630
|
+
const artifactRoot = path.posix.dirname(relPath);
|
|
574
631
|
for (const pair of manifest.before_after_pairs ?? []) {
|
|
575
|
-
addRef(refs, pair?.before);
|
|
576
|
-
addRef(refs, pair?.after);
|
|
632
|
+
addRef(refs, pair?.before, artifactRoot);
|
|
633
|
+
addRef(refs, pair?.after, artifactRoot);
|
|
577
634
|
}
|
|
578
|
-
for (const entry of manifest.standalone ?? []) addRef(refs, entry?.file);
|
|
579
|
-
addRef(refs, manifest.videos?.before);
|
|
580
|
-
addRef(refs, manifest.videos?.after);
|
|
635
|
+
for (const entry of manifest.standalone ?? []) addRef(refs, entry?.file, artifactRoot);
|
|
636
|
+
addRef(refs, manifest.videos?.before, artifactRoot);
|
|
637
|
+
addRef(refs, manifest.videos?.after, artifactRoot);
|
|
581
638
|
|
|
582
639
|
for (const ref of [...refs].sort()) {
|
|
583
640
|
if (!fileExists(ref)) issues.push(`evidence-manifest references missing artifact: ${ref}`);
|
|
@@ -696,8 +753,21 @@ if (
|
|
|
696
753
|
flags.has('--require-acceptance-status') ||
|
|
697
754
|
(terminalCommand === 'complete' && !isReviewTerminal)
|
|
698
755
|
) {
|
|
756
|
+
let deferClaimVerdicts = false;
|
|
757
|
+
const ledger = readAcceptanceLedger(taskDir);
|
|
758
|
+
if (
|
|
759
|
+
terminalCommand === 'complete' &&
|
|
760
|
+
terminalContract?.claimReviewGate === true &&
|
|
761
|
+
ledger?.schemaVersion === 2
|
|
762
|
+
) {
|
|
763
|
+
const { pendingClaimReviewIssues } = await import('./claim-review-gate.mjs');
|
|
764
|
+
const integrityIssues = await pendingClaimReviewIssues(taskDir, ledger);
|
|
765
|
+
issues.push(...integrityIssues);
|
|
766
|
+
deferClaimVerdicts = integrityIssues.length === 0;
|
|
767
|
+
}
|
|
699
768
|
for (const issue of acceptanceContractIssues(taskDir, {
|
|
700
769
|
allowWeak: terminalContract?.acceptance?.allowWeak === true,
|
|
770
|
+
deferClaimVerdicts,
|
|
701
771
|
})) {
|
|
702
772
|
issues.push(issue);
|
|
703
773
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
|
|
4
|
+
import { readRecordedEvidencePackage } from '@farmslot/adapter-sdk';
|
|
5
|
+
import { validateRecordedEvidencePackage } from '@farmslot/adapter-sdk/evidence';
|
|
6
|
+
|
|
7
|
+
import attemptSelection from './retained-recipe-attempt.cjs';
|
|
8
|
+
|
|
9
|
+
/** The existing reader verifies bytes; this only binds the task transport to that selected execution. */
|
|
10
|
+
export async function pendingClaimReviewIssues(taskDir, ledger) {
|
|
11
|
+
const pointer = attemptSelection.readRecipeAttemptSelection(taskDir);
|
|
12
|
+
if (!pointer) return ['Human evidence review requires a selected successful recipe attempt.'];
|
|
13
|
+
const root = path.join(taskDir, 'artifacts', pointer.relativeArtifactRoot);
|
|
14
|
+
const { input, checks } = await readRecordedEvidencePackage(root);
|
|
15
|
+
const errors = checks.filter((check) => check.status === 'fail').map((check) => check.message);
|
|
16
|
+
errors.push(
|
|
17
|
+
...validateRecordedEvidencePackage(input)
|
|
18
|
+
.findings.filter((finding) => finding.severity === 'error')
|
|
19
|
+
.map((finding) => finding.message),
|
|
20
|
+
);
|
|
21
|
+
if (errors.length) return errors;
|
|
22
|
+
if (!input.claims || input.claims.recipeRunId !== ledger.recipeRunId)
|
|
23
|
+
return ['Task verdicts belong to another recipe execution.'];
|
|
24
|
+
for (const row of ledger.criteria) {
|
|
25
|
+
const claim = input.claims.criteria.find(({ id }) => id === row.id);
|
|
26
|
+
if (
|
|
27
|
+
!claim ||
|
|
28
|
+
[
|
|
29
|
+
'id',
|
|
30
|
+
'text',
|
|
31
|
+
'kind',
|
|
32
|
+
'parentId',
|
|
33
|
+
'proofMode',
|
|
34
|
+
'verdict',
|
|
35
|
+
'recipeNodes',
|
|
36
|
+
'assertionIndices',
|
|
37
|
+
'moments',
|
|
38
|
+
].some((key) => !isDeepStrictEqual(row[key], claim[key]))
|
|
39
|
+
)
|
|
40
|
+
errors.push(`Task claim ${row.id} differs from its selected engine claim.`);
|
|
41
|
+
}
|
|
42
|
+
return errors;
|
|
43
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { randomUUID } = require('node:crypto');
|
|
4
|
+
const {
|
|
5
|
+
existsSync,
|
|
6
|
+
readFileSync,
|
|
7
|
+
realpathSync,
|
|
8
|
+
renameSync,
|
|
9
|
+
rmSync,
|
|
10
|
+
writeFileSync,
|
|
11
|
+
} = require('node:fs');
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
const { sanitizeLatestValidRecipeRunPointer } = require('@farmslot/protocol/recipe');
|
|
14
|
+
|
|
15
|
+
/** Advance task selection after success without changing any attempt bytes. */
|
|
16
|
+
function recordRecipeAttemptSelection(taskDir, artifactDir) {
|
|
17
|
+
const artifacts = realpathSync(path.join(taskDir, 'artifacts'));
|
|
18
|
+
const attempt = realpathSync(artifactDir);
|
|
19
|
+
const relative = path.relative(artifacts, attempt).split(path.sep).join('/');
|
|
20
|
+
const pointer = sanitizeLatestValidRecipeRunPointer({
|
|
21
|
+
version: 1,
|
|
22
|
+
relativeArtifactRoot: relative,
|
|
23
|
+
updatedAt: new Date().toISOString(),
|
|
24
|
+
});
|
|
25
|
+
if (!pointer) return false;
|
|
26
|
+
const summary = JSON.parse(readFileSync(path.join(attempt, 'summary.json'), 'utf8'));
|
|
27
|
+
if (summary.status !== 'pass') return false;
|
|
28
|
+
const destination = path.join(artifacts, 'latest-valid-recipe-run.json');
|
|
29
|
+
const temporary = `${destination}.${randomUUID()}.tmp`;
|
|
30
|
+
try {
|
|
31
|
+
writeFileSync(temporary, `${JSON.stringify(pointer)}\n`, { flag: 'wx', mode: 0o600 });
|
|
32
|
+
renameSync(temporary, destination);
|
|
33
|
+
} finally {
|
|
34
|
+
rmSync(temporary, { force: true });
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function readRecipeAttemptSelection(taskDir) {
|
|
40
|
+
const file = path.join(taskDir, 'artifacts', 'latest-valid-recipe-run.json');
|
|
41
|
+
if (!existsSync(file)) return null;
|
|
42
|
+
const pointer = sanitizeLatestValidRecipeRunPointer(JSON.parse(readFileSync(file, 'utf8')));
|
|
43
|
+
if (!pointer) throw new Error('Invalid retained recipe attempt selection.');
|
|
44
|
+
return pointer;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = { readRecipeAttemptSelection, recordRecipeAttemptSelection };
|
|
48
|
+
if (require.main === module) recordRecipeAttemptSelection(process.argv[2], process.argv[3]);
|
|
@@ -52,6 +52,7 @@ const { atomicWrite } = require('./mark-io.cjs');
|
|
|
52
52
|
* @property {string} flowType
|
|
53
53
|
* @property {string} [mode]
|
|
54
54
|
* @property {boolean} requireSignal
|
|
55
|
+
* @property {number} [recordedEvidenceContractVersion] Gateway-owned run version projection.
|
|
55
56
|
* @property {WorkerTerminalAcceptanceRules} [acceptance]
|
|
56
57
|
* @property {Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>} commands
|
|
57
58
|
* @property {WorkerTerminalWhenPresentRule[]} whenPresent
|
|
@@ -391,7 +392,10 @@ function lintWorkerTemplateAgainstContract(templateContent, contract) {
|
|
|
391
392
|
const spec = contract.commands[/** @type {WorkerTerminalCommand} */ (command)];
|
|
392
393
|
if (!spec) continue;
|
|
393
394
|
for (const artifactPath of spec.artifacts) {
|
|
394
|
-
|
|
395
|
+
const reviewerFeedbackBinding =
|
|
396
|
+
artifactPath === 'artifacts/review-feedback.md' &&
|
|
397
|
+
templateContent.includes('{{REVIEW_FEEDBACK}}');
|
|
398
|
+
if (!templateContent.includes(artifactPath) && !reviewerFeedbackBinding) {
|
|
395
399
|
issues.push(
|
|
396
400
|
`missing checklist/reference to required artifact \`${artifactPath}\` for \`${command}\``,
|
|
397
401
|
);
|