@farmslot/agent-runtime 0.13.0 → 0.15.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/native/registry.d.ts.map +1 -1
  3. package/dist/native/registry.js +6 -1
  4. package/dist/native/registry.js.map +1 -1
  5. package/package.json +2 -2
  6. package/scripts/acceptance-ledger.cjs +2 -1
  7. package/scripts/mark-checklist-step.cjs +15 -1
  8. package/scripts/review-terminal.cjs +6 -1
  9. package/scripts/subtask-unit.cjs +2 -1
  10. package/scripts/worker-terminal-contract.cjs +19 -8
  11. package/dist/execution-template/execution-template.test.d.ts +0 -2
  12. package/dist/execution-template/execution-template.test.d.ts.map +0 -1
  13. package/dist/execution-template/execution-template.test.js +0 -795
  14. package/dist/execution-template/execution-template.test.js.map +0 -1
  15. package/dist/execution-template/subtask-render-parity.test.d.ts +0 -2
  16. package/dist/execution-template/subtask-render-parity.test.d.ts.map +0 -1
  17. package/dist/execution-template/subtask-render-parity.test.js +0 -63
  18. package/dist/execution-template/subtask-render-parity.test.js.map +0 -1
  19. package/dist/native/account-observation.test.d.ts +0 -2
  20. package/dist/native/account-observation.test.d.ts.map +0 -1
  21. package/dist/native/account-observation.test.js +0 -256
  22. package/dist/native/account-observation.test.js.map +0 -1
  23. package/dist/native/account-profiles.test.d.ts +0 -2
  24. package/dist/native/account-profiles.test.d.ts.map +0 -1
  25. package/dist/native/account-profiles.test.js +0 -172
  26. package/dist/native/account-profiles.test.js.map +0 -1
  27. package/dist/native/acp.test.d.ts +0 -2
  28. package/dist/native/acp.test.d.ts.map +0 -1
  29. package/dist/native/acp.test.js +0 -257
  30. package/dist/native/acp.test.js.map +0 -1
  31. package/dist/native/affinity.test.d.ts +0 -2
  32. package/dist/native/affinity.test.d.ts.map +0 -1
  33. package/dist/native/affinity.test.js +0 -30
  34. package/dist/native/affinity.test.js.map +0 -1
  35. package/dist/native/cursor-model.test.d.ts +0 -2
  36. package/dist/native/cursor-model.test.d.ts.map +0 -1
  37. package/dist/native/cursor-model.test.js +0 -40
  38. package/dist/native/cursor-model.test.js.map +0 -1
  39. package/dist/native/durability.test.d.ts +0 -2
  40. package/dist/native/durability.test.d.ts.map +0 -1
  41. package/dist/native/durability.test.js +0 -976
  42. package/dist/native/durability.test.js.map +0 -1
  43. package/dist/native/filesystem-policy.test.d.ts +0 -2
  44. package/dist/native/filesystem-policy.test.d.ts.map +0 -1
  45. package/dist/native/filesystem-policy.test.js +0 -136
  46. package/dist/native/filesystem-policy.test.js.map +0 -1
  47. package/dist/native/process-tree.test.d.ts +0 -2
  48. package/dist/native/process-tree.test.d.ts.map +0 -1
  49. package/dist/native/process-tree.test.js +0 -174
  50. package/dist/native/process-tree.test.js.map +0 -1
  51. package/dist/native/process.test.d.ts +0 -2
  52. package/dist/native/process.test.d.ts.map +0 -1
  53. package/dist/native/process.test.js +0 -56
  54. package/dist/native/process.test.js.map +0 -1
  55. package/dist/native/registry.test.d.ts +0 -2
  56. package/dist/native/registry.test.d.ts.map +0 -1
  57. package/dist/native/registry.test.js +0 -13
  58. package/dist/native/registry.test.js.map +0 -1
  59. package/dist/native/review-sandbox.test.d.ts +0 -2
  60. package/dist/native/review-sandbox.test.d.ts.map +0 -1
  61. package/dist/native/review-sandbox.test.js +0 -40
  62. package/dist/native/review-sandbox.test.js.map +0 -1
  63. package/dist/native/worker-history.test.d.ts +0 -2
  64. package/dist/native/worker-history.test.d.ts.map +0 -1
  65. package/dist/native/worker-history.test.js +0 -195
  66. package/dist/native/worker-history.test.js.map +0 -1
  67. package/dist/native/worker-launch.test.d.ts +0 -2
  68. package/dist/native/worker-launch.test.d.ts.map +0 -1
  69. package/dist/native/worker-launch.test.js +0 -61
  70. package/dist/native/worker-launch.test.js.map +0 -1
  71. package/dist/native/worker-relocation.test.d.ts +0 -2
  72. package/dist/native/worker-relocation.test.d.ts.map +0 -1
  73. package/dist/native/worker-relocation.test.js +0 -110
  74. package/dist/native/worker-relocation.test.js.map +0 -1
  75. package/dist/task-init/discover.test.d.ts +0 -2
  76. package/dist/task-init/discover.test.d.ts.map +0 -1
  77. package/dist/task-init/discover.test.js +0 -58
  78. package/dist/task-init/discover.test.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@
