@piagent/platform 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -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 +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/model-options.md +20 -15
  175. package/docs/operator-manual-vietnamese.md +12 -12
  176. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  177. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  178. package/docs/piagent-core-improvement-plan.md +528 -0
  179. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  180. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  181. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  182. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  183. package/docs/piagent-open-session-wait.md +19 -0
  184. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  185. package/docs/publishing-for-teams.md +3 -0
  186. package/docs/quality-benchmark.md +128 -8
  187. package/docs/quickstart-vietnamese.md +2 -2
  188. package/docs/release-install-policy.md +38 -11
  189. package/docs/research/harness-next-evidence-review.md +113 -0
  190. package/docs/team-onboarding.md +7 -7
  191. package/docs/third-party-neutrality.md +7 -0
  192. package/docs/usage-observability.md +1 -1
  193. package/docs-site/architecture.html +1 -1
  194. package/docs-site/benchmark.html +1 -1
  195. package/docs-site/commands.html +1 -1
  196. package/docs-site/content/en/runtime.html +1 -1
  197. package/docs-site/content/en/whats-new.html +23 -0
  198. package/docs-site/content/runtime.html +2 -2
  199. package/docs-site/content/whats-new.html +23 -0
  200. package/docs-site/context-engine.html +1 -1
  201. package/docs-site/en/architecture.html +1 -1
  202. package/docs-site/en/benchmark.html +1 -1
  203. package/docs-site/en/commands.html +1 -1
  204. package/docs-site/en/context-engine.html +1 -1
  205. package/docs-site/en/index.html +1 -1
  206. package/docs-site/en/mcp-approval.html +1 -1
  207. package/docs-site/en/mcp-auth.html +1 -1
  208. package/docs-site/en/mcp-servers.html +1 -1
  209. package/docs-site/en/mcp.html +1 -1
  210. package/docs-site/en/permissions.html +1 -1
  211. package/docs-site/en/profiles.html +1 -1
  212. package/docs-site/en/quickstart.html +1 -1
  213. package/docs-site/en/runtime.html +2 -2
  214. package/docs-site/en/scope.html +1 -1
  215. package/docs-site/en/security.html +1 -1
  216. package/docs-site/en/team.html +1 -1
  217. package/docs-site/en/whats-new.html +24 -1
  218. package/docs-site/en/workflows.html +1 -1
  219. package/docs-site/index.html +1 -1
  220. package/docs-site/mcp-approval.html +1 -1
  221. package/docs-site/mcp-auth.html +1 -1
  222. package/docs-site/mcp-servers.html +1 -1
  223. package/docs-site/mcp.html +1 -1
  224. package/docs-site/permissions.html +1 -1
  225. package/docs-site/profiles.html +1 -1
  226. package/docs-site/quickstart.html +1 -1
  227. package/docs-site/runtime.html +3 -3
  228. package/docs-site/scope.html +1 -1
  229. package/docs-site/security.html +1 -1
  230. package/docs-site/team.html +1 -1
  231. package/docs-site/whats-new.html +24 -1
  232. package/docs-site/workflows.html +1 -1
  233. package/evals/architecture-conformance-v1/lane.json +18 -0
  234. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  235. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  236. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  238. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  240. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  241. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  242. package/evals/fixtures/composite-criterion.valid.json +33 -0
  243. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  244. package/evals/fixtures/contract-family-library.valid.json +41 -0
  245. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  246. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  247. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  248. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  252. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  254. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  255. package/evals/fs5-artifact-archive/README.md +32 -0
  256. package/evals/fs5-artifact-archive/manifest.json +148 -0
  257. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  258. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  259. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  260. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  261. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  262. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  263. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  264. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  265. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  266. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  267. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  268. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  269. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  270. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  271. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  272. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  273. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  274. package/evals/fs5-causal-arm.v1.json +9 -5
  275. package/evals/fs5-pilot-protocol.v1.json +1 -1
  276. package/evals/fs5-pilot-protocol.v4.json +4 -4
  277. package/evals/fs5-pilot-protocol.v5.json +6 -5
  278. package/evals/harness-next/development-corpus.mjs +106 -0
  279. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  280. package/evals/harness-next/run-calibration.mjs +83 -0
  281. package/evals/harness-next/run-resource-probe.mjs +55 -0
  282. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  283. package/evals/harness-next.v1.json +51 -0
  284. package/evals/long-horizon-v1/README.md +19 -0
  285. package/evals/long-horizon-v1/runner.mjs +116 -48
  286. package/evals/long-horizon-v1/worker.mjs +77 -30
  287. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  288. package/evals/private-holdout-v1/README.md +5 -2
  289. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  290. package/package.json +9 -4
  291. package/packages/piagent-core/README.md +2 -2
  292. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  293. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  294. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  295. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  296. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  297. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  298. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  299. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  300. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  301. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  303. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  304. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  305. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  306. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  307. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  309. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  310. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  311. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  312. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  313. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  314. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  315. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  317. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  318. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  319. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  320. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  321. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  322. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  323. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  325. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  326. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  328. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  329. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  330. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  331. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  332. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  334. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  335. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  336. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  337. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  338. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  339. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  340. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  341. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  342. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  343. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  344. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  345. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  346. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  347. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  348. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  349. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  350. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  351. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  352. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  354. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  355. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  356. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  357. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  358. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  359. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  360. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  363. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  364. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  365. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  366. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  368. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  369. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  370. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  371. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  372. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  373. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  393. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  394. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  395. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  396. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  397. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  398. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  400. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  401. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  402. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  405. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  406. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  407. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  408. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  409. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  410. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  411. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  412. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  413. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  414. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  415. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  416. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  417. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  418. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  419. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  421. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  422. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  423. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  424. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  425. package/packages/piagent-core/extensions/context-engine.js +11 -6
  426. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  427. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  428. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  429. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  430. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  431. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  432. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  433. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  434. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  435. package/packages/piagent-core/extensions/task-journal.js +48 -3
  436. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  437. package/packages/piagent-core/extensions/task-state.js +74 -38
  438. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  439. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  440. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  441. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  442. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  443. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  444. package/packages/piagent-core/package.json +3 -3
  445. package/packages/piagent-core/policies/base-policy.json +1 -0
  446. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  447. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  448. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  449. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  450. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  451. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  452. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  453. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  454. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  455. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  457. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  458. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  461. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  462. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  463. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  464. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  465. package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
  466. package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
  467. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  468. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  469. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  470. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  471. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  472. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  473. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  474. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  475. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  476. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  477. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  478. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  479. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  480. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  481. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  482. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  483. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  484. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  485. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  486. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  487. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  488. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  489. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  490. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  491. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  492. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  493. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  494. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  495. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  496. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  497. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  498. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  499. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  500. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  501. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  502. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  503. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  504. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  505. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  506. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  507. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  508. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  509. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  510. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  511. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  512. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  513. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  514. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  515. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  516. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  517. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  518. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  519. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  520. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  521. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  522. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  523. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  524. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  525. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  526. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  527. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  528. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  529. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  530. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  531. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  532. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  533. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  534. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  535. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
  536. package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
  537. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  538. package/packages/piagent-webui/dist/client/index.html +2 -2
  539. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  540. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  541. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  542. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  543. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  544. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  545. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  546. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  547. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  548. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  549. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  550. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  551. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  552. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  553. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  554. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  555. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  556. package/packages/piagent-webui/gateway/session-inspection-registry.ts +14 -6
  557. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  558. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  559. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  560. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  561. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  562. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  563. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  564. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  565. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  566. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  567. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  568. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  569. package/schemas/approved-host-contracts.schema.json +973 -0
  570. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  571. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  572. package/schemas/composite-criterion.schema.json +788 -0
  573. package/schemas/contract-family-library.schema.json +28 -0
  574. package/schemas/contract-selection-recipe.schema.json +31 -0
  575. package/schemas/failure-evidence.schema.json +2 -2
  576. package/schemas/helper-request.schema.json +16 -4
  577. package/schemas/host-contract-plan.schema.json +25 -0
  578. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  579. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  580. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  581. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  582. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  583. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  584. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  585. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  586. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  587. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  588. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  589. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  590. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  591. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  592. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  593. package/schemas/task-contract.schema.json +30 -0
  594. package/scripts/approve-independent-verification.mjs +57 -0
  595. package/scripts/benchmark-arm-observer.mjs +320 -0
  596. package/scripts/benchmark-budget-ipc.mjs +34 -0
  597. package/scripts/benchmark-budget-launcher.mjs +91 -0
  598. package/scripts/benchmark-budget-processes.mjs +133 -0
  599. package/scripts/benchmark-budget-publication.mjs +228 -0
  600. package/scripts/benchmark-budget-runtime.mjs +136 -0
  601. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  602. package/scripts/benchmark-codex-journey.mjs +406 -0
  603. package/scripts/benchmark-independent-verification.mjs +628 -0
  604. package/scripts/benchmark-journey-outcome.mjs +92 -0
  605. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  606. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  607. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  608. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  609. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  610. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  611. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  612. package/scripts/benchmark-runner-completion.mjs +133 -0
  613. package/scripts/benchmark-runner-configuration.mjs +159 -0
  614. package/scripts/benchmark-runner-core.mjs +217 -388
  615. package/scripts/benchmark-runner-finalization.mjs +140 -27
  616. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  617. package/scripts/benchmark-runner-schedule.mjs +256 -0
  618. package/scripts/benchmark-runner-support.mjs +136 -4
  619. package/scripts/benchmark-runner.mjs +95 -18
  620. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  621. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  622. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  623. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  624. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  625. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  626. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  627. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  628. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  629. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  630. package/scripts/benchmark-session-evaluator.mjs +169 -0
  631. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  632. package/scripts/benchmark-session-usage.mjs +28 -0
  633. package/scripts/benchmark-session.mjs +343 -50
  634. package/scripts/benchmark-webui-journey.mjs +678 -0
  635. package/scripts/check-public-wording.mjs +46 -0
  636. package/scripts/configure-model-scope.sh +6 -2
  637. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  638. package/scripts/install-global.sh +2 -2
  639. package/scripts/model-route-evaluation-core.ts +1 -0
  640. package/scripts/phase-tools-evaluation.mjs +1 -0
  641. package/scripts/pi-auto.sh +7 -1
  642. package/scripts/pi-model-route.mjs +1 -1
  643. package/scripts/pi-usage-history.mjs +201 -11
  644. package/scripts/piagent-cli.mjs +8 -0
  645. package/scripts/private-holdout-readiness.mjs +7 -1
  646. package/scripts/public-evaluation-exposure.mjs +140 -0
  647. package/scripts/select-independent-verification.mjs +62 -0
  648. package/scripts/setup.sh +2 -2
  649. package/scripts/typescript-loader.mjs +135 -1
  650. package/scripts/update-global.mjs +6 -7
  651. package/scripts/verify-local.sh +37 -56
  652. package/scripts/verify-release-identity.mjs +5 -3
  653. package/templates/global/settings.json +5 -1
  654. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -31,6 +31,20 @@ import type { ResumeState } from "../recovery/resume-state.ts";
