@piagent/platform 1.6.0 → 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 (736) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +24 -15
  3. package/README.vi.md +36 -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 +27 -3
  10. package/benchmarks/production-v1/suite.json +5 -1
  11. package/benchmarks/production-v2/grade.mjs +892 -0
  12. package/benchmarks/production-v2/project/README.md +7 -0
  13. package/benchmarks/production-v2/project/config/service.json +4 -0
  14. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  15. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  16. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  17. package/benchmarks/production-v2/project/package.json +11 -0
  18. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  19. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  20. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  21. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  22. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  23. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  25. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  26. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  27. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  28. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  29. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  30. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  31. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  32. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  33. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  34. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  36. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  37. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  38. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  39. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  41. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  42. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  43. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  44. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  45. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  46. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  47. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  48. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  49. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  50. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  51. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  52. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  53. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  54. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  55. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  56. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  59. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  62. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  64. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  66. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  67. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  68. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  69. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  70. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  71. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  72. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  73. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  74. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  75. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  76. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  78. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  79. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  80. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  81. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  82. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  83. package/benchmarks/production-v2/suite.json +1009 -0
  84. package/benchmarks/production-v2/variant.mjs +169 -0
  85. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  86. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  87. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  88. package/benchmarks/production-v3/grade.mjs +1017 -0
  89. package/benchmarks/production-v3/project/README.md +7 -0
  90. package/benchmarks/production-v3/project/config/service.json +4 -0
  91. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  92. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  93. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  94. package/benchmarks/production-v3/project/package.json +11 -0
  95. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  96. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  97. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  98. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  99. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  100. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  101. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  102. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  103. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  104. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  105. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  106. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  107. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  108. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  109. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  110. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  111. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  113. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  114. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  115. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  116. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  117. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  118. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  119. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  120. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  121. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  122. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  123. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  124. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  125. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  126. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  127. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  128. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  129. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  130. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  131. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  132. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  133. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  136. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  139. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  141. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  143. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  144. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  145. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  146. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  147. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  148. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  149. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  150. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  151. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  152. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  153. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  155. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  156. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  157. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  158. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  159. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  160. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  161. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  162. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  163. package/benchmarks/production-v3/suite.json +1010 -0
  164. package/benchmarks/production-v3/variant.mjs +178 -0
  165. package/catalog/capabilities.json +16 -16
  166. package/docs/authority-manifest.md +1 -1
  167. package/docs/auto-delegation-policy.md +38 -73
  168. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  169. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  170. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  171. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  172. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  173. package/docs/command-reference-vietnamese.md +30 -35
  174. package/docs/context-engine.md +5 -3
  175. package/docs/context-window-policy.md +37 -1
  176. package/docs/distribution-standard.md +9 -9
  177. package/docs/en/architecture.md +26 -13
  178. package/docs/languages.json +4 -4
  179. package/docs/operator-manual-vietnamese.md +26 -46
  180. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  181. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  182. package/docs/piagent-core-improvement-plan.md +528 -0
  183. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  184. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  185. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  186. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  187. package/docs/piagent-open-session-wait.md +19 -0
  188. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  189. package/docs/publishing-for-teams.md +7 -0
  190. package/docs/quality-benchmark.md +299 -23
  191. package/docs/quickstart-vietnamese.md +2 -2
  192. package/docs/release-install-policy.md +32 -9
  193. package/docs/research/harness-next-evidence-review.md +113 -0
  194. package/docs/runtime-harness-standard.md +3 -3
  195. package/docs/security-threat-model.md +1 -1
  196. package/docs/subagent-orchestration-capabilities.md +19 -51
  197. package/docs/subagents-and-multiagent.md +21 -47
  198. package/docs/task-implementation-contract.md +3 -3
  199. package/docs/task-lifecycle-vietnamese.md +1 -1
  200. package/docs/team-onboarding.md +7 -7
  201. package/docs/third-party-neutrality.md +7 -0
  202. package/docs/usage-observability.md +1 -1
  203. package/docs/vi/architecture.md +26 -13
  204. package/docs-site/architecture.html +1 -1
  205. package/docs-site/benchmark.html +89 -95
  206. package/docs-site/commands.html +1 -1
  207. package/docs-site/content/benchmark.html +88 -94
  208. package/docs-site/content/en/benchmark.html +134 -90
  209. package/docs-site/content/en/index.html +19 -19
  210. package/docs-site/content/en/runtime.html +5 -5
  211. package/docs-site/content/en/whats-new.html +23 -1
  212. package/docs-site/content/en/workflows.html +2 -2
  213. package/docs-site/content/index.html +19 -19
  214. package/docs-site/content/runtime.html +6 -6
  215. package/docs-site/content/whats-new.html +23 -1
  216. package/docs-site/content/workflows.html +2 -2
  217. package/docs-site/context-engine.html +1 -1
  218. package/docs-site/en/architecture.html +1 -1
  219. package/docs-site/en/benchmark.html +135 -91
  220. package/docs-site/en/commands.html +1 -1
  221. package/docs-site/en/context-engine.html +1 -1
  222. package/docs-site/en/index.html +20 -20
  223. package/docs-site/en/mcp-approval.html +1 -1
  224. package/docs-site/en/mcp-auth.html +1 -1
  225. package/docs-site/en/mcp-servers.html +1 -1
  226. package/docs-site/en/mcp.html +1 -1
  227. package/docs-site/en/permissions.html +1 -1
  228. package/docs-site/en/profiles.html +1 -1
  229. package/docs-site/en/quickstart.html +1 -1
  230. package/docs-site/en/runtime.html +6 -6
  231. package/docs-site/en/scope.html +1 -1
  232. package/docs-site/en/security.html +1 -1
  233. package/docs-site/en/team.html +1 -1
  234. package/docs-site/en/whats-new.html +24 -2
  235. package/docs-site/en/workflows.html +3 -3
  236. package/docs-site/index.html +20 -20
  237. package/docs-site/mcp-approval.html +1 -1
  238. package/docs-site/mcp-auth.html +1 -1
  239. package/docs-site/mcp-servers.html +1 -1
  240. package/docs-site/mcp.html +1 -1
  241. package/docs-site/permissions.html +1 -1
  242. package/docs-site/profiles.html +1 -1
  243. package/docs-site/quickstart.html +1 -1
  244. package/docs-site/runtime.html +7 -7
  245. package/docs-site/scope.html +1 -1
  246. package/docs-site/security.html +1 -1
  247. package/docs-site/team.html +1 -1
  248. package/docs-site/whats-new.html +24 -2
  249. package/docs-site/workflows.html +3 -3
  250. package/evals/architecture-conformance-v1/lane.json +18 -0
  251. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  252. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  253. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  254. package/evals/fixtures/benchmark-assurance-evidence.invalid.json +1 -1
  255. package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
  256. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  257. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  258. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  259. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  260. package/evals/fixtures/codex-relative-efficiency-v1.invalid.json +4 -0
  261. package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -0
  262. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  263. package/evals/fixtures/composite-criterion.valid.json +33 -0
  264. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  265. package/evals/fixtures/contract-family-library.valid.json +41 -0
  266. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  267. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  268. package/evals/fixtures/helper-request.invalid.json +1 -1
  269. package/evals/fixtures/helper-request.valid.json +1 -1
  270. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  271. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  272. package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -0
  273. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  274. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  275. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  276. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  277. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  278. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  279. package/evals/fixtures/task-authority-snapshot.valid.json +4 -4
  280. package/evals/fs4-readiness-matrix.v1.json +2 -2
  281. package/evals/fs5-artifact-archive/README.md +32 -0
  282. package/evals/fs5-artifact-archive/manifest.json +148 -0
  283. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  284. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  285. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  286. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  287. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  288. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  289. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  290. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  291. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  292. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  293. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  294. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  295. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  296. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  297. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  298. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  299. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  300. package/evals/fs5-causal-arm.v1.json +10 -6
  301. package/evals/fs5-pilot-protocol.v1.json +3 -3
  302. package/evals/fs5-pilot-protocol.v2.json +8 -8
  303. package/evals/fs5-pilot-protocol.v3.json +8 -8
  304. package/evals/fs5-pilot-protocol.v4.json +7 -7
  305. package/evals/fs5-pilot-protocol.v5.json +10 -8
  306. package/evals/harness-next/development-corpus.mjs +106 -0
  307. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  308. package/evals/harness-next/run-calibration.mjs +83 -0
  309. package/evals/harness-next/run-resource-probe.mjs +55 -0
  310. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  311. package/evals/harness-next.v1.json +51 -0
  312. package/evals/long-horizon-v1/README.md +19 -0
  313. package/evals/long-horizon-v1/runner.mjs +116 -48
  314. package/evals/long-horizon-v1/worker.mjs +77 -30
  315. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  316. package/evals/private-holdout-v1/README.md +5 -2
  317. package/evals/private-holdout-v1/public-exposure.v1.json +1 -1
  318. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  319. package/evals/runtime-conformance-v1/README.md +43 -0
  320. package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
  321. package/evals/runtime-conformance-v1/lane.json +57 -0
  322. package/evals/runtime-conformance-v1/paid-canary.json +31 -0
  323. package/evals/runtime-conformance-v1/runner.mjs +456 -0
  324. package/package.json +9 -4
  325. package/packages/piagent-core/README.md +15 -6
  326. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  327. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  328. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  329. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  330. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  331. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  332. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  333. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  334. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  335. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  336. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  337. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +699 -0
  338. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  339. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  340. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  341. package/packages/piagent-core/benchmark/benchmark-core.js +111 -110
  342. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  343. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  344. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  345. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  346. package/packages/piagent-core/benchmark/benchmark-forensics.js +67 -52
  347. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  348. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  349. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  350. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  351. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  352. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  353. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  354. package/packages/piagent-core/benchmark/benchmark-preflight.js +70 -7
  355. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  356. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  357. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  358. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +462 -0
  359. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  360. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  361. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  362. package/packages/piagent-core/benchmark/benchmark-record-validation.js +343 -8
  363. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  364. package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
  365. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  366. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  367. package/packages/piagent-core/benchmark/benchmark-runtime-causal.js +244 -0
  368. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  369. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  370. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  371. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  372. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +246 -33
  373. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  374. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  375. package/packages/piagent-core/benchmark/benchmark-suite.js +232 -4
  376. package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
  377. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  378. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  379. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  380. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  381. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  382. package/packages/piagent-core/benchmark/benchmark-usage.js +410 -37
  383. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  384. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  385. package/packages/piagent-core/capabilities/runtime-integrity.js +6 -0
  386. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  387. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  388. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  389. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  390. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +1000 -0
  391. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  392. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  393. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  394. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  395. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  396. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  397. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  398. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  399. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  400. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  401. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  402. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  403. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  404. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  405. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  406. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  407. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  408. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  409. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  410. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  411. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  412. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  413. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  414. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  415. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  416. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  417. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  418. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  419. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  420. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  421. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  422. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  423. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  424. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  425. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  426. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  427. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  428. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  429. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  430. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  431. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  432. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  433. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  434. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  435. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  436. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  437. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  438. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  439. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  440. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  441. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  442. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  443. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  444. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  445. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  446. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  447. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  448. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  449. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  450. package/packages/piagent-core/extensions/acceptance-receipt.js +208 -180
  451. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  452. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  453. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  454. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  455. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  456. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  457. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  458. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  459. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  460. package/packages/piagent-core/extensions/context-engine.js +12 -17
  461. package/packages/piagent-core/extensions/context-index-policy.js +4 -0
  462. package/packages/piagent-core/extensions/context-query-paths.js +57 -0
  463. package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
  464. package/packages/piagent-core/extensions/criterion-graph.js +4 -1
  465. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  466. package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
  467. package/packages/piagent-core/extensions/guard-types.ts +9 -1
  468. package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
  469. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  470. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  471. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  472. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  473. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  474. package/packages/piagent-core/extensions/task-journal.js +48 -3
  475. package/packages/piagent-core/extensions/task-lifecycle.js +32 -0
  476. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  477. package/packages/piagent-core/extensions/task-state.js +140 -43
  478. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  479. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  480. package/packages/piagent-core/extensions/verification-intelligence.js +109 -20
  481. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  482. package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
  483. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  484. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  485. package/packages/piagent-core/package.json +3 -3
  486. package/packages/piagent-core/policies/base-policy.json +43 -2
  487. package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
  488. package/packages/piagent-core/prompts/be-to-fe.md +2 -8
  489. package/packages/piagent-core/prompts/plan.md +1 -1
  490. package/packages/piagent-core/prompts/platform-improve.md +2 -6
  491. package/packages/piagent-core/prompts/review.md +2 -7
  492. package/packages/piagent-core/prompts/scout.md +1 -1
  493. package/packages/piagent-core/prompts/task.md +4 -3
  494. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  495. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  496. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  497. package/packages/piagent-core/runtime/hooks/completion-hook.ts +83 -89
  498. package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -7
  499. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  500. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  501. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +150 -19
  502. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
  503. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  504. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  505. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  506. package/packages/piagent-core/runtime/hooks/tool-result-value-helpers.ts +66 -0
  507. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  508. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  509. package/packages/piagent-core/runtime/inspection/bounded-emission-guard.ts +286 -0
  510. package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
  511. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  512. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  513. package/packages/piagent-core/runtime/inspection/task-subagent-tree.ts +27 -4
  514. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
  515. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
  516. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  517. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  518. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  519. package/packages/piagent-core/runtime/orchestration/helper-lifecycle.ts +16 -12
  520. package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
  521. package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
  522. package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
  523. package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
  524. package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
  525. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  526. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  527. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  528. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +15 -7
  529. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  530. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  531. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  532. package/packages/piagent-core/runtime/quality/edit-freshness-guard.ts +102 -0
  533. package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
  534. package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
  535. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  536. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  537. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +12 -3
  538. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  539. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
  540. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  541. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  542. package/packages/piagent-core/runtime/recovery/pristine-task-policy-refresh.ts +91 -0
  543. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
  544. package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
  545. package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
  546. package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
  547. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  548. package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
  549. package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
  550. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  551. package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
  552. package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
  553. package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
  554. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  555. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
  556. package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
  557. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  558. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
  559. package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
  560. package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
  561. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  562. package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
  563. package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
  564. package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
  565. package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
  566. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  567. package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
  568. package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
  569. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  570. package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
  571. package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
  572. package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
  573. package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
  574. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  575. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  576. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  577. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  578. package/packages/piagent-core/runtime/tools/phase-tools.ts +10 -9
  579. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  580. package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
  581. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  582. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  583. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  584. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  585. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  586. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  587. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  588. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  589. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  590. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  591. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +101 -0
  592. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  593. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  594. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  595. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  596. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  597. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  598. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  599. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +201 -0
  600. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  601. package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
  602. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  603. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  604. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  605. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  606. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  607. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  608. package/packages/piagent-core/subagents/piagent-oracle.md +5 -3
  609. package/packages/piagent-core/subagents/piagent-planner.md +6 -4
  610. package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
  611. package/packages/piagent-core/subagents/piagent-scout.md +4 -2
  612. package/packages/piagent-core/subagents/piagent-worker.md +6 -4
  613. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.js → MarkdownMessage-DGk34zJT.js} +1 -1
  614. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  615. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  616. package/packages/piagent-webui/dist/client/index.html +2 -2
  617. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  618. package/packages/piagent-webui/extension/piagent-webui.ts +13 -3
  619. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  620. package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
  621. package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
  622. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  623. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  624. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  625. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  626. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  627. package/packages/piagent-webui/gateway/gateway-session-stream.ts +170 -32
  628. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  629. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  630. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  631. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  632. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  633. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  634. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  635. package/packages/piagent-webui/gateway/session-operation-lifecycle.ts +237 -0
  636. package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
  637. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  638. package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
  639. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  640. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  641. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  642. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  643. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  644. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +118 -117
  645. package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
  646. package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
  647. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  648. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  649. package/packages/piagent-webui/server/transcript-projection.ts +150 -11
  650. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  651. package/schemas/approved-host-contracts.schema.json +973 -0
  652. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  653. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  654. package/schemas/codex-relative-efficiency-v1.schema.json +155 -0
  655. package/schemas/composite-criterion.schema.json +788 -0
  656. package/schemas/contract-family-library.schema.json +28 -0
  657. package/schemas/contract-selection-recipe.schema.json +31 -0
  658. package/schemas/failure-evidence.schema.json +2 -2
  659. package/schemas/helper-request.schema.json +16 -4
  660. package/schemas/host-contract-plan.schema.json +25 -0
  661. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  662. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  663. package/schemas/piagent-webui/runtime-event-v2.schema.json +46 -5
  664. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  665. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  666. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  667. package/schemas/piagent-webui/subagent-tree-v1.schema.json +11 -1
  668. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  669. package/schemas/project-profile.schema.json +1 -1
  670. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  671. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  672. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  673. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  674. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  675. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  676. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  677. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  678. package/schemas/task-contract.schema.json +45 -0
  679. package/scripts/approve-independent-verification.mjs +57 -0
  680. package/scripts/benchmark-arm-observer.mjs +320 -0
  681. package/scripts/benchmark-budget-ipc.mjs +34 -0
  682. package/scripts/benchmark-budget-launcher.mjs +91 -0
  683. package/scripts/benchmark-budget-processes.mjs +133 -0
  684. package/scripts/benchmark-budget-publication.mjs +228 -0
  685. package/scripts/benchmark-budget-runtime.mjs +136 -0
  686. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  687. package/scripts/benchmark-codex-journey.mjs +406 -0
  688. package/scripts/benchmark-independent-verification.mjs +628 -0
  689. package/scripts/benchmark-journey-outcome.mjs +92 -0
  690. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  691. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  692. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  693. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  694. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  695. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  696. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  697. package/scripts/benchmark-runner-completion.mjs +133 -0
  698. package/scripts/benchmark-runner-configuration.mjs +159 -0
  699. package/scripts/benchmark-runner-core.mjs +224 -387
  700. package/scripts/benchmark-runner-finalization.mjs +144 -27
  701. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  702. package/scripts/benchmark-runner-schedule.mjs +256 -0
  703. package/scripts/benchmark-runner-support.mjs +136 -4
  704. package/scripts/benchmark-runner.mjs +95 -18
  705. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  706. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  707. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  708. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  709. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  710. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  711. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  712. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  713. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  714. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  715. package/scripts/benchmark-session-evaluator.mjs +169 -0
  716. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  717. package/scripts/benchmark-session-usage.mjs +28 -0
  718. package/scripts/benchmark-session.mjs +343 -50
  719. package/scripts/benchmark-webui-journey.mjs +678 -0
  720. package/scripts/check-public-wording.mjs +46 -0
  721. package/scripts/configure-subagents.sh +42 -34
  722. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  723. package/scripts/helper-evaluation.mjs +1 -1
  724. package/scripts/phase-tools-evaluation.mjs +1 -0
  725. package/scripts/pi-auto.sh +7 -1
  726. package/scripts/pi-usage-history.mjs +201 -11
  727. package/scripts/piagent-cli.mjs +8 -0
  728. package/scripts/private-holdout-readiness.mjs +7 -1
  729. package/scripts/public-evaluation-exposure.mjs +140 -0
  730. package/scripts/select-independent-verification.mjs +62 -0
  731. package/scripts/team-doctor.sh +1 -1
  732. package/scripts/typescript-loader.mjs +135 -1
  733. package/scripts/update-global.mjs +6 -7
  734. package/scripts/verify-local.sh +41 -55
  735. package/scripts/verify-release-identity.mjs +5 -3
  736. package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
