@piagent/platform 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/operator-manual-vietnamese.md +12 -12
  175. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  176. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  177. package/docs/piagent-core-improvement-plan.md +528 -0
  178. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  179. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  180. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  181. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  182. package/docs/piagent-open-session-wait.md +19 -0
  183. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  184. package/docs/publishing-for-teams.md +2 -0
  185. package/docs/quality-benchmark.md +128 -8
  186. package/docs/quickstart-vietnamese.md +2 -2
  187. package/docs/release-install-policy.md +32 -9
  188. package/docs/research/harness-next-evidence-review.md +113 -0
  189. package/docs/team-onboarding.md +7 -7
  190. package/docs/third-party-neutrality.md +7 -0
  191. package/docs/usage-observability.md +1 -1
  192. package/docs-site/architecture.html +1 -1
  193. package/docs-site/benchmark.html +1 -1
  194. package/docs-site/commands.html +1 -1
  195. package/docs-site/content/en/runtime.html +1 -1
  196. package/docs-site/content/en/whats-new.html +11 -0
  197. package/docs-site/content/runtime.html +2 -2
  198. package/docs-site/content/whats-new.html +11 -0
  199. package/docs-site/context-engine.html +1 -1
  200. package/docs-site/en/architecture.html +1 -1
  201. package/docs-site/en/benchmark.html +1 -1
  202. package/docs-site/en/commands.html +1 -1
  203. package/docs-site/en/context-engine.html +1 -1
  204. package/docs-site/en/index.html +1 -1
  205. package/docs-site/en/mcp-approval.html +1 -1
  206. package/docs-site/en/mcp-auth.html +1 -1
  207. package/docs-site/en/mcp-servers.html +1 -1
  208. package/docs-site/en/mcp.html +1 -1
  209. package/docs-site/en/permissions.html +1 -1
  210. package/docs-site/en/profiles.html +1 -1
  211. package/docs-site/en/quickstart.html +1 -1
  212. package/docs-site/en/runtime.html +2 -2
  213. package/docs-site/en/scope.html +1 -1
  214. package/docs-site/en/security.html +1 -1
  215. package/docs-site/en/team.html +1 -1
  216. package/docs-site/en/whats-new.html +12 -1
  217. package/docs-site/en/workflows.html +1 -1
  218. package/docs-site/index.html +1 -1
  219. package/docs-site/mcp-approval.html +1 -1
  220. package/docs-site/mcp-auth.html +1 -1
  221. package/docs-site/mcp-servers.html +1 -1
  222. package/docs-site/mcp.html +1 -1
  223. package/docs-site/permissions.html +1 -1
  224. package/docs-site/profiles.html +1 -1
  225. package/docs-site/quickstart.html +1 -1
  226. package/docs-site/runtime.html +3 -3
  227. package/docs-site/scope.html +1 -1
  228. package/docs-site/security.html +1 -1
  229. package/docs-site/team.html +1 -1
  230. package/docs-site/whats-new.html +12 -1
  231. package/docs-site/workflows.html +1 -1
  232. package/evals/architecture-conformance-v1/lane.json +18 -0
  233. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  234. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  235. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  236. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  238. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  240. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  241. package/evals/fixtures/composite-criterion.valid.json +33 -0
  242. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  243. package/evals/fixtures/contract-family-library.valid.json +41 -0
  244. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  245. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  246. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  247. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  248. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  252. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  254. package/evals/fs5-artifact-archive/README.md +32 -0
  255. package/evals/fs5-artifact-archive/manifest.json +148 -0
  256. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  257. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  258. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  259. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  260. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  261. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  262. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  263. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  264. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  265. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  266. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  267. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  268. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  269. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  270. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  271. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  272. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  273. package/evals/fs5-causal-arm.v1.json +9 -5
  274. package/evals/fs5-pilot-protocol.v1.json +1 -1
  275. package/evals/fs5-pilot-protocol.v4.json +4 -4
  276. package/evals/fs5-pilot-protocol.v5.json +6 -5
  277. package/evals/harness-next/development-corpus.mjs +106 -0
  278. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  279. package/evals/harness-next/run-calibration.mjs +83 -0
  280. package/evals/harness-next/run-resource-probe.mjs +55 -0
  281. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  282. package/evals/harness-next.v1.json +51 -0
  283. package/evals/long-horizon-v1/README.md +19 -0
  284. package/evals/long-horizon-v1/runner.mjs +116 -48
  285. package/evals/long-horizon-v1/worker.mjs +77 -30
  286. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  287. package/evals/private-holdout-v1/README.md +5 -2
  288. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  289. package/package.json +9 -4
  290. package/packages/piagent-core/README.md +2 -2
  291. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  292. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  293. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  294. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  295. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  296. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  297. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  298. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  299. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  300. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  301. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  303. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  304. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  305. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  306. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  307. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  309. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  310. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  311. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  312. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  313. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  314. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  315. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  317. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  318. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  319. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  320. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  321. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  322. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  323. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  325. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  326. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  328. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  329. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  330. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  331. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  332. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  334. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  335. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  336. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  337. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  338. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  339. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  340. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  341. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  342. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  343. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  344. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  345. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  346. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  347. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  348. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  349. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  350. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  351. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  352. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  354. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  355. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  356. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  357. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  358. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  359. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  360. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  363. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  364. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  365. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  366. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  368. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  369. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  370. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  371. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  372. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  373. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  393. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  394. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  395. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  396. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  397. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  398. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  400. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  401. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  402. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  405. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  406. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  407. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  408. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  409. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  410. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  411. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  412. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  413. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  414. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  415. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  416. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  417. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  418. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  419. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  421. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  422. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  423. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  424. package/packages/piagent-core/extensions/context-engine.js +11 -6
  425. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  426. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  427. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  428. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  429. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  430. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  431. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  432. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  433. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  434. package/packages/piagent-core/extensions/task-journal.js +48 -3
  435. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  436. package/packages/piagent-core/extensions/task-state.js +74 -38
  437. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  438. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  439. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  440. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  441. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  442. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  443. package/packages/piagent-core/package.json +3 -3
  444. package/packages/piagent-core/policies/base-policy.json +1 -0
  445. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  446. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  447. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  448. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  449. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  450. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  451. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  452. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  453. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  454. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  455. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  457. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  458. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  461. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  462. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  463. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  464. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  465. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  466. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  467. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  468. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  469. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  470. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  471. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  472. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  473. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  474. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  475. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  476. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  477. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  478. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  479. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  480. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  481. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  482. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  483. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  484. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  485. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  486. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  487. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  488. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  489. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  490. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  491. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  492. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  493. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  494. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  495. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  496. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  497. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  498. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  499. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  500. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  501. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  502. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  503. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  504. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  505. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  506. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  507. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  508. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  509. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  510. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  511. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  512. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  513. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  514. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  515. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  516. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  517. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  518. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  519. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  520. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  521. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  522. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  523. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  524. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  525. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  526. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  527. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  528. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  529. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  530. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  531. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  532. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
  533. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  534. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  535. package/packages/piagent-webui/dist/client/index.html +2 -2
  536. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  537. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  538. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  539. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  540. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  541. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  542. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  543. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  544. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  545. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  546. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  547. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  548. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  549. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  550. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  551. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  552. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  553. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  554. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  555. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  556. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  557. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  558. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  559. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  560. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  561. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  562. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  563. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  564. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  565. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  566. package/schemas/approved-host-contracts.schema.json +973 -0
  567. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  568. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  569. package/schemas/composite-criterion.schema.json +788 -0
  570. package/schemas/contract-family-library.schema.json +28 -0
  571. package/schemas/contract-selection-recipe.schema.json +31 -0
  572. package/schemas/failure-evidence.schema.json +2 -2
  573. package/schemas/helper-request.schema.json +16 -4
  574. package/schemas/host-contract-plan.schema.json +25 -0
  575. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  576. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  577. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  578. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  579. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  580. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  581. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  582. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  583. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  584. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  585. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  586. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  587. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  588. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  589. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  590. package/schemas/task-contract.schema.json +30 -0
  591. package/scripts/approve-independent-verification.mjs +57 -0
  592. package/scripts/benchmark-arm-observer.mjs +320 -0
  593. package/scripts/benchmark-budget-ipc.mjs +34 -0
  594. package/scripts/benchmark-budget-launcher.mjs +91 -0
  595. package/scripts/benchmark-budget-processes.mjs +133 -0
  596. package/scripts/benchmark-budget-publication.mjs +228 -0
  597. package/scripts/benchmark-budget-runtime.mjs +136 -0
  598. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  599. package/scripts/benchmark-codex-journey.mjs +406 -0
  600. package/scripts/benchmark-independent-verification.mjs +628 -0
  601. package/scripts/benchmark-journey-outcome.mjs +92 -0
  602. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  603. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  604. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  605. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  606. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  607. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  608. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  609. package/scripts/benchmark-runner-completion.mjs +133 -0
  610. package/scripts/benchmark-runner-configuration.mjs +159 -0
  611. package/scripts/benchmark-runner-core.mjs +217 -388
  612. package/scripts/benchmark-runner-finalization.mjs +140 -27
  613. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  614. package/scripts/benchmark-runner-schedule.mjs +256 -0
  615. package/scripts/benchmark-runner-support.mjs +136 -4
  616. package/scripts/benchmark-runner.mjs +95 -18
  617. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  618. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  619. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  620. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  621. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  622. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  623. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  624. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  625. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  626. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  627. package/scripts/benchmark-session-evaluator.mjs +169 -0
  628. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  629. package/scripts/benchmark-session-usage.mjs +28 -0
  630. package/scripts/benchmark-session.mjs +343 -50
  631. package/scripts/benchmark-webui-journey.mjs +678 -0
  632. package/scripts/check-public-wording.mjs +46 -0
  633. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  634. package/scripts/phase-tools-evaluation.mjs +1 -0
  635. package/scripts/pi-auto.sh +7 -1
  636. package/scripts/pi-usage-history.mjs +201 -11
  637. package/scripts/piagent-cli.mjs +8 -0
  638. package/scripts/private-holdout-readiness.mjs +7 -1
  639. package/scripts/public-evaluation-exposure.mjs +140 -0
  640. package/scripts/select-independent-verification.mjs +62 -0
  641. package/scripts/typescript-loader.mjs +135 -1
  642. package/scripts/update-global.mjs +6 -7
  643. package/scripts/verify-local.sh +36 -55
  644. package/scripts/verify-release-identity.mjs +5 -3
  645. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -1,7 +1,14 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { StringDecoder } from "node:string_decoder";
