@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,105 +1,89 @@
1
1
  #!/usr/bin/env node
2
+ import { assertDiagnosticCandidateDerivation, assertDiagnosticBenchmarkMatrix, benchmarkAcceptancePolicyBinding, DIAGNOSTIC_TREATMENT } from "../packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js";
2
3
  import crypto from "node:crypto";
3
4
  import fs from "node:fs";
4
5
  import path from "node:path";
5
6
  import { fileURLToPath } from "node:url";
6
-
7
- import { aggregateSessionUsage, benchmarkSurfaceLabel } from "../packages/piagent-core/benchmark/benchmark-core.js";
8
7
  import { benchmarkUsage, parseBenchmarkArgs } from "../packages/piagent-core/benchmark/benchmark-cli.js";
8
+ import { benchmarkVerificationBinding, prepareBenchmarkVerification } from "./benchmark-independent-verification.mjs";
9
9
  import { codexModelName, codexThinkingEffort } from "../packages/piagent-core/benchmark/benchmark-codex.js";
10
- import { benchmarkEnvironment, benchmarkEnvironmentPolicy, comparisonSurfaces, createCodexRuntime, piagentTreatment } from "../packages/piagent-core/benchmark/benchmark-runtime.js";
10
+ import { assertCodexRuntimeCredential, benchmarkEnvironment, comparisonSurfaces, createCodexRuntime, piagentTreatment } from "../packages/piagent-core/benchmark/benchmark-runtime.js";
11
11
  import { assertBenchmarkPiCredentialReady, assertBenchmarkPiCredentialWritebackPolicy, cleanupBenchmarkPiRuntimeHome, createBenchmarkPiRuntimeHome, resetBenchmarkPiRuntimeEphemeralState, withBenchmarkPiCredentialWriteback } from "../packages/piagent-core/benchmark/benchmark-pi-home.js";
12
12
  import { benchmarkPreflight, benchmarkPreflightReceipt } from "../packages/piagent-core/benchmark/benchmark-preflight.js";
13
- import { prepareProductionProviderFreeEvidence, productionProviderFreeEvidenceError } from "../packages/piagent-core/benchmark/benchmark-provider-free-evidence.js";
14
- import { applyBenchmarkExecutionDefaults } from "../packages/piagent-core/benchmark/benchmark-runner-policy.js";
15
- import {
16
- appendPrivateJsonl,
17
- createBenchmarkCandidateGuard,
18
- loadReplayFailurePlan,
19
- retainWorkspaceForensics,
20
- safeInfrastructureDiagnostic,
21
- writeBenchmarkAbort,
22
- writeBenchmarkRunManifest,
23
- writePrivateAtomic
24
- } from "../packages/piagent-core/benchmark/benchmark-forensics.js";
13
+ import { prepareProductionProviderFreeEvidence, productionProviderFreeConfigurationDigest, productionProviderFreeEvidenceError, productionProviderFreeEvidenceRequired } from "../packages/piagent-core/benchmark/benchmark-provider-free-evidence.js";
14
+ import { applyBenchmarkExecutionDefaults, benchmarkInfrastructureFailureDisposition, benchmarkRunnerErrorRecord, recoveredBenchmarkAttemptDisposition } from "../packages/piagent-core/benchmark/benchmark-runner-policy.js";
15
+ import { BENCHMARK_TRANSPORT_CIRCUIT_POLICY, appendPrivateJsonl, createBenchmarkTransportCircuit,
16
+ createBenchmarkCandidateGuard, loadReplayFailurePlan, retainWorkspaceForensics, safeInfrastructureDiagnostic,
17
+ validBenchmarkTransportCircuit, writeBenchmarkAbort, writeBenchmarkRunManifest,
18
+ writePrivateAtomic } from "../packages/piagent-core/benchmark/benchmark-forensics.js";
25
19
  import { benchmarkBootstrapCandidateIndex, benchmarkBootstrapMetadata } from "../packages/piagent-core/benchmark/benchmark-bootstrap.js";
26
20
  import { createBenchmarkExecutionGuard } from "../packages/piagent-core/benchmark/benchmark-execution-guard.js";
27
- import { benchmarkCommandIdentity } from "../packages/piagent-core/benchmark/benchmark-runtime-identity.js";
21
+ import { readBenchmarkWireDefinitionPlan, validateBenchmarkWireManifest } from "../packages/piagent-core/benchmark/benchmark-provider-wire.js";
22
+ export { projectBenchmarkWireState } from "../packages/piagent-core/benchmark/benchmark-provider-wire.js";
23
+ import { openProductionBenchmarkCampaign } from "../packages/piagent-core/benchmark/benchmark-campaign.js";
28
24
  import { benchmarkTreeIdentity } from "../packages/piagent-core/benchmark/benchmark-tree-identity.js";
29
25
  import { completedBenchmarkRecord, expectedBenchmarkRecord } from "../packages/piagent-core/benchmark/benchmark-record-validation.js";
30
26
  import { pairedOutcomeFloorStop } from "../packages/piagent-core/benchmark/benchmark-stop-policy.js";
31
- import {
32
- approveProductionStageControl,
33
- buildBenchmarkStageDiagnostic,
27
+ import { productionExecutionBindingMatches,
28
+ productionGuardBindingMatches } from "../packages/piagent-core/benchmark/benchmark-production-completion.js";
29
+ import { approveProductionStageControl, buildBenchmarkStageDiagnostic,
34
30
  createProductionStageControl,
35
- durablePairedOutcomeFloorStop,
36
- productionGuardBindingMatches, productionSpendControlValidationErrors,
37
- productionStageResumeDisposition
38
- } from "../packages/piagent-core/benchmark/benchmark-stage-diagnostic.js";
31
+ productionSpendControlValidationErrors, productionStageResumeDisposition } from "../packages/piagent-core/benchmark/benchmark-stage-diagnostic.js";
39
32
  import { loadBenchmarkAssuranceEvidence, loadBenchmarkSuite, resolveBenchmarkSuiteEntry, validateBenchmarkSuiteFiles } from "../packages/piagent-core/benchmark/benchmark-suite-runtime.js";
40
33
  import { appendBenchmarkLedger, assertBenchmarkLedgerBinding, emptyBenchmarkLedgerBinding, inspectBenchmarkLedger, validateBenchmarkLedgerPrefix } from "../packages/piagent-core/benchmark/benchmark-ledger.js";
41
34
  import { acquireBenchmarkRunLock } from "../packages/piagent-core/benchmark/benchmark-run-lock.js";
42
35
  import { createBenchmarkProcessController } from "../packages/piagent-core/benchmark/benchmark-process.js";
43
36
  import {
44
- clearRecoveredBenchmarkAttempts,
45
- persistUnacceptedBenchmarkAttempt,
46
- promoteMeasuredBenchmarkRecord,
47
- recoverOrphanedBenchmarkAttempts,
48
- recoverPendingBenchmarkRecord,
49
- stageMeasuredBenchmarkRecord
37
+ clearRecoveredBenchmarkAttempts, persistUnacceptedBenchmarkAttempt, promoteMeasuredBenchmarkRecord,
38
+ recoverOrphanedBenchmarkAttempts, recoverPendingBenchmarkRecord, stageMeasuredBenchmarkRecord
50
39
  } from "../packages/piagent-core/benchmark/benchmark-resume-recovery.js";
51
40
  import { finalizeBenchmarkRun } from "./benchmark-runner-finalization.mjs";
41
+ import { applyProductionCampaignStopPolicy, assertProductionResumeCompletionState,
42
+ productionMeasurementInvalidatingOutcomeError,
43
+ productionReleaseMeasurementAbortEvidence, writeProductionResumeAbortIfNeeded,
44
+ writeProductionRunAbortIfNeeded } from "./benchmark-runner-completion.mjs";
52
45
  import {
46
+ applyBenchmarkResumeOptions,
47
+ bindBenchmarkTerminationSignals,
48
+ benchmarkExecutionPlan,
53
49
  benchmarkRunKey,
54
50
  confirmPlan,
55
51
  createRunId,
56
52
  defaultOutputRoot,
57
53
  ensureEmptyOutput,
58
54
  executionOrder,
59
- fail,
60
- formatDuration,
61
- frozenRuntimeCommandsForFinalization,
62
- invokedAsEntrypoint,
63
- isLegacyInvocation,
64
- loadResumeState,
65
- pairedChunk,
66
- privateDirectory,
67
- readJsonFile,
55
+ fail, formatDuration, invokedAsEntrypoint, isLegacyInvocation,
56
+ loadResumeState, pairedChunk, privateDirectory,
57
+ readJsonFile, registeredBenchmarkCustodyRoot,
68
58
  samePairedBlock,
69
59
  sameStringList
70
60
  } from "./benchmark-runner-support.mjs";
