@piagent/platform 1.6.1 → 1.8.0

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 (654) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/model-options.md +20 -15
  175. package/docs/operator-manual-vietnamese.md +12 -12
  176. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  177. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  178. package/docs/piagent-core-improvement-plan.md +528 -0
  179. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  180. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  181. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  182. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  183. package/docs/piagent-open-session-wait.md +19 -0
  184. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  185. package/docs/publishing-for-teams.md +3 -0
  186. package/docs/quality-benchmark.md +128 -8
  187. package/docs/quickstart-vietnamese.md +2 -2
  188. package/docs/release-install-policy.md +38 -11
  189. package/docs/research/harness-next-evidence-review.md +113 -0
  190. package/docs/team-onboarding.md +7 -7
  191. package/docs/third-party-neutrality.md +7 -0
  192. package/docs/usage-observability.md +1 -1
  193. package/docs-site/architecture.html +1 -1
  194. package/docs-site/benchmark.html +1 -1
  195. package/docs-site/commands.html +1 -1
  196. package/docs-site/content/en/runtime.html +1 -1
  197. package/docs-site/content/en/whats-new.html +23 -0
  198. package/docs-site/content/runtime.html +2 -2
  199. package/docs-site/content/whats-new.html +23 -0
  200. package/docs-site/context-engine.html +1 -1
  201. package/docs-site/en/architecture.html +1 -1
  202. package/docs-site/en/benchmark.html +1 -1
  203. package/docs-site/en/commands.html +1 -1
  204. package/docs-site/en/context-engine.html +1 -1
  205. package/docs-site/en/index.html +1 -1
  206. package/docs-site/en/mcp-approval.html +1 -1
  207. package/docs-site/en/mcp-auth.html +1 -1
  208. package/docs-site/en/mcp-servers.html +1 -1
  209. package/docs-site/en/mcp.html +1 -1
  210. package/docs-site/en/permissions.html +1 -1
  211. package/docs-site/en/profiles.html +1 -1
  212. package/docs-site/en/quickstart.html +1 -1
  213. package/docs-site/en/runtime.html +2 -2
  214. package/docs-site/en/scope.html +1 -1
  215. package/docs-site/en/security.html +1 -1
  216. package/docs-site/en/team.html +1 -1
  217. package/docs-site/en/whats-new.html +24 -1
  218. package/docs-site/en/workflows.html +1 -1
  219. package/docs-site/index.html +1 -1
  220. package/docs-site/mcp-approval.html +1 -1
  221. package/docs-site/mcp-auth.html +1 -1
  222. package/docs-site/mcp-servers.html +1 -1
  223. package/docs-site/mcp.html +1 -1
  224. package/docs-site/permissions.html +1 -1
  225. package/docs-site/profiles.html +1 -1
  226. package/docs-site/quickstart.html +1 -1
  227. package/docs-site/runtime.html +3 -3
  228. package/docs-site/scope.html +1 -1
  229. package/docs-site/security.html +1 -1
  230. package/docs-site/team.html +1 -1
  231. package/docs-site/whats-new.html +24 -1
  232. package/docs-site/workflows.html +1 -1
  233. package/evals/architecture-conformance-v1/lane.json +18 -0
  234. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  235. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  236. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  238. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  240. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  241. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  242. package/evals/fixtures/composite-criterion.valid.json +33 -0
  243. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  244. package/evals/fixtures/contract-family-library.valid.json +41 -0
  245. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  246. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  247. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  248. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  252. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  254. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  255. package/evals/fs5-artifact-archive/README.md +32 -0
  256. package/evals/fs5-artifact-archive/manifest.json +148 -0
  257. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  258. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  259. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  260. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  261. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  262. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  263. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  264. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  265. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  266. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  267. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  268. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  269. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  270. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  271. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  272. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  273. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  274. package/evals/fs5-causal-arm.v1.json +9 -5
  275. package/evals/fs5-pilot-protocol.v1.json +1 -1
  276. package/evals/fs5-pilot-protocol.v4.json +4 -4
  277. package/evals/fs5-pilot-protocol.v5.json +6 -5
  278. package/evals/harness-next/development-corpus.mjs +106 -0
  279. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  280. package/evals/harness-next/run-calibration.mjs +83 -0
  281. package/evals/harness-next/run-resource-probe.mjs +55 -0
  282. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  283. package/evals/harness-next.v1.json +51 -0
  284. package/evals/long-horizon-v1/README.md +19 -0
  285. package/evals/long-horizon-v1/runner.mjs +116 -48
  286. package/evals/long-horizon-v1/worker.mjs +77 -30
  287. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  288. package/evals/private-holdout-v1/README.md +5 -2
  289. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  290. package/package.json +9 -4
  291. package/packages/piagent-core/README.md +2 -2
  292. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  293. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  294. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  295. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  296. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  297. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  298. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  299. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  300. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  301. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  303. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  304. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  305. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  306. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  307. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  309. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  310. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  311. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  312. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  313. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  314. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  315. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  317. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  318. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  319. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  320. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  321. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  322. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  323. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  325. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  326. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  328. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  329. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  330. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  331. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  332. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  334. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  335. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  336. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  337. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  338. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  339. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  340. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  341. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  342. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  343. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  344. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  345. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  346. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  347. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  348. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  349. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  350. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  351. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  352. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  354. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  355. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  356. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  357. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  358. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  359. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  360. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  363. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  364. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  365. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  366. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  368. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  369. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  370. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  371. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  372. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  373. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  393. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  394. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  395. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  396. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  397. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  398. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  400. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  401. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  402. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  405. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  406. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  407. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  408. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  409. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  410. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  411. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  412. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  413. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  414. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  415. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  416. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  417. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  418. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  419. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  421. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  422. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  423. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  424. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  425. package/packages/piagent-core/extensions/context-engine.js +11 -6
  426. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  427. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  428. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  429. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  430. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  431. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  432. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  433. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  434. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  435. package/packages/piagent-core/extensions/task-journal.js +48 -3
  436. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  437. package/packages/piagent-core/extensions/task-state.js +74 -38
  438. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  439. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  440. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  441. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  442. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  443. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  444. package/packages/piagent-core/package.json +3 -3
  445. package/packages/piagent-core/policies/base-policy.json +1 -0
  446. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  447. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  448. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  449. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  450. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  451. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  452. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  453. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  454. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  455. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  457. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  458. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  461. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  462. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  463. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  464. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  465. package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
  466. package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
  467. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  468. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  469. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  470. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  471. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  472. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  473. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  474. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  475. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  476. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  477. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  478. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  479. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  480. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  481. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  482. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  483. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  484. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  485. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  486. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  487. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  488. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  489. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  490. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  491. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  492. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  493. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  494. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  495. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  496. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  497. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  498. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  499. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  500. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  501. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  502. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  503. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  504. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  505. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  506. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  507. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  508. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  509. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  510. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  511. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  512. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  513. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  514. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  515. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  516. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  517. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  518. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  519. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  520. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  521. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  522. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  523. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  524. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  525. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  526. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  527. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  528. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  529. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  530. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  531. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  532. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  533. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  534. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  535. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
  536. package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
  537. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  538. package/packages/piagent-webui/dist/client/index.html +2 -2
  539. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  540. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  541. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  542. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  543. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  544. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  545. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  546. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  547. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  548. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  549. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  550. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  551. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  552. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  553. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  554. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  555. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  556. package/packages/piagent-webui/gateway/session-inspection-registry.ts +14 -6
  557. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  558. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  559. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  560. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  561. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  562. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  563. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  564. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  565. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  566. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  567. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  568. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  569. package/schemas/approved-host-contracts.schema.json +973 -0
  570. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  571. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  572. package/schemas/composite-criterion.schema.json +788 -0
  573. package/schemas/contract-family-library.schema.json +28 -0
  574. package/schemas/contract-selection-recipe.schema.json +31 -0
  575. package/schemas/failure-evidence.schema.json +2 -2
  576. package/schemas/helper-request.schema.json +16 -4
  577. package/schemas/host-contract-plan.schema.json +25 -0
  578. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  579. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  580. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  581. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  582. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  583. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  584. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  585. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  586. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  587. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  588. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  589. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  590. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  591. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  592. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  593. package/schemas/task-contract.schema.json +30 -0
  594. package/scripts/approve-independent-verification.mjs +57 -0
  595. package/scripts/benchmark-arm-observer.mjs +320 -0
  596. package/scripts/benchmark-budget-ipc.mjs +34 -0
  597. package/scripts/benchmark-budget-launcher.mjs +91 -0
  598. package/scripts/benchmark-budget-processes.mjs +133 -0
  599. package/scripts/benchmark-budget-publication.mjs +228 -0
  600. package/scripts/benchmark-budget-runtime.mjs +136 -0
  601. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  602. package/scripts/benchmark-codex-journey.mjs +406 -0
  603. package/scripts/benchmark-independent-verification.mjs +628 -0
  604. package/scripts/benchmark-journey-outcome.mjs +92 -0
  605. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  606. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  607. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  608. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  609. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  610. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  611. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  612. package/scripts/benchmark-runner-completion.mjs +133 -0
  613. package/scripts/benchmark-runner-configuration.mjs +159 -0
  614. package/scripts/benchmark-runner-core.mjs +217 -388
  615. package/scripts/benchmark-runner-finalization.mjs +140 -27
  616. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  617. package/scripts/benchmark-runner-schedule.mjs +256 -0
  618. package/scripts/benchmark-runner-support.mjs +136 -4
  619. package/scripts/benchmark-runner.mjs +95 -18
  620. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  621. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  622. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  623. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  624. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  625. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  626. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  627. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  628. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  629. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  630. package/scripts/benchmark-session-evaluator.mjs +169 -0
  631. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  632. package/scripts/benchmark-session-usage.mjs +28 -0
  633. package/scripts/benchmark-session.mjs +343 -50
  634. package/scripts/benchmark-webui-journey.mjs +678 -0
  635. package/scripts/check-public-wording.mjs +46 -0
  636. package/scripts/configure-model-scope.sh +6 -2
  637. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  638. package/scripts/install-global.sh +2 -2
  639. package/scripts/model-route-evaluation-core.ts +1 -0
  640. package/scripts/phase-tools-evaluation.mjs +1 -0
  641. package/scripts/pi-auto.sh +7 -1
  642. package/scripts/pi-model-route.mjs +1 -1
  643. package/scripts/pi-usage-history.mjs +201 -11
  644. package/scripts/piagent-cli.mjs +8 -0
  645. package/scripts/private-holdout-readiness.mjs +7 -1
  646. package/scripts/public-evaluation-exposure.mjs +140 -0
  647. package/scripts/select-independent-verification.mjs +62 -0
  648. package/scripts/setup.sh +2 -2
  649. package/scripts/typescript-loader.mjs +135 -1
  650. package/scripts/update-global.mjs +6 -7
  651. package/scripts/verify-local.sh +37 -56
  652. package/scripts/verify-release-identity.mjs +5 -3
  653. package/templates/global/settings.json +5 -1
  654. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -0,0 +1,592 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ import {
6
+ appendBenchmarkLedger,
7
+ benchmarkLedgerCheckpoint,
8
+ emptyBenchmarkLedgerBinding,
9
+ inspectBenchmarkLedger
10
+ } from "./benchmark-ledger.js";
11
+ import { acquireBenchmarkRunLock } from "./benchmark-run-lock.js";
12
+ import { exactBenchmarkAttemptUsage } from "./benchmark-usage.js";
13
+ import { writePrivateAtomic } from "./benchmark-forensics.js";
14
+
15
+ const TOKEN_FIELDS = Object.freeze(["input", "output", "cacheRead", "cacheWrite", "reasoning", "fresh", "total"]);
16
+ const CAMPAIGN_STATUSES = new Set([
17
+ "active", "claim-sealed", "claim-passed", "no-claim", "superseded-before-provider-start",
18
+ "superseded-changed-lineage-no-claim", "complete"
19
+ ]);
20
+ const CLAIM_READY_STATUSES = new Set(["claim-sealed", "claim-passed"]);
21
+ const PUBLIC_SURFACES = new Set(["raw-pi", "piagent", "codex-cli"]);
22
+ const MAX_RETAINED_CAMPAIGNS = 1_000;
23
+
24
+ function fail(message) {
25
+ const error = new Error(message);
26
+ error.code = "BENCHMARK_CAMPAIGN_INVALID";
27
+ error.exitCode = 1;
28
+ throw error;
29
+ }
30
+
31
+ function privateDirectory(target) {
32
+ fs.mkdirSync(target, { recursive: true, mode: 0o700 });
33
+ try { fs.chmodSync(target, 0o700); } catch { /* Non-POSIX filesystem. */ }
34
+ return target;
35
+ }
36
+
37
+ function readJson(file, label) {
38
+ try { return JSON.parse(fs.readFileSync(file, "utf8")); }
39
+ catch (error) { fail(`Cannot read ${label} ${file}: ${error.message}`); }
40
+ }
41
+
42
+ function canonicalPath(target) {
43
+ const suffix = [];
44
+ let current = path.resolve(target);
45
+ while (!fs.existsSync(current)) {
46
+ suffix.unshift(path.basename(current));
47
+ const parent = path.dirname(current);
48
+ if (parent === current) fail(`Cannot resolve campaign path ${target}`);
49
+ current = parent;
50
+ }
51
+ return path.join(fs.realpathSync(current), ...suffix);
52
+ }
53
+
54
+ function inside(root, target) {
55
+ const relative = path.relative(root, target);
56
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
57
+ }
58
+
59
+ function campaignId(suiteId) {
60
+ const timestamp = new Date().toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
61
+ return `${suiteId}-${timestamp}-${crypto.randomBytes(6).toString("hex")}`;
62
+ }
63
+
64
+ function validIdentity(value) {
65
+ const validClaimOutcome = value?.claimOutcome == null
66
+ || (typeof value.claimOutcome === "object"
67
+ && typeof value.claimOutcome.allowed === "boolean"
68
+ && typeof value.claimOutcome.reason === "string"
69
+ && typeof value.claimOutcome.finalizedAt === "string");
70
+ return value?.schemaVersion === 1
71
+ && typeof value.campaignId === "string" && value.campaignId.length > 0
72
+ && typeof value.suiteId === "string" && value.suiteId.length > 0
73
+ && typeof value.runId === "string" && value.runId.length > 0
74
+ && typeof value.runRoot === "string" && path.isAbsolute(value.runRoot)
75
+ && typeof value.campaignRoot === "string" && path.isAbsolute(value.campaignRoot)
76
+ && CAMPAIGN_STATUSES.has(value.status)
77
+ && validClaimOutcome
78
+ && (value.status !== "claim-passed" || value.claimOutcome?.allowed === true)
79
+ && (!["no-claim", "superseded-changed-lineage-no-claim"].includes(value.status) || value.claimOutcome?.allowed === false)
80
+ && ["configurationDigest", "candidateDigest", "suiteDigest"].every((field) => /^[a-f0-9]{64}$/.test(String(value[field] ?? "")));
81
+ }
82
+
83
+ function sameClaimLineage(left, right) {
84
+ return ["suiteId", "configurationDigest", "candidateDigest", "suiteDigest"]
85
+ .every((field) => left?.[field] === right?.[field]);
86
+ }
87
+
88
+ function identityMatches(left, right) {
89
+ return ["campaignId", "suiteId", "runId", "runRoot", "campaignRoot", "configurationDigest", "candidateDigest", "suiteDigest"]
90
+ .every((field) => left?.[field] === right?.[field]);
91
+ }
92
+
93
+ function eventIdentity(event) {
94
+ return {
95
+ attemptId: event?.attemptId,
96
+ orderIndex: event?.orderIndex,
97
+ scenarioId: event?.scenarioId,
98
+ surface: event?.surface,
99
+ repeat: event?.repeat,
100
+ infrastructureAttempt: event?.infrastructureAttempt
101
+ };
102
+ }
103
+
104
+ function comparableAttempt(value) {
105
+ return [value?.attemptId, value?.orderIndex, value?.scenarioId, value?.surface, value?.repeat, value?.infrastructureAttempt];
106
+ }
107
+
108
+ function attemptCoordinate(value) {
109
+ return JSON.stringify(comparableAttempt({ ...value, attemptId: undefined }).slice(1));
110
+ }
111
+
112
+ function validAttemptIdentity(event) {
113
+ return typeof event?.attemptId === "string" && event.attemptId.length > 0
114
+ && Number.isSafeInteger(event.orderIndex) && event.orderIndex > 0
115
+ && typeof event.scenarioId === "string" && event.scenarioId.length > 0
116
+ && typeof event.surface === "string" && event.surface.length > 0
117
+ && Number.isSafeInteger(event.repeat) && event.repeat > 0
118
+ && Number.isSafeInteger(event.infrastructureAttempt) && event.infrastructureAttempt > 0;
119
+ }
120
+
121
+ function emptyTokens() {
122
+ return Object.fromEntries(TOKEN_FIELDS.map((field) => [field, 0]));
123
+ }
124
+
125
+ function addTokens(target, source) {
126
+ for (const field of TOKEN_FIELDS) target[field] += Number(source?.[field] ?? 0);
127
+ }
128
+
129
+ function publicClaimOutcome(value) {
130
+ if (!value || typeof value !== "object" || typeof value.allowed !== "boolean") return null;
131
+ const reason = /^[a-z0-9:._-]{1,240}$/i.test(String(value.reason ?? ""))
132
+ ? value.reason
133
+ : "private-or-invalid-reason-withheld";
134
+ const finalizedAt = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(String(value.finalizedAt ?? ""))
135
+ ? value.finalizedAt
136
+ : null;
137
+ return {
138
+ allowed: value.allowed,
139
+ reason,
140
+ finalizedAt
141
+ };
142
+ }
143
+
144
+ function publicPriorCampaignHistory(value) {
145
+ if (!value || typeof value !== "object") return emptyPriorHistory();
146
+ const number = (field) => Number.isSafeInteger(value[field]) && value[field] >= 0 ? value[field] : 0;
147
+ const tokens = Object.fromEntries(TOKEN_FIELDS.map((field) => [field,
148
+ Number.isFinite(value.knownExactTokens?.[field]) && value.knownExactTokens[field] >= 0
149
+ ? value.knownExactTokens[field]
150
+ : 0]));
151
+ const bySurface = {};
152
+ for (const [surface, bucket] of Object.entries(value.bySurface ?? {})) {
153
+ if (!PUBLIC_SURFACES.has(surface)) continue;
154
+ bySurface[surface] = {
155
+ attempts: Number.isSafeInteger(bucket?.attempts) && bucket.attempts >= 0 ? bucket.attempts : 0,
156
+ tokens: Object.fromEntries(TOKEN_FIELDS.map((field) => [field,
157
+ Number.isFinite(bucket?.tokens?.[field]) && bucket.tokens[field] >= 0 ? bucket.tokens[field] : 0]))
158
+ };
159
+ }
160
+ const entries = Array.isArray(value.entries) ? value.entries.slice(0, MAX_RETAINED_CAMPAIGNS).map((entry) => ({
161
+ campaignId: /^[a-z0-9._-]{1,240}$/i.test(String(entry?.campaignId ?? "")) ? entry.campaignId : "withheld",
162
+ candidateDigest: /^[a-f0-9]{64}$/.test(String(entry?.candidateDigest ?? "")) ? entry.candidateDigest : null,
163
+ configurationDigest: /^[a-f0-9]{64}$/.test(String(entry?.configurationDigest ?? "")) ? entry.configurationDigest : null,
164
+ suiteDigest: /^[a-f0-9]{64}$/.test(String(entry?.suiteDigest ?? "")) ? entry.suiteDigest : null,
165
+ status: CAMPAIGN_STATUSES.has(entry?.status) ? entry.status : "no-claim",
166
+ claimOutcome: publicClaimOutcome(entry?.claimOutcome),
167
+ providerStartedAttempts: Number.isSafeInteger(entry?.providerStartedAttempts) && entry.providerStartedAttempts >= 0 ? entry.providerStartedAttempts : 0,
168
+ exactAttempts: Number.isSafeInteger(entry?.exactAttempts) && entry.exactAttempts >= 0 ? entry.exactAttempts : 0,
169
+ unknownAttempts: Number.isSafeInteger(entry?.unknownAttempts) && entry.unknownAttempts >= 0 ? entry.unknownAttempts : 0,
170
+ knownExactFreshTokens: Number.isFinite(entry?.knownExactFreshTokens) && entry.knownExactFreshTokens >= 0 ? entry.knownExactFreshTokens : 0,
171
+ exactUsageComplete: entry?.exactUsageComplete === true
172
+ })) : [];
173
+ return {
174
+ schemaVersion: 1,
175
+ campaigns: number("campaigns"),
176
+ paidCampaigns: number("paidCampaigns"),
177
+ claimPassedCampaigns: number("claimPassedCampaigns"),
178
+ noClaimCampaigns: number("noClaimCampaigns"),
179
+ providerStartedAttempts: number("providerStartedAttempts"),
180
+ exactAttempts: number("exactAttempts"),
181
+ unknownAttempts: number("unknownAttempts"),
182
+ exactUsageComplete: value.exactUsageComplete === true,
183
+ knownExactTokens: tokens,
184
+ bySurface,
185
+ entries
186
+ };
187
+ }
188
+
189
+ function emptyPriorHistory() {
190
+ return {
191
+ schemaVersion: 1,
192
+ campaigns: 0,
193
+ paidCampaigns: 0,
194
+ claimPassedCampaigns: 0,
195
+ noClaimCampaigns: 0,
196
+ providerStartedAttempts: 0,
197
+ exactAttempts: 0,
198
+ unknownAttempts: 0,
199
+ exactUsageComplete: true,
200
+ knownExactTokens: emptyTokens(),
201
+ bySurface: {},
202
+ entries: []
203
+ };
204
+ }
205
+
206
+ function appendHistoryEvidence(history, evidence) {
207
+ history.campaigns += 1;
208
+ if (evidence.providerStartedAttempts > 0) history.paidCampaigns += 1;
209
+ if (evidence.status === "claim-passed") history.claimPassedCampaigns += 1;
210
+ if (["no-claim", "superseded-changed-lineage-no-claim", "complete"].includes(evidence.status)) {
211
+ history.noClaimCampaigns += 1;
212
+ }
213
+ history.providerStartedAttempts += evidence.providerStartedAttempts;
214
+ history.exactAttempts += evidence.allAttempts.exactAttempts;
215
+ history.unknownAttempts += evidence.allAttempts.unknownAttempts;
216
+ history.exactUsageComplete &&= evidence.allAttempts.complete === true;
217
+ addTokens(history.knownExactTokens, evidence.allAttempts.tokens);
218
+ for (const [surface, bucket] of Object.entries(evidence.allAttempts.bySurface ?? {})) {
219
+ const target = history.bySurface[surface] ?? { attempts: 0, tokens: emptyTokens() };
220
+ target.attempts += Number(bucket?.attempts ?? 0);
221
+ addTokens(target.tokens, bucket?.tokens);
222
+ history.bySurface[surface] = target;
223
+ }
224
+ history.entries.push({
225
+ campaignId: evidence.campaignId,
226
+ candidateDigest: evidence.candidateDigest,
227
+ configurationDigest: evidence.configurationDigest,
228
+ suiteDigest: evidence.suiteDigest,
229
+ status: evidence.status,
230
+ claimOutcome: publicClaimOutcome(evidence.claimOutcome),
231
+ providerStartedAttempts: evidence.providerStartedAttempts,
232
+ exactAttempts: evidence.allAttempts.exactAttempts,
233
+ unknownAttempts: evidence.allAttempts.unknownAttempts,
234
+ knownExactFreshTokens: evidence.allAttempts.tokens.fresh,
235
+ exactUsageComplete: evidence.allAttempts.complete === true
236
+ });
237
+ }
238
+
239
+ /** Exact provider attempts represented by the accepted run ledger, including failed attempts. */
240
+ export function productionCampaignExpectedAttempts(runs) {
241
+ return (runs ?? []).flatMap((run) => [
242
+ ...(run.infrastructureFailures ?? []).map((failure) => ({
243
+ attemptId: failure.attemptId, orderIndex: run.orderIndex, scenarioId: run.scenarioId,
244
+ surface: run.surface, repeat: run.repeat, infrastructureAttempt: failure.attempt
245
+ })),
246
+ { attemptId: run.attemptId, orderIndex: run.orderIndex, scenarioId: run.scenarioId,
247
+ surface: run.surface, repeat: run.repeat, infrastructureAttempt: run.infrastructureAttempt }
248
+ ]);
249
+ }
250
+
251
+ export function productionCampaignAttemptCoverage(expected, evidence) {
252
+ return Array.isArray(expected) && expected.length > 0
253
+ && Array.isArray(evidence?.attempts) && evidence.attempts.length === expected.length
254
+ && expected.every((attempt, index) => JSON.stringify(comparableAttempt(attempt)) === JSON.stringify(comparableAttempt(evidence.attempts[index]))
255
+ && evidence.attempts[index].returned === true && evidence.attempts[index].exactUsage === true);
256
+ }
257
+
258
+ /** Strip private filesystem lineage while retaining public claim-verification evidence. */
259
+ export function publicProductionBenchmarkCampaignEvidence(evidence) {
260
+ if (!evidence || typeof evidence !== "object") return evidence;
261
+ const publicEvidence = {
262
+ ...evidence,
263
+ claimOutcome: publicClaimOutcome(evidence.claimOutcome),
264
+ priorCampaignHistory: publicPriorCampaignHistory(evidence.priorCampaignHistory)
265
+ };
266
+ delete publicEvidence.runRoot;
267
+ delete publicEvidence.campaignRoot;
268
+ return publicEvidence;
269
+ }
270
+
271
+ /** Validate the append-only start/settlement ledger and build claim accounting. */
272
+ export function inspectProductionBenchmarkCampaign({ manifest, ledger }) {
273
+ const issues = [];
274
+ const starts = new Map();
275
+ const startCoordinates = new Map();
276
+ const settled = new Map();
277
+ const tokens = emptyTokens();
278
+ const bySurface = {};
279
+ let exactAttempts = 0;
280
+ for (const [index, event] of ledger.records.entries()) {
281
+ if (event?.schemaVersion !== 1 || event.campaignId !== manifest.campaignId || event.runId !== manifest.runId
282
+ || !validAttemptIdentity(event) || !["provider-started", "provider-returned"].includes(event.event)) {
283
+ issues.push(`malformed-or-foreign-event:${index + 1}`);
284
+ continue;
285
+ }
286
+ const priorStart = starts.get(event.attemptId);
287
+ if (event.event === "provider-started") {
288
+ if (priorStart) issues.push(`duplicate-provider-start:${event.attemptId}`);
289
+ else {
290
+ const coordinate = attemptCoordinate(event);
291
+ if (startCoordinates.has(coordinate)) issues.push(`duplicate-provider-coordinate:${event.attemptId}`);
292
+ else startCoordinates.set(coordinate, event.attemptId);
293
+ starts.set(event.attemptId, event);
294
+ }
295
+ continue;
296
+ }
297
+ if (!priorStart) issues.push(`provider-returned-without-start:${event.attemptId}`);
298
+ else if (JSON.stringify(eventIdentity(priorStart)) !== JSON.stringify(eventIdentity(event))) {
299
+ issues.push(`provider-returned-identity-mismatch:${event.attemptId}`);
300
+ }
301
+ if (settled.has(event.attemptId)) issues.push(`duplicate-provider-returned:${event.attemptId}`);
302
+ else settled.set(event.attemptId, event);
303
+ }
304
+ for (const [attemptId, start] of starts) {
305
+ const returned = settled.get(attemptId);
306
+ const exact = returned && exactBenchmarkAttemptUsage(returned.usage, returned.usageStatus);
307
+ if (!exact) continue;
308
+ exactAttempts += 1;
309
+ const surface = bySurface[start.surface] ?? { attempts: 0, tokens: emptyTokens() };
310
+ surface.attempts += 1;
311
+ for (const field of TOKEN_FIELDS) {
312
+ tokens[field] += returned.usage[field];
313
+ surface.tokens[field] += returned.usage[field];
314
+ }
315
+ bySurface[start.surface] = surface;
316
+ }
317
+ const providerStartedAttempts = starts.size;
318
+ const unknownAttempts = providerStartedAttempts - exactAttempts;
319
+ const ledgerExact = issues.length === 0 && ledger.binding.records === manifest.attemptLedger.records;
320
+ const allAttempts = {
321
+ attempts: providerStartedAttempts,
322
+ exactAttempts,
323
+ unknownAttempts,
324
+ complete: ledgerExact && unknownAttempts === 0 && settled.size === providerStartedAttempts,
325
+ tokens,
326
+ bySurface: Object.fromEntries(Object.entries(bySurface).sort(([left], [right]) => left.localeCompare(right))),
327
+ ledgerExact,
328
+ ledgerIssues: issues
329
+ };
330
+ const attempts = [...starts.values()].map((start) => ({
331
+ ...eventIdentity(start),
332
+ returned: settled.has(start.attemptId),
333
+ exactUsage: exactBenchmarkAttemptUsage(settled.get(start.attemptId)?.usage, settled.get(start.attemptId)?.usageStatus)
334
+ }));
335
+ return {
336
+ schemaVersion: 1,
337
+ required: true,
338
+ campaignId: manifest.campaignId,
339
+ runId: manifest.runId,
340
+ runRoot: manifest.runRoot,
341
+ campaignRoot: manifest.campaignRoot,
342
+ configurationDigest: manifest.configurationDigest,
343
+ candidateDigest: manifest.candidateDigest,
344
+ suiteDigest: manifest.suiteDigest,
345
+ status: manifest.status,
346
+ claimOutcome: manifest.claimOutcome ?? null,
347
+ exactOutputLineage: true,
348
+ providerStartedAttempts,
349
+ settledAttempts: settled.size,
350
+ unknownAttempts,
351
+ attempts,
352
+ attemptLedger: ledger.binding,
353
+ allAttempts,
354
+ complete: allAttempts.complete,
355
+ claimReady: allAttempts.complete && CLAIM_READY_STATUSES.has(manifest.status),
356
+ priorCampaignHistory: manifest.priorCampaignHistory ?? emptyPriorHistory(),
357
+ passed: allAttempts.complete && !String(manifest.status).startsWith("superseded-")
358
+ };
359
+ }
360
+
361
+ function loadCampaign(campaignRoot) {
362
+ const manifestPath = path.join(campaignRoot, "campaign.json");
363
+ const manifest = readJson(manifestPath, "production benchmark campaign");
364
+ if (!validIdentity(manifest) || canonicalPath(manifest.campaignRoot) !== canonicalPath(campaignRoot)) {
365
+ fail("Production benchmark campaign identity is malformed or relocated");
366
+ }
367
+ const ledgerPath = path.join(campaignRoot, "attempts.jsonl");
368
+ const ledger = benchmarkLedgerCheckpoint(manifest.attemptLedger, inspectBenchmarkLedger(ledgerPath), "production campaign attempt ledger");
369
+ if (ledger.recovered) {
370
+ manifest.attemptLedger = ledger.binding;
371
+ writePrivateAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
372
+ }
373
+ return { manifest, manifestPath, ledgerPath, ledger };
374
+ }
375
+
376
+ function loadRetainedCampaigns(registryRoot, excludeCampaignId = null) {
377
+ const canonicalRegistryRoot = canonicalPath(registryRoot);
378
+ const entries = fs.readdirSync(registryRoot, { withFileTypes: true })
379
+ .filter((entry) => entry.isDirectory())
380
+ .sort((left, right) => left.name.localeCompare(right.name));
381
+ if (entries.length > MAX_RETAINED_CAMPAIGNS) fail("Production benchmark campaign history exceeds its inspection limit");
382
+ const retained = [];
383
+ for (const entry of entries) {
384
+ if (entry.name === excludeCampaignId) continue;
385
+ const campaignRoot = path.join(registryRoot, entry.name);
386
+ if (!fs.existsSync(path.join(campaignRoot, "campaign.json"))) continue;
387
+ if (!inside(canonicalRegistryRoot, canonicalPath(campaignRoot))) {
388
+ fail("Retained production campaign path escapes its registry");
389
+ }
390
+ retained.push(loadCampaign(campaignRoot));
391
+ }
392
+ return retained;
393
+ }
394
+
395
+ function retainedCampaignHistory(registryRoot, excludeCampaignId = null) {
396
+ const history = emptyPriorHistory();
397
+ for (const loaded of loadRetainedCampaigns(registryRoot, excludeCampaignId)) {
398
+ appendHistoryEvidence(history, inspectProductionBenchmarkCampaign(loaded));
399
+ }
400
+ history.bySurface = Object.fromEntries(Object.entries(history.bySurface).sort(([left], [right]) => left.localeCompare(right)));
401
+ history.entries.sort((left, right) => left.campaignId.localeCompare(right.campaignId));
402
+ return history;
403
+ }
404
+
405
+ function publicBinding(manifest) {
406
+ return Object.fromEntries(["schemaVersion", "campaignId", "suiteId", "runId", "runRoot", "campaignRoot", "configurationDigest", "candidateDigest", "suiteDigest"]
407
+ .map((field) => [field, manifest[field]]));
408
+ }
409
+
410
+ /**
411
+ * Reserve or resume one durable paid lineage for a production suite. The same
412
+ * candidate/configuration must resume exact output; changed lineage retains and
413
+ * explicitly supersedes prior paid evidence without merging it into a new claim.
414
+ */
415
+ export function openProductionBenchmarkCampaign({ registryBase, suiteId, runId, runRoot, configurationDigest, candidateDigest, suiteDigest, existingBinding }) {
416
+ if (!/^[a-z0-9][a-z0-9._-]{0,119}$/i.test(String(suiteId ?? ""))) {
417
+ fail("Production benchmark campaign suite id is malformed");
418
+ }
419
+ if (typeof runId !== "string" || !runId || typeof runRoot !== "string" || !path.isAbsolute(runRoot)) {
420
+ fail("Production benchmark campaign run identity is malformed");
421
+ }
422
+ if (![configurationDigest, candidateDigest, suiteDigest].every((digest) => /^[a-f0-9]{64}$/.test(String(digest ?? "")))) {
423
+ fail("Production benchmark campaign digest binding is malformed");
424
+ }
425
+ const registryRoot = privateDirectory(path.join(registryBase, suiteId));
426
+ const release = acquireBenchmarkRunLock(registryRoot, `campaign:${suiteId}`);
427
+ try {
428
+ const activePath = path.join(registryRoot, "active.json");
429
+ const active = fs.existsSync(activePath) ? readJson(activePath, "active production benchmark campaign") : null;
430
+ let loaded;
431
+ if (existingBinding) {
432
+ if (!validIdentity({ ...existingBinding, status: "active" })) fail("Run manifest has a malformed production campaign binding");
433
+ if (!active || active.campaignId !== existingBinding.campaignId || active.campaignRoot !== existingBinding.campaignRoot) {
434
+ fail("Production campaign active binding changed; exact output/resume lineage is required");
435
+ }
436
+ loaded = loadCampaign(existingBinding.campaignRoot);
437
+ const expected = { ...existingBinding, runRoot: canonicalPath(runRoot) };
438
+ if (!identityMatches(loaded.manifest, expected)) fail("Production campaign does not match the resumed run lineage");
439
+ } else {
440
+ const nextLineage = { suiteId, configurationDigest, candidateDigest, suiteDigest };
441
+ const paidSameLineage = loadRetainedCampaigns(registryRoot).find((campaign) => {
442
+ const evidence = inspectProductionBenchmarkCampaign(campaign);
443
+ return evidence.providerStartedAttempts > 0
444
+ && sameClaimLineage(campaign.manifest, nextLineage)
445
+ && campaign.manifest.status !== "claim-passed";
446
+ });
447
+ if (paidSameLineage) {
448
+ fail(`Production benchmark already has a paid campaign at ${paidSameLineage.manifest.runRoot}; resume that exact output instead of starting a fresh campaign`);
449
+ }
450
+ if (active) {
451
+ if (typeof active.campaignRoot !== "string" || !inside(canonicalPath(registryRoot), canonicalPath(active.campaignRoot))) {
452
+ fail("Active production campaign pointer is malformed or escapes its registry");
453
+ }
454
+ const prior = loadCampaign(active.campaignRoot);
455
+ const evidence = inspectProductionBenchmarkCampaign(prior);
456
+ if (evidence.providerStartedAttempts === 0) {
457
+ prior.manifest.status = "superseded-before-provider-start";
458
+ writePrivateAtomic(prior.manifestPath, `${JSON.stringify(prior.manifest, null, 2)}\n`);
459
+ } else if (!sameClaimLineage(prior.manifest, nextLineage)
460
+ && ["active", "claim-sealed", "complete"].includes(prior.manifest.status)) {
461
+ prior.manifest.status = "superseded-changed-lineage-no-claim";
462
+ prior.manifest.claimOutcome = {
463
+ allowed: false,
464
+ reason: "candidate-or-configuration-changed",
465
+ finalizedAt: new Date().toISOString()
466
+ };
467
+ prior.manifest.supersededBy = { candidateDigest, configurationDigest, suiteDigest };
468
+ writePrivateAtomic(prior.manifestPath, `${JSON.stringify(prior.manifest, null, 2)}\n`);
469
+ }
470
+ }
471
+ const id = campaignId(suiteId);
472
+ const campaignRoot = privateDirectory(path.join(registryRoot, id));
473
+ const priorCampaignHistory = retainedCampaignHistory(registryRoot, id);
474
+ const manifest = {
475
+ schemaVersion: 1, campaignId: id, suiteId, runId, runRoot: canonicalPath(runRoot), campaignRoot,
476
+ configurationDigest, candidateDigest, suiteDigest, status: "active", createdAt: new Date().toISOString(),
477
+ completedAt: null, claimOutcome: null, priorCampaignHistory, attemptLedger: emptyBenchmarkLedgerBinding()
478
+ };
479
+ const manifestPath = path.join(campaignRoot, "campaign.json");
480
+ writePrivateAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
481
+ writePrivateAtomic(activePath, `${JSON.stringify({ schemaVersion: 1, campaignId: id, campaignRoot }, null, 2)}\n`);
482
+ loaded = { manifest, manifestPath, ledgerPath: path.join(campaignRoot, "attempts.jsonl"), ledger: { binding: manifest.attemptLedger, records: [] } };
483
+ }
484
+
485
+ let ledger = loaded.ledger;
486
+ const append = (event) => {
487
+ const record = { schemaVersion: 1, campaignId: loaded.manifest.campaignId, runId: loaded.manifest.runId, ...event, recordedAt: new Date().toISOString() };
488
+ loaded.manifest.attemptLedger = appendBenchmarkLedger(loaded.ledgerPath, record, loaded.manifest.attemptLedger);
489
+ writePrivateAtomic(loaded.manifestPath, `${JSON.stringify(loaded.manifest, null, 2)}\n`);
490
+ ledger = { binding: loaded.manifest.attemptLedger, records: [...ledger.records, record] };
491
+ };
492
+ const assertWritable = () => {
493
+ if (loaded.manifest.status !== "active") fail("Production benchmark campaign is no longer writable");
494
+ };
495
+ return {
496
+ binding: publicBinding(loaded.manifest),
497
+ providerStarted(identity) {
498
+ assertWritable();
499
+ append({ ...eventIdentity(identity), event: "provider-started" });
500
+ if (!this.snapshot().allAttempts.ledgerExact) fail("Production campaign rejected a duplicate or malformed provider-start identity");
501
+ },
502
+ providerReturned(value) {
503
+ assertWritable();
504
+ append({ ...eventIdentity(value), event: "provider-returned", usage: value?.usage, usageStatus: value?.usageStatus });
505
+ if (!this.snapshot().allAttempts.ledgerExact) fail("Production campaign rejected a duplicate, unmatched, or malformed provider-return identity");
506
+ },
507
+ snapshot() { return inspectProductionBenchmarkCampaign({ manifest: loaded.manifest, ledger }); },
508
+ sealForClaim(runs) {
509
+ const evidence = this.snapshot();
510
+ if (["claim-passed", "no-claim"].includes(loaded.manifest.status)) return evidence;
511
+ if (!evidence.passed) fail("Production campaign cannot be sealed with unknown, lower-bound, unmatched, or malformed provider attempts");
512
+ const expected = productionCampaignExpectedAttempts(runs);
513
+ if (!productionCampaignAttemptCoverage(expected, evidence)) {
514
+ fail("Production campaign cannot be sealed because its provider attempts do not exactly match the accepted run ledger");
515
+ }
516
+ if (loaded.manifest.status === "claim-sealed") return evidence;
517
+ if (loaded.manifest.status !== "active") fail("Production benchmark campaign is no longer sealable");
518
+ loaded.manifest.status = "claim-sealed";
519
+ loaded.manifest.sealedAt = new Date().toISOString();
520
+ writePrivateAtomic(loaded.manifestPath, `${JSON.stringify(loaded.manifest, null, 2)}\n`);
521
+ return this.snapshot();
522
+ },
523
+ finalizeClaim({ allowed, reason }) {
524
+ if (typeof allowed !== "boolean" || typeof reason !== "string" || !reason.trim()) {
525
+ fail("Production campaign claim outcome is malformed");
526
+ }
527
+ if (["claim-passed", "no-claim"].includes(loaded.manifest.status)) {
528
+ if (loaded.manifest.claimOutcome?.allowed !== allowed) fail("Production campaign claim outcome changed after finalization");
529
+ return this.snapshot();
530
+ }
531
+ if (loaded.manifest.status !== "claim-sealed") fail("Production campaign must be claim-sealed before recording its claim outcome");
532
+ const finalizedAt = new Date().toISOString();
533
+ loaded.manifest.status = allowed ? "claim-passed" : "no-claim";
534
+ loaded.manifest.claimOutcome = { allowed, reason: reason.trim().slice(0, 240), finalizedAt };
535
+ loaded.manifest.completedAt = finalizedAt;
536
+ writePrivateAtomic(loaded.manifestPath, `${JSON.stringify(loaded.manifest, null, 2)}\n`);
537
+ return this.snapshot();
538
+ },
539
+ invalidateClaimPublication({ reason }) {
540
+ if (typeof reason !== "string" || !reason.trim()) {
541
+ fail("Production campaign publication failure reason is malformed");
542
+ }
543
+ if (loaded.manifest.status === "no-claim") return this.snapshot();
544
+ if (!["claim-sealed", "claim-passed"].includes(loaded.manifest.status)) {
545
+ fail("Only a sealed or finalized passing claim can be invalidated after publication failure");
546
+ }
547
+ const finalizedAt = new Date().toISOString();
548
+ loaded.manifest.status = "no-claim";
549
+ loaded.manifest.claimOutcome = { allowed: false, reason: reason.trim().slice(0, 240), finalizedAt };
550
+ loaded.manifest.completedAt = finalizedAt;
551
+ writePrivateAtomic(loaded.manifestPath, `${JSON.stringify(loaded.manifest, null, 2)}\n`);
552
+ return this.snapshot();
553
+ },
554
+ finalizeTerminalNoClaim({ reason, runs }) {
555
+ if (typeof reason !== "string" || !reason.trim()) {
556
+ fail("Production campaign terminal no-claim reason is malformed");
557
+ }
558
+ if (loaded.manifest.status === "no-claim") {
559
+ if (loaded.manifest.claimOutcome?.allowed !== false) {
560
+ fail("Production campaign terminal no-claim outcome changed after finalization");
561
+ }
562
+ return this.snapshot();
563
+ }
564
+ if (loaded.manifest.status !== "active") {
565
+ fail("Production benchmark campaign is no longer terminal-finalizable");
566
+ }
567
+ const evidence = this.snapshot();
568
+ if (!evidence.passed) {
569
+ fail("Production campaign terminal no-claim requires exact settled usage for every provider attempt");
570
+ }
571
+ const expected = productionCampaignExpectedAttempts(runs);
572
+ if (!productionCampaignAttemptCoverage(expected, evidence)) {
573
+ fail("Production campaign terminal no-claim does not exactly match the accepted run ledger");
574
+ }
575
+ const finalizedAt = new Date().toISOString();
576
+ loaded.manifest.status = "no-claim";
577
+ loaded.manifest.claimOutcome = {
578
+ allowed: false,
579
+ reason: reason.trim().slice(0, 240),
580
+ finalizedAt
581
+ };
582
+ loaded.manifest.completedAt = finalizedAt;
583
+ writePrivateAtomic(loaded.manifestPath, `${JSON.stringify(loaded.manifest, null, 2)}\n`);
584
+ return this.snapshot();
585
+ },
586
+ close: release
587
+ };
588
+ } catch (error) {
589
+ release();
590
+ throw error;
591
+ }
592
+ }
@@ -1,3 +1,4 @@
1
+ import { deriveDiagnosticCandidateEntries } from "./benchmark-diagnostic-treatment.js";
1
2
  import crypto from "node:crypto";