@@ -1,109 +1,93 @@
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 { applyBenchmarkExecutionDefaults } from "../packages/piagent-core/benchmark/benchmark-runner-policy.js";
14
- import {
15
- appendPrivateJsonl,
16
- createBenchmarkCandidateGuard,
17
- loadReplayFailurePlan,
18
- retainWorkspaceForensics,
19
- safeInfrastructureDiagnostic,
20
- writeBenchmarkAbort,
21
- writeBenchmarkRunManifest,
22
- writePrivateAtomic
23
- } 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";
24
19
  import { benchmarkBootstrapCandidateIndex, benchmarkBootstrapMetadata } from "../packages/piagent-core/benchmark/benchmark-bootstrap.js";
25
20
  import { createBenchmarkExecutionGuard } from "../packages/piagent-core/benchmark/benchmark-execution-guard.js";
26
- 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";
27
24
  import { benchmarkTreeIdentity } from "../packages/piagent-core/benchmark/benchmark-tree-identity.js";
28
25
  import { completedBenchmarkRecord, expectedBenchmarkRecord } from "../packages/piagent-core/benchmark/benchmark-record-validation.js";
29
26
  import { pairedOutcomeFloorStop } from "../packages/piagent-core/benchmark/benchmark-stop-policy.js";
30
- import {
31
- approveProductionStageControl,
32
- buildBenchmarkStageDiagnostic,
27
+ import { productionExecutionBindingMatches,
28
+ productionGuardBindingMatches } from "../packages/piagent-core/benchmark/benchmark-production-completion.js";
29
+ import { approveProductionStageControl, buildBenchmarkStageDiagnostic,
33
30
  createProductionStageControl,
34
- durablePairedOutcomeFloorStop,
35
- productionSpendControlValidationErrors,
36
- productionStageResumeDisposition
37
- } from "../packages/piagent-core/benchmark/benchmark-stage-diagnostic.js";
31
+ productionSpendControlValidationErrors, productionStageResumeDisposition } from "../packages/piagent-core/benchmark/benchmark-stage-diagnostic.js";
38
32
  import { loadBenchmarkAssuranceEvidence, loadBenchmarkSuite, resolveBenchmarkSuiteEntry, validateBenchmarkSuiteFiles } from "../packages/piagent-core/benchmark/benchmark-suite-runtime.js";
