@piagent/platform 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/operator-manual-vietnamese.md +12 -12
  175. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  176. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  177. package/docs/piagent-core-improvement-plan.md +528 -0
  178. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  179. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  180. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  181. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  182. package/docs/piagent-open-session-wait.md +19 -0
  183. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  184. package/docs/publishing-for-teams.md +2 -0
  185. package/docs/quality-benchmark.md +128 -8
  186. package/docs/quickstart-vietnamese.md +2 -2
  187. package/docs/release-install-policy.md +32 -9
  188. package/docs/research/harness-next-evidence-review.md +113 -0
  189. package/docs/team-onboarding.md +7 -7
  190. package/docs/third-party-neutrality.md +7 -0
  191. package/docs/usage-observability.md +1 -1
  192. package/docs-site/architecture.html +1 -1
  193. package/docs-site/benchmark.html +1 -1
  194. package/docs-site/commands.html +1 -1
  195. package/docs-site/content/en/runtime.html +1 -1
  196. package/docs-site/content/en/whats-new.html +11 -0
  197. package/docs-site/content/runtime.html +2 -2
  198. package/docs-site/content/whats-new.html +11 -0
  199. package/docs-site/context-engine.html +1 -1
  200. package/docs-site/en/architecture.html +1 -1
  201. package/docs-site/en/benchmark.html +1 -1
  202. package/docs-site/en/commands.html +1 -1
  203. package/docs-site/en/context-engine.html +1 -1
  204. package/docs-site/en/index.html +1 -1
  205. package/docs-site/en/mcp-approval.html +1 -1
  206. package/docs-site/en/mcp-auth.html +1 -1
  207. package/docs-site/en/mcp-servers.html +1 -1
  208. package/docs-site/en/mcp.html +1 -1
  209. package/docs-site/en/permissions.html +1 -1
  210. package/docs-site/en/profiles.html +1 -1
  211. package/docs-site/en/quickstart.html +1 -1
  212. package/docs-site/en/runtime.html +2 -2
  213. package/docs-site/en/scope.html +1 -1
  214. package/docs-site/en/security.html +1 -1
  215. package/docs-site/en/team.html +1 -1
  216. package/docs-site/en/whats-new.html +12 -1
  217. package/docs-site/en/workflows.html +1 -1
  218. package/docs-site/index.html +1 -1
  219. package/docs-site/mcp-approval.html +1 -1
  220. package/docs-site/mcp-auth.html +1 -1
  221. package/docs-site/mcp-servers.html +1 -1
  222. package/docs-site/mcp.html +1 -1
  223. package/docs-site/permissions.html +1 -1
  224. package/docs-site/profiles.html +1 -1
  225. package/docs-site/quickstart.html +1 -1
  226. package/docs-site/runtime.html +3 -3
  227. package/docs-site/scope.html +1 -1
  228. package/docs-site/security.html +1 -1
  229. package/docs-site/team.html +1 -1
  230. package/docs-site/whats-new.html +12 -1
  231. package/docs-site/workflows.html +1 -1
  232. package/evals/architecture-conformance-v1/lane.json +18 -0
  233. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  234. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  235. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  236. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  238. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  240. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  241. package/evals/fixtures/composite-criterion.valid.json +33 -0
  242. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  243. package/evals/fixtures/contract-family-library.valid.json +41 -0
  244. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  245. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  246. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  247. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  248. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  252. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  254. package/evals/fs5-artifact-archive/README.md +32 -0
  255. package/evals/fs5-artifact-archive/manifest.json +148 -0
  256. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  257. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  258. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  259. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  260. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  261. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  262. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  263. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  264. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  265. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  266. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  267. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  268. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  269. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  270. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  271. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  272. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  273. package/evals/fs5-causal-arm.v1.json +9 -5
  274. package/evals/fs5-pilot-protocol.v1.json +1 -1
  275. package/evals/fs5-pilot-protocol.v4.json +4 -4
  276. package/evals/fs5-pilot-protocol.v5.json +6 -5
  277. package/evals/harness-next/development-corpus.mjs +106 -0
  278. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  279. package/evals/harness-next/run-calibration.mjs +83 -0
  280. package/evals/harness-next/run-resource-probe.mjs +55 -0
  281. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  282. package/evals/harness-next.v1.json +51 -0
  283. package/evals/long-horizon-v1/README.md +19 -0
  284. package/evals/long-horizon-v1/runner.mjs +116 -48
  285. package/evals/long-horizon-v1/worker.mjs +77 -30
  286. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  287. package/evals/private-holdout-v1/README.md +5 -2
  288. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  289. package/package.json +9 -4
  290. package/packages/piagent-core/README.md +2 -2
  291. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  292. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  293. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  294. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  295. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  296. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  297. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  298. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  299. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  300. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  301. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  303. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  304. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  305. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  306. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  307. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  309. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  310. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  311. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  312. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  313. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  314. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  315. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  317. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  318. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  319. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  320. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  321. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  322. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  323. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  325. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  326. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  328. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  329. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  330. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  331. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  332. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  334. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  335. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  336. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  337. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  338. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  339. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  340. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  341. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  342. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  343. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  344. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  345. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  346. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  347. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  348. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  349. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  350. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  351. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  352. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  354. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  355. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  356. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  357. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  358. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  359. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  360. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  363. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  364. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  365. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  366. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  368. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  369. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  370. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  371. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  372. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  373. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  393. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  394. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  395. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  396. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  397. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  398. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  400. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  401. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  402. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  405. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  406. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  407. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  408. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  409. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  410. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  411. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  412. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  413. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  414. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  415. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  416. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  417. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  418. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  419. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  421. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  422. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  423. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  424. package/packages/piagent-core/extensions/context-engine.js +11 -6
  425. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  426. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  427. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  428. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  429. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  430. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  431. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  432. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  433. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  434. package/packages/piagent-core/extensions/task-journal.js +48 -3
  435. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  436. package/packages/piagent-core/extensions/task-state.js +74 -38
  437. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  438. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  439. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  440. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  441. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  442. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  443. package/packages/piagent-core/package.json +3 -3
  444. package/packages/piagent-core/policies/base-policy.json +1 -0
  445. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  446. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  447. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  448. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  449. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  450. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  451. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  452. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  453. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  454. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  455. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  457. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  458. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  461. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  462. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  463. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  464. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  465. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  466. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  467. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  468. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  469. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  470. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  471. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  472. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  473. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  474. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  475. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  476. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  477. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  478. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  479. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  480. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  481. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  482. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  483. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  484. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  485. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  486. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  487. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  488. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  489. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  490. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  491. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  492. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  493. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  494. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  495. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  496. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  497. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  498. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  499. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  500. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  501. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  502. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  503. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  504. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  505. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  506. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  507. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  508. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  509. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  510. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  511. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  512. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  513. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  514. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  515. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  516. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  517. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  518. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  519. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  520. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  521. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  522. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  523. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  524. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  525. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  526. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  527. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  528. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  529. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  530. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  531. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  532. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
  533. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  534. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  535. package/packages/piagent-webui/dist/client/index.html +2 -2
  536. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  537. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  538. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  539. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  540. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  541. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  542. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  543. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  544. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  545. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  546. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  547. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  548. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  549. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  550. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  551. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  552. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  553. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  554. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  555. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  556. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  557. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  558. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  559. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  560. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  561. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  562. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  563. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  564. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  565. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  566. package/schemas/approved-host-contracts.schema.json +973 -0
  567. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  568. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  569. package/schemas/composite-criterion.schema.json +788 -0
  570. package/schemas/contract-family-library.schema.json +28 -0
  571. package/schemas/contract-selection-recipe.schema.json +31 -0
  572. package/schemas/failure-evidence.schema.json +2 -2
  573. package/schemas/helper-request.schema.json +16 -4
  574. package/schemas/host-contract-plan.schema.json +25 -0
  575. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  576. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  577. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  578. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  579. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  580. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  581. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  582. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  583. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  584. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  585. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  586. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  587. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  588. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  589. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  590. package/schemas/task-contract.schema.json +30 -0
  591. package/scripts/approve-independent-verification.mjs +57 -0
  592. package/scripts/benchmark-arm-observer.mjs +320 -0
  593. package/scripts/benchmark-budget-ipc.mjs +34 -0
  594. package/scripts/benchmark-budget-launcher.mjs +91 -0
  595. package/scripts/benchmark-budget-processes.mjs +133 -0
  596. package/scripts/benchmark-budget-publication.mjs +228 -0
  597. package/scripts/benchmark-budget-runtime.mjs +136 -0
  598. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  599. package/scripts/benchmark-codex-journey.mjs +406 -0
  600. package/scripts/benchmark-independent-verification.mjs +628 -0
  601. package/scripts/benchmark-journey-outcome.mjs +92 -0
  602. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  603. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  604. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  605. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  606. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  607. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  608. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  609. package/scripts/benchmark-runner-completion.mjs +133 -0
  610. package/scripts/benchmark-runner-configuration.mjs +159 -0
  611. package/scripts/benchmark-runner-core.mjs +217 -388
  612. package/scripts/benchmark-runner-finalization.mjs +140 -27
  613. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  614. package/scripts/benchmark-runner-schedule.mjs +256 -0
  615. package/scripts/benchmark-runner-support.mjs +136 -4
  616. package/scripts/benchmark-runner.mjs +95 -18
  617. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  618. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  619. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  620. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  621. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  622. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  623. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  624. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  625. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  626. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  627. package/scripts/benchmark-session-evaluator.mjs +169 -0
  628. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  629. package/scripts/benchmark-session-usage.mjs +28 -0
  630. package/scripts/benchmark-session.mjs +343 -50
  631. package/scripts/benchmark-webui-journey.mjs +678 -0
  632. package/scripts/check-public-wording.mjs +46 -0
  633. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  634. package/scripts/phase-tools-evaluation.mjs +1 -0
  635. package/scripts/pi-auto.sh +7 -1
  636. package/scripts/pi-usage-history.mjs +201 -11
  637. package/scripts/piagent-cli.mjs +8 -0
  638. package/scripts/private-holdout-readiness.mjs +7 -1
  639. package/scripts/public-evaluation-exposure.mjs +140 -0
  640. package/scripts/select-independent-verification.mjs +62 -0
  641. package/scripts/typescript-loader.mjs +135 -1
  642. package/scripts/update-global.mjs +6 -7
  643. package/scripts/verify-local.sh +36 -55
  644. package/scripts/verify-release-identity.mjs +5 -3
  645. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -1,23 +1,33 @@