31
31
 
32
32
  type SessionTaskReference = { taskId?: string; taskRunId?: string };
33
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
+
34
48
  type SessionStartHookDependencies = {
35
49
  state: RuntimeSessionState;
36
50
  loadProfile: (ctx: ExtensionContext) => ProjectProfile;
@@ -66,6 +80,7 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
66
80
  if (!hasOperatorSessionName(operatorSessionName)) pi.setSessionName(`pi:${name}`);
67
81
 
68
82
  const sessionId = ctx.sessionManager.getSessionId();
83
+ const sessionIdentity = { cwd: ctx.cwd, sessionId };
69
84
  const sessionName = currentSessionName(ctx);
70
85
  const taskReference = dependencies.taskReference(ctx);
71
86
  const activeTaskRunId = readSessionTaskBinding(ctx.cwd, sessionId)?.activeTaskRunId ?? taskReference?.taskRunId;
@@ -283,7 +298,7 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
283
298
  const permissionProfile = dependencies.permissionProfile(ctx, profile);
284
299
  const executionBackend = resolveExecutionBackend();
285
300
  const contextHint = preflight.recommendation === "fresh-session"
286
- ? " 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)."
287
302
  : preflight.recommendation === "compact"
288
303
  ? " Context is warm; run /task-preflight before large work."
289
304
  : "";
@@ -308,6 +323,11 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
308
323
  if (updateNotice) ctx.ui.notify(updateNotice, "info");
309
324
 
310
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;
311
331
  try {
312
332
  engineStatus = await contextIndexV2Status(ctx.cwd, {
313
333
  excludePatterns: dependencies.contextExcludePatterns(profile)
@@ -315,22 +335,34 @@ export function registerSessionStartHook(pi: ExtensionAPI, dependencies: Session
315
335
  } catch (error) {
316
336
  engineStatus = { exists: false, error: error instanceof Error ? error.message : String(error) };
317
337
  }
318
- dependencies.telemetry(ctx, {
319
- event: "session_start",
320
- // Benchmark and efficiency projections must be able to distinguish a
321
- // genuine zero-recovery session from telemetry produced before this
322
- // receipt/result protocol existed.
323
- editRecoveryContextTelemetryVersion: 1,
324
- activeTools: pi.getActiveTools().length,
325
- index: engineStatus,
326
- taskMigration: migration,
327
- taskId: resumedTask?.taskId,
328
- taskRunId: resumedTask?.taskRunId,
329
- captureRetention,
330
- taskJournalRetention,
331
- taskRecovery,
332
- executionBackend
333
- });
334
- 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
+ }
335
367
  });
336
368
  }
