@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
@@ -5,6 +5,9 @@ import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { spawn, spawnSync } from "node:child_process";
7
7
  import { fileURLToPath } from "node:url";
8
+ import { collectBenchmarkCandidate } from "../../packages/piagent-core/benchmark/benchmark-candidate.js";
9
+ import { checkpointDirectory, checkpointDigest, readCheckpoint, writeCheckpoint, writeCheckpointBytes } from "../../packages/piagent-core/benchmark/benchmark-checkpoint.js";
10
+ import { acquireBenchmarkRunLock } from "../../packages/piagent-core/benchmark/benchmark-run-lock.js";
8
11
 
9
12
  import { buildContextEfficiencyReport } from "../../packages/piagent-core/extensions/context-engine.js";
10
13
  import { recordCompletionAudit, recordTaskStartCheckpoint } from "../../packages/piagent-core/extensions/task-runtime-audit.js";
@@ -12,7 +15,7 @@ import { inspectTaskContinuationBudget, reserveTaskContinuation } from "../../pa
12
15
  import { buildHandoffProjection, readHandoffProjection, writeHandoffProjection } from "../../packages/piagent-core/runtime/recovery/handoff-projection.ts";
13
16
  import { inspectTaskResumeState } from "../../packages/piagent-core/runtime/recovery/resume-state.ts";
14
17
  import { createBoundTaskAuthority } from "../../packages/piagent-core/runtime/policy/task-authority-runtime.ts";
15
- import { bindSessionTask, workingTreeSnapshot, writeTaskContract } from "../../packages/piagent-core/extensions/task-state.js";
18
+ import { activeSessionTask, bindSessionTask, workingTreeSnapshot, writeTaskContract } from "../../packages/piagent-core/extensions/task-state.js";
16
19
  import { readTaskJournal } from "../../packages/piagent-core/extensions/task-journal.js";
17
20
  import { workingTreeEvidenceDigest } from "../../packages/piagent-core/extensions/working-tree-digest.js";
18
21
 
@@ -25,7 +28,7 @@ const option = (name) => {
25
28
  return index >= 0 ? argumentsList[index + 1] : undefined;
26
29
  };
27
30
  const calibrationFast = argumentsList.includes("--calibration-fast");
28
- const outputPath = path.resolve(option("--output") ?? path.join(process.cwd(), "long-horizon-report.json"));
31
+ let outputPath = path.resolve(option("--output") ?? path.join(process.cwd(), "long-horizon-report.json"));
29
32
  const totalUnits = calibrationFast ? 9 : lane.totalUnits;
30
33
  const crashAfterUnit = calibrationFast ? 3 : lane.hardCrashAfterUnit;
31
34
  const handoffAfterUnit = calibrationFast ? 6 : lane.handoffAfterUnit;
@@ -33,18 +36,52 @@ const compactionUnits = calibrationFast ? [2, 4, 6, 8] : lane.compactionUnits;
33
36
  const tickMilliseconds = calibrationFast ? Number(option("--tick-ms") ?? 2) : lane.tickMilliseconds;
34
37
  const evidenceClass = calibrationFast ? "calibration-fast" : "provider-free-long-horizon";
35
38
  if (!calibrationFast && option("--tick-ms") !== undefined) throw new Error("wall-clock evidence cannot override tick duration");
39
+ if (!Number.isFinite(tickMilliseconds) || tickMilliseconds < 0) throw new Error("invalid tick duration");
40
+ if (argumentsList.includes("--state-directory") && !option("--state-directory")) throw new Error("--state-directory requires a path");
41
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
42
+ outputPath = path.join(fs.realpathSync.native(path.dirname(outputPath)), path.basename(outputPath));
36
43
 
