@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
@@ -1,9 +1,11 @@
1
+ import { observedFocusedTestSummary, retainFocusedVerification, unresolvedFocusedVerification } from "./acceptance-focused-verification.js";
1
2
  import fs from "node:fs";
2
3
  import os from "node:os";
3
4
  import path from "node:path";
4
5
  import crypto from "node:crypto";
5
6
  import { execFileSync } from "node:child_process";
6
7
  import { fileURLToPath } from "node:url";
8
+ import { apiBaselineCriterionEvidence as apiBaselineEvidence } from "../runtime/verification/acceptance-api-baseline.js";
7
9
  import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
8
10
  import { StringEnum } from "@earendil-works/pi-ai";
9
11
  import { Type } from "typebox";
@@ -17,6 +19,7 @@ import {
17
19
  unresolvedExpansionReason
18
20
  } from "./shell-reach.ts";
19
21
  import { extractShellWritePathCandidates, shellHasFileWriteRedirection } from "./shell-write-targets.js";
22
+ import { isProjectMutatingShellCommand, isReadOnlyTaskShellCommand } from "./readonly-inline-inspection.ts";
20
23
  import { commandMatchesVerifyPlan, createBashResultLedger, findMatchingObservedBashResult, readObservedBashResults } from "./runtime-evidence.js";
21
24
  import { findPackageRoot, findPlatformRoot, readJsonFile } from "./guard-io.js";