3
+ import { createCodexEventState, consumeCodexLifecycleEvent, finishCodexLifecycle } from "./benchmark-codex-events.js";
2
4
 
3
- const CODEX_NON_TOOL_ITEMS = new Set(["agent_message", "reasoning", "plan", "user_message"]);
5
+ const CODEX_NON_TOOL_ITEMS = new Set(["agent_message", "reasoning", "plan", "user_message", "error"]);
4
6
  const TOKEN_FIELDS = Object.freeze(["input", "output", "cacheRead", "cacheWrite", "reasoning", "fresh", "total"]);
7
+ const EXECUTION_COUNTER_FIELDS = Object.freeze([
8
+ "providerStartedAttempts", "toolCalls", "toolResults", "toolFailures", "blockedToolCalls",
9
+ "declinedToolCalls", "explicitRetries", "retryFailures", "compactions", "abortedCompactions",
10
+ "summarizationRetries", "repeatedToolCalls", "subagentAttempts", "subagentFailures"
11
+ ]);
5
12
 
6
13
  export const BENCHMARK_TOKEN_DEFINITIONS = Object.freeze({
7
14
  unit: "provider-reported-tokens",
@@ -18,6 +25,40 @@ function plainObject(value) {
18
25
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19
26
  }
20
27
 
28
+ function emptyExecutionAggregate(source) {
29
+ return {
30
+ schemaVersion: 1,
31
+ source,
32
+ completeness: { tools: "unavailable", retries: "unavailable", compactions: "unavailable", subagents: "unavailable" },
33
+ ...Object.fromEntries(EXECUTION_COUNTER_FIELDS.map((field) => [field, 0]))
34
+ };
35
+ }
36
+
37
+ function stableValue(value) {
38
+ if (Array.isArray(value)) return value.map(stableValue);
39
+ if (!plainObject(value)) return value;
40
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, stableValue(value[key])]));
41
+ }
42
+
43
+ function codexToolFingerprint(item) {
44
+ const identity = item.type === "command_execution" ? item.command
45
+ : item.type === "mcp_tool_call" ? [item.server, item.tool, stableValue(item.arguments)]
46
+ : item.type === "collab_tool_call" ? [item.tool, item.prompt]
47
+ : item.type === "web_search" ? stableValue(item.action ?? item.query)
48
+ : item.type;
49
+ try { return JSON.stringify([item.type, identity]); }
50
+ catch { return item.type; }
51
+ }
52
+
53
+ function executionCompleteness(sessions, field) {
54
+ const rank = { exact: 0, partial: 1, unverified: 2, unavailable: 3 };
55
+ if (sessions.length === 0) return "unavailable";
56
+ return sessions.reduce((worst, session) => {
57
+ const value = session.execution?.completeness?.[field] ?? "unavailable";
58
+ return rank[value] > rank[worst] ? value : worst;
59
+ }, "exact");
60
+ }
61
+
21
62
  export function exactBenchmarkMeasuredUsage(usage) {
22
63
  return usage?.usageCompleteness === "exact"
23
64
  && Number.isSafeInteger(usage?.sessions) && usage.sessions > 0
@@ -36,7 +77,7 @@ function knownPreProviderZero(usage, status) {
36
77
  }
37
78
 
38
79
  export function exactBenchmarkAttemptUsage(usage, status) {
39
- return status !== "unknown-after-provider-start"
80
+ return !["unknown-after-provider-start", "measured-lower-bound"].includes(status)
40
81
  && (exactBenchmarkMeasuredUsage(usage) || knownPreProviderZero(usage, status));
41
82
  }
42
83
 
@@ -74,30 +115,64 @@ export function benchmarkTokenAccounting(runs) {
74
115
  status: attempt.usageStatus ?? "unknown-after-provider-start",
75
116
  usage: attempt.usage
76
117
  })));