37
- const temporaryRoot = fs.mkdtempSync(path.join(os.tmpdir(), "piagent-long-horizon-"));
44
+ const durable = Boolean(option("--state-directory"));
45
+ const temporaryRoot = durable
46
+ ? checkpointDirectory(path.dirname(path.resolve(option("--state-directory"))), path.basename(path.resolve(option("--state-directory"))))
47
+ : fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), "piagent-long-horizon-")));
48
+ const releaseCoordinator = acquireBenchmarkRunLock(temporaryRoot, "long-horizon-coordinator");
49
+ const workerRoot = path.join(temporaryRoot, "project/.pi/piagent-state/long-horizon");
50
+ if (fs.existsSync(workerRoot)) {
51
+ const release = acquireBenchmarkRunLock(workerRoot, "long-horizon-worker-preflight"); release();
52
+ }
53
+ const coordinatorPath = path.join(temporaryRoot, "coordinator.json");
54
+ const sourceDigest = collectBenchmarkCandidate(repositoryRoot).provenance.contentDigest;
55
+ const coordinatorBinding = checkpointDigest({ sourceDigest, node: process.version, platform: process.platform,
56
+ arch: process.arch, lane, calibrationFast, tickMilliseconds, s0Binding: option("--binding") ?? null });
57
+ let coordinator = readCheckpoint(coordinatorPath, coordinatorBinding);
58
+ if (!coordinator) {
59
+ if (fs.readdirSync(temporaryRoot).some((name) => name !== ".benchmark-run.lock")) throw new Error("unbound long-horizon state directory is not empty");
60
+ coordinator = { phase: "initializing", startedAt: new Date().toISOString(), observations: {} };
61
+ writeCheckpoint(coordinatorPath, coordinatorBinding, coordinator);
62
+ }
63
+ function checkpointCoordinator(patch) {
64
+ coordinator = { ...coordinator, ...patch };
65
+ writeCheckpoint(coordinatorPath, coordinatorBinding, coordinator);
66
+ }
67
+ if (coordinator.phase === "complete") {
68
+ writeCheckpointBytes(outputPath, `${JSON.stringify(coordinator.report, null, 2)}\n`);
69
+ releaseCoordinator();
70
+ process.stdout.write(`${JSON.stringify(coordinator.report)}\n`);
71
+ process.exit(0);
72
+ }
38
73
  const workspace = path.join(temporaryRoot, "project");
39
- const startedAtMs = Date.now();
40
- const startedAt = new Date(startedAtMs).toISOString();
74
+ const startedAt = coordinator.startedAt;
75
+ const startedAtMs = Date.parse(startedAt);
41
76
  const fixture = path.resolve(laneRoot, lane.fixture);
77
+ if (coordinator.phase === "initializing") {
42
78
  fs.cpSync(fixture, workspace, { recursive: true });
43
- spawnSync("git", ["init", "-q", workspace], { stdio: "inherit" });
44
- spawnSync("git", ["-C", workspace, "config", "user.email", "long-horizon@example.invalid"], { stdio: "inherit" });
45
- spawnSync("git", ["-C", workspace, "config", "user.name", "Piagent Long Horizon"], { stdio: "inherit" });
46
- spawnSync("git", ["-C", workspace, "add", "."], { stdio: "inherit" });
47
- spawnSync("git", ["-C", workspace, "commit", "-qm", "fixture"], { stdio: "inherit" });
79
+ for (const args of [["init", "-q", workspace], ["-C", workspace, "config", "user.email", "long-horizon@example.invalid"],
80
+ ["-C", workspace, "config", "user.name", "Piagent Long Horizon"], ["-C", workspace, "add", "."],
81
+ ["-C", workspace, "commit", "--allow-empty", "-qm", "fixture"]]) {
82
+ assert.equal(spawnSync("git", args, { stdio: "inherit" }).status, 0, "fixture Git initialization failed");
83
+ }
84
+ }
48
85
 
49
86
  const taskId = "long-horizon-90";
50
87
  const taskRunId = "long-horizon-90-run-1";
@@ -53,8 +90,10 @@ const sessionName = "LONG-HORIZON-90 repository audit";
53
90
  const createdAt = startedAt;
54
91
  const portableVerifier = path.join(workspace, ".pi", "piagent-state", "long-horizon", "verify.mjs");
55
92
  fs.mkdirSync(path.dirname(portableVerifier), { recursive: true, mode: 0o700 });
