@piagent/platform 1.6.0 → 1.7.1

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 (736) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +24 -15
  3. package/README.vi.md +36 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +27 -3
  10. package/benchmarks/production-v1/suite.json +5 -1
  11. package/benchmarks/production-v2/grade.mjs +892 -0
  12. package/benchmarks/production-v2/project/README.md +7 -0
  13. package/benchmarks/production-v2/project/config/service.json +4 -0
  14. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  15. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  16. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  17. package/benchmarks/production-v2/project/package.json +11 -0
  18. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  19. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  20. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  21. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  22. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  23. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  25. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  26. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  27. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  28. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  29. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  30. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  31. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  32. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  33. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  34. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  36. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  37. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  38. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  39. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  41. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  42. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  43. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  44. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  45. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  46. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  47. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  48. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  49. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  50. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  51. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  52. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  53. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  54. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  55. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  56. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  59. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  62. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  64. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  66. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  67. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  68. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  69. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  70. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  71. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  72. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  73. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  74. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  75. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  76. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  78. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  79. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  80. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  81. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  82. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  83. package/benchmarks/production-v2/suite.json +1009 -0
  84. package/benchmarks/production-v2/variant.mjs +169 -0
  85. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  86. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  87. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  88. package/benchmarks/production-v3/grade.mjs +1017 -0
  89. package/benchmarks/production-v3/project/README.md +7 -0
  90. package/benchmarks/production-v3/project/config/service.json +4 -0
  91. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  92. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  93. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  94. package/benchmarks/production-v3/project/package.json +11 -0
  95. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  96. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  97. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  98. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  99. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  100. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  101. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  102. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  103. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  104. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  105. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  106. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  107. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  108. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  109. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  110. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  111. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  113. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  114. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  115. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  116. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  117. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  118. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  119. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  120. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  121. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  122. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  123. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  124. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  125. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  126. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  127. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  128. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  129. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  130. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  131. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  132. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  133. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  136. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  139. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  141. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  143. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  144. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  145. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  146. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  147. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  148. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  149. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  150. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  151. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  152. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  153. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  155. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  156. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  157. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  158. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  159. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  160. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  161. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  162. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  163. package/benchmarks/production-v3/suite.json +1010 -0
  164. package/benchmarks/production-v3/variant.mjs +178 -0
  165. package/catalog/capabilities.json +16 -16
  166. package/docs/authority-manifest.md +1 -1
  167. package/docs/auto-delegation-policy.md +38 -73
  168. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  169. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  170. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  171. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  172. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  173. package/docs/command-reference-vietnamese.md +30 -35
  174. package/docs/context-engine.md +5 -3
  175. package/docs/context-window-policy.md +37 -1
  176. package/docs/distribution-standard.md +9 -9
  177. package/docs/en/architecture.md +26 -13
  178. package/docs/languages.json +4 -4
  179. package/docs/operator-manual-vietnamese.md +26 -46
  180. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  181. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  182. package/docs/piagent-core-improvement-plan.md +528 -0
  183. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  184. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  185. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  186. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  187. package/docs/piagent-open-session-wait.md +19 -0
  188. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  189. package/docs/publishing-for-teams.md +7 -0
  190. package/docs/quality-benchmark.md +299 -23
  191. package/docs/quickstart-vietnamese.md +2 -2
  192. package/docs/release-install-policy.md +32 -9
  193. package/docs/research/harness-next-evidence-review.md +113 -0
  194. package/docs/runtime-harness-standard.md +3 -3
  195. package/docs/security-threat-model.md +1 -1
  196. package/docs/subagent-orchestration-capabilities.md +19 -51
  197. package/docs/subagents-and-multiagent.md +21 -47
  198. package/docs/task-implementation-contract.md +3 -3
  199. package/docs/task-lifecycle-vietnamese.md +1 -1
  200. package/docs/team-onboarding.md +7 -7
  201. package/docs/third-party-neutrality.md +7 -0
  202. package/docs/usage-observability.md +1 -1
  203. package/docs/vi/architecture.md +26 -13
  204. package/docs-site/architecture.html +1 -1
  205. package/docs-site/benchmark.html +89 -95
  206. package/docs-site/commands.html +1 -1
  207. package/docs-site/content/benchmark.html +88 -94
  208. package/docs-site/content/en/benchmark.html +134 -90
  209. package/docs-site/content/en/index.html +19 -19
  210. package/docs-site/content/en/runtime.html +5 -5
  211. package/docs-site/content/en/whats-new.html +23 -1
  212. package/docs-site/content/en/workflows.html +2 -2
  213. package/docs-site/content/index.html +19 -19
  214. package/docs-site/content/runtime.html +6 -6
  215. package/docs-site/content/whats-new.html +23 -1
  216. package/docs-site/content/workflows.html +2 -2
  217. package/docs-site/context-engine.html +1 -1
  218. package/docs-site/en/architecture.html +1 -1
  219. package/docs-site/en/benchmark.html +135 -91
  220. package/docs-site/en/commands.html +1 -1
  221. package/docs-site/en/context-engine.html +1 -1
  222. package/docs-site/en/index.html +20 -20
  223. package/docs-site/en/mcp-approval.html +1 -1
  224. package/docs-site/en/mcp-auth.html +1 -1
  225. package/docs-site/en/mcp-servers.html +1 -1
  226. package/docs-site/en/mcp.html +1 -1
  227. package/docs-site/en/permissions.html +1 -1
  228. package/docs-site/en/profiles.html +1 -1
  229. package/docs-site/en/quickstart.html +1 -1
  230. package/docs-site/en/runtime.html +6 -6
  231. package/docs-site/en/scope.html +1 -1
  232. package/docs-site/en/security.html +1 -1
  233. package/docs-site/en/team.html +1 -1
  234. package/docs-site/en/whats-new.html +24 -2
  235. package/docs-site/en/workflows.html +3 -3
  236. package/docs-site/index.html +20 -20
  237. package/docs-site/mcp-approval.html +1 -1
  238. package/docs-site/mcp-auth.html +1 -1
  239. package/docs-site/mcp-servers.html +1 -1
  240. package/docs-site/mcp.html +1 -1
  241. package/docs-site/permissions.html +1 -1
  242. package/docs-site/profiles.html +1 -1
  243. package/docs-site/quickstart.html +1 -1
  244. package/docs-site/runtime.html +7 -7
  245. package/docs-site/scope.html +1 -1
  246. package/docs-site/security.html +1 -1
  247. package/docs-site/team.html +1 -1
  248. package/docs-site/whats-new.html +24 -2
  249. package/docs-site/workflows.html +3 -3
  250. package/evals/architecture-conformance-v1/lane.json +18 -0
  251. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  252. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  253. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  254. package/evals/fixtures/benchmark-assurance-evidence.invalid.json +1 -1
  255. package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
  256. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  257. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  258. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  259. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  260. package/evals/fixtures/codex-relative-efficiency-v1.invalid.json +4 -0
  261. package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -0
  262. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  263. package/evals/fixtures/composite-criterion.valid.json +33 -0
  264. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  265. package/evals/fixtures/contract-family-library.valid.json +41 -0
  266. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  267. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  268. package/evals/fixtures/helper-request.invalid.json +1 -1
  269. package/evals/fixtures/helper-request.valid.json +1 -1
  270. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  271. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  272. package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -0
  273. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  274. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  275. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  276. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  277. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  278. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  279. package/evals/fixtures/task-authority-snapshot.valid.json +4 -4
  280. package/evals/fs4-readiness-matrix.v1.json +2 -2
  281. package/evals/fs5-artifact-archive/README.md +32 -0
  282. package/evals/fs5-artifact-archive/manifest.json +148 -0
  283. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  284. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  285. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  286. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  287. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  288. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  289. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  290. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  291. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  292. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  293. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  294. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  295. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  296. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  297. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  298. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  299. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  300. package/evals/fs5-causal-arm.v1.json +10 -6
  301. package/evals/fs5-pilot-protocol.v1.json +3 -3
  302. package/evals/fs5-pilot-protocol.v2.json +8 -8
  303. package/evals/fs5-pilot-protocol.v3.json +8 -8
  304. package/evals/fs5-pilot-protocol.v4.json +7 -7
  305. package/evals/fs5-pilot-protocol.v5.json +10 -8
  306. package/evals/harness-next/development-corpus.mjs +106 -0
  307. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  308. package/evals/harness-next/run-calibration.mjs +83 -0
  309. package/evals/harness-next/run-resource-probe.mjs +55 -0
  310. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  311. package/evals/harness-next.v1.json +51 -0
  312. package/evals/long-horizon-v1/README.md +19 -0
  313. package/evals/long-horizon-v1/runner.mjs +116 -48
  314. package/evals/long-horizon-v1/worker.mjs +77 -30
  315. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  316. package/evals/private-holdout-v1/README.md +5 -2
  317. package/evals/private-holdout-v1/public-exposure.v1.json +1 -1
  318. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  319. package/evals/runtime-conformance-v1/README.md +43 -0
  320. package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
  321. package/evals/runtime-conformance-v1/lane.json +57 -0
  322. package/evals/runtime-conformance-v1/paid-canary.json +31 -0
  323. package/evals/runtime-conformance-v1/runner.mjs +456 -0
  324. package/package.json +9 -4
  325. package/packages/piagent-core/README.md +15 -6
  326. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  327. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  328. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  329. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  330. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  331. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  332. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  333. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  334. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  335. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  336. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  337. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +699 -0
  338. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  339. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  340. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  341. package/packages/piagent-core/benchmark/benchmark-core.js +111 -110
  342. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  343. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  344. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  345. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  346. package/packages/piagent-core/benchmark/benchmark-forensics.js +67 -52
  347. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  348. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  349. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  350. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  351. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  352. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  353. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  354. package/packages/piagent-core/benchmark/benchmark-preflight.js +70 -7
  355. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  356. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  357. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  358. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +462 -0
  359. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  360. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  361. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  362. package/packages/piagent-core/benchmark/benchmark-record-validation.js +343 -8
  363. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  364. package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
  365. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  366. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  367. package/packages/piagent-core/benchmark/benchmark-runtime-causal.js +244 -0
  368. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  369. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  370. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  371. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  372. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +246 -33
  373. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  374. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  375. package/packages/piagent-core/benchmark/benchmark-suite.js +232 -4
  376. package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
  377. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  378. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  379. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  380. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  381. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  382. package/packages/piagent-core/benchmark/benchmark-usage.js +410 -37
  383. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  384. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  385. package/packages/piagent-core/capabilities/runtime-integrity.js +6 -0
  386. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  387. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  388. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  389. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  390. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +1000 -0
  391. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  392. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  393. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  394. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  395. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  396. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  397. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  398. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  399. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  400. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  401. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  402. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  403. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  404. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  405. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  406. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  407. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  408. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  409. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  410. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  411. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  412. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  413. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  414. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  415. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  416. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  417. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  418. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  419. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  420. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  421. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  422. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  423. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  424. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  425. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  426. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  427. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  428. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  429. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  430. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  431. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  432. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  433. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  434. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  435. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  436. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  437. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  438. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  439. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  440. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  441. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  442. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  443. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  444. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  445. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  446. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  447. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  448. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  449. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  450. package/packages/piagent-core/extensions/acceptance-receipt.js +208 -180
  451. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  452. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  453. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  454. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  455. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  456. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  457. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  458. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  459. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  460. package/packages/piagent-core/extensions/context-engine.js +12 -17
  461. package/packages/piagent-core/extensions/context-index-policy.js +4 -0
  462. package/packages/piagent-core/extensions/context-query-paths.js +57 -0
  463. package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
  464. package/packages/piagent-core/extensions/criterion-graph.js +4 -1
  465. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  466. package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
  467. package/packages/piagent-core/extensions/guard-types.ts +9 -1
  468. package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
  469. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  470. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  471. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  472. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  473. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  474. package/packages/piagent-core/extensions/task-journal.js +48 -3
  475. package/packages/piagent-core/extensions/task-lifecycle.js +32 -0
  476. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  477. package/packages/piagent-core/extensions/task-state.js +140 -43
  478. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  479. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  480. package/packages/piagent-core/extensions/verification-intelligence.js +109 -20
  481. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  482. package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
  483. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  484. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  485. package/packages/piagent-core/package.json +3 -3
  486. package/packages/piagent-core/policies/base-policy.json +43 -2
  487. package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
  488. package/packages/piagent-core/prompts/be-to-fe.md +2 -8
  489. package/packages/piagent-core/prompts/plan.md +1 -1
  490. package/packages/piagent-core/prompts/platform-improve.md +2 -6
  491. package/packages/piagent-core/prompts/review.md +2 -7
  492. package/packages/piagent-core/prompts/scout.md +1 -1
  493. package/packages/piagent-core/prompts/task.md +4 -3
  494. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  495. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  496. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  497. package/packages/piagent-core/runtime/hooks/completion-hook.ts +83 -89
  498. package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -7
  499. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  500. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  501. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +150 -19
  502. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
  503. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  504. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  505. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  506. package/packages/piagent-core/runtime/hooks/tool-result-value-helpers.ts +66 -0
  507. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  508. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  509. package/packages/piagent-core/runtime/inspection/bounded-emission-guard.ts +286 -0
  510. package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
  511. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  512. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  513. package/packages/piagent-core/runtime/inspection/task-subagent-tree.ts +27 -4
  514. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
  515. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
  516. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  517. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  518. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  519. package/packages/piagent-core/runtime/orchestration/helper-lifecycle.ts +16 -12
  520. package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
  521. package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
  522. package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
  523. package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
  524. package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
  525. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  526. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  527. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  528. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +15 -7
  529. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  530. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  531. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  532. package/packages/piagent-core/runtime/quality/edit-freshness-guard.ts +102 -0
  533. package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
  534. package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
  535. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  536. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  537. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +12 -3
  538. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  539. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
  540. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  541. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  542. package/packages/piagent-core/runtime/recovery/pristine-task-policy-refresh.ts +91 -0
  543. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
  544. package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
  545. package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
  546. package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
  547. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  548. package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
  549. package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
  550. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  551. package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
  552. package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
  553. package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
  554. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  555. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
  556. package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
  557. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  558. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
  559. package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
  560. package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
  561. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  562. package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
  563. package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
  564. package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
  565. package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
  566. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  567. package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
  568. package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
  569. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  570. package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
  571. package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
  572. package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
  573. package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
  574. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  575. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  576. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  577. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  578. package/packages/piagent-core/runtime/tools/phase-tools.ts +10 -9
  579. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  580. package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
  581. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  582. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  583. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  584. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  585. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  586. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  587. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  588. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  589. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  590. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  591. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +101 -0
  592. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  593. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  594. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  595. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  596. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  597. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  598. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  599. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +201 -0
  600. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  601. package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
  602. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  603. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  604. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  605. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  606. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  607. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  608. package/packages/piagent-core/subagents/piagent-oracle.md +5 -3
  609. package/packages/piagent-core/subagents/piagent-planner.md +6 -4
  610. package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
  611. package/packages/piagent-core/subagents/piagent-scout.md +4 -2
  612. package/packages/piagent-core/subagents/piagent-worker.md +6 -4
  613. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.js → MarkdownMessage-DGk34zJT.js} +1 -1
  614. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  615. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  616. package/packages/piagent-webui/dist/client/index.html +2 -2
  617. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  618. package/packages/piagent-webui/extension/piagent-webui.ts +13 -3
  619. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  620. package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
  621. package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
  622. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  623. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  624. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  625. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  626. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  627. package/packages/piagent-webui/gateway/gateway-session-stream.ts +170 -32
  628. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  629. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  630. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  631. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  632. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  633. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  634. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  635. package/packages/piagent-webui/gateway/session-operation-lifecycle.ts +237 -0
  636. package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
  637. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  638. package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
  639. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  640. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  641. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  642. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  643. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  644. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +118 -117
  645. package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
  646. package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
  647. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  648. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  649. package/packages/piagent-webui/server/transcript-projection.ts +150 -11
  650. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  651. package/schemas/approved-host-contracts.schema.json +973 -0
  652. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  653. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  654. package/schemas/codex-relative-efficiency-v1.schema.json +155 -0
  655. package/schemas/composite-criterion.schema.json +788 -0
  656. package/schemas/contract-family-library.schema.json +28 -0
  657. package/schemas/contract-selection-recipe.schema.json +31 -0
  658. package/schemas/failure-evidence.schema.json +2 -2
  659. package/schemas/helper-request.schema.json +16 -4
  660. package/schemas/host-contract-plan.schema.json +25 -0
  661. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  662. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  663. package/schemas/piagent-webui/runtime-event-v2.schema.json +46 -5
  664. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  665. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  666. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  667. package/schemas/piagent-webui/subagent-tree-v1.schema.json +11 -1
  668. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  669. package/schemas/project-profile.schema.json +1 -1
  670. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  671. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  672. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  673. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  674. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  675. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  676. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  677. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  678. package/schemas/task-contract.schema.json +45 -0
  679. package/scripts/approve-independent-verification.mjs +57 -0
  680. package/scripts/benchmark-arm-observer.mjs +320 -0
  681. package/scripts/benchmark-budget-ipc.mjs +34 -0
  682. package/scripts/benchmark-budget-launcher.mjs +91 -0
  683. package/scripts/benchmark-budget-processes.mjs +133 -0
  684. package/scripts/benchmark-budget-publication.mjs +228 -0
  685. package/scripts/benchmark-budget-runtime.mjs +136 -0
  686. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  687. package/scripts/benchmark-codex-journey.mjs +406 -0
  688. package/scripts/benchmark-independent-verification.mjs +628 -0
  689. package/scripts/benchmark-journey-outcome.mjs +92 -0
  690. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  691. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  692. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  693. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  694. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  695. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  696. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  697. package/scripts/benchmark-runner-completion.mjs +133 -0
  698. package/scripts/benchmark-runner-configuration.mjs +159 -0
  699. package/scripts/benchmark-runner-core.mjs +224 -387
  700. package/scripts/benchmark-runner-finalization.mjs +144 -27
  701. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  702. package/scripts/benchmark-runner-schedule.mjs +256 -0
  703. package/scripts/benchmark-runner-support.mjs +136 -4
  704. package/scripts/benchmark-runner.mjs +95 -18
  705. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  706. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  707. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  708. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  709. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  710. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  711. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  712. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  713. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  714. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  715. package/scripts/benchmark-session-evaluator.mjs +169 -0
  716. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  717. package/scripts/benchmark-session-usage.mjs +28 -0
  718. package/scripts/benchmark-session.mjs +343 -50
  719. package/scripts/benchmark-webui-journey.mjs +678 -0
  720. package/scripts/check-public-wording.mjs +46 -0
  721. package/scripts/configure-subagents.sh +42 -34
  722. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  723. package/scripts/helper-evaluation.mjs +1 -1
  724. package/scripts/phase-tools-evaluation.mjs +1 -0
  725. package/scripts/pi-auto.sh +7 -1
  726. package/scripts/pi-usage-history.mjs +201 -11
  727. package/scripts/piagent-cli.mjs +8 -0
  728. package/scripts/private-holdout-readiness.mjs +7 -1
  729. package/scripts/public-evaluation-exposure.mjs +140 -0
  730. package/scripts/select-independent-verification.mjs +62 -0
  731. package/scripts/team-doctor.sh +1 -1
  732. package/scripts/typescript-loader.mjs +135 -1
  733. package/scripts/update-global.mjs +6 -7
  734. package/scripts/verify-local.sh +41 -55
  735. package/scripts/verify-release-identity.mjs +5 -3
  736. package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