2
3
  import { execFileSync } from "node:child_process";
3
4
  import fs from "node:fs";
@@ -324,8 +325,10 @@ function hardenReadOnly(root) {
324
325
  }
325
326
  }
326
327
 
327
- export function materializeBenchmarkCandidate(root, snapshotRoot) {
328
- const candidate = collectBenchmarkCandidate(root);
328
+ export function materializeBenchmarkCandidate(root, snapshotRoot, options = {}) {
329
+ const source = collectBenchmarkCandidate(root);
330
+ const derived = deriveDiagnosticCandidateEntries(source.entries, options);
331
+ const candidate = { entries: derived.entries, provenance: candidateProvenance(derived.entries) };
329
332
  privateDirectory(snapshotRoot);
330
333
  for (const entry of candidate.entries) materializeEntry(snapshotRoot, entry);
331
334
  verifyExactSnapshotTree(snapshotRoot, candidate.entries);
@@ -335,7 +338,9 @@ export function materializeBenchmarkCandidate(root, snapshotRoot) {
335
338
  fail(`Benchmark snapshot bytes do not match the frozen candidate provenance (${candidate.provenance.contentDigest} != ${observed.contentDigest})`);
336
339
  }
337
340
  hardenReadOnly(snapshotRoot);
338
- return { provenance: observed, index };
341
+ return { provenance: observed, index,
342
+ ...(derived.derivation ? { treatmentDerivation: { ...derived.derivation,
343
+ sourceCandidateProvenance: source.provenance, derivedCandidateProvenance: observed } } : {}) };
339
344
  }
340
345
 
341
346
  export function validBenchmarkCandidateProvenance(value) {