71
- import { runBenchmarkSession } from "./benchmark-session.mjs";
72
- import {
73
- assertBenchmarkHostReadinessStartReady,
74
- assertExistingBenchmarkHostReadiness,
75
- benchmarkHostReadinessPolicyDigest,
76
- collectReadyBenchmarkHostReadiness
77
- } from "./benchmark-runner-host-readiness.mjs";
61
+ import { runBenchmarkSchedule } from "./benchmark-runner-schedule.mjs";
62
+ import { readBenchmarkBudgetControl, assertBenchmarkBudgetBinding, openBenchmarkBudgetCore, createBudgetProviderCallbacks } from "./benchmark-budget-runtime.mjs";
63
+ import { createBenchmarkBudgetProcessHooks } from "./benchmark-budget-ipc.mjs";
64
+ import { createRegisteredBenchmarkScopedSessionFactory, registeredBenchmarkScopedSessionRequired } from "./benchmark-scoped-session-factory.mjs";
65
+ import { assertBenchmarkHostReadinessStartReady, assertExistingBenchmarkHostReadiness, benchmarkHostReadinessPolicyDigest, collectReadyBenchmarkHostReadiness } from "./benchmark-runner-host-readiness.mjs";
66
+ import { applyRegisteredMeasurementOptions, benchmarkMeasurementConfiguration, benchmarkRuntimeCommands,
67
+ registeredMeasurementBinding as measurementBinding
68
+ } from "./benchmark-runner-configuration.mjs";
69
+ import { bindRegisteredRuntimeVerifiers, createBenchmarkProviderBoundaryGuard,
70
+ forceTokenUnavailableForPostSessionAssetError } from "./benchmark-runner-provider-boundary.mjs";
78
71
  export { parseBenchmarkArgs };
79
72
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
80
73
  const packageManifest = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
81
74
  const bootstrapMetadata = benchmarkBootstrapMetadata();
82
75
  const bootstrapCandidateIndex = bootstrapMetadata ? benchmarkBootstrapCandidateIndex(bootstrapMetadata) : undefined;
76
+ const webUiAssetIdentity = bootstrapMetadata?.webUiAssets
77
+ ? Object.fromEntries(Object.entries(bootstrapMetadata.webUiAssets).filter(([key]) => key !== "root"))
78
+ : null;
83
79
  let interruptedSignal;
84
- const processController = createBenchmarkProcessController(() => Boolean(interruptedSignal));
80
+ const processController = createBenchmarkProcessController(() => Boolean(interruptedSignal), createBenchmarkBudgetProcessHooks());
85
81
  const runCommand = processController.run;
86
-
87
82
  function installSignalForwarding() {
88
- const handlers = new Map();
89
- for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
90
- const handler = () => {
91
- if (interruptedSignal) return;
92
- interruptedSignal = signal;
93
- processController.terminateAll(signal);
94
- };
95
- handlers.set(signal, handler);
96
- process.on(signal, handler);
97
- }
98
- return () => {
99
- for (const [signal, handler] of handlers) process.off(signal, handler);
100
- };
83
+ return bindBenchmarkTerminationSignals({ interrupted: () => Boolean(interruptedSignal),
84
+ interrupt: (signal) => { interruptedSignal = signal; },
85
+ terminateAll: (signal) => processController.terminateAll(signal) });
101
86
  }