@@ -1,37 +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
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";
15
14
  import { classifyDirectSubagentResult, type DirectSubagentResult } from "../orchestration/subagent-tool-policy.ts";
16
15
  import { boundedGitDiffReview } from "../quality/performance-assurance.ts";
17
16
  import { currentFileContentDigests } from "../quality/model-mutation-proof.ts";
18
17
  import { boundedPerformanceReviewResultText } from "../quality/performance-review-evidence.ts";
19
18
  import { buildEditRecoveryContext, type EditRecoveryContext } from "../recovery/edit-recovery-context.ts";
20
19
  import { EditRecoveryDeliveryState } from "../recovery/edit-recovery-delivery.ts";
20
+ import { RetrievalEvidenceRuntime } from "../session/retrieval-evidence-runtime.ts";
21
21
  import { attachToolResultCompactionDetails, compactToolResultDetails, compactToolResultTextContent, type ToolResultCaptureSummary } from "../session/tool-result-compaction.ts";
22
22
  import type { ObservedTaskContext } from "../session/runtime-state.ts";
23
23
  import { observeTrajectorySync } from "../trajectory/trajectory-observability.ts";
24
24
  import type { TrajectorySyncResult } from "../trajectory/trajectory-runtime.ts";
25
25
  import { filterGrepProtectedContent, filterProtectedPathListContent } from "./tool-result-content-guards.ts";
