@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,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,10 +25,44 @@ 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
- && Number.isInteger(usage?.sessions) && usage.sessions > 0
24
- && TOKEN_FIELDS.every((field) => Number.isFinite(usage?.[field]) && usage[field] >= 0)
64
+ && Number.isSafeInteger(usage?.sessions) && usage.sessions > 0
65
+ && TOKEN_FIELDS.every((field) => Number.isSafeInteger(usage?.[field]) && usage[field] >= 0)
25
66
  && usage.fresh === usage.input + usage.output
26
67
  && usage.total === usage.input + usage.cacheRead + usage.cacheWrite + usage.output
27
68
  && usage.reasoning <= usage.output;
@@ -29,12 +70,14 @@ export function exactBenchmarkMeasuredUsage(usage) {
29
70
 
30
71
  function knownPreProviderZero(usage, status) {
31
72
  return status === "known-pre-provider-zero"
32
- && Number(usage?.sessions ?? 0) === 0
33
- && TOKEN_FIELDS.every((field) => Number(usage?.[field] ?? 0) === 0);
73
+ && Number.isSafeInteger(usage?.sessions ?? 0)
74
+ && (usage?.sessions ?? 0) === 0
75
+ && TOKEN_FIELDS.every((field) => Number.isSafeInteger(usage?.[field] ?? 0)
76
+ && (usage?.[field] ?? 0) === 0);
34
77
  }
35
78
 
36
79
  export function exactBenchmarkAttemptUsage(usage, status) {
37
- return status !== "unknown-after-provider-start"
80
+ return !["unknown-after-provider-start", "measured-lower-bound"].includes(status)
38
81
  && (exactBenchmarkMeasuredUsage(usage) || knownPreProviderZero(usage, status));
39
82
  }
40
83
 
@@ -72,30 +115,64 @@ export function benchmarkTokenAccounting(runs) {
72
115
  status: attempt.usageStatus ?? "unknown-after-provider-start",
73
116
  usage: attempt.usage
74
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;
75
123
  return {
76
124
  schemaVersion: 1,
77
125
  definitions: BENCHMARK_TOKEN_DEFINITIONS,
78
126
  acceptedAttempts: tokenBucket(accepted),
79
127
  failedAttempts: tokenBucket(failed),
80
- allAttempts: tokenBucket([...accepted, ...failed])
128
+ allAttempts
81
129
  };
82
130
  }
83
131
 
84
132
  export function benchmarkInfrastructureFailureLedgerIssues(runs) {
85
133
  return runs.flatMap((run) => {
86
134
  const issues = [];
87
- 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) {
88
141
  issues.push("invalid-infrastructure-retry-count");
89
142
  }
90
143
  if (!Array.isArray(run.infrastructureFailures)) {
91
144
  issues.push("missing-infrastructure-failure-ledger");
92
- } else if (Number.isInteger(run.infrastructureRetries) && run.infrastructureFailures.length !== run.infrastructureRetries) {
93
- 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
+ }
94
166
  }
95
- if (!Number.isInteger(run.infrastructureAttempts)
96
- || run.infrastructureAttempts !== (Number.isInteger(run.infrastructureRetries) ? run.infrastructureRetries + 1 : -1)) {
167
+ if (!attemptsExact
168
+ || run.infrastructureAttempts !== (retriesExact ? run.infrastructureRetries + 1 : -1)) {
97
169
  issues.push("attempt-ledger-count-mismatch");
98
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
+ }
99
176
  return issues.length > 0 ? [{
100
177
  scenarioId: run.scenarioId ?? null,
101
178
  surface: run.surface ?? null,
@@ -107,14 +184,20 @@ export function benchmarkInfrastructureFailureLedgerIssues(runs) {
107
184
 
108
185
  export function aggregateSessionUsage(sessions) {
109
186
  const totals = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, total: 0, cost: 0 };
187
+ const subagentTokens = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, total: 0 };
110
188
  const models = new Set();
111
189
  const thinkingLevels = new Set();
112
190
  const toolNames = {};
113
191
  let toolCalls = 0;
114
192
  let messages = 0;
115
193
  const contextSnapshots = [];
194
+ const execution = emptyExecutionAggregate("pi-session-jsonl");
195
+ const pricingRequests = [];
116
196
  for (const session of sessions) {
117
197
  for (const key of Object.keys(totals)) totals[key] += Number(session.tokens?.[key] ?? 0);
198
+ if (session.isSubagent) {
199
+ for (const key of Object.keys(subagentTokens)) subagentTokens[key] += Number(session.tokens?.[key] ?? 0);
200
+ }
118
201
  if (session.modelId || session.provider) models.add(`${session.provider || "unknown"}/${session.modelId || "unknown"}`);
119
202
  if (session.thinkingLevel) thinkingLevels.add(session.thinkingLevel);
120
203
  toolCalls += Number(session.messages?.toolCalls ?? 0);
@@ -130,12 +213,21 @@ export function aggregateSessionUsage(sessions) {
130
213
  for (const [name, count] of Object.entries(session.toolNames ?? {})) {
131
214
  toolNames[name] = (toolNames[name] ?? 0) + Number(count ?? 0);
132
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);
133
221
  }
134
222
  return {
135
223
  ...totals,
136
224
  fresh: totals.input + totals.output,
137
225
  sessions: sessions.length,
138
226
  subagentSessions: sessions.filter((session) => session.isSubagent).length,
227
+ subagentTokens: {
228
+ ...subagentTokens,
229
+ fresh: subagentTokens.input + subagentTokens.output
230
+ },
139
231
  toolCalls,
140
232
  toolNames: Object.fromEntries(Object.entries(toolNames).sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))),
141
233
  messages,
@@ -143,6 +235,20 @@ export function aggregateSessionUsage(sessions) {
143
235
  thinkingLevel: thinkingLevels.size === 1 ? [...thinkingLevels][0] : thinkingLevels.size === 0 ? "unknown" : "mixed",
144
236
  usageSource: sessions.length > 0 ? "pi-session-jsonl" : "unavailable",
145
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,
146
252
  contextUsage: contextSnapshots.length > 0 ? {
147
253
  source: "session-reported",
148
254
  observations: contextSnapshots.length,
@@ -172,11 +278,161 @@ function requiredCodexToken(value, field) {
172
278
  return value;
173
279
  }
174
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
+
175
417
  function consumeCodexEvent(state, event, lineNumber) {
176
418
  if (!plainObject(event) || typeof event.type !== "string") {
177
419
  throw new Error(`Codex JSONL line ${lineNumber} is not an event object`);
178
420
  }
421
+ consumeCodexLifecycleEvent(state.eventState, event);
179
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
+ }
180
436
  if (event.type === "error" || event.type === "turn.failed") {
181
437
  const nested = plainObject(event.error) ? event.error : {};
182
438
  const message = [event.message, nested.message, nested.additional_details]
@@ -185,7 +441,12 @@ function consumeCodexEvent(state, event, lineNumber) {
185
441
  return;
186
442
  }
187
443
  if (event.type === "thread.started" && typeof event.thread_id === "string" && event.thread_id) {
188
- 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;
189
450
  return;
190
451
  }
191
452
  if (event.type === "item.completed" && plainObject(event.item)) {
@@ -193,49 +454,106 @@ function consumeCodexEvent(state, event, lineNumber) {
193
454
  if (type === "agent_message") state.messages += 1;
194
455
  else if (typeof type === "string" && type && !CODEX_NON_TOOL_ITEMS.has(type)) {
195
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
+ }
196
471
  }
197
472
  return;
198
473
  }
199
474
  if (event.type === "turn.completed") {
200
475
  state.completedTurns += 1;
201
- if (state.completedTurns > 1) throw new Error("Codex JSONL contains more than one completed root turn");
202
476
  if (!plainObject(event.usage)) throw new Error("Codex JSONL turn.completed is missing usage");
203
- state.completedUsage = event.usage;
477
+ state.completedUsages.push(event.usage);
478
+ state.execution.providerStartedAttempts += 1;
204
479
  }
205
480
  }
206
481
 
207
- function finishCodexUsage(state) {
208
- if (!state.threadId) throw new Error("Codex JSONL is missing thread.started");
209
- if (!state.completedUsage) throw new Error("Codex JSONL is missing turn.completed usage");
210
- const providerInput = requiredCodexToken(state.completedUsage.input_tokens, "input_tokens");
211
- const cacheRead = requiredCodexToken(state.completedUsage.cached_input_tokens ?? 0, "cached_input_tokens");
212
- const cacheWrite = requiredCodexToken(state.completedUsage.cache_write_input_tokens ?? 0, "cache_write_input_tokens");
213
- const output = requiredCodexToken(state.completedUsage.output_tokens, "output_tokens");
214
- const reasoning = requiredCodexToken(state.completedUsage.reasoning_output_tokens ?? 0, "reasoning_output_tokens");
215
- if (cacheRead + cacheWrite > providerInput) throw new Error("Codex JSONL cached and cache-write input tokens exceed input_tokens");
216
- if (reasoning > output) throw new Error("Codex JSONL reasoning_output_tokens exceeds output_tokens");
217
- 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;
218
509
  const sortedTools = Object.fromEntries(Object.entries(state.toolNames).sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0])));
219
- 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 = {
220
517
  input,
221
518
  providerInput,
222
519
  output,
223
520
  cacheRead,
224
521
  cacheWrite,
225
522
  reasoning,
226
- total: providerInput + output,
227
- fresh: input + output,
523
+ total,
524
+ fresh,
228
525
  cost: null,
229
526
  costSource: "unavailable",
230
527
  usageSource: "codex-turn-completed",
231
528
  usageCompleteness: "exact",
529
+ pricingBuckets: {
530
+ schemaVersion: 1,
531
+ source: "codex-turn-aggregate-usage",
532
+ completeness: "unverified",
533
+ requests: []
534
+ },
535
+ execution: state.execution,
232
536
  sessions: 1,
537
+ turns: state.completedTurns,
233
538
  subagentSessions: 0,
539
+ subagentTokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, fresh: 0, total: 0 },
234
540
  toolCalls: Object.values(sortedTools).reduce((sum, value) => sum + value, 0),
235
541
  toolNames: sortedTools,
236
542
  messages: state.messages,
237
543
  model: typeof state.model === "string" && state.model ? state.model : "unknown",
238
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
+ },
239
557
  contextUsage: {
240
558
  source: "unavailable",
241
559
  observations: 0,
@@ -243,21 +561,63 @@ function finishCodexUsage(state) {
243
561
  contextWindow: null,
244
562
  peakPercent: null
245
563
  },
246
- 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
+ }
247
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;
248
594
  }
249
595
 
250
596
  export function createCodexExecJsonlCollector(options = {}) {
251
597
  const state = {
252
598
  model: options.model,
253
599
  thinkingLevel: options.thinkingLevel,
600
+ requestedServiceTier: typeof options.requestedServiceTier === "string"
601
+ ? options.requestedServiceTier.trim().toLowerCase()
602
+ : null,
254
603
  onEvent: typeof options.onEvent === "function" ? options.onEvent : undefined,
255
604
  threadId: undefined,
256
- completedUsage: undefined,
605
+ threadIds: [],
606
+ completedUsages: [],
257
607
  completedTurns: 0,
608
+ startedTurns: 0,
258
609
  messages: 0,
259
610
  toolNames: {},
260
- 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")
261
621
  };
262
622
  let buffer = "";
263
623
  let lineNumber = 0;
@@ -274,9 +634,13 @@ export function createCodexExecJsonlCollector(options = {}) {
274
634
  };
275
635
  return {
276
636
  write(chunk) {
637
+ state.terminalResponseText = "";
277
638
  if (failure) return;
278
639
  try {
279
- 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);
280
644
  let newline;
281
645
  while ((newline = buffer.indexOf("\n")) >= 0) {
282
646
  consumeLine(buffer.slice(0, newline));
@@ -288,18 +652,27 @@ export function createCodexExecJsonlCollector(options = {}) {
288
652
  buffer = "";
289
653
  }
290
654
  },
291
- finish() {
655
+ finish(finalOptions = {}) {
656
+ state.terminalResponseText = "";
292
657
  if (!failure) buffer += decoder.end();
293
658
  if (!failure && buffer) {
294
659
  try { consumeLine(buffer); } catch (error) { failure = error; }
295
660
  buffer = "";
296
661
  }
297
- if (failure) throw failure;
298
- 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);
299
671
  },
300
672
  diagnostics() {
301
673
  return state.diagnostics.map((item) => ({ ...item }));
302
- }
674
+ },
675
+ terminalResponseText() { return state.terminalResponseText; }
303
676
  };
304
677
  }
305
678