@farmslot/agent-runtime 0.13.0 → 0.14.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 +7 -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 +14 -1
  8. package/scripts/review-terminal.cjs +6 -1
  9. package/scripts/subtask-unit.cjs +2 -1
  10. package/scripts/worker-terminal-contract.cjs +11 -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,13 @@
4
4
 
5
5
  - Active-development baseline; add user-facing changes here before release or package publication.
6
6
 
7
+ ## 0.14.0 - 2026-09-27
8
+
9
+ - Resolve acceptance requirements per worker flow, so fix-bug tasks can require verdicts without blocking review runs.
10
+ - Bind terminal-review task marks to the launch attempt so repeated bootstrap by delegated workers preserves parent identity and checklist progress.
11
+ - Static Claude reviews initialize workspace trust with the launch environment and keep tool-runner scratch files writable inside the review sandbox.
12
+ - 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.
13
+
7
14
  ## 0.13.0 - 2026-09-20
8
15
 
9
16
  - `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.14.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.31.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
@@ -393,7 +393,9 @@ function assertTerminalPackagedEvidence(taskPath, taskDir, terminalCommand) {
393
393
  function buildSignalUpdate(signal, terminal, target, timing, events, now, taskPath, _taskDir) {
394
394
  const base = {
395
395
  ...pickSignalPassthrough(signal),
396
- ...(isStartCommand ? { attemptId: randomUUID() } : {}),
396
+ ...(isStartCommand
397
+ ? { attemptId: process.env.FARMSLOT_SIGNAL_ATTEMPT_ID || randomUUID() }
398
+ : {}),
397
399
  step: target?.label ?? signal.step ?? 'complete',
398
400
  checklistTiming: {
399
401
  schemaVersion: 1,
@@ -507,6 +509,17 @@ const target = isStartCommand
507
509
 
508
510
  const now = new Date().toISOString();
509
511
  const signal = readJson(signalPath);
512
+ // The launcher owns the attempt. Descendants may repeat bootstrap, but must not
513
+ // replace the parent's identity or reset progress within that same attempt.
514
+ if (
515
+ isStartCommand &&
516
+ process.env.FARMSLOT_SIGNAL_ATTEMPT_ID &&
517
+ signal.attemptId === process.env.FARMSLOT_SIGNAL_ATTEMPT_ID &&
518
+ signal.status === 'running'
519
+ ) {
520
+ console.log('signal already started');
521
+ process.exit(0);
522
+ }
510
523
  const timing =
511
524
  signal.checklistTiming && typeof signal.checklistTiming === 'object'
512
525
  ? 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
 
@@ -236,13 +236,16 @@ function resolveWorkerTerminalContract(projectConfig, flowType, options = {}) {
236
236
  }))
237
237
  : DEFAULT_WHEN_PRESENT.map((rule) => ({ ...rule, alsoRequire: [...rule.alsoRequire] }));
238
238
 
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;
239
+ const acceptanceRules =
240
+ projectConfig?.acceptance || flowLayer?.acceptance
241
+ ? { ...projectConfig?.acceptance, ...flowLayer?.acceptance }
242
+ : undefined;
243
+ const acceptance = acceptanceRules
244
+ ? {
245
+ ...(acceptanceRules.require ? { require: true } : {}),
246
+ ...(acceptanceRules.allowWeak ? { allowWeak: true } : {}),
247
+ }
248
+ : null;
246
249
 
247
250
  return {
248
251
  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":""}