1
- import crypto from "node:crypto";
1
+ import { inferAcceptanceObligations } from "./acceptance-obligations.js";
2
+ export { inferAcceptanceObligations };
2
3
  import path from "node:path";
3
4
  import { changedFileAcceptanceCorpus, emptyAcceptanceCorpus, isAcceptanceTestPath } from "./acceptance-language-adapters.js";
4
5
  import { durableContextEvidenceEntries, hasDurableContextEvidence } from "./context-evidence.js";
5
6
  import { matchesAnyPath, normalizePathCandidate } from "./policy-core.js";
6
7
  import { baselineReturnRepresentationConflicts, returnRepresentationGuidance } from "./return-contract.js";
7
8
  import { hasLengthPrefixedIdentityKey, tenantAssertionSignals } from "./tenant-contract.js";
8
- import { criterionBehaviorProofDisposition, criterionRequiresBehavioralProof, durableBehaviorProofRequired, genericCriterionEvidence, genericFallbackEvidence, isVerificationOnlyCriterion, verifierCommandsCoverTests } from "./acceptance-behavior-proof.js";
9
- import { latestObservedVerificationEvidence, meaningfulVerificationCommands, verificationEvidenceProvesStableTree } from "./verification-intelligence.js";
9
+ import { acceptanceTextHash as sha256, acceptanceEvidenceKey as evidenceKey, compoundAcceptanceCriterion, acceptanceCriterionBindingValid, resetUnprovenCriterion, criterionBehaviorProofDisposition, criterionRequiresBehavioralProof, durableBehaviorProofRequired, genericCriterionEvidence, genericFallbackEvidence, isVerificationOnlyCriterion, verifierCommandsCoverTests } from "./acceptance-behavior-proof.js";
10
+ import { allConfiguredVerifierEvidenceCurrent as hasCurrentPassingVerifier, latestObservedVerificationEvidence, meaningfulVerificationCommands, verificationEvidenceProvesStableTree, verificationProjectionWorkspaceRevision } from "./verification-intelligence.js";
10
11
  import {
11
12
  acceptanceContractProofGuidance,
12
13
  acceptanceContractSemanticConflicts,
13
14
  acceptanceInvalidInputEvidence
14
15
  } from "./acceptance-contract-semantics.js";