@@ -21,6 +21,8 @@ import { buildContextPreflight, buildUsageSnapshot } from "../session/usage.ts";
21
21
  import { toolResultCaptureRoot } from "../session/tool-result-compaction.ts";
22
22
  import { ensureTaskAuthorityResumePolicy } from "../policy/authority-resume-policy.ts";
23
23
  import { buildHandoffProjection, writeHandoffProjection } from "../recovery/handoff-projection.ts";
24
+ import { refreshPristineRuntimeTaskVerification } from "../recovery/pristine-task-policy-refresh.ts";
25
+ import { refreshLegacyHiddenWorkspaceEvidenceCoverage } from "../recovery/task-evidence-coverage-refresh.ts";
24
26
  import { activeTaskToolGroups } from "../tools/tool-groups.ts";
25
27
  import type { PiagentToolGroup } from "../tools/tool-groups.ts";
26
28
  import { observeTrajectorySync } from "../trajectory/trajectory-observability.ts";
@@ -29,6 +31,20 @@ import type { ResumeState } from "../recovery/resume-state.ts";
29
31
 
30
32
  type SessionTaskReference = { taskId?: string; taskRunId?: string };
31
33
 
34
+ type SessionStartIdentity = { cwd: string; sessionId: string };
35
+
36
+ function sessionContextMatches(ctx: ExtensionContext, identity: SessionStartIdentity): boolean {
37
+ try {
38
+ return ctx.cwd === identity.cwd && ctx.sessionManager.getSessionId() === identity.sessionId;
39
+ } catch {
40
+ // Pi invalidates every session-bound ctx getter after a replacement or
41
+ // reload. A stale startup hook belongs to the outgoing runtime; the new
42
+ // runtime receives its own session_start event and must be the only one to
43
+ // publish startup telemetry or bind post-start surfaces.
44
+ return false;
45
+ }
46
+ }
47
+
32
48
  type SessionStartHookDependencies = {
33
49
  state: RuntimeSessionState;
34
50
  loadProfile: (ctx: ExtensionContext) => ProjectProfile;
@@ -40,6 +56,7 @@ type SessionStartHookDependencies = {
40
56
  resolveTaskAny: (cwd: string, reference: string) => TaskContract | undefined;
41
57
  bindTask: (cwd: string, sessionId: string, sessionName: string | undefined, task: TaskContract) => unknown;
42
58
  writeTask: (cwd: string, task: TaskContract) => TaskContract;
59
+ appendTrace: (cwd: string, payload: Record<string, unknown>) => void;
43
60
  capabilityState: (ctx: ExtensionContext) => { ok: boolean; reason?: string; repinned?: string };
44
61
  permissionProfile: (ctx: ExtensionContext, profile: ProjectProfile) => { mode: string; warning?: string };
45
62
  legacyProjectWarning: (cwd: string) => string | undefined;
@@ -63,6 +80,7 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
63
80
  if (!hasOperatorSessionName(operatorSessionName)) pi.setSessionName(`pi:${name}`);
64
81
 
65
82
  const sessionId = ctx.sessionManager.getSessionId();
83
+ const sessionIdentity = { cwd: ctx.cwd, sessionId };
66
84
  const sessionName = currentSessionName(ctx);
67
85
  const taskReference = dependencies.taskReference(ctx);
68
86
  const activeTaskRunId = readSessionTaskBinding(ctx.cwd, sessionId)?.activeTaskRunId ?? taskReference?.taskRunId;
@@ -138,6 +156,103 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
138
156
  resumedTask = dependencies.writeTask(ctx.cwd, resumedTask);
139
157
  dependencies.bindTask(ctx.cwd, sessionId, sessionName, resumedTask);
140
158
  }
159
+ const capabilityState = dependencies.capabilityState(ctx);
160
+ if (resumedTask?.trace.outcome === "pending"
161
+ && authorityPolicy?.disposition === "resume-pinned"
162
+ && capabilityState.ok) {
163
+ // Re-read from the durable session binding immediately before the
164
+ // synchronous pristine-tree check and write. This prevents an earlier
165
+ // session-start projection from overwriting newer same-process task
166
+ // evidence or work-plan state.
167
+ const latestTask = dependencies.activeTask(ctx.cwd, sessionId);
168
+ if (latestTask?.taskRunId === resumedTask.taskRunId) {
169
+ resumedTask = latestTask;
170
+ let refreshTask = latestTask;
171
+ // Coverage reconciliation must precede resume inspection. Otherwise a
172
+ // path newly visible to the evidence collector looks like a task delta
173
+ // and can incorrectly block a valid dirty-task resume.
174
+ const coverage = refreshLegacyHiddenWorkspaceEvidenceCoverage(ctx.cwd, refreshTask);
175
+ if (coverage.refreshed) {
176
+ try {
177
+ resumedTask = dependencies.writeTask(ctx.cwd, coverage.task);
178
+ refreshTask = resumedTask;
179
+ try {
180
+ dependencies.appendTrace(ctx.cwd, {
181
+ event: "task_evidence_coverage_expanded",
182
+ taskId: resumedTask.taskId,
183
+ taskRunId: resumedTask.taskRunId,
184
+ sessionId,
185
+ sessionName,
186
+ reason: coverage.reason,
187
+ addedPathCount: coverage.addedPaths.length,
188
+ addedPathExamples: coverage.addedPaths.slice(0, 20),
189
+ retainedMutationPathCount: coverage.retainedMutationPaths.length,
190
+ retainedMutationPathExamples: coverage.retainedMutationPaths.slice(0, 20),
191
+ ambiguousPathCount: coverage.ambiguousPaths.length,
192
+ ambiguousPathExamples: coverage.ambiguousPaths.slice(0, 20),
193
+ previousBaselineDigest: coverage.previousBaselineDigest,
194
+ nextBaselineDigest: coverage.nextBaselineDigest
195
+ });
196
+ } catch (error) {
197
+ try {
198
+ ctx.ui.notify(`Piagent expanded legacy task evidence coverage, but its auxiliary trace could not be written: ${error instanceof Error ? error.message : String(error)}`, "warning");
199
+ } catch {
200
+ // UI availability is not part of the durable coverage commit.
201
+ }
202
+ }
203
+ } catch (error) {
204
+ try {
205
+ ctx.ui.notify(`Piagent kept the existing task baseline because its evidence-coverage refresh could not be persisted: ${error instanceof Error ? error.message : String(error)}`, "warning");
206
+ } catch {
207
+ // Continue startup with the last durably readable task.
208
+ }
209
+ refreshTask = dependencies.activeTask(ctx.cwd, sessionId) ?? latestTask;
210
+ resumedTask = refreshTask;
211
+ }
212
+ }
213
+ const refreshResume = dependencies.inspectResume(ctx.cwd, refreshTask, sessionId);
214
+ const refreshAllowed = refreshResume.enforcementSafe
215
+ && refreshResume.decision !== "blocked"
216
+ && refreshResume.decision !== "paused";
217
+ if (refreshAllowed) {
218
+ const refresh = refreshPristineRuntimeTaskVerification(ctx.cwd, refreshTask, profile);
219
+ if (refresh.refreshed) {
220
+ try {
221
+ resumedTask = dependencies.writeTask(ctx.cwd, refresh.task);
222
+ try {
223
+ dependencies.appendTrace(ctx.cwd, {
224
+ event: "task_pristine_verifier_refreshed",
225
+ taskId: resumedTask.taskId,
226
+ taskRunId: resumedTask.taskRunId,
227
+ sessionId,
228
+ sessionName,
229
+ reason: refresh.reason,
230
+ verifyGroup: refresh.verifyGroup,
231
+ previousCommands: refresh.previousCommands,
232
+ verifyCommands: refresh.nextCommands
233
+ });
234
+ } catch (error) {
235
+ // The contract write and its task journal entry are already
236
+ // durable. An auxiliary trace/notice failure must not abort
237
+ // session startup or roll the task back to stale commands.
238
+ try {
239
+ ctx.ui.notify(`Piagent refreshed the task verifier, but its auxiliary trace could not be written: ${error instanceof Error ? error.message : String(error)}`, "warning");
240
+ } catch {
241
+ // UI availability is not part of the durable refresh commit.
242
+ }
243
+ }
244
+ } catch (error) {
245
+ try {
246
+ ctx.ui.notify(`Piagent kept the existing task verifier because its pristine refresh could not be persisted: ${error instanceof Error ? error.message : String(error)}`, "warning");
247
+ } catch {
248
+ // Continue startup with the last durably readable task.
249
+ }
250
+ resumedTask = dependencies.activeTask(ctx.cwd, sessionId) ?? refreshTask;
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
141
256
  if (resumedTask?.workingTreeDigestMigration && resumedTask.workingTreeDigestMigration.status !== "refreshed") dependencies.state.clearDigestMigrationState(ctx, resumedTask.taskRunId, resumedTask.taskId);
142
257
  if (resumedTask?.trace.outcome === "pending") dependencies.state.cacheTaskIdentity(ctx, resumedTask);
143
258
  else dependencies.state.clearSession(ctx);
@@ -180,11 +295,10 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
180
295
  : " (run /onboard to select a profile)";
181
296
  const snapshot = buildUsageSnapshot(ctx, String(pi.getThinkingLevel()));
182
297
  const preflight = buildContextPreflight(snapshot, "task", 0);
183
- const capabilityState = dependencies.capabilityState(ctx);
184
298
  const permissionProfile = dependencies.permissionProfile(ctx, profile);
185
299
  const executionBackend = resolveExecutionBackend();
186
300
  const contextHint = preflight.recommendation === "fresh-session"
187
- ? " Context is high; use /fresh task or /fresh scout for new work."
301
+ ? " Context is high; use /fresh <workflow> for new work (/fresh help lists every workflow)."
188
302
  : preflight.recommendation === "compact"
189
303
  ? " Context is warm; run /task-preflight before large work."
190
304
  : "";
@@ -209,6 +323,11 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
209
323
  if (updateNotice) ctx.ui.notify(updateNotice, "info");
210
324
 
211
325
  let engineStatus: unknown;
326
+ // Capture ExtensionAPI state before the first await. Pi invalidates the
327
+ // captured `pi` object as soon as a concurrent session replacement/reload
328
+ // wins; consulting it after context-index I/O would then surface a noisy
329
+ // extension failure even though the replacement session is healthy.
330
+ const activeToolCount = pi.getActiveTools().length;
212
331
  try {
213
332
  engineStatus = await contextIndexV2Status(ctx.cwd, {
214
333
  excludePatterns: dependencies.contextExcludePatterns(profile)
@@ -216,22 +335,34 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
216
335
  } catch (error) {
217
336
  engineStatus = { exists: false, error: error instanceof Error ? error.message : String(error) };
218
337
  }
219
- dependencies.telemetry(ctx, {
220
- event: "session_start",
221
- // Benchmark and efficiency projections must be able to distinguish a
222
- // genuine zero-recovery session from telemetry produced before this
223
- // receipt/result protocol existed.
224
- editRecoveryContextTelemetryVersion: 1,
225
- activeTools: pi.getActiveTools().length,
226
- index: engineStatus,
227
- taskMigration: migration,
228
- taskId: resumedTask?.taskId,
229
- taskRunId: resumedTask?.taskRunId,
230
- captureRetention,
231
- taskJournalRetention,
232
- taskRecovery,
233
- executionBackend
234
- });
235
- await dependencies.afterStart?.(ctx);
338
+ if (!sessionContextMatches(ctx, sessionIdentity)) return;
339
+ try {
340
+ dependencies.telemetry(ctx, {
341
+ event: "session_start",
342
+ // Benchmark and efficiency projections must be able to distinguish a
343
+ // genuine zero-recovery session from telemetry produced before this
344
+ // receipt/result protocol existed.
345
+ editRecoveryContextTelemetryVersion: 1,
346
+ activeTools: activeToolCount,
347
+ index: engineStatus,
348
+ taskMigration: migration,
349
+ taskId: resumedTask?.taskId,
350
+ taskRunId: resumedTask?.taskRunId,
351
+ captureRetention,
352
+ taskJournalRetention,
353
+ taskRecovery,
354
+ executionBackend
355
+ });
356
+ } catch (error) {
357
+ if (!sessionContextMatches(ctx, sessionIdentity)) return;
358
+ throw error;
359
+ }
360
+ if (!sessionContextMatches(ctx, sessionIdentity)) return;
361
+ try {
362
+ await dependencies.afterStart?.(ctx);
363
+ } catch (error) {
364
+ if (!sessionContextMatches(ctx, sessionIdentity)) return;
365
+ throw error;
366
+ }
236
367
  });
237
368
  }
@@ -1,35 +1,37 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
-
3
2
  import { estimateContextTokens, toolResultFingerprint } from "../../extensions/context-engine.js";
4
3
  import { matchesProtectedPath } from "../../extensions/policy-core.js";
5
4
  import { changedSnapshotFiles, taskDeltaFilesFromSnapshot } from "../../extensions/task-contract-view.js";
6
5
  import { classifyVerificationFailure } from "../../extensions/verification-intelligence.js";
7
- import { redactForStorage, redactSensitiveText } from "../../extensions/redaction-core.js";
6
+ import { redactForStorage } from "../../extensions/redaction-core.js";
8
7
  import { appendObservedBashResult, hashEvidenceCommand, observedBashResultFromToolResultEvent } from "../../extensions/runtime-evidence.js";
9
- import { workingTreeSnapshot, workingTreeSnapshotHasUnavailableEvidence } from "../../extensions/task-state.js";
10
- import { workingTreeObservation } from "../../extensions/working-tree-digest.js";
8
+ import { workingTreeSnapshotHasUnavailableEvidence } from "../../extensions/task-state.js";
9
+ import { captureWorkspaceVerificationSnapshot } from "../../extensions/workspace-verification-snapshot.js";
11
10
  import { recordObservedContextEvidence } from "../context/context-evidence-qualification.ts";
12
11
  import { confirmContextDeliveryFromToolResult, type ContextDeliveryConfirmationDependencies } from "../context/context-delivery.ts";
13
12
  import { recordMutationResult } from "../inspection/mutation-provenance-recorder.ts";
14
- import { classifyToolFailure } from "../inspection/tool-failure-classification.ts";
13
+ import { classifyToolFailure, handledToolFailure } from "../inspection/tool-failure-classification.ts";
14
+ import { classifyDirectSubagentResult, type DirectSubagentResult } from "../orchestration/subagent-tool-policy.ts";
15
15
  import { boundedGitDiffReview } from "../quality/performance-assurance.ts";
16
16
  import { currentFileContentDigests } from "../quality/model-mutation-proof.ts";
17
17
  import { boundedPerformanceReviewResultText } from "../quality/performance-review-evidence.ts";
18
18
  import { buildEditRecoveryContext, type EditRecoveryContext } from "../recovery/edit-recovery-context.ts";
19
19
  import { EditRecoveryDeliveryState } from "../recovery/edit-recovery-delivery.ts";
20
+ import { RetrievalEvidenceRuntime } from "../session/retrieval-evidence-runtime.ts";
20
21
  import { attachToolResultCompactionDetails, compactToolResultDetails, compactToolResultTextContent, type ToolResultCaptureSummary } from "../session/tool-result-compaction.ts";
21
22
  import type { ObservedTaskContext } from "../session/runtime-state.ts";
22
23
  import { observeTrajectorySync } from "../trajectory/trajectory-observability.ts";
23
24
  import type { TrajectorySyncResult } from "../trajectory/trajectory-runtime.ts";
24
25
  import { filterGrepProtectedContent, filterProtectedPathListContent } from "./tool-result-content-guards.ts";
25
- import { patchLineStats } from "./tool-result-metadata.ts";
26
+ import { editVerificationMarker, patchLineStats } from "./tool-result-metadata.ts";
27
+ import { handledNavigationToolResult } from "./tool-result-navigation.ts";
28
+ import { attachRetrievalCheckpoint, observeRetrievalResult } from "./tool-result-retrieval.ts";
29
+ import { appendToolResultText, boundedToolResultText, countChangedStringLeaves, isPlainRecord, numericExitCode, redactToolResultTextContent, successfulToolResult } from "./tool-result-value-helpers.ts";
26
30
 
27
31
  export { filterGrepProtectedContent, filterProtectedPathListContent };
28
32
  type ToolResultEvent = { toolCallId?: string; toolName: string; input?: unknown; content?: unknown; details?: unknown; isError?: boolean; usage?: unknown };
29
33
  type ObservedBashResult = NonNullable<ReturnType<typeof observedBashResultFromToolResultEvent>>;
30
34
  type ObservedVerificationResult = ObservedBashResult & { outputText?: string };
31
- type WorkingTreeObservation = ReturnType<typeof workingTreeObservation>;
32
-
33
35
  type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
34
36
  readProtectedPaths: (ctx: ExtensionContext) => string[];
35
37
  recordObservedBash: (observed: ObservedBashResult) => void;
@@ -46,15 +48,15 @@ type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
46
48
  event: ToolResultEvent,
47
49
  pendingContext: ObservedTaskContext[],
48
50
  maxManifestFiles: number,
49
- shellSnapshotBefore?: Record<string, string>, eventTree?: WorkingTreeObservation
51
+ shellSnapshotBefore?: Record<string, string>, eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>
50
52
  ) => unknown;
51
53
  recordObservedTaskVerification: (
52
54
  pi: ExtensionAPI,
53
55
  ctx: ExtensionContext,
54
56
  observed: ObservedVerificationResult,
55
57
  pendingContext: ObservedTaskContext[],
56
- maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>, eventTree?: WorkingTreeObservation,
57
- readProtectedPaths?: string[]
58
+ maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>, eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>,
59
+ readProtectedPaths?: string[], preWorkspaceRevisionDigest?: string
58
60
  ) => unknown;
59
61
  extractLikelyPath: (cwd: string, input: Record<string, unknown>) => string | undefined;
60
62
  mutationTargets: (cwd: string, toolName: string, input: Record<string, unknown>) => string[];
@@ -62,6 +64,11 @@ type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
62
64
  telemetry: (ctx: ExtensionContext, payload: Record<string, unknown>) => void;
63
65
  activity?: (ctx: ExtensionContext, payload: Record<string, unknown>) => void;
64
66
  now: () => string;
67
+ observeEditFreshness?: (
68
+ ctx: ExtensionContext,
69
+ event: ToolResultEvent,
70
+ metadata: { taskRunId?: string; successful: boolean; targetPath?: string; mutationTargets: string[] }
71
+ ) => void;
65
72
  completeSemanticRepair?: (
66
73
  ctx: ExtensionContext,
67
74
  event: ToolResultEvent,
@@ -75,79 +82,24 @@ type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
75
82
  }
76
83
  ) => TrajectorySyncResult | undefined;
77
84
  syncTrajectory?: (ctx: ExtensionContext, contextObserved: boolean) => TrajectorySyncResult | undefined;
85
+ recordSubagentResult?: (
86
+ ctx: ExtensionContext,
87
+ event: ToolResultEvent,
88
+ result: DirectSubagentResult
89
+ ) => void;
78
90
  };
79
91
 
80
- function isPlainRecord(value: unknown): value is Record<string, unknown> {
81
- if (!value || typeof value !== "object" || Array.isArray(value)) return false;
82
- const prototype = Object.getPrototypeOf(value);
83
- return prototype === Object.prototype || prototype === null;
84
- }
85
-
86
- function numericExitCode(value: unknown): number | undefined {
87
- if (typeof value === "number" && Number.isInteger(value)) return value;
88
- if (typeof value === "string" && /^-?\d+$/.test(value.trim())) return Number.parseInt(value, 10);
89
- return undefined;
90
- }
91
-
92
- function successfulToolResult(event: ToolResultEvent): boolean {
93
- if (event.isError === true) return false;
94
- const details = isPlainRecord(event.details) ? event.details : {};
95
- const exitCode = numericExitCode(details.exitCode ?? details.status);
96
- return exitCode === undefined || exitCode === 0;
97
- }
98
-
99
- function boundedToolResultText(content: unknown): string {
100
- const text = typeof content === "string"
101
- ? content
102
- : Array.isArray(content)
103
- ? content
104
- .filter((block) => block && typeof block === "object" && (block as { type?: unknown }).type === "text")
105
- .map((block) => String((block as { text?: unknown }).text ?? ""))
106
- .join("\n")
107
- : "";
108
- return text.slice(-20_000);
109
- }
110
-
111
- function countChangedStringLeaves(before: unknown, after: unknown): number {
112
- if (typeof before === "string" && typeof after === "string") return before === after ? 0 : 1;
113
- if (Array.isArray(before) && Array.isArray(after)) {
114
- return before.reduce((total, item, index) => total + countChangedStringLeaves(item, after[index]), 0);
115
- }
116
- if (!before || !after || typeof before !== "object" || typeof after !== "object") return 0;
117
- return Object.entries(before as Record<string, unknown>).reduce(
118
- (total, [key, value]) => total + countChangedStringLeaves(value, (after as Record<string, unknown>)[key]),
119
- 0
120
- );
121
- }
122
-
123
- function redactToolResultTextContent(content: unknown): { content: unknown; redacted: number } {
124
- if (!Array.isArray(content)) return { content, redacted: 0 };
125
- let redacted = 0;
126
- const safeContent = content.map((block) => {
127
- if (!block || typeof block !== "object") return block;
128
- const typed = block as { type?: unknown; text?: unknown };
129
- if (typed.type !== "text" || typeof typed.text !== "string") return block;
130
- const safeText = redactSensitiveText(typed.text);
131
- if (!safeText.redacted) return block;
132
- redacted += 1;
133
- return { ...block, text: safeText.text };
134
- });
135
- return { content: safeContent, redacted };
136
- }
137
-
138
- function appendToolResultText(content: unknown, text: string): unknown[] {
139
- const block = { type: "text", text };
140
- if (Array.isArray(content)) return [...content, block];
141
- if (typeof content === "string" && content) return [{ type: "text", text: content }, block];
142
- return [block];
143
- }
144
-
145
92
  export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResultHookDependencies): void {
146
93
  const editRecoveryDelivery = new EditRecoveryDeliveryState();
94
+ const retrievalEvidence = new RetrievalEvidenceRuntime();
147
95
  pi.on("session_compact", async (_event, ctx) => editRecoveryDelivery.advanceEpoch(ctx));
148
- pi.on("session_shutdown", async (_event, ctx) => editRecoveryDelivery.clearSession(ctx));
96
+ pi.on("session_shutdown", async (_event, ctx) => {
97
+ editRecoveryDelivery.clearSession(ctx);
98
+ retrievalEvidence.clearSession(ctx);
99
+ });
149
100
  pi.on("tool_result", async (event, ctx) => {
150
101
  confirmContextDeliveryFromToolResult(pi, ctx, event, dependencies);
102
+ const currentTurnId = dependencies.state.currentTurn?.(ctx)?.turnId;
151
103
  const taskIdentity = dependencies.state.taskIdentity(ctx);
152
104
  const resultToolCallId = event.toolCallId ?? toolResultFingerprint(event.toolName, event.input, []).key;
153
105
  const readProtectedPaths = dependencies.readProtectedPaths(ctx);
@@ -168,13 +120,24 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
168
120
  const observedContextEntry = dependencies.observedTaskContext(ctx.cwd, event, readProtectedPaths);
169
121
  recordObservedContextEvidence(ctx, observedContextEntry, taskIdentity, dependencies);
170
122
  const pendingContext = dependencies.state.qualifiedTaskContext(ctx);
171
- const shellSnapshotBefore = dependencies.isShellTool(event.toolName)
172
- ? dependencies.state.consumeShellMutationSnapshot(ctx, event.toolName, event.input)
123
+ const shellVerificationBefore = dependencies.isShellTool(event.toolName)
124
+ ? dependencies.state.consumeShellVerificationSnapshot(ctx, event.toolName, event.input, resultToolCallId)
173
125
  : undefined;
126
+ const shellSnapshotBefore = shellVerificationBefore?.snapshot as Record<string, string> | undefined;
174
127
  const currentTask = dependencies.activeTask(ctx);
128
+ const subagentResult = classifyDirectSubagentResult({
129
+ toolName: event.toolName,
130
+ toolInput: event.input,
131
+ content: event.content,
132
+ details: event.details,
133
+ isError: event.isError
134
+ });
135
+ if (subagentResult) dependencies.recordSubagentResult?.(ctx, event, subagentResult);
136
+ const effectiveToolError = event.isError === true || subagentResult?.failed === true;
175
137
  const eventTree = currentTask
176
- ? workingTreeObservation(workingTreeSnapshot(ctx.cwd) as Record<string, string>)
138
+ ? captureWorkspaceVerificationSnapshot(ctx.cwd)
177
139
  : undefined;
140
+ dependencies.state.projectVerification.observe(ctx, currentTask, event, shellVerificationBefore, eventTree);
178
141
  dependencies.recordObservedTaskChanges(pi, ctx, event, pendingContext, dependencies.maxManifestFiles, shellSnapshotBefore, eventTree);
179
142
  if (observed) {
180
143
  dependencies.recordObservedTaskVerification(
@@ -182,7 +145,7 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
182
145
  ctx,
183
146
  { ...observed, toolCallId: observed.toolCallId ?? resultToolCallId, outputText: boundedToolResultText(event.content) },
184
147
  pendingContext,
185
- dependencies.maxManifestFiles, shellSnapshotBefore, eventTree, readProtectedPaths
148
+ dependencies.maxManifestFiles, shellSnapshotBefore, eventTree, readProtectedPaths, shellVerificationBefore?.workspaceRevisionDigest ?? undefined
186
149
  );
187
150
  }
188
151
 
@@ -224,11 +187,12 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
224
187
  }
225
188
  }
226
189
  const outputText = boundedToolResultText(event.content);
227
- const failureReasonCode = classifyToolFailure(event.toolName, event.isError === true, event.content, event.input);
190
+ const toolFailureReasonCode = classifyToolFailure(event.toolName, effectiveToolError, event.content, event.input);
191
+ const failureReasonCode = subagentResult?.reasonCode ?? toolFailureReasonCode;
228
192
  const performanceReviewOutputText = boundedPerformanceReviewResultText(event.content);
229
193
  const observedExitCode = observed?.exitCode
230
194
  ?? numericExitCode(isPlainRecord(event.details) ? event.details.exitCode ?? event.details.status : undefined)
231
- ?? (event.isError === true ? 1 : 0);
195
+ ?? (effectiveToolError ? 1 : 0);
232
196
  const failure = observedExitCode === 0
233
197
  ? undefined
234
198
  : classifyVerificationFailure(outputText, observedExitCode);
@@ -282,6 +246,7 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
282
246
  const successfulDirectMutation = successfulToolResult(event)
283
247
  && directMutationTool;
284
248
  const shellTreeChanged = shellChangedPaths.length > 0;
249
+ if (successfulDirectMutation || shellTreeChanged) retrievalEvidence.invalidateAfterMutation(ctx, currentTurnId);
285
250
  if (taskIdentity && currentTreeDigest && (reviewCandidate || existingCredit || successfulDirectMutation || shellSnapshotBefore)) {
286
251
  if (shellTreeChanged || directMutationResult.changedPaths.length > 0) {
287
252
  dependencies.state.invalidatePerformanceReviewCredit(taskIdentity.taskRunId);
@@ -313,7 +278,50 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
313
278
  let resultDetails: unknown = event.details;
314
279
  let resultChanged = false;
315
280
  let editRecovery: EditRecoveryContext | undefined;
281
+ if (subagentResult) {
282
+ const classification = {
283
+ schemaVersion: 1,
284
+ spawned: subagentResult.spawned,
285
+ failed: subagentResult.failed,
286
+ reasonCode: subagentResult.reasonCode,
287
+ disposition: subagentResult.disposition,
288
+ role: subagentResult.role,
289
+ requestRef: subagentResult.requestRef,
290
+ calls: subagentResult.calls,
291
+ tokens: subagentResult.tokens
292
+ };
293
+ resultDetails = isPlainRecord(resultDetails)
294
+ ? { ...resultDetails, piagentSubagentOutcome: classification }
295
+ : { ...(resultDetails === undefined ? {} : { value: resultDetails }), piagentSubagentOutcome: classification };
296
+ if (subagentResult.failed) {
297
+ resultContent = appendToolResultText(
298
+ resultContent,
299
+ `[Piagent helper outcome: failed (${subagentResult.reasonCode ?? "helper-run-failed"}). Treat this result as insufficient evidence; continue in the parent and do not retry the helper.]`
300
+ );
301
+ }
302
+ resultChanged = true;
303
+ }
316
304
  const resultTarget = dependencies.extractLikelyPath(ctx.cwd, isPlainRecord(event.input) ? event.input : {});
305
+ const handledNavigationFailure = effectiveToolError && handledToolFailure(toolFailureReasonCode, normalizedToolName);
306
+ if (handledNavigationFailure) {
307
+ const navigation = handledNavigationToolResult({
308
+ toolName: normalizedToolName,
309
+ reasonCode: String(toolFailureReasonCode),
310
+ targetPath: resultTarget,
311
+ content: resultContent,
312
+ details: resultDetails,
313
+ redactText: dependencies.redactText
314
+ });
315
+ resultContent = navigation.content;
316
+ resultDetails = navigation.details;
317
+ resultChanged = true;
318
+ }
319
+ dependencies.observeEditFreshness?.(ctx, event, {
320
+ taskRunId: taskIdentity?.taskRunId,
321
+ successful: successfulToolResult(event),
322
+ targetPath: resultTarget,
323
+ mutationTargets: directMutationTargets
324
+ });
317
325
  if (event.toolName === "grep") {
318
326
  const filtered = filterGrepProtectedContent(resultContent, readProtectedPaths);
319
327
  if (filtered.changed) {
@@ -340,7 +348,7 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
340
348
  const recovery = buildEditRecoveryContext({
341
349
  cwd: ctx.cwd,
342
350
  targetPath: resultTarget,
343
- reasonCode: failureReasonCode,
351
+ reasonCode: toolFailureReasonCode,
344
352
  protectedPaths: readProtectedPaths
345
353
  });
346
354
  if (recovery) {
@@ -391,7 +399,10 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
391
399
  outputHash: fingerprint.outputHash,
392
400
  recordedAt: dependencies.now()
393
401
  });
394
- if (repeated && ["read", "grep", "find", "ls"].includes(event.toolName) && fingerprint.outputChars > 0) {
402
+ const retrievalCheckpoint = observeRetrievalResult({ runtime: retrievalEvidence, ctx, turnId: currentTurnId,
403
+ observation: { toolName: normalizedToolName, callFingerprint: fingerprint.key, outputHash: fingerprint.outputHash,
404
+ target: resultTarget, deterministicMiss: handledNavigationFailure, nonEvidenceFailure: effectiveToolError } });
405
+ if (repeated && ["read", "grep", "find", "ls", "subagent"].includes(event.toolName) && fingerprint.outputChars > 0) {
395
406
  resultContent = [{
396
407
  type: "text",
397
408
  text: `[Piagent delta: unchanged ${event.toolName} result; ${fingerprint.outputChars} chars / ${fingerprint.outputLines} lines match the previous identical call.]`
@@ -408,7 +419,6 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
408
419
  : { value: resultDetails, piagentDelta: delta };
409
420
  resultChanged = true;
410
421
  }
411
-
412
422
  const captureCache = new Map<string, ToolResultCaptureSummary>();
413
423
  const compactedContent = compactToolResultTextContent(ctx.cwd, event, ctx, resultContent, captureCache);
414
424
  const compactionCaptures = [...compactedContent.captures];
@@ -433,6 +443,13 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
433
443
  resultContent = appendToolResultText(resultContent, editRecovery.text);
434
444
  resultChanged = true;
435
445
  }
446
+ const checkpointResult = attachRetrievalCheckpoint({ checkpoint: retrievalCheckpoint, content: resultContent,
447
+ details: resultDetails, ctx, turnId: currentTurnId, telemetry: dependencies.telemetry });
448
+ if (checkpointResult.changed) {
449
+ resultContent = checkpointResult.content;
450
+ resultDetails = checkpointResult.details;
451
+ resultChanged = true;
452
+ }
436
453
 
437
454
  const resultFingerprintId = event.toolCallId ?? fingerprint.key;
438
455
  const record = dependencies.activity ?? dependencies.telemetry;
@@ -441,10 +458,10 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
441
458
  .map((filePath) => dependencies.redactText(filePath))
442
459
  .sort();
443
460
  const lineStats = patchLineStats(event.details);
444
- const editRecoveryFailure = ["edit-anchor-not-unique", "edit-anchor-stale"].includes(String(failureReasonCode));
461
+ const editRecoveryFailure = ["edit-anchor-not-unique", "edit-anchor-stale"].includes(String(toolFailureReasonCode));
445
462
  record(ctx, {
446
- activityId: `result:${resultFingerprintId}`,
447
- event: "tool_result",
463
+ activityId: `result:${resultFingerprintId}`, event: "tool_result",
464
+ ...editVerificationMarker(taskIdentity, eventTree, successfulToolResult(event), changedPaths),
448
465
  recordedAt: dependencies.now(),
449
466
  toolCallId: resultFingerprintId,
450
467
  toolName: event.toolName,
@@ -458,8 +475,10 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
458
475
  compacted: compactionCaptures.length > 0,
459
476
  compactedCaptures: compactionCaptures.length,
460
477
  sensitiveValuesRedacted,
461
- isError: event.isError,
478
+ isError: effectiveToolError,
462
479
  reasonCode: failureReasonCode,
480
+ handledFailure: handledNavigationFailure || undefined,
481
+ retrievalCheckpoint: retrievalCheckpoint?.reason,
463
482
  // An explicit false is evidence too: it proves that every classified
464
483
  // edit-anchor failure passed through the recovery policy even when the
465
484
  // target was too large, private, protected, or otherwise ineligible.
@@ -474,8 +493,8 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
474
493
 
475
494
  if (resultChanged) {
476
495
  return resultDetails === undefined
477
- ? { content: resultContent }
478
- : { content: resultContent, details: resultDetails };
496
+ ? { content: resultContent, ...(handledNavigationFailure ? { isError: false } : {}) }
497
+ : { content: resultContent, details: resultDetails, ...(handledNavigationFailure ? { isError: false } : {}) };
479
498
  }
480
499
  });
481
500
  }
@@ -11,3 +11,12 @@ export function patchLineStats(details: unknown): { additions?: number; deletion
11
11
  }
12
12
  return { additions, deletions };
13
13
  }
14
+
15
+ export function editVerificationMarker(identity: { taskId: string; taskRunId: string } | undefined,
16
+ tree: { proofCapable: boolean; digest: string; workspaceRevisionDigest: string | null } | undefined,
17
+ successful: boolean, changedPaths: string[]) {
18
+ return { taskUsageVersion: 1, taskId: identity?.taskId, taskRunId: identity?.taskRunId,
19
+ mutationObserved: successful && changedPaths.length > 0 && tree?.proofCapable === true,
20
+ postWorkingTreeDigest: tree?.proofCapable ? tree.digest : null,
21
+ postWorkspaceRevisionDigest: tree?.proofCapable ? tree.workspaceRevisionDigest : null };
22
+ }
@@ -0,0 +1,36 @@
1
+ import { appendToolResultText, isPlainRecord } from "./tool-result-value-helpers.ts";
2
+
3
+ function handledNavigationText(reasonCode: string): string {
4
+ const guidance = reasonCode === "target-is-directory"
5
+ ? "List the directory once and choose a child"
6
+ : "Discover from one confirmed parent";
7
+ return `[Piagent navigation: ${reasonCode} — handled negative evidence, not a runtime failure. ${guidance}; do not retry this call.]`;
8
+ }
9
+
10
+ export function handledNavigationToolResult(input: {
11
+ toolName: string;
12
+ reasonCode: string;
13
+ targetPath?: string;
14
+ content: unknown;
15
+ details: unknown;
16
+ redactText: (value: string) => string;
17
+ }): { content: unknown; details: unknown } {
18
+ const targetPath = input.targetPath
19
+ ? input.redactText(input.targetPath).replace(/\s+/g, " ").trim().slice(0, 1_024) || undefined
20
+ : undefined;
21
+ const navigation = {
22
+ schemaVersion: 1,
23
+ handled: true,
24
+ reasonCode: input.reasonCode,
25
+ targetPath,
26
+ retryExactCall: false
27
+ };
28
+ const text = handledNavigationText(input.reasonCode);
29
+ const content = ["read", "grep", "find", "ls"].includes(input.toolName)
30
+ ? [{ type: "text", text }]
31
+ : appendToolResultText(input.content, text);
32
+ const details = isPlainRecord(input.details)
33
+ ? { ...input.details, piagentNavigation: navigation }
34
+ : { ...(input.details === undefined ? {} : { value: input.details }), piagentNavigation: navigation };
35
+ return { content, details };
36
+ }