118
+ const infrastructureFailureLedgerIssues = benchmarkInfrastructureFailureLedgerIssues(runs);
119
+ const allAttempts = tokenBucket([...accepted, ...failed]);
120
+ allAttempts.ledgerExact = infrastructureFailureLedgerIssues.length === 0;
121
+ allAttempts.ledgerIssues = infrastructureFailureLedgerIssues;
122
+ allAttempts.complete = allAttempts.complete && allAttempts.ledgerExact;
77
123
  return {
78
124
  schemaVersion: 1,
79
125
  definitions: BENCHMARK_TOKEN_DEFINITIONS,
80
126
  acceptedAttempts: tokenBucket(accepted),
81
127
  failedAttempts: tokenBucket(failed),
82
- allAttempts: tokenBucket([...accepted, ...failed])
128
+ allAttempts
83
129
  };
84
130
  }
85
131
 
86
132
  export function benchmarkInfrastructureFailureLedgerIssues(runs) {
87
133
  return runs.flatMap((run) => {
88
134
  const issues = [];
89
- if (!Number.isInteger(run.infrastructureRetries) || run.infrastructureRetries < 0) {
135
+ const addIssue = (issue) => {
136
+ if (!issues.includes(issue)) issues.push(issue);
137
+ };
138
+ const retriesExact = Number.isSafeInteger(run.infrastructureRetries) && run.infrastructureRetries >= 0;
139
+ const attemptsExact = Number.isSafeInteger(run.infrastructureAttempts) && run.infrastructureAttempts >= 1;
140
+ if (!retriesExact) {
90
141
  issues.push("invalid-infrastructure-retry-count");
91
142
  }
92
143
  if (!Array.isArray(run.infrastructureFailures)) {
93
144
  issues.push("missing-infrastructure-failure-ledger");
94
- } else if (Number.isInteger(run.infrastructureRetries) && run.infrastructureFailures.length !== run.infrastructureRetries) {
95
- issues.push("retry-ledger-count-mismatch");
145
+ } else {
146
+ if (retriesExact && run.infrastructureFailures.length !== run.infrastructureRetries) {
147
+ issues.push("retry-ledger-count-mismatch");
148
+ }
149
+ const seenAttempts = new Set();
150
+ for (const [index, failure] of run.infrastructureFailures.entries()) {
151
+ const attempt = failure?.attempt;
152
+ if (!Number.isSafeInteger(attempt) || attempt < 1) {
153
+ addIssue("invalid-infrastructure-failure-attempt");
154
+ continue;
155
+ }
156
+ if (seenAttempts.has(attempt)) addIssue("duplicate-infrastructure-failure-attempt");
157
+ seenAttempts.add(attempt);
158
+ if (retriesExact && attempt > run.infrastructureRetries) {
159
+ addIssue("out-of-range-infrastructure-failure-attempt");
160
+ continue;
161
+ }
162
+ if (retriesExact && attempt !== index + 1) {
163
+ addIssue("infrastructure-failure-attempt-order-mismatch");
164
+ }
165
+ }
96
166
  }
97
- if (!Number.isInteger(run.infrastructureAttempts)
98
- || run.infrastructureAttempts !== (Number.isInteger(run.infrastructureRetries) ? run.infrastructureRetries + 1 : -1)) {
167
+ if (!attemptsExact
168
+ || run.infrastructureAttempts !== (retriesExact ? run.infrastructureRetries + 1 : -1)) {
99
169
  issues.push("attempt-ledger-count-mismatch");
100
170
  }
171
+ if (!Number.isSafeInteger(run.infrastructureAttempt) || run.infrastructureAttempt < 1) {
172
+ issues.push("invalid-accepted-infrastructure-attempt");
173
+ } else if (!attemptsExact || run.infrastructureAttempt !== run.infrastructureAttempts) {
174
+ issues.push("accepted-infrastructure-attempt-mismatch");
175
+ }
101
176
  return issues.length > 0 ? [{
102
177
  scenarioId: run.scenarioId ?? null,
103
178
  surface: run.surface ?? null,
@@ -116,6 +191,8 @@ export function aggregateSessionUsage(sessions) {
116
191
  let toolCalls = 0;
117
192
  let messages = 0;
118
193
  const contextSnapshots = [];
194
+ const execution = emptyExecutionAggregate("pi-session-jsonl");
195
+ const pricingRequests = [];
119
196
  for (const session of sessions) {
120
197
  for (const key of Object.keys(totals)) totals[key] += Number(session.tokens?.[key] ?? 0);
121
198
  if (session.isSubagent) {
@@ -136,6 +213,11 @@ export function aggregateSessionUsage(sessions) {
136
213
  for (const [name, count] of Object.entries(session.toolNames ?? {})) {
137
214
  toolNames[name] = (toolNames[name] ?? 0) + Number(count ?? 0);
138
215
  }
216
+ for (const field of EXECUTION_COUNTER_FIELDS) execution[field] += Number(session.execution?.[field] ?? 0);
217
+ if (Array.isArray(session.pricingBuckets?.requests)) pricingRequests.push(...session.pricingBuckets.requests);
218
+ }
219
+ for (const field of ["tools", "retries", "compactions", "subagents"]) {
220
+ execution.completeness[field] = executionCompleteness(sessions, field);
139
221
  }
140
222
  return {
141
223
  ...totals,
@@ -153,6 +235,20 @@ export function aggregateSessionUsage(sessions) {
153
235
  thinkingLevel: thinkingLevels.size === 1 ? [...thinkingLevels][0] : thinkingLevels.size === 0 ? "unknown" : "mixed",
154
236
  usageSource: sessions.length > 0 ? "pi-session-jsonl" : "unavailable",
155
237
  usageCompleteness: sessions.length > 0 && sessions.every((session) => session.usageIntegrity?.exact === true) ? "exact" : "unverified",
238
+ // Reasoning is a non-additive subset of output and is optional in Pi's
239
+ // upstream usage record. Keep the fresh/total accounting exact while
240
+ // making an omitted non-zero reasoning split visibly lower-bound.
241
+ reasoningCompleteness: sessions.some((session) => session.usageIntegrity?.reasoningCompleteness === "lower-bound")
242
+ ? "lower-bound"
243
+ : sessions.length > 0 ? "exact" : "unavailable",
244
+ pricingBuckets: {
245
+ schemaVersion: 1,
246
+ source: "provider-request-usage",
247
+ completeness: sessions.length > 0 && sessions.every((session) => session.pricingBuckets?.completeness === "exact")
248
+ ? "exact" : "unverified",
249
+ requests: pricingRequests
250
+ },
251
+ execution,
156
252
  contextUsage: contextSnapshots.length > 0 ? {
157
253
  source: "session-reported",
158
254
  observations: contextSnapshots.length,
@@ -182,11 +278,161 @@ function requiredCodexToken(value, field) {
182
278
  return value;
183
279
  }
184
280
 
281
+ /** Aggregate every provider-reported Codex turn, preserving exact token categories. */
282
+ function aggregateCodexProviderTurnTokens(turnUsages) {
283
+ if (!Array.isArray(turnUsages) || turnUsages.length === 0) {
284
+ throw new Error("Codex JSONL is missing turn.completed usage");
285
+ }
286
+ const totals = { providerInput: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, total: 0, fresh: 0 };
287
+ for (const [index, usage] of turnUsages.entries()) {
288
+ if (!plainObject(usage)) throw new Error(`Codex JSONL turn.completed usage ${index + 1} is not an object`);
289
+ const providerInput = requiredCodexToken(usage.input_tokens, "input_tokens");
290
+ const cacheRead = requiredCodexToken(usage.cached_input_tokens ?? 0, "cached_input_tokens");
291
+ const cacheWrite = requiredCodexToken(usage.cache_write_input_tokens ?? 0, "cache_write_input_tokens");
292
+ const output = requiredCodexToken(usage.output_tokens, "output_tokens");
293
+ const reasoning = requiredCodexToken(usage.reasoning_output_tokens ?? 0, "reasoning_output_tokens");
294
+ if (cacheRead + cacheWrite > providerInput) throw new Error("Codex JSONL cached and cache-write input tokens exceed input_tokens");
295
+ if (reasoning > output) throw new Error("Codex JSONL reasoning_output_tokens exceeds output_tokens");
296
+ const input = providerInput - cacheRead - cacheWrite;
297
+ totals.providerInput += providerInput;
298
+ totals.input += input;
299
+ totals.output += output;
300
+ totals.cacheRead += cacheRead;
301
+ totals.cacheWrite += cacheWrite;
302
+ totals.reasoning += reasoning;
303
+ totals.total += providerInput + output;
304
+ totals.fresh += input + output;
305
+ }
306
+ return totals;
307
+ }
308
+
309
+ /**
310
+ * Combine exact usage captured from multiple invocations of one resumed Codex
311
+ * thread. Identity mismatches and incomplete turns fail closed instead of being
312
+ * silently presented as one comparable session.
313
+ */
314
+ export function aggregateCodexTurnUsage(turnUsages) {
315
+ if (!Array.isArray(turnUsages) || turnUsages.length === 0) {
316
+ throw new Error("Codex turn usage must contain at least one turn");
317
+ }
318
+ for (const [index, usage] of turnUsages.entries()) {
319
+ if (!exactBenchmarkMeasuredUsage(usage)) throw new Error(`Codex turn usage ${index + 1} is incomplete`);
320
+ for (const field of ["providerSessionId", "model", "thinkingLevel"]) {
321
+ if (typeof usage[field] !== "string" || !usage[field]) throw new Error(`Codex turn usage ${index + 1} is missing ${field}`);
322
+ }
323
+ }
324
+ const first = turnUsages[0];
325
+ for (const [index, usage] of turnUsages.slice(1).entries()) {
326
+ for (const field of ["providerSessionId", "model", "thinkingLevel"]) {
327
+ if (usage[field] !== first[field]) throw new Error(`Codex turn usage ${index + 2} has mismatched ${field}`);
328
+ }
329
+ }
330
+
331
+ const totals = Object.fromEntries(TOKEN_FIELDS.map((field) => [field, 0]));
332
+ const subagentTokens = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, fresh: 0, total: 0 };
333
+ const toolNames = {};
334
+ const execution = emptyExecutionAggregate("codex-resumed-thread-aggregate");
335
+ const pricingRequests = [];
336
+ let messages = 0;
337
+ let cost = 0;
338
+ let exactCost = true;
339
+ for (const usage of turnUsages) {
340
+ for (const field of TOKEN_FIELDS) totals[field] += usage[field];
341
+ for (const field of Object.keys(subagentTokens)) subagentTokens[field] += Number(usage.subagentTokens?.[field] ?? 0);
342
+ for (const [name, count] of Object.entries(usage.toolNames ?? {})) toolNames[name] = (toolNames[name] ?? 0) + Number(count ?? 0);
343
+ for (const field of EXECUTION_COUNTER_FIELDS) execution[field] += Number(usage.execution?.[field] ?? 0);
344
+ if (Array.isArray(usage.pricingBuckets?.requests)) pricingRequests.push(...usage.pricingBuckets.requests);
345
+ messages += Number(usage.messages ?? 0);
346
+ if (Number.isFinite(usage.cost)) cost += usage.cost;
347
+ else exactCost = false;
348
+ }
349
+ for (const field of ["tools", "retries", "compactions", "subagents"]) {
350
+ execution.completeness[field] = executionCompleteness(turnUsages, field);
351
+ }
352
+ const pricingExact = turnUsages.every((usage) => usage.pricingBuckets?.completeness === "exact");
353
+ const serviceTierEvidence = turnUsages.map((usage) => usage.serviceTierEvidence).filter(Boolean);
354
+ const codexEventOutcomes = turnUsages.map((usage) => usage.codexEventOutcome).filter(Boolean);
355
+ const codexEventFailure = codexEventOutcomes.find(outcome => outcome.failureClass);
356
+ const aggregateTierValues = (field) => [...new Set(serviceTierEvidence.flatMap((evidence) => (
357
+ Array.isArray(evidence?.[field]) ? evidence[field] : []
358
+ )))].sort();
359
+ return {
360
+ ...totals,
361
+ providerInput: totals.input + totals.cacheRead + totals.cacheWrite,
362
+ cost: exactCost ? cost : null,
363
+ costSource: exactCost ? "summed-provider-reported" : "unavailable",
364
+ usageSource: "codex-resumed-thread-aggregate",
365
+ usageCompleteness: "exact",
366
+ sessions: 1,
367
+ turns: turnUsages.length,
368
+ subagentSessions: turnUsages.reduce((sum, usage) => sum + Number(usage.subagentSessions ?? 0), 0),
369
+ subagentTokens,
370
+ toolCalls: Object.values(toolNames).reduce((sum, count) => sum + count, 0),
371
+ toolNames: Object.fromEntries(Object.entries(toolNames).sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))),
372
+ messages,
373
+ model: first.model,
374
+ thinkingLevel: first.thinkingLevel,
375
+ serviceTierEvidence: {
376
+ schemaVersion: 1,
377
+ source: "codex-resumed-thread-settings-aggregate",
378
+ events: serviceTierEvidence.reduce((sum, evidence) => sum + Number(evidence.events ?? 0), 0),
379
+ requestedTiers: aggregateTierValues("requestedTiers"),
380
+ observedRequestTiers: aggregateTierValues("observedRequestTiers"),
381
+ providerResponseTiers: aggregateTierValues("providerResponseTiers"),
382
+ responseEvidence: aggregateTierValues("responseEvidence"),
383
+ defaultFallbackEvents: serviceTierEvidence.reduce((sum, evidence) => sum + Number(evidence.defaultFallbackEvents ?? 0), 0)
384
+ },
385
+ pricingBuckets: {
386
+ schemaVersion: 1,
387
+ source: pricingExact ? "provider-request-usage" : "codex-turn-aggregate-usage",
388
+ completeness: pricingExact ? "exact" : "unverified",
389
+ requests: pricingRequests
390
+ },
391
+ execution,
392
+ contextUsage: {
393
+ source: "unavailable",
394
+ observations: 0,
395
+ peakTokens: null,
396
+ contextWindow: null,
397
+ peakPercent: null
398
+ },
399
+ providerSessionId: first.providerSessionId,
400
+ codexEventOutcome: codexEventOutcomes.length === turnUsages.length ? {
401
+ schemaVersion: 1,
402
+ source: "codex-resumed-thread-authoritative-state-machine",
403
+ terminalStatus: codexEventFailure ? "failed" : "completed",
404
+ runValidity: codexEventOutcomes.every(outcome => outcome.runValidity === "valid") ? "valid" : "invalid_harness",
405
+ failureClass: codexEventFailure?.failureClass ?? null,
406
+ reasonCodes: codexEventFailure?.reasonCodes ?? [],
407
+ terminalAgentMessage: codexEventOutcomes.every(outcome => outcome.terminalAgentMessage === true),
408
+ countsTowardQuality: codexEventOutcomes.every(outcome => outcome.countsTowardQuality === true),
409
+ countsTowardUsage: true,
410
+ usageStatus: "exact"
411
+ } : null,
412
+ codexEventSummaries: turnUsages.map((usage) => usage.codexEventSummary).filter(Boolean),
413
+ codexInvocationReceipts: turnUsages.map((usage) => usage.codexInvocationReceipt).filter(Boolean)
414
+ };
415
+ }
416
+
185
417
  function consumeCodexEvent(state, event, lineNumber) {
186
418
  if (!plainObject(event) || typeof event.type !== "string") {
187
419
  throw new Error(`Codex JSONL line ${lineNumber} is not an event object`);
188
420
  }
421
+ consumeCodexLifecycleEvent(state.eventState, event);
189
422
  state.onEvent?.(event);
423
+ const threadSettings = event.type === "thread_settings_applied" && plainObject(event.thread_settings)
424
+ ? event.thread_settings
425
+ : event.type === "event_msg"
426
+ && event.payload?.type === "thread_settings_applied"
427
+ && plainObject(event.payload.thread_settings)
428
+ ? event.payload.thread_settings
429
+ : null;
430
+ if (threadSettings) {
431
+ const tier = typeof threadSettings.service_tier === "string"
432
+ ? threadSettings.service_tier.trim().toLowerCase()
433
+ : "";
434
+ if (["default", "fast", "priority"].includes(tier)) state.serviceTiers.push(tier);
435
+ }
190
436
  if (event.type === "error" || event.type === "turn.failed") {
191
437
  const nested = plainObject(event.error) ? event.error : {};
192
438
  const message = [event.message, nested.message, nested.additional_details]
@@ -195,7 +441,12 @@ function consumeCodexEvent(state, event, lineNumber) {
195
441
  return;
196
442
  }
197
443
  if (event.type === "thread.started" && typeof event.thread_id === "string" && event.thread_id) {
198
- state.threadId = event.thread_id;
444
+ state.threadIds.push(event.thread_id);
445
+ state.threadId ??= event.thread_id;
446
+ return;
447
+ }
448
+ if (event.type === "turn.started") {
449
+ state.startedTurns += 1;
199
450
  return;
200
451
  }
201
452
  if (event.type === "item.completed" && plainObject(event.item)) {
@@ -203,43 +454,87 @@ function consumeCodexEvent(state, event, lineNumber) {
203
454
  if (type === "agent_message") state.messages += 1;
204
455
  else if (typeof type === "string" && type && !CODEX_NON_TOOL_ITEMS.has(type)) {
205
456
  state.toolNames[type] = (state.toolNames[type] ?? 0) + 1;
457
+ state.execution.toolCalls += 1;
458
+ state.execution.toolResults += 1;
459
+ const status = typeof event.item.status === "string" ? event.item.status.toLowerCase() : "";
460
+ const failed = status === "failed" || type === "command_execution" && Number.isInteger(event.item.exit_code) && event.item.exit_code !== 0;
461
+ if (failed) state.execution.toolFailures += 1;
462
+ if (status === "blocked") state.execution.blockedToolCalls += 1;
463
+ if (status === "declined") state.execution.declinedToolCalls += 1;
464
+ const fingerprint = codexToolFingerprint(event.item);
465
+ if (state.toolFingerprints.has(fingerprint)) state.execution.repeatedToolCalls += 1;
466
+ else state.toolFingerprints.add(fingerprint);
467
+ if (type === "collab_tool_call" && event.item.tool === "spawn_agent") {
468
+ state.execution.subagentAttempts += 1;
469
+ if (failed) state.execution.subagentFailures += 1;
470
+ }
206
471
  }
207
472
  return;
208
473
  }
209
474
  if (event.type === "turn.completed") {
210
475
  state.completedTurns += 1;
211
- if (state.completedTurns > 1) throw new Error("Codex JSONL contains more than one completed root turn");
212
476
  if (!plainObject(event.usage)) throw new Error("Codex JSONL turn.completed is missing usage");
213
- state.completedUsage = event.usage;
477
+ state.completedUsages.push(event.usage);
478
+ state.execution.providerStartedAttempts += 1;
214
479
  }
215
480
  }
216
481
 
217
- function finishCodexUsage(state) {
218
- if (!state.threadId) throw new Error("Codex JSONL is missing thread.started");
219
- if (!state.completedUsage) throw new Error("Codex JSONL is missing turn.completed usage");
220
- const providerInput = requiredCodexToken(state.completedUsage.input_tokens, "input_tokens");
221
- const cacheRead = requiredCodexToken(state.completedUsage.cached_input_tokens ?? 0, "cached_input_tokens");
222
- const cacheWrite = requiredCodexToken(state.completedUsage.cache_write_input_tokens ?? 0, "cache_write_input_tokens");
223
- const output = requiredCodexToken(state.completedUsage.output_tokens, "output_tokens");
224
- const reasoning = requiredCodexToken(state.completedUsage.reasoning_output_tokens ?? 0, "reasoning_output_tokens");
225
- if (cacheRead + cacheWrite > providerInput) throw new Error("Codex JSONL cached and cache-write input tokens exceed input_tokens");
226
- if (reasoning > output) throw new Error("Codex JSONL reasoning_output_tokens exceeds output_tokens");
227
- const input = providerInput - cacheRead - cacheWrite;
482
+ function codexContractError(message, lifecycle, usage) {
483
+ const error = new Error(message);
484
+ error.code = "BENCHMARK_CODEX_EVENT_CONTRACT_INVALID";
485
+ error.failureClass = lifecycle.outcome.failureClass;
486
+ error.codexEventSummary = lifecycle.summary;
487
+ error.codexEventOutcome = lifecycle.outcome;
488
+ if (usage) error.usage = usage;
489
+ return error;
490
+ }
491
+
492
+ function finishCodexUsage(state, processExitCode) {
493
+ const uniqueThreadIds = [...new Set(state.threadIds)];
494
+ let tokenTotals;
495
+ let tokenError;
496
+ try { tokenTotals = aggregateCodexProviderTurnTokens(state.completedUsages); }
497
+ catch (error) { tokenError = error; }
498
+ const lifecycle = finishCodexLifecycle(state.eventState, { exactUsage: !tokenError, processExitCode });
499
+ if (!state.threadId || state.threadIds.length !== 1 || uniqueThreadIds.length !== 1 || uniqueThreadIds[0] !== state.threadId) {
500
+ const message = "Codex JSONL thread.started identity is missing, duplicated, or conflicting";
501
+ if (state.eventContract === "production-v3") throw codexContractError(message, lifecycle);
502
+ throw new Error(message);
503
+ }
504
+ if (tokenError) {
505
+ if (state.eventContract === "production-v3") throw codexContractError(tokenError.message, lifecycle);
506
+ throw tokenError;
507
+ }
508
+ const { providerInput, input, output, cacheRead, cacheWrite, reasoning, total, fresh } = tokenTotals;
228
509
  const sortedTools = Object.fromEntries(Object.entries(state.toolNames).sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0])));
229
- return {
510
+ state.execution.completeness.tools = "exact";
511
+ state.execution.completeness.subagents = "exact";
512
+ const configuredServiceTier = ["default", "fast", "priority"].includes(state.requestedServiceTier)
513
+ ? state.requestedServiceTier
514
+ : null;
515
+ const observedServiceTiers = [...new Set(state.serviceTiers)].sort();
516
+ const usage = {
230
517
  input,
231
518
  providerInput,
232
519
  output,
233
520
  cacheRead,
234
521
  cacheWrite,
235
522
  reasoning,
236
- total: providerInput + output,
237
- fresh: input + output,
523
+ total,
524
+ fresh,
238
525
  cost: null,
239
526
  costSource: "unavailable",
240
527
  usageSource: "codex-turn-completed",
241
528
  usageCompleteness: "exact",
529
+ pricingBuckets: {
530
+ schemaVersion: 1,
531
+ source: "codex-turn-aggregate-usage",
532
+ completeness: "unverified",
533
+ requests: []
534
+ },
535
+ execution: state.execution,
242
536
  sessions: 1,
537
+ turns: state.completedTurns,
243
538
  subagentSessions: 0,
244
539
  subagentTokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, fresh: 0, total: 0 },
245
540
  toolCalls: Object.values(sortedTools).reduce((sum, value) => sum + value, 0),
@@ -247,6 +542,18 @@ function finishCodexUsage(state) {
247
542
  messages: state.messages,
248
543
  model: typeof state.model === "string" && state.model ? state.model : "unknown",
249
544
  thinkingLevel: typeof state.thinkingLevel === "string" && state.thinkingLevel ? state.thinkingLevel : "unknown",
545
+ serviceTierEvidence: {
546
+ schemaVersion: 1,
547
+ source: state.serviceTiers.length > 0 ? "codex-jsonl-thread-settings" : "unavailable",
548
+ events: state.serviceTiers.length,
549
+ requestedTiers: configuredServiceTier ? [configuredServiceTier] : observedServiceTiers,
550
+ observedRequestTiers: observedServiceTiers,
551
+ providerResponseTiers: [],
552
+ responseEvidence: ["unavailable-codex-jsonl"],
553
+ defaultFallbackEvents: state.serviceTiers.filter((tier) => tier === "default").length
554
+ + (configuredServiceTier === "default" ? 1 : 0),
555
+ commandBindings: configuredServiceTier ? 1 : 0
556
+ },
250
557
  contextUsage: {
251
558
  source: "unavailable",
252
559
  observations: 0,
@@ -254,21 +561,63 @@ function finishCodexUsage(state) {
254
561
  contextWindow: null,
255
562
  peakPercent: null
256
563
  },
257
- providerSessionId: state.threadId
564
+ providerSessionId: state.threadId,
565
+ threadStartedEvidence: {
566
+ schemaVersion: 1,
567
+ source: "codex-exec-jsonl-thread-started",
568
+ events: state.threadIds.length,
569
+ threadIds: uniqueThreadIds
570
+ },
571
+ turnLifecycleEvidence: {
572
+ schemaVersion: 1,
573
+ source: "codex-exec-jsonl-turn-lifecycle",
574
+ startedEvents: state.startedTurns,
575
+ completedEvents: state.completedTurns
576
+ },
577
+ ...(state.eventContract === "production-v3" ? {
578
+ codexEventSummary: lifecycle.summary,
579
+ codexEventOutcome: lifecycle.outcome
580
+ } : {}),
581
+ jsonlEvidence: {
582
+ schemaVersion: 1,
583
+ source: "codex-exec-jsonl-stdout-bytes",
584
+ bytes: state.jsonlBytes,
585
+ sha256: state.jsonlHash.digest("hex")
586
+ }
258
587
  };
588
+ if (state.eventContract === "production-v3" && lifecycle.outcome.runValidity !== "valid") {
589
+ throw codexContractError(`Codex JSONL event contract is invalid: ${lifecycle.outcome.reasonCodes.join(", ")}`, lifecycle, usage);
590
+ }
591
+ state.terminalResponseText = lifecycle.outcome.terminalStatus === "completed" && processExitCode === 0
592
+ ? state.eventState.terminalResponseText : "";
593
+ return usage;
259
594
  }
260
595
 
261
596
  export function createCodexExecJsonlCollector(options = {}) {
262
597
  const state = {
263
598
  model: options.model,
264
599
  thinkingLevel: options.thinkingLevel,
600
+ requestedServiceTier: typeof options.requestedServiceTier === "string"
601
+ ? options.requestedServiceTier.trim().toLowerCase()
602
+ : null,
265
603
  onEvent: typeof options.onEvent === "function" ? options.onEvent : undefined,
266
604
  threadId: undefined,
267
- completedUsage: undefined,
605
+ threadIds: [],
606
+ completedUsages: [],
268
607
  completedTurns: 0,
608
+ startedTurns: 0,
269
609
  messages: 0,
270
610
  toolNames: {},
271
- diagnostics: []
611
+ toolFingerprints: new Set(),
612
+ execution: emptyExecutionAggregate("codex-exec-jsonl"),
613
+ diagnostics: [],
614
+ serviceTiers: [],
615
+ eventContract: options.eventContract,
616
+ processExitCode: options.processExitCode,
617
+ eventState: createCodexEventState(),
618
+ terminalResponseText: "",
619
+ jsonlBytes: 0,
620
+ jsonlHash: createHash("sha256")
272
621
  };
273
622
  let buffer = "";
274
623
  let lineNumber = 0;
@@ -285,9 +634,13 @@ export function createCodexExecJsonlCollector(options = {}) {
285
634
  };
286
635
  return {
287
636
  write(chunk) {
637
+ state.terminalResponseText = "";
288
638
  if (failure) return;
289
639
  try {
290
- buffer += typeof chunk === "string" ? chunk : decoder.write(Buffer.from(chunk));
640
+ const bytes = Buffer.from(chunk);
641
+ state.jsonlBytes += bytes.length;
642
+ state.jsonlHash.update(bytes);
643
+ buffer += typeof chunk === "string" ? chunk : decoder.write(bytes);
291
644
  let newline;
292
645
  while ((newline = buffer.indexOf("\n")) >= 0) {
293
646
  consumeLine(buffer.slice(0, newline));
@@ -299,18 +652,27 @@ export function createCodexExecJsonlCollector(options = {}) {
299
652
  buffer = "";
300
653
  }
301
654
  },
302
- finish() {
655
+ finish(finalOptions = {}) {
656
+ state.terminalResponseText = "";
303
657
  if (!failure) buffer += decoder.end();
304
658
  if (!failure && buffer) {
305
659
  try { consumeLine(buffer); } catch (error) { failure = error; }
306
660
  buffer = "";
307
661
  }
308
- if (failure) throw failure;
309
- return finishCodexUsage(state);
662
+ if (failure) {
663
+ if (state.eventContract === "production-v3") {
664
+ const lifecycle = finishCodexLifecycle(state.eventState, { exactUsage: false,
665
+ processExitCode: finalOptions.processExitCode ?? state.processExitCode });
666
+ throw codexContractError(failure.message, lifecycle);
667
+ }
668
+ throw failure;
669
+ }
670
+ return finishCodexUsage(state, finalOptions.processExitCode ?? state.processExitCode);
310
671
  },
311
672
  diagnostics() {
312
673
  return state.diagnostics.map((item) => ({ ...item }));
313
- }
674
+ },
675
+ terminalResponseText() { return state.terminalResponseText; }
314
676
  };
315
677
  }
316
678