@piagent/platform 1.6.1 → 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 (645) hide show
  1. package/CHANGELOG.md +55 -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/operator-manual-vietnamese.md +12 -12
  175. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  176. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  177. package/docs/piagent-core-improvement-plan.md +528 -0
  178. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  179. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  180. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  181. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  182. package/docs/piagent-open-session-wait.md +19 -0
  183. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  184. package/docs/publishing-for-teams.md +2 -0
  185. package/docs/quality-benchmark.md +128 -8
  186. package/docs/quickstart-vietnamese.md +2 -2
  187. package/docs/release-install-policy.md +32 -9
  188. package/docs/research/harness-next-evidence-review.md +113 -0
  189. package/docs/team-onboarding.md +7 -7
  190. package/docs/third-party-neutrality.md +7 -0
  191. package/docs/usage-observability.md +1 -1
  192. package/docs-site/architecture.html +1 -1
  193. package/docs-site/benchmark.html +1 -1
  194. package/docs-site/commands.html +1 -1
  195. package/docs-site/content/en/runtime.html +1 -1
  196. package/docs-site/content/en/whats-new.html +11 -0
  197. package/docs-site/content/runtime.html +2 -2
  198. package/docs-site/content/whats-new.html +11 -0
  199. package/docs-site/context-engine.html +1 -1
  200. package/docs-site/en/architecture.html +1 -1
  201. package/docs-site/en/benchmark.html +1 -1
  202. package/docs-site/en/commands.html +1 -1
  203. package/docs-site/en/context-engine.html +1 -1
  204. package/docs-site/en/index.html +1 -1
  205. package/docs-site/en/mcp-approval.html +1 -1
  206. package/docs-site/en/mcp-auth.html +1 -1
  207. package/docs-site/en/mcp-servers.html +1 -1
  208. package/docs-site/en/mcp.html +1 -1
  209. package/docs-site/en/permissions.html +1 -1
  210. package/docs-site/en/profiles.html +1 -1
  211. package/docs-site/en/quickstart.html +1 -1
  212. package/docs-site/en/runtime.html +2 -2
  213. package/docs-site/en/scope.html +1 -1
  214. package/docs-site/en/security.html +1 -1
  215. package/docs-site/en/team.html +1 -1
  216. package/docs-site/en/whats-new.html +12 -1
  217. package/docs-site/en/workflows.html +1 -1
  218. package/docs-site/index.html +1 -1
  219. package/docs-site/mcp-approval.html +1 -1
  220. package/docs-site/mcp-auth.html +1 -1
  221. package/docs-site/mcp-servers.html +1 -1
  222. package/docs-site/mcp.html +1 -1
  223. package/docs-site/permissions.html +1 -1
  224. package/docs-site/profiles.html +1 -1
  225. package/docs-site/quickstart.html +1 -1
  226. package/docs-site/runtime.html +3 -3
  227. package/docs-site/scope.html +1 -1
  228. package/docs-site/security.html +1 -1
  229. package/docs-site/team.html +1 -1
  230. package/docs-site/whats-new.html +12 -1
  231. package/docs-site/workflows.html +1 -1
  232. package/evals/architecture-conformance-v1/lane.json +18 -0
  233. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  234. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  235. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  236. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  238. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  240. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  241. package/evals/fixtures/composite-criterion.valid.json +33 -0
  242. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  243. package/evals/fixtures/contract-family-library.valid.json +41 -0
  244. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  245. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  246. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  247. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  248. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  252. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  254. package/evals/fs5-artifact-archive/README.md +32 -0
  255. package/evals/fs5-artifact-archive/manifest.json +148 -0
  256. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  257. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  258. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  259. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  260. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  261. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  262. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  263. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  264. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  265. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  266. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  267. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  268. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  269. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  270. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  271. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  272. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  273. package/evals/fs5-causal-arm.v1.json +9 -5
  274. package/evals/fs5-pilot-protocol.v1.json +1 -1
  275. package/evals/fs5-pilot-protocol.v4.json +4 -4
  276. package/evals/fs5-pilot-protocol.v5.json +6 -5
  277. package/evals/harness-next/development-corpus.mjs +106 -0
  278. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  279. package/evals/harness-next/run-calibration.mjs +83 -0
  280. package/evals/harness-next/run-resource-probe.mjs +55 -0
  281. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  282. package/evals/harness-next.v1.json +51 -0
  283. package/evals/long-horizon-v1/README.md +19 -0
  284. package/evals/long-horizon-v1/runner.mjs +116 -48
  285. package/evals/long-horizon-v1/worker.mjs +77 -30
  286. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  287. package/evals/private-holdout-v1/README.md +5 -2
  288. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  289. package/package.json +9 -4
  290. package/packages/piagent-core/README.md +2 -2
  291. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  292. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  293. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  294. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  295. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  296. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  297. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  298. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  299. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  300. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  301. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  303. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  304. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  305. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  306. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  307. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  309. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  310. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  311. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  312. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  313. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  314. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  315. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  317. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  318. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  319. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  320. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  321. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  322. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  323. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  325. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  326. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  328. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  329. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  330. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  331. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  332. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  334. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  335. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  336. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  337. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  338. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  339. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  340. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  341. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  342. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  343. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  344. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  345. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  346. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  347. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  348. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  349. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  350. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  351. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  352. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  354. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  355. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  356. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  357. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  358. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  359. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  360. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  363. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  364. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  365. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  366. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  368. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  369. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  370. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  371. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  372. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  373. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  393. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  394. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  395. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  396. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  397. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  398. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  400. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  401. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  402. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  405. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  406. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  407. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  408. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  409. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  410. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  411. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  412. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  413. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  414. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  415. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  416. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  417. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  418. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  419. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  421. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  422. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  423. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  424. package/packages/piagent-core/extensions/context-engine.js +11 -6
  425. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  426. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  427. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  428. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  429. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  430. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  431. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  432. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  433. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  434. package/packages/piagent-core/extensions/task-journal.js +48 -3
  435. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  436. package/packages/piagent-core/extensions/task-state.js +74 -38
  437. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  438. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  439. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  440. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  441. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  442. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  443. package/packages/piagent-core/package.json +3 -3
  444. package/packages/piagent-core/policies/base-policy.json +1 -0
  445. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  446. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  447. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  448. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  449. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  450. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  451. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  452. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  453. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  454. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  455. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  457. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  458. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  461. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  462. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  463. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  464. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  465. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  466. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  467. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  468. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  469. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  470. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  471. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  472. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  473. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  474. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  475. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  476. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  477. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  478. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  479. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  480. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  481. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  482. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  483. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  484. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  485. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  486. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  487. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  488. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  489. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  490. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  491. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  492. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  493. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  494. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  495. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  496. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  497. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  498. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  499. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  500. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  501. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  502. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  503. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  504. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  505. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  506. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  507. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  508. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  509. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  510. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  511. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  512. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  513. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  514. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  515. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  516. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  517. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  518. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  519. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  520. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  521. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  522. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  523. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  524. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  525. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  526. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  527. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  528. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  529. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  530. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  531. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  532. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
  533. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  534. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  535. package/packages/piagent-webui/dist/client/index.html +2 -2
  536. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  537. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  538. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  539. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  540. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  541. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  542. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  543. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  544. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  545. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  546. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  547. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  548. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  549. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  550. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  551. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  552. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  553. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  554. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  555. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  556. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  557. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  558. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  559. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  560. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  561. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  562. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  563. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  564. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  565. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  566. package/schemas/approved-host-contracts.schema.json +973 -0
  567. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  568. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  569. package/schemas/composite-criterion.schema.json +788 -0
  570. package/schemas/contract-family-library.schema.json +28 -0
  571. package/schemas/contract-selection-recipe.schema.json +31 -0
  572. package/schemas/failure-evidence.schema.json +2 -2
  573. package/schemas/helper-request.schema.json +16 -4
  574. package/schemas/host-contract-plan.schema.json +25 -0
  575. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  576. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  577. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  578. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  579. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  580. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  581. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  582. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  583. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  584. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  585. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  586. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  587. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  588. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  589. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  590. package/schemas/task-contract.schema.json +30 -0
  591. package/scripts/approve-independent-verification.mjs +57 -0
  592. package/scripts/benchmark-arm-observer.mjs +320 -0
  593. package/scripts/benchmark-budget-ipc.mjs +34 -0
  594. package/scripts/benchmark-budget-launcher.mjs +91 -0
  595. package/scripts/benchmark-budget-processes.mjs +133 -0
  596. package/scripts/benchmark-budget-publication.mjs +228 -0
  597. package/scripts/benchmark-budget-runtime.mjs +136 -0
  598. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  599. package/scripts/benchmark-codex-journey.mjs +406 -0
  600. package/scripts/benchmark-independent-verification.mjs +628 -0
  601. package/scripts/benchmark-journey-outcome.mjs +92 -0
  602. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  603. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  604. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  605. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  606. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  607. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  608. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  609. package/scripts/benchmark-runner-completion.mjs +133 -0
  610. package/scripts/benchmark-runner-configuration.mjs +159 -0
  611. package/scripts/benchmark-runner-core.mjs +217 -388
  612. package/scripts/benchmark-runner-finalization.mjs +140 -27
  613. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  614. package/scripts/benchmark-runner-schedule.mjs +256 -0
  615. package/scripts/benchmark-runner-support.mjs +136 -4
  616. package/scripts/benchmark-runner.mjs +95 -18
  617. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  618. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  619. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  620. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  621. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  622. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  623. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  624. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  625. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  626. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  627. package/scripts/benchmark-session-evaluator.mjs +169 -0
  628. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  629. package/scripts/benchmark-session-usage.mjs +28 -0
  630. package/scripts/benchmark-session.mjs +343 -50
  631. package/scripts/benchmark-webui-journey.mjs +678 -0
  632. package/scripts/check-public-wording.mjs +46 -0
  633. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  634. package/scripts/phase-tools-evaluation.mjs +1 -0
  635. package/scripts/pi-auto.sh +7 -1
  636. package/scripts/pi-usage-history.mjs +201 -11
  637. package/scripts/piagent-cli.mjs +8 -0
  638. package/scripts/private-holdout-readiness.mjs +7 -1
  639. package/scripts/public-evaluation-exposure.mjs +140 -0
  640. package/scripts/select-independent-verification.mjs +62 -0
  641. package/scripts/typescript-loader.mjs +135 -1
  642. package/scripts/update-global.mjs +6 -7
  643. package/scripts/verify-local.sh +36 -55
  644. package/scripts/verify-release-identity.mjs +5 -3
  645. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -1,46 +1,15 @@
