@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
@@ -0,0 +1,164 @@
1
+ import {
2
+ callReturns,
3
+ callThrows,
4
+ protocolRecord,
5
+ recipe,
6
+ utf8Chunks
7
+ } from "./benchmark-registered-plan-recipe-support.mjs";
8
+
9
+ function unicodeRecipe() {
10
+ return recipe("src/frontend/unicode-search.js", "normalizeSearchText", [
11
+ callReturns("normalize-null", [null], ""),
12
+ callReturns("normalize-undefined", [undefined], ""),
13
+ callReturns("normalize-case-accent-space", [" CAFÉ\t au LAIT "], "cafe au lait"),
14
+ callReturns("normalize-decomposed", [" A\u030Angstro\u0308m "], "angstrom"),
15
+ callReturns("normalize-nondecomposable", [" Øresund "], "øresund"),
16
+ callReturns("includes-accent-case-space", [" Café au LAIT ", "cafe au"], true,
17
+ { exportName: "includesSearchText" }),
18
+ callReturns("includes-decomposed", ["Ångström", "angstrom"], true,
19
+ { exportName: "includesSearchText" }),
20
+ callReturns("includes-null-safe", [null, "x"], false, { exportName: "includesSearchText" }),
21
+ callReturns("includes-null-query", ["anything", null], true, { exportName: "includesSearchText" }),
22
+ callReturns("includes-miss", ["résumé", "sumo"], false, { exportName: "includesSearchText" })
23
+ ]);
24
+ }
25
+
26
+ function csvRecipe() {
27
+ return recipe("src/data/csv.js", "parseCsv", [
28
+ callReturns("empty", [""], [], { fresh: true }),
29
+ callReturns("simple-final-record", ["a,b"], [["a", "b"]], { fresh: true }),
30
+ callReturns("empty-physical-record", ["\n"], [[""]], { fresh: true }),
31
+ callReturns("trailing-terminator", ["a\n"], [["a"]], { fresh: true }),
32
+ callReturns("empty-fields", [",,"], [["", "", ""]], { fresh: true }),
33
+ callReturns("quoted-comma", ["\"a,b\",c"], [["a,b", "c"]], { fresh: true }),
34
+ callReturns("escaped-quote", ["\"a\"\"b\""], [["a\"b"]], { fresh: true }),
35
+ callReturns("crlf-records", ["a,b\r\nc,d\r\n"], [["a", "b"], ["c", "d"]], { fresh: true }),
36
+ callReturns("quoted-lf", ["\"a\nb\",c"], [["a\nb", "c"]], { fresh: true }),
37
+ callReturns("quoted-crlf-preserved", ["\"a\r\nb\",c"], [["a\r\nb", "c"]], { fresh: true }),
38
+ callReturns("quoted-empty", ["\"\""], [[""]], { fresh: true }),
39
+ callReturns("whitespace-preserved", [" a , b "], [[" a ", " b "]], { fresh: true }),
40
+ callThrows("unterminated-quote", ["\"a"], "SyntaxError"),
41
+ callThrows("quote-in-unquoted-field", ["a\"b"], "SyntaxError"),
42
+ callThrows("text-after-closing-quote", ["\"a\"x"], "SyntaxError"),
43
+ callThrows("bare-cr", ["a\rb"], "SyntaxError"),
44
+ callThrows("nonstring-null", [null]),
45
+ callThrows("nonstring-number", [1]),
46
+ callThrows("nonstring-array", [[]])
47
+ ]);
48
+ }
49
+
50
+ function ndjsonRecipe() {
51
+ const splitUnicode = utf8Chunks('{"text":"é😀"}\n', [10, 13]);
52
+ return recipe("src/data/ndjson-stream.js", "parseNdjsonChunks", [
53
+ callReturns("no-chunks", [[]], [], { fresh: true }),
54
+ callReturns("one-final-record", [utf8Chunks('{"id":1}')], [{ id: 1 }], { fresh: true }),
55
+ callReturns("lf-records-and-empty-lines", [utf8Chunks('{"id":1}\n\n{"id":2}\n')],
56
+ [{ id: 1 }, { id: 2 }], { fresh: true }),
57
+ callReturns("crlf-records", [utf8Chunks('{"id":1}\r\n{"id":2}\r\n')],
58
+ [{ id: 1 }, { id: 2 }], { fresh: true }),
59
+ callReturns("ascii-split", [utf8Chunks('{"value":"split"}\n', [2, 7, 12])],
60
+ [{ value: "split" }], { fresh: true }),
61
+ callReturns("unicode-split-inside-codepoints", [splitUnicode], [{ text: "é😀" }], { fresh: true }),
62
+ callReturns("empty-chunks", [[new Uint8Array(), ...utf8Chunks('0\nnull\n'), new Uint8Array()]],
63
+ [0, null], { fresh: true }),
64
+ callReturns("json-array-record", [utf8Chunks('[1,2,3]\n')], [[1, 2, 3]], { fresh: true }),
65
+ callThrows("invalid-utf8", [[new Uint8Array([0xc3, 0x28])]]),
66
+ callThrows("invalid-json", [utf8Chunks('{]\n')], "SyntaxError")
67
+ ]);
68
+ }
69
+
70
+ function migrationRecipe() {
71
+ const v2 = { version: 2, enabled: false, retryLimit: 0, label: "", metadata: { owner: "ops" } };
72
+ const freshPairs = [{ id: "fresh-outer", left: { root: "return", path: [] },
73
+ right: { root: "argument", index: 0, path: [] } }];
74
+ return recipe("src/data/migration.js", "migrateSettings", [
75
+ callReturns("default-argument", [], { version: 2, enabled: true, retryLimit: 3, label: "default" }, { fresh: true }),
76
+ callReturns("v1-falsey-values", [{ version: 1, enabled: false, retries: 0, name: "" }],
77
+ { version: 2, enabled: false, retryLimit: 0, label: "" }, { fresh: true }),
78
+ callReturns("v1-nullish-defaults", [{ version: 1, enabled: null, retries: null, name: null }],
79
+ { version: 2, enabled: true, retryLimit: 3, label: "default" }, { fresh: true }),
80
+ callReturns("v1-mixed-values", [{ version: 1, enabled: true, retries: 8, name: "nightly" }],
81
+ { version: 2, enabled: true, retryLimit: 8, label: "nightly" }, { fresh: true }),
82
+ callReturns("v2-independent-outer-copy", [v2], v2,
83
+ { fresh: true, referencePairs: freshPairs,
84
+ referenceIdentity: [{ id: "fresh-outer", same: false }] })
85
+ ]);
86
+ }
87
+
88
+ function dedupRecipe() {
89
+ return recipe("src/data/dedup.js", "deduplicateEvents", [
90
+ callReturns("empty", [[]], [], { fresh: true }),
91
+ callReturns("first-id-order-latest-value", [[
92
+ { id: "a", sequence: 1, value: "old-a" },
93
+ { id: "b", sequence: 9, value: "b" },
94
+ { id: "a", sequence: 3, value: "new-a" }
95
+ ]], [{ id: "a", sequence: 3, value: "new-a" }, { id: "b", sequence: 9, value: "b" }], { fresh: true }),
96
+ callReturns("later-tie-wins", [[
97
+ { id: "a", sequence: 5, value: "first" },
98
+ { id: "a", sequence: 5, value: "later" }
99
+ ]], [{ id: "a", sequence: 5, value: "later" }], { fresh: true }),
100
+ callReturns("greatest-numeric-sequence", [[
101
+ { id: "a", sequence: -2, value: "negative" },
102
+ { id: "a", sequence: 0.5, value: "fraction" },
103
+ { id: "a", sequence: 0, value: "zero" }
104
+ ]], [{ id: "a", sequence: 0.5, value: "fraction" }], { fresh: true }),
105
+ callReturns("stable-distinct-order", [[
106
+ { id: "z", sequence: 0 }, { id: "a", sequence: 100 }, { id: "m", sequence: 2 }
107
+ ]], [{ id: "z", sequence: 0 }, { id: "a", sequence: 100 }, { id: "m", sequence: 2 }], { fresh: true })
108
+ ]);
109
+ }
110
+
111
+ function replayRecipe() {
112
+ const empty = () => ({ entities: {}, appliedEventIds: [] });
113
+ const event = overrides => ({ eventId: "event-1", entityId: "entity-1", expectedVersion: 0,
114
+ nextValue: { name: "first" }, ...overrides });
115
+ const freshPairs = [
116
+ { id: "fresh-state", left: { root: "return", path: [] }, right: { root: "argument", index: 0, path: [] } },
117
+ { id: "fresh-entities", left: { root: "return", path: ["entities"] }, right: { root: "argument", index: 0, path: ["entities"] } },
118
+ { id: "fresh-applied", left: { root: "return", path: ["appliedEventIds"] }, right: { root: "argument", index: 0, path: ["appliedEventIds"] } }
119
+ ];
120
+ const specialInitial = protocolRecord([["entities", protocolRecord([])], ["appliedEventIds", []]]);
121
+ const specialExpected = protocolRecord([["entities", protocolRecord([["__proto__", { version: 1, value: "safe" }]])],
122
+ ["appliedEventIds", ["special"]]]);
123
+ return recipe("src/data/versioned-replay.js", "replayVersionedEvents", [
124
+ callReturns("empty-events-fresh-containers", [empty(), []], empty(), { fresh: true,
125
+ referencePairs: freshPairs, referenceIdentity: freshPairs.map(pair => ({ id: pair.id, same: false })) }),
126
+ callReturns("one-new-entity", [empty(), [event({})]],
127
+ { entities: { "entity-1": { version: 1, value: { name: "first" } } }, appliedEventIds: ["event-1"] }, { fresh: true }),
128
+ callReturns("ordered-version-advance", [empty(), [event({}), event({ eventId: "event-2", expectedVersion: 1,
129
+ nextValue: { name: "second" } })]],
130
+ { entities: { "entity-1": { version: 2, value: { name: "second" } } }, appliedEventIds: ["event-1", "event-2"] }, { fresh: true }),
131
+ callReturns("initially-applied-idempotent", [{ entities: { "entity-1": { version: 4, value: "kept" } },
132
+ appliedEventIds: ["event-1"] }, [event({ expectedVersion: 999, nextValue: "ignored" })]],
133
+ { entities: { "entity-1": { version: 4, value: "kept" } }, appliedEventIds: ["event-1"] }, { fresh: true }),
134
+ callReturns("duplicate-in-batch-idempotent", [empty(), [event({ nextValue: "first" }),
135
+ event({ expectedVersion: 999, nextValue: "ignored" })]],
136
+ { entities: { "entity-1": { version: 1, value: "first" } }, appliedEventIds: ["event-1"] }, { fresh: true }),
137
+ callReturns("literal-special-entity-id", [specialInitial,
138
+ [{ eventId: "special", entityId: "__proto__", expectedVersion: 0, nextValue: "safe" }]], specialExpected, { fresh: true }),
139
+ callThrows("absent-entity-version-conflict", [empty(), [event({ expectedVersion: 1 })]], "Error"),
140
+ callThrows("maximum-safe-increment", [{ entities: { "entity-1": { version: Number.MAX_SAFE_INTEGER, value: null } },
141
+ appliedEventIds: [] }, [event({ expectedVersion: Number.MAX_SAFE_INTEGER })]]),
142
+ callThrows("malformed-later-outranks-conflict", [empty(), [event({ expectedVersion: 1 }),
143
+ { eventId: "later", entityId: "entity-2", expectedVersion: 0 }]]),
144
+ callThrows("malformed-duplicate-still-invalid", [empty(), [event({}),
145
+ { eventId: "event-1", entityId: "entity-1", expectedVersion: 999 }]]),
146
+ callThrows("duplicate-initial-applied-ids", [{ entities: {}, appliedEventIds: ["same", "same"] }, []]),
147
+ callThrows("unsafe-entity-version", [{ entities: { x: { version: Number.MAX_SAFE_INTEGER + 1, value: null } },
148
+ appliedEventIds: [] }, []]),
149
+ callThrows("nonfinite-json-value", [empty(), [event({ nextValue: { invalid: NaN } })]])
150
+ ]);
151
+ }
152
+
153
+ const RECIPES = Object.freeze({
154
+ "unicode-search": unicodeRecipe,
155
+ "quoted-csv": csvRecipe,
156
+ "chunked-record-boundary": ndjsonRecipe,
157
+ "schema-migration": migrationRecipe,
158
+ "stable-dedup": dedupRecipe,
159
+ "idempotent-replay-conflict": replayRecipe
160
+ });
161
+
162
+ export function registeredDataRecipe(scenarioId) {
163
+ return RECIPES[scenarioId]?.() ?? null;
164
+ }
@@ -0,0 +1,165 @@
1
+ import { callReturns, callThrows, recipe } from "./benchmark-registered-plan-recipe-support.mjs";
2
+
3
+ function argsRecipe() {
4
+ return recipe("src/platform/args.js", "parseArgs", [
5
+ callReturns("empty", [[]], { flags: {}, positional: [] }, { fresh: true }),
6
+ callReturns("name-space-value", [["--name", "value"]], { flags: { name: "value" }, positional: [] }, { fresh: true }),
7
+ callReturns("name-equals-value", [["--name=value"]], { flags: { name: "value" }, positional: [] }, { fresh: true }),
8
+ callReturns("empty-equals-value", [["--name="]], { flags: { name: "" }, positional: [] }, { fresh: true }),
9
+ callReturns("boolean-at-end", [["--verbose"]], { flags: { verbose: true }, positional: [] }, { fresh: true }),
10
+ callReturns("flag-before-flag", [["--verbose", "--color"]],
11
+ { flags: { verbose: true, color: true }, positional: [] }, { fresh: true }),
12
+ callReturns("double-dash-terminates", [["--name", "value", "--", "--literal", "tail"]],
13
+ { flags: { name: "value" }, positional: ["--literal", "tail"] }, { fresh: true }),
14
+ callReturns("first-double-dash", [["--", "--name=value", "-x"]],
15
+ { flags: {}, positional: ["--name=value", "-x"] }, { fresh: true }),
16
+ callReturns("single-dash-positional", [["-x", "plain"]], { flags: {}, positional: ["-x", "plain"] }, { fresh: true }),
17
+ callReturns("repeated-last-wins", [["--name", "first", "--name=second", "--name", "third"]],
18
+ { flags: { name: "third" }, positional: [] }, { fresh: true })
19
+ ]);
20
+ }
21
+
22
+ function workspaceRecipe() {
23
+ const pkg = (name, dependencies, extra = {}) => ({ name, ...(dependencies === undefined ? {} : { dependencies }), ...extra });
24
+ return recipe("src/platform/workspace.js", "workspaceOrder", [
25
+ callReturns("empty", [[]], [], { fresh: true }),
26
+ callReturns("no-edge-input-order", [[pkg("B", []), pkg("A", null), pkg("C", undefined)]],
27
+ ["B", "A", "C"], { fresh: true }),
28
+ callReturns("ready-recomputed-a-to-c", [[pkg("A", ["C"]), pkg("B", []), pkg("C", [])]],
29
+ ["B", "C", "A"], { fresh: true }),
30
+ callReturns("ready-recomputed-a-to-b", [[pkg("A", ["B"]), pkg("B", []), pkg("C", [])]],
31
+ ["B", "A", "C"], { fresh: true }),
32
+ callReturns("multiple-dependencies", [[pkg("A", ["C", "B"]), pkg("B", []), pkg("C", [])]],
33
+ ["B", "C", "A"], { fresh: true }),
34
+ callReturns("duplicate-and-foreign-dependency", [[pkg("A", ["B", "B", "missing"]), pkg("B", [])]],
35
+ ["B", "A"], { fresh: true }),
36
+ callReturns("literal-names", [[pkg(" A ", ["B"]), pkg("B", []), pkg("b", [])]],
37
+ ["B", " A ", "b"], { fresh: true }),
38
+ callReturns("metadata-ignored", [[pkg("A", [], { private: { ignored: true } })]], ["A"], { fresh: true }),
39
+ callThrows("duplicate-package-name", [[pkg("A", []), pkg("A", [])]]),
40
+ callThrows("empty-name", [[pkg("", [])]]),
41
+ callThrows("whitespace-name", [[pkg(" ", [])]]),
42
+ callThrows("dependencies-not-array", [[pkg("A", "B")]]),
43
+ callThrows("invalid-dependency-name", [[pkg("A", [" "])]]),
44
+ callThrows("malformed-outranks-cycle", [[pkg("A", ["A"]), pkg("", [])]]),
45
+ callThrows("self-cycle", [[pkg("A", ["A"])]], "Error"),
46
+ callThrows("two-node-cycle", [[pkg("A", ["B"]), pkg("B", ["A"])]], "Error")
47
+ ]);
48
+ }
49
+
50
+ function contractResult({ compatible, missingStatuses = [], extraStatuses = [], missingFields = [], versionMismatch = false }) {
51
+ return { compatible, missingStatuses, extraStatuses, missingFields, versionMismatch };
52
+ }
53
+
54
+ function contractRecipe() {
55
+ const contract = (statuses, fields, version, extra = {}) => ({ statuses, fields, version, ...extra });
56
+ return recipe("src/fullstack/contract-sync.js", "compareSubscriptionContracts", [
57
+ callReturns("compatible-reordered-extra-fields", [
58
+ contract(["active", "trial"], ["id", "plan"], 1),
59
+ contract(["trial", "active"], ["plan", "id", "debug"], 1, { metadata: "ignored" })
60
+ ], contractResult({ compatible: true }), { fresh: true }),
61
+ callReturns("all-mismatches", [
62
+ contract(["active", "trial"], ["id", "plan"], 1),
63
+ contract(["paused", "active"], ["id"], 2)
64
+ ], contractResult({ compatible: false, missingStatuses: ["trial"], extraStatuses: ["paused"],
65
+ missingFields: ["plan"], versionMismatch: true }), { fresh: true }),
66
+ callReturns("empty-compatible", [contract([], [], 1), contract([], [], 1)],
67
+ contractResult({ compatible: true }), { fresh: true }),
68
+ callReturns("utf8-byte-order", [contract(["😀", "é", "z", "\uE000"], [], 1), contract([], [], 1)],
69
+ contractResult({ compatible: false, missingStatuses: ["z", "é", "\uE000", "😀"] }), { fresh: true }),
70
+ callReturns("literal-unicode-distinct", [contract(["é", "e\u0301"], [], 1), contract(["é"], [], 1)],
71
+ contractResult({ compatible: false, missingStatuses: ["e\u0301"] }), { fresh: true }),
72
+ callReturns("special-and-whitespace-declarations", [contract([" ", "__proto__", "constructor"], [], 1),
73
+ contract(["constructor", "__proto__", " "], [], 1)], contractResult({ compatible: true }), { fresh: true }),
74
+ callReturns("large-integer-version", [contract([], [], 1e20), contract([], [], 1e20)],
75
+ contractResult({ compatible: true }), { fresh: true }),
76
+ callThrows("duplicate-status", [contract(["a", "a"], [], 1), contract([], [], 1)]),
77
+ callThrows("missing-fields-property", [{ statuses: [], version: 1 }, contract([], [], 1)]),
78
+ callThrows("zero-version", [contract([], [], 0), contract([], [], 1)]),
79
+ callThrows("fractional-version", [contract([], [], 1.5), contract([], [], 1)]),
80
+ callThrows("nonfinite-version", [contract([], [], Infinity), contract([], [], 1)]),
81
+ callThrows("string-version", [contract([], [], "1"), contract([], [], 1)]),
82
+ callThrows("empty-declaration", [contract([""], [], 1), contract([], [], 1)]),
83
+ callThrows("lone-surrogate", [contract(["\uD800"], [], 1), contract([], [], 1)]),
84
+ callThrows("frontend-malformed-even-if-incompatible", [contract(["backend"], [], 1),
85
+ contract(["front", "front"], [], 2)])
86
+ ]);
87
+ }
88
+
89
+ function message(overrides = {}) {
90
+ return { eventId: "event-1", sequence: 1, kind: "message", messageId: "message-1",
91
+ role: "user", text: "hello", confirmed: false, ...overrides };
92
+ }
93
+
94
+ function lifecycle(overrides = {}) {
95
+ return { eventId: "lifecycle-1", sequence: 1, kind: "lifecycle", state: "started", ...overrides };
96
+ }
97
+
98
+ function projected(overrides = {}) {
99
+ return { messageId: "message-1", role: "user", text: "hello", sequence: 1, confirmed: false, ...overrides };
100
+ }
101
+
102
+ function chatRecipe() {
103
+ return recipe("src/frontend/chat-events.js", "projectChatEvents", [
104
+ callReturns("empty", [[]], { messages: [], processing: false }, { fresh: true }),
105
+ callReturns("latest-lifecycle-settled", [[lifecycle({ sequence: 9 }),
106
+ lifecycle({ eventId: "settled", sequence: 10, state: "settled" }),
107
+ lifecycle({ eventId: "old-start", sequence: 2 })]], { messages: [], processing: false }, { fresh: true }),
108
+ callReturns("same-sequence-settled-wins", [[lifecycle({ eventId: "start", sequence: 10 }),
109
+ lifecycle({ eventId: "settled", sequence: 10, state: "settled" })]],
110
+ { messages: [], processing: false }, { fresh: true }),
111
+ callReturns("messages-sorted-and-reply-retained", [[
112
+ message({ eventId: "assistant-event", sequence: 4, messageId: "assistant", role: "assistant",
113
+ text: "answer", confirmed: true, replyTo: "user" }),
114
+ message({ eventId: "user-event", sequence: 4, messageId: "user", role: "user", text: "question", confirmed: true })
115
+ ]], { messages: [
116
+ projected({ messageId: "user", text: "question", sequence: 4, confirmed: true }),
117
+ projected({ messageId: "assistant", role: "assistant", text: "answer", sequence: 4,
118
+ confirmed: true, replyTo: "user" })
119
+ ], processing: false }, { fresh: true }),
120
+ callReturns("identical-event-id-collapses-metadata", [[
121
+ message({ eventId: "same", metadata: "first" }), message({ eventId: "same", metadata: "second" })
122
+ ]], { messages: [projected({})], processing: false }, { fresh: true }),
123
+ callThrows("conflicting-event-id", [[message({ eventId: "same" }), message({ eventId: "same", text: "changed" })]]),
124
+ callReturns("confirmed-beats-pending", [[
125
+ message({ eventId: "pending", sequence: 9, text: "pending", confirmed: false }),
126
+ message({ eventId: "confirmed", sequence: 2, text: "confirmed", confirmed: true })
127
+ ]], { messages: [projected({ sequence: 2, text: "confirmed", confirmed: true })], processing: false }, { fresh: true }),
128
+ callReturns("identical-confirmed-copies", [[
129
+ message({ eventId: "confirmed-a", sequence: 2, confirmed: true }),
130
+ message({ eventId: "confirmed-b", sequence: 2, confirmed: true })
131
+ ]], { messages: [projected({ sequence: 2, confirmed: true })], processing: false }, { fresh: true }),
132
+ callThrows("conflicting-confirmed-message", [[
133
+ message({ eventId: "confirmed-a", confirmed: true }),
134
+ message({ eventId: "confirmed-b", confirmed: true, text: "different" })
135
+ ]], "Error"),
136
+ callReturns("pending-greatest-sequence", [[
137
+ message({ eventId: "early", sequence: 1, text: "early" }),
138
+ message({ eventId: "late", sequence: 3, text: "late" })
139
+ ]], { messages: [projected({ sequence: 3, text: "late" })], processing: false }, { fresh: true }),
140
+ callReturns("pending-tie-smallest-event-id", [[
141
+ message({ eventId: "z", sequence: 3, text: "z-winner-candidate" }),
142
+ message({ eventId: "a", sequence: 3, text: "a-winner" })
143
+ ]], { messages: [projected({ sequence: 3, text: "a-winner" })], processing: false }, { fresh: true }),
144
+ callThrows("missing-reply-target", [[message({ eventId: "a", role: "assistant", replyTo: "missing" })]]),
145
+ callThrows("user-with-reply", [[message({ replyTo: "message-1" })]]),
146
+ callThrows("parent-after-assistant", [[
147
+ message({ eventId: "user", messageId: "user", sequence: 5, confirmed: true }),
148
+ message({ eventId: "assistant", messageId: "assistant", role: "assistant", sequence: 4,
149
+ confirmed: true, replyTo: "user" })
150
+ ]]),
151
+ callThrows("malformed-later-event", [[message({}), { eventId: "bad", sequence: -1, kind: "lifecycle", state: "started" }]]),
152
+ callThrows("explicit-undefined-reply", [[message({ replyTo: undefined })]])
153
+ ]);
154
+ }
155
+
156
+ const RECIPES = Object.freeze({
157
+ "cli-double-dash": argsRecipe,
158
+ "workspace-order": workspaceRecipe,
159
+ "backend-frontend-contract-sync": contractRecipe,
160
+ "reconnect-chat-event-order": chatRecipe
161
+ });
162
+
163
+ export function registeredPlatformRecipe(scenarioId) {
164
+ return RECIPES[scenarioId]?.() ?? null;
165
+ }
@@ -0,0 +1,133 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+
4
+ import {
5
+ MEASUREMENT_INVALIDATING_ONLY_STOP_POLICY,
6
+ productionMeasurementInvalidatingRecordIssues
7
+ } from "../packages/piagent-core/benchmark/benchmark-production-completion.js";
8
+ import { productionV3FatalMeasurementEvidence } from "../packages/piagent-core/benchmark/benchmark-claim-restrictions.js";
9
+ import { writeBenchmarkAbort, writePrivateAtomic } from "../packages/piagent-core/benchmark/benchmark-forensics.js";
10
+ import { durablePairedOutcomeFloorStop } from "../packages/piagent-core/benchmark/benchmark-stage-diagnostic.js";
11
+
12
+ function benchmarkFailure(message) {
13
+ const error = new Error(message);
14
+ error.exitCode = 1;
15
+ return error;
16
+ }
17
+
18
+ function productionMeasurementContext(options, suite) {
19
+ return {
20
+ requestedModel: options.model,
21
+ requestedThinking: options.thinking,
22
+ requestedServiceTier: options.serviceTier,
23
+ requireFastServiceTier: suite?.releaseGate?.requireFastServiceTier === true
24
+ };
25
+ }
26
+
27
+ export function applyProductionCampaignStopPolicy(options, spendExecution) {
28
+ const campaignStopPolicy = spendExecution.campaignStopPolicy ?? "paired-outcome-floor";
29
+ if (options.campaignStopPolicy !== undefined && options.campaignStopPolicy !== campaignStopPolicy) {
30
+ throw benchmarkFailure("Production spend control campaign stop policy changed since the original run");
31
+ }
32
+ options.campaignStopPolicy = spendExecution.campaignStopPolicy;
33
+ }
34
+
35
+ export function productionReleaseMeasurementAbortEvidence(options, suite, error) {
36
+ return suite?.id === "production-v3" && options?.measurementOnly !== true
37
+ ? productionV3FatalMeasurementEvidence(error)
38
+ : {};
39
+ }
40
+
41
+ export function writeProductionResumeAbortIfNeeded(resumeState, error) {
42
+ const manifest = resumeState?.manifest;
43
+ if (manifest?.suite?.id !== "production-v3" || manifest.measurementOnly === true
44
+ || fs.existsSync(path.join(resumeState.runRoot, "aborted.json"))) return;
45
+ writeBenchmarkAbort(resumeState.runRoot, {
46
+ runId: manifest.runId,
47
+ completedRuns: resumeState.completedRuns.length,
48
+ expectedRuns: Array.isArray(manifest.order) ? manifest.order.length : 108
49
+ }, error, { ledger: resumeState.ledgerBinding, ...productionV3FatalMeasurementEvidence(error) });
50
+ }
51
+
52
+ export function writeProductionRunAbortIfNeeded({
53
+ fullOrder,
54
+ ledgerBinding,
55
+ manifest,
56
+ options,
57
+ productionSpendControlled,
58
+ runRoot,
59
+ runs,
60
+ suite
61
+ }, error) {
62
+ if (!productionSpendControlled || suite?.id !== "production-v3" || options?.measurementOnly === true
63
+ || fs.existsSync(path.join(runRoot, "aborted.json"))) return;
64
+ writeBenchmarkAbort(runRoot, {
65
+ runId: manifest.runId,
66
+ completedRuns: runs.length,
67
+ expectedRuns: fullOrder.length
68
+ }, error, { ledger: ledgerBinding, ...productionV3FatalMeasurementEvidence(error) });
69
+ }
70
+
71
+ export function assertProductionResumeCompletionState({
72
+ candidateGuard,
73
+ fullOrder,
74
+ options,
75
+ resumeState,
76
+ suite
77
+ }) {
78
+ const { manifest } = resumeState;
79
+ const recoveredTerminalStop = durablePairedOutcomeFloorStop({
80
+ enabled: options.stopAfterFailedPair,
81
+ suite,
82
+ runs: resumeState.completedRuns,
83
+ fullOrder
84
+ });
85
+ if (recoveredTerminalStop) {
86
+ for (const marker of ["paused.json", "stage-diagnostic.json", "interrupted.json", "aborted.json"]) {
87
+ fs.rmSync(path.join(resumeState.runRoot, marker), { force: true });
88
+ }
89
+ writePrivateAtomic(path.join(resumeState.runRoot, "stopped.json"), `${JSON.stringify({
90
+ ...recoveredTerminalStop,
91
+ runId: manifest.runId,
92
+ completedRuns: resumeState.completedRuns.length,
93
+ expectedRuns: fullOrder.length,
94
+ stoppedAt: new Date().toISOString(),
95
+ resumeAllowed: false,
96
+ recoveredFromAcceptedLedger: true,
97
+ ledger: resumeState.ledgerBinding,
98
+ provenanceStamp: candidateGuard.stamp("resume-terminal-floor")
99
+ }, null, 2)}\n`);
100
+ throw benchmarkFailure("Cannot resume benchmark: the accepted ledger already contains a terminal paired outcome-floor failure");
101
+ }
102
+ if (options.campaignStopPolicy !== MEASUREMENT_INVALIDATING_ONLY_STOP_POLICY) return;
103
+ const measurementContext = productionMeasurementContext(options, suite);
104
+ const invalidRecord = resumeState.completedRuns.map((record) => ({
105
+ record,
106
+ issues: productionMeasurementInvalidatingRecordIssues(record, measurementContext)
107
+ })).find((item) => item.issues.length > 0);
108
+ if (!invalidRecord) return;
109
+ const error = Object.assign(benchmarkFailure(
110
+ `Cannot resume benchmark: the accepted ledger contains a measurement-invalidating outcome (${invalidRecord.record.scenarioId}:${invalidRecord.record.surface}:r${invalidRecord.record.repeat}; ${invalidRecord.issues.join(", ")})`
111
+ ), { code: "BENCHMARK_INVALID_MEASUREMENT", measurementInvalidatingIssues: invalidRecord.issues });
112
+ writeBenchmarkAbort(resumeState.runRoot, {
113
+ runId: manifest.runId,
114
+ completedRuns: resumeState.completedRuns.length,
115
+ expectedRuns: fullOrder.length
116
+ }, error, {
117
+ ledger: resumeState.ledgerBinding,
118
+ provenanceStamp: candidateGuard.stamp("resume-invalid-measurement"),
119
+ ...productionV3FatalMeasurementEvidence(error)
120
+ });
121
+ throw error;
122
+ }
123
+
124
+ export function productionMeasurementInvalidatingOutcomeError(options, suite, record) {
125
+ if (options.campaignStopPolicy !== MEASUREMENT_INVALIDATING_ONLY_STOP_POLICY) return null;
126
+ const measurementInvalidatingIssues = productionMeasurementInvalidatingRecordIssues(
127
+ record, productionMeasurementContext(options, suite)
128
+ );
129
+ if (measurementInvalidatingIssues.length === 0) return null;
130
+ return Object.assign(new Error(
131
+ `Measurement-invalidating production-v3 outcome at ${record.scenarioId}:${record.surface}:r${record.repeat} (${measurementInvalidatingIssues.join(", ")})`
132
+ ), { code: "BENCHMARK_INVALID_MEASUREMENT", measurementInvalidatingIssues });
133
+ }
@@ -0,0 +1,159 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ import { BENCHMARK_TRANSPORT_CIRCUIT_POLICY } from "../packages/piagent-core/benchmark/benchmark-forensics.js";
6
+ import { benchmarkEnvironmentPolicy } from "../packages/piagent-core/benchmark/benchmark-runtime.js";
7
+ import { benchmarkCommandIdentity, benchmarkStockCodexIdentity } from "../packages/piagent-core/benchmark/benchmark-runtime-identity.js";
8
+ import { REGISTERED_BENCHMARK_VERIFIER_IDS
9
+ } from "../packages/piagent-core/benchmark/benchmark-suite-identity.js";
10
+ import { scopedBrokerSourceClosureSha256, scopedCommonRuntimeClosureIdentity,
11
+ scopedFrozenQualificationIdentity, scopedToolDefinitionsSha256
12
+ } from "./benchmark-scoped-frozen-qualification.mjs";
13
+ import { frozenRuntimeCommandsForFinalization } from "./benchmark-runner-support.mjs";
14
+
15
+ const runtimeVerifierIds = Object.freeze([
16
+ "bash-runtime", "broker-source-closure", "candidate-source", "common-runtime-closure",
17
+ "controlled-comparison-runtime", "docker-runtime", "git-runtime", "node-runtime", "npm-runtime", "pi-runtime",
18
+ "pi-sdk-tree", "tool-definitions", "webui-asset-tree", "worker-image"
19
+ ]);
20
+ const evidenceOnlyVerifierIds = Object.freeze(REGISTERED_BENCHMARK_VERIFIER_IDS
21
+ .filter(id => !runtimeVerifierIds.includes(id)));
22
+ const verifierFailure = message => { throw Object.assign(new Error(message), { exitCode: 1 }); };
23
+
24
+ export function assertRegisteredRuntimeVerifierBindings(approvedEntries, observedEntries) {
25
+ if (!Array.isArray(approvedEntries)
26
+ || JSON.stringify(approvedEntries.map(item => item?.id)) !== JSON.stringify(REGISTERED_BENCHMARK_VERIFIER_IDS)) {
27
+ verifierFailure("Registered measurement runtime verifier inventory is incomplete or unsupported");
28
+ }
29
+ const approved = new Map(approvedEntries.map(item => [item.id, item.sha256]));
30
+ const observed = observedEntries instanceof Map ? observedEntries : new Map(observedEntries);
31
+ for (const id of runtimeVerifierIds) if (!/^[a-f0-9]{64}$/.test(String(observed.get(id) ?? ""))
32
+ || approved.get(id) !== observed.get(id)) {
33
+ verifierFailure(`Registered measurement runtime verifier mismatch: ${id}`);
34
+ }
35
+ return Object.freeze(runtimeVerifierIds.map(id => Object.freeze({ id, sha256: observed.get(id) })));
36
+ }
37
+
38
+ export function registeredRuntimeVerifierReceipt({ registeredMeasurement, bootstrapMetadata,
39
+ runtimeCommands } = {}) {
40
+ if (!registeredMeasurement) return null;
41
+ const approvedEntries = registeredMeasurement.payload?.resources?.verifiers;
42
+ const common = scopedCommonRuntimeClosureIdentity(), qualification = scopedFrozenQualificationIdentity({
43
+ version: 4,
44
+ candidateRoot: bootstrapMetadata.snapshotRoot,
45
+ assetsRoot: bootstrapMetadata.webUiAssets?.root,
46
+ sdkRoot: runtimeCommands.pi?.packageClosure?.root,
47
+ candidateIndexPath: bootstrapMetadata.candidateIndex?.path,
48
+ candidateIndexSha256: bootstrapMetadata.candidateIndex?.digest
49
+ }, common.sha256);
50
+ let workerImageId;
51
+ try {
52
+ const profile = JSON.parse(fs.readFileSync(path.join(registeredMeasurement.assetRoot,
53
+ "measurement", "node-workload-api-v1.json"), "utf8"));
54
+ workerImageId = profile.workerImage?.id;
55
+ } catch {
56
+ verifierFailure("Registered measurement worker image identity is unavailable");
57
+ }
58
+ if (!/^sha256:[a-f0-9]{64}$/.test(String(workerImageId ?? ""))) {
59
+ verifierFailure("Registered measurement worker image identity is invalid");
60
+ }
61
+ const npm = benchmarkCommandIdentity(path.join(path.dirname(runtimeCommands.node.resolvedPath), "npm"));
62
+ const observed = new Map([
63
+ ["bash-runtime", runtimeCommands.bash?.contentDigest],
64
+ ["broker-source-closure", scopedBrokerSourceClosureSha256()],
65
+ ["candidate-source", qualification.sourceSha256],
66
+ ["common-runtime-closure", qualification.brokerClosureSha256],
67
+ ["controlled-comparison-runtime", runtimeCommands.codex?.contentDigest],
68
+ ["docker-runtime", runtimeCommands.docker?.contentDigest],
69
+ ["git-runtime", runtimeCommands.git?.contentDigest],
70
+ ["node-runtime", runtimeCommands.node?.contentDigest],
71
+ ["npm-runtime", npm.contentDigest],
72
+ ["pi-runtime", runtimeCommands.pi?.contentDigest],
73
+ ["pi-sdk-tree", qualification.sdkTreeSha256],
74
+ ["tool-definitions", scopedToolDefinitionsSha256()],
75
+ ["webui-asset-tree", qualification.assetTreeSha256],
76
+ ["worker-image", workerImageId.slice("sha256:".length)]
77
+ ]);
78
+ const bindings = assertRegisteredRuntimeVerifierBindings(approvedEntries, observed);
79
+ const receipt = { schemaVersion: 1, kind: "registered-runtime-verifier-receipt-v1", outcome: "PASS",
80
+ bindings, evidenceOnlyVerifierIds: [...evidenceOnlyVerifierIds], providerSessionsStarted: 0 };
81
+ return Object.freeze({ ...receipt,
82
+ contentDigest: crypto.createHash("sha256").update(JSON.stringify(receipt)).digest("hex") });
83
+ }
84
+
85
+ export function applyRegisteredMeasurementOptions(options, registeredMeasurement) {
86
+ if (!registeredMeasurement) return false;
87
+ if (options.registeredMeasurement && options.registeredMeasurement !== registeredMeasurement.manifestOrigin) {
88
+ throw Object.assign(new Error("Registered measurement invocation does not match its trusted frozen registration"),
89
+ { exitCode: 1 });
90
+ }
91
+ const payload = registeredMeasurement.payload;
92
+ Object.assign(options, { registeredMeasurement: registeredMeasurement.manifestOrigin,
93
+ suite: payload.baseSuiteId, surfaces: [...payload.matrix.surfaces], model: payload.resources.model,
94
+ thinking: payload.resources.thinking, serviceTier: payload.resources.requestedServiceTier,
95
+ codexMode: "controlled", codexBaseline: "controlled-custom", piagentTreatment: payload.treatment, repeats: payload.matrix.repeats,
96
+ infrastructureRetries: payload.resources.infrastructureRetries, timeoutSeconds: payload.resources.timeoutSeconds,
97
+ stopAfterFailedPair: false, measurementOnly: false });
98
+ return true;
99
+ }
100
+
101
+ export function registeredMeasurementBinding(registeredMeasurement) {
102
+ if (!registeredMeasurement) return null;
103
+ return Object.freeze({ schemaVersion: 1, manifestOrigin: registeredMeasurement.manifestOrigin,
104
+ suiteId: registeredMeasurement.payload.suiteId, payloadSha256: registeredMeasurement.identity.payloadSha256,
105
+ manifestSha256: registeredMeasurement.identity.manifestSha256,
106
+ approvalRecordSha256: registeredMeasurement.identity.approvalRecordSha256,
107
+ approvalId: registeredMeasurement.identity.approvalId,
108
+ authorityKeyId: registeredMeasurement.identity.authorityKeyId,
109
+ publicAssetsDigest: registeredMeasurement.inventory.publicAssetsDigest,
110
+ publicContractDigest: registeredMeasurement.inventory.publicContractDigest,
111
+ assetTreeSha256: registeredMeasurement.tree.contentDigest });
112
+ }
113
+
114
+ export function benchmarkRuntimeCommands({ productionFinalizationOnly, resumeManifest, surfaces,
115
+ piCommand, codexCommand, codexBaseline, dockerCommand, cwd, nodeCommand = process.execPath }) {
116
+ if (productionFinalizationOnly) return frozenRuntimeCommandsForFinalization(resumeManifest, surfaces);
117
+ return { pi: benchmarkCommandIdentity(piCommand, { cwd }),
118
+ codex: surfaces.includes("codex-cli") ? (codexBaseline === "stock"
119
+ ? benchmarkStockCodexIdentity(codexCommand, { cwd }) : benchmarkCommandIdentity(codexCommand, { cwd })) : null,
120
+ ...(dockerCommand ? { docker: benchmarkCommandIdentity(dockerCommand,
121
+ { cwd, fullPackageClosure: false }) } : {}),
122
+ node: benchmarkCommandIdentity(nodeCommand), git: benchmarkCommandIdentity("git"),
123
+ bash: benchmarkCommandIdentity("bash") };
124
+ }
125
+
126
+ export function benchmarkMeasurementConfiguration({ bootstrapMetadata, candidateDigest, suiteDigest,
127
+ runtimeCommands, verificationIdentity, providerWirePlan, productionHostReadinessRequired,
128
+ productionHostReadinessPolicyDigest, productionFinalizationOnly, resumeManifest, rootSeedDigest,
129
+ options, fullOrder }) {
130
+ const environmentPolicy = benchmarkEnvironmentPolicy(), configuration = { schemaVersion: 1,
131
+ source: bootstrapMetadata.sourceIdentity, candidateDigest, suiteDigest,
132
+ runtimeDependencyDigest: bootstrapMetadata.runtimeDependencies?.digest ?? null,
133
+ webUiAssetDigest: bootstrapMetadata.webUiAssets?.digest ?? null, runtimeCommands, environmentPolicy,
134
+ ...(verificationIdentity ? { independentVerification: verificationIdentity } : {}),
135
+ ...(providerWirePlan ? { providerWireProtocol: { version: providerWirePlan.manifest.protocol,
136
+ definitionDigest: providerWirePlan.manifest.definitionDigest, planDigest: providerWirePlan.planDigest } } : {}),
137
+ ...(productionHostReadinessRequired ? { hostReadinessPolicyDigest: productionHostReadinessPolicyDigest } : {}),
138
+ piAgentHome: productionFinalizationOnly ? resumeManifest.piAgentHome?.identity
139
+ : bootstrapMetadata.piAgentHome.identity,
140
+ codexCredential: productionFinalizationOnly ? resumeManifest.codexCredentialIdentity ?? null
141
+ : bootstrapMetadata.codexCredential?.identity ?? null,
142
+ rootSeedDigest, surfaces: options.surfaces, model: options.model ?? null,
143
+ thinking: options.thinking ?? null, serviceTier: options.serviceTier ?? null,
144
+ codexMode: options.codexMode, codexBaseline: options.codexBaseline, piagentTreatment: options.piagentTreatment,
145
+ ...(options.acceptancePolicyBinding ? { acceptancePolicyBinding: options.acceptancePolicyBinding } : {}),
146
+ ...(bootstrapMetadata.treatmentDerivation ? { treatmentDerivation: bootstrapMetadata.treatmentDerivation } : {}),
147
+ allowPiAuthWriteback: options.allowPiAuthWriteback,
148
+ ...(options.budgetControl ? { budgetControl: options.budgetControl } : {}),
149
+ piCredentialVaultId: bootstrapMetadata.piAgentHome.vaultId, timeoutSeconds: options.timeoutSeconds,
150
+ infrastructureRetries: options.infrastructureRetries, retryDelaySeconds: options.retryDelaySeconds,
151
+ transportCircuitBreaker: BENCHMARK_TRANSPORT_CIRCUIT_POLICY,
152
+ stopAfterFailedPair: options.stopAfterFailedPair,
153
+ ...(options.campaignStopPolicy ? { campaignStopPolicy: options.campaignStopPolicy } : {}),
154
+ ...(options.measurementOnly ? { measurementOnly: true } : {}),
155
+ ...(options.failedAttemptsOnly ? { failedAttemptsOnly: true, replaySource: options.replaySource } : {}),
156
+ order: fullOrder.map(item => ({ scenarioId: item.scenario.id, surface: item.surface, repeat: item.repeat })) };
157
+ return Object.freeze({ configuration, environmentPolicy,
158
+ configurationDigest: crypto.createHash("sha256").update(JSON.stringify(configuration)).digest("hex") });
159
+ }