102
-
103
87
  async function runLegacy(argv) {
104
88
  const result = await runCommand("bash", [path.join(packageRoot, "scripts", "quality-benchmark.sh"), ...argv], { cwd: process.cwd(), inherit: true });
105
89
  process.exitCode = result.code;
@@ -111,41 +95,34 @@ async function main() {
111
95
  fail("Benchmark core must execute from the immutable candidate snapshot", 1);
112
96
  }
113
97
  const options = parseBenchmarkArgs(argv);
98
+ if (options.registeredMeasurement && !bootstrapMetadata?.registeredMeasurement) {
99
+ fail("Registered measurement must start through scripts/benchmark-runner.mjs with a trusted frozen registration", 1);
100
+ }
101
+ const registeredMeasurement = bootstrapMetadata?.registeredMeasurement ?? null;
102
+ applyRegisteredMeasurementOptions(options, registeredMeasurement);
114
103
  if (bootstrapMetadata?.replay?.snapshot) options.replayFailures = bootstrapMetadata.replay.snapshot;
115
104
  if (options.resume && options.replayFailures) fail("--resume cannot be combined with --replay-failures", 1);
116
105
  if (options.resume && options.output) fail("--resume uses the original report directory; do not pass --output", 1);
117
106
  const resumeState = options.resume ? loadResumeState(options.resume) : undefined;
107
+ if (resumeState?.manifest.failedAttemptsOnly === true) {
108
+ resumeState.releaseRunLock?.();
109
+ fail("A failed-attempt diagnostic is a single bounded replay; do not resume it as a full matrix", 1);
110
+ }
118
111
  let releaseRunLock = resumeState?.releaseRunLock;
119
- let codexRuntime;
120
- let piRuntimeHome;
112
+ let codexRuntime, productionCampaign, piRuntimeHome, budgetRuntime, productionAbortFallback = () => {};
121
113
  let preservePiRuntime = false;
122
114
  try {
123
- if (resumeState) {
124
- const manifest = resumeState.manifest;
125
- options.suite = manifest.suite?.source ?? manifest.suite?.manifestPath ?? manifest.suite?.id ?? options.suite;
126
- options.surfaces = manifest.surfaces;
127
- options.model = manifest.model ?? undefined;
128
- options.thinking = manifest.thinking ?? undefined;
129
- options.codexMode = manifest.codexMode ?? "controlled";
130
- options.piagentTreatment = manifest.piagentTreatment ?? "release-defaults";
131
- options.allowPiAuthWriteback = manifest.allowPiAuthWriteback === true;
132
- options.seed = manifest.rootSeed;
133
- options.repeats = manifest.repeats;
134
- options.scenarioIds = manifest.scenarioIds ?? undefined;
135
- options.timeoutSeconds = manifest.timeoutSeconds;
136
- options.infrastructureRetries = manifest.infrastructureRetries;
137
- options.retryDelaySeconds = manifest.retryDelaySeconds;
138
- options.stopAfterFailedPair = manifest.stopAfterFailedPair === true;
139
- options.output = resumeState.runRoot;
140
- }
115
+ applyBenchmarkResumeOptions(options, resumeState);
116
+ const budgetControl = readBenchmarkBudgetControl({ options, resumeManifest: resumeState?.manifest, sourceRoot: bootstrapMetadata?.liveRoot ?? packageRoot });
141
117
  if (options.replayFailures) {
142
- const replay = loadReplayFailurePlan(options.replayFailures);
118
+ const replay = loadReplayFailurePlan(options.replayFailures, { failedAttemptsOnly: options.failedAttemptsOnly });
143
119
  if (bootstrapMetadata?.replay && replay.source.reportDigest !== bootstrapMetadata.replay.digest) fail("Frozen replay report digest does not match bootstrap metadata", 1);
144
120
  options.suite = replay.suite;
145
121
  options.seed = replay.seed;
146
122
  options.surfaces = replay.surfaces;
147
123
  options.model = options.model ?? replay.model;
148
124
  options.thinking = options.thinking ?? replay.thinking;
125
+ options.serviceTier = options.serviceTier ?? replay.serviceTier;
149
126
  options.piagentTreatment = replay.piagentTreatment ?? options.piagentTreatment;
150
127
  options.replayRuns = replay.replayRuns;
151
128
  options.replaySource = {
@@ -162,12 +139,13 @@ async function main() {
162
139
  return;
163
140
  }
164
141
  piagentTreatment(options.piagentTreatment);
142
+ options.acceptancePolicyBinding = benchmarkAcceptancePolicyBinding(packageRoot, options);
165
143
  const { suite, manifestPath, suiteRoot, builtInId } = loadBenchmarkSuite(options.suite, packageRoot);
166
144
  validateBenchmarkSuiteFiles(suite, suiteRoot);
167
145
  if (bootstrapMetadata && bootstrapMetadata.suite.builtInId !== builtInId) {
168
146
  fail("Frozen benchmark suite origin no longer matches its canonical built-in identity", 1);
169
147
  }
170
- const canonicalProductionSuite = builtInId === "production-v1";
148
+ const canonicalProductionSuite = ["production-v1", "production-v2", "production-v3"].includes(builtInId);
171
149
  const productionSpendControlPath = path.join(suiteRoot, "spend-control.v1.json");
172
150
  const productionSpendControl = canonicalProductionSuite || fs.existsSync(productionSpendControlPath)
173
151
  ? readJsonFile(productionSpendControlPath, "production spend-control contract")
@@ -181,6 +159,7 @@ async function main() {
181
159
  ? productionSpendControlValidationErrors(productionSpendControl, {
182
160
  suiteId: suite.id,
183
161
  expectedSessions: productionExpectedSessions,
162
+ suite,
184
163
  requireHostReadiness: canonicalProductionSuite
185
164
  && suite.releaseGate?.requireHostReadinessForClaim === true
186
165
  })
@@ -188,12 +167,16 @@ async function main() {
188
167
  if (productionSpendControlErrors.length > 0) {
189
168
  fail(`Production spend-control contract is invalid (${productionSpendControlErrors.join(", ")})`, 1);
190
169
  }
170
+ const registeredMeasurementRun = Boolean(registeredMeasurement);
191
171
  const productionAllStageBoundaries = productionSpendControl
192
- ? productionSpendControl.stages.map((stage) => stage.cumulativeSessions)
172
+ ? registeredMeasurementRun || (options.measurementOnly && builtInId === "production-v2")
173
+ ? [0, productionExpectedSessions]
174
+ : productionSpendControl.stages.map((stage) => stage.cumulativeSessions)
193
175
  : [];
194
176
  const productionStageBoundaries = productionAllStageBoundaries.slice(1);
195
177
  const assuranceEvidence = loadBenchmarkAssuranceEvidence(suite, suiteRoot);
196
178
  const declaredScenarioCount = suite.scenarios.length;
179
+ const declaredScenarios = [...suite.scenarios];
197
180
  if (options.scenarioIds) {
198
181
  const byId = new Map(suite.scenarios.map((scenario) => [scenario.id, scenario]));
199
182
  const missing = options.scenarioIds.filter((id) => !byId.has(id));
@@ -210,13 +193,26 @@ async function main() {
210
193
  const productionFullMatrixRequested = Boolean(productionSpendControl)
211
194
  && !options.replayRuns
212
195
  && suite.scenarios.length === declaredScenarioCount;
196
+ assertDiagnosticBenchmarkMatrix(options, { builtInId, fullMatrix: productionFullMatrixRequested,
197
+ expectedSessions: productionExpectedSessions });
198
+ // Buy one full observation window; graders, integrity and release thresholds stay unchanged.
199
+ const failedAttemptReplay = options.failedAttemptsOnly === true
200
+ && options.replaySource?.selection === "failed-attempts" && options.replaySource?.evidenceComplete === true
201
+ && options.replaySource.originalAttemptCount === 108;
202
+ if (options.measurementOnly && (!["production-v2", "production-v3"].includes(builtInId) || (!productionFullMatrixRequested && !failedAttemptReplay)
203
+ || productionExpectedSessions !== 108 || options.codexMode !== "controlled" || !["release-defaults", DIAGNOSTIC_TREATMENT].includes(options.piagentTreatment))) {
204
+ fail("--measurement-only requires a complete production-v2/v3 controlled matrix or a bound failed-attempt-only diagnostic replay", 1);
205
+ }
213
206
  if (productionFullMatrixRequested) {
214
207
  const spendExecution = productionSpendControl.execution;
208
+ applyProductionCampaignStopPolicy(options, spendExecution);
215
209
  if (options.seed === undefined) options.seed = productionSpendControl.rootSeed;
216
210
  if (options.seed !== productionSpendControl.rootSeed) fail("Production spend control requires its frozen root seed", 1);
217
211
  if (!sameStringList(options.surfaces, spendExecution.surfaces)) fail("Production spend control requires its frozen surface order", 1);
218
212
  if ((options.model ?? null) !== spendExecution.model) fail("Production spend control requires its frozen model", 1);
219
213
  if ((options.thinking ?? null) !== spendExecution.thinking) fail("Production spend control requires its frozen thinking level", 1);
214
+ if (spendExecution.serviceTier !== undefined
215
+ && (options.serviceTier ?? null) !== spendExecution.serviceTier) fail("Production spend control requires its frozen service tier", 1);
220
216
  if (options.repeats !== spendExecution.repeats) fail("Production spend control requires its frozen repeat count", 1);
221
217
  if (options.infrastructureRetries !== spendExecution.infrastructureRetries) fail("Production spend control requires zero infrastructure retries", 1);
222
218
  }
@@ -232,14 +228,29 @@ async function main() {
232
228
  let codexCommand = process.env.PIAGENT_BENCHMARK_CODEX_COMMAND || "codex";
233
229
  const suiteIdentity = benchmarkTreeIdentity(suiteRoot, { rejectSymlinks: true });
234
230
  const suiteDigest = suiteIdentity.contentDigest;
231
+ if (registeredMeasurementRun && suiteDigest !== registeredMeasurement.payload.baseSuiteDigest) {
232
+ fail("Registered measurement base suite digest does not match the frozen production-v2 suite", 1);
233
+ }
234
+ const verificationPlan = prepareBenchmarkVerification({ options, resumeState, registeredMeasurement,
235
+ installedRoot: packageRoot, suiteDigest,
236
+ scenarios: declaredScenarios, suiteRoot, resolveSuiteEntry: resolveBenchmarkSuiteEntry });
235
237
  const rootSeed = options.seed ?? crypto.randomBytes(32).toString("hex");
236
238
  const rootSeedDigest = crypto.createHash("sha256").update(rootSeed).digest("hex");
239
+ if (registeredMeasurementRun && rootSeedDigest !== registeredMeasurement.payload.unchangedSeedDigest) {
240
+ fail("Registered measurement root seed digest does not match the unchanged production seed", 1);
241
+ }
242
+ const registeredMeasurementBinding = measurementBinding(registeredMeasurement);
237
243
  const candidateGuard = createBenchmarkCandidateGuard(packageRoot, resumeState?.manifest.candidateProvenance, {
238
244
  immutableSnapshot: Boolean(bootstrapMetadata),
239
245
  observedProvenance: bootstrapMetadata?.candidateProvenance,
240
246
  snapshotIndex: bootstrapCandidateIndex
241
247
  });
242
248
  candidateGuard.freeze();
249
+ assertDiagnosticCandidateDerivation(options.acceptancePolicyBinding, bootstrapMetadata?.treatmentDerivation, candidateGuard.provenance);
250
+ const providerWirePlan = readBenchmarkWireDefinitionPlan({ file: process.env.PIAGENT_WIRE_MANIFEST_PATH, sha256: process.env.PIAGENT_WIRE_MANIFEST_SHA256 });
251
+ if (providerWirePlan) validateBenchmarkWireManifest(providerWirePlan.manifest, { template: true, candidateDigest: candidateGuard.provenance.contentDigest,
252
+ model: options.model, thinking: options.thinking, requestedTier: options.serviceTier });
253
+ if (resumeState && (resumeState.manifest.providerWirePlanDigest ?? null) !== (providerWirePlan?.planDigest ?? null)) fail("Cannot resume benchmark: provider-wire definition plan changed", 1);
243
254
  const fullOrder = options.replayRuns
244
255
  ? options.replayRuns.map((run) => ({
245
256
  scenario: suite.scenarios.find((scenario) => scenario.id === run.scenarioId),
@@ -248,6 +259,10 @@ async function main() {
248
259
  }))
249
260
  : executionOrder(suite, options.repeats, options.surfaces, rootSeed);
250
261
  const productionSpendControlled = productionFullMatrixRequested;
262
+ assertBenchmarkBudgetBinding(budgetControl, { options, candidateDigest: candidateGuard.provenance.contentDigest, suiteDigest, fullOrder });
263
+ const productionCampaignRequired = productionSpendControlled && suite.releaseGate?.requireCampaignAccounting === true;
264
+ const providerFreeEvidenceRequired = productionProviderFreeEvidenceRequired({ productionSpendControlled,
265
+ spendControl: productionSpendControl });
251
266
  const productionHostReadinessRequired = productionSpendControlled
252
267
  && canonicalProductionSuite
253
268
  && suite.releaseGate?.requireHostReadinessForClaim === true;
@@ -257,7 +272,10 @@ async function main() {
257
272
  const productionHostReadinessPolicyDigest = productionHostReadinessRequired
258
273
  ? benchmarkHostReadinessPolicyDigest(productionHostReadinessPolicy)
259
274
  : null;
260
- const productionReleaseClaimRun = productionSpendControlled
275
+ const productionReleaseClaimRun = productionSpendControlled && !registeredMeasurementRun
276
+ && !options.measurementOnly
277
+ && !options.acceptancePolicyBinding
278
+ && options.piagentTreatment !== "acceptance-diagnostic"
261
279
  && suite.schemaVersion === 2
262
280
  && suite.releaseGate?.requireEfficiencyClaim === true
263
281
  && suite.releaseGate?.requireFullSuiteForClaim === true;
@@ -267,8 +285,12 @@ async function main() {
267
285
  let deferredProductionStageApproval;
268
286
  if (resumeState) {
269
287
  const manifest = resumeState.manifest;
288
+ if (JSON.stringify(manifest.registeredMeasurement ?? null) !== JSON.stringify(registeredMeasurementBinding)) {
289
+ fail("Cannot resume benchmark: registered measurement identity changed or is missing", 1);
290
+ }
270
291
  if (manifest.suiteDigest !== suiteDigest) fail("Cannot resume benchmark: suite files changed since the original run", 1);
271
292
  if (productionSpendControlled && !productionGuardBindingMatches(manifest, productionSpendControl)) fail("Cannot resume production benchmark: frozen production guard binding is missing or changed", 1);
293
+ if (productionSpendControlled && !productionExecutionBindingMatches(manifest, productionSpendControl)) fail("Cannot resume production benchmark: frozen execution and campaign stop policy binding is missing or changed", 1);
272
294
  if (manifest.rootSeed !== rootSeed) fail("Cannot resume benchmark: root seed mismatch", 1);
273
295
  if (manifest.repeats !== options.repeats) fail("Cannot resume benchmark: repeat count mismatch", 1);
274
296
  if (!sameStringList(manifest.surfaces, options.surfaces)) fail("Cannot resume benchmark: surface list mismatch", 1);
@@ -302,40 +324,26 @@ async function main() {
302
324
  runId: manifest.runId,
303
325
  completedRuns: resumeState.completedRuns.length,
304
326
  expectedRuns: fullOrder.length
305
- }, error, { ledger: resumeState.ledgerBinding, provenanceStamp: candidateGuard.stamp("resume-ledger") });
327
+ }, error, { ledger: resumeState.ledgerBinding, provenanceStamp: candidateGuard.stamp("resume-ledger"),
328
+ ...productionReleaseMeasurementAbortEvidence(options, suite, error) });
306
329
  throw error;
307
330
  }
308
331
  const provenanceError = candidateGuard.check("resume");
309
332
  if (provenanceError) {
310
333
  writeBenchmarkAbort(resumeState.runRoot, { runId: manifest.runId, completedRuns: resumeState.completedRuns.length, expectedRuns: fullOrder.length }, provenanceError, {
311
334
  ledger: resumeState.ledgerBinding,
312
- provenanceStamp: candidateGuard.stamp("resume")
335
+ provenanceStamp: candidateGuard.stamp("resume"),
336
+ ...productionReleaseMeasurementAbortEvidence(options, suite, provenanceError)
313
337
  });
314
338
  throw provenanceError;
315
339
  }
316
- const recoveredTerminalStop = durablePairedOutcomeFloorStop({
317
- enabled: options.stopAfterFailedPair,
318
- suite,
319
- runs: resumeState.completedRuns,
320
- fullOrder
340
+ assertProductionResumeCompletionState({
341
+ candidateGuard,
342
+ fullOrder,
343
+ options,
344
+ resumeState,
345
+ suite
321
346
  });
322
- if (recoveredTerminalStop) {
323
- for (const marker of ["paused.json", "stage-diagnostic.json", "interrupted.json", "aborted.json"]) {
324
- fs.rmSync(path.join(resumeState.runRoot, marker), { force: true });
325
- }
326
- writePrivateAtomic(path.join(resumeState.runRoot, "stopped.json"), `${JSON.stringify({
327
- ...recoveredTerminalStop,
328
- runId: manifest.runId,
329
- completedRuns: resumeState.completedRuns.length,
330
- expectedRuns: fullOrder.length,
331
- stoppedAt: new Date().toISOString(),
332
- resumeAllowed: false,
333
- recoveredFromAcceptedLedger: true,
334
- ledger: resumeState.ledgerBinding,
335
- provenanceStamp: candidateGuard.stamp("resume-terminal-floor")
336
- }, null, 2)}\n`);
337
- fail("Cannot resume benchmark: the accepted ledger already contains a terminal paired outcome-floor failure", 1);
338
- }
339
347
  if (productionSpendControlled) {
340
348
  if (productionHostReadinessRequired) {
341
349
  if (manifest.hostReadinessPolicyDigest !== productionHostReadinessPolicyDigest
@@ -373,6 +381,7 @@ async function main() {
373
381
  baselineSurface: comparison.baselineSurface,
374
382
  requestedModel: options.model,
375
383
  requestedThinking: options.thinking,
384
+ requestedServiceTier: options.serviceTier,
376
385
  suite,
377
386
  manifest,
378
387
  hostReadinessPolicy: productionHostReadinessPolicy,
@@ -417,44 +426,34 @@ async function main() {
417
426
  let recoveredAttemptsByKey = new Map();
418
427
  const order = pairedChunk(pendingOrder, options.maxSessions);
419
428
  const lifecycles = [...new Set(suite.scenarios.map((scenario) => scenario.lifecycle ?? "steady-state"))];
420
- const plan = [
421
- "Piagent automatic benchmark",
422
- ` platform: v${packageManifest.version}`,
423
- ` suite: ${suite.id} (${suite.scenarios.length}${suite.scenarios.length !== declaredScenarioCount ? `/${declaredScenarioCount}` : ""} scenarios)`,
424
- ` digest: ${suiteDigest.slice(0, 16)}`,
425
- ` surfaces: ${options.surfaces.join(", ")}`,
426
- ` compare: ${benchmarkSurfaceLabel(comparison.candidateSurface)} vs ${benchmarkSurfaceLabel(comparison.baselineSurface)}`,
427
- ` repeats: ${options.repeats}`,
428
- ` retries: ${options.infrastructureRetries} infrastructure-only · ${options.retryDelaySeconds}s backoff`,
429
- ` sessions: ${fullOrder.length}`,
430
- ...(resumeState ? [` completed: ${resumeState.completedRuns.length}`, ` remaining: ${pendingOrder.length}`] : []),
431
- ...(options.maxSessions !== undefined ? [` chunk: up to ${order.length}/${pendingOrder.length} remaining sessions`] : []),
432
- ...(options.maxRuntimeMinutes !== undefined ? [` budget: ${options.maxRuntimeMinutes} minute runtime chunk`] : []),
433
- ...(options.stopAfterFailedPair ? [" stop: terminal after a completed pair falls below the outcome floor"] : []),
434
- ` model: ${options.model ?? "Pi default"}`,
435
- ` thinking: ${options.thinking ?? "Pi default"}`,
436
- ` treatment: ${options.piagentTreatment}`,
437
- ` lifecycle: ${lifecycles.join(", ")}`,
438
- ...(options.replaySource ? [` replay: ${options.replaySource.runId ?? "prior-report"} · ${options.replayRuns.length} sessions`] : []),
439
- ...(resumeState ? [` resume: ${resumeState.manifest.runId}`] : []),
440
- ` variants: ${suite.scenarios.some((scenario) => scenario.variantGenerator) ? `generated · seed ${rootSeedDigest.slice(0, 16)}` : "static"}`,
441
- ` ordering: ${suite.schemaVersion === 2 ? "seeded paired blocks" : "paired alternating"}`,
442
- ` timeout: ${options.timeoutSeconds}s per session`,
443
- " grading: hidden verifier + scope + output safety + Pi task evidence"
444
- ].join("\n");
445
- const codexPlan = options.surfaces.includes("codex-cli")
446
- ? `\n codex: ${options.codexMode} mode · model ${codexModelName(options.model)} · effort ${codexThinkingEffort(options.thinking)}${options.codexMode === "controlled" ? " · isolated home" : ""}`
447
- : "";
448
- const nativeWarning = options.surfaces.includes("codex-cli") && options.codexMode === "native"
449
- ? "\nNative Codex mode loads the operator's global AGENTS.md, configuration, rules, hooks, MCP servers, and plugins."
450
- : "";
429
+ const { plan, codexPlan, nativeWarning } = benchmarkExecutionPlan({
430
+ packageVersion: packageManifest.version,
431
+ suite,
432
+ declaredScenarioCount,
433
+ suiteDigest,
434
+ options,
435
+ comparison,
436
+ fullOrder,
437
+ resumeState,
438
+ pendingOrder,
439
+ order,
440
+ lifecycles,
441
+ rootSeedDigest
442
+ });
451
443
  if (options.dryRun) {
444
+ if (options.acceptancePolicyBinding) process.stdout.write(`Diagnostic acceptance binding: ${JSON.stringify({ policy: options.acceptancePolicyBinding, derivation: bootstrapMetadata?.treatmentDerivation })}\n`);
445
+ process.stdout.write(`Frozen verification binding: ${JSON.stringify(benchmarkVerificationBinding({ installedRoot: packageRoot, suiteDigest }))}\n`);
446
+ if (verificationPlan) process.stdout.write(`Independent verification: ${JSON.stringify(verificationPlan.identity)} (preview only)\n`);
452
447
  process.stdout.write(`${plan}${codexPlan}\n manifest: ${manifestPath}\nDRY RUN: no model session started.\n`);
453
448
  return;
454
449
  }
450
+ if (!options.preflightOnly) budgetRuntime = openBenchmarkBudgetCore(budgetControl);
455
451
  if (productionSpendControlled) {
456
- if (options.stopAfterFailedPair !== productionSpendControl.execution.stopAfterFailedPair) {
457
- fail("Production spend control requires --stop-after-failed-pair before any provider session", 1);
452
+ if (!options.measurementOnly && !registeredMeasurementRun
453
+ && options.stopAfterFailedPair !== productionSpendControl.execution.stopAfterFailedPair) {
454
+ fail(productionSpendControl.execution.stopAfterFailedPair
455
+ ? "Production spend control requires --stop-after-failed-pair before any provider session"
456
+ : "Production spend control requires paired-outcome quality stopping to remain disabled before any provider session", 1);
458
457
  }
459
458
  const completedRuns = resumeState?.completedRuns.length ?? 0;
460
459
  const authorizedThroughRuns = deferredProductionStageApproval?.authorizedThroughRuns
@@ -485,54 +484,22 @@ async function main() {
485
484
  }
486
485
  }
487
486
  const runId = resumeState?.manifest.runId ?? createRunId(suite.id);
488
- const runtimeCommands = productionFinalizationOnly
489
- ? frozenRuntimeCommandsForFinalization(resumeState.manifest, options.surfaces)
490
- : {
491
- pi: benchmarkCommandIdentity(piCommand, { cwd: bootstrapMetadata?.originalCwd ?? process.cwd() }),
492
- codex: options.surfaces.includes("codex-cli")
493
- ? benchmarkCommandIdentity(codexCommand, { cwd: bootstrapMetadata?.originalCwd ?? process.cwd() })
494
- : null,
495
- node: benchmarkCommandIdentity(process.execPath),
496
- git: benchmarkCommandIdentity("git"),
497
- bash: benchmarkCommandIdentity("bash")
498
- };
499
- const environmentPolicy = benchmarkEnvironmentPolicy();
500
- const configurationPiAgentHome = productionFinalizationOnly
501
- ? resumeState.manifest.piAgentHome?.identity
502
- : bootstrapMetadata.piAgentHome.identity;
503
- const configurationCodexCredential = productionFinalizationOnly
504
- ? resumeState.manifest.codexCredentialIdentity ?? null
505
- : bootstrapMetadata.codexCredential?.identity ?? null;
506
- const configuration = {
507
- schemaVersion: 1,
508
- source: bootstrapMetadata.sourceIdentity,
509
- candidateDigest: candidateGuard.provenance.contentDigest,
510
- suiteDigest,
511
- runtimeDependencyDigest: bootstrapMetadata.runtimeDependencies?.digest ?? null,
512
- runtimeCommands,
513
- environmentPolicy,
514
- ...(productionHostReadinessRequired ? { hostReadinessPolicyDigest: productionHostReadinessPolicyDigest } : {}),
515
- piAgentHome: configurationPiAgentHome,
516
- codexCredential: configurationCodexCredential,
517
- rootSeedDigest,
518
- surfaces: options.surfaces,
519
- model: options.model ?? null,
520
- thinking: options.thinking ?? null,
521
- codexMode: options.codexMode,
522
- piagentTreatment: options.piagentTreatment,
523
- allowPiAuthWriteback: options.allowPiAuthWriteback,
524
- piCredentialVaultId: bootstrapMetadata.piAgentHome.vaultId,
525
- timeoutSeconds: options.timeoutSeconds,
526
- infrastructureRetries: options.infrastructureRetries,
527
- retryDelaySeconds: options.retryDelaySeconds,
528
- stopAfterFailedPair: options.stopAfterFailedPair,
529
- order: fullOrder.map((item) => ({ scenarioId: item.scenario.id, surface: item.surface, repeat: item.repeat }))
530
- };
531
- const configurationDigest = crypto.createHash("sha256").update(JSON.stringify(configuration)).digest("hex");
532
- const source = bootstrapMetadata?.sourceIdentity;
533
- if (!source) fail("Modern benchmark is missing its frozen Git source identity", 1);
487
+ const runtimeCommands = benchmarkRuntimeCommands({ productionFinalizationOnly,
488
+ resumeManifest: resumeState?.manifest, surfaces: options.surfaces, piCommand, codexCommand, codexBaseline: options.codexBaseline,
489
+ dockerCommand: registeredMeasurementRun ? verificationPlan?.dockerCommand?.path : undefined,
490
+ cwd: bootstrapMetadata?.originalCwd ?? process.cwd() });
491
+ const registeredRuntimeVerifiers = bindRegisteredRuntimeVerifiers({ registeredMeasurement,
492
+ registeredMeasurementRun, bootstrapMetadata, runtimeCommands, verificationPlan });
493
+ const { configuration, configurationDigest, environmentPolicy } = benchmarkMeasurementConfiguration({
494
+ bootstrapMetadata, candidateDigest: candidateGuard.provenance.contentDigest, suiteDigest, runtimeCommands,
495
+ verificationIdentity: verificationPlan?.identity, providerWirePlan, productionHostReadinessRequired,
496
+ productionHostReadinessPolicyDigest, productionFinalizationOnly, resumeManifest: resumeState?.manifest,
497
+ rootSeedDigest, options, fullOrder });
498
+ const providerFreeConfigurationDigest = providerFreeEvidenceRequired ? productionProviderFreeConfigurationDigest(configuration) : null;
499
+ const source = bootstrapMetadata?.sourceIdentity; if (!source) fail("Modern benchmark is missing its frozen Git source identity", 1);
500
+ if (resumeState && providerFreeEvidenceRequired && resumeState.manifest.providerFreeConfigurationDigest !== providerFreeConfigurationDigest) fail("Cannot resume benchmark: provider-free configuration changed since the original run", 1);
534
501
  const { receipt: providerFreeEvidence, binding: providerFreeEvidenceBinding } = await prepareProductionProviderFreeEvidence({
535
- required: productionSpendControl?.productionGuards?.providerFreeEvidence?.requiredBeforeFirstPaidSession === true, packageRoot, bootstrapMetadata, candidateProvenance: candidateGuard.provenance, configurationDigest, runCommand, resumedReceipt: resumeState ? resumeState.manifest.providerFreeEvidence ?? null : undefined });
502
+ required: providerFreeEvidenceRequired, packageRoot, bootstrapMetadata, candidateProvenance: candidateGuard.provenance, providerFreeConfigurationDigest, runCommand, resumedReceipt: resumeState ? resumeState.manifest.providerFreeEvidence ?? null : undefined });
536
503
  piCommand = runtimeCommands.pi.resolvedPath;
537
504
  if (runtimeCommands.codex) codexCommand = runtimeCommands.codex.resolvedPath;
538
505
  if (resumeState && JSON.stringify(resumeState.manifest.runtimeCommands ?? null) !== JSON.stringify(runtimeCommands)) {
@@ -577,6 +544,8 @@ async function main() {
577
544
  piAgentHome: productionFinalizationOnly ? null : bootstrapMetadata?.piAgentHome,
578
545
  codexCredential: productionFinalizationOnly ? null : bootstrapMetadata?.codexCredential,
579
546
  runtimeDependencies: bootstrapMetadata?.runtimeDependencies,
547
+ webUiAssets: bootstrapMetadata?.webUiAssets,
548
+ registeredAssets: bootstrapMetadata?.registeredMeasurement,
580
549
  commands: runtimeCommands,
581
550
  verifyCommandAssets: !productionFinalizationOnly
582
551
  });
@@ -599,8 +568,10 @@ async function main() {
599
568
  const preflightAssetError = executionGuard.check("before-preflight", [piRuntimeHome]);
600
569
  if (preflightAssetError) throw preflightAssetError;
601
570
  codexRuntime = createCodexRuntime(options);
602
- try { runtime = await withBenchmarkPiCredentialWriteback(bootstrapMetadata.piAgentHome, piRuntimeHome, () => benchmarkPreflight({ runCommand, packageRoot, piCommand, piEnvironment: benchmarkEnvironment({ PI_CODING_AGENT_DIR: piRuntimeHome.path }), codexCommand, gitCommand: runtimeCommands.git.resolvedPath, surfaces: options.surfaces, codexMode: options.codexMode, codexRuntime })); }
571
+ assertCodexRuntimeCredential(codexRuntime, { required: registeredMeasurementRun });
572
+ try { runtime = await withBenchmarkPiCredentialWriteback(bootstrapMetadata.piAgentHome, piRuntimeHome, () => benchmarkPreflight({ runCommand, packageRoot, piCommand, piEnvironment: benchmarkEnvironment({ PI_CODING_AGENT_DIR: piRuntimeHome.path, PIAGENT_FAST_MODE: options.serviceTier === "fast" ? "1" : "0" }), codexCommand, codexCommandIdentity: runtimeCommands.codex, gitCommand: runtimeCommands.git.resolvedPath, surfaces: options.surfaces, codexBaseline: options.codexBaseline, codexMode: options.codexMode, codexRuntime, model: options.model, serviceTier: options.serviceTier })); }
603
573
  catch (error) { preservePiRuntime ||= error.code === "BENCHMARK_PI_CREDENTIAL_RECONCILIATION_FAILED"; throw error; }
574
+ assertCodexRuntimeCredential(codexRuntime, { required: registeredMeasurementRun });
604
575
  const postPreflightAssetError = executionGuard.check("after-preflight", [piRuntimeHome]);
605
576
  if (postPreflightAssetError) throw postPreflightAssetError;
606
577
  resetBenchmarkPiRuntimeEphemeralState(piRuntimeHome);
@@ -616,7 +587,7 @@ async function main() {
616
587
  }
617
588
  assertHostReadinessStartReady();
618
589
  if (options.preflightOnly) {
619
- const receipt = benchmarkPreflightReceipt({ packageVersion: packageManifest.version, source, candidateProvenance: candidateGuard.report(), suite, suiteDigest, runtimeDependencies: bootstrapMetadata.runtimeDependencies, runtimeCommands, environmentPolicy, configurationDigest, rootSeedDigest, options, runtime, hostReadinessPolicyDigest: productionHostReadinessPolicyDigest, hostReadiness: hostReadinessReceipt, providerFreeEvidence });
590
+ const receipt = benchmarkPreflightReceipt({ packageVersion: packageManifest.version, source, candidateProvenance: candidateGuard.report(), suite, suiteDigest, runtimeDependencies: bootstrapMetadata.runtimeDependencies, webUiAssets: bootstrapMetadata.webUiAssets, runtimeCommands, environmentPolicy, configurationDigest, providerFreeConfigurationDigest, rootSeedDigest, options, runtime, hostReadinessPolicyDigest: productionHostReadinessPolicyDigest, hostReadiness: hostReadinessReceipt, providerFreeEvidence, independentVerification: verificationPlan?.identity, registeredRuntimeVerifiers });
620
591
  process.stdout.write(options.json ? `${JSON.stringify(receipt, null, 2)}\n` : `${plan}${codexPlan}\nPREFLIGHT READY: no model session started.\n${JSON.stringify(receipt, null, 2)}\n`);
621
592
  return;
622
593
  }
@@ -625,6 +596,16 @@ async function main() {
625
596
  const runRoot = resumeState ? privateDirectory(output) : ensureEmptyOutput(output);
626
597
  releaseRunLock ??= acquireBenchmarkRunLock(runRoot, runId);
627
598
  privateDirectory(path.join(runRoot, "workspaces"));
599
+ const registeredScopedSessionFactory = registeredMeasurementRun
600
+ ? createRegisteredBenchmarkScopedSessionFactory({ installedRoot: packageRoot, registeredMeasurement,
601
+ custodyRoot: registeredBenchmarkCustodyRoot(runRoot), nodeCommand: runtimeCommands.node.resolvedPath,
602
+ codexRuntimePath: runtimeCommands.codex?.resolvedPath ?? null, qualification: {
603
+ version: 4, candidateRoot: bootstrapMetadata.snapshotRoot,
604
+ assetsRoot: bootstrapMetadata.webUiAssets.root,
605
+ sdkRoot: runtimeCommands.pi.packageClosure.root,
606
+ candidateIndexPath: bootstrapMetadata.candidateIndex.path,
607
+ candidateIndexSha256: bootstrapMetadata.candidateIndex.digest } })
608
+ : null;
628
609
  const removeSignalHandlers = installSignalForwarding();
629
610
  const startedAt = resumeState?.manifest.startedAt ?? new Date().toISOString();
630
611
  const runs = resumeState ? [...resumeState.completedRuns] : [];
@@ -645,14 +626,20 @@ async function main() {
645
626
  },
646
627
  suiteDigest,
647
628
  suiteIdentity,
629
+ ...(registeredMeasurementBinding ? { registeredMeasurement: registeredMeasurementBinding } : {}),
630
+ ...(registeredRuntimeVerifiers ? { registeredRuntimeVerifiers } : {}),
648
631
  candidateProvenance: candidateGuard.provenance,
649
632
  runtimeDependencies: bootstrapMetadata?.runtimeDependencies ?? null,
633
+ webUiAssets: webUiAssetIdentity,
650
634
  runtimeCommands,
651
635
  preflightRuntime: runtime,
652
636
  codexCredentialIdentity: bootstrapMetadata.codexCredential?.identity ?? null,
653
637
  codexCredentialBridge,
654
638
  configurationDigest,
639
+ ...(budgetControl ? { budgetControl: budgetControl.identity } : {}),
655
640
  environmentPolicy,
641
+ ...(verificationPlan ? { verificationPlan: { file: options.verificationPlan, identity: verificationPlan.identity } } : {}),
642
+ ...(providerWirePlan ? { providerWirePlanDigest: providerWirePlan.planDigest } : {}),
656
643
  piAgentHome: {
657
644
  copied: bootstrapMetadata.piAgentHome.copied,
658
645
  globalInstructions: bootstrapMetadata.piAgentHome.globalInstructions,
@@ -670,16 +657,25 @@ async function main() {
670
657
  repeats: options.repeats,
671
658
  model: options.model ?? null,
672
659
  thinking: options.thinking ?? null,
660
+ serviceTier: options.serviceTier ?? null,
673
661
  codexMode: options.codexMode,
662
+ codexBaseline: options.codexBaseline,
674
663
  piagentTreatment: options.piagentTreatment,
664
+ ...(options.acceptancePolicyBinding ? { acceptancePolicyBinding: options.acceptancePolicyBinding } : {}),
665
+ ...(bootstrapMetadata?.treatmentDerivation ? { treatmentDerivation: bootstrapMetadata.treatmentDerivation } : {}),
675
666
  allowPiAuthWriteback: options.allowPiAuthWriteback,
676
667
  timeoutSeconds: options.timeoutSeconds,
677
668
  infrastructureRetries: options.infrastructureRetries,
678
669
  retryDelaySeconds: options.retryDelaySeconds,
670
+ transportCircuitBreaker: createBenchmarkTransportCircuit(),
679
671
  stopAfterFailedPair: options.stopAfterFailedPair,
672
+ ...(options.campaignStopPolicy ? { campaignStopPolicy: options.campaignStopPolicy } : {}),
673
+ ...(options.measurementOnly ? { measurementOnly: true } : {}),
674
+ ...(options.failedAttemptsOnly ? { failedAttemptsOnly: true } : {}),
680
675
  scenarioIds: options.scenarioIds ?? null,
681
676
  ...(productionSpendControlled ? {
682
677
  productionGuards: productionSpendControl.productionGuards,
678
+ providerFreeConfigurationDigest,
683
679
  providerFreeEvidence,
684
680
  stageControl: createProductionStageControl({
685
681
  authorizedThroughRuns: productionStageBoundaries[0],
@@ -696,6 +692,17 @@ async function main() {
696
692
  repeat: item.repeat
697
693
  }))
698
694
  };
695
+ productionAbortFallback = (error) => writeProductionRunAbortIfNeeded({ fullOrder, ledgerBinding, manifest, options, productionSpendControlled, runRoot, runs, suite }, error);
696
+ if (productionCampaignRequired) {
697
+ productionCampaign = openProductionBenchmarkCampaign({
698
+ registryBase: path.join(bootstrapMetadata.defaultOutputRoot, ".production-campaigns"), suiteId: suite.id,
699
+ runId, runRoot, configurationDigest, candidateDigest: candidateGuard.provenance.contentDigest, suiteDigest, existingBinding: resumeState?.manifest.campaign
700
+ });
701
+ manifest.campaign = productionCampaign.binding;
702
+ }
703
+ if (!validBenchmarkTransportCircuit(manifest.transportCircuitBreaker)) {
704
+ fail("Cannot run benchmark: transport circuit-breaker state is missing or malformed", 1);
705
+ }
699
706
  assertHostReadinessStartReady();
700
707
  if (productionSpendControlled && deferredProductionStageApproval) {
701
708
  manifest.stageControl = approveProductionStageControl(manifest.stageControl, deferredProductionStageApproval);
@@ -711,213 +718,33 @@ async function main() {
711
718
  fs.rmSync(path.join(runRoot, "paused.json"), { force: true });
712
719
  }
713
720
  }
714
- const fullIndexByKey = new Map(fullOrder.map((item, index) => [benchmarkRunKey(item), index + 1]));
715
- const wallStartedAt = Date.now();
716
- const runtimeDeadline = options.maxRuntimeMinutes === undefined
717
- ? undefined
718
- : wallStartedAt + options.maxRuntimeMinutes * 60_000;
719
- let newRuns = 0;
721
+ const scheduleState = { fatalRunError, pauseReason, preservePiRuntime, fatalExecutionReceipt, ledgerBinding, terminalStop };
720
722
  try {
721
- for (const [index, item] of order.entries()) {
722
- if (interruptedSignal) break;
723
- if (runtimeDeadline !== undefined && newRuns > 0 && !samePairedBlock(order[index - 1], item) && Date.now() >= runtimeDeadline) {
724
- pauseReason = `max-runtime-minutes:${options.maxRuntimeMinutes}`;
725
- break;
726
- }
727
- const completedBefore = runs.filter(completedBenchmarkRecord).length;
728
- const remainingIncludingThis = fullOrder.length - completedBefore;
729
- const averageMs = newRuns > 0 ? (Date.now() - wallStartedAt) / newRuns : undefined;
730
- const eta = averageMs === undefined ? "" : ` · ETA ${formatDuration(averageMs * remainingIncludingThis)}`;
731
- const fullIndex = fullIndexByKey.get(benchmarkRunKey(item)) ?? index + 1;
732
- process.stdout.write(`[${fullIndex}/${fullOrder.length}] ${item.scenario.id} · ${item.surface} · repeat ${item.repeat}/${options.repeats} · remaining ${remainingIncludingThis} · elapsed ${formatDuration(Date.now() - wallStartedAt)}${eta}\n`);
733
- let record;
734
- let sessionEvidence;
735
- const infrastructureFailures = [...(recoveredAttemptsByKey.get(benchmarkRunKey(item)) ?? [])];
736
- const firstInfrastructureAttempt = infrastructureFailures.reduce((maximum, attempt) => Math.max(maximum, attempt.attempt ?? 0), 0) + 1;
737
- if (firstInfrastructureAttempt > options.infrastructureRetries + 1) {
738
- fatalRunError = new Error(`No infrastructure retry remains after recovering an interrupted provider attempt for ${item.scenario.id}/${item.surface}/r${item.repeat}`);
739
- break;
740
- }
741
- for (let infrastructureAttempt = firstInfrastructureAttempt; infrastructureAttempt <= options.infrastructureRetries + 1; infrastructureAttempt += 1) {
742
- record = undefined;
743
- fatalRunError = executionGuard.check(`before-session:${item.scenario.id}:${item.surface}:r${item.repeat}:attempt${infrastructureAttempt}`, [piRuntimeHome]);
744
- if (fatalRunError) break;
745
- let attemptError;
746
- let attemptCodexRuntime = codexRuntime;
747
- try {
748
- if (item.surface === "codex-cli") attemptCodexRuntime = createCodexRuntime(options);
749
- sessionEvidence = await withBenchmarkPiCredentialWriteback(bootstrapMetadata.piAgentHome, piRuntimeHome, () => runBenchmarkSession({
750
- packageRoot,
751
- runCommand,
752
- resolveSuiteEntry: resolveBenchmarkSuiteEntry,
753
- interrupted: () => Boolean(interruptedSignal),
754
- suite,
755
- suiteRoot,
756
- ...item,
757
- orderIndex: fullIndex,
758
- infrastructureAttempt,
759
- runId,
760
- runRoot,
761
- options,
762
- piCommand,
763
- codexCommand,
764
- codexDisabledFeatures: runtime.codexDisabledFeatures,
765
- codexRuntime: attemptCodexRuntime,
766
- piRuntimeHome,
767
- systemCommands: {
768
- node: runtimeCommands.node.resolvedPath,
769
- git: runtimeCommands.git.resolvedPath,
770
- bash: runtimeCommands.bash.resolvedPath
771
- },
772
- suiteDigest,
773
- configurationDigest,
774
- persistCompletedRecord: (candidate) => stageMeasuredBenchmarkRecord({ runRoot, manifest, ledgerBinding, record: candidate, infrastructureFailures, index: fullIndex - 1, expected: item, runId, suite, configurationDigest, runs }),
775
- rootSeed
776
- }));
777
- record = sessionEvidence.record;
778
- } catch (error) {
779
- preservePiRuntime ||= error.code === "BENCHMARK_PI_CREDENTIAL_RECONCILIATION_FAILED";
780
- attemptError = error;
781
- const safeError = safeInfrastructureDiagnostic(error.message, [piRuntimeHome?.path, bootstrapMetadata.piAgentHome.configRoot, bootstrapMetadata.piAgentHome.runtimeParent].filter(Boolean));
782
- record = {
783
- schemaVersion: 1,
784
- runId,
785
- orderIndex: fullIndex,
786
- scenarioId: item.scenario.id,
787
- scenarioTitle: item.scenario.title,
788
- scenarioKind: item.scenario.kind,
789
- category: item.scenario.category ?? "unspecified",
790
- difficulty: item.scenario.difficulty ?? "unspecified",
791
- profile: item.scenario.profile ?? suite.profile,
792
- lifecycle: item.scenario.lifecycle ?? "steady-state",
793
- surface: item.surface,
794
- repeat: item.repeat,
795
- infrastructureAttempt,
796
- abortSuite: true,
797
- infrastructureFailure: `runner-error:${safeError}`,
798
- resolved: false,
799
- failure: `runner-error:${safeError}`,
800
- grade: { passed: false, score: 0, checks: [] },
801
- graderIntegrity: { passed: false },
802
- scope: { passed: false, changedFiles: [], outsideScope: [] },
803
- outputSafety: { passed: false, forbiddenHits: [] },
804
- outputEvidence: { passed: false, requiredCount: 0, observedCount: 0, missingHashes: [] },
805
- workflow: null,
806
- usage: aggregateSessionUsage([]),
807
- durationSeconds: 0
808
- };
809
- } finally {
810
- if (attemptCodexRuntime !== codexRuntime) attemptCodexRuntime.cleanup();
811
- }
812
- const guardStage = `after-session:${item.scenario.id}:${item.surface}:r${item.repeat}:attempt${infrastructureAttempt}`;
813
- const postSessionReceipt = executionGuard.receipt(guardStage, [piRuntimeHome]);
814
- const postSessionGuard = postSessionReceipt.stamp;
815
- const assetError = postSessionReceipt.error;
816
- if (!assetError && item.surface !== "codex-cli") resetBenchmarkPiRuntimeEphemeralState(piRuntimeHome);
817
- if (!interruptedSignal) {
818
- if (assetError) {
819
- fatalExecutionReceipt = postSessionReceipt;
820
- if (sessionEvidence) retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
821
- if (record) {
822
- persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record, reason: "execution-asset-mismatch-after-provider-attempt", forceTokenUnavailable: true });
823
- fs.rmSync(path.join(runRoot, "pending-record.json"), { force: true });
824
- fs.rmSync(path.join(runRoot, "measured-record-ready.json"), { force: true });
825
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, contaminated: true, executionAsset: assetError.executionAsset ?? { reason: assetError.message } });
826
- if (sessionEvidence) fs.rmSync(sessionEvidence.inflightPath, { force: true });
827
- }
828
- fatalRunError = assetError;
829
- break;
830
- }
831
- if (sessionEvidence && !record.abortSuite) promoteMeasuredBenchmarkRecord({ runRoot, ledgerBinding, record, postSessionGuard });
832
- }
833
- if (interruptedSignal && sessionEvidence) {
834
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
835
- persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record, reason: "interrupted-provider-attempt-not-accepted-as-a-measured-outcome" });
836
- fs.rmSync(path.join(runRoot, "pending-record.json"), { force: true });
837
- fs.rmSync(path.join(runRoot, "measured-record-ready.json"), { force: true });
838
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, interrupted: true });
839
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
840
- }
841
- if (!record.abortSuite || interruptedSignal) break;
842
- const retryAvailable = record.infrastructureRetryable === true && infrastructureAttempt <= options.infrastructureRetries;
843
- infrastructureFailures.push({
844
- attempt: infrastructureAttempt,
845
- failure: record.infrastructureFailure ?? record.failure,
846
- class: record.infrastructureClass ?? "infrastructure",
847
- agent: record.agent,
848
- usage: record.usage,
849
- usageStatus: record.usageStatus,
850
- durationSeconds: record.durationSeconds
851
- });
852
- if (record.usageStatus === "unknown-after-provider-start") {
853
- manifest.unknownCostAttempts = Number(manifest.unknownCostAttempts ?? 0) + 1;
854
- manifest.tokenClaimsUnavailableReason = "one-or-more-provider-attempts-have-unknown-usage";
855
- }
856
- // A runner error before runBenchmarkSession creates its durable in-flight
857
- // marker is positively pre-provider. Post-provider throws leave that
858
- // marker behind and terminal recovery persists them fail-closed.
859
- if (record.attemptId) persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record });
860
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, retryAvailable });
861
- if (sessionEvidence) {
862
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
863
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
864
- }
865
- if (!retryAvailable) {
866
- if (attemptError) fatalRunError = new Error(record.infrastructureFailure ?? "benchmark runner infrastructure error");
867
- break;
868
- }
869
- process.stdout.write(` RETRY ${infrastructureAttempt}/${options.infrastructureRetries} (${record.infrastructureFailure ?? record.failure})\n`);
870
- if (options.retryDelaySeconds > 0) {
871
- await new Promise((resolve) => setTimeout(resolve, options.retryDelaySeconds * 1_000));
872
- }
873
- }
874
- if (interruptedSignal) break;
875
- if (fatalRunError) break;
876
- if (record.abortSuite) {
877
- if (!fatalRunError) fatalRunError = new Error(record.infrastructureFailure ?? record.failure ?? "agent startup failure");
878
- break;
879
- }
880
- const retainWorkspace = options.keepWorkspaces || !record.resolved || sessionEvidence?.workflowFailed;
881
- if (retainWorkspace && sessionEvidence) {
882
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
883
- }
884
- runs.push(record);
885
- newRuns += 1;
886
- const pendingRecordPath = path.join(runRoot, "pending-record.json");
887
- ledgerBinding = appendBenchmarkLedger(ledgerPath, record, ledgerBinding);
888
- manifest.ledger = ledgerBinding;
889
- clearRecoveredBenchmarkAttempts(manifest, record);
890
- writeBenchmarkRunManifest(runRoot, manifest);
891
- fs.rmSync(pendingRecordPath, { force: true });
892
- if (sessionEvidence) {
893
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
894
- if (!retainWorkspace) fs.rmSync(sessionEvidence.workspaceRoot, { recursive: true, force: true });
895
- }
896
- const cost = Number.isFinite(record.usage.cost) ? `$${Number(record.usage.cost).toFixed(6)}` : "cost n/a";
897
- const completedAfter = runs.filter(completedBenchmarkRecord).length;
898
- const remainingAfter = Math.max(0, fullOrder.length - completedAfter);
899
- const averageAfterMs = (Date.now() - wallStartedAt) / Math.max(1, newRuns);
900
- process.stdout.write(` ${record.resolved ? "PASS" : `FAIL (${record.failure})`} · ${record.usage.fresh} fresh tok · ${cost} · run ${formatDuration(Number(record.durationSeconds ?? 0) * 1_000)} · remaining ${remainingAfter} · ETA ${formatDuration(averageAfterMs * remainingAfter)}\n`);
901
- terminalStop = pairedOutcomeFloorStop({ enabled: options.stopAfterFailedPair, suite, runs, current: item, next: order[index + 1] });
902
- if (terminalStop) break;
903
- if (fatalRunError) break;
904
- }
905
- if (!pauseReason && options.maxSessions !== undefined && pendingOrder.length > order.length) {
906
- pauseReason = `max-sessions:${options.maxSessions}`;
907
- }
723
+ await runBenchmarkSchedule({
724
+ order, fullOrder, pendingOrder, options, runs,
725
+ manifest, recoveredAttemptsByKey, executionGuard, budgetRuntime, codexRuntime,
726
+ registeredMeasurement, registeredMeasurementRun, registeredRuntimeVerifiers, bootstrapMetadata, runtimeCommands,
727
+ piRuntimeHome, packageRoot, runCommand, suite, suiteRoot,
728
+ runId, runRoot, verificationPlan, providerWirePlan, candidateGuard,
729
+ piCommand, codexCommand, runtime, registeredScopedSessionFactory, suiteDigest,
730
+ configurationDigest, productionCampaign, rootSeed, ledgerPath, infrastructureLedgerPath,
731
+ interrupted: () => Boolean(interruptedSignal), state: scheduleState
732
+ });
908
733
  } finally {
734
+ ({ fatalRunError, pauseReason, preservePiRuntime, fatalExecutionReceipt, ledgerBinding, terminalStop } = scheduleState);
909
735
  removeSignalHandlers();
910
736
  }
911
737
  try {
912
738
  const finalLedger = inspectBenchmarkLedger(ledgerPath);
913
739
  assertBenchmarkLedgerBinding(ledgerBinding, finalLedger.binding, "benchmark terminal ledger");
914
- validateBenchmarkLedgerPrefix(finalLedger.records, fullOrder, (record, index, expected) => expectedBenchmarkRecord(record, index, expected, runId, suite, configurationDigest));
740
+ validateBenchmarkLedgerPrefix(finalLedger.records, fullOrder, (record, index, expected) => expectedBenchmarkRecord(record, index, expected, runId, suite, configurationDigest, verificationPlan?.identity));
915
741
  } catch (error) {
916
742
  fatalRunError ??= error;
917
743
  }
744
+ if (productionCampaign) { manifest.campaignEvidence = productionCampaign.snapshot(); writeBenchmarkRunManifest(runRoot, manifest); }
918
745
  let finalizationReceipt;
919
746
  if (!interruptedSignal && !fatalRunError) {
920
- if (productionSpendControl?.productionGuards?.providerFreeEvidence?.requiredBeforeFirstPaidSession === true) {
747
+ if (providerFreeEvidenceRequired) {
921
748
  fatalRunError ??= productionProviderFreeEvidenceError(manifest.providerFreeEvidence, providerFreeEvidenceBinding, "final production provider-free evidence");
922
749
  }
923
750
  finalizationReceipt = executionGuard.receipt("finalization", [piRuntimeHome]);
@@ -932,16 +759,18 @@ async function main() {
932
759
  lifecycles, manifest, options, packageVersion: packageManifest.version,
933
760
  pauseReason, piRuntimeHome, preservePiRuntime,
934
761
  productionAllStageBoundaries, productionHostReadinessPolicy, productionSpendControlled, rootSeed, rootSeedDigest,
762
+ productionCampaign,
935
763
  runId, runRoot, runs, runtime, runtimeCommands, source, startedAt, suite,
936
764
  suiteDigest, suiteIdentity, terminalStop
937
765
  });
938
- } finally {
766
+ } catch (error) { productionAbortFallback(error); writeProductionResumeAbortIfNeeded(resumeState, error); throw error; } finally {
767
+ budgetRuntime?.close();
939
768
  releaseRunLock?.();
769
+ productionCampaign?.close();
940
770
  codexRuntime?.cleanup();
941
771
  if (!preservePiRuntime) cleanupBenchmarkPiRuntimeHome(bootstrapMetadata?.piAgentHome, piRuntimeHome);
942
772
  }
943
773
  }
944
-
945
774
  if (invokedAsEntrypoint(import.meta.url, process.argv[1])) {
946
775
  main().catch((error) => {
947
776
  console.error(`FAIL: ${error.message}`);