39
33
  import { appendBenchmarkLedger, assertBenchmarkLedgerBinding, emptyBenchmarkLedgerBinding, inspectBenchmarkLedger, validateBenchmarkLedgerPrefix } from "../packages/piagent-core/benchmark/benchmark-ledger.js";
40
34
  import { acquireBenchmarkRunLock } from "../packages/piagent-core/benchmark/benchmark-run-lock.js";
41
35
  import { createBenchmarkProcessController } from "../packages/piagent-core/benchmark/benchmark-process.js";
42
36
  import {
43
- clearRecoveredBenchmarkAttempts,
44
- persistUnacceptedBenchmarkAttempt,
45
- promoteMeasuredBenchmarkRecord,
46
- recoverOrphanedBenchmarkAttempts,
47
- recoverPendingBenchmarkRecord,
48
- stageMeasuredBenchmarkRecord
37
+ clearRecoveredBenchmarkAttempts, persistUnacceptedBenchmarkAttempt, promoteMeasuredBenchmarkRecord,
38
+ recoverOrphanedBenchmarkAttempts, recoverPendingBenchmarkRecord, stageMeasuredBenchmarkRecord
49
39
  } from "../packages/piagent-core/benchmark/benchmark-resume-recovery.js";
50
40
  import { finalizeBenchmarkRun } from "./benchmark-runner-finalization.mjs";