4
4
 
5
5
  - Active-development baseline; add user-facing changes here before release or package publication.
6
6
 
7
+ ## 0.15.0 - 2026-09-28
8
+
9
+ - QA tasks complete with one HTML report and structured evidence, without requiring a duplicate Markdown report.
10
+
11
+ ## 0.14.0 - 2026-09-27
12
+
13
+ - Resolve acceptance requirements per worker flow, so fix-bug tasks can require verdicts without blocking review runs.
14
+ - Bind terminal-review task marks to the launch attempt so repeated bootstrap by delegated workers preserves parent identity and checklist progress.
15
+ - Static Claude reviews initialize workspace trust with the launch environment and keep tool-runner scratch files writable inside the review sandbox.
16
+ - The published `dist/` no longer carries compiled test modules. The build config excludes `src/**/*.test.ts`, matching the other workspace packages; 0.13.0 shipped 17 of them (`.js`, `.d.ts` and both maps each) including the native durability and review-sandbox suites.
17
+
7
18
  ## 0.13.0 - 2026-09-20
8
19
 
9
20
  - `mark N` on a step whose box and timing event are already recorded is a true no-op: it prints `already marked N` and leaves SIGNAL.json untouched instead of rewriting it with a new timestamp. A resume from `blocked`, a box checked by hand, `start` and every terminal mark still write.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/native/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;IAClE,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE;QACP,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjF,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QACzB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;KAChF,CAAC;CACH;AAED,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CA2E1E,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/native/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;IAClE,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE;QACP,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjF,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QACzB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;KAChF,CAAC;CACH;AAED,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAgF1E,CAAC"}
@@ -26,7 +26,12 @@ export const nativeRunnerDefinitions = {
26
26
  },