16
+ import { malformedIdentifierCriterionText } from "./acceptance-identifier-criteria.js";
17
+ import { contextualTemporalCriterion } from "./acceptance-temporal-contract.js";
18
+ import { temporalProofReasonGuidance } from "./acceptance-boundary-guidance.js";
19
+ import { acceptancePrecedenceContractGuidance, acceptancePrecedenceReceiptEvidence } from "./acceptance-precedence-contract.js";
15
20
  import { isCurrentWorkingTreeDigest, WORKING_TREE_DIGEST_ALGORITHM } from "./working-tree-digest.js";
16
-
21
+ import { independentAcceptanceState, applyIndependentCriterionAssessment } from "./acceptance-independent-registry.js";
22
+ import { missingAcceptanceProofCapabilities } from "./acceptance-proof-capability.js";
23
+ import { boundAcceptanceClauseGroup, allClauseEvidence } from "./acceptance-clause-group.js";
24
+ import { documentContentCriterionEvidence } from "./acceptance-document-content.js";
25
+ import { invalidInputReceiptProof } from "./acceptance-invalid-input-receipt.js";
26
+ import { boundaryTargetHasLiveSuccess } from "./acceptance-boundary-binding.js";
27
+ import { apiBaselineCriterionEvidence, apiBaselineRecoveryProjection } from "./acceptance-api-baseline.js";
17
28
  export const ACCEPTANCE_RECEIPT_SCHEMA_VERSION = 1;
18
29
  export const ACCEPTANCE_STATUSES = new Set(["pending", "satisfied", "blocked"]);
19
30
  export const ACCEPTANCE_PRIORITIES = new Set(["normal", "critical"]);