56
- fs.copyFileSync(path.join(laneRoot, "verify.mjs"), portableVerifier);
57
- fs.chmodSync(portableVerifier, 0o600);
93
+ if (coordinator.phase === "initializing") {
94
+ fs.copyFileSync(path.join(laneRoot, "verify.mjs"), portableVerifier);
95
+ fs.chmodSync(portableVerifier, 0o600);
96
+ }
58
97
  let task = {
59
98
  schemaVersion: 2,
60
99
  taskRunId,
@@ -106,10 +145,16 @@ let task = {
106
145
  createdAt,
107
146
  updatedAt: createdAt
108
147
  };
109
- task.authoritySnapshot = createBoundTaskAuthority({ taskId, taskRunId, createdAt });
110
- task = writeTaskContract(workspace, task);
111
- bindSessionTask(workspace, sessionId, sessionName, task);
112
- recordTaskStartCheckpoint({ cwd: workspace, ui: { notify() {} } }, task, "discovery", "automatic");
148
+ if (coordinator.phase === "initializing") {
149
+ task.authoritySnapshot = createBoundTaskAuthority({ taskId, taskRunId, createdAt });
150
+ task = writeTaskContract(workspace, task);
151
+ bindSessionTask(workspace, sessionId, sessionName, task);
152
+ recordTaskStartCheckpoint({ cwd: workspace, ui: { notify() {} } }, task, "discovery", "automatic");
153
+ checkpointCoordinator({ phase: "crash" });
154
+ } else {
155
+ task = activeSessionTask(workspace, sessionId);
156
+ assert.equal(task?.taskRunId, taskRunId, "durable task binding changed");
157
+ }
113
158
 
114
159
  const runtimeBase = {
115
160
  laneId: lane.id,
@@ -119,7 +164,8 @@ const runtimeBase = {
119
164
  totalUnits,
120
165
  logicalDurationMinutes: lane.logicalDurationMinutes,
121
166
  compactionUnits,
122
- tickMilliseconds
167
+ tickMilliseconds,
168
+ coordinatorBinding
123
169
  };
124
170
  const workerPath = path.join(laneRoot, "worker.mjs");
125
171
  const statePath = path.join(workspace, ".pi", "piagent-state", "long-horizon", "state.json");
@@ -129,23 +175,17 @@ function state() {
129
175
  catch (error) { if (error?.code === "ENOENT") return { currentUnit: 0 }; throw error; }
130
176
  }
131
177
 
132
- function startWorker(stopAfterUnit) {
133
- const runtime = Buffer.from(JSON.stringify({ ...runtimeBase, stopAfterUnit })).toString("base64url");
134
- const child = spawn(process.execPath, [workerPath, workspace, runtime], { stdio: ["ignore", "pipe", "pipe"] });
178
+ function startWorker(stopAfterUnit, crashBoundary) {
179
+ const runtime = Buffer.from(JSON.stringify({ ...runtimeBase, stopAfterUnit, crashBoundary })).toString("base64url");
180
+ const child = spawn(process.execPath, [workerPath, workspace, runtime], { stdio: ["ignore", "pipe", "pipe", "ipc"] });
135
181
  let stdout = "", stderr = "";
136
182
  child.stdout.on("data", (chunk) => { stdout += chunk; });
137
183
  child.stderr.on("data", (chunk) => { stderr += chunk; });
138
- return { child, result: new Promise((resolve) => child.once("exit", (code, signal) => resolve({ code, signal, stdout, stderr }))) };
139
- }
140
-
141
- async function waitForUnit(unit) {
142
- const remaining = Math.max(1, unit - Number(state().currentUnit ?? 0));
143
- const deadline = Date.now() + Math.max(30_000, tickMilliseconds * (remaining + 2));
144
- while (Date.now() < deadline) {
145
- if (state().currentUnit >= unit) return;
146
- await new Promise((resolve) => setTimeout(resolve, Math.min(100, Math.max(5, tickMilliseconds / 20))));
147
- }
148
- throw new Error(`timed out waiting for long-horizon unit ${unit}`);
184
+ const result = new Promise((resolve, reject) => {
185
+ child.once("error", reject);
186
+ child.once("exit", (code, signal) => resolve({ code, signal, stdout, stderr }));
187
+ });
188
+ return { child, result };
149
189
  }
150
190
 
151
191
  function updatePendingTask(completed, active) {
@@ -182,15 +222,25 @@ function persistHandoff(reason) {
182
222
  return readHandoffProjection(workspace, taskRunId);
183
223
  }
184
224
 
185
- const first = startWorker(undefined);
186
- await waitForUnit(crashAfterUnit);
187
- first.child.kill("SIGKILL");
188
- const firstResult = await first.result;
189
- assert.equal(firstResult.signal, "SIGKILL", firstResult.stderr);
190
- assert.equal(state().currentUnit, crashAfterUnit);
225
+ if (coordinator.phase === "crash") {
226
+ const first = startWorker(undefined, crashAfterUnit);
227
+ const atBoundary = new Promise((resolve) => first.child.once("message", resolve));
228
+ const observed = await Promise.race([atBoundary, first.result.then((result) => { throw new Error(`worker stopped before crash boundary: ${result.stderr}`); })]);
229
+ assert.deepEqual(observed, { type: "crash-boundary", unit: crashAfterUnit });
230
+ first.child.kill("SIGKILL");
231
+ const firstResult = await first.result;
232
+ assert.equal(firstResult.signal, "SIGKILL", firstResult.stderr);
233
+ assert.equal(state().currentUnit, crashAfterUnit);
234
+ checkpointCoordinator({ phase: "crash-recovery", observations: { hardCrash: { signal: firstResult.signal, unit: crashAfterUnit } } });
235
+ }
236
+ let firstContinuation = coordinator.observations.firstContinuation;
237
+ let secondContinuation = coordinator.observations.secondContinuation;
238
+ let crashHandoff = coordinator.observations.crashHandoff;
239
+ let plannedHandoff = coordinator.observations.plannedHandoff;
240
+ if (coordinator.phase === "crash-recovery") {
191
241
  updatePendingTask("discovery", "validation");
192
242
  const crashDigest = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
193
- const firstContinuation = reserveTaskContinuation(workspace, task, {
243
+ const reservation = reserveTaskContinuation(workspace, task, {
194
244
  capabilityId: "CAP-12",
195
245
  classification: "infrastructure-retry",
196
246
  action: "retry",
@@ -198,8 +248,12 @@ const firstContinuation = reserveTaskContinuation(workspace, task, {
198
248
  reasonCodes: ["process-killed"],
199
249
  recordedAt: new Date().toISOString()
200
250
  });
201
- assert.equal(firstContinuation.allowed, true);
202
- const secondContinuation = reserveTaskContinuation(workspace, task, {
251
+ assert.ok(reservation.allowed || reservation.reason === "repeated-progress-signature");
252
+ // Re-reading the same consumed reservation does not authorize another turn.
253
+ // The original allow observation is reconstructed only from that exact journal
254
+ // signature, never from an exhausted-but-unrelated budget.
255
+ firstContinuation = { ...reservation, allowed: true };
256
+ secondContinuation = reserveTaskContinuation(workspace, task, {
203
257
  capabilityId: "CAP-12",
204
258
  classification: "infrastructure-retry",
205
259
  action: "retry",
@@ -209,23 +263,32 @@ const secondContinuation = reserveTaskContinuation(workspace, task, {
209
263
  });
210
264
  assert.equal(secondContinuation.allowed, false);
211
265
  assert.equal(secondContinuation.reason, "global-budget-exhausted");
212
- const crashHandoff = persistHandoff("hard process death at a durable checkpoint");
266
+ crashHandoff = persistHandoff("hard process death at a durable checkpoint");
213
267
  assert.equal(crashHandoff?.identity.taskRunId, taskRunId);
214
268
  const crashResume = inspectTaskResumeState(workspace, task, sessionId);
215
269
  assert.equal(crashResume.enforcementSafe, true, crashResume.reason);
270
+ checkpointCoordinator({ phase: "handoff", observations: { ...coordinator.observations, firstContinuation, secondContinuation, crashHandoff } });
271
+ }
216
272
 
273
+ if (coordinator.phase === "handoff") {
217
274
  const second = startWorker(handoffAfterUnit);
218
275
  const secondResult = await second.result;
219
276
  assert.equal(secondResult.code, 75, secondResult.stderr);
220
277
  assert.equal(state().currentUnit, handoffAfterUnit);
221
278
  updatePendingTask("validation", "synthesis");
222
- const plannedHandoff = persistHandoff("planned process handoff after validation stage");
279
+ plannedHandoff = persistHandoff("planned process handoff after validation stage");
223
280
  assert.equal(plannedHandoff?.identity.taskRunId, taskRunId);
281
+ checkpointCoordinator({ phase: "finish", observations: { ...coordinator.observations, plannedHandoff } });
282
+ }
224
283
 
284
+ if (coordinator.phase === "finish") {
225
285
  const third = startWorker(undefined);
226
286
  const thirdResult = await third.result;
227
287
  assert.equal(thirdResult.code, 0, thirdResult.stderr);
228
288
  assert.equal(state().currentUnit, totalUnits);
289
+ checkpointCoordinator({ phase: "verify", completedAt: new Date().toISOString() });
290
+ }
291
+ assert.equal(coordinator.phase, "verify", "unknown coordinator phase");
229
292
  const beforeVerify = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
230
293
  const verifier = spawnSync(process.execPath, [portableVerifier, workspace, String(totalUnits)], { encoding: "utf8" });
231
294
  assert.equal(verifier.status, 0, verifier.stderr);
@@ -233,7 +296,7 @@ const afterVerify = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
233
296
  assert.equal(afterVerify, beforeVerify);
234
297
  const finalSnapshot = workingTreeSnapshot(workspace);
235
298
  const finalFiles = Object.keys(finalSnapshot).sort();
236
- const completedAt = new Date().toISOString();
299
+ const completedAt = coordinator.completedAt;
237
300
  task = writeTaskContract(workspace, {
238
301
  ...task,
239
302
  workPlan: task.workPlan.map((step) => ({ ...step, status: "done" })),
@@ -270,11 +333,12 @@ const peakDurableStateBytes = Math.max(finalState.peakDurableStateBytes, finalDu
270
333
  const peakContextSample = stateSamples.reduce((peak, sample) => sample.contextProxyTokens > peak.contextProxyTokens ? sample : peak, stateSamples[0]);
271
334
  const endedAtMs = Date.now();
272
335
  const wallClockMilliseconds = endedAtMs - startedAtMs;
273
- const completedFromResume = finalState.processStarts === 3
336
+ const completedFromResume = finalState.processStarts >= 3
274
337
  && finalState.resumedUnits.includes(crashAfterUnit)
275
338
  && finalState.resumedUnits.includes(handoffAfterUnit)
276
- && terminalResume.decision === "terminal";
277
- const wallClockQualified = wallClockMilliseconds >= lane.minimumWallClockMinutes * 60_000;
339
+ && terminalResume.decision === "terminal"
340
+ && coordinator.observations.hardCrash.signal === "SIGKILL";
341
+ const wallClockQualified = finalState.activeMilliseconds >= lane.minimumWallClockMinutes * 60_000;
278
342
  const report = {
279
343
  schemaVersion: 1,
280
344
  laneId: lane.id,
@@ -284,6 +348,7 @@ const report = {
284
348
  completedAt,
285
349
  logicalDurationMinutes: lane.logicalDurationMinutes,
286
350
  wallClockMilliseconds,
351
+ activeMilliseconds: finalState.activeMilliseconds,
287
352
  wallClockMinutes: Number((wallClockMilliseconds / 60_000).toFixed(4)),
288
353
  minimumWallClockMinutes: lane.minimumWallClockMinutes,
289
354
  wallClockQualified,
@@ -350,6 +415,9 @@ assert.equal(report.continuation.maximum, 1);
350
415
  assert.equal(report.verification.stableCurrentTree, true);
351
416
  if (!calibrationFast) assert.equal(report.wallClockQualified, true, `wall clock ${report.wallClockMinutes}m is below ${lane.minimumWallClockMinutes}m`);
352
417
  fs.mkdirSync(path.dirname(outputPath), { recursive: true });
353
- fs.writeFileSync(outputPath, `${JSON.stringify(report, null, 2)}\n`, { mode: 0o600 });
354
- fs.rmSync(temporaryRoot, { recursive: true, force: true });
418
+ assert.equal(collectBenchmarkCandidate(repositoryRoot).provenance.contentDigest, sourceDigest, "candidate changed during long-horizon execution");
419
+ checkpointCoordinator({ phase: "complete", report });
420
+ writeCheckpointBytes(outputPath, `${JSON.stringify(report, null, 2)}\n`);
421
+ releaseCoordinator();
422
+ if (!durable) fs.rmSync(temporaryRoot, { recursive: true, force: true });
355
423
  process.stdout.write(`${JSON.stringify(report)}\n`);
@@ -2,9 +2,11 @@ import crypto from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
 
5
- import { appendContextTelemetry, estimateContextTokens } from "../../packages/piagent-core/extensions/context-engine.js";
5
+ import { appendContextTelemetry, contextEnginePaths, estimateContextTokens } from "../../packages/piagent-core/extensions/context-engine.js";
6
+ import { checkpointDigest, readCheckpoint, writeCheckpoint, writeCheckpointBytes } from "../../packages/piagent-core/benchmark/benchmark-checkpoint.js";
7
+ import { acquireBenchmarkRunLock } from "../../packages/piagent-core/benchmark/benchmark-run-lock.js";
6
8
  import { ensurePrivateStateDirectory, resolveLocalStatePath } from "../../packages/piagent-core/extensions/local-state-path.js";
7
- import { appendTaskJournalEvent } from "../../packages/piagent-core/extensions/task-journal.js";
9
+ import { appendTaskJournalEventAtMost } from "../../packages/piagent-core/extensions/task-journal.js";
8
10
  import { workingTreeSnapshot } from "../../packages/piagent-core/extensions/task-state.js";
9
11
  import { workingTreeEvidenceDigest } from "../../packages/piagent-core/extensions/working-tree-digest.js";
10
12
 
@@ -13,6 +15,10 @@ if (!workspaceArgument || !runtimeArgument) throw new Error("worker requires wor
13
15
  const workspace = path.resolve(workspaceArgument);
14
16
  const runtime = JSON.parse(Buffer.from(runtimeArgument, "base64url").toString("utf8"));
15
17
  const privateRoot = ensurePrivateStateDirectory(workspace, path.join(workspace, ".pi", "piagent-state", "long-horizon"), "Long-horizon state");
18
+ const releaseWorker = acquireBenchmarkRunLock(privateRoot, runtime.taskRunId);
19
+ // An orphan must stop before another coordinator starts it. IPC disconnect is
20
+ // an observed loss of the parent, not a timeout-based guess about its liveness.
21
+ if (process.connected) process.once("disconnect", () => process.exit(76));
16
22
  const statePath = resolveLocalStatePath(workspace, path.join(privateRoot, "state.json"), { label: "Long-horizon state" });
17
23
  const workingSetPath = resolveLocalStatePath(workspace, path.join(privateRoot, "working-set.json"), { label: "Long-horizon working set" });
18
24
  const telemetryPath = resolveLocalStatePath(workspace, path.join(privateRoot, "telemetry.jsonl"), { label: "Long-horizon telemetry" });
@@ -28,7 +34,7 @@ function processAlive(pid) {
28
34
 
29
35
  function removeDeadWriterTemps(directory) {
30
36
  for (const name of fs.readdirSync(directory)) {
31
- const match = name.match(/\.(\d+)\.tmp$/);
37
+ const match = name.match(/\.(\d+)(?:\.[a-f0-9-]{36})?\.tmp$/);
32
38
  if (!match || processAlive(Number.parseInt(match[1], 10))) continue;
33
39
  const target = path.join(directory, name);
34
40
  try { if (fs.lstatSync(target).isFile()) fs.rmSync(target); } catch (error) { if (error?.code !== "ENOENT") throw error; }
@@ -44,10 +50,7 @@ function readJson(file, fallback) {
44
50
  }
45
51
 
46
52
  function writeAtomic(file, value, mode = 0o600) {
47
- const temporary = `${file}.${process.pid}.tmp`;
48
- fs.writeFileSync(temporary, `${JSON.stringify(value)}\n`, { mode });
49
- fs.renameSync(temporary, file);
50
- fs.chmodSync(file, mode);
53
+ writeCheckpointBytes(file, `${JSON.stringify(value)}\n`, mode);
51
54
  }
52
55
 
53
56
  function projectSources() {
@@ -77,18 +80,17 @@ function treeBytes(root) {
77
80
  return bytes;
78
81
  }
79
82
 
80
- function appendTelemetry(value) {
81
- fs.appendFileSync(telemetryPath, `${JSON.stringify(value)}\n`, { mode: 0o600 });
82
- fs.chmodSync(telemetryPath, 0o600);
83
- }
84
-
85
83
  function sleep(milliseconds) {
86
84
  return new Promise((resolve) => setTimeout(resolve, milliseconds));
87
85
  }
88
86
 
89
87
  const sources = projectSources();
90
88
  if (sources.length < runtime.totalUnits) throw new Error(`fixture has only ${sources.length} source files for ${runtime.totalUnits} units`);
91
- let state = readJson(statePath, {
89
+ const { stopAfterUnit, crashBoundary, ...stableRuntime } = runtime;
90
+ const binding = { runtime: stableRuntime, sources: sources.map((file) => [file, crypto.createHash("sha256").update(fs.readFileSync(path.join(workspace, file))).digest("hex")]) };
91
+ const checkpointPath = path.join(privateRoot, "checkpoint.json");
92
+ const checkpoint = readCheckpoint(checkpointPath, checkpointDigest(binding));
93
+ let state = checkpoint?.state ?? readJson(statePath, {
92
94
  schemaVersion: 1,
93
95
  laneId: runtime.laneId,
94
96
  taskId: runtime.taskId,
@@ -98,14 +100,65 @@ let state = readJson(statePath, {
98
100
  compactions: 0,
99
101
  peakContextProxyTokens: 0,
100
102
  peakDurableStateBytes: 0,
103
+ activeMilliseconds: 0,
101
104
  resumedUnits: []
102
105
  });
103
106
  if (state.laneId !== runtime.laneId || state.taskId !== runtime.taskId || state.taskRunId !== runtime.taskRunId) throw new Error("long-horizon state identity mismatch");
107
+ if (!checkpoint && state.currentUnit !== 0) throw new Error("legacy long-horizon progress has no atomic checkpoint");
108
+ let workingSet = checkpoint?.workingSet ?? [];
109
+ const telemetry = checkpoint?.telemetry ?? [];
110
+ const contextEvents = checkpoint?.contextEvents ?? [];
111
+ if (telemetry.length !== state.currentUnit || telemetry.some((entry, index) => entry.unit !== index + 1)) throw new Error("invalid long-horizon checkpoint sequence");
112
+ for (let unit = 1; unit <= state.currentUnit; unit += 1) {
113
+ const actual = readJson(path.join(unitRoot, `${String(unit).padStart(3, "0")}.json`));
114
+ const [sourcePath, sourceDigest] = binding.sources[unit - 1];
115
+ if (actual?.unit !== unit || actual.sourcePath !== sourcePath || actual.sourceDigest !== sourceDigest) throw new Error("completed long-horizon artifact changed");
116
+ }
117
+
118
+ function projectCheckpoint() {
119
+ writeAtomic(statePath, state);
120
+ writeAtomic(workingSetPath, workingSet);
121
+ writeCheckpointBytes(telemetryPath, telemetry.map((entry) => `${JSON.stringify(entry)}\n`).join(""));
122
+ const contextPath = resolveLocalStatePath(workspace, contextEnginePaths(workspace).telemetry);
123
+ ensurePrivateStateDirectory(workspace, path.dirname(contextPath));
124
+ // These events belong only to this owned provider-free fixture. The atomic
125
+ // checkpoint is authoritative; partial/uncommitted projections are rebuilt.
126
+ writeCheckpointBytes(contextPath, contextEvents.map((entry) => `${JSON.stringify(entry)}\n`).join(""));
127
+ // Replay the committed prefix to repair a checkpoint-before-projection crash,
128
+ // but never append the same unit again. The raw append API does not dedupe.
129
+ for (const entry of telemetry) {
130
+ const data = { unit: entry.unit, logicalMinute: entry.unit, sourceDigest: binding.sources[entry.unit - 1][1], currentWorkingTreeDigest: entry.currentWorkingTreeDigest };
131
+ const { record } = appendTaskJournalEventAtMost(workspace, {
132
+ eventType: "long-horizon-progress", taskId: runtime.taskId, taskRunId: runtime.taskRunId,
133
+ sessionId: runtime.sessionId, idempotencyKey: `long-horizon:${entry.unit}`, data
134
+ }, { maximum: runtime.totalUnits, recordedAt: entry.recordedAt });
135
+ // A conflicting key or exhausted budget must not silently erase evidence.
136
+ if (!record || record.taskId !== runtime.taskId || record.sessionId !== runtime.sessionId
137
+ || record.recordedAt !== entry.recordedAt || JSON.stringify(record.data) !== JSON.stringify(data)) {
138
+ throw new Error(`long-horizon journal projection mismatch at unit ${entry.unit}`);
139
+ }
140
+ }
141
+ }
142
+
143
+ function commitCheckpoint() {
144
+ writeCheckpoint(checkpointPath, checkpointDigest(binding), { state, workingSet, telemetry, contextEvents });
145
+ projectCheckpoint();
146
+ }
147
+
104
148
  const startingUnit = state.currentUnit;
105
149
  state.processStarts += 1;
106
150
  if (startingUnit > 0) state.resumedUnits.push(startingUnit);
107
- writeAtomic(statePath, state);
108
- let workingSet = readJson(workingSetPath, []);
151
+ commitCheckpoint();
152
+
153
+ async function boundary(unit) {
154
+ if (unit === crashBoundary) {
155
+ process.send?.({ type: "crash-boundary", unit });
156
+ await new Promise(() => { setInterval(() => {}, 1_000); });
157
+ }
158
+ if (unit === stopAfterUnit && unit < runtime.totalUnits) process.exit(75);
159
+ }
160
+ await boundary(startingUnit);
161
+ let activeSince = performance.now();
109
162
 
110
163
  for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
111
164
  const sourcePath = sources[(unit - 1) % sources.length];
@@ -119,19 +172,10 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
119
172
  if (runtime.compactionUnits.includes(unit)) {
120
173
  workingSet = [{ unit, compactedThrough: unit, retainedDigest: crypto.createHash("sha256").update(JSON.stringify(workingSet)).digest("hex") }];
121
174
  state.compactions += 1;
122
- appendContextTelemetry(workspace, { event: "session_compact", taskRunId: runtime.taskRunId, unit, reason: "long-horizon-boundary", fromExtension: true });
175
+ contextEvents.push(appendContextTelemetry(workspace, { event: "session_compact", taskRunId: runtime.taskRunId, unit, reason: "long-horizon-boundary", fromExtension: true }));
123
176
  }
124
- writeAtomic(workingSetPath, workingSet);
125
177
  const currentWorkingTreeDigest = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
126
- appendTaskJournalEvent(workspace, {
127
- eventType: "long-horizon-progress",
128
- taskId: runtime.taskId,
129
- taskRunId: runtime.taskRunId,
130
- sessionId: runtime.sessionId,
131
- idempotencyKey: `long-horizon:${unit}`,
132
- data: { unit, logicalMinute: unit, sourceDigest, currentWorkingTreeDigest }
133
- }, { recordedAt: new Date().toISOString() });
134
- appendContextTelemetry(workspace, {
178
+ contextEvents.push(appendContextTelemetry(workspace, {
135
179
  event: "agent_prompt",
136
180
  taskRunId: runtime.taskRunId,
137
181
  unit,
@@ -140,13 +184,14 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
140
184
  toolSchemaTokens: 872,
141
185
  contextProxyTokens: beforeCompactionTokens,
142
186
  source: "deterministic-provider-free-proxy"
143
- });
187
+ }));
144
188
  const durableStateBytes = treeBytes(path.join(workspace, ".pi", "piagent-state"));
145
189
  state.currentUnit = unit;
146
190
  state.peakDurableStateBytes = Math.max(state.peakDurableStateBytes, durableStateBytes);
147
191
  state.lastWorkingTreeDigest = currentWorkingTreeDigest;
148
192
  state.updatedAt = new Date().toISOString();
149
- appendTelemetry({
193
+ state.activeMilliseconds += performance.now() - activeSince;
194
+ telemetry.push({
150
195
  schemaVersion: 1,
151
196
  recordedAt: state.updatedAt,
152
197
  processId: process.pid,
@@ -158,8 +203,9 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
158
203
  compactions: state.compactions,
159
204
  currentWorkingTreeDigest
160
205
  });
161
- writeAtomic(statePath, state);
162
- if (unit === runtime.stopAfterUnit && unit < runtime.totalUnits) process.exit(75);
206
+ commitCheckpoint();
207
+ activeSince = performance.now();
208
+ await boundary(unit);
163
209
  if (unit < runtime.totalUnits) await sleep(runtime.tickMilliseconds);
164
210
  }
165
211
 
@@ -174,4 +220,5 @@ writeAtomic(path.join(artifactRoot, "report.json"), {
174
220
  logicalDurationMinutes: runtime.logicalDurationMinutes,
175
221
  aggregateDigest: aggregate.digest("hex")
176
222
  }, 0o644);
223
+ releaseWorker();
177
224
  process.exit(0);
@@ -0,0 +1,53 @@
1
+ # Current public exposure boundary
2
+
3
+ Use `public-exposure.v2.json` for a new custody review. The v1 file and
4
+ `CUSTODIAN_RUNBOOK.md` are retained historical inputs, not a complete current
5
+ exposure inventory. All role separation, private-data restrictions, reference
6
+ and mutation checks, blinded review and independent attestation requirements
7
+ in that runbook remain mandatory. Its step 1 must now bind the v2 exposure file.
8
+
9
+ The earlier file omitted the public `deep-logic-v1` and `production-v2` suites.
10
+ V2 now includes all seven current public suites (93 scenarios), including
11
+ `production-v3`, all 13 contract-family versions and nine public development
12
+ trees, including test programs and author-written calibration examples. The
13
+ predecessor digest preserves prior exposure. These counts are inventory counts,
14
+ not executed or passing sessions.
15
+
16
+ Before custody review, check the complete public source tree, including its
17
+ development tests. The runtime npm package intentionally omits those tests and
18
+ cannot establish inventory freshness alone; use the exact frozen source bundle
19
+ or checkout, without substituting a current checkout for a different candidate:
20
+
21
+ ```text
22
+ node scripts/public-evaluation-exposure.mjs --check
23
+ ```
24
+
25
+ The maintainer may regenerate the inventory with `--write` after public source
26
+ changes. Generation grants no authority: a changed digest requires a new
27
+ independent lineage comparison and custody receipt. Do not edit an existing
28
+ custody receipt to substitute the new digest. The current readiness CLI and
29
+ FS4 evaluator refuse stale or incomplete inventories. Old v1-bound receipts
30
+ remain historical metadata, not current readiness.
31
+
32
+ Tree digests cover pairs of repository-relative filename and file SHA-256.
33
+ Flatten every regular file in the tree first, using slash-separated relative
34
+ paths. Globally sort those paths by UTF-16 code units (not locale or directory
35
+ traversal order), serialize the ordered pair array as compact JSON without a
36
+ trailing newline, then hash its UTF-8 bytes. Do not normalize filenames.
37
+ Changing a fixture without changing its suite manifest, adding a
38
+ public test or altering a contract library invalidates the inventory. Symlinked
39
+ and oversized inputs are refused. These are local filesystem checks, not a
40
+ security sandbox against another actor with the same OS privileges; freeze
41
+ and independently verify the exact candidate artifact in the controlled
42
+ environment before and after private execution.
43
+
44
+ The inventory is not a complete record of author knowledge. Independently
45
+ account for previous diagnostic replays, retained campaigns and any material
46
+ outside these public roots. Compare actual lineage and acceptance mechanisms,
47
+ not just names or hashes. Never bring private prompts, graders, repositories,
48
+ reviewer identities or raw scores into the author environment. Only the closed
49
+ assurance receipt and independent custody attestation may cross that boundary.
50
+
51
+ `ready: true` still grants no provider execution, generalization or release
52
+ claim. Independent custody and the remaining exact-candidate release gates
53
+ remain separate requirements.
@@ -4,14 +4,17 @@ This directory contains only the public, provider-free boundary for `CF-FS4-04`.
4
4
  It does not contain a holdout suite, private repository, prompt, grader, oracle,
5
5
  reference solution, reviewer identity, raw score sheet, or private locator.
6
6
 
7
- The operational handoff is documented in `CUSTODIAN_RUNBOOK.md`. The readiness
7
+ The current operational handoff starts with `CURRENT_BOUNDARY.md`, which
8
+ supersedes the old exposure-file binding without changing the retained v1
9
+ history. The remaining custody procedure is in `CUSTODIAN_RUNBOOK.md`. The readiness
8
10
  CLI checks the closed receipt, while the independent FS4-05 auditor must verify
9
11
  its custody origin outside this repository; authors cannot self-attest E3.
10
12
 
11
13
  The external custodian must:
12
14
 
13
15
  1. compare every private task-family lineage and repository lineage with
14
- `public-exposure.v1.json` inside the controlled environment;
16
+ the current `public-exposure.v2.json`, its predecessor and the declared public
17
+ development trees inside the controlled environment;
15
18
  2. keep candidate authors outside the custodian, reviewer, and adjudicator roles;
16
19
  3. expose an execute-only interface to the benchmark operator after an exact RC
17
20
  is frozen;