41
+ import { applyProductionCampaignStopPolicy, assertProductionResumeCompletionState,
42
+ productionMeasurementInvalidatingOutcomeError,
43
+ productionReleaseMeasurementAbortEvidence, writeProductionResumeAbortIfNeeded,
44
+ writeProductionRunAbortIfNeeded } from "./benchmark-runner-completion.mjs";
51
45
  import {
46
+ applyBenchmarkResumeOptions,
47
+ bindBenchmarkTerminationSignals,
48
+ benchmarkExecutionPlan,
52
49
  benchmarkRunKey,
53
50
  confirmPlan,
54
51
  createRunId,
55
52
  defaultOutputRoot,
56
53
  ensureEmptyOutput,
57
54
  executionOrder,
58
- fail,
59
- formatDuration,
60
- frozenRuntimeCommandsForFinalization,
61
- invokedAsEntrypoint,
62
- isLegacyInvocation,
63
- loadResumeState,
64
- pairedChunk,
65
- privateDirectory,
66
- readJsonFile,
55
+ fail, formatDuration, invokedAsEntrypoint, isLegacyInvocation,
56
+ loadResumeState, pairedChunk, privateDirectory,
57
+ readJsonFile, registeredBenchmarkCustodyRoot,
67
58
  samePairedBlock,
68
59
  sameStringList
69
60
  } from "./benchmark-runner-support.mjs";
70
- import { runBenchmarkSession } from "./benchmark-session.mjs";
71
- import {
72
- assertBenchmarkHostReadinessStartReady,
73
- assertExistingBenchmarkHostReadiness,
74
- benchmarkHostReadinessPolicyDigest,
75
- collectReadyBenchmarkHostReadiness
76
- } 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";
77
71
  export { parseBenchmarkArgs };
78
72
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
79
73
  const packageManifest = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
80
74
  const bootstrapMetadata = benchmarkBootstrapMetadata();
81
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;
82
79
  let interruptedSignal;
83
- const processController = createBenchmarkProcessController(() => Boolean(interruptedSignal));
80
+ const processController = createBenchmarkProcessController(() => Boolean(interruptedSignal), createBenchmarkBudgetProcessHooks());
84
81
  const runCommand = processController.run;
85
-
86
82
  function installSignalForwarding() {
87
- const handlers = new Map();
88
- for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
89
- const handler = () => {
90
- if (interruptedSignal) return;
91
- interruptedSignal = signal;
92
- processController.terminateAll(signal);
93
- };
94
- handlers.set(signal, handler);
95
- process.on(signal, handler);
96
- }
97
- return () => {
98
- for (const [signal, handler] of handlers) process.off(signal, handler);
99
- };
83
+ return bindBenchmarkTerminationSignals({ interrupted: () => Boolean(interruptedSignal),
84
+ interrupt: (signal) => { interruptedSignal = signal; },
85
+ terminateAll: (signal) => processController.terminateAll(signal) });
100
86
  }
101
-
102
87
  async function runLegacy(argv) {
103
88
  const result = await runCommand("bash", [path.join(packageRoot, "scripts", "quality-benchmark.sh"), ...argv], { cwd: process.cwd(), inherit: true });
104
89
  process.exitCode = result.code;
105
90
  }
106
-
107
91
  async function main() {
108
92
  const argv = process.argv.slice(2);
109
93
  if (isLegacyInvocation(argv)) return runLegacy(argv);
@@ -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,7 +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);
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);
271
294
  if (manifest.rootSeed !== rootSeed) fail("Cannot resume benchmark: root seed mismatch", 1);
272
295
  if (manifest.repeats !== options.repeats) fail("Cannot resume benchmark: repeat count mismatch", 1);
273
296
  if (!sameStringList(manifest.surfaces, options.surfaces)) fail("Cannot resume benchmark: surface list mismatch", 1);
@@ -301,40 +324,26 @@ async function main() {
301
324
  runId: manifest.runId,
302
325
  completedRuns: resumeState.completedRuns.length,
303
326
  expectedRuns: fullOrder.length
304
- }, error, { ledger: resumeState.ledgerBinding, provenanceStamp: candidateGuard.stamp("resume-ledger") });
327
+ }, error, { ledger: resumeState.ledgerBinding, provenanceStamp: candidateGuard.stamp("resume-ledger"),
328
+ ...productionReleaseMeasurementAbortEvidence(options, suite, error) });
305
329
  throw error;
306
330
  }
307
331
  const provenanceError = candidateGuard.check("resume");
308
332
  if (provenanceError) {
309
333
  writeBenchmarkAbort(resumeState.runRoot, { runId: manifest.runId, completedRuns: resumeState.completedRuns.length, expectedRuns: fullOrder.length }, provenanceError, {
310
334
  ledger: resumeState.ledgerBinding,
311
- provenanceStamp: candidateGuard.stamp("resume")
335
+ provenanceStamp: candidateGuard.stamp("resume"),
336
+ ...productionReleaseMeasurementAbortEvidence(options, suite, provenanceError)
312
337
  });
313
338
  throw provenanceError;
314
339
  }