20
-
21
31
  const CRITICAL_OBLIGATIONS = new Set([
22
32
  "authorization-deny-case",
23
33
  "tenant-boundary",
@@ -26,7 +36,6 @@ const CRITICAL_OBLIGATIONS = new Set([
26
36
  "boundary-case",
27
37
  "read-only-evidence"
28
38
  ]);
29
-
30
39
  const MAX_CRITERIA = 12;
31
40
  const MAX_EVIDENCE_PER_CRITERION = 8;
32
41
  const RECEIPT_FIELDS = new Set(["schemaVersion", "source", "promptHash", "generatedAt", "criteria", "provenance", "helperUsage"]);
@@ -45,11 +54,6 @@ const FAILURE_CATEGORIES = new Set(["passed", "compile-typecheck", "test-asserti
45
54
  const HASH = /^[a-f0-9]{64}$/;
46
55
  const SAFE_REF = /^[a-z0-9.][a-z0-9:._/-]{0,511}$/i;
47
56
  const READ_ONLY_BOUNDARY = /\b(?:read-only|no\s+(?:code|source|project|file|workspace|repo(?:sitory)?)?\s*(?:edits?|changes?|mutations?)|do not\s+(?:edit|change|modify|mutate|touch)(?: files?| source| project| repo| workspace)?|leave\s+(?:the\s+)?(?:source|project|repo|workspace)\s+(?:unchanged|unmodified)|khong\s+(?:sua|edit|thay\s+doi)(?: file| source| project)?)\b/;
48
-
49
- function sha256(value) {
50
- return crypto.createHash("sha256").update(String(value ?? "")).digest("hex");
51
- }
52
-
53
57
  function compactId(value, fallback = "criterion") {
54
58
  return String(value ?? fallback)
55
59
  .trim()
@@ -81,9 +85,6 @@ function normalizedText(value) {
81
85
  .replace(/[\u0300-\u036f]/g, "")
82
86
  .toLowerCase();
83
87
  }
84
- function includesAny(text, patterns) {
85
- return patterns.some((pattern) => pattern.test(text));
86
- }
87
88
  function pathBoundaryMentioned(text, patterns) {
88
89
  const value = normalizedText(text);
89
90
  return uniqueStrings(patterns).some((pattern) => {
@@ -116,68 +117,6 @@ function acceptanceReadOnlyInferenceOptions(input, text) {
116
117
  };
117
118
  }
118
119
 
119
- export function inferAcceptanceObligations(text, changeMode = "source-change", options = {}) {
120
- const value = normalizedText(text);
121
- const accessControlText = value
122
- .replace(/`[^`\n]*`/g, " ")
123
- .replace(/\b(?:[a-z0-9_.@-]+\/)+[a-z0-9_.@/-]+\b/g, " ");
124
- const obligations = [];
125
- if (changeMode === "read-only" || options.mutationPolicy === "forbidden" || options.readOnlyBoundary === true) {
126
- obligations.push("read-only-evidence");
127
- }
128
- const actorAccessControl = includesAny(accessControlText, [
129
- /\b(?:admins?|roles?|owners?|users?|callers?|resources?)\b[\s\S]{0,80}\b(?:access|allow(?:ed)?|deny|denied|block(?:ed)?|forbid(?:den)?|manag(?:e|es|ed|ing))\b/,
130
- /\b(?:access|allow(?:ed)?|deny|denied|block(?:ed)?|forbid(?:den)?|manag(?:e|es|ed|ing))\b[\s\S]{0,80}\b(?:admins?|roles?|owners?|users?|callers?|resources?)\b/
131
- ]);
132
- const explicitAuthorization = includesAny(accessControlText, [
133
- /\bauth(?:orization)?\b/, /\bunauthoriz(?:ed|ation)\b/, /\bpermission\b/
134
- ]) || actorAccessControl;
135
- const ownerAccessControl = /\bowner\b/.test(accessControlText) && includesAny(accessControlText, [
136
- /\busers?\b/, /\bresources?\b/, /\baccess\b/, /\bmanag(?:e|es|ed|ing)\b/, /\bauth(?:orization)?\b/, /\bpermission\b/, /\broles?\b/
137
- ]);
138
- if (explicitAuthorization || ownerAccessControl) {
139
- obligations.push("authorization-deny-case");
140
- }
141
- const tenantMentioned = includesAny(value, [/\btenants?\b/, /\bcross[- ]tenant\b/, /\bsame[- ]tenant\b/, /\btenantid\b/]);
142
- const tenantStorage = tenantMentioned && includesAny(value, [
143
- /\bcache\b/, /\bcache[- ]?key\b/, /\bstorage\b/, /\bcollision\b/, /\bentity\b/, /\bsame tuple\b/
144
- ]);
145
- const strongAuthorization = includesAny(accessControlText, [
146
- /\bauth(?:orization)?\b/, /\bunauthoriz(?:ed|ation)\b/, /\bpermission\b/
147
- ]);
148
- const tenantActorAccess = tenantMentioned && actorAccessControl;
149
- const explicitTenantAccessBoundary = includesAny(value, [
150
- /\bcross[- ]tenant\b/, /\bsame[- ]tenant\b/, /\btenant boundary\b/,
151
- /\btenantid\b[\s\S]{0,100}\b(?:equal|match|same non-empty|access|allow|deny|block|forbid)/,
152
- /\b(?:access|allow|deny|block|forbid)[\s\S]{0,100}\btenantid\b/
153
- ]) && includesAny(value, [
154
- /\baccess\b/, /\ballow(?:ed)?\b/, /\b(?:deny|denied)\b/, /\bblock(?:ed)?\b/, /\bforbid(?:den)?\b/,
155
- /\bequal\b/, /\bmatch(?:es|ed|ing)?\b/, /\bsame non-empty\b/
156
- ]);
157
- if (tenantMentioned) {
158
- if (tenantStorage) {
159
- obligations.push("tenant-storage-isolation");
160
- } else if (strongAuthorization || ownerAccessControl || tenantActorAccess || explicitTenantAccessBoundary) {
161
- obligations.push("tenant-boundary");
162
- }
163
- }
164
- const explicitInvalidInput = includesAny(value, [/\binvalid\b/, /\btypeerror\b/, /\bthrow\b/, /\bnon-negative\b/, /\bpositive integer\b/, /\binteger\b/]);
165
- const rejectInvalidInput = /\breject(?:s|ed|ion)?\b/.test(value)
166
- && !/\breject(?:s|ed|ion)?\s+(?:no\s+)?valid\b/.test(value)
167
- && includesAny(value, [/\binvalid\b/, /\bbad\b/, /\bmalformed\b/, /\bnegative\b/, /\bnull\b/, /\bundefined\b/, /\bnon[- ]?(?:number|numeric)\b/, /\bout[- ]?of[- ]?range\b/]);
168
- if (explicitInvalidInput || rejectInvalidInput) {
169
- obligations.push("invalid-input-rejection");
170
- }
171
- if (includesAny(value, [/\bboundary\b/, /\bceil(?:ing)?\b/, /\bclamp\b/, /\bmin(?:imum)?\b/, /\bmax(?:imum)?\b/, /\binclusive\b/, /\bzero\b/, /\b0\b/, /\bexpiry\b/, /\bround(?:ing)?\b/, /\bedge\b/, /\bfalsey\b/, /\bfalsy\b/, /\bnullish\b/, /\bdefault(?:s)?\b/, /\bpreserv(?:e|ed|es|ing)\b/])) {
172
- obligations.push("boundary-case");
173
- }
174
- if (includesAny(value, [/\bmutation\b/, /\bunchanged\b/, /\bwithout changing\b/, /\bbackward\b/, /\bapi\b/, /\bexported api\b/, /\bfocused\b/])) {
175
- obligations.push("backward-compatibility");
176
- }
177
- if (changeMode === "source-change") obligations.push("verification-evidence");
178
- return [...new Set(obligations)];
179
- }
180
-
181
120
  function generatedCriterionForObligation(obligation) {
182
121
  switch (obligation) {
183
122
  case "authorization-deny-case":
@@ -222,7 +161,7 @@ function acceptanceCriterionText(task, criterion) {
222
161
  ? matched
223
162
  : acceptanceTaskText(task);
224
163
  }
225
-
164
+ function invalidInputCriterionText(task, criterion) { const selected = acceptanceCriterionText(task, criterion), identifierContext = malformedIdentifierCriterionText(selected, task, GENERATED_ACCEPTANCE_TEXTS); return contextualTemporalCriterion(identifierContext, selected, task, GENERATED_ACCEPTANCE_TEXTS); }
226
165
  /**
227
166
  * Produce bounded, task-derived proof guidance without a second model call.
228
167
  * These hints remain generic: they describe semantic partitions from the
@@ -251,7 +190,7 @@ export function acceptanceBaselineGuidance(task, options = {}) {
251
190
  ...(Array.isArray(task?.changedFiles) ? task.changedFiles : []),
252
191
  ...(Array.isArray(task?.observedChangedFiles) ? task.observedChangedFiles : [])
253
192
  ]).filter((file) => !/[?*\[\]{}]/.test(file) && !isAcceptanceTestPath(file));
254
- return returnRepresentationGuidance(acceptanceTaskText(task), options.cwd, files);
193
+ return uniqueStrings([...returnRepresentationGuidance(acceptanceTaskText(task), options.cwd, files), ...acceptancePrecedenceContractGuidance({ taskText: acceptanceTaskText(task), sourceEntries: changedFileAcceptanceCorpus(options.cwd, files).sourceEntries })]);
255
194
  }
256
195
 
257
196
  export function acceptanceSemanticConflicts(task, options = {}) {
@@ -288,6 +227,12 @@ export function buildAcceptanceReceipt(input = {}) {
288
227
  changeMode,
289
228
  acceptanceReadOnlyInferenceOptions(input, baseText)
290
229
  );
230
+ // Generated lifecycle metadata may suggest advisory checks, but cannot
231
+ // create a mandatory product requirement absent from operator intent.
232
+ // Keep the full receipt hash and useful existing follow-up diagnostics.
233
+ const operatorText = [input.summary, ...(Array.isArray(input.acceptanceCriteria) ? input.acceptanceCriteria : [])].filter(Boolean).join("\n");
234
+ const operatorObligations = new Set(inferAcceptanceObligations(operatorText, changeMode,
235
+ acceptanceReadOnlyInferenceOptions(input, operatorText)));
291
236
  const texts = uniqueStrings(Array.isArray(input.acceptanceCriteria) ? input.acceptanceCriteria : []);
292
237
  const generatedObligations = new Map();
293
238
  for (const obligation of obligations) {
@@ -307,7 +252,7 @@ export function buildAcceptanceReceipt(input = {}) {
307
252
  : generatedCriterionForObligation("verification-evidence"));
308
253
  }
309
254
  const acceptanceCriteria = texts.slice(0, MAX_CRITERIA);
310
- const durableBehaviorProof = durableBehaviorProofRequired(baseText, changeMode);
255
+ const durableBehaviorProof = durableBehaviorProofRequired(input.source === "runtime" ? operatorText : baseText, changeMode);
311
256
  const criteria = acceptanceCriteria.map((text, index) => {
312
257
  const inferred = inferAcceptanceObligations(
313
258
  text,
@@ -323,7 +268,9 @@ export function buildAcceptanceReceipt(input = {}) {
323
268
  id: criterionId(text, obligation, index),
324
269
  hash: sha256(text),
325
270
  obligation,
326
- priority: CRITICAL_OBLIGATIONS.has(obligation) || (durableBehaviorProof && obligation !== "verification-evidence") ? "critical" : "normal",
271
+ priority: input.source === "runtime" && generatedObligations.has(text) && !operatorObligations.has(obligation)
272
+ ? "normal"
273
+ : compoundAcceptanceCriterion(text) || CRITICAL_OBLIGATIONS.has(obligation) || (durableBehaviorProof && obligation !== "verification-evidence") ? "critical" : "normal",
327
274
  status: "pending",
328
275
  evidence: []
329
276
  };
@@ -566,17 +513,6 @@ function normalizeAcceptanceEvidence(value) {
566
513
  };
567
514
  }
568
515
 
569
- function evidenceKey(evidence) {
570
- return JSON.stringify({
571
- kind: evidence.kind,
572
- summary: evidence.summary,
573
- paths: evidence.paths ?? [],
574
- command: evidence.command,
575
- exitCode: evidence.exitCode,
576
- workingTreeDigest: evidence.workingTreeDigest
577
- });
578
- }
579
-
580
516
  function addEvidence(criterion, evidence, recordedAt) {
581
517
  const normalized = normalizeAcceptanceEvidence({ ...evidence, recordedAt });
582
518
  if (!normalized) return false;
@@ -603,10 +539,10 @@ function declaredCallableNames(sourceText) {
603
539
  return names;
604
540
  }
605
541
 
606
- function contractCallableTargets(task, criterion, sourceText = "") {
542
+ function contractCallableTargets(task, criterion, sourceText = "", criterionText) {
607
543
  const ignored = new Set(["api", "boolean", "date", "error", "false", "null", "string", "true", "typeerror", "undefined"]);
608
544
  const explicit = [];
609
- const text = acceptanceCriterionText(task, criterion);
545
+ const text = criterionText ?? acceptanceCriterionText(task, criterion);
610
546
  let previousEnd = 0;
611
547
  let roleGroup = false;
612
548
  for (const match of text.matchAll(/`([A-Za-z_$][A-Za-z0-9_$]*)\s*\([^`]*\)`/g)) {
@@ -628,12 +564,12 @@ function contractCallableTargets(task, criterion, sourceText = "") {
628
564
  return uniqueStrings([primary.name, ...productEntrypoints.map(({ name }) => name)]).slice(0, 8);
629
565
  }
630
566
 
631
- function namedCodeTargets(task, criterion, sourceText = "") {
632
- const text = acceptanceCriterionText(task, criterion);
567
+ function namedCodeTargets(task, criterion, sourceText = "", criterionText) {
568
+ const text = criterionText ?? acceptanceCriterionText(task, criterion);
633
569
  const ignored = new Set([
634
570
  "api", "boolean", "date", "error", "false", "null", "string", "true", "typeerror", "undefined"
635
571
  ]);
636
- const targets = contractCallableTargets(task, criterion, sourceText);
572
+ const targets = contractCallableTargets(task, criterion, sourceText, text);
637
573
  const callables = declaredCallableNames(sourceText);
638
574
  for (const sentence of text.split(/(?<=[.!?])\s+/)) {
639
575
  if (!/\b(?:validat(?:e|es|ed|ion)|invalid|reject(?:s|ed|ion)?|throw(?:s|ing)?|malformed)\b/i.test(sentence)) continue;
@@ -643,10 +579,7 @@ function namedCodeTargets(task, criterion, sourceText = "") {
643
579
  }
644
580
  return uniqueStrings(targets).slice(0, 8);
645
581
  }
646
-
647
- function explicitlyCallableTargets(task, criterion, sourceText = "") {
648
- return contractCallableTargets(task, criterion, sourceText);
649
- }
582
+ function explicitlyCallableTargets(task, criterion, sourceText = "", criterionText) { return contractCallableTargets(task, criterion, sourceText, criterionText); }
650
583
 
651
584
  function booleanAssertionSignals(testText) {
652
585
  const text = String(testText ?? "");
@@ -711,23 +644,12 @@ function focusedContractEvidence(obligation, task, corpus, verifierEvidence, cri
711
644
  };
712
645
  }
713
646
 
714
- function hasCurrentPassingVerifier(task, currentWorkingTreeDigest) {
715
- if (task?.workingTreeDigestAlgorithm !== WORKING_TREE_DIGEST_ALGORITHM
716
- || !isCurrentWorkingTreeDigest(currentWorkingTreeDigest)) return false;
717
- const planned = meaningfulVerificationCommands(task?.verifyCommands ?? []);
718
- const latest = latestObservedVerificationEvidence(task?.verifyEvidence);
719
- return planned.length > 0 && planned.every((command) => {
720
- const evidence = latest.get(command.trim());
721
- return verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest);
722
- });
723
- }
724
-
725
- function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd) {
726
- const passingVerifier = hasCurrentPassingVerifier(task, currentWorkingTreeDigest);
647
+ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, sourceProofRequiredIds, apiBaselineEvidence, strictClauseProof = false) {
648
+ const passingVerifier = hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest);
727
649
  const latestVerifyEvidence = latestObservedVerificationEvidence(task?.verifyEvidence);
728
650
  const verifyEvidence = meaningfulVerificationCommands(task?.verifyCommands ?? [])
729
651
  .map((command) => latestVerifyEvidence.get(command.trim()))
730
- .filter((evidence) => verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest));
652
+ .filter((evidence) => verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest, workspaceRevisionDigest));
731
653
  const verifier = verifyEvidence[0];
732
654
  const verifierEvidence = verifier ? {
733
655
  kind: "verify-command",
@@ -737,6 +659,18 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
737
659
  workingTreeDigest: currentWorkingTreeDigest
738
660
  } : undefined;
739
661
  if (semanticConflictReasons(obligation, task, corpus, criterion).length > 0) return undefined;
662
+ // An exact API-preservation clause cannot borrow weaker evidence from an inferred category.
663
+ const api = apiBaselineCriterionEvidence({ task, criterion, cwd, corpus, currentWorkingTreeDigest, workspaceRevisionDigest, apiBaselineEvidence });
664
+ if (api.handled) return api.evidence;
665
+ const document = documentContentCriterionEvidence({ task, criterion, corpus, cwd, passingVerifier, verifierEvidence, currentWorkingTreeDigest, workspaceRevisionDigest });
666
+ if (document.handled) return document.evidence;
667
+ // Group children require a checker covering the complete clause. Legacy
668
+ // lexical/category matches may cover only one phrase in a longer sentence.
669
+ if (strictClauseProof) {
670
+ const text = acceptanceCriterionText(task, criterion);
671
+ return /^(?:Run the configured verification[.]?|The configured verification command passes after the final mutation[.]?)$/.test(text)
672
+ && passingVerifier ? verifierEvidence : undefined;
673
+ }
740
674
 
741
675
  if (obligation === "read-only-evidence") {
742
676
  const readOnlyEvidence = durableContextEvidenceEntries(task);
@@ -773,8 +707,18 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
773
707
  return undefined;
774
708
  }
775
709
 
710
+ const precedence = acceptancePrecedenceReceiptEvidence({ obligation, taskText: acceptanceCriterionText(task, criterion), sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries, namedTargets: namedCodeTargets(task, criterion, corpus.sourceText), passingVerifier, verifierEvidence, sourceFiles: corpus.sourceFiles, testFiles: corpus.testFiles, verifierCoversTests: verifierCommandsCoverTests(task, corpus.testFiles, cwd) }); if (precedence.handled) return precedence.evidence;
711
+
776
712
  const generic = genericCriterionEvidence({ obligation, task, criterion, taskText: acceptanceTaskText(task), corpus, verifierEvidence, passingVerifier, cwd });
777
- if (generic.handled) return generic.evidence;
713
+ if (generic.handled) {
714
+ // A neutral artifact (for example a runbook) has no executable source
715
+ // linkage. Passing project smoke cannot establish its required content;
716
+ // use the existing finite missing-proof handoff without granting authority.
717
+ if (!generic.evidence && passingVerifier && criterion.priority === "critical"
718
+ && obligation === "requested-behavior" && corpus.adapter.status === "neutral"
719
+ && corpus.files.length > 0) sourceProofRequiredIds?.add(criterion.id);
720
+ return generic.evidence;
721
+ }
778
722
 
779
723
  if (!corpus.adapter.proofCapable) return undefined;
780
724
 
@@ -791,27 +735,21 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
791
735
  }
792
736
 
793
737
  if (obligation === "invalid-input-rejection") {
794
- const { sourceOk, testOk } = acceptanceInvalidInputEvidence({
795
- taskText: acceptanceCriterionText(task, criterion),
796
- sourceText: corpus.sourceText,
797
- testText: corpus.testText,
798
- sourceEntries: corpus.sourceEntries,
799
- testEntries: corpus.testEntries,
800
- namedTargets: namedCodeTargets(task, criterion, corpus.sourceText),
801
- provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText)
738
+ const criterionText = invalidInputCriterionText(task, criterion);
739
+ const result = invalidInputReceiptProof({
740
+ proofInput: { taskText: criterionText, contextText: acceptanceTaskText(task), sourceText: corpus.sourceText, testText: corpus.testText,
741
+ sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries,
742
+ namedTargets: namedCodeTargets(task, criterion, corpus.sourceText, criterionText),
743
+ provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText, criterionText) },
744
+ passingVerifier, verifierEvidence, sourceFiles: corpus.sourceFiles, testFiles: corpus.testFiles,
745
+ verifierCoversTests: verifierCommandsCoverTests(task, corpus.testFiles, cwd)
802
746
  });
803
- if (passingVerifier && corpus.sourceFiles.length > 0 && verifierCommandsCoverTests(task, corpus.testFiles, cwd) && sourceOk && testOk) {
804
- return {
805
- ...verifierEvidence,
806
- kind: "verifier-backed-focused-test",
807
- summary: "Configured verifier passed with focused invalid-input tests for named entrypoints.",
808
- paths: [...new Set([...corpus.sourceFiles, ...corpus.testFiles])]
809
- };
810
- }
811
- return undefined;
747
+ if (result.sourceProofRequired) sourceProofRequiredIds?.add(criterion.id);
748
+ return result.evidence;
812
749
  }
813
750
 
814
751
  if (obligation === "boundary-case") {
752
+ if (!boundaryTargetHasLiveSuccess({ task, criterion, corpus })) return undefined;
815
753
  const expirySourceOk = /\b(?:expiresat|expiry|expires|expired|timestamp|now)\b/.test(corpus.sourceText)
816
754
  && /(?:===|!==|>=|<=|>|<)/.test(corpus.sourceText);
817
755
  const testOk = /boundary|edge|zero|ceil|clamp|min|max|inclusive|exact|equal|equality|expired|expiry|past|future|partial|round|falsey|falsy|nullish|default|retrylimit|label|\bfalse\b|\b0\b/.test(corpus.testText);
@@ -834,14 +772,51 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
834
772
 
835
773
  export function refreshAcceptanceReceipt(task, options = {}) {
836
774
  const receipt = normalizeAcceptanceReceipt(task?.acceptanceReceipt);
837
- if (!receipt) return { task, missing: [], criticalMissing: [], adapterAbstained: [], changed: false };
775
+ if (!receipt) return { task, missing: [], criticalMissing: [], adapterAbstained: [], independentRequired: [], sourceProofRequired: [], changed: false };
838
776
  const cwd = options.cwd;
839
777
  const changedFiles = uniqueStrings(options.changedFiles ?? task.changedFiles ?? task.observedChangedFiles ?? []);
840
778
  const currentWorkingTreeDigest = options.currentWorkingTreeDigest;
779
+ const workspaceRevisionDigest = verificationProjectionWorkspaceRevision(task, options);
841
780
  const recordedAt = options.recordedAt ?? new Date().toISOString();
842
781
  const corpus = cwd ? changedFileAcceptanceCorpus(cwd, changedFiles) : emptyAcceptanceCorpus(changedFiles);
782
+ const independent = independentAcceptanceState(cwd, task, currentWorkingTreeDigest).assessments;
783
+ const sourceProofRequiredIds = new Set();
843
784
  let changed = false;
844
- for (const criterion of receipt.criteria) {
785
+ for (const [index, criterion] of receipt.criteria.entries()) {
786
+ if (!acceptanceCriterionBindingValid(task, receipt, criterion, index)) {
787
+ changed = resetUnprovenCriterion(criterion) || changed;
788
+ continue;
789
+ }
790
+ const compound = compoundAcceptanceCriterion(task.acceptanceCriteria[index]);
791
+ const runtimeArtifactContent = receipt.source === "runtime" && task.changeMode === "source-change"
792
+ && criterion.obligation === "requested-behavior" && corpus.adapter.status === "neutral"
793
+ && corpus.files.length > 0;
794
+ if ((compound || runtimeArtifactContent) && criterion.priority !== "critical") { criterion.priority = "critical"; changed = true; }
795
+ if (independent.has(criterion.id)) { changed = applyIndependentCriterionAssessment(criterion, independent.get(criterion.id), currentWorkingTreeDigest, recordedAt) || changed; continue; }
796
+ if (compound) {
797
+ const group = boundAcceptanceClauseGroup(task, receipt, criterion, index);
798
+ const childEvidence = group && task.changeMode === "source-change" && cwd
799
+ && task.workingTreeDigestAlgorithm === WORKING_TREE_DIGEST_ALGORITHM && isCurrentWorkingTreeDigest(currentWorkingTreeDigest)
800
+ ? group.children.map(child => {
801
+ const inferred = inferAcceptanceObligations(child.text, task.changeMode);
802
+ const obligation = inferred.find(item => item !== "verification-evidence" && item !== "backward-compatibility")
803
+ ?? (isVerificationOnlyCriterion(child.text) ? "verification-evidence" : undefined)
804
+ ?? (inferred.includes("backward-compatibility") ? "backward-compatibility" : "requested-behavior");
805
+ const derived = { id: child.id, hash: child.hash, obligation, priority: "critical", status: "pending", evidence: [] };
806
+ const projected = { ...task, expectedOutput: [task.expectedOutput, group.context].filter(Boolean).join("\n"),
807
+ acceptanceCriteria: task.acceptanceCriteria.map((text, position) => position === index ? child.text : text),
808
+ acceptanceReceipt: { ...receipt, criteria: receipt.criteria.map((item, position) => position === index ? derived : item) } };
809
+ const evidence = evidenceForObligation(obligation, projected, corpus, currentWorkingTreeDigest, derived, cwd,
810
+ workspaceRevisionDigest, undefined, options.apiBaselineEvidence, true);
811
+ return { id: child.id, hash: child.hash, evidence };
812
+ }) : [];
813
+ const evidence = allClauseEvidence(group, childEvidence, currentWorkingTreeDigest);
814
+ const previous = JSON.stringify(criterion);
815
+ resetUnprovenCriterion(criterion);
816
+ if (evidence) addEvidence(criterion, evidence, recordedAt);
817
+ changed = JSON.stringify(criterion) !== previous || changed;
818
+ continue;
819
+ }
845
820
  if (task?.changeMode === "source-change" && cwd) {
846
821
  const previousStatus = criterion.status;
847
822
  const previousEvidence = (criterion.evidence ?? []).map(evidenceKey);
@@ -849,7 +824,7 @@ export function refreshAcceptanceReceipt(task, options = {}) {
849
824
  criterion.evidence = [];
850
825
  const evidence = task?.workingTreeDigestAlgorithm === WORKING_TREE_DIGEST_ALGORITHM
851
826
  && isCurrentWorkingTreeDigest(currentWorkingTreeDigest)
852
- ? evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd)
827
+ ? evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, sourceProofRequiredIds, options.apiBaselineEvidence)
853
828
  : undefined;
854
829
  if (evidence) addEvidence(criterion, evidence, recordedAt);
855
830
  const nextEvidence = (criterion.evidence ?? []).map(evidenceKey);
@@ -857,16 +832,15 @@ export function refreshAcceptanceReceipt(task, options = {}) {
857
832
  continue;
858
833
  }
859
834
  if (criterion.status === "satisfied") continue;
860
- const evidence = evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd);
835
+ const evidence = evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, undefined, options.apiBaselineEvidence);
861
836
  if (evidence) changed = addEvidence(criterion, evidence, recordedAt) || changed;
862
837
  }
863
- const missing = receipt.criteria.filter((criterion) => criterion.status !== "satisfied");
864
- const passingVerifier = hasCurrentPassingVerifier(task, currentWorkingTreeDigest);
865
- const adapterAbstained = missing.filter((criterion) => criterionBehaviorProofDisposition({ obligation: criterion.obligation, task, criterion, taskText: acceptanceTaskText(task), corpus, passingVerifier }) === "unknown");
866
- const criticalMissing = missing.filter((criterion) => (criterion.priority === "critical" || criterionRequiresBehavioralProof(task, criterion, acceptanceTaskText(task))
867
- ));
838
+ const { missing, criticalMissing, adapterAbstained, independentRequired, sourceProofRequired } = missingAcceptanceProofCapabilities(task, receipt, {
839
+ corpus, passingVerifier: hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest),
840
+ taskText: acceptanceTaskText(task), independentAssessments: independent, sourceProofRequiredIds
841
+ });
868
842
  return {
869
- task: { ...task, acceptanceReceipt: receipt }, receipt, missing, criticalMissing, adapterAbstained, changed
843
+ task: { ...task, acceptanceReceipt: receipt }, receipt, missing, criticalMissing, adapterAbstained, independentRequired, sourceProofRequired, changed
870
844
  };
871
845
  }
872
846
 
@@ -885,34 +859,47 @@ export function acceptanceCriticalRecoveryProjection(task, options = {}) {
885
859
  const corpus = changedFileAcceptanceCorpus(cwd, changedFiles);
886
860
  if (!corpus.adapter.proofCapable) return [];
887
861
  if (corpus.sourceEntries.length === 0 && corpus.testEntries.length === 0) return [];
888
- const verifierCurrent = hasCurrentPassingVerifier(task, currentWorkingTreeDigest);
862
+ const workspaceRevisionDigest = verificationProjectionWorkspaceRevision(task, options);
863
+ const verifierCurrent = hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest);
864
+ const independent = independentAcceptanceState(cwd, task, currentWorkingTreeDigest).assessments;
889
865
  const projections = [];
890
866
  for (const criterion of receipt.criteria.filter((item) => item.priority === "critical")) {
867
+ // Advisory recovery must honor the same live authority as receipt refresh.
868
+ // A copied status or stale/failed assessment cannot suppress missing proof.
869
+ const assessment = independent.get(criterion.id);
870
+ if (assessment?.verdict === "pass" && assessment.completionAllowed === true) continue;
891
871
  const disposition = criterionBehaviorProofDisposition({ obligation: criterion.obligation, task, criterion, taskText: acceptanceTaskText(task), corpus, passingVerifier: verifierCurrent });
892
872
  const criterionText = (Array.isArray(task?.acceptanceCriteria) ? task.acceptanceCriteria : [])
893
873
  .find((text) => typeof text === "string" && sha256(text) === criterion.hash && !GENERATED_ACCEPTANCE_TEXTS.has(text));
894
874
  if (!criterionText) continue;
875
+ const api = apiBaselineRecoveryProjection({ task, criterion, criterionText, cwd, corpus, currentWorkingTreeDigest, workspaceRevisionDigest, apiBaselineEvidence: options.apiBaselineEvidence }); if (api.handled) { if (api.projection) projections.push(api.projection); continue; }
876
+ if (compoundAcceptanceCriterion(criterionText)) {
877
+ projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText, targets: [], missingDimensions: ["independent-compound-proof"], proofHints: ["Use an approved independent assessment covering every clause of this exact criterion. A partial verifier or source heuristic cannot prove the group; do not edit source solely to satisfy that heuristic."] });
878
+ continue;
879
+ }
895
880
  if (disposition === "unknown") { projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: [], missingDimensions: ["adapter-linkage"], proofHints: ["Add a focused executable test with a direct relative import to the changed source, or configure a deterministic language adapter that resolves this helper/barrel path; then rerun the exact verifier."] }); continue; }
896
- if (evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd)) continue;
897
- const targets = namedCodeTargets(task, criterion, corpus.sourceText);
898
- const missingDimensions = [];
881
+ if (evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, undefined, options.apiBaselineEvidence)) continue;
882
+ const evidenceCriterionText = criterion.obligation === "invalid-input-rejection" ? invalidInputCriterionText(task, criterion) : criterionText;
883
+ const targets = namedCodeTargets(task, criterion, corpus.sourceText, evidenceCriterionText);
884
+ const missingDimensions = [], sourceProofReasons = [];
899
885
  if (!verifierCurrent) missingDimensions.push("current-verifier");