27
27
  claude: {
28
28
  supportsReadOnlyWorkspace: hostReviewSandboxAvailable(),
29
- reviewRuntimeRoots: (env) => [env.CLAUDE_CONFIG_DIR ?? join(env.HOME ?? homedir(), '.claude')],
29
+ reviewRuntimeRoots: (env) => [
30
+ env.CLAUDE_CONFIG_DIR ?? join(env.HOME ?? homedir(), '.claude'),
31
+ // Claude Code creates its tool-runner scratch directory outside
32
+ // CLAUDE_CONFIG_DIR. Keep that state writable inside the review sandbox.
33
+ ...(typeof process.getuid === 'function' ? [join('/tmp', `claude-${process.getuid()}`)] : []),
34
+ ],
30
35
  adapter: claudeNativeAdapter,
31
36
  binary: 'claude',
32
37
  supportsWorkers: true,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/native/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/native/registry.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.13.0",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.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.30.0"
48
+ "@farmslot/protocol": "0.32.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/node": "^22.0.0",
@@ -3,7 +3,8 @@ const path = require('node:path');
3
3
 
4
4
  const { atomicWrite, readJson } = require('./mark-io.cjs');
5
5
 
6
- // Acceptance-criteria ledger (ADR-060 / plans/sub-task-observability-v1.md).
6
+ // Acceptance-criteria ledger (ADR-060; contract in docs/reference/agent-runtime.md
7
+ // and docs/reference/task-directory-contract.md).
7
8
  //
8
9
  // `farmslot-agent ac` is the only writer of artifacts/acceptance-status.json, the
9
10
  // way `mark` is the only writer of SIGNAL.json. The ids come from task init, which
@@ -35,6 +35,7 @@ const LEARNINGS_ARTIFACT = path.join('artifacts', 'learnings.md');
35
35
  const ARTIFACT_CONTRACT_SCRIPT = path.resolve(__dirname, 'check-task-artifact-contract.mjs');
36
36
 
37
37
  const FLOW_REPORT_ARTIFACTS = {
38
+ qa: ['report.html', 'qa-report.md', 'report.md'],
38
39
  'fix-bug': ['pr-description.md', 'report.md'],
39
40
  'review-pr': ['review.md', 'report.md'],
40
41
  dev: ['pr-description.md', 'report.md'],
@@ -393,7 +394,9 @@ function assertTerminalPackagedEvidence(taskPath, taskDir, terminalCommand) {
393
394
  function buildSignalUpdate(signal, terminal, target, timing, events, now, taskPath, _taskDir) {
394
395
  const base = {
395
396
  ...pickSignalPassthrough(signal),
396
- ...(isStartCommand ? { attemptId: randomUUID() } : {}),
397
+ ...(isStartCommand
398
+ ? { attemptId: process.env.FARMSLOT_SIGNAL_ATTEMPT_ID || randomUUID() }
399
+ : {}),
397
400
  step: target?.label ?? signal.step ?? 'complete',
398
401
  checklistTiming: {
399
402
  schemaVersion: 1,
@@ -507,6 +510,17 @@ const target = isStartCommand
507
510
 
508
511
  const now = new Date().toISOString();
509
512
  const signal = readJson(signalPath);
513
+ // The launcher owns the attempt. Descendants may repeat bootstrap, but must not
514
+ // replace the parent's identity or reset progress within that same attempt.
515
+ if (
516
+ isStartCommand &&
517
+ process.env.FARMSLOT_SIGNAL_ATTEMPT_ID &&
518
+ signal.attemptId === process.env.FARMSLOT_SIGNAL_ATTEMPT_ID &&
519
+ signal.status === 'running'
520
+ ) {
521
+ console.log('signal already started');
522
+ process.exit(0);
523
+ }
510
524
  const timing =
511
525
  signal.checklistTiming && typeof signal.checklistTiming === 'object'
512
526
  ? signal.checklistTiming
@@ -75,7 +75,6 @@ async function main() {
75
75
  const guard = await sandbox(policy, runtimeRoots);
76
76
  const promptFile = path.join(task, '.terminal-prompt.txt');
77
77
  fs.writeFileSync(promptFile, input.prompt, { mode: 0o600 });
78
- if (input.setup) check(cp.spawnSync('/bin/sh', ['-c', input.setup], { cwd, encoding: 'utf8' }));
79
78
  const environment = {
80
79
  ...process.env,
81
80
  ...input.environment.set,
@@ -91,12 +90,18 @@ async function main() {
91
90
  'FARMSLOT_GATEWAY_PASSWORD',
92
91
  ])
93
92
  delete environment[key];
93
+ environment.FARMSLOT_SIGNAL_ATTEMPT_ID = require('node:crypto').randomUUID();
94
+ if (input.setup)
95
+ check(
96
+ cp.spawnSync('/bin/sh', ['-c', input.setup], { cwd, env: environment, encoding: 'utf8' }),
97
+ );
94
98
  const commandFile = path.join(task, '.terminal-start.cjs');
95
99
  const record = {
96
100
  runId: input.runId,
97
101
  workspaceId: input.workspaceId,
98
102
  session: input.session,
99
103
  startedAt: new Date().toISOString(),
104
+ signalAttemptId: environment.FARMSLOT_SIGNAL_ATTEMPT_ID,
100
105
  };
101
106
  const launch = `const cp=require('node:child_process');const env={...process.env};for(const key of ['FARMSLOT_NODE_TOKEN','FARMSLOT_GATEWAY_TOKEN','FARMSLOT_GATEWAY_PASSWORD','CLAUDECODE'])delete env[key];const r=cp.spawnSync(${JSON.stringify(guard.sandbox.executable)},${JSON.stringify([...guard.sandbox.args, '/bin/sh', '-c', input.command])},{cwd:${JSON.stringify(cwd)},env,stdio:'inherit'});process.exit(r.status??1);`;
102
107
  fs.writeFileSync(commandFile, launch, { mode: 0o600 });
@@ -24,7 +24,8 @@ const {
24
24
  writeSignal,
25
25
  } = require('./mark-io.cjs');
26
26
 
27
- // Child checklist units (ADR-060 / plans/sub-task-observability-v1.md).
27
+ // Child checklist units (ADR-060; contract in docs/reference/agent-runtime.md
28
+ // and docs/reference/task-directory-contract.md).
28
29
  //
29
30
  // `mark` is the only writer of `subtasks/`: it materializes a child checklist
30
31
  // from a source, registers it in `subtasks/index.json`, and maintains the child
@@ -31,7 +31,7 @@
31
31
  * @property {Partial<Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>>} [complete]
32
32
  * @property {Partial<Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>>} [no-change]
33
33
  * @property {Partial<Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>>} [blocked]
34
- * @property {Record<string, Partial<Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>>>} [flows]
34
+ * @property {Record<string, Partial<Record<WorkerTerminalCommand, WorkerTerminalCommandSpec>> & {acceptance?: WorkerTerminalAcceptanceRules}>} [flows]
35
35
  * @property {WorkerTerminalWhenPresentRule[]} [whenPresent]
36
36
  */
37
37
 
@@ -141,6 +141,14 @@ const BUILTIN_FLOW_COMMANDS = {
141
141
  },
142
142
  blocked: { artifacts: [] },
143
143
  },
144
+ qa: {
145
+ complete: { report: 'artifacts/report.html', artifacts: [LEARNINGS, 'artifacts/report.html'] },
146
+ 'no-change': {
147
+ report: 'artifacts/report.html',
148
+ artifacts: [LEARNINGS, 'artifacts/report.html'],
149
+ },
150
+ blocked: { artifacts: [] },
151
+ },
144
152
  'validate-dep': {
145
153
  complete: { report: 'artifacts/report.md', artifacts: [LEARNINGS, 'artifacts/report.md'] },
146
154
  'no-change': {
@@ -236,13 +244,16 @@ function resolveWorkerTerminalContract(projectConfig, flowType, options = {}) {
236
244
  }))
237
245
  : DEFAULT_WHEN_PRESENT.map((rule) => ({ ...rule, alsoRequire: [...rule.alsoRequire] }));
238
246
 
239
- const acceptance =
240
- projectConfig?.acceptance && typeof projectConfig.acceptance === 'object'
241
- ? {
242
- ...(projectConfig.acceptance.require ? { require: true } : {}),
243
- ...(projectConfig.acceptance.allowWeak ? { allowWeak: true } : {}),
244
- }
245
- : null;
247
+ const acceptanceRules =
248
+ projectConfig?.acceptance || flowLayer?.acceptance
249
+ ? { ...projectConfig?.acceptance, ...flowLayer?.acceptance }
250
+ : undefined;
251
+ const acceptance = acceptanceRules
252
+ ? {
253
+ ...(acceptanceRules.require ? { require: true } : {}),
254
+ ...(acceptanceRules.allowWeak ? { allowWeak: true } : {}),
255
+ }
256
+ : null;
246
257
 
247
258
  return {
248
259
  schemaVersion: 1,
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=execution-template.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution-template.test.d.ts","sourceRoot":"","sources":["../../src/execution-template/execution-template.test.ts"],"names":[],"mappings":""}