26
- 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";
27
29
  import { appendToolResultText, boundedToolResultText, countChangedStringLeaves, isPlainRecord, numericExitCode, redactToolResultTextContent, successfulToolResult } from "./tool-result-value-helpers.ts";
28
30
 
29
31
  export { filterGrepProtectedContent, filterProtectedPathListContent };
30
32
  type ToolResultEvent = { toolCallId?: string; toolName: string; input?: unknown; content?: unknown; details?: unknown; isError?: boolean; usage?: unknown };
31
33
  type ObservedBashResult = NonNullable<ReturnType<typeof observedBashResultFromToolResultEvent>>;
32
34
  type ObservedVerificationResult = ObservedBashResult & { outputText?: string };
33
- type WorkingTreeObservation = ReturnType<typeof workingTreeObservation>;
34
-
35
35
  type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
36
36
  readProtectedPaths: (ctx: ExtensionContext) => string[];
37
37
  recordObservedBash: (observed: ObservedBashResult) => void;
@@ -48,15 +48,15 @@ type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
48
48
  event: ToolResultEvent,
49
49
  pendingContext: ObservedTaskContext[],
50
50
  maxManifestFiles: number,
51
- shellSnapshotBefore?: Record<string, string>, eventTree?: WorkingTreeObservation
51
+ shellSnapshotBefore?: Record<string, string>, eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>
52
52
  ) => unknown;
53
53
  recordObservedTaskVerification: (
54
54
  pi: ExtensionAPI,
55
55
  ctx: ExtensionContext,
56
56
  observed: ObservedVerificationResult,
57
57
  pendingContext: ObservedTaskContext[],
58
- maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>, eventTree?: WorkingTreeObservation,
59
- readProtectedPaths?: string[]
58
+ maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>, eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>,
59
+ readProtectedPaths?: string[], preWorkspaceRevisionDigest?: string
60
60
  ) => unknown;
61
61
  extractLikelyPath: (cwd: string, input: Record<string, unknown>) => string | undefined;
62
62
  mutationTargets: (cwd: string, toolName: string, input: Record<string, unknown>) => string[];