1
1
  import type { FailureClassification } from "../../extensions/failure-types.ts";
2
2
  import { failureClassificationValidationErrors } from "../../extensions/failure-types.ts";
3
+ import {
4
+ RECOVERY_ACTIONS, RECOVERY_CEILINGS, RECOVERY_POLICY_VERSION, RECOVERY_REASON_CODES, recoveryDecisionValidationErrors
5
+ } from "../../extensions/recovery-decision-validation.ts";
3
6
  import type { TrajectoryPhase } from "../trajectory/trajectory-types.ts";
4
7
 
5
- export const RECOVERY_POLICY_VERSION = "recovery-v1" as const;
6
- export const RECOVERY_ACTIONS = Object.freeze(["repair", "retry", "fresh-session", "ask-operator", "handoff", "blocked"] as const);
7
- export const RECOVERY_CEILINGS = Object.freeze({
8
- sourceRepairPasses: 1,
9
- transientVerifierRetries: 1,
10
- unknownDiagnosticPasses: 1,
11
- providerRetries: 1
12
- } as const);
8
+ export { RECOVERY_ACTIONS, RECOVERY_CEILINGS, RECOVERY_POLICY_VERSION, RECOVERY_REASON_CODES, recoveryDecisionValidationErrors };
13
9
 
14
10
  export type RecoveryAction = typeof RECOVERY_ACTIONS[number];
15
11
  export type RecoveryDisposition = "scheduled" | "failed" | "succeeded" | "declined";
16
- export type RecoveryReasonCode =
17
- | "feature-disabled"
18
- | "invalid-input"
19
- | "terminal-phase"
20
- | "handoff-already-observed"
21
- | "no-failure"
22
- | "stale-verifier-evidence"
23
- | "source-repair-eligible"
24
- | "dependency-mutation-not-authorized"
25
- | "read-only-task"
26
- | "repair-ceiling-reached"
27
- | "repeated-hypothesis"
28
- | "operator-environment-action"
29
- | "provider-transient-retry"
30
- | "provider-retry-exhausted"
31
- | "permission-expansion-forbidden"
32
- | "protected-path-forbidden"
33
- // Legacy persisted recovery records may still carry this value. New runtime
34
- // decisions never emit it because task scope is advisory.
35
- | "scope-replan-required"
36
- | "transient-verifier-retry"
37
- | "transient-retry-unavailable"
38
- | "unknown-diagnostic-pass"
39
- | "unknown-diagnostic-exhausted"
40
- | "global-continuation-budget-exhausted"
41
- | "repeated-progress-signature"
42
- | "continuation-journal-unavailable"
43
- | "manual-lifecycle-handoff";
12
+ export type RecoveryReasonCode = typeof RECOVERY_REASON_CODES[number];
44
13
 