22
25
  import {
@@ -70,25 +73,22 @@ import {
70
73
  priorTaskAttempts, repositoryFileManifest, repositoryFileManifestDetails, resolveTaskContract, safeTaskId, summarizeAttempt, taskContractValidationErrors, taskDigestMigrationArchiveStatus,
71
74
  workPlanDependencyError, workingTreeSnapshot, workingTreeSnapshotHasUnavailableEvidence, writeTaskContract
72
75
  } from "./task-state.js";
73
- import { classifyRecordedVerificationFailure, classifyVerificationFailure, latestObservedVerification, meaningfulVerificationCommands, selectCompletionRecoveryClassification, selectVerificationPlan } from "./verification-intelligence.js";
76
+ import { classifyRecordedVerificationFailure, classifyVerificationFailure, latestObservedVerification, meaningfulVerificationCommands, recordedFailureForObservation, selectCompletionRecoveryClassification, selectVerificationPlan } from "./verification-intelligence.js";
74
77
  import { executionBackendToolDecision } from "./execution-backend.js";
75
78
  import { replayTaskCheckpoints } from "./task-journal.js";
76
79
  import type { FailureClassification } from "./failure-types.ts";
77
80
  import { recordCompletionAudit, recordMutationCheckpoint, recordTaskProgressCheckpoints, recordTaskStartCheckpoint, recordVerificationCheckpoint } from "./task-runtime-audit.js";
78
81
  import {
79
- applyAcceptanceRecoveryProvenance,
80
- acceptanceBaselineGuidance,
81
- acceptanceProofGuidance,
82
- acceptanceSemanticConflicts,
83
- buildAcceptanceReceipt,
84
- invalidateAcceptanceReceiptAfterMutation,
85
- refreshAcceptanceReceipt
82
+ applyAcceptanceRecoveryProvenance, acceptanceBaselineGuidance, acceptanceProofGuidance, acceptanceSemanticConflicts,
83
+ buildAcceptanceReceipt, invalidateAcceptanceReceiptAfterMutation, refreshAcceptanceReceipt
86
84
  } from "./acceptance-receipt.js";
87
85
  import { acceptanceLanguageAdapterForPath, isAcceptanceTestPath } from "./acceptance-language-adapters.js";
88
86
  import { allVerifyCommandsPassCurrentTree, changedSnapshotFiles, compactTaskDetails, mergeObservedTaskContext, passingVerifyCommandsForDigest, taskDeltaFilesFromSnapshot } from "./task-contract-view.js";
89
87
  import { applyRuntimeLifecycleObservation, runtimeLifecycleMode, workingTreeEvidenceDigest } from "./task-lifecycle.js";
90
88
  import { completeTaskDigestRefresh } from "./task-digest-migration.js";
91
89
  import { WORKING_TREE_DIGEST_ALGORITHM, isCurrentWorkingTreeDigest, workingTreeObservation, workingTreeSnapshotUsesCurrentAlgorithm } from "./working-tree-digest.js";
90
+ import { currentWorkspaceRevisionDigest } from "./workspace-revision.js";
91
+ import { captureWorkspaceVerificationSnapshot } from "./workspace-verification-snapshot.js";
92
92
  import { appendJsonlBounded } from "./state-retention.js";
93
93
  import { ensurePrivateStateDirectory, resolveLocalStatePath } from "./local-state-path.js";
94
94
  import { hasDurableContextEvidence } from "./context-evidence.js";
@@ -104,6 +104,7 @@ import {
104
104
  import { cleanSessionNameInput, currentSessionName, hasOperatorSessionName } from "../runtime/session/message-signals.ts";
105
105
  import { buildSemanticCompactionInstructions } from "../runtime/session/system-prompt.ts";
106
106
  import { buildContextPreflight, buildUsageSnapshot, formatContextPreflight, formatCount, formatPercent, formatUsageSnapshot } from "../runtime/session/usage.ts";
107
+ import { registerTaskUsageHooks } from "../runtime/product/task-usage-hooks.ts";
107
108
  import {
108
109
  formatToolResultCaptureStatus,
109
110
  readRecentToolResultCaptures
@@ -111,6 +112,9 @@ import {
111
112
  import { RuntimeSessionState } from "../runtime/session/runtime-state.ts";
112
113
  import type { ObservedTaskContext } from "../runtime/session/runtime-state.ts";
113
114
  import { reuseCurrentTreeExactVerifier } from "../runtime/verification/exact-verifier-reuse.ts";
115
+ import { IndependentAcceptanceRuntime } from "../runtime/verification/independent-acceptance-runtime.ts";
116
+ import { independentAcceptanceState } from "./acceptance-independent-registry.js";
117
+ import { independentVerificationRecovery } from "../runtime/recovery/independent-verification-recovery.ts";
114
118
  import {
115
119
  PIAGENT_TOOL_GROUPS,
116
120
  PIAGENT_TOOL_NAMES,
@@ -119,6 +123,7 @@ import {
119
123
  } from "../runtime/tools/tool-groups.ts";
120
124
  import type { PiagentToolGroup } from "../runtime/tools/tool-groups.ts";
121
125
  import { freshRequestParts, shortTaskLabel } from "../runtime/workflows/input-routing.ts";
126
+ import { completedFollowupAcceptanceEvidenceFiles } from "../runtime/workflows/task-followup-policy.ts";
122
127
  import {
123
128
  automaticAcceptanceCriteria,
124
129
  automaticReviewLenses,
@@ -142,7 +147,8 @@ import { readRuntimeVersionMetadata, RuntimeSnapshotCapture } from "../runtime/m
142
147
  import { recordRuntimeSnapshotTelemetry } from "../runtime/model/snapshot-telemetry.ts";
143
148
  import { captureAuthenticatedModelCatalogFromContext } from "../runtime/model/authenticated-catalog.ts";
144
149
  import { normalizeOpenAiCodexReasoningPayload } from "../runtime/model/openai-codex-reasoning.ts";
145
- import { buildOpenAiCodexWireFingerprint } from "../runtime/model/provider-wire-fingerprint.ts";
150
+ import { buildOpenAiCodexWireFingerprint, measureProviderPayload } from "../runtime/model/provider-wire-fingerprint.ts";
151
+ import { registerFastModeCommand, ServiceTierRuntime } from "../runtime/model/service-tier-runtime.ts";
146
152
  import { ModelRouteRuntime, readModelRouteEvents } from "../runtime/model/model-route-runtime.ts";
147
153
  import { parentRoutingModeFromEnvironment, routingObjectiveFromEnvironment } from "../runtime/model/model-route-policy.ts";
148
154
  import { ModelSelectionProvenanceTracker } from "../runtime/model/model-selection-provenance.ts";
@@ -156,7 +162,7 @@ import { PhaseToolRuntime, phaseToolModeFromEnvironment } from "../runtime/tools
156
162
  import { parseApplyPatchTargets, registerApplyPatchTool } from "../runtime/tools/apply-patch-tool.ts";
157
163
  import { authorityReplacementState, ensureTaskAuthorityResumePolicy } from "../runtime/policy/authority-resume-policy.ts";
158
164
  import { taskAuthorityDecision } from "../runtime/policy/task-authority-runtime.ts";
159
- import { selectRecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
165
+ import { applyProofCapabilityHandoff, selectRecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
160
166
  import type { RecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
161
167
  import { inspectTaskResumeState } from "../runtime/recovery/resume-state.ts";
162
168
  import { SemanticRepairRuntime } from "../runtime/recovery/semantic-repair-runtime.ts";
@@ -169,6 +175,7 @@ import { performanceReviewToolDecision, performanceReviewToolKind } from "../run
169
175
  import { expectedModelMutationProof } from "../runtime/quality/model-mutation-proof.ts";
170
176
  import { EditFreshnessGuard, editFreshnessModeFromEnvironment } from "../runtime/quality/edit-freshness-guard.ts";
171
177
  import { captureVerifierFileSnapshot } from "../runtime/inspection/verifier-snapshot-store.ts";
178
+ import { finalGateConfig } from "./acceptance-diagnostic-policy.ts";
172
179
  import { fallbackBasePolicy } from "./fallback-base-policy.ts";
173
180
  import { prefixCompletions, registerPiagentTool, registerRuntimeCommand, registerRuntimeTool } from "../runtime/registration/extension-registration.ts";
174
181
  import { FRESH_COMMAND_ACTIONS, FRESH_COMMAND_HELP, ONBOARDING_COMMAND_ACTIONS, WORKFLOW_COMMAND_EXCLUSIONS } from "../runtime/registration/operator-catalogs.ts";
@@ -201,7 +208,6 @@ import type {
201
208
  ContextIndexSettings,
202
209
  ExecPolicyConfig,
203
210
  ExternalActionPolicyConfig,
204
- FinalGateConfig,
205
211
  MemorySettings,
206
212
  OrchestrationMode,
207
213
  OrchestrationPolicySettings,
@@ -236,7 +242,7 @@ type TaskStartParameters = {
236
242
  riskLane: "tiny" | "normal" | "high-risk";
237
243
  intakeMode?: "model" | "runtime";
238
244
  changeMode?: "source-change" | "read-only";
239
- mutationPolicy?: "required" | "forbidden";
245
+ mutationPolicy?: "required" | "allowed" | "forbidden";
240
246
  verifyGroup?: string;
241
247
  maxAttempts?: number;
242
248
  expectedOutput: string;
@@ -297,7 +303,6 @@ const TECH_OPTIONS: TechOption[] = [
297
303
  { id: "node-typescript", label: "Node TypeScript", role: "runtime", description: "Node.js TypeScript library/tooling project.", context7Query: "typescript node.js", topics: ["typescript", "node", "testing"] },
298
304
  { id: "python", label: "Python", role: "runtime", description: "Python app/library runtime.", context7Query: "python", topics: ["packaging", "typing", "testing"] }
299
305
  ];
300
-
301
306
  const PROFILE_TECH_ROLES: Record<string, TechRole[]> = {
302
307
  "web-frontend": ["frontend", "database"],
303
308
  "backend-api": ["backend", "database"],
@@ -311,7 +316,6 @@ const PROFILE_TECH_ROLES: Record<string, TechRole[]> = {
311
316
  docs: ["docs"],
312
317
  generic: ["runtime"]
313
318
  };
314
-
315
319
  const DEFAULT_MEMORY_SETTINGS: Required<MemorySettings> = {
316
320
  enabled: true,
317
321
  mode: "manual",
@@ -324,7 +328,6 @@ const DEFAULT_MEMORY_SETTINGS: Required<MemorySettings> = {
324
328
  maxInjectedChars: 4000,
325
329
  externalPackages: []
326
330
  };
327
-
328
331
  const DEFAULT_CONTEXT_INDEX_SETTINGS: Required<ContextIndexSettings> = {
329
332
  enabled: true,
330
333
  path: CONTEXT_INDEX_FILE,
@@ -335,14 +338,12 @@ const DEFAULT_CONTEXT_INDEX_SETTINGS: Required<ContextIndexSettings> = {
335
338
  includeTechStack: true,
336
339
  includeMemoryPointers: true
337
340
  };
338
-
339
341
  const DEFAULT_RUNTIME_POLICY: Required<RuntimePolicySettings> = {
340
342
  execPolicy: "enforce",
341
343
  contextBudget: "enforce",
342
344
  toolRegistry: "advisory",
343
345
  finalGate: "enforce"
344
346
  };
345
-
346
347
  const DEFAULT_ORCHESTRATION_POLICY: ResolvedOrchestrationPolicy = {
347
348
  defaultMode: "solo-first",
348
349
  maxConcurrentSubagents: 1,
@@ -368,7 +369,6 @@ const DEFAULT_ORCHESTRATION_POLICY: ResolvedOrchestrationPolicy = {
368
369
  "Keep review lenses explicit so cheap review work catches drift before release."
369
370
  ]
370
371
  };
371
-
372
372
  const PERMISSION_PROFILE_MODES = ["read-only", "workspace-write", "trusted-full-access"] as const;
373
373
  const PERMISSION_PROFILE_ALIASES: Record<string, PermissionProfileMode> = {
374
374
  readonly: "read-only",
@@ -389,14 +389,11 @@ const WRITE_TOOL_NAMES = new Set(["write", "edit"]);
389
389
  const SHELL_TOOL_NAMES = new Set(["bash", "shell", "exec"]);
390
390
  const MAX_MCP_PROXY_ARGS_CHARS = 131_072;
391
391
  const SESSION_PERMISSION_OVERRIDES = new Map<string, PermissionProfileMode>();
392
-
393
392
  const DEFAULT_POLICY = fallbackBasePolicy(CONTEXT_INDEX_FILE, DEFAULT_ORCHESTRATION_POLICY);
394
-
395
393
  // Which platform supplies the adapters is fixed by where this file is installed,
396
394
  // so it is resolved once here rather than threaded through every profile load.
397
395
  const PLATFORM_ROOT = findPlatformRoot(path.dirname(fileURLToPath(import.meta.url)));
398
396
  const UPDATE_CHECK_MODULE = fileURLToPath(new URL("./update-check.js", import.meta.url));
399
-
400
397
  // The installed version, read from the package this file ships in. A maintainer
401
398
  // working in the repository is not running a release and has nothing to update
402
399
  // to, so only a tree Pi or npm placed is given a version to compare.
@@ -404,7 +401,6 @@ function installedPlatformVersion(): string | undefined {
404
401
  if (!isInstalledPlatform(PLATFORM_ROOT)) return undefined;
405
402
  return readJsonFile<{ version?: string }>(path.join(PLATFORM_ROOT, "package.json"))?.version;
406
403
  }
407
-
408
404
  function updateAvailabilityNotice(): string | undefined {
409
405
  const installed = installedPlatformVersion();
410
406
  if (!installed) return undefined;
@@ -1297,16 +1293,6 @@ function externalActionPolicyConfig(policy: BasePolicy): Required<ExternalAction
1297
1293
  };
1298
1294
  }
1299
1295
 
1300
- function finalGateConfig(policy: BasePolicy): Required<FinalGateConfig> {
1301
- return {
1302
- defaultMode: policy.finalGate?.defaultMode ?? DEFAULT_POLICY.finalGate?.defaultMode ?? "enforce",
1303
- requireTaskContract: policy.finalGate?.requireTaskContract ?? true,
1304
- requireContextManifest: policy.finalGate?.requireContextManifest ?? true,
1305
- requireVerifyEvidence: policy.finalGate?.requireVerifyEvidence ?? true,
1306
- requireTrace: policy.finalGate?.requireTrace ?? true,
1307
- requirePassingVerify: policy.finalGate?.requirePassingVerify ?? true
1308
- };
1309
- }
1310
1296
 
1311
1297
  function boundedInteger(value: unknown, fallback: number, minimum: number, maximum: number): number {
1312
1298
  const numberValue = typeof value === "number" ? value : Number(value);
@@ -1699,32 +1685,6 @@ function isTaskMutationTool(toolName: string, input: Record<string, unknown>): b
1699
1685
  .some((token) => tokens.has(token));
1700
1686
  }
1701
1687
 
1702
- function isReadOnlyTaskShellCommand(
1703
- command: string,
1704
- segments: Array<{ words: string[] }>
1705
- ): boolean {
1706
- if (/[<>]|`|\$\(/.test(command)) {
1707
- return false;
1708
- }
1709
- const safeCommands = new Set(["pwd", "ls", "find", "rg", "grep", "cat", "sed", "head", "tail", "wc", "stat", "file", "test", "[", "which", "printf", "sort"]);
1710
- const safeGitSubcommands = new Set(["status", "diff", "log", "show", "ls-files", "rev-parse"]);
1711
- return segments.length > 0 && segments.every((segment) => {
1712
- const words = segment.words.filter(Boolean);
1713
- const executable = path.basename(words[0] ?? "");
1714
- if (executable === "sed" && words.some((word) => /^-.*i/.test(word))) return false;
1715
- if (executable === "find" && words.some((word) => ["-delete", "-exec", "-execdir", "-ok", "-okdir", "-fprint", "-fprint0", "-fprintf", "-fls"].includes(word))) return false;
1716
- if (executable === "sort" && words.slice(1).some((word) => (
1717
- word === "--output"
1718
- || word.startsWith("--output=")
1719
- || /^-[^-]*o/.test(word)
1720
- ))) return false;
1721
- if (safeCommands.has(executable)) return true;
1722
- if (executable === "git") return safeGitSubcommands.has(words[1] ?? "");
1723
- if (executable === "command") return words[1] === "-v";
1724
- return false;
1725
- });
1726
- }
1727
-
1728
1688
  function shellTouchesGrantedSourceCheckout(cwd: string, command: string, roots: string[]): boolean {
1729
1689
  if (roots.length === 0) return false;
1730
1690
  for (const root of roots) {
@@ -1735,37 +1695,6 @@ function shellTouchesGrantedSourceCheckout(cwd: string, command: string, roots:
1735
1695
  .some((candidate) => Boolean(grantedSourceCheckoutRootForPath(cwd, normalizeRelative(cwd, candidate) ?? candidate, roots)));
1736
1696
  }
1737
1697
 
1738
- const PROJECT_MUTATING_EXECUTABLES = new Set([
1739
- "apply_patch", "bash", "chmod", "chown", "cp", "dd", "install", "ln", "make", "mkdir", "mv", "prename", "rename",
1740
- "node", "patch", "perl", "php", "python", "python3", "rm", "rmdir", "rsync", "ruby", "scp", "sh",
1741
- "tee", "touch", "truncate", "zsh"
1742
- ]);
1743
-
1744
- function isProjectMutatingShellCommand(command: string, segments: Array<{ words: string[] }>): boolean {
1745
- if (shellHasFileWriteRedirection(command)) return true;
1746
- const noAliases = new Map<string, string>();
1747
- for (const segment of segments) {
1748
- const words = segment.words.filter(Boolean);
1749
- if (words.length === 0) continue;
1750
- if (externalExecutableIndex(words, PROJECT_MUTATING_EXECUTABLES, noAliases) !== undefined) return true;
1751
- const executable = path.basename(words[0] ?? "").toLowerCase();
1752
- if (executable === "find" && words.some((word) => ["-delete", "-exec", "-execdir", "-ok", "-okdir", "-fprint", "-fprint0", "-fprintf", "-fls"].includes(word))) return true;
1753
- if (executable === "sed" && words.some((word) => /^-[^-]*i/.test(word) || word === "--in-place" || word.startsWith("--in-place="))) return true;
1754
- if (executable === "git") {
1755
- const subcommand = words.slice(1).find((word, index, values) => {
1756
- if (!word.startsWith("-")) return index === 0 || !["-C", "-c", "--git-dir", "--work-tree"].includes(values[index - 1]);
1757
- return false;
1758
- });
1759
- if (["apply", "checkout", "clean", "mv", "reset", "restore", "rm", "switch"].includes(subcommand ?? "")) return true;
1760
- }
1761
- if (["npm", "pnpm", "yarn", "bun"].includes(executable)) {
1762
- const subcommand = words.find((word, index) => index > 0 && !word.startsWith("-"));
1763
- if (["add", "ci", "install", "link", "remove", "uninstall", "update", "upgrade"].includes(subcommand ?? "")) return true;
1764
- }
1765
- }
1766
- return false;
1767
- }
1768
-
1769
1698
  const EXPLICIT_SHELL_MUTATORS = new Set([
1770
1699
  "apply_patch", "chmod", "chown", "cp", "dd", "install", "ln", "mkdir", "mv", "patch", "prename", "rename",
1771
1700
  "rm", "rmdir", "rsync", "scp", "tee", "touch", "truncate"
@@ -1937,18 +1866,20 @@ function recordObservedTaskVerification(
1937
1866
  },
1938
1867
  pendingContext: ObservedTaskContext[],
1939
1868
  maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>,
1940
- eventTree?: ReturnType<typeof workingTreeObservation>,
1941
- readProtectedPaths: string[] = []
1869
+ eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>,
1870
+ readProtectedPaths: string[] = [], preWorkspaceRevisionDigest?: string, diagnosticFocused = false
1942
1871
  ): TaskContract | undefined {
1943
1872
  const task = activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined;
1944
1873
  if (!task || task.trace.outcome !== "pending") return;
1945
1874
  const command = String(observed.normalizedCommand ?? observed.command ?? "").trim();
1946
1875
  const observedAtMs = Date.parse(observed.recordedAt ?? "");
1947
1876
  const taskCreatedAtMs = Date.parse(task.createdAt);
1877
+ const matchedProfileCommand = commandMatchesVerifyPlan(command, task.verifyCommands);
1878
+ const focusedTest = diagnosticFocused && observedFocusedTestSummary(observed.outputText);
1948
1879
  if (
1949
1880
  !command
1950
1881
  || !observed.commandHash
1951
- || !commandMatchesVerifyPlan(command, task.verifyCommands)
1882
+ || (!matchedProfileCommand && !focusedTest)
1952
1883
  || !Number.isFinite(observedAtMs)
1953
1884
  || !Number.isFinite(taskCreatedAtMs)
1954
1885
  || observedAtMs < taskCreatedAtMs
@@ -1957,6 +1888,7 @@ function recordObservedTaskVerification(
1957
1888
  if (!eventTree?.proofCapable) return;
1958
1889
  const currentDigests = eventTree.snapshot as Record<string, string>;
1959
1890
  const currentDigest = eventTree.digest;
1891
+ const workspaceRevisionDigest = eventTree.workspaceRevisionDigest ?? undefined;
1960
1892
  const preWorkingTreeDigest = shellSnapshotBefore && workingTreeSnapshotUsesCurrentAlgorithm(shellSnapshotBefore) ? workingTreeEvidenceDigest(shellSnapshotBefore) : undefined;
1961
1893
  const exitCode = Number.isInteger(observed.exitCode) ? observed.exitCode as number : observed.isError ? 1 : 0;
1962
1894
  const classification = classifyVerificationFailure(observed.outputText, exitCode);
@@ -1964,6 +1896,7 @@ function recordObservedTaskVerification(
1964
1896
  evidence.command.trim() === command
1965
1897
  && evidence.exitCode === exitCode
1966
1898
  && evidence.workingTreeDigest === currentDigest && evidence.observedAt === observed.recordedAt
1899
+ && evidence.workspaceRevisionDigest === workspaceRevisionDigest && evidence.preWorkspaceRevisionDigest === preWorkspaceRevisionDigest
1967
1900
  ));
1968
1901
  const contextAdded = mergeObservedTaskContext(task, pendingContext, maxManifestFiles, redactText);
1969
1902
  if (!duplicate) {
@@ -1972,16 +1905,17 @@ function recordObservedTaskVerification(
1972
1905
  task.verifyEvidence.push({
1973
1906
  command: redactText(command),
1974
1907
  exitCode,
1975
- summary: `Runtime observed configured verifier exit ${exitCode} (${classification.category}${classification.retryable ? ", retryable" : ""}).`,
1908
+ summary: `Runtime observed ${matchedProfileCommand ? "configured" : "focused"} verifier exit ${exitCode} (${classification.category}${classification.retryable ? ", retryable" : ""}).`,
1976
1909
  recordedAt: evidenceRecordedAt,
1977
1910
  observed: true,
1978
1911
  observedAt,
1979
1912
  isError: observed.isError === true,
1980
- matchedProfileCommand: true,
1913
+ matchedProfileCommand,
1981
1914
  preWorkingTreeDigest,
1982
- workingTreeDigest: currentDigest
1915
+ workingTreeDigest: currentDigest,
1916
+ preWorkspaceRevisionDigest, workspaceRevisionDigest
1983
1917
  });
1984
- task.verifyEvidence = task.verifyEvidence.slice(-100);
1918
+ task.verifyEvidence = diagnosticFocused ? retainFocusedVerification(task.verifyEvidence, currentDigest, workspaceRevisionDigest) : task.verifyEvidence.slice(-100);
1985
1919
  try {
1986
1920
  captureVerifierFileSnapshot({
1987
1921
  projectRoot: ctx.cwd, taskId: task.taskId, taskRunId: task.taskRunId, sessionId: task.sessionId,
@@ -1994,18 +1928,20 @@ function recordObservedTaskVerification(
1994
1928
  }
1995
1929
  }
1996
1930
 
1997
- const hasChanges = taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected.length > 0;
1998
- const allPassing = hasChanges && allVerifyCommandsPassCurrentTree(task, currentDigest);
1999
- const lifecycle = hasChanges
1931
+ const taskLocalDelta = taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected;
1932
+ const hasChanges = taskLocalDelta.length > 0;
1933
+ const verificationCanSettleSourceTask = hasChanges || task.mutationPolicy === "allowed";
1934
+ const allPassing = verificationCanSettleSourceTask && allVerifyCommandsPassCurrentTree(task, currentDigest, workspaceRevisionDigest ?? null);
1935
+ const lifecycle = verificationCanSettleSourceTask
2000
1936
  ? applyRuntimeLifecycleObservation(task, allPassing ? "verification-complete" : "verification-pending", nowIso())
2001
1937
  : { changed: false, mode: runtimeLifecycleMode(task) };
2002
1938
  const acceptance = refreshAcceptanceReceipt(task, {
2003
- cwd: ctx.cwd,
2004
- changedFiles: taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected,
1939
+ cwd: ctx.cwd, apiBaselineEvidence,
1940
+ changedFiles: taskAcceptanceEvidenceFiles(ctx.cwd, task, currentDigests, taskLocalDelta),
2005
1941
  currentWorkingTreeDigest: currentDigest
2006
1942
  });
2007
1943
  task.acceptanceReceipt = acceptance.task.acceptanceReceipt;
2008
- if (!task.workingTreeDigestMigration || (shellSnapshotBefore && changedSnapshotFiles(shellSnapshotBefore, currentDigests).length === 0)) Object.assign(task, completeTaskDigestRefresh(task, currentDigest));
1944
+ if (!task.workingTreeDigestMigration || (shellSnapshotBefore && changedSnapshotFiles(shellSnapshotBefore, currentDigests).length === 0)) Object.assign(task, completeTaskDigestRefresh(task, currentDigest, workspaceRevisionDigest ?? null));
2009
1945
  if (duplicate && contextAdded.length === 0 && !lifecycle.changed) return task;
2010
1946
 
2011
1947
  const written = writeTask(ctx.cwd, task);
@@ -2035,7 +1971,8 @@ function recordObservedTaskVerification(
2035
1971
  retryable: classification.retryable,
2036
1972
  failureClassification: classification,
2037
1973
  preWorkingTreeDigest,
2038
- workingTreeDigest: currentDigest
1974
+ workingTreeDigest: currentDigest,
1975
+ preWorkspaceRevisionDigest, workspaceRevisionDigest
2039
1976
  }
2040
1977
  });
2041
1978
  return written;
@@ -2085,14 +2022,14 @@ function completionTaskProjection(
2085
2022
  failureReason: undefined,
2086
2023
  ruledOut: undefined,
2087
2024
  trace: {
2088
- outcome: "completed",
2025
+ outcome: "completed" as const,
2089
2026
  notes: "Runtime finalized from observed context, working-tree changes, current verification, and completed work-plan evidence.",
2090
2027
  recordedAt: nowIso()
2091
2028
  }
2092
2029
  };
2093
2030
  return refreshAcceptanceReceipt(projected, {
2094
- cwd,
2095
- changedFiles,
2031
+ cwd, apiBaselineEvidence,
2032
+ changedFiles: taskAcceptanceEvidenceFiles(cwd, projected, finalFileDigests, changedFiles),
2096
2033
  currentWorkingTreeDigest: workingTreeEvidenceDigest(finalFileDigests)
2097
2034
  }).task as TaskContract;
2098
2035
  }
@@ -3505,6 +3442,20 @@ function taskChangedFileEvidence(
3505
3442
  };
3506
3443
  }
3507
3444
 
3445
+ function taskAcceptanceEvidenceFiles(
3446
+ cwd: string,
3447
+ task: TaskContract,
3448
+ currentDigests: Record<string, string>,
3449
+ taskLocalDelta: string[] = taskChangedFileEvidence(cwd, task, currentDigests).expected
3450
+ ): string[] {
3451
+ return completedFollowupAcceptanceEvidenceFiles(
3452
+ task,
3453
+ listTaskContracts(cwd) as TaskContract[],
3454
+ taskLocalDelta,
3455
+ currentDigests
3456
+ );
3457
+ }
3458
+
3508
3459
  function exactReviewPathCoverage(expectedPaths: string[], reviewedPaths: string[] | undefined): boolean {
3509
3460
  const expected = [...new Set(expectedPaths)].sort();
3510
3461
  const reviewed = [...new Set(reviewedPaths ?? [])].sort();
@@ -3543,8 +3494,9 @@ function evaluateTaskGate(
3543
3494
  warnings: string[];
3544
3495
  currentWorkingTreeDigest?: string;
3545
3496
  changedFileEvidence?: ReturnType<typeof taskChangedFileEvidence>;
3497
+ acceptanceProof?: { mode: "enforce" | "diagnostic"; pendingCriterionIds: string[]; missing: string[] };
3546
3498
  } {
3547
- const finalGate = finalGateConfig(policy);
3499
+ const finalGate = finalGateConfig(policy, DEFAULT_POLICY);
3548
3500
  const missing: string[] = [];
3549
3501
  const warnings: string[] = [];
3550
3502
  if (!task) {
@@ -3552,14 +3504,24 @@ function evaluateTaskGate(
3552
3504
  }
3553
3505
  const currentDigests = options.currentDigests ?? workingTreeSnapshot(cwd) as Record<string, string>;
3554
3506
  const currentWorkingTreeDigest = options.currentWorkingTreeDigest ?? workingTreeEvidenceDigest(currentDigests);
3507
+ const independentState = independentAcceptanceState(cwd, task, currentWorkingTreeDigest);
3508
+ if (independentState.block) missing.push(independentState.block);
3509
+ const compositeFacts = new Set<string>();
3510
+ for (const [id, assessment] of independentState.assessments) {
3511
+ if (assessment.verdict !== "pass") missing.push(`independent contract evidence (${id}:${assessment.verdict}${assessment.executionDiagnostics?.reasons.length ? `; ${assessment.executionDiagnostics.reasons.join(", ")}` : ""})`);
3512
+ else if (assessment.assurance === "bounded-composite-contract-tested" && Array.isArray(assessment.factKinds)) {
3513
+ for (const kind of assessment.factKinds) if (typeof kind === "string") compositeFacts.add(kind);
3514
+ }
3515
+ }
3516
+ const compositeContext = compositeFacts.has("context-current"), compositeVerifier = compositeFacts.has("project-verifier-current");
3555
3517
  if (task.workingTreeDigestAlgorithm !== WORKING_TREE_DIGEST_ALGORITHM || task.workingTreeDigestMigration?.status === "verification-refresh-required" || !workingTreeSnapshotUsesCurrentAlgorithm(currentDigests) || !isCurrentWorkingTreeDigest(currentWorkingTreeDigest) || currentWorkingTreeDigest !== workingTreeEvidenceDigest(currentDigests) || Object.values(task.baselineFileDigests).some((digest) => !isCurrentWorkingTreeDigest(digest)) || (task.workingTreeDigestMigration && (!taskDigestMigrationArchiveStatus(cwd, task).valid || replayTaskCheckpoints(cwd, task.taskRunId, task).corruptions.length > 0))) missing.push("current working-tree digest evidence");
3556
3518
  if (workingTreeSnapshotHasUnavailableEvidence(currentDigests)) missing.push("complete working-tree content evidence");
3557
3519
  if (taskContractValidationErrors(task).length > 0) missing.push("valid session-bound task contract v2");
3558
3520
  if (task.attempt > task.maxAttempts) missing.push(`attempt within maxAttempts (${task.attempt}/${task.maxAttempts})`);
3559
3521
  const plannedVerifyCommands = meaningfulVerificationCommands(task.verifyCommands);
3560
- if (task.changeMode === "source-change" && plannedVerifyCommands.length === 0) missing.push("meaningful verify command");
3561
- if (finalGate.requireContextManifest && !hasDurableContextEvidence(task)) missing.push("context manifest");
3562
- if (task.changeMode === "source-change" && finalGate.requireVerifyEvidence && task.verifyEvidence.length === 0) missing.push("verify evidence");
3522
+ if (task.changeMode === "source-change" && plannedVerifyCommands.length === 0 && !compositeVerifier) missing.push("meaningful verify command");
3523
+ if (finalGate.requireContextManifest && !hasDurableContextEvidence(task) && !compositeContext) missing.push("context manifest");
3524
+ if (task.changeMode === "source-change" && finalGate.requireVerifyEvidence && task.verifyEvidence.length === 0 && !compositeVerifier) missing.push("verify evidence");
3563
3525
  if (task.verifyEvidence.some((evidence) => evidence.observed !== true)) {
3564
3526
  warnings.push("Unobserved verify evidence is ignored by the passing verify gate.");
3565
3527
  }
@@ -3574,19 +3536,21 @@ function evaluateTaskGate(
3574
3536
  warnings.push("Verification evidence from a different working-tree snapshot is stale and is ignored.");
3575
3537
  }
3576
3538
  let missingVerifyCommands: string[] = [];
3577
- if (task.changeMode === "source-change" && finalGate.requirePassingVerify && plannedVerifyCommands.length > 0) {
3578
- const passingCommands = passingVerifyCommandsForDigest(task, currentWorkingTreeDigest);
3539
+ if (task.changeMode === "source-change" && finalGate.requirePassingVerify && plannedVerifyCommands.length > 0 && !compositeVerifier) {
3540
+ const passingCommands = passingVerifyCommandsForDigest(task, currentWorkingTreeDigest, currentWorkspaceRevisionDigest(cwd));
3579
3541
  missingVerifyCommands = plannedVerifyCommands.filter((command) => !passingCommands.has(command.trim()));
3580
3542
  if (missingVerifyCommands.length > 0) missing.push(`observed passing verify evidence for every configured command (${missingVerifyCommands.length} missing)`);
3581
3543
  }
3544
+ if (finalGate.acceptanceProofMode === "diagnostic" && unresolvedFocusedVerification(task.verifyEvidence, currentWorkingTreeDigest, currentWorkspaceRevisionDigest(cwd)).length > 0) missing.push("current passing rerun of failed focused verification");
3582
3545
  if (finalGate.requireTrace && task.trace.outcome !== "completed") missing.push("completed final trace");
3583
3546
  const incompleteSteps = (task.workPlan ?? []).filter((step) => step.status === "pending" || step.status === "in-progress" || step.status === "failed");
3584
3547
  if (task.trace.outcome === "completed" && incompleteSteps.length > 0) {
3585
3548
  missing.push(`completed work plan (${incompleteSteps.map((step) => `${step.id}:${step.status}`).join(", ")})`);
3586
3549
  }
3587
3550
  const changedFileEvidence = taskChangedFileEvidence(cwd, task, currentDigests);
3551
+ const acceptanceEvidenceFiles = taskAcceptanceEvidenceFiles(cwd, task, currentDigests, changedFileEvidence.expected);
3588
3552
  if (task.changeMode === "source-change" && task.trace.outcome === "completed" && task.mutationPolicy !== "forbidden") {
3589
- if (task.changedFiles.length === 0) missing.push("changed files");
3553
+ if (task.mutationPolicy !== "allowed" && task.changedFiles.length === 0) missing.push("changed files");
3590
3554
  if (changedFileEvidence.undeclared.length > 0) missing.push(`declared observed changes (${changedFileEvidence.undeclared.join(", ")})`);
3591
3555
  if (changedFileEvidence.unsupportedClaims.length > 0) missing.push(`supported changed-file claims (${changedFileEvidence.unsupportedClaims.join(", ")})`);
3592
3556
  if (changedFileEvidence.outsideScope.length > 0) {
@@ -3597,19 +3561,30 @@ function evaluateTaskGate(
3597
3561
  missing.push(`mutation-forbidden task has observed changes (${changedFileEvidence.expected.join(", ")})`);
3598
3562
  }
3599
3563
  const acceptance = refreshAcceptanceReceipt(task, {
3600
- cwd,
3601
- changedFiles: changedFileEvidence.expected,
3564
+ cwd, apiBaselineEvidence,
3565
+ changedFiles: acceptanceEvidenceFiles,
3602
3566
  currentWorkingTreeDigest
3603
3567
  });
3604
3568
  const semanticEnforcement = taskAuthorityDecision(task, "CAP-13", "block").allowed;
3569
+ // Runtime-derived critical proof gates completion. A zero-delta review
3570
+ // uses its strictly bound evidence scope without claiming a new mutation.
3571
+ // Neutral artifacts with missing content proof use source-proof-required;
3572
+ // unsupported language policy remains under the existing CAP-13 authority.
3573
+ const proofMissing: string[] = [];
3574
+ const runtimeCriticalProofEnforcement = task.changeMode === "source-change"
3575
+ && task.acceptanceReceipt?.source === "runtime";
3605
3576
  const abstainedIds = new Set(acceptance.adapterAbstained.map((criterion) => criterion.id));
3606
- const adapterCritical = acceptance.criticalMissing.filter((criterion) => abstainedIds.has(criterion.id));
3607
- const linkedCritical = acceptance.criticalMissing.filter((criterion) => !abstainedIds.has(criterion.id));
3608
- if (semanticEnforcement && linkedCritical.length > 0) missing.push(`critical acceptance evidence (${linkedCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")})`);
3609
- if (semanticEnforcement && adapterCritical.length > 0) missing.push(`critical acceptance evidence adapter-unresolved (${adapterCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: add a direct-relative focused test or configure a deterministic adapter`);
3577
+ const independentIds = new Set(acceptance.independentRequired.map((criterion) => criterion.id));
3578
+ const sourceProofIds = new Set(acceptance.sourceProofRequired.map((criterion) => criterion.id));
3579
+ const adapterCritical = acceptance.criticalMissing.filter((criterion) => abstainedIds.has(criterion.id) && !independentIds.has(criterion.id));
3580
+ const linkedCritical = acceptance.criticalMissing.filter((criterion) => !abstainedIds.has(criterion.id) && !independentIds.has(criterion.id) && !sourceProofIds.has(criterion.id));
3581
+ if ((semanticEnforcement || runtimeCriticalProofEnforcement) && sourceProofIds.size > 0) proofMissing.push(`critical acceptance evidence source-proof-required (${acceptance.sourceProofRequired.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: source proof remains unestablished after current focused tests passed; seek assessment, not source repair without a counterexample`);
3582
+ if ((semanticEnforcement || runtimeCriticalProofEnforcement) && independentIds.size > 0) proofMissing.push(`critical acceptance evidence independent-required (${acceptance.independentRequired.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: an approved independent assessment must cover every clause; missing proof is not an observed source defect`);
3583
+ if ((semanticEnforcement || runtimeCriticalProofEnforcement) && linkedCritical.length > 0) proofMissing.push(`critical acceptance evidence (${linkedCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")})`);
3584
+ if (semanticEnforcement && adapterCritical.length > 0) proofMissing.push(`critical acceptance evidence adapter-unresolved (${adapterCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: add a direct-relative focused test or configure a deterministic adapter`);
3610
3585
  const acceptanceConflicts = acceptanceSemanticConflicts(task, {
3611
3586
  cwd,
3612
- changedFiles: changedFileEvidence.expected
3587
+ changedFiles: acceptanceEvidenceFiles
3613
3588
  });
3614
3589
  if (semanticEnforcement && acceptanceConflicts.length > 0) {
3615
3590
  missing.push(`acceptance semantic conflicts (${acceptanceConflicts.join(", ")})`);
@@ -3619,11 +3594,16 @@ function evaluateTaskGate(
3619
3594
  if (semanticEnforcement && acceptance.adapterAbstained.length > 0) {
3620
3595
  warnings.push(`Acceptance proof adapter abstained; rigorous criteria remain pending and hand off without an automatic model retry: ${acceptance.adapterAbstained.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}`);
3621
3596
  }
3622
- if (!semanticEnforcement && (acceptance.criticalMissing.length > 0 || acceptanceConflicts.length > 0)) warnings.push("Acceptance projection is advisory under the pinned task authority and cannot block completion.");
3597
+ if (!semanticEnforcement && (adapterCritical.length > 0 || acceptanceConflicts.length > 0)) warnings.push("Adapter-unknown acceptance proof and semantic conflicts remain advisory under the pinned task authority; known runtime-linked critical proof still gates source-task completion.");
3623
3598
  if (normalMissing.length > 0) {
3624
3599
  warnings.push(`Acceptance criteria pending evidence: ${normalMissing.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}`);
3625
3600
  }
3626
- return { decision: missing.length === 0 ? "pass" : "fail", missing, missingVerifyCommands, warnings, currentWorkingTreeDigest, changedFileEvidence };
3601
+ const acceptanceProof = { mode: finalGate.acceptanceProofMode,
3602
+ pendingCriterionIds: acceptance.missing.map(criterion => criterion.id), missing: proofMissing };
3603
+ if (finalGate.acceptanceProofMode === "diagnostic" && acceptanceProof.pendingCriterionIds.length > 0) {
3604
+ warnings.push(`Diagnostic acceptance: ${acceptanceProof.pendingCriterionIds.length} criteria remain unproved; no quality claim. ${proofMissing.join("; ")}`);
3605
+ } else missing.push(...proofMissing);
3606
+ return { decision: missing.length === 0 ? "pass" : "fail", missing, missingVerifyCommands, warnings, currentWorkingTreeDigest, changedFileEvidence, ...(finalGate.acceptanceProofMode === "diagnostic" ? { acceptanceProof } : {}) };
3627
3607
  }
3628
3608
 
3629
3609
  function appendTrace(cwd: string, payload: Record<string, unknown>): void {
@@ -3795,15 +3775,28 @@ export default function piagentGuard(pi: ExtensionAPI) {
3795
3775
  const routingObjective = routingObjectiveFromEnvironment(process.env.PIAGENT_ROUTING_OBJECTIVE);
3796
3776
  const autoContextEnabled = environmentFeatureEnabled("PIAGENT_AUTO_CONTEXT");
3797
3777
  const autoRecoveryEnabled = environmentFeatureEnabled("PIAGENT_AUTO_RECOVERY");
3798
- const runtimeState = new RuntimeSessionState({
3799
- maxObservedContext: contextBudgetConfig(policy).maxManifestFiles
3800
- });
3778
+ const independentVerificationConfigPath = process.env.PIAGENT_INDEPENDENT_VERIFICATION_CONFIG,
3779
+ runtimeState = new RuntimeSessionState({ maxObservedContext: contextBudgetConfig(policy).maxManifestFiles });
3780
+ const independentAcceptance = new IndependentAcceptanceRuntime({ state: runtimeState, installedRoot: PLATFORM_ROOT,
3781
+ configPath: independentVerificationConfigPath,
3782
+ writeTask,
3783
+ activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined,
3784
+ authorizeSourceRead: (ctx, sourcePath) => {
3785
+ if (!ctx.isProjectTrusted()) return false;
3786
+ const profile = loadProfileFromContext(ctx), paths = effectiveProtectedPaths(policy, profile);
3787
+ const capabilities = verifyProjectCapabilityState(extensionDir, ctx.cwd, true, { sessionId: ctx.sessionManager.getSessionId() });
3788
+ if (!capabilities.ok) return false;
3789
+ const permission = resolvePermissionProfile(profile, policy, permissionOverrideFromContext(ctx));
3790
+ return !evaluatePathLikeToolAccess(ctx.cwd, "read", { path: sourcePath }, paths.writeProtectedPaths, paths.readProtectedPaths,
3791
+ paths.readOnlyPaths, permission.mode === "trusted-full-access" ? undefined : capabilities.filesystemRead).block;
3792
+ } });
3801
3793
  const editFreshnessGuard = new EditFreshnessGuard(editFreshnessModeFromEnvironment(process.env.PIAGENT_EDIT_FRESHNESS));
3802
3794
  const sourceMutationGuardBindings = createSourceMutationGuardBindings(policy, loadProfileFromContext);
3803
3795
  const runtimeSnapshotCapture = new RuntimeSnapshotCapture(), runtimeVersions = readRuntimeVersionMetadata(PLATFORM_ROOT);
3804
3796
  const solverShadow = solverMode === "off" ? undefined : new SolverShadowRuntime(solverMode);
3805
3797
  const modelRouteRuntime = new ModelRouteRuntime(parentRoutingMode, routingObjective);
3806
3798
  const modelSelectionProvenance = new ModelSelectionProvenanceTracker();
3799
+ const serviceTierRuntime = new ServiceTierRuntime({ environmentValue: process.env.PIAGENT_FAST_MODE });
3807
3800
  const trajectoryRuntime = new TrajectoryRuntime(), phaseToolRuntime = new PhaseToolRuntime(pi, dynamicToolsEnabled ? phaseToolModeFromEnvironment(process.env.PIAGENT_PHASE_TOOLS) : "off", telemetry, (ctx) => {
3808
3801
  const task = activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined; return task && authorityReplacementState(ctx.cwd, task).required ? "new-attempt-required" : task?.workingTreeDigestMigration?.status;
3809
3802
  }, (ctx) => {
@@ -3847,8 +3840,25 @@ export default function piagentGuard(pi: ExtensionAPI) {
3847
3840
  providerReasoningReasonCode: normalized.reasonCode
3848
3841
  });
3849
3842
  }
3843
+ const serviceTier = serviceTierRuntime.applyProviderRequest(
3844
+ pi,
3845
+ ctx,
3846
+ normalized.changed ? normalized.payload : event.payload
3847
+ );
3848
+ if (serviceTier.receipt.enabled || serviceTier.observationChanged) {
3849
+ telemetry(ctx, {
3850
+ event: "provider_request_service_tier",
3851
+ fastMode: serviceTier.receipt.mode,
3852
+ requestedServiceTier: serviceTier.receipt.requestedServiceTier,
3853
+ observedRequestServiceTier: serviceTier.receipt.observedRequestServiceTier,
3854
+ providerResponseServiceTier: serviceTier.receipt.providerResponseServiceTier,
3855
+ providerResponseEvidence: serviceTier.receipt.providerResponseEvidence,
3856
+ applied: serviceTier.receipt.applied,
3857
+ reasonCode: serviceTier.receipt.reasonCode
3858
+ });
3859
+ }
3850
3860
  const wire = buildOpenAiCodexWireFingerprint({
3851
- payload: normalized.changed ? normalized.payload : event.payload,
3861
+ payload: serviceTier.payload,
3852
3862
  provider: ctx.model?.provider,
3853
3863
  modelId: ctx.model?.id,
3854
3864
  workingDirectory: ctx.cwd,
@@ -3873,10 +3883,11 @@ export default function piagentGuard(pi: ExtensionAPI) {
3873
3883
  providerTextVerbosity: wire.textVerbosity,
3874
3884
  providerToolChoiceKind: wire.toolChoiceKind,
3875
3885
  providerToolChoiceHash: wire.toolChoiceHash,
3876
- requestPrefixFingerprint: wire.requestPrefixFingerprint
3886
+ requestPrefixFingerprint: wire.requestPrefixFingerprint,
3887
+ payloadMeasurement: measureProviderPayload(serviceTier.payload)
3877
3888
  });
3878
3889
  }
3879
- return normalized.changed ? normalized.payload : undefined;
3890
+ return normalized.changed || serviceTier.changed ? serviceTier.payload : undefined;
3880
3891
  });
3881
3892
 
3882
3893
  function freshModelRouteBoundary(ctx: ExtensionContext): boolean {
@@ -3957,6 +3968,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
3957
3968
  }
3958
3969
  }
3959
3970
 
3971
+ function preferApplyPatchBeforeWriters(toolNames: string[]): string[] {
3972
+ if (!toolNames.includes("apply_patch")) return [...toolNames];
3973
+ const withoutPatch = toolNames.filter((toolName) => toolName !== "apply_patch");
3974
+ const firstWriter = withoutPatch.findIndex((toolName) => toolName === "edit" || toolName === "write");
3975
+ if (firstWriter < 0) return [...toolNames];
3976
+ withoutPatch.splice(firstWriter, 0, "apply_patch");
3977
+ return withoutPatch;
3978
+ }
3979
+
3960
3980
  function activateToolGroups(ctx: ExtensionContext, groups: PiagentToolGroup[], additive = false): string[] {
3961
3981
  const current = pi.getActiveTools();
3962
3982
  if (!dynamicToolsEnabled) return current;
@@ -3975,7 +3995,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
3975
3995
  }
3976
3996
  }
3977
3997
  const ordered = [
3978
- ...current.filter((toolName) => selected.has(toolName) && !PIAGENT_TOOL_NAMES.has(toolName)),
3998
+ ...preferApplyPatchBeforeWriters(current.filter((toolName) => selected.has(toolName) && !PIAGENT_TOOL_NAMES.has(toolName))),
3979
3999
  ...PIAGENT_TOOL_ORDER.filter((toolName) => selected.has(toolName))
3980
4000
  ];
3981
4001
  const unchanged = ordered.length === current.length && ordered.every((toolName, index) => toolName === current[index]);
@@ -4004,22 +4024,22 @@ export default function piagentGuard(pi: ExtensionAPI) {
4004
4024
  let recordedClassification: FailureClassification | undefined;
4005
4025
  try {
4006
4026
  const replay = replayTaskCheckpoints(ctx.cwd, task.taskRunId, task);
4007
- if (replay.corruptions.length === 0) {
4008
- const checkpoint = replay.checkpoints
4009
- .filter((item) => item.phase === "verify" && item.status === "failed")
4010
- .at(-1) as any;
4011
- recordedClassification = checkpoint?.evidence?.failureClassification as FailureClassification | undefined;
4012
- }
4027
+ if (replay.corruptions.length === 0 && failed) recordedClassification = recordedFailureForObservation(
4028
+ replay.checkpoints, failed, currentTreeDigest, currentWorkspaceRevisionDigest(ctx.cwd)
4029
+ ) as FailureClassification | undefined;
4013
4030
  } catch {
4014
4031
  // A missing/corrupt journal cannot grant recovery mutation; the fallback
4015
4032
  // classifier remains fail-closed for unknown evidence.
4016
4033
  }
4017
- const classification = selectCompletionRecoveryClassification(
4034
+ const gateClassification = selectCompletionRecoveryClassification(
4018
4035
  recordedClassification,
4019
4036
  gate?.missing,
4020
4037
  summary,
4021
4038
  failed?.exitCode ?? 1
4022
4039
  );
4040
+ const independentRecovery = independentVerificationRecovery(ctx.cwd, task, currentTreeDigest ?? workingTreeEvidenceDigest(workingTreeSnapshot(ctx.cwd)));
4041
+ const classification = gateClassification.category === "scope-protected-path"
4042
+ ? gateClassification : independentRecovery?.classification ?? gateClassification;
4023
4043
  const trajectory = trajectoryRuntime.status(ctx.cwd, task.taskRunId);
4024
4044
  // Task scope is a retrieval/review hint, not filesystem authority. Recovery
4025
4045
  // may update a dependency or config file when repository evidence requires
@@ -4037,16 +4057,16 @@ export default function piagentGuard(pi: ExtensionAPI) {
4037
4057
  classification,
4038
4058
  currentPhase: trajectory.enforcementSafe ? trajectory.phase ?? "verify" : "handoff",
4039
4059
  history: runtimeState.recoveryHistory(task.taskId),
4040
- proposedHypothesisRef: classification.reasonCodes[0] ? `reason:${classification.reasonCodes[0]}` : null,
4060
+ proposedHypothesisRef: independentRecovery?.hypothesisRef ?? (classification.reasonCodes[0] ? `reason:${classification.reasonCodes[0]}` : null),
4041
4061
  exactVerifierAvailable: (gate?.missingVerifyCommands.length ?? task.verifyCommands.length) > 0,
4042
4062
  currentTreeMatchesEvidence: currentTreeDigest && latestExactVerifier?.workingTreeDigest
4043
- ? currentTreeDigest === latestExactVerifier.workingTreeDigest
4063
+ ? currentTreeDigest === latestExactVerifier.workingTreeDigest && latestExactVerifier.preWorkspaceRevisionDigest === currentWorkspaceRevisionDigest(ctx.cwd)
4064
+ && latestExactVerifier.workspaceRevisionDigest === latestExactVerifier.preWorkspaceRevisionDigest
4044
4065
  : true,
4045
- dependencyMutationAuthorized
4066
+ dependencyMutationAuthorized,
4067
+ independentDisposition: independentRecovery?.independentDisposition
4046
4068
  });
4047
- return gate?.missing.some((item) => /^critical acceptance evidence adapter-unresolved\b/i.test(item))
4048
- ? { ...selected, action: "handoff", continuation: "none", nextPhase: null, sourceMutationAllowed: false, reasonCodes: ["unknown-diagnostic-exhausted"] }
4049
- : selected;
4069
+ return applyProofCapabilityHandoff(selected, gate?.missing, Boolean(independentRecovery));
4050
4070
  }
4051
4071
 
4052
4072
  function trajectoryRecoveryOptions(ctx: ExtensionContext, task: TaskContract, options: any): any {
@@ -4112,7 +4132,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
4112
4132
  })));
4113
4133
  },
4114
4134
  telemetry,
4115
- afterStart: async (ctx) => { sourceMutationGuardBindings.bind(ctx); await activityInspector.refresh(ctx); }
4135
+ afterStart: async (ctx) => {
4136
+ await independentAcceptance.activate(ctx);
4137
+ const serviceTier = serviceTierRuntime.restore(ctx);
4138
+ if (serviceTier.enabled && serviceTier.reasonCode === "provider-not-supported") {
4139
+ ctx.ui.notify("Piagent Fast mode is enabled, but the active provider is not OpenAI Codex; no service tier was changed.", "warning");
4140
+ }
4141
+ sourceMutationGuardBindings.bind(ctx);
4142
+ await activityInspector.refresh(ctx);
4143
+ }
4116
4144
  });
4117
4145
 
4118
4146
  registerSessionHooks(pi, {
@@ -4126,13 +4154,17 @@ export default function piagentGuard(pi: ExtensionAPI) {
4126
4154
  flushObservedTaskContext,
4127
4155
  onTurnEnd: activityInspector.refresh,
4128
4156
  onAgentSettled: activityInspector.refresh,
4129
- beforeShutdown: (ctx) => {
4157
+ beforeShutdown: async (ctx) => {
4158
+ await independentAcceptance.clear(ctx);
4159
+ serviceTierRuntime.forget(ctx);
4130
4160
  sourceMutationGuardBindings.unbind(ctx);
4131
4161
  editFreshnessGuard.clear(ctx);
4132
4162
  activityInspector.dispose(ctx);
4133
4163
  sessionCapabilityDigests.delete(`${ctx.cwd}\0${ctx.sessionManager.getSessionId()}`);
4134
4164
  }
4135
4165
  });
4166
+ registerTaskUsageHooks(pi, { activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined, telemetry });
4167
+ pi.on("turn_end", (event, ctx) => independentAcceptance.observeTurnEnd(ctx, event.message));
4136
4168
 
4137
4169
  registerInputHook(pi, {
4138
4170
  state: runtimeState,
@@ -4184,10 +4216,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
4184
4216
 
4185
4217
  registerCompletionHook(pi, {
4186
4218
  state: runtimeState,
4219
+ prepareIndependentAcceptance: (ctx, task, response) => independentAcceptance.prepare(ctx, task, response),
4220
+ deferIndependentCompletion: (ctx, task, response, finalizer) => independentAcceptance.deferCompletion(ctx, task, response, finalizer),
4221
+ projectIndependentLifecycle: (ctx, task, candidate) => independentAcceptance.projectLifecycle(ctx, task, candidate),
4222
+ nativeRefusalFallbackAllowed: () => !independentVerificationConfigPath,
4187
4223
  maxManifestFiles: contextBudgetConfig(policy).maxManifestFiles,
4188
4224
  activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined,
4189
4225
  flushObservedTaskContext,
4190
4226
  completionProjection: completionTaskProjection,
4227
+ acceptanceEvidenceFiles: taskAcceptanceEvidenceFiles,
4191
4228
  evaluateGate: (cwd, task, currentDigests, currentDigest) => {
4192
4229
  const gate = evaluateTaskGate(cwd, task, policy, { currentDigests, currentWorkingTreeDigest: currentDigest });
4193
4230
  const repairBlock = (taskAuthorityDecision(task, "CAP-13", "block").allowed
@@ -4219,7 +4256,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4219
4256
  redactText,
4220
4257
  observedTaskContext: observedTaskContextFromToolResult,
4221
4258
  recordObservedTaskChanges,
4222
- recordObservedTaskVerification,
4259
+ recordObservedTaskVerification: (...args) => recordObservedTaskVerification(...args, policy.finalGate?.acceptanceProofMode === "diagnostic"),
4223
4260
  extractLikelyPath: extractLikelyPathFromInput,
4224
4261
  mutationTargets: taskMutationTargets,
4225
4262
  isShellTool: (toolName) => SHELL_TOOL_NAMES.has(toolName),
@@ -4298,7 +4335,8 @@ export default function piagentGuard(pi: ExtensionAPI) {
4298
4335
  });
4299
4336
  return { block: true, reason: `Blocked ${event.toolName}: ${helperPreflight.reason} Do not retry this helper; continue in the parent.` };
4300
4337
  }
4301
- const verifierReuse = reuseCurrentTreeExactVerifier({ cwd: ctx.cwd, task, toolName: event.toolName, toolInput, sessionEntries: ctx.sessionManager.getEntries() as unknown[] });
4338
+ const verifierReuse = reuseCurrentTreeExactVerifier({ cwd: ctx.cwd, task, toolName: event.toolName, toolInput, sessionEntries: ctx.sessionManager.getEntries() as unknown[],
4339
+ getHostProjectVerificationDigest: (snapshot, command) => task ? runtimeState.projectVerification.currentDigest(ctx, task, snapshot, command) : null });
4302
4340
  if (verifierReuse.reused) {
4303
4341
  telemetry(ctx, { event: "verifier_evidence_reused", recordedAt: nowIso(), taskRunId: task?.taskRunId, toolCallId: event.toolCallId, reasonCode: verifierReuse.reasonCode, commandDigest: verifierReuse.commandDigest, workingTreeDigest: verifierReuse.workingTreeDigest }); return;
4304
4342
  }
@@ -4329,7 +4367,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4329
4367
  const expectedReviewPaths = taskDeltaFilesFromSnapshot(task, currentSnapshot);
4330
4368
  const targets = targetInspection.targets;
4331
4369
  const boundedTargetMutation = targets.length > 0;
4332
- const verifierCurrent = allVerifyCommandsPassCurrentTree(task, currentDigest);
4370
+ const verifierCurrent = allVerifyCommandsPassCurrentTree(task, currentDigest, currentWorkspaceRevisionDigest(ctx.cwd));
4333
4371
 
4334
4372
  if (phase.phase === "verify" && boundedTargetMutation && semanticRepairEnabled && semanticRepairRuntime.prepare({
4335
4373
  ctx, task, event, currentDigest, currentDeltaPaths: expectedReviewPaths, targetPaths: targets,
@@ -4579,7 +4617,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4579
4617
  const governedTaskProfile = !profileMode.startsWith("unprofiled") && !profileMode.includes("unreadable");
4580
4618
  const taskContractRequired = governedTaskProfile
4581
4619
  && runtime.finalGate === "enforce"
4582
- && finalGateConfig(policy).requireTaskContract;
4620
+ && finalGateConfig(policy, DEFAULT_POLICY).requireTaskContract;
4583
4621
  if (sessionTask?.trace.outcome === "pending" && (sessionTask.changeMode === "read-only" || sessionTask.mutationPolicy === "forbidden")
4584
4622
  && !SHELL_TOOL_NAMES.has(event.toolName) && isTaskMutationTool(event.toolName, toolInput)) {
4585
4623
  return {
@@ -4620,7 +4658,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4620
4658
  reason: "Shared source checkouts are shell-inaccessible. Inspect the exact session-granted checkout with read, grep, find, or ls; cache mutation is never authorized."
4621
4659
  };
4622
4660
  }
4623
- shellProjectMutation = isProjectMutatingShellCommand(command, execDecision.segments);
4661
+ shellProjectMutation = isProjectMutatingShellCommand(command, execDecision.segments, ctx.cwd);
4624
4662
  configuredVerifierShell = Boolean(sessionTask && commandMatchesVerifyPlan(command, sessionTask.verifyCommands));
4625
4663
  const shellWriteCandidates = extractShellWritePathCandidates(command);
4626
4664
  shellMutationTargetBounded = shellWriteCandidates.length > 0;
@@ -4636,7 +4674,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4636
4674
  const mutationForbidden = sessionTask?.trace.outcome === "pending"
4637
4675
  && (sessionTask.changeMode === "read-only" || sessionTask.mutationPolicy === "forbidden");
4638
4676
  const exactForbiddenTaskVerifier = mutationForbidden && sessionTask.changeMode === "source-change" && configuredVerifierShell;
4639
- if (mutationForbidden && !exactForbiddenTaskVerifier && !isReadOnlyTaskShellCommand(command, execDecision.segments)) {
4677
+ if (mutationForbidden && !exactForbiddenTaskVerifier && !isReadOnlyTaskShellCommand(command, execDecision.segments, ctx.cwd)) {
4640
4678
  return {
4641
4679
  block: true,
4642
4680
  reason: `Task ${sessionTask.taskId} ${sessionTask.changeMode === "read-only" ? "is read-only; this shell command is not in the read-only inspection allowlist" : "forbids source mutation; this shell command is neither bounded inspection nor an exact configured verifier"}.`
@@ -4841,7 +4879,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4841
4879
  && sessionTask.changeMode === "source-change"
4842
4880
  && (shellProjectMutation || configuredVerifierShell)
4843
4881
  ) {
4844
- runtimeState.rememberShellMutationSnapshot(ctx, event.toolName, event.input);
4882
+ runtimeState.rememberShellMutationSnapshot(ctx, event.toolName, event.input, event.toolCallId);
4845
4883
  }
4846
4884
  }
4847
4885
  });
@@ -4863,6 +4901,8 @@ export default function piagentGuard(pi: ExtensionAPI) {
4863
4901
  createTaskRunId, crypto, currentSessionName, defaultRolePolicy, defaultWorkPlan, digestJson,
4864
4902
  dynamicToolsEnabled, effectiveProtectedPaths, emitRuntimeMessage, ensureContextIndexV2, estimateContextTokens,
4865
4903
  evaluateExecPolicy, evaluateModelRoute, evaluateRetrievalRoute, evaluateRuntimeSolver, evaluateTaskGate, evaluateToolPolicy, execPolicyConfig,
4904
+ prepareIndependentAcceptance: (ctx: ExtensionContext, task: TaskContract, response?: { origin: "assistant"; bytes: string }) =>
4905
+ independentAcceptance.prepare(ctx, task, response),
4866
4906
  extensionDir, externalActionPolicyConfig, extractDocument, finalGateConfig, findMatchingObservedBashResult,
4867
4907
  formatContextPreflight, formatCount, formatLiveTaskStatus, formatPercent, formatTechOptionsText, formatTechSelectionSummary,
4868
4908
  formatToolResultCaptureStatus, formatUsageSnapshot, fs, hasGitEvidenceRoot, hasOperatorSessionName, helpersMode,
@@ -4880,7 +4920,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4880
4920
  safeTaskId, searchContextIndex, searchContextIndexV2, searchMemoryFiles, selectRuntimeAction,
4881
4921
  selectValueFromUi, selectVerificationPlan, semanticCompactionInstructions, sendWorkflowFollowUp, setPermissionOverrideForContext,
4882
4922
  semanticRepairCompletionBlock: (cwd: string, taskRunId: string) => semanticRepairRuntime.completionBlock(cwd, taskRunId),
4883
- freshRequestParts, shellArg, shortTaskLabel, solverShadow, summarizeAttempt, taskChangedFileEvidence,
4923
+ freshRequestParts, shellArg, shortTaskLabel, solverShadow, summarizeAttempt, taskAcceptanceEvidenceFiles, taskChangedFileEvidence,
4884
4924
  techContextDirPath, techContextFilePath, techContextRelativePath, techOptionById, techStackPath,
4885
4925
  telemetry, toolRegistryConfig, trajectoryRuntime, uniqueStrings, usageExactCommands,
4886
4926
  validTaskScopePattern, validateNewWorkPlan, verifierCommandInstructions, verifyProjectCapabilityState, workingTreeEvidenceDigest,
@@ -4911,9 +4951,10 @@ export default function piagentGuard(pi: ExtensionAPI) {
4911
4951
 
4912
4952
  function commandArgs(raw: string): { action: string; rest: string; tokens: string[] } {
4913
4953
  const trimmed = String(raw ?? "").trim();
4914
- const tokens = trimmed.split(/\s+/).filter(Boolean);
4915
- const action = (tokens.shift() ?? "").toLowerCase();
4916
- return { action, rest: tokens.join(" "), tokens };
4954
+ const match = /^(\S+)(?:\s+([\s\S]*))?$/.exec(trimmed);
4955
+ const action = (match?.[1] ?? "").toLowerCase();
4956
+ const rest = match?.[2] ?? "";
4957
+ return { action, rest, tokens: rest.split(/\s+/).filter(Boolean) };
4917
4958
  }
4918
4959
 
4919
4960
  function shellArg(value: string): string {
@@ -4945,6 +4986,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
4945
4986
  }
4946
4987
 
4947
4988
  registerPermissionCommands(pi, registrationDeps);
4989
+ registerFastModeCommand(pi, serviceTierRuntime);
4948
4990
  const profileCommandApi = registerProfileCommands(pi, registrationDeps);
4949
4991
  registerMemoryMcpCommands(pi, registrationDeps);
4950
4992
  const contextCommandApi = registerContextCommands(pi, registrationDeps);