@@ -91,10 +91,15 @@ type ToolResultHookDependencies = ContextDeliveryConfirmationDependencies & {
91
91
 
92
92
  export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResultHookDependencies): void {
93
93
  const editRecoveryDelivery = new EditRecoveryDeliveryState();
94
+ const retrievalEvidence = new RetrievalEvidenceRuntime();
94
95
  pi.on("session_compact", async (_event, ctx) => editRecoveryDelivery.advanceEpoch(ctx));
95
- 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
+ });
96
100
  pi.on("tool_result", async (event, ctx) => {
97
101
  confirmContextDeliveryFromToolResult(pi, ctx, event, dependencies);
102
+ const currentTurnId = dependencies.state.currentTurn?.(ctx)?.turnId;
98
103
  const taskIdentity = dependencies.state.taskIdentity(ctx);
99
104
  const resultToolCallId = event.toolCallId ?? toolResultFingerprint(event.toolName, event.input, []).key;
100
105
  const readProtectedPaths = dependencies.readProtectedPaths(ctx);
@@ -115,9 +120,10 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
115
120
  const observedContextEntry = dependencies.observedTaskContext(ctx.cwd, event, readProtectedPaths);
116
121
  recordObservedContextEvidence(ctx, observedContextEntry, taskIdentity, dependencies);
117
122
  const pendingContext = dependencies.state.qualifiedTaskContext(ctx);
118
- const shellSnapshotBefore = dependencies.isShellTool(event.toolName)
119
- ? 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)
120
125
  : undefined;
126
+ const shellSnapshotBefore = shellVerificationBefore?.snapshot as Record<string, string> | undefined;
121
127
  const currentTask = dependencies.activeTask(ctx);
122
128
  const subagentResult = classifyDirectSubagentResult({
123
129
  toolName: event.toolName,
@@ -129,8 +135,9 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
129
135
  if (subagentResult) dependencies.recordSubagentResult?.(ctx, event, subagentResult);
130
136
  const effectiveToolError = event.isError === true || subagentResult?.failed === true;
131
137
  const eventTree = currentTask
132
- ? workingTreeObservation(workingTreeSnapshot(ctx.cwd) as Record<string, string>)
138
+ ? captureWorkspaceVerificationSnapshot(ctx.cwd)
133
139
  : undefined;
140
+ dependencies.state.projectVerification.observe(ctx, currentTask, event, shellVerificationBefore, eventTree);
134
141
  dependencies.recordObservedTaskChanges(pi, ctx, event, pendingContext, dependencies.maxManifestFiles, shellSnapshotBefore, eventTree);
135
142
  if (observed) {
136
143
  dependencies.recordObservedTaskVerification(
@@ -138,7 +145,7 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
138
145
  ctx,
139
146
  { ...observed, toolCallId: observed.toolCallId ?? resultToolCallId, outputText: boundedToolResultText(event.content) },
140
147
  pendingContext,
141
- dependencies.maxManifestFiles, shellSnapshotBefore, eventTree, readProtectedPaths
148
+ dependencies.maxManifestFiles, shellSnapshotBefore, eventTree, readProtectedPaths, shellVerificationBefore?.workspaceRevisionDigest ?? undefined
142
149
  );
143
150
  }
144
151
 
@@ -239,6 +246,7 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
239
246
  const successfulDirectMutation = successfulToolResult(event)
240
247
  && directMutationTool;
241
248
  const shellTreeChanged = shellChangedPaths.length > 0;
249
+ if (successfulDirectMutation || shellTreeChanged) retrievalEvidence.invalidateAfterMutation(ctx, currentTurnId);
242
250
  if (taskIdentity && currentTreeDigest && (reviewCandidate || existingCredit || successfulDirectMutation || shellSnapshotBefore)) {
243
251
  if (shellTreeChanged || directMutationResult.changedPaths.length > 0) {
244
252
  dependencies.state.invalidatePerformanceReviewCredit(taskIdentity.taskRunId);
@@ -294,6 +302,20 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
294
302
  resultChanged = true;
295
303
  }
296
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
+ }
297
319
  dependencies.observeEditFreshness?.(ctx, event, {
298
320
  taskRunId: taskIdentity?.taskRunId,
299
321
  successful: successfulToolResult(event),
@@ -377,6 +399,9 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
377
399
  outputHash: fingerprint.outputHash,
378
400
  recordedAt: dependencies.now()
379
401
  });
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 } });
380
405
  if (repeated && ["read", "grep", "find", "ls", "subagent"].includes(event.toolName) && fingerprint.outputChars > 0) {
381
406
  resultContent = [{
382
407
  type: "text",
@@ -394,7 +419,6 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
394
419
  : { value: resultDetails, piagentDelta: delta };
395
420
  resultChanged = true;
396
421
  }
397
-
398
422
  const captureCache = new Map<string, ToolResultCaptureSummary>();
399
423
  const compactedContent = compactToolResultTextContent(ctx.cwd, event, ctx, resultContent, captureCache);
400
424
  const compactionCaptures = [...compactedContent.captures];
@@ -419,6 +443,13 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
419
443
  resultContent = appendToolResultText(resultContent, editRecovery.text);
420
444
  resultChanged = true;
421
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
+ }
422
453
 
423
454
  const resultFingerprintId = event.toolCallId ?? fingerprint.key;
424
455
  const record = dependencies.activity ?? dependencies.telemetry;
@@ -429,8 +460,8 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
429
460
  const lineStats = patchLineStats(event.details);
430
461
  const editRecoveryFailure = ["edit-anchor-not-unique", "edit-anchor-stale"].includes(String(toolFailureReasonCode));
431
462
  record(ctx, {
432
- activityId: `result:${resultFingerprintId}`,
433
- event: "tool_result",
463
+ activityId: `result:${resultFingerprintId}`, event: "tool_result",
464
+ ...editVerificationMarker(taskIdentity, eventTree, successfulToolResult(event), changedPaths),
434
465
  recordedAt: dependencies.now(),
435
466
  toolCallId: resultFingerprintId,
436
467
  toolName: event.toolName,
@@ -446,6 +477,8 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
446
477
  sensitiveValuesRedacted,
447
478
  isError: effectiveToolError,
448
479
  reasonCode: failureReasonCode,
480
+ handledFailure: handledNavigationFailure || undefined,
481
+ retrievalCheckpoint: retrievalCheckpoint?.reason,
449
482
  // An explicit false is evidence too: it proves that every classified
450
483
  // edit-anchor failure passed through the recovery policy even when the
451
484
  // target was too large, private, protected, or otherwise ineligible.
@@ -460,8 +493,8 @@ export function registerToolResultHook(pi: ExtensionAPI, dependencies: ToolResul
460
493
 
461
494
  if (resultChanged) {
462
495
  return resultDetails === undefined
463
- ? { content: resultContent }
464
- : { content: resultContent, details: resultDetails };
496
+ ? { content: resultContent, ...(handledNavigationFailure ? { isError: false } : {}) }
497
+ : { content: resultContent, details: resultDetails, ...(handledNavigationFailure ? { isError: false } : {}) };
465
498
  }
466
499
  });
467
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
+ }
@@ -0,0 +1,42 @@
1
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+
3
+ import {
4
+ RetrievalEvidenceRuntime,
5
+ type RetrievalEvidenceCheckpoint,
6
+ type RetrievalEvidenceObservation
7
+ } from "../session/retrieval-evidence-runtime.ts";
8
+ import { appendToolResultText, isPlainRecord } from "./tool-result-value-helpers.ts";
9
+
10
+ export function observeRetrievalResult(input: {
11
+ runtime: RetrievalEvidenceRuntime;
12
+ ctx: ExtensionContext;
13
+ observation: RetrievalEvidenceObservation;
14
+ turnId?: string;
15
+ }): RetrievalEvidenceCheckpoint | undefined {
16
+ return input.runtime.observe(input.ctx, input.observation, input.turnId);
17
+ }
18
+
19
+ export function attachRetrievalCheckpoint(input: {
20
+ checkpoint?: RetrievalEvidenceCheckpoint;
21
+ content: unknown;
22
+ details: unknown;
23
+ ctx: ExtensionContext;
24
+ turnId?: string;
25
+ telemetry: (ctx: ExtensionContext, payload: Record<string, unknown>) => void;
26
+ }): { content: unknown; details: unknown; changed: boolean } {
27
+ if (!input.checkpoint) return { content: input.content, details: input.details, changed: false };
28
+ const details = isPlainRecord(input.details)
29
+ ? { ...input.details, piagentRetrievalCheckpoint: input.checkpoint }
30
+ : { ...(input.details === undefined ? {} : { value: input.details }), piagentRetrievalCheckpoint: input.checkpoint };
31
+ input.telemetry(input.ctx, {
32
+ event: "retrieval_evidence_checkpoint",
33
+ turnId: input.turnId,
34
+ ...input.checkpoint,
35
+ text: undefined
36
+ });
37
+ return {
38
+ content: appendToolResultText(input.content, input.checkpoint.text),
39
+ details,
40
+ changed: true
41
+ };
42
+ }
@@ -105,7 +105,7 @@ function normalizeImagePathCandidate(candidate: string, cwd: string, options: {
105
105
  return path.isAbsolute(raw) ? raw : path.resolve(cwd, raw);
106
106
  }
107
107
 
108
- function extractLocalImagePathCandidates(text: string, cwd: string): string[] {
108
+ export function extractLocalImagePathCandidates(text: string, cwd: string): string[] {
109
109
  const candidates = new Set<string>();
110
110
  const imageExt = "(?:png|jpe?g|gif|webp|bmp)";
111
111
  const wholeTextPath = normalizeImagePathCandidate(text, cwd, { allowBareRelative: false });
@@ -54,7 +54,7 @@ export function adaptActivityTelemetryEvent(input: ActivityEventAdapterInput): R
54
54
  const toolCallRef = hasOperation ? opaque("tool", rawToolCall) : null;
55
55
  const activityType = hasOperation ? "tool" : ["bash", "shell", "exec"].includes(toolName) ? "command" : "other";
56
56
  const resultFailure = eventName === "tool_result" && (event.isError === true || typeof event.exitCode === "number" && event.exitCode !== 0);
57
- const failed = resultFailure && !handledToolFailure(event.reasonCode);
57
+ const failed = resultFailure && !handledToolFailure(event.reasonCode, toolName);
58
58
  const blocked = eventName === "tool_decision";
59
59
  // `tool_call` is emitted before policy authorization. Calling it "started"
60
60
  // made the Dashboard claim a command was running while it was still waiting
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
- export const PINNED_BRIDGE_HOST_VERSION = "0.84.1" as const;
3
+ export const PINNED_BRIDGE_HOST_VERSION = "0.87.1" as const;
4
4
  export const SAME_PROCESS_BRIDGE_PROOF_VERSION = "piagent-webui-same-process-bridge-v1" as const;
5
5
 
6
6
  const HOST_EVENTS = Object.freeze([
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
3
  import { redactSensitiveText } from "../../extensions/redaction-core.js";
4
- import { readHandoffProjection } from "../recovery/handoff-projection.ts";
4
+ import { handoffIdentityMatchesTask, readHandoffProjection } from "../recovery/handoff-projection.ts";
5
5
  import { inspectTaskResumeState } from "../recovery/resume-state.ts";
6
6
  import { inspectBoundedContextTelemetry } from "./context-telemetry-inspection.ts";
7
7
  import { taskRunOpaqueRef } from "./task-run-index.ts";
@@ -34,7 +34,7 @@ function nextAction(cwd: string, task: Task) {
34
34
 
35
35
  function currentHandoff(cwd: string, task: Task) {
36
36
  const handoff = readHandoffProjection(cwd, task.taskRunId); if (!handoff) return null;
37
- if (handoff.identity.taskId !== task.taskId || handoff.identity.taskRunId !== task.taskRunId) throw new Error("handoff-identity-conflict");
37
+ if (!handoffIdentityMatchesTask(handoff.identity, task as any)) throw new Error("handoff-identity-conflict");
38
38
  return { handoffRef: opaque("handoff", `${task.taskRunId}\0${handoff.generatedAt}\0${handoff.tree.currentDigest ?? "none"}`),
39
39
  generatedAt: handoff.generatedAt, phase: display(handoff.state.phase, 64) || null, taskOutcome: handoff.state.taskOutcome,
40
40
  gateDecision: handoff.state.gateDecision, completionApproved: handoff.state.completionApproved,
@@ -1,5 +1,6 @@
1
1
  export type ToolFailureReasonCode =
2
2
  | "target-not-found"
3
+ | "target-is-directory"
3
4
  | "search-target-missing"
4
5
  | "edit-anchor-not-unique"
5
6
  | "edit-anchor-stale"
@@ -28,6 +29,36 @@ function commandFromInput(input: unknown): string {
28
29
  ? (args as { command: string }).command : "";
29
30
  }
30
31
 
32
+ const CONFLICTING_FAILURE = /\b(?:EACCES|EPERM|ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENETUNREACH|EAI_AGAIN|ENOSPC|EMFILE|ENOMEM)\b|permission denied|operation not permitted|timed? out|authentication (?:failed|required)|unauthorized|rate limit|invalid (?:regular expression|regex|pattern|option)|regex parse error|syntax error|unterminated|unclosed|unknown option|^usage:/im;
33
+ const MISSING_TARGET = /\b(?:ENOENT|ENOTDIR)\b|no such file or directory|(?:file|path) (?:does not exist|not found)|not a directory|cannot find the (?:file|path)|no valid search paths given|\bos error 2\b/i;
34
+
35
+ function standaloneSearchWithPartialEvidence(command: string, text: string): boolean {
36
+ const source = command.trim();
37
+ if (!/^(?:rg|grep|git\s+grep)\b/.test(source)) return false;
38
+ // A compound shell can fail for a second reason after a useful search. Do
39
+ // not neutralize its whole result from one missing-path diagnostic.
40
+ if (/[\r\n;<>]|&&|\|\||\$\(|`|(?<!\|)\|(?!\|)/.test(source)) return false;
41
+ if (CONFLICTING_FAILURE.test(text)) return false;
42
+
43
+ let usefulMatches = false;
44
+ let missingTarget = false;
45
+ for (const rawLine of text.split(/\r?\n/)) {
46
+ const line = rawLine.trim();
47
+ if (!line) continue;
48
+ if (!/^\s*(?:rg|grep):/i.test(line) && /^.+?:\d+:/.test(line)) {
49
+ usefulMatches = true;
50
+ continue;
51
+ }
52
+ if (MISSING_TARGET.test(line)) {
53
+ missingTarget = true;
54
+ continue;
55
+ }
56
+ if (/^(?:command|process) exited with (?:code|status) [12]$/i.test(line)) continue;
57
+ return false;
58
+ }
59
+ return usefulMatches && missingTarget;
60
+ }
61
+
31
62
  export function classifyToolFailure(toolName: string, isError: boolean, content: unknown, input?: unknown): ToolFailureReasonCode | null {
32
63
  const text = boundedText(content);
33
64
  const subagent = /(?:^|[._-])subagents?(?:$|[._-])/i.test(toolName);
@@ -53,18 +84,28 @@ export function classifyToolFailure(toolName: string, isError: boolean, content:
53
84
  return "edit-anchor-stale";
54
85
  }
55
86
  }
56
- const readLike = /(?:^|[._-])(?:read|document[_-]?read)(?:$|[._-])/i.test(toolName);
57
- if (readLike && /\bENOENT\b|no such file or directory|file (?:does not exist|not found)|cannot find the (?:file|path)/i.test(text)) {
87
+ const trustedRead = /^(?:read|piagent_document_read)$/i.test(toolName);
88
+ const conflictingFailure = CONFLICTING_FAILURE.test(text);
89
+ if (trustedRead && !conflictingFailure && /\bEISDIR\b|illegal operation on a directory|is a directory/i.test(text)) {
90
+ return "target-is-directory";
91
+ }
92
+ if (trustedRead && !conflictingFailure && /\bENOENT\b|no such file or directory|(?:file|path) (?:does not exist|not found)|cannot find the (?:file|path)/i.test(text)) {
58
93
  return "target-not-found";
59
94
  }
95
+ const structuredSearch = /^(?:grep|find|ls)$/i.test(toolName);
96
+ if (structuredSearch && !conflictingFailure && MISSING_TARGET.test(text)) {
97
+ return "search-target-missing";
98
+ }
60
99
  const shellLike = /^(?:bash|shell|exec|command)$/i.test(toolName);
61
- const searchCommand = /^\s*(?:rg|grep|git\s+grep)\b/.test(commandFromInput(input));
62
- const missingTarget = /no such file or directory|cannot find the (?:file|path)|\bos error 2\b/i.test(text);
63
- const usefulMatches = text.split(/\r?\n/).some((line) => !/^\s*(?:rg|grep):/i.test(line) && /^.+?:\d+:/.test(line));
64
- if (shellLike && searchCommand && missingTarget && usefulMatches) return "search-target-missing";
100
+ if (shellLike && standaloneSearchWithPartialEvidence(commandFromInput(input), text)) return "search-target-missing";
65
101
  return "tool-result-failed";
66
102
  }
67
103
 
68
- export function handledToolFailure(reasonCode: unknown): boolean {
69
- return reasonCode === "search-target-missing";
104
+ export function handledToolFailure(reasonCode: unknown, toolName: unknown): boolean {
105
+ const trustedTool = String(toolName ?? "").toLowerCase();
106
+ if (reasonCode === "target-not-found" || reasonCode === "target-is-directory") {
107
+ return trustedTool === "read" || trustedTool === "piagent_document_read";
108
+ }
109
+ return reasonCode === "search-target-missing"
110
+ && ["grep", "find", "ls", "bash", "shell", "exec", "command"].includes(trustedTool);
70
111
  }