315
- const recoveredTerminalStop = durablePairedOutcomeFloorStop({
316
- enabled: options.stopAfterFailedPair,
317
- suite,
318
- runs: resumeState.completedRuns,
319
- fullOrder
340
+ assertProductionResumeCompletionState({
341
+ candidateGuard,
342
+ fullOrder,
343
+ options,
344
+ resumeState,
345
+ suite
320
346
  });
321
- if (recoveredTerminalStop) {
322
- for (const marker of ["paused.json", "stage-diagnostic.json", "interrupted.json", "aborted.json"]) {
323
- fs.rmSync(path.join(resumeState.runRoot, marker), { force: true });
324
- }
325
- writePrivateAtomic(path.join(resumeState.runRoot, "stopped.json"), `${JSON.stringify({
326
- ...recoveredTerminalStop,
327
- runId: manifest.runId,
328
- completedRuns: resumeState.completedRuns.length,
329
- expectedRuns: fullOrder.length,
330
- stoppedAt: new Date().toISOString(),
331
- resumeAllowed: false,
332
- recoveredFromAcceptedLedger: true,
333
- ledger: resumeState.ledgerBinding,
334
- provenanceStamp: candidateGuard.stamp("resume-terminal-floor")
335
- }, null, 2)}\n`);
336
- fail("Cannot resume benchmark: the accepted ledger already contains a terminal paired outcome-floor failure", 1);
337
- }
338
347
  if (productionSpendControlled) {
339
348
  if (productionHostReadinessRequired) {
340
349
  if (manifest.hostReadinessPolicyDigest !== productionHostReadinessPolicyDigest
@@ -372,6 +381,7 @@ async function main() {
372
381
  baselineSurface: comparison.baselineSurface,
373
382
  requestedModel: options.model,
374
383
  requestedThinking: options.thinking,
384
+ requestedServiceTier: options.serviceTier,
375
385
  suite,
376
386
  manifest,
377
387
  hostReadinessPolicy: productionHostReadinessPolicy,
@@ -416,44 +426,34 @@ async function main() {
416
426
  let recoveredAttemptsByKey = new Map();
417
427
  const order = pairedChunk(pendingOrder, options.maxSessions);
418
428
  const lifecycles = [...new Set(suite.scenarios.map((scenario) => scenario.lifecycle ?? "steady-state"))];
419
- const plan = [
420
- "Piagent automatic benchmark",
421
- ` platform: v${packageManifest.version}`,
422
- ` suite: ${suite.id} (${suite.scenarios.length}${suite.scenarios.length !== declaredScenarioCount ? `/${declaredScenarioCount}` : ""} scenarios)`,
423
- ` digest: ${suiteDigest.slice(0, 16)}`,
424
- ` surfaces: ${options.surfaces.join(", ")}`,
425
- ` compare: ${benchmarkSurfaceLabel(comparison.candidateSurface)} vs ${benchmarkSurfaceLabel(comparison.baselineSurface)}`,
426
- ` repeats: ${options.repeats}`,
427
- ` retries: ${options.infrastructureRetries} infrastructure-only · ${options.retryDelaySeconds}s backoff`,
428
- ` sessions: ${fullOrder.length}`,
429
- ...(resumeState ? [` completed: ${resumeState.completedRuns.length}`, ` remaining: ${pendingOrder.length}`] : []),
430
- ...(options.maxSessions !== undefined ? [` chunk: up to ${order.length}/${pendingOrder.length} remaining sessions`] : []),
431
- ...(options.maxRuntimeMinutes !== undefined ? [` budget: ${options.maxRuntimeMinutes} minute runtime chunk`] : []),
432
- ...(options.stopAfterFailedPair ? [" stop: terminal after a completed pair falls below the outcome floor"] : []),
433
- ` model: ${options.model ?? "Pi default"}`,
434
- ` thinking: ${options.thinking ?? "Pi default"}`,
435
- ` treatment: ${options.piagentTreatment}`,
436
- ` lifecycle: ${lifecycles.join(", ")}`,
437
- ...(options.replaySource ? [` replay: ${options.replaySource.runId ?? "prior-report"} · ${options.replayRuns.length} sessions`] : []),
438
- ...(resumeState ? [` resume: ${resumeState.manifest.runId}`] : []),
439
- ` variants: ${suite.scenarios.some((scenario) => scenario.variantGenerator) ? `generated · seed ${rootSeedDigest.slice(0, 16)}` : "static"}`,
440
- ` ordering: ${suite.schemaVersion === 2 ? "seeded paired blocks" : "paired alternating"}`,
441
- ` timeout: ${options.timeoutSeconds}s per session`,
442
- " grading: hidden verifier + scope + output safety + Pi task evidence"
443
- ].join("\n");
444
- const codexPlan = options.surfaces.includes("codex-cli")
445
- ? `\n codex: ${options.codexMode} mode · model ${codexModelName(options.model)} · effort ${codexThinkingEffort(options.thinking)}${options.codexMode === "controlled" ? " · isolated home" : ""}`
446
- : "";
447
- const nativeWarning = options.surfaces.includes("codex-cli") && options.codexMode === "native"
448
- ? "\nNative Codex mode loads the operator's global AGENTS.md, configuration, rules, hooks, MCP servers, and plugins."
449
- : "";
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
+ });
450
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`);
451
447
  process.stdout.write(`${plan}${codexPlan}\n manifest: ${manifestPath}\nDRY RUN: no model session started.\n`);
452
448
  return;
453
449
  }
450
+ if (!options.preflightOnly) budgetRuntime = openBenchmarkBudgetCore(budgetControl);
454
451
  if (productionSpendControlled) {
455
- if (options.stopAfterFailedPair !== productionSpendControl.execution.stopAfterFailedPair) {
456
- 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);
457
457
  }
458
458
  const completedRuns = resumeState?.completedRuns.length ?? 0;
459
459
  const authorizedThroughRuns = deferredProductionStageApproval?.authorizedThroughRuns
@@ -484,50 +484,22 @@ async function main() {
484
484
  }
485
485
  }
486
486
  const runId = resumeState?.manifest.runId ?? createRunId(suite.id);
487
- const runtimeCommands = productionFinalizationOnly
488
- ? frozenRuntimeCommandsForFinalization(resumeState.manifest, options.surfaces)
489
- : {
490
- pi: benchmarkCommandIdentity(piCommand, { cwd: bootstrapMetadata?.originalCwd ?? process.cwd() }),
491
- codex: options.surfaces.includes("codex-cli")
492
- ? benchmarkCommandIdentity(codexCommand, { cwd: bootstrapMetadata?.originalCwd ?? process.cwd() })
493
- : null,
494
- node: benchmarkCommandIdentity(process.execPath),
495
- git: benchmarkCommandIdentity("git"),
496
- bash: benchmarkCommandIdentity("bash")
497
- };
498
- const environmentPolicy = benchmarkEnvironmentPolicy();
499
- const configurationPiAgentHome = productionFinalizationOnly
500
- ? resumeState.manifest.piAgentHome?.identity
501
- : bootstrapMetadata.piAgentHome.identity;
502
- const configurationCodexCredential = productionFinalizationOnly
503
- ? resumeState.manifest.codexCredentialIdentity ?? null
504
- : bootstrapMetadata.codexCredential?.identity ?? null;
505
- const configuration = {
506
- schemaVersion: 1,
507
- source: bootstrapMetadata.sourceIdentity,
508
- candidateDigest: candidateGuard.provenance.contentDigest,
509
- suiteDigest,
510
- runtimeDependencyDigest: bootstrapMetadata.runtimeDependencies?.digest ?? null,
511
- runtimeCommands,
512
- environmentPolicy,
513
- ...(productionHostReadinessRequired ? { hostReadinessPolicyDigest: productionHostReadinessPolicyDigest } : {}),
514
- piAgentHome: configurationPiAgentHome,
515
- codexCredential: configurationCodexCredential,
516
- rootSeedDigest,
517
- surfaces: options.surfaces,
518
- model: options.model ?? null,
519
- thinking: options.thinking ?? null,
520
- codexMode: options.codexMode,
521
- piagentTreatment: options.piagentTreatment,
522
- allowPiAuthWriteback: options.allowPiAuthWriteback,
523
- piCredentialVaultId: bootstrapMetadata.piAgentHome.vaultId,
524
- timeoutSeconds: options.timeoutSeconds,
525
- infrastructureRetries: options.infrastructureRetries,
526
- retryDelaySeconds: options.retryDelaySeconds,
527
- stopAfterFailedPair: options.stopAfterFailedPair,
528
- order: fullOrder.map((item) => ({ scenarioId: item.scenario.id, surface: item.surface, repeat: item.repeat }))
529
- };
530
- const configurationDigest = crypto.createHash("sha256").update(JSON.stringify(configuration)).digest("hex");
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);
501
+ const { receipt: providerFreeEvidence, binding: providerFreeEvidenceBinding } = await prepareProductionProviderFreeEvidence({
502
+ required: providerFreeEvidenceRequired, packageRoot, bootstrapMetadata, candidateProvenance: candidateGuard.provenance, providerFreeConfigurationDigest, runCommand, resumedReceipt: resumeState ? resumeState.manifest.providerFreeEvidence ?? null : undefined });
531
503
  piCommand = runtimeCommands.pi.resolvedPath;
532
504
  if (runtimeCommands.codex) codexCommand = runtimeCommands.codex.resolvedPath;
533
505
  if (resumeState && JSON.stringify(resumeState.manifest.runtimeCommands ?? null) !== JSON.stringify(runtimeCommands)) {
@@ -572,6 +544,8 @@ async function main() {
572
544
  piAgentHome: productionFinalizationOnly ? null : bootstrapMetadata?.piAgentHome,
573
545
  codexCredential: productionFinalizationOnly ? null : bootstrapMetadata?.codexCredential,
574
546
  runtimeDependencies: bootstrapMetadata?.runtimeDependencies,
547
+ webUiAssets: bootstrapMetadata?.webUiAssets,
548
+ registeredAssets: bootstrapMetadata?.registeredMeasurement,
575
549
  commands: runtimeCommands,
576
550
  verifyCommandAssets: !productionFinalizationOnly
577
551
  });
@@ -594,8 +568,10 @@ async function main() {
594
568
  const preflightAssetError = executionGuard.check("before-preflight", [piRuntimeHome]);
595
569
  if (preflightAssetError) throw preflightAssetError;
596
570
  codexRuntime = createCodexRuntime(options);
597
- 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 })); }
598
573
  catch (error) { preservePiRuntime ||= error.code === "BENCHMARK_PI_CREDENTIAL_RECONCILIATION_FAILED"; throw error; }
574
+ assertCodexRuntimeCredential(codexRuntime, { required: registeredMeasurementRun });
599
575
  const postPreflightAssetError = executionGuard.check("after-preflight", [piRuntimeHome]);
600
576
  if (postPreflightAssetError) throw postPreflightAssetError;
601
577
  resetBenchmarkPiRuntimeEphemeralState(piRuntimeHome);
@@ -610,10 +586,8 @@ async function main() {
610
586
  }
611
587
  }
612
588
  assertHostReadinessStartReady();
613
- const source = bootstrapMetadata?.sourceIdentity;
614
- if (!source) fail("Modern benchmark is missing its frozen Git source identity", 1);
615
589
  if (options.preflightOnly) {
616
- 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 });
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 });
617
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`);
618
592
  return;
619
593
  }
@@ -622,6 +596,16 @@ async function main() {
622
596
  const runRoot = resumeState ? privateDirectory(output) : ensureEmptyOutput(output);
623
597
  releaseRunLock ??= acquireBenchmarkRunLock(runRoot, runId);
624
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;
625
609
  const removeSignalHandlers = installSignalForwarding();
626
610
  const startedAt = resumeState?.manifest.startedAt ?? new Date().toISOString();
627
611
  const runs = resumeState ? [...resumeState.completedRuns] : [];
@@ -642,14 +626,20 @@ async function main() {
642
626
  },
643
627
  suiteDigest,
644
628
  suiteIdentity,
629
+ ...(registeredMeasurementBinding ? { registeredMeasurement: registeredMeasurementBinding } : {}),
630
+ ...(registeredRuntimeVerifiers ? { registeredRuntimeVerifiers } : {}),
645
631
  candidateProvenance: candidateGuard.provenance,
646
632
  runtimeDependencies: bootstrapMetadata?.runtimeDependencies ?? null,
633
+ webUiAssets: webUiAssetIdentity,
647
634
  runtimeCommands,
648
635
  preflightRuntime: runtime,
649
636
  codexCredentialIdentity: bootstrapMetadata.codexCredential?.identity ?? null,
650
637
  codexCredentialBridge,
651
638
  configurationDigest,
639
+ ...(budgetControl ? { budgetControl: budgetControl.identity } : {}),
652
640
  environmentPolicy,
641
+ ...(verificationPlan ? { verificationPlan: { file: options.verificationPlan, identity: verificationPlan.identity } } : {}),
642
+ ...(providerWirePlan ? { providerWirePlanDigest: providerWirePlan.planDigest } : {}),
653
643
  piAgentHome: {
654
644
  copied: bootstrapMetadata.piAgentHome.copied,
655
645
  globalInstructions: bootstrapMetadata.piAgentHome.globalInstructions,
@@ -667,15 +657,26 @@ async function main() {
667
657
  repeats: options.repeats,
668
658
  model: options.model ?? null,
669
659
  thinking: options.thinking ?? null,
660
+ serviceTier: options.serviceTier ?? null,
670
661
  codexMode: options.codexMode,
662
+ codexBaseline: options.codexBaseline,
671
663
  piagentTreatment: options.piagentTreatment,
664
+ ...(options.acceptancePolicyBinding ? { acceptancePolicyBinding: options.acceptancePolicyBinding } : {}),
665
+ ...(bootstrapMetadata?.treatmentDerivation ? { treatmentDerivation: bootstrapMetadata.treatmentDerivation } : {}),
672
666
  allowPiAuthWriteback: options.allowPiAuthWriteback,
673
667
  timeoutSeconds: options.timeoutSeconds,
674
668
  infrastructureRetries: options.infrastructureRetries,
675
669
  retryDelaySeconds: options.retryDelaySeconds,
670
+ transportCircuitBreaker: createBenchmarkTransportCircuit(),
676
671
  stopAfterFailedPair: options.stopAfterFailedPair,
672
+ ...(options.campaignStopPolicy ? { campaignStopPolicy: options.campaignStopPolicy } : {}),
673
+ ...(options.measurementOnly ? { measurementOnly: true } : {}),
674
+ ...(options.failedAttemptsOnly ? { failedAttemptsOnly: true } : {}),
677
675
  scenarioIds: options.scenarioIds ?? null,
678
676
  ...(productionSpendControlled ? {
677
+ productionGuards: productionSpendControl.productionGuards,
678
+ providerFreeConfigurationDigest,
679
+ providerFreeEvidence,
679
680
  stageControl: createProductionStageControl({
680
681
  authorizedThroughRuns: productionStageBoundaries[0],
681
682
  generatedAt: startedAt
@@ -691,6 +692,17 @@ async function main() {
691
692
  repeat: item.repeat
692
693
  }))
693
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
+ }
694
706
  assertHostReadinessStartReady();
695
707
  if (productionSpendControlled && deferredProductionStageApproval) {
696
708
  manifest.stageControl = approveProductionStageControl(manifest.stageControl, deferredProductionStageApproval);
@@ -706,214 +718,37 @@ async function main() {
706
718
  fs.rmSync(path.join(runRoot, "paused.json"), { force: true });
707
719
  }
708
720
  }
709
- const fullIndexByKey = new Map(fullOrder.map((item, index) => [benchmarkRunKey(item), index + 1]));
710
- const wallStartedAt = Date.now();
711
- const runtimeDeadline = options.maxRuntimeMinutes === undefined
712
- ? undefined
713
- : wallStartedAt + options.maxRuntimeMinutes * 60_000;
714
- let newRuns = 0;
721
+ const scheduleState = { fatalRunError, pauseReason, preservePiRuntime, fatalExecutionReceipt, ledgerBinding, terminalStop };
715
722
  try {
716
- for (const [index, item] of order.entries()) {
717
- if (interruptedSignal) break;
718
- if (runtimeDeadline !== undefined && newRuns > 0 && !samePairedBlock(order[index - 1], item) && Date.now() >= runtimeDeadline) {
719
- pauseReason = `max-runtime-minutes:${options.maxRuntimeMinutes}`;
720
- break;
721
- }
722
- const completedBefore = runs.filter(completedBenchmarkRecord).length;
723
- const remainingIncludingThis = fullOrder.length - completedBefore;
724
- const averageMs = newRuns > 0 ? (Date.now() - wallStartedAt) / newRuns : undefined;
725
- const eta = averageMs === undefined ? "" : ` · ETA ${formatDuration(averageMs * remainingIncludingThis)}`;
726
- const fullIndex = fullIndexByKey.get(benchmarkRunKey(item)) ?? index + 1;
727
- 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`);
728
- let record;
729
- let sessionEvidence;
730
- const infrastructureFailures = [...(recoveredAttemptsByKey.get(benchmarkRunKey(item)) ?? [])];
731
- const firstInfrastructureAttempt = infrastructureFailures.reduce((maximum, attempt) => Math.max(maximum, attempt.attempt ?? 0), 0) + 1;
732
- if (firstInfrastructureAttempt > options.infrastructureRetries + 1) {
733
- fatalRunError = new Error(`No infrastructure retry remains after recovering an interrupted provider attempt for ${item.scenario.id}/${item.surface}/r${item.repeat}`);
734
- break;
735
- }
736
- for (let infrastructureAttempt = firstInfrastructureAttempt; infrastructureAttempt <= options.infrastructureRetries + 1; infrastructureAttempt += 1) {
737
- record = undefined;
738
- fatalRunError = executionGuard.check(`before-session:${item.scenario.id}:${item.surface}:r${item.repeat}:attempt${infrastructureAttempt}`, [piRuntimeHome]);
739
- if (fatalRunError) break;
740
- let attemptError;
741
- let attemptCodexRuntime = codexRuntime;
742
- try {
743
- if (item.surface === "codex-cli") attemptCodexRuntime = createCodexRuntime(options);
744
- sessionEvidence = await withBenchmarkPiCredentialWriteback(bootstrapMetadata.piAgentHome, piRuntimeHome, () => runBenchmarkSession({
745
- packageRoot,
746
- runCommand,
747
- resolveSuiteEntry: resolveBenchmarkSuiteEntry,
748
- interrupted: () => Boolean(interruptedSignal),
749
- suite,
750
- suiteRoot,
751
- ...item,
752
- orderIndex: fullIndex,
753
- infrastructureAttempt,
754
- runId,
755
- runRoot,
756
- options,
757
- piCommand,
758
- codexCommand,
759
- codexDisabledFeatures: runtime.codexDisabledFeatures,
760
- codexRuntime: attemptCodexRuntime,
761
- piRuntimeHome,
762
- systemCommands: {
763
- node: runtimeCommands.node.resolvedPath,
764
- git: runtimeCommands.git.resolvedPath,
765
- bash: runtimeCommands.bash.resolvedPath
766
- },
767
- suiteDigest,
768
- configurationDigest,
769
- persistCompletedRecord: (candidate) => stageMeasuredBenchmarkRecord({ runRoot, manifest, ledgerBinding, record: candidate, infrastructureFailures, index: fullIndex - 1, expected: item, runId, suite, configurationDigest, runs }),
770
- rootSeed
771
- }));
772
- record = sessionEvidence.record;
773
- } catch (error) {
774
- preservePiRuntime ||= error.code === "BENCHMARK_PI_CREDENTIAL_RECONCILIATION_FAILED";
775
- attemptError = error;
776
- const safeError = safeInfrastructureDiagnostic(error.message, [piRuntimeHome?.path, bootstrapMetadata.piAgentHome.configRoot, bootstrapMetadata.piAgentHome.runtimeParent].filter(Boolean));
777
- record = {
778
- schemaVersion: 1,
779
- runId,
780
- orderIndex: fullIndex,
781
- scenarioId: item.scenario.id,
782
- scenarioTitle: item.scenario.title,
783
- scenarioKind: item.scenario.kind,
784
- category: item.scenario.category ?? "unspecified",
785
- difficulty: item.scenario.difficulty ?? "unspecified",
786
- profile: item.scenario.profile ?? suite.profile,
787
- lifecycle: item.scenario.lifecycle ?? "steady-state",
788
- surface: item.surface,
789
- repeat: item.repeat,
790
- infrastructureAttempt,
791
- abortSuite: true,
792
- infrastructureFailure: `runner-error:${safeError}`,
793
- resolved: false,
794
- failure: `runner-error:${safeError}`,
795
- grade: { passed: false, score: 0, checks: [] },
796
- graderIntegrity: { passed: false },
797
- scope: { passed: false, changedFiles: [], outsideScope: [] },
798
- outputSafety: { passed: false, forbiddenHits: [] },
799
- outputEvidence: { passed: false, requiredCount: 0, observedCount: 0, missingHashes: [] },
800
- workflow: null,
801
- usage: aggregateSessionUsage([]),
802
- durationSeconds: 0
803
- };
804
- } finally {
805
- if (attemptCodexRuntime !== codexRuntime) attemptCodexRuntime.cleanup();
806
- }
807
- const guardStage = `after-session:${item.scenario.id}:${item.surface}:r${item.repeat}:attempt${infrastructureAttempt}`;
808
- const postSessionReceipt = executionGuard.receipt(guardStage, [piRuntimeHome]);
809
- const postSessionGuard = postSessionReceipt.stamp;
810
- const assetError = postSessionReceipt.error;
811
- if (!assetError && item.surface !== "codex-cli") resetBenchmarkPiRuntimeEphemeralState(piRuntimeHome);
812
- if (!interruptedSignal) {
813
- if (assetError) {
814
- fatalExecutionReceipt = postSessionReceipt;
815
- if (sessionEvidence) retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
816
- if (record) {
817
- persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record, reason: "execution-asset-mismatch-after-provider-attempt", forceTokenUnavailable: true });
818
- fs.rmSync(path.join(runRoot, "pending-record.json"), { force: true });
819
- fs.rmSync(path.join(runRoot, "measured-record-ready.json"), { force: true });
820
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, contaminated: true, executionAsset: assetError.executionAsset ?? { reason: assetError.message } });
821
- if (sessionEvidence) fs.rmSync(sessionEvidence.inflightPath, { force: true });
822
- }
823
- fatalRunError = assetError;
824
- break;
825
- }
826
- if (sessionEvidence && !record.abortSuite) promoteMeasuredBenchmarkRecord({ runRoot, ledgerBinding, record, postSessionGuard });
827
- }
828
- if (interruptedSignal && sessionEvidence) {
829
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
830
- persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record, reason: "interrupted-provider-attempt-not-accepted-as-a-measured-outcome" });
831
- fs.rmSync(path.join(runRoot, "pending-record.json"), { force: true });
832
- fs.rmSync(path.join(runRoot, "measured-record-ready.json"), { force: true });
833
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, interrupted: true });
834
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
835
- }
836
- if (!record.abortSuite || interruptedSignal) break;
837
- const retryAvailable = record.infrastructureRetryable === true && infrastructureAttempt <= options.infrastructureRetries;
838
- infrastructureFailures.push({
839
- attempt: infrastructureAttempt,
840
- failure: record.infrastructureFailure ?? record.failure,
841
- class: record.infrastructureClass ?? "infrastructure",
842
- agent: record.agent,
843
- usage: record.usage,
844
- usageStatus: record.usageStatus,
845
- durationSeconds: record.durationSeconds
846
- });
847
- if (record.usageStatus === "unknown-after-provider-start") {
848
- manifest.unknownCostAttempts = Number(manifest.unknownCostAttempts ?? 0) + 1;
849
- manifest.tokenClaimsUnavailableReason = "one-or-more-provider-attempts-have-unknown-usage";
850
- }
851
- // A runner error before runBenchmarkSession creates its durable in-flight
852
- // marker is positively pre-provider. Post-provider throws leave that
853
- // marker behind and terminal recovery persists them fail-closed.
854
- if (record.attemptId) persistUnacceptedBenchmarkAttempt({ runRoot, manifest, record });
855
- appendPrivateJsonl(infrastructureLedgerPath, { ...record, accepted: false, retryAvailable });
856
- if (sessionEvidence) {
857
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
858
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
859
- }
860
- if (!retryAvailable) {
861
- if (attemptError) fatalRunError = new Error(record.infrastructureFailure ?? "benchmark runner infrastructure error");
862
- break;
863
- }
864
- process.stdout.write(` RETRY ${infrastructureAttempt}/${options.infrastructureRetries} (${record.infrastructureFailure ?? record.failure})\n`);
865
- if (options.retryDelaySeconds > 0) {
866
- await new Promise((resolve) => setTimeout(resolve, options.retryDelaySeconds * 1_000));
867
- }
868
- }
869
- if (interruptedSignal) break;
870
- if (fatalRunError) break;
871
- if (record.abortSuite) {
872
- if (!fatalRunError) fatalRunError = new Error(record.infrastructureFailure ?? record.failure ?? "agent startup failure");
873
- break;
874
- }
875
- const retainWorkspace = options.keepWorkspaces || !record.resolved || sessionEvidence?.workflowFailed;
876
- if (retainWorkspace && sessionEvidence) {
877
- retainWorkspaceForensics({ runRoot, workspaceRoot: sessionEvidence.workspaceRoot, key: sessionEvidence.key, record });
878
- }
879
- runs.push(record);
880
- newRuns += 1;
881
- const pendingRecordPath = path.join(runRoot, "pending-record.json");
882
- ledgerBinding = appendBenchmarkLedger(ledgerPath, record, ledgerBinding);
883
- manifest.ledger = ledgerBinding;
884
- clearRecoveredBenchmarkAttempts(manifest, record);
885
- writeBenchmarkRunManifest(runRoot, manifest);
886
- fs.rmSync(pendingRecordPath, { force: true });
887
- if (sessionEvidence) {
888
- fs.rmSync(sessionEvidence.inflightPath, { force: true });
889
- if (!retainWorkspace) fs.rmSync(sessionEvidence.workspaceRoot, { recursive: true, force: true });
890
- }
891
- const cost = Number.isFinite(record.usage.cost) ? `$${Number(record.usage.cost).toFixed(6)}` : "cost n/a";
892
- const completedAfter = runs.filter(completedBenchmarkRecord).length;
893
- const remainingAfter = Math.max(0, fullOrder.length - completedAfter);
894
- const averageAfterMs = (Date.now() - wallStartedAt) / Math.max(1, newRuns);
895
- 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`);
896
- terminalStop = pairedOutcomeFloorStop({ enabled: options.stopAfterFailedPair, suite, runs, current: item, next: order[index + 1] });
897
- if (terminalStop) break;
898
- if (fatalRunError) break;
899
- }
900
- if (!pauseReason && options.maxSessions !== undefined && pendingOrder.length > order.length) {
901
- pauseReason = `max-sessions:${options.maxSessions}`;
902
- }
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
+ });
903
733
  } finally {
734
+ ({ fatalRunError, pauseReason, preservePiRuntime, fatalExecutionReceipt, ledgerBinding, terminalStop } = scheduleState);
904
735
  removeSignalHandlers();
905
736
  }
906
737
  try {
907
738
  const finalLedger = inspectBenchmarkLedger(ledgerPath);
908
739
  assertBenchmarkLedgerBinding(ledgerBinding, finalLedger.binding, "benchmark terminal ledger");
909
- 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));
910
741
  } catch (error) {
911
742
  fatalRunError ??= error;
912
743
  }
744
+ if (productionCampaign) { manifest.campaignEvidence = productionCampaign.snapshot(); writeBenchmarkRunManifest(runRoot, manifest); }
913
745
  let finalizationReceipt;
914
746
  if (!interruptedSignal && !fatalRunError) {
747
+ if (providerFreeEvidenceRequired) {
748
+ fatalRunError ??= productionProviderFreeEvidenceError(manifest.providerFreeEvidence, providerFreeEvidenceBinding, "final production provider-free evidence");
749
+ }
915
750
  finalizationReceipt = executionGuard.receipt("finalization", [piRuntimeHome]);
916
- fatalRunError = finalizationReceipt.error;
751
+ fatalRunError ??= finalizationReceipt.error;
917
752
  }
918
753
  finalizeBenchmarkRun({
919
754
  assuranceEvidence, bootstrapMetadata, candidateGuard, canonicalProductionSuite,
@@ -924,16 +759,18 @@ async function main() {
924
759
  lifecycles, manifest, options, packageVersion: packageManifest.version,
925
760
  pauseReason, piRuntimeHome, preservePiRuntime,
926
761
  productionAllStageBoundaries, productionHostReadinessPolicy, productionSpendControlled, rootSeed, rootSeedDigest,
762
+ productionCampaign,
927
763
  runId, runRoot, runs, runtime, runtimeCommands, source, startedAt, suite,
928
764
  suiteDigest, suiteIdentity, terminalStop
929
765
  });
930
- } finally {
766
+ } catch (error) { productionAbortFallback(error); writeProductionResumeAbortIfNeeded(resumeState, error); throw error; } finally {
767
+ budgetRuntime?.close();
931
768
  releaseRunLock?.();
769
+ productionCampaign?.close();
932
770
  codexRuntime?.cleanup();
933
771
  if (!preservePiRuntime) cleanupBenchmarkPiRuntimeHome(bootstrapMetadata?.piAgentHome, piRuntimeHome);
934
772
  }
935
773
  }
936
-
937
774
  if (invokedAsEntrypoint(import.meta.url, process.argv[1])) {
938
775
  main().catch((error) => {
939
776
  console.error(`FAIL: ${error.message}`);