@iowarp/clio-coder 0.3.3 → 0.3.4

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 (244) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +3 -3
  4. package/dist/{acp-P2AQILE2.js → acp-S5R4RR5B.js} +7 -6
  5. package/dist/{agents-72W3BI7I.js → agents-P6DMMVZY.js} +24 -21
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5TWEIYDN.js → auth-2XCZLPKS.js} +12 -8
  8. package/dist/{chunk-GGXXDWE4.js → chunk-22NAGB7X.js} +2 -2
  9. package/dist/{chunk-2DJ2KNFG.js → chunk-2LZI5CAG.js} +133 -13
  10. package/dist/{chunk-OAO4GE4M.js → chunk-2TZWSW76.js} +2 -2
  11. package/dist/{chunk-OOJYHWRB.js → chunk-34475P3I.js} +2 -2
  12. package/dist/{chunk-4XUGQOHA.js → chunk-35MKKU5R.js} +4 -4
  13. package/dist/{chunk-LM5TQCJZ.js → chunk-3HZ5RWN2.js} +5 -5
  14. package/dist/{chunk-AGYYIBLL.js → chunk-3JLKSKD7.js} +2 -2
  15. package/dist/{chunk-KZWTDYJF.js → chunk-4JUF2NNX.js} +7 -7
  16. package/dist/{chunk-ZDOOVTXZ.js → chunk-4OC57DA6.js} +27 -4
  17. package/dist/chunk-5M54SPOL.js +926 -0
  18. package/dist/{chunk-STBPMHSX.js → chunk-7RXG6QRZ.js} +51 -11
  19. package/dist/{chunk-X6IAEBZR.js → chunk-A2GZF7DC.js} +5 -5
  20. package/dist/{chunk-A3CYT5EX.js → chunk-AD2SYQYC.js} +55 -2
  21. package/dist/chunk-AOCYTWAV.js +449 -0
  22. package/dist/chunk-BEY543CS.js +258 -0
  23. package/dist/{chunk-6N5PTWMY.js → chunk-BP4OYD6A.js} +32 -13
  24. package/dist/chunk-BPGS2WCQ.js +612 -0
  25. package/dist/{chunk-V6RTAOC2.js → chunk-BRXQQJFP.js} +8 -8
  26. package/dist/chunk-CFGTUFWB.js +67 -0
  27. package/dist/{chunk-CBCAPZAA.js → chunk-E25LMLRW.js} +2 -2
  28. package/dist/{chunk-DUYJ5IO6.js → chunk-EDRHSCIE.js} +4 -4
  29. package/dist/{chunk-XBXAASKX.js → chunk-EFADSJET.js} +2 -2
  30. package/dist/{chunk-M6SHUN7Q.js → chunk-FO5ZOVUY.js} +2 -2
  31. package/dist/chunk-FYYLNIL5.js +313 -0
  32. package/dist/{chunk-FNTMWMX5.js → chunk-HV5X7OR2.js} +14 -12
  33. package/dist/{chunk-TZTZS7QK.js → chunk-HXG4IURW.js} +5 -3
  34. package/dist/{chunk-5UFT4SUX.js → chunk-K6WL7QZT.js} +3 -3
  35. package/dist/chunk-K7VKOLQQ.js +15 -0
  36. package/dist/{chunk-BMEMKKIT.js → chunk-KOHPCX4K.js} +2 -2
  37. package/dist/{chunk-OC7FIQPC.js → chunk-KRPY7NTG.js} +10 -7
  38. package/dist/chunk-LL4KHSZI.js +22 -0
  39. package/dist/{chunk-DSELYM6W.js → chunk-MEQ45TQ4.js} +15 -9
  40. package/dist/{chunk-5UUP6MWO.js → chunk-MV3K5QF2.js} +5 -436
  41. package/dist/{chunk-6SGHMWE3.js → chunk-N4CZJQRK.js} +5 -5
  42. package/dist/{chunk-TZK7PACC.js → chunk-NILBFAPG.js} +14 -8
  43. package/dist/chunk-OZNBF4L3.js +23 -0
  44. package/dist/{verify-375KUB3Y.js → chunk-PCZJO5TI.js} +127 -42
  45. package/dist/chunk-QQK64KLB.js +1360 -0
  46. package/dist/{chunk-SRDMMSEP.js → chunk-QQL5RT5M.js} +979 -1619
  47. package/dist/{chunk-LZSJBIVT.js → chunk-QWU7ZBO7.js} +70 -720
  48. package/dist/{chunk-2TLUCQVG.js → chunk-RD5U66HV.js} +3 -3
  49. package/dist/{chunk-OKGUZO2U.js → chunk-SPULKLCF.js} +4 -3
  50. package/dist/{chunk-OQ33BKR3.js → chunk-TTNYS3EA.js} +3 -60
  51. package/dist/chunk-TW3WDMVS.js +677 -0
  52. package/dist/chunk-TZSKNMZG.js +434 -0
  53. package/dist/{chunk-7MNJORFF.js → chunk-UL3WSD3F.js} +6 -1
  54. package/dist/{chunk-PIWWS5BL.js → chunk-UZHIZC5S.js} +7 -7
  55. package/dist/{chunk-UFIIWP2H.js → chunk-VAWWTKDP.js} +8 -8
  56. package/dist/{chunk-COU2UHX6.js → chunk-VEZEGCGW.js} +170 -2
  57. package/dist/{chunk-LW6DSM3M.js → chunk-VMNQ6OZA.js} +98 -202
  58. package/dist/chunk-VSNATDE6.js +122 -0
  59. package/dist/chunk-W6GROXXM.js +69 -0
  60. package/dist/chunk-WPQLXFOZ.js +375 -0
  61. package/dist/{chunk-ORBHGJC5.js → chunk-WR67VIZY.js} +3 -3
  62. package/dist/{chunk-PAJK6MAQ.js → chunk-X6COSD2O.js} +5 -5
  63. package/dist/chunk-ZGVHUX3M.js +66 -0
  64. package/dist/{chunk-LWLEKMDQ.js → chunk-ZYKPLLNQ.js} +510 -547
  65. package/dist/cli/index.js +27 -23
  66. package/dist/{clio-JOU4FXVA.js → clio-J5JIOIDS.js} +7 -6
  67. package/dist/{code-nav-7AX6FYE6.js → code-nav-AXCXSBHX.js} +5 -3
  68. package/dist/{config-XCDVKR23.js → config-OEBMIN2U.js} +37 -27
  69. package/dist/{configure-4GAP54ZW.js → configure-PUQOSIXQ.js} +16 -13
  70. package/dist/{context-5VKGUVJJ.js → context-EKDCKUUZ.js} +82 -7
  71. package/dist/{context-4UOGGLQ5.js → context-MGSE4Z2T.js} +33 -23
  72. package/dist/{context-77FM5DV5.js → context-URSXPBCK.js} +17 -9
  73. package/dist/{context-clear-XXJRLCJJ.js → context-clear-KDAJRNUK.js} +33 -23
  74. package/dist/context-working-set-SBKMPPI2.js +1552 -0
  75. package/dist/{dispatch-runner-QPRDDBDX.js → dispatch-runner-MSWN72NK.js} +43 -29
  76. package/dist/{doctor-HR46URBJ.js → doctor-7BSE27PJ.js} +10 -10
  77. package/dist/{eval-XSSNATB4.js → eval-IZGDOO4H.js} +9 -8
  78. package/dist/{evidence-6HG2PY2B.js → evidence-SR7WXB5B.js} +51 -23
  79. package/dist/{evolve-K7YU3NCY.js → evolve-K7VE2CBX.js} +30 -20
  80. package/dist/{fleet-VY3HHKN6.js → fleet-7XMJNQNF.js} +48 -38
  81. package/dist/{fleet-preflight-DDN536IT.js → fleet-preflight-AQNAH644.js} +3 -3
  82. package/dist/{init-JYGXI3FK.js → init-JGNPAYXT.js} +41 -31
  83. package/dist/{memory-WFZMGYHX.js → memory-4ALKDJ4Q.js} +32 -22
  84. package/dist/{models-I5QWSEOM.js → models-ZMMLFJNN.js} +22 -19
  85. package/dist/{monitor-GE4ID3IA.js → monitor-2F3T5KHP.js} +55 -43
  86. package/dist/{orchestrator-EM5MC3HM.js → orchestrator-ORHT43JB.js} +572 -388
  87. package/dist/{reset-L2FQEE3E.js → reset-NXGTYNUO.js} +4 -3
  88. package/dist/{run-ZU3QMZPZ.js → run-RF4WJGMT.js} +51 -41
  89. package/dist/{share-S5BZQC5I.js → share-UT3W6E4M.js} +5 -4
  90. package/dist/{skills-X5VXCRNQ.js → skills-PSACKC5Q.js} +2 -2
  91. package/dist/{skills-eval-WKIHWTHR.js → skills-eval-WJSI55RZ.js} +34 -24
  92. package/dist/{targets-SNCPI2NR.js → targets-PIIRAOYS.js} +23 -20
  93. package/dist/{terminal-lease-BNAHVHBS.js → terminal-lease-ULWXWNVY.js} +4 -3
  94. package/dist/{upgrade-JQHHPQ4K.js → upgrade-346TZ6AV.js} +18 -17
  95. package/dist/{usage-OR4O5SMZ.js → usage-6KKXR32N.js} +34 -24
  96. package/dist/verifiers-4UUM6TEE.js +1214 -0
  97. package/dist/verify-X5HDROLA.js +25 -0
  98. package/dist/{wiki-generate-UEXP2ARI.js → wiki-generate-7STOCIFZ.js} +42 -31
  99. package/dist/worker/entry.js +33 -24
  100. package/docs/README.md +7 -6
  101. package/docs/acp.md +1 -1
  102. package/docs/alcf-provider.md +1 -1
  103. package/docs/architecture.md +2 -2
  104. package/docs/artifact-versions.md +1 -1
  105. package/docs/built-in-agents.md +1 -1
  106. package/docs/capacity-and-scheduling.md +1 -1
  107. package/docs/commands-and-modes.md +53 -21
  108. package/docs/config-knobs-audit.md +1 -2
  109. package/docs/configuration-and-targets.md +15 -1
  110. package/docs/context-engine.md +64 -12
  111. package/docs/context-working-set.md +194 -0
  112. package/docs/development-pipeline.md +1 -1
  113. package/docs/documentation-coverage.md +5 -5
  114. package/docs/documentation-guide.md +6 -5
  115. package/docs/environment-variables.md +2 -1
  116. package/docs/eval-runner.md +1 -1
  117. package/docs/evals-internal.md +14 -1
  118. package/docs/evidence-and-memory.md +74 -2
  119. package/docs/evolution.md +1 -1
  120. package/docs/exit-codes-and-output.md +1 -1
  121. package/docs/extensions-and-sharing.md +2 -2
  122. package/docs/fleet-dispatch.md +22 -7
  123. package/docs/glossary.md +21 -1
  124. package/docs/installation-and-lifecycle.md +2 -2
  125. package/docs/middleware-and-components.md +1 -1
  126. package/docs/model-catalog.md +7 -9
  127. package/docs/observability.md +4 -4
  128. package/docs/proactive-memory.md +1 -1
  129. package/docs/prompt-envelope-and-tools.md +4 -4
  130. package/docs/provider-adapter-cookbook.md +1 -1
  131. package/docs/release-cut-checklist.md +31 -31
  132. package/docs/safety-model.md +23 -4
  133. package/docs/scientific-validation.md +21 -3
  134. package/docs/session-lifecycle.md +3 -3
  135. package/docs/skills-marketplace.md +1 -1
  136. package/docs/tool-usage.md +79 -12
  137. package/docs/trace-store.md +1 -1
  138. package/docs/troubleshooting.md +1 -1
  139. package/docs/tui-design.md +1 -1
  140. package/docs/worker-dispatch-mechanics.md +11 -1
  141. package/package.json +8 -11
  142. package/skills/meta/clio-test/SKILL.md +20 -17
  143. package/skills/meta/clio-test/evals.md +3 -3
  144. package/skills/meta/clio-test/references/harness.md +35 -6
  145. package/skills/meta/clio-test/references/test-map.md +20 -10
  146. package/skills/registry.yaml +2 -2
  147. package/skills/skill-marketplace.json +1 -1
  148. package/src/cli/context-working-set.ts +513 -0
  149. package/src/cli/context.ts +8 -0
  150. package/src/cli/evidence.ts +20 -2
  151. package/src/cli/index.ts +4 -0
  152. package/src/cli/verifiers.ts +325 -0
  153. package/src/core/bash-exec.ts +39 -14
  154. package/src/core/bus-events.ts +19 -4
  155. package/src/core/config.ts +54 -0
  156. package/src/core/defaults.ts +50 -3
  157. package/src/core/verification-scripts.ts +6 -0
  158. package/src/domains/agents/builtins/verifier.md +3 -0
  159. package/src/domains/config/classify.ts +1 -0
  160. package/src/domains/context/working-set/contract.ts +161 -0
  161. package/src/domains/context/working-set/defaults.ts +28 -0
  162. package/src/domains/context/working-set/engine.ts +203 -0
  163. package/src/domains/context/working-set/fold.ts +62 -0
  164. package/src/domains/context/working-set/horizon.ts +38 -0
  165. package/src/domains/context/working-set/marker.ts +103 -0
  166. package/src/domains/context/working-set/path-index.ts +436 -0
  167. package/src/domains/context/working-set/payload.ts +152 -0
  168. package/src/domains/context/working-set/policies/age-horizon.ts +55 -0
  169. package/src/domains/context/working-set/policies/index.ts +21 -0
  170. package/src/domains/context/working-set/policies/structural.ts +160 -0
  171. package/src/domains/context/working-set/project.ts +132 -0
  172. package/src/domains/context/working-set/protect.ts +109 -0
  173. package/src/domains/context/working-set/recall.ts +177 -0
  174. package/src/domains/context/working-set/replay/controls.ts +112 -0
  175. package/src/domains/context/working-set/replay/load-clio.ts +199 -0
  176. package/src/domains/context/working-set/replay/metrics.ts +185 -0
  177. package/src/domains/context/working-set/replay/reference-graph.ts +79 -0
  178. package/src/domains/context/working-set/replay/report.ts +139 -0
  179. package/src/domains/context/working-set/replay/runner.ts +325 -0
  180. package/src/domains/context/working-set/replay/synthetic.ts +422 -0
  181. package/src/domains/context/working-set/replay/trace.ts +21 -0
  182. package/src/domains/context/working-set/visible.ts +54 -0
  183. package/src/domains/evidence/build.ts +112 -45
  184. package/src/domains/evidence/eval.ts +24 -7
  185. package/src/domains/evidence/index.ts +53 -0
  186. package/src/domains/evidence/ordering.ts +12 -0
  187. package/src/domains/evidence/run-trust.ts +221 -0
  188. package/src/domains/evidence/store.ts +46 -6
  189. package/src/domains/evidence/trust-status.ts +854 -0
  190. package/src/domains/evidence/types.ts +26 -0
  191. package/src/domains/middleware/memory-intervention.ts +3 -0
  192. package/src/domains/middleware/stalled-turn.ts +165 -4
  193. package/src/domains/safety/autonomy.ts +1 -1
  194. package/src/domains/safety/default-path-policy.ts +8 -0
  195. package/src/domains/safety/finish-contract.ts +4 -3
  196. package/src/domains/safety/policy-engine.ts +48 -6
  197. package/src/domains/session/compaction/compact.ts +23 -1
  198. package/src/domains/session/compaction/cut-point.ts +2 -0
  199. package/src/domains/session/compaction/tokens.ts +16 -1
  200. package/src/domains/session/context-ledger.ts +2 -0
  201. package/src/domains/session/entries.ts +107 -1
  202. package/src/domains/session/manager.ts +9 -2
  203. package/src/domains/session/migrations/index.ts +22 -3
  204. package/src/engine/acp/server.ts +3 -0
  205. package/src/engine/agent.ts +18 -1
  206. package/src/engine/session.ts +9 -3
  207. package/src/entry/orchestrator.ts +16 -4
  208. package/src/interactive/chat-loop-messages.ts +18 -6
  209. package/src/interactive/chat-panel.ts +17 -1
  210. package/src/interactive/chat-renderer.ts +30 -21
  211. package/src/interactive/context-meter.ts +10 -0
  212. package/src/interactive/context-overlay.ts +81 -6
  213. package/src/interactive/context-recall-command.ts +110 -0
  214. package/src/interactive/interactive-slash-runtime.ts +37 -1
  215. package/src/interactive/model-session-replay.ts +21 -0
  216. package/src/interactive/overlay-general-openers.ts +6 -0
  217. package/src/interactive/overlay-session-lifecycle.ts +8 -4
  218. package/src/interactive/renderers/tool-execution.ts +18 -2
  219. package/src/interactive/session-transcript.ts +2 -2
  220. package/src/interactive/slash-commands.ts +29 -2
  221. package/src/interactive/turn-context.ts +238 -88
  222. package/src/interactive/turn-middleware.ts +6 -6
  223. package/src/tools/agent-tools.ts +11 -4
  224. package/src/tools/bash.ts +144 -82
  225. package/src/tools/builtin-tool-catalog.ts +11 -5
  226. package/src/tools/context/index.ts +105 -3
  227. package/src/tools/context/surface.ts +3 -2
  228. package/src/tools/core-bootstrap.ts +21 -0
  229. package/src/tools/dispatch-runner.ts +9 -7
  230. package/src/tools/monitor.ts +28 -20
  231. package/src/tools/registry.ts +59 -7
  232. package/src/tools/result-disposition.ts +550 -0
  233. package/src/tools/result-shaping.ts +262 -19
  234. package/src/tools/safe-exec.ts +2 -0
  235. package/src/tools/verify/authoring.ts +1119 -0
  236. package/src/tools/verify/catalog.ts +346 -0
  237. package/src/tools/verify/index.ts +13 -3
  238. package/src/tools/verify/scripts.ts +135 -37
  239. package/src/tools/verify/surface.ts +9 -5
  240. package/src/tools/worker-evidence.ts +35 -12
  241. package/dist/chunk-J7CWMCQD.js +0 -255
  242. package/dist/chunk-T6YILFSB.js +0 -80
  243. package/dist/chunk-VAKQQHWR.js +0 -434
  244. package/dist/chunk-VPAYEGVX.js +0 -184