45
14
  export type RecoveryHistoryEntry = {
46
15
  taskId: string;
@@ -71,6 +40,7 @@ export type RecoveryPolicyInput = {
71
40
  exactVerifierAvailable?: boolean;
72
41
  currentTreeMatchesEvidence?: boolean;
73
42
  dependencyMutationAuthorized?: boolean;
43
+ independentDisposition?: "cancelled" | "reconcile" | "unsupported" | "halt" | "approval";
74
44
  };
75
45
 
76
46
  export type RecoveryDecision = {
@@ -96,10 +66,20 @@ export type RecoveryDecision = {
96
66
  hypothesisRef: string | null;
97
67
  };
98
68
 
99
- const HASH = /^[a-f0-9]{64}$/;
100
69
  const REF = /^[a-z0-9][a-z0-9:._-]{0,255}$/i;
101
70
  const COUNTED_DISPOSITIONS = new Set<RecoveryDisposition>(["scheduled", "failed", "succeeded"]);
102
71
 
72
+ export function applyProofCapabilityHandoff(selected: RecoveryDecision, missing: string[] = [], hasIndependentRecovery = false): RecoveryDecision {
73
+ let reason: RecoveryReasonCode | undefined;
74
+ if (selected.failureCategory === "unknown" && !hasIndependentRecovery && selected.action !== "blocked"
75
+ && missing.some(item => /^critical acceptance evidence independent-required\b/i.test(item))) reason = "independent-acceptance-proof-required";
76
+ else if (selected.failureCategory === "unknown" && !hasIndependentRecovery && selected.action !== "blocked"
77
+ && missing.some(item => /^critical acceptance evidence source-proof-required\b/i.test(item))) reason = "source-acceptance-proof-required";
78
+ else if (missing.some(item => /^critical acceptance evidence adapter-unresolved\b/i.test(item))) reason = "deterministic-adapter-proof-required";
79
+ return reason ? { ...selected, action: "handoff", continuation: "none", nextPhase: null,
80
+ sourceMutationAllowed: false, reasonCodes: [reason] } : selected;
81
+ }
82
+
103
83
  function validIdentity(input: RecoveryPolicyInput): boolean {
104
84
  return Boolean(
105
85
  input.task?.taskId?.trim()
@@ -181,8 +161,7 @@ function repairDecision(input: RecoveryPolicyInput): RecoveryDecision {
181
161
  }
182
162
 
183
163
  export function selectRecoveryDecision(input: RecoveryPolicyInput): RecoveryDecision {
184
- const invalidClassification = failureClassificationValidationErrors(input.classification).length > 0
185
- || !HASH.test(String(input.classification?.evidenceDigest ?? ""));
164
+ const invalidClassification = failureClassificationValidationErrors(input.classification).length > 0;
186
165
  if (!validIdentity(input) || invalidClassification) return decision(input, "blocked", ["invalid-input"]);
187
166
  if (!input.featureEnabled) return decision(input, "handoff", ["feature-disabled"]);
188
167
  if (input.currentPhase === "terminal") return decision(input, "blocked", ["terminal-phase"]);
@@ -194,6 +173,15 @@ export function selectRecoveryDecision(input: RecoveryPolicyInput): RecoveryDeci
194
173
  if (input.classification.category === "scope-protected-path") {
195
174
  return decision(input, "handoff", ["protected-path-forbidden"]);
196
175
  }
176
+ const independentCategories = { cancelled: "unknown", reconcile: "environment", unsupported: "unknown", halt: "unknown", approval: "environment" };
177
+ if (input.independentDisposition !== undefined && (typeof input.independentDisposition !== "string"
178
+ || !Object.hasOwn(independentCategories, input.independentDisposition)
179
+ || independentCategories[input.independentDisposition] !== input.classification.category)) return decision(input, "blocked", ["invalid-input"]);
180
+ if (input.independentDisposition === "cancelled") return decision(input, "handoff", ["independent-execution-cancelled"]);
181
+ if (input.independentDisposition === "reconcile") return decision(input, "ask-operator", ["independent-execution-reconciliation-required"], { continuation: "operator" });
182
+ if (input.independentDisposition === "unsupported") return decision(input, "handoff", ["independent-verifier-unsupported"]);
183
+ if (input.independentDisposition === "halt") return decision(input, "handoff", ["independent-verification-halted"]);
184
+ if (input.independentDisposition === "approval") return decision(input, "ask-operator", ["operator-environment-action"], { continuation: "operator" });
197
185
 
198
186
  const counts = countsFor(input);
199
187
  if (input.currentTreeMatchesEvidence === false && input.exactVerifierAvailable === true) {
@@ -1,4 +1,5 @@
1
1
  import path from "node:path";
2
+ import { currentWorkspaceRevisionDigest } from "../../extensions/workspace-revision.js";
2
3
 
3
4
  import type { TaskContract } from "../../extensions/guard-types.ts";
4
5
  import { allVerifyCommandsPassCurrentTree } from "../../extensions/task-contract-view.js";
@@ -7,7 +8,7 @@ import { taskDigestMigrationArchiveStatus, workingTreeSnapshot, workingTreeSnaps
7
8
  import { workingTreeEvidenceDigest } from "../../extensions/task-lifecycle.js";
8
9
  import { hashEvidenceCommand } from "../../extensions/runtime-evidence.js";
9
10
  import { WORKING_TREE_DIGEST_ALGORITHM, isCurrentWorkingTreeDigest, workingTreeSnapshotUsesCurrentAlgorithm } from "../../extensions/working-tree-digest.js";
10
- import { handoffProjectionPath, readHandoffProjection } from "./handoff-projection.ts";
11
+ import { handoffIdentityMatchesTask, handoffProjectionPath, readHandoffProjection } from "./handoff-projection.ts";
11
12
  import { inspectTaskAuthorityResumePolicy, type AuthorityResumeDecision } from "../policy/authority-resume-policy.ts";
12
13
  import { presentedAcceptanceCriteria, presentedCriterionGraphGuidance } from "../session/task-contract-presentation.ts";
13
14
  import { operatorRequestCarryLines } from "../session/operator-request-carry.ts";
@@ -312,6 +313,7 @@ export function inspectTaskResumeState(
312
313
  options: { protectedPaths?: string[] } = {}
313
314
  ): ResumeState {
314
315
  const currentTreeDigest = workingTreeEvidenceDigest(currentDigests);
316
+ const workspaceRevisionDigest = currentWorkspaceRevisionDigest(cwd);
315
317
  const authorityPolicy = inspectTaskAuthorityResumePolicy(cwd, task);
316
318
  const archive = taskDigestMigrationArchiveStatus(cwd, task);
317
319
  const legacyTruthOverflow = task.trace.outcome === "pending" && legacyTaskTruthOverflowsAutomaticResume(task);
@@ -328,7 +330,7 @@ export function inspectTaskResumeState(
328
330
  try {
329
331
  const handoff = readHandoffProjection(cwd, task.taskRunId);
330
332
  handoffExists = Boolean(handoff);
331
- if (handoff && (handoff.identity.taskId !== task.taskId || handoff.identity.taskRunId !== task.taskRunId)) {
333
+ if (handoff && !handoffIdentityMatchesTask(handoff.identity, task)) {
332
334
  handoffValid = false;
333
335
  warnings.push("handoff identity conflicts with the task contract");
334
336
  }
@@ -337,13 +339,14 @@ export function inspectTaskResumeState(
337
339
  warnings.push(`handoff projection is invalid: ${error instanceof Error ? error.message : String(error)}`);
338
340
  }
339
341
  const passingEvidence = task.verifyEvidence.filter((evidence) => evidence.observed === true && evidence.matchedProfileCommand === true && evidence.exitCode === 0);
340
- const invalidatedVerifierCommands = strings(passingEvidence.filter((evidence) => !isCurrentWorkingTreeDigest(evidence.workingTreeDigest) || evidence.workingTreeDigest !== currentTreeDigest).map((evidence) => evidence.command), 50);
341
- const verifierEvidenceCurrent = algorithmReady && !refreshRequired && (task.changeMode === "read-only" || allVerifyCommandsPassCurrentTree(task, currentTreeDigest));
342
+ const invalidatedVerifierCommands = strings(passingEvidence.filter((evidence) => !isCurrentWorkingTreeDigest(evidence.workingTreeDigest) || evidence.workingTreeDigest !== currentTreeDigest
343
+ || !workspaceRevisionDigest || evidence.preWorkspaceRevisionDigest !== workspaceRevisionDigest || evidence.workspaceRevisionDigest !== workspaceRevisionDigest).map((evidence) => evidence.command), 50);
344
+ const verifierEvidenceCurrent = algorithmReady && !refreshRequired && (task.changeMode === "read-only" || allVerifyCommandsPassCurrentTree(task, currentTreeDigest, workspaceRevisionDigest));
342
345
  const staleVerifierEvidence = refreshRequired || (invalidatedVerifierCommands.length > 0 && !verifierEvidenceCurrent);
343
346
  const invalidatedFiles = staleVerifierEvidence
344
347
  ? staleVerifierFiles(cwd, task, passingEvidence, currentDigests, currentTreeDigest, options.protectedPaths ?? null)
345
348
  : { files: [], known: true };
346
- if (staleVerifierEvidence) warnings.push("working tree changed after the latest passing verifier; prior evidence is stale");
349
+ if (staleVerifierEvidence) warnings.push("working tree or workspace baseline changed, or the prior verifier lacks baseline binding; prior evidence is stale");
347
350
  const latest = journal.checkpoints.at(-1);
348
351
  const latestCheckpoint = latest ? {
349
352
  checkpointId: String(latest.checkpointId ?? "checkpoint"),
@@ -143,7 +143,8 @@ export function registerActivityInspector(pi: ExtensionAPI, dependencies: Inspec
143
143
  runtimeInstanceId: WEBUI_RUNTIME_INSTANCE_REF,
144
144
  eventCursor: events.currentCursor(),
145
145
  resyncRequired: events.resyncRequired(),
146
- eventReplay: events.retention()
146
+ eventReplay: events.retention(),
147
+ operationLiveness: typeof ctx.isIdle === "function" ? ctx.isIdle() ? "idle" : "running" : "unknown"
147
148
  });
148
149
  cached.set(key, { at: Date.now(), view });
149
150
  return view;
@@ -1,8 +1,15 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
2
  import { stageContextDelivery } from "../context/context-delivery.ts";
3
3
  import { semanticCompactionCancelled } from "../session/system-prompt.ts";
4
+ import { WORKFLOW_IDS, resolveWorkflowId, type WorkflowId } from "../workflows/webui-workflow.ts";
4
5
 
5
6
  type ExtensionContext = any;
7
+ const WORKFLOW_USAGE = WORKFLOW_IDS.join("|");
8
+
9
+ export function parsePreflightWorkflow(raw: string): WorkflowId {
10
+ const first = String(raw ?? "").trim().split(/\s+/)[0];
11
+ return resolveWorkflowId(first) ?? "task";
12
+ }
6
13
 
7
14
  export function registerContextCommands(pi: ExtensionAPI, deps: Record<string, any>): any {
8
15
  const {
@@ -226,14 +233,11 @@ export function registerContextCommands(pi: ExtensionAPI, deps: Record<string, a
226
233
  `lowConfidencePacks: ${report.metrics.lowConfidencePacks}/${report.sample.contextPacks}`,
227
234
  `editRecovery: ${report.metrics.editRecoveryContextCount}/${report.metrics.editRecoveryFailures} failures returned context; ${report.metrics.editRecoverySuppressedFailures} suppressed; ${report.metrics.editRecoveryEstimatedTokens} estimated tokens; classification coverage ${formatPercent(report.metrics.editRecoveryFailureEvidenceCoverage)}`,
228
235
  `taskEfficiency: ${taskEfficiency ? `${taskEfficiency.solver.route}; verify=${taskEfficiency.verification.attempts}; outcome=${taskEfficiency.outcome.task}` : "no active task"}`,
236
+ ...(taskEfficiency ? [`taskUsage: ${taskEfficiency.usageAccounting.status}; observed SDK tokens=${formatCount(taskEfficiency.exactUsage.tokens)}; billed cost=unknown; requests=${taskEfficiency.usageAccounting.requests}`] : []),
229
237
  ...report.recommendations.map((recommendation) => `- ${recommendation}`)
230
238
  ].join("\n"), { ...report, taskEfficiency });
231
239
  }
232
240
 
233
- function parsePreflightWorkflow(raw: string): string {
234
- return raw.match(/\b(?:scout|be-to-fe|review|plan|platform-improve|task)\b/i)?.[0]?.toLowerCase() ?? "task";
235
- }
236
-
237
241
  function compactCurrentSession(ctx: ExtensionContext): void {
238
242
  const sessionId = ctx.sessionManager.getSessionId();
239
243
  const instructions = semanticCompactionInstructions(ctx.cwd, sessionId);
@@ -328,8 +332,8 @@ export function registerContextCommands(pi: ExtensionAPI, deps: Record<string, a
328
332
  "pack: /context pack <task or symbol>",
329
333
  "impact: /context impact [changed files]",
330
334
  "efficiency: /context efficiency",
331
- "preflight: /context preflight [task|scout|be-to-fe|review|plan]",
332
- "compact: /context compact [task|scout|be-to-fe]",
335
+ `preflight: /context preflight [${WORKFLOW_USAGE}]`,
336
+ `compact: /context compact [${WORKFLOW_USAGE}]`,
333
337
  "legacy: /piagent-context | /context-index | /task-preflight"
334
338
  ].join("\n"));
335
339
  return;
@@ -380,8 +384,8 @@ export function registerContextCommands(pi: ExtensionAPI, deps: Record<string, a
380
384
  "pack: /context pack <task or symbol>",
381
385
  "impact: /context impact [changed files]",
382
386
  "efficiency: /context efficiency",
383
- "preflight: /context preflight [task|scout|be-to-fe|review|plan]",
384
- "compact: /context compact [task|scout|be-to-fe]",
387
+ `preflight: /context preflight [${WORKFLOW_USAGE}]`,
388
+ `compact: /context compact [${WORKFLOW_USAGE}]`,
385
389
  "legacy: /piagent-context | /context-index | /task-preflight"
386
390
  ].join("\n"));
387
391
  return;
@@ -1,3 +1,5 @@
1
+ import { WORKFLOW_IDS, WORKFLOW_OPTIONS } from "../workflows/webui-workflow.ts";
2
+
1
3
  export const WORKFLOW_COMMAND_EXCLUSIONS = Object.freeze([
2
4
  "implement",
3
5
  "audit",
@@ -15,16 +17,9 @@ export const ONBOARDING_COMMAND_ACTIONS = Object.freeze([
15
17
  "help"
16
18
  ]);
17
19
 
18
- export const FRESH_COMMAND_ACTIONS = Object.freeze([
19
- "task",
20
- "scout",
21
- "be-to-fe",
22
- "help"
23
- ]);
20
+ export const FRESH_COMMAND_ACTIONS = Object.freeze([...WORKFLOW_IDS, "help"]);
24
21
 
25
22
  export const FRESH_COMMAND_HELP = Object.freeze([
26
23
  "namespace: /fresh",
27
- "/fresh task <request>",
28
- "/fresh scout <read-only request>",
29
- "/fresh be-to-fe <BE spec/change + FE outcome>"
24
+ ...WORKFLOW_OPTIONS.map((option) => `/fresh ${option.id} ${option.argumentHint}`)
30
25
  ]);
@@ -1,11 +1,12 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
2
  import { stageContextDelivery } from "../context/context-delivery.ts";
3
3
  import { formatContextEfficiencyReport } from "../context/context-efficiency-format.ts";
4
+ import { WORKFLOW_IDS } from "../workflows/webui-workflow.ts";
5
+ import { registerSessionWaitTool } from "./session-wait-tool.ts";
4
6
 
5
7
  type PiagentToolGroup = any;
6
8
  type TechStackManifest = any;
7
9
 
8
-
9
10
  export function registerPolicyTools(pi: ExtensionAPI, deps: Record<string, any>): void {
10
11
  const {
11
12
  PIAGENT_TOOL_NAMES, READ_ONLY_TOOL_NAMES, StringEnum, Type, activateToolGroups, activeSessionTask,
@@ -20,6 +21,7 @@ export function registerPolicyTools(pi: ExtensionAPI, deps: Record<string, any>)
20
21
  resolvePermissionProfile, resolveRuntimePolicy, retrievalKey, runtimeState, searchContextIndexV2,
21
22
  techStackPath, telemetry, toolRegistryConfig, verifierCommandInstructions
22
23
  } = deps;
24
+ registerSessionWaitTool(pi, Type);
23
25
  registerPiagentTool(pi, {
24
26
  name: "piagent_tools",
25
27
  label: "Piagent Tool Loader",
@@ -30,7 +32,7 @@ export function registerPolicyTools(pi: ExtensionAPI, deps: Record<string, any>)
30
32
  "When recovery is necessary, load only the smallest group that resolves the reported missing evidence."
31
33
  ],
32
34
  parameters: Type.Object({
33
- groups: Type.Array(StringEnum(["intake", "governance", "task", "recovery", "policy", "retrieval", "source", "knowledge", "onboarding", "usage"] as const), { minItems: 1 })
35
+ groups: Type.Array(StringEnum(["intake", "governance", "task", "waiting", "recovery", "policy", "retrieval", "source", "knowledge", "onboarding", "usage"] as const), { minItems: 1 })
34
36
  }),
35
37
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
36
38
  const groups = [...new Set(params.groups)] as PiagentToolGroup[];
@@ -481,7 +483,7 @@ export function registerPolicyTools(pi: ExtensionAPI, deps: Record<string, any>)
481
483
  "Do not paste mandatory-flow boilerplate into the task request; use platform workflow commands instead."
482
484
  ],
483
485
  parameters: Type.Object({
484
- workflow: Type.Optional(StringEnum(["task", "scout", "be-to-fe", "review", "plan", "platform-improve"] as const)),
486
+ workflow: Type.Optional(StringEnum(WORKFLOW_IDS)),
485
487
  inputChars: Type.Optional(Type.Number({ minimum: 0 }))
486
488
  }),
487
489
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
@@ -1,7 +1,9 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { WORKFLOW_IDS, resolveWorkflowId } from "../workflows/webui-workflow.ts";
2
3
 
3
4
  type ExtensionContext = any;
4
5
  type TaskContract = any;
6
+ const WORKFLOW_USAGE = WORKFLOW_IDS.join("|");
5
7
 
6
8
  export function registerSessionCommands(pi: ExtensionAPI, deps: Record<string, any>): any {
7
9
  const {
@@ -89,8 +91,8 @@ export function registerSessionCommands(pi: ExtensionAPI, deps: Record<string, a
89
91
  "namespace: /usage",
90
92
  "live: /usage live",
91
93
  "history: /usage history",
92
- "preflight: /usage preflight [task|scout|be-to-fe]",
93
- "compact: /usage compact [task|scout|be-to-fe]",
94
+ `preflight: /usage preflight [${WORKFLOW_USAGE}]`,
95
+ `compact: /usage compact [${WORKFLOW_USAGE}]`,
94
96
  "logs: /usage logs",
95
97
  "efficiency: /usage efficiency",
96
98
  "native exact session: /session",
@@ -186,8 +188,7 @@ export function registerSessionCommands(pi: ExtensionAPI, deps: Record<string, a
186
188
  { value: "current", label: "Current session", description: "Name, id, file, model", recommended: true },
187
189
  { value: "name", label: "Set name", description: "Use Pi native /name <task name>" },
188
190
  { value: "resume", label: "Resume help", description: "Commands for continuing old sessions" },
189
- { value: "fresh-task", label: "Fresh task", description: "Use /fresh task <request>" },
190
- { value: "fresh-scout", label: "Fresh scout", description: "Use /fresh scout <request>" },
191
+ { value: "fresh", label: "Fresh workflow", description: "Use /fresh <workflow> <request>" },
191
192
  { value: "usage", label: "Usage", description: "Current context/session usage" },
192
193
  { value: "help", label: "Help", description: "Show typed forms" }
193
194
  ], "current");
@@ -207,7 +208,7 @@ export function registerSessionCommands(pi: ExtensionAPI, deps: Record<string, a
207
208
  "session helpers:",
208
209
  "current: /usage live or Pi native /session",
209
210
  "name: Pi native /name <task/session name>",
210
- "fresh: /fresh task|scout|be-to-fe <request>",
211
+ `fresh: /fresh ${WORKFLOW_USAGE} <request>`,
211
212
  "resume: Pi native /resume or /session",
212
213
  "legacy: /piagent-session | /setname | /fresh-task | /fresh-scout | /fresh-be-to-fe"
213
214
  ].join("\n"));
@@ -231,8 +232,9 @@ export function registerSessionCommands(pi: ExtensionAPI, deps: Record<string, a
231
232
  }
232
233
  if (["fresh", "new"].includes(action)) {
233
234
  const next = commandArgs(rest);
234
- const workflow = next.action === "be-to-fe" ? "be-to-fe" : next.action === "scout" ? "scout" : "task";
235
- await startFreshWorkflow(workflow, next.rest, ctx);
235
+ const workflow = resolveWorkflowId(next.action);
236
+ const request = workflow ? next.rest : [next.action, next.rest].filter(Boolean).join(" ");
237
+ await startFreshWorkflow(workflow ?? "task", request, ctx);
236
238
  return;
237
239
  }
238
240
  if (["fresh-task", "task"].includes(action)) {
@@ -0,0 +1,54 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import { registerPiagentTool } from "./extension-registration.ts";
3
+ import { MAX_SESSION_WAIT_SECONDS, SESSION_WAIT_ENTRY, SessionWaitRuntime } from "../tools/session-wait.ts";
4
+
5
+ /** Reuse the host session journal; pending waits never schedule work on resume. */
6
+ export function registerSessionWaitTool(pi: ExtensionAPI, Type: any): void {
7
+ const waits = new SessionWaitRuntime();
8
+ const key = (ctx: ExtensionContext) => `${ctx.cwd}\0${ctx.sessionManager.getSessionId()}`;
9
+ for (const event of ["session_before_switch", "session_before_fork", "session_before_tree", "session_shutdown"] as const) {
10
+ pi.on(event, async (_event: unknown, ctx: ExtensionContext) => { waits.interrupt(key(ctx)); });
11
+ }
12
+ registerPiagentTool(pi, {
13
+ name: "piagent_wait",
14
+ label: "Wait until the next check",
15
+ description: "Wait 1–3600 seconds within this open session without polling or calling a model. Use when the next useful check is later. No background scheduling, condition monitoring, command execution, or completion evidence. Cancel to interrupt.",
16
+ promptSnippet: "For a future check, wait once until it is useful; avoid repeated unchanged status checks.",
17
+ promptGuidelines: [
18
+ "Use a process/event wait tool when it can wake on completion; otherwise choose the next useful check time within the task deadline. Call this tool alone so cancellation can stop its batch.",
19
+ "Do independent work first. Keep the next check explicit; waiting never completes a task or proves an external action succeeded.",
20
+ "This requires an open running session. After interruption or restart, reconcile pending work before deciding to wait again; never replay uncertain external actions."
21
+ ],
22
+ parameters: Type.Object({
23
+ seconds: Type.Number({ minimum: 1, maximum: MAX_SESSION_WAIT_SECONDS, multipleOf: 1 }),
24
+ nextCheck: Type.String({ minLength: 1, maxLength: 240, description: "The specific observation to make when the wait ends, not a command to execute automatically." })
25
+ }),
26
+ async execute(toolCallId: string, params: { seconds: number; nextCheck: string }, signal: AbortSignal | undefined,
27
+ _onUpdate: unknown, ctx: ExtensionContext) {
28
+ if (!Number.isInteger(params.seconds) || params.seconds < 1 || params.seconds > MAX_SESSION_WAIT_SECONDS
29
+ || typeof params.nextCheck !== "string" || !params.nextCheck.trim() || params.nextCheck.length > 240) {
30
+ throw new Error("Use a bounded wait of 1–3600 seconds and a nonempty next check of at most 240 characters.");
31
+ }
32
+ const sessionId = ctx.sessionManager.getSessionId();
33
+ const prior = ctx.sessionManager.getBranch().some((entry: any) => entry.type === "custom"
34
+ && entry.customType === SESSION_WAIT_ENTRY && entry.data?.toolCallId === toolCallId);
35
+ if (prior) throw new Error("This wait call is already journaled. Reconcile its result; do not replay it after resume.");
36
+ if (signal?.aborted) throw new Error("Wait interrupted before starting; no follow-up was scheduled.");
37
+ const startedAt = new Date().toISOString();
38
+ const identity = { toolCallId, sessionId, startedAt, seconds: params.seconds };
39
+ pi.appendEntry(SESSION_WAIT_ENTRY, { ...identity, outcome: "pending" });
40
+ const result = await waits.wait(key(ctx), params.seconds, signal);
41
+ // Never append a receipt to a different session after a switch.
42
+ if (ctx.sessionManager.getSessionId() === sessionId) {
43
+ pi.appendEntry(SESSION_WAIT_ENTRY, { ...identity, ...result });
44
+ }
45
+ return {
46
+ terminate: result.outcome === "interrupted",
47
+ content: [{ type: "text", text: result.outcome === "elapsed"
48
+ ? `Wait elapsed. Next check: ${params.nextCheck}. No condition was checked; task completion and external outcomes remain unverified.`
49
+ : `Wait interrupted. Pending next check: ${params.nextCheck}. No follow-up was scheduled; reconcile current state before continuing.` }],
50
+ details: { ...identity, ...result, conditionChecked: false, followUpScheduled: false }
51
+ };
52
+ }
53
+ });
54
+ }
@@ -1,4 +1,8 @@
1
+ import { retainFocusedVerification } from "../../extensions/acceptance-focused-verification.js";
1
2
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+ import { completionPreparationCurrent } from "../verification/completion-preparation.ts";
4
+ import { apiBaselineCriterionEvidence as apiBaselineEvidence } from "../verification/acceptance-api-baseline.js";
5
+ import { currentWorkspaceRevisionDigest } from "../../extensions/workspace-revision.js";
2
6
  import { durableContextEvidenceEntries, isRuntimeOwnedContextEvidenceEntry } from "../../extensions/context-evidence.js";
3
7
  import { mergeObservedTaskContext } from "../../extensions/task-contract-view.js";
4
8
  import { buildHandoffProjection, writeHandoffProjection } from "../recovery/handoff-projection.ts";
@@ -20,7 +24,7 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
20
24
  compactTaskDetails, contextBudgetConfig, evaluateTaskGate, findMatchingObservedBashResult, loadProfileFromContext,
21
25
  normalizeRelative, nowIso, observedBashLedgerPath, policy, readObservedBashResults,
22
26
  readTask, recordCompletionAudit, recordVerificationCheckpoint, redactForStorage, redactText, runtimeState,
23
- refreshAcceptanceReceipt, registerPiagentTool, resolveRuntimePolicy, runtimeLifecycleMode, semanticRepairCompletionBlock, taskChangedFileEvidence,
27
+ refreshAcceptanceReceipt, registerPiagentTool, resolveRuntimePolicy, runtimeLifecycleMode, semanticRepairCompletionBlock, taskAcceptanceEvidenceFiles, taskChangedFileEvidence,
24
28
  uniqueStrings, verifierCommandInstructions, workingTreeEvidenceDigest, workingTreeSnapshot, writeTask
25
29
  } = deps;
26
30
  registerPiagentTool(pi, {
@@ -174,16 +178,19 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
174
178
  matchedProfileCommand,
175
179
  workingTreeDigest
176
180
  });
177
- task.verifyEvidence = task.verifyEvidence.slice(-100);
181
+ task.verifyEvidence = policy?.finalGate?.acceptanceProofMode === "diagnostic"
182
+ ? retainFocusedVerification(task.verifyEvidence, workingTreeDigest, currentWorkspaceRevisionDigest(ctx.cwd))
183
+ : task.verifyEvidence.slice(-100);
178
184
  }
179
- const hasChanges = taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected.length > 0;
180
- const allPassing = matchedProfileCommand && hasChanges && allVerifyCommandsPassCurrentTree(task, workingTreeDigest);
181
- if (matchedProfileCommand && hasChanges) {
185
+ const taskLocalDelta = taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected;
186
+ const verificationCanSettleSourceTask = taskLocalDelta.length > 0 || task.mutationPolicy === "allowed";
187
+ const allPassing = matchedProfileCommand && verificationCanSettleSourceTask && allVerifyCommandsPassCurrentTree(task, workingTreeDigest, currentWorkspaceRevisionDigest(ctx.cwd));
188
+ if (matchedProfileCommand && verificationCanSettleSourceTask) {
182
189
  applyRuntimeLifecycleObservation(task, allPassing ? "verification-complete" : "verification-pending", nowIso());
183
190
  }
184
191
  const acceptance = refreshAcceptanceReceipt(task, {
185
- cwd: ctx.cwd,
186
- changedFiles: taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected,
192
+ cwd: ctx.cwd, apiBaselineEvidence,
193
+ changedFiles: taskAcceptanceEvidenceFiles(ctx.cwd, task, currentDigests, taskLocalDelta),
187
194
  currentWorkingTreeDigest: workingTreeDigest
188
195
  });
189
196
  task.acceptanceReceipt = acceptance.task.acceptanceReceipt;
@@ -304,6 +311,9 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
304
311
  isError: true
305
312
  };
306
313
  }
314
+ if (params.outcome === "completed" && !completionPreparationCurrent(await deps.prepareIndependentAcceptance?.(ctx, task))) {
315
+ return { content: [{ type: "text", text: "Trace refused: independent verification stopped with the session." }], isError: true };
316
+ }
307
317
  const finalFileDigests = workingTreeSnapshot(ctx.cwd) as Record<string, string>;
308
318
  let nextTask: TaskContract = {
309
319
  ...task,
@@ -321,8 +331,8 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
321
331
  }
322
332
  };
323
333
  nextTask = refreshAcceptanceReceipt(nextTask, {
324
- cwd: ctx.cwd,
325
- changedFiles: nextTask.changedFiles,
334
+ cwd: ctx.cwd, apiBaselineEvidence,
335
+ changedFiles: taskAcceptanceEvidenceFiles(ctx.cwd, nextTask, finalFileDigests, nextTask.changedFiles),
326
336
  currentWorkingTreeDigest: workingTreeEvidenceDigest(finalFileDigests)
327
337
  }).task as TaskContract;
328
338
  let gate = evaluateTaskGate(ctx.cwd, nextTask, policy, {
@@ -334,7 +344,7 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
334
344
  ? semanticRepairCompletionBlock?.(ctx.cwd, nextTask.taskRunId)
335
345
  : undefined;
336
346
  if (semanticBlock) gate = { ...gate, decision: "fail", missing: [...new Set([...gate.missing, semanticBlock])] };
337
- if (params.outcome === "completed" && (semanticBlock || (runtime.finalGate === "enforce" && gate.decision === "fail"))) {
347
+ if (params.outcome === "completed" && (semanticBlock || ((runtime.finalGate === "enforce" || gate.acceptanceProof?.mode === "diagnostic") && gate.decision === "fail"))) {
338
348
  const blockedTrace = {
339
349
  taskId: nextTask.taskId,
340
350
  taskRunId: nextTask.taskRunId,
@@ -371,6 +381,10 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
371
381
  };
372
382
  }
373
383
 
384
+ if (gate.acceptanceProof?.mode === "diagnostic" && gate.acceptanceProof.pendingCriterionIds.length > 0) {
385
+ nextTask.trace.notes = [nextTask.trace.notes,
386
+ `Diagnostic acceptance: ${gate.acceptanceProof.pendingCriterionIds.length} criteria remain unproved; no quality claim.`].filter(Boolean).join("\n");
387
+ }
374
388
  let handoffPreview: any;
375
389
  try {
376
390
  handoffPreview = buildHandoffProjection(ctx.cwd, nextTask, {
@@ -398,6 +412,7 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
398
412
  taskRunId: nextTask.taskRunId,
399
413
  sessionId: nextTask.sessionId,
400
414
  event: "trace_record",
415
+ ...(gate.acceptanceProof?.mode === "diagnostic" ? { acceptanceProof: gate.acceptanceProof } : {}),
401
416
  outcome: params.outcome,
402
417
  changedFiles: nextTask.changedFiles,
403
418
  friction: nextTask.trace.friction,
@@ -412,6 +427,7 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
412
427
  phase: params.failedAt ?? "review",
413
428
  evidence: {
414
429
  outcome: params.outcome,
430
+ ...(gate.acceptanceProof?.mode === "diagnostic" ? { acceptanceProof: gate.acceptanceProof } : {}),
415
431
  changedFiles: written.changedFiles,
416
432
  failedAt: written.failedAt,
417
433
  ruledOut: written.ruledOut
@@ -428,7 +444,7 @@ export function registerTaskCompletionTools(pi: ExtensionAPI, deps: Record<strin
428
444
  }
429
445
 
430
446
  return {
431
- content: [{ type: "text", text: `Trace recorded for ${nextTask.taskId}: ${params.outcome}${gate.decision === "fail" ? ` (gate warning: missing ${gate.missing.join(", ")})` : ""}` }],
447
+ content: [{ type: "text", text: `Trace recorded for ${nextTask.taskId}: ${params.outcome}${gate.acceptanceProof?.mode === "diagnostic" && gate.acceptanceProof.pendingCriterionIds.length > 0 ? " (diagnostic acceptance; no quality claim)" : ""}${gate.decision === "fail" ? ` (gate warning: missing ${gate.missing.join(", ")})` : ""}` }],
432
448
  details: { task: compactTaskDetails(written), gate, completionReceipt: buildCompletionReceiptView(written, { cwd: ctx.cwd, gate }) }
433
449
  };
434
450
  }
@@ -0,0 +1,45 @@
1
+ export function conditionalMutationPreTaskContext<ContextEntry extends { path?: string }>(
2
+ context: ContextEntry[],
3
+ scope: string[],
4
+ enabled: boolean,
5
+ matchesAnyPath: (candidate: string, patterns: string[]) => boolean
6
+ ): ContextEntry[] {
7
+ if (!enabled) return context;
8
+ return context.filter((item) => typeof item.path === "string" && matchesAnyPath(item.path, scope));
9
+ }
10
+
11
+ export function taskStartLifecycleGuidance(
12
+ lifecycleMode: string,
13
+ mutationPolicy: string,
14
+ taskId: string
15
+ ): string {
16
+ if (lifecycleMode === "automatic-readonly") {
17
+ return "Runtime records targeted reads and final completion automatically. Stay read-only and report cited evidence.";
18
+ }
19
+ if (lifecycleMode === "assisted-readonly") {
20
+ return "Runtime records read-only evidence automatically; complete only the explicit evidence-review step before handoff.";
21
+ }
22
+ if (mutationPolicy === "forbidden") {
23
+ return "Runtime permits bounded inspection and exact configured verifier commands only. Source mutation is blocked, and completion requires a zero task delta.";
24
+ }
25
+ if (mutationPolicy === "allowed") {
26
+ return "Verify and review first. Repair only findings supported by evidence; zero delta is valid, while any mutation remains guarded and every exact verifier must pass.";
27
+ }
28
+ if (lifecycleMode === "automatic") {
29
+ return "Runtime will record reads, changes, exact verifier results, and final completion automatically. Continue with ordinary read/edit/bash work.";
30
+ }
31
+ if (lifecycleMode === "assisted") {
32
+ return `Runtime records objective evidence automatically; after verification, complete only step \`review\` with piagent_task_progress using taskId \`${taskId}\` and stepId \`review\`.`;
33
+ }
34
+ return "Use the active progress/recovery tools for the custom or high-risk checkpoints.";
35
+ }
36
+
37
+ export function automaticTaskExpectedOutput(mutationPolicy: string): string {
38
+ if (mutationPolicy === "forbidden") {
39
+ return "The requested read-only investigation is answered from observed project evidence without mutating files.";
40
+ }
41
+ if (mutationPolicy === "allowed") {
42
+ return "The current implementation is verified and any evidence-backed failure is repaired; zero task delta remains valid when no repair is needed.";
43
+ }
44
+ return "The requested bounded change is implemented and passes the configured verification.";
45
+ }
@@ -24,9 +24,9 @@ type ProofTask = {
24
24
  criterionGraph?: CriterionGraph;
25
25
  };
26
26
 
27
- export const RUNTIME_SOURCE_REUSE_GUIDANCE = "Use runtime-delivered source; do not reread it. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors. Otherwise read only missing source or a named criterion-focused test. Globs/directories grant scope, not file targets.";
27
+ export const RUNTIME_SOURCE_REUSE_GUIDANCE = "Use runtime-delivered source; do not reread it. When the operator names an exact file, work from its delivered/current contents; do not list or search the repository merely to rediscover it. On edit drift/oldText mismatch, use attached recovery; otherwise reread the affected region once. Never retry guessed anchors. Otherwise read only missing source or a named criterion-focused test. Globs/directories grant scope, not file targets.";
28
28
 
29
- export const EXACT_VERIFIER_EXECUTION_GUIDANCE = "Keep each exact verifier command separate and unmodified. Run the set once on the final tree; rerun only after a later mutation or a runtime-authorized same-tree infrastructure retry.";
29
+ export const EXACT_VERIFIER_EXECUTION_GUIDANCE = "Keep each exact verifier command separate and unmodified. Run the set once on the final tree; rerun only after a later mutation or a runtime-authorized same-tree infrastructure retry. Do not warm up with an unfocused command already contained in that exact set; use a genuinely criterion-focused test or run the exact set directly.";
30
30
 
31
31
  function normalizedPath(value: string): string {
32
32
  return value.trim().replaceAll("\\", "/");
@@ -143,6 +143,9 @@ export function automaticTaskExecutionGuidance(task: ProofTask): string {
143
143
  ? "Stay mutation-free. Runtime permits bounded inspection and the exact configured verifier, records completion evidence, and requires a zero task delta."
144
144
  : "Stay read-only. Runtime records targeted reads and completion evidence; do not call task-management tools.";
145
145
  }
146
+ if (task.mutationPolicy === "allowed") {
147
+ return "Verify and review the referenced implementation first. Mutate only when observed evidence identifies a repair; zero task delta is valid. Any repair remains subject to the normal mutation guards, and every exact configured verifier must pass against the final working tree. Runtime records evidence and completion; do not call task-management tools.";
148
+ }
146
149
  return task.criterionGraph?.mode === "criterion-graph"
147
150
  ? "Follow the execution map and implement dependency-ready criteria. The map plans work but never overrides the operator request or exact verifiers. Runtime records evidence and completion; do not call task-management tools."
148
151
  : "Privately map every operator criterion to implementation and durable focused-test coverage before mutating. Finish intended edits and a criterion-by-criterion self-review. Runtime records evidence and completion; do not call task-management tools.";