900
886
  if (criterion.obligation === "invalid-input-rejection") {
901
887
  if (corpus.sourceFiles.length === 0 || corpus.testFiles.length === 0) continue;
902
888
  const proof = acceptanceInvalidInputEvidence({
903
- taskText: criterionText, sourceText: corpus.sourceText, testText: corpus.testText,
889
+ taskText: evidenceCriterionText, contextText: acceptanceTaskText(task), sourceText: corpus.sourceText, testText: corpus.testText,
904
890
  sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries,
905
- namedTargets: targets, provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText)
891
+ namedTargets: targets, provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText, evidenceCriterionText), includeDiagnostics: true
906
892
  });
907
- if (!proof.sourceOk) missingDimensions.push("source-rejection");
893
+ if (!proof.sourceOk) { missingDimensions.push("source-proof-unknown"); sourceProofReasons.push(...(proof.sourceReasons ?? [])); }
908
894
  if (!proof.testOk) missingDimensions.push("executable-focused-test");
909
895
  }
910
896
  if (missingDimensions.length === 0) missingDimensions.push("focused-evidence");
911
- const proofHints = acceptanceContractProofGuidance(criterionText);
912
- if (missingDimensions.includes("source-rejection")) proofHints.push("Add a reachable entrypoint-bound rejection guard for every explicitly invalid partition and requested error class.");
897
+ const diagnosticHints = sourceProofReasons.length > 0 ? [`Source proof abstained: ${sourceProofReasons.join(", ")}. This is missing verification evidence, not an observed implementation defect.`, ...temporalProofReasonGuidance(sourceProofReasons)] : [];
898
+ const proofHints = [...diagnosticHints, ...acceptanceContractProofGuidance(evidenceCriterionText)];
899
+ if (missingDimensions.includes("source-proof-unknown")) proofHints.push("Use an approved independent validator for the declared invalid partitions and error classes. Do not rewrite source solely to satisfy the analyzer; source repair needs a concrete observed counterexample.");
913
900
  if (missingDimensions.includes("executable-focused-test")) proofHints.push("Add live entrypoint-bound rejection assertions; dynamic, skipped, dead, mutable, or unresolved proof remains pending.");
914
901
  if (missingDimensions.includes("current-verifier")) proofHints.push("Run the exact configured verifier against one unchanged current working-tree snapshot.");
915
- projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: uniqueStrings(targets).slice(0, 8), missingDimensions: uniqueStrings(missingDimensions), proofHints: uniqueStrings(proofHints).slice(0, 6).map((hint) => hint.slice(0, 300)) });
902
+ projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: uniqueStrings(targets).slice(0, 8), missingDimensions: uniqueStrings(missingDimensions), proofHints: uniqueStrings(proofHints).slice(0, 6).map((hint) => hint.slice(0, 300)), diagnosticHints: uniqueStrings(diagnosticHints).slice(0, 2).map((hint) => hint.slice(0, 300)) });
916
903
  }
917
904
  return projections.slice(0, MAX_CRITERIA);
918
905
  }