@@ -4,13 +4,18 @@ import { renderAgentLedgerBoard } from "../domains/dispatch/agent-ledger-store.j
4
4
  import type { DurableAssignmentRecord } from "../domains/dispatch/assignment-store.js";
5
5
  import type { DispatchContract } from "../domains/dispatch/contract.js";
6
6
  import { UNVERIFIABLE_RECEIPT_VERIFICATION } from "../domains/dispatch/receipt-findings.js";
7
- import { type ReceiptIntegrityResult, verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
7
+ import type { ReceiptIntegrityResult } from "../domains/dispatch/receipt-integrity.js";
8
8
  import {
9
9
  isTerminalRunEnvelope,
10
10
  type RunEnvelope,
11
11
  type RunReceipt,
12
12
  type RunReceiptVerification,
13
13
  } from "../domains/dispatch/types.js";
14
+ import {
15
+ adaptRunReceiptTrustStatus,
16
+ type CanonicalTrustStatus,
17
+ inspectRunReceiptTrustStatus,
18
+ } from "../domains/evidence/trust-status.js";
14
19
  import { COST_NOT_MEASURED, costAggregateForAmount, formatCostAggregate } from "../domains/observability/index.js";
15
20
  import type { DispatchRunEventRegistry } from "./dispatch.js";
16
21
  import { monitorToolSurface } from "./monitor-surface.js";
@@ -333,14 +338,18 @@ function runReceipt(deps: MonitorToolDeps, runId: string): ToolResult {
333
338
  const body = truncateUtf8(raw, RECEIPT_MAX_BYTES, `\n[receipt truncated; read ${run.receiptPath} for the rest]`);
334
339
  let receipt: RunReceipt | null = null;
335
340
  let receiptIntegrity: ReceiptIntegrityResult;
341
+ let trustStatus: CanonicalTrustStatus;
336
342
  try {
337
343
  receipt = JSON.parse(raw) as RunReceipt;
338
- receiptIntegrity = verifyReceiptIntegrity(receipt, run);
344
+ const inspection = inspectRunReceiptTrustStatus(receipt, run);
345
+ receiptIntegrity = inspection.integrity;
346
+ trustStatus = inspection.status;
339
347
  } catch (err) {
340
348
  receiptIntegrity = {
341
349
  ok: false,
342
350
  reason: `receipt invalid: ${err instanceof Error ? err.message : String(err)}`,
343
351
  };
352
+ trustStatus = adaptRunReceiptTrustStatus(null, { integrity: receiptIntegrity });
344
353
  }
345
354
  return {
346
355
  kind: "ok",
@@ -350,6 +359,7 @@ function runReceipt(deps: MonitorToolDeps, runId: string): ToolResult {
350
359
  runId,
351
360
  receiptPath: run.receiptPath,
352
361
  receiptIntegrity,
362
+ trustStatus,
353
363
  ...(receipt !== null && receiptIntegrity.ok
354
364
  ? {
355
365
  evidenceVerification: receipt.verification,
@@ -366,6 +376,7 @@ interface DurableRunEvidence {
366
376
  output: RunReceipt["output"] | null;
367
377
  verification: RunReceiptVerification;
368
378
  integrity: ReceiptIntegrityResult;
379
+ trustStatus: CanonicalTrustStatus;
369
380
  integrityNote: string | null;
370
381
  integrityFailure: boolean;
371
382
  }
@@ -376,6 +387,7 @@ function unavailableRunEvidence(reason: string, note: string, integrityFailure =
376
387
  output: null,
377
388
  verification: UNVERIFIABLE_RECEIPT_VERIFICATION,
378
389
  integrity: { ok: false, reason },
390
+ trustStatus: adaptRunReceiptTrustStatus(null, { integrity: { ok: false, reason } }),
379
391
  integrityNote: note,
380
392
  integrityFailure,
381
393
  };
@@ -410,29 +422,24 @@ function durableRunEvidence(run: RunEnvelope | null): DurableRunEvidence {
410
422
  `receipt integrity unavailable: cannot read or parse ${run.receiptPath} (${detail}); worker text is unavailable and validation is unknown.`,
411
423
  );
412
424
  }
413
- let integrity: ReceiptIntegrityResult;
414
- try {
415
- integrity = verifyReceiptIntegrity(receipt, run);
416
- } catch (err) {
417
- const detail = err instanceof Error ? err.message : String(err);
418
- return unavailableRunEvidence(
419
- `receipt invalid: ${detail}`,
420
- `receipt integrity failed: invalid receipt (${detail}); worker text is withheld as untrusted and validation is unknown.`,
421
- true,
422
- );
423
- }
425
+ const inspection = inspectRunReceiptTrustStatus(receipt, run);
426
+ const integrity = inspection.integrity;
424
427
  if (!integrity.ok) {
425
- return unavailableRunEvidence(
426
- integrity.reason,
427
- `receipt integrity failed: ${integrity.reason}; worker text is withheld as untrusted and validation is unknown.`,
428
- true,
429
- );
428
+ return {
429
+ ...unavailableRunEvidence(
430
+ integrity.reason,
431
+ `receipt integrity failed: ${integrity.reason}; worker text is withheld as untrusted and validation is unknown.`,
432
+ true,
433
+ ),
434
+ trustStatus: inspection.status,
435
+ };
430
436
  }
431
437
  return {
432
438
  receipt,
433
439
  output: receipt.output ?? null,
434
440
  verification: receipt.verification,
435
441
  integrity,
442
+ trustStatus: inspection.status,
436
443
  integrityNote: null,
437
444
  integrityFailure: false,
438
445
  };
@@ -534,7 +541,7 @@ function collectRunLine(row: CollectedRunRow): string[] {
534
541
  );
535
542
  }
536
543
  if (row.evidence.integrityNote) lines.push(` ${row.evidence.integrityNote}`);
537
- lines.push(` ${workerTextLabel(row.evidence.verification)}`);
544
+ lines.push(` ${workerTextLabel(row.evidence.trustStatus)}`);
538
545
  const output = row.evidence.output;
539
546
  if (output) {
540
547
  const capped = truncateUtf8(output.text, COLLECT_TEXT_BYTES, "...");
@@ -543,7 +550,7 @@ function collectRunLine(row: CollectedRunRow): string[] {
543
550
  lines.push(` agent output${qualifier}${truncatedNote}:`, ...capped.split("\n").map((line) => ` ${line}`));
544
551
  if (row.evidence.receipt) {
545
552
  lines.push(
546
- ...workerTextNonEvidenceNotices(row.evidence.receipt, row.evidence.verification, output.text).map(
553
+ ...workerTextNonEvidenceNotices(row.evidence.receipt, row.evidence.trustStatus, output.text).map(
547
554
  (notice) => ` ${notice}`,
548
555
  ),
549
556
  );
@@ -693,6 +700,7 @@ async function runCollect(
693
700
  exitCode: row.run?.exitCode ?? null,
694
701
  receiptPath: row.run?.receiptPath ?? null,
695
702
  receiptIntegrity: row.evidence.integrity,
703
+ trustStatus: row.evidence.trustStatus,
696
704
  evidenceVerification: row.evidence.verification,
697
705
  briefing: row.evidence.receipt?.briefing ?? null,
698
706
  projectContext: row.evidence.receipt?.projectContext ?? null,
@@ -27,7 +27,8 @@ import { detectValidationCommand } from "../domains/safety/protected-artifacts.j
27
27
  import { askUserExposure } from "./ask-user.js";
28
28
  import { type DispatchPlanView, describeDispatchPlan } from "./dispatch-plan.js";
29
29
  import type { ToolPresentationPolicy } from "./presentation.js";
30
- import { shapeToolResult } from "./result-shaping.js";
30
+ import type { ToolResultDisposition } from "./result-disposition.js";
31
+ import { DEFAULT_TOOL_RESULT_MAX_BYTES, shapeToolResult } from "./result-shaping.js";
31
32
 
32
33
  /**
33
34
  * Tool registry. Admission point for every tool call. Delegates classification
@@ -56,6 +57,8 @@ export interface ToolSourceInfo {
56
57
  export interface ToolResultSizePolicy {
57
58
  kind: "exact" | "bounded" | "summary" | "truncate";
58
59
  maxBytes?: number;
60
+ /** Scratch retention ceiling for this tool; defaults to the generic 10 MiB cap. */
61
+ offloadMaxBytes?: number;
59
62
  followUpHint?: string;
60
63
  }
61
64
 
@@ -68,6 +71,8 @@ export interface ToolMetadata {
68
71
  retrySafety: ToolRetrySafety;
69
72
  /** Expected result-size behavior at the registry boundary. */
70
73
  resultSizePolicy: ToolResultSizePolicy;
74
+ /** Independent operator-presentation and model-context policy for this result. */
75
+ resultDisposition?: ToolResultDisposition;
71
76
  /** Coarse cost/latency bucket for dashboard diagnostics. */
72
77
  costLatency: ToolCostLatencyClass;
73
78
  /**
@@ -114,6 +119,15 @@ export interface ToolSpec {
114
119
  * the same function at the top of `run`.
115
120
  */
116
121
  prepareArguments?(args: Record<string, unknown>): Record<string, unknown>;
122
+ /**
123
+ * Resolve an argument-sensitive canonical disposition after normalization
124
+ * and before execution. The registry applies the result exactly once after
125
+ * middleware has annotated the terminal result.
126
+ */
127
+ resolveResultDisposition?(
128
+ args: Record<string, unknown>,
129
+ declared: ToolResultDisposition | undefined,
130
+ ): ToolResultDisposition | undefined;
117
131
  /**
118
132
  * Synchronous admission planner. Unlike `prepareArguments`, this runs before
119
133
  * safety/autonomy mapping so approval-sensitive tools can attach the exact
@@ -136,6 +150,8 @@ export type ToolResult =
136
150
  kind: "ok";
137
151
  output: string;
138
152
  details?: ToolResultDetails;
153
+ /** Internal registry projection consumed only by the agent-tool adapter. */
154
+ modelContext?: string;
139
155
  /**
140
156
  * Early-termination hint propagated to pi-agent-core's
141
157
  * `AgentToolResult.terminate`. When every finalized tool result in
@@ -145,7 +161,7 @@ export type ToolResult =
145
161
  */
146
162
  terminate?: boolean;
147
163
  }
148
- | { kind: "error"; message: string; details?: ToolResultDetails };
164
+ | { kind: "error"; message: string; details?: ToolResultDetails; modelContext?: string };
149
165
 
150
166
  export interface RegistryDeps {
151
167
  safety: SafetyContract;
@@ -384,6 +400,7 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
384
400
  decision: SafetyDecision,
385
401
  options?: ToolInvokeOptions,
386
402
  ): Promise<RegistryVerdict> => {
403
+ let resultDisposition = spec.metadata?.resultDisposition;
387
404
  try {
388
405
  // The hook layer is the only control stage past safety admission. Guards
389
406
  // (loop, protected artifacts, dispatch dedup) are before_tool
@@ -402,17 +419,18 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
402
419
  }
403
420
  try {
404
421
  const preparedArgs = prepareToolArgs(spec, call.args ?? {});
405
- const result = shapeToolResult(spec, await spec.run(preparedArgs, options), options);
422
+ resultDisposition = resolveToolResultDisposition(spec, preparedArgs);
423
+ const result = await spec.run(preparedArgs, options);
406
424
  const afterEffects = runToolHook("after_tool", spec, call, decision, options, result);
407
- const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options);
425
+ const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
408
426
  return { kind: "ok", result: finalResult, decision };
409
427
  } catch (err) {
410
428
  const message = err instanceof Error ? err.message : String(err);
411
- const result = shapeToolResult(spec, { kind: "error", message }, options);
429
+ const result: ToolResult = { kind: "error", message };
412
430
  const afterEffects = runToolHook("after_tool", spec, call, decision, options, result);
413
431
  return {
414
432
  kind: "ok",
415
- result: shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options),
433
+ result: shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition),
416
434
  decision,
417
435
  };
418
436
  }
@@ -857,6 +875,38 @@ function prepareToolArgs(spec: ToolSpec, args: Record<string, unknown>): Record<
857
875
  }
858
876
  }
859
877
 
878
+ /**
879
+ * Resolve the argument-sensitive disposition, failing closed. A throwing
880
+ * resolver cannot fall back to the declared disposition: the caller may have
881
+ * asked for a narrower context than the tool declares, and silently restoring
882
+ * the declared mode would widen model context while recording the declared mode
883
+ * as the requested one. The failure keeps the declared presentation and applies
884
+ * the narrowest context instead, so the applied and recorded modes stay honest.
885
+ */
886
+ function resolveToolResultDisposition(
887
+ spec: ToolSpec,
888
+ args: Record<string, unknown>,
889
+ ): ToolResultDisposition | undefined {
890
+ const declared = spec.metadata?.resultDisposition;
891
+ if (!spec.resolveResultDisposition) return declared;
892
+ try {
893
+ return spec.resolveResultDisposition(args, declared);
894
+ } catch (error) {
895
+ const maxBytes =
896
+ declared !== undefined && declared.context.maxBytes !== undefined
897
+ ? declared.context.maxBytes
898
+ : DEFAULT_TOOL_RESULT_MAX_BYTES;
899
+ return {
900
+ presentation: declared?.presentation ?? { foldDefault: "folded", showDiffWhenFolded: false, failureExcerpt: true },
901
+ context: { mode: "metadata-only", maxBytes },
902
+ // The narrowing is recorded with the result, so a resolver bug shows up
903
+ // on the transcript row and in the model's header instead of reading as
904
+ // a deliberate metadata-only request.
905
+ fallback: { reason: "resolver-error", message: error instanceof Error ? error.message : String(error) },
906
+ };
907
+ }
908
+ }
909
+
860
910
  function disposeAdmissionArgs(spec: ToolSpec | undefined, args: Record<string, unknown>): void {
861
911
  try {
862
912
  spec?.disposeAdmissionArguments?.(args);
@@ -1161,7 +1211,9 @@ function applyToolResultEffects(result: ToolResult, effects: ReadonlyArray<Middl
1161
1211
  if (result.terminate === true) annotated.terminate = true;
1162
1212
  return annotated;
1163
1213
  }
1164
- return { kind: "error", message: `${result.message}${suffix}` };
1214
+ const annotated: ToolResult = { kind: "error", message: `${result.message}${suffix}` };
1215
+ if (result.details !== undefined) annotated.details = result.details;
1216
+ return annotated;
1165
1217
  }
1166
1218
 
1167
1219
  function annotationMessages(effects: ReadonlyArray<MiddlewareEffect>): string[] {