@piagent/platform 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/operator-manual-vietnamese.md +12 -12
  175. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  176. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  177. package/docs/piagent-core-improvement-plan.md +528 -0
  178. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  179. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  180. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  181. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  182. package/docs/piagent-open-session-wait.md +19 -0
  183. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  184. package/docs/publishing-for-teams.md +2 -0
  185. package/docs/quality-benchmark.md +128 -8
  186. package/docs/quickstart-vietnamese.md +2 -2
  187. package/docs/release-install-policy.md +32 -9
  188. package/docs/research/harness-next-evidence-review.md +113 -0
  189. package/docs/team-onboarding.md +7 -7
  190. package/docs/third-party-neutrality.md +7 -0
  191. package/docs/usage-observability.md +1 -1
  192. package/docs-site/architecture.html +1 -1
  193. package/docs-site/benchmark.html +1 -1
  194. package/docs-site/commands.html +1 -1
  195. package/docs-site/content/en/runtime.html +1 -1
  196. package/docs-site/content/en/whats-new.html +11 -0
  197. package/docs-site/content/runtime.html +2 -2
  198. package/docs-site/content/whats-new.html +11 -0
  199. package/docs-site/context-engine.html +1 -1
  200. package/docs-site/en/architecture.html +1 -1
  201. package/docs-site/en/benchmark.html +1 -1
  202. package/docs-site/en/commands.html +1 -1
  203. package/docs-site/en/context-engine.html +1 -1
  204. package/docs-site/en/index.html +1 -1
  205. package/docs-site/en/mcp-approval.html +1 -1
  206. package/docs-site/en/mcp-auth.html +1 -1
  207. package/docs-site/en/mcp-servers.html +1 -1
  208. package/docs-site/en/mcp.html +1 -1
  209. package/docs-site/en/permissions.html +1 -1
  210. package/docs-site/en/profiles.html +1 -1
  211. package/docs-site/en/quickstart.html +1 -1
  212. package/docs-site/en/runtime.html +2 -2
  213. package/docs-site/en/scope.html +1 -1
  214. package/docs-site/en/security.html +1 -1
  215. package/docs-site/en/team.html +1 -1
  216. package/docs-site/en/whats-new.html +12 -1
  217. package/docs-site/en/workflows.html +1 -1
  218. package/docs-site/index.html +1 -1
  219. package/docs-site/mcp-approval.html +1 -1
  220. package/docs-site/mcp-auth.html +1 -1
  221. package/docs-site/mcp-servers.html +1 -1
  222. package/docs-site/mcp.html +1 -1
  223. package/docs-site/permissions.html +1 -1
  224. package/docs-site/profiles.html +1 -1
  225. package/docs-site/quickstart.html +1 -1
  226. package/docs-site/runtime.html +3 -3
  227. package/docs-site/scope.html +1 -1
  228. package/docs-site/security.html +1 -1
  229. package/docs-site/team.html +1 -1
  230. package/docs-site/whats-new.html +12 -1
  231. package/docs-site/workflows.html +1 -1
  232. package/evals/architecture-conformance-v1/lane.json +18 -0
  233. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  234. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  235. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  236. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  238. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  240. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  241. package/evals/fixtures/composite-criterion.valid.json +33 -0
  242. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  243. package/evals/fixtures/contract-family-library.valid.json +41 -0
  244. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  245. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  246. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  247. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  248. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  252. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  254. package/evals/fs5-artifact-archive/README.md +32 -0
  255. package/evals/fs5-artifact-archive/manifest.json +148 -0
  256. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  257. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  258. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  259. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  260. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  261. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  262. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  263. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  264. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  265. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  266. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  267. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  268. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  269. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  270. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  271. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  272. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  273. package/evals/fs5-causal-arm.v1.json +9 -5
  274. package/evals/fs5-pilot-protocol.v1.json +1 -1
  275. package/evals/fs5-pilot-protocol.v4.json +4 -4
  276. package/evals/fs5-pilot-protocol.v5.json +6 -5
  277. package/evals/harness-next/development-corpus.mjs +106 -0
  278. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  279. package/evals/harness-next/run-calibration.mjs +83 -0
  280. package/evals/harness-next/run-resource-probe.mjs +55 -0
  281. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  282. package/evals/harness-next.v1.json +51 -0
  283. package/evals/long-horizon-v1/README.md +19 -0
  284. package/evals/long-horizon-v1/runner.mjs +116 -48
  285. package/evals/long-horizon-v1/worker.mjs +77 -30
  286. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  287. package/evals/private-holdout-v1/README.md +5 -2
  288. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  289. package/package.json +9 -4
  290. package/packages/piagent-core/README.md +2 -2
  291. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  292. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  293. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  294. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  295. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  296. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  297. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  298. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  299. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  300. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  301. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  303. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  304. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  305. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  306. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  307. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  309. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  310. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  311. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  312. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  313. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  314. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  315. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  317. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  318. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  319. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  320. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  321. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  322. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  323. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  325. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  326. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  328. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  329. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  330. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  331. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  332. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  334. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  335. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  336. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  337. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  338. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  339. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  340. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  341. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  342. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  343. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  344. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  345. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  346. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  347. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  348. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  349. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  350. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  351. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  352. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  354. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  355. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  356. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  357. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  358. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  359. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  360. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  363. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  364. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  365. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  366. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  368. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  369. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  370. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  371. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  372. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  373. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  393. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  394. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  395. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  396. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  397. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  398. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  400. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  401. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  402. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  405. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  406. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  407. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  408. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  409. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  410. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  411. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  412. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  413. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  414. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  415. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  416. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  417. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  418. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  419. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  421. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  422. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  423. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  424. package/packages/piagent-core/extensions/context-engine.js +11 -6
  425. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  426. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  427. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  428. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  429. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  430. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  431. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  432. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  433. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  434. package/packages/piagent-core/extensions/task-journal.js +48 -3
  435. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  436. package/packages/piagent-core/extensions/task-state.js +74 -38
  437. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  438. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  439. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  440. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  441. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  442. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  443. package/packages/piagent-core/package.json +3 -3
  444. package/packages/piagent-core/policies/base-policy.json +1 -0
  445. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  446. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  447. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  448. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  449. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  450. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  451. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  452. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  453. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  454. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  455. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  457. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  458. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  461. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  462. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  463. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  464. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  465. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  466. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  467. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  468. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  469. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  470. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  471. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  472. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  473. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  474. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  475. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  476. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  477. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  478. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  479. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  480. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  481. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  482. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  483. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  484. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  485. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  486. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  487. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  488. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  489. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  490. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  491. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  492. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  493. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  494. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  495. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  496. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  497. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  498. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  499. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  500. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  501. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  502. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  503. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  504. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  505. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  506. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  507. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  508. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  509. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  510. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  511. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  512. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  513. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  514. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  515. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  516. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  517. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  518. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  519. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  520. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  521. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  522. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  523. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  524. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  525. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  526. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  527. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  528. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  529. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  530. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  531. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  532. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
  533. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  534. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  535. package/packages/piagent-webui/dist/client/index.html +2 -2
  536. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  537. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  538. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  539. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  540. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  541. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  542. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  543. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  544. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  545. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  546. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  547. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  548. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  549. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  550. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  551. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  552. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  553. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  554. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  555. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  556. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  557. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  558. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  559. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  560. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  561. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  562. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  563. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  564. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  565. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  566. package/schemas/approved-host-contracts.schema.json +973 -0
  567. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  568. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  569. package/schemas/composite-criterion.schema.json +788 -0
  570. package/schemas/contract-family-library.schema.json +28 -0
  571. package/schemas/contract-selection-recipe.schema.json +31 -0
  572. package/schemas/failure-evidence.schema.json +2 -2
  573. package/schemas/helper-request.schema.json +16 -4
  574. package/schemas/host-contract-plan.schema.json +25 -0
  575. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  576. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  577. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  578. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  579. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  580. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  581. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  582. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  583. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  584. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  585. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  586. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  587. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  588. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  589. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  590. package/schemas/task-contract.schema.json +30 -0
  591. package/scripts/approve-independent-verification.mjs +57 -0
  592. package/scripts/benchmark-arm-observer.mjs +320 -0
  593. package/scripts/benchmark-budget-ipc.mjs +34 -0
  594. package/scripts/benchmark-budget-launcher.mjs +91 -0
  595. package/scripts/benchmark-budget-processes.mjs +133 -0
  596. package/scripts/benchmark-budget-publication.mjs +228 -0
  597. package/scripts/benchmark-budget-runtime.mjs +136 -0
  598. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  599. package/scripts/benchmark-codex-journey.mjs +406 -0
  600. package/scripts/benchmark-independent-verification.mjs +628 -0
  601. package/scripts/benchmark-journey-outcome.mjs +92 -0
  602. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  603. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  604. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  605. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  606. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  607. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  608. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  609. package/scripts/benchmark-runner-completion.mjs +133 -0
  610. package/scripts/benchmark-runner-configuration.mjs +159 -0
  611. package/scripts/benchmark-runner-core.mjs +217 -388
  612. package/scripts/benchmark-runner-finalization.mjs +140 -27
  613. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  614. package/scripts/benchmark-runner-schedule.mjs +256 -0
  615. package/scripts/benchmark-runner-support.mjs +136 -4
  616. package/scripts/benchmark-runner.mjs +95 -18
  617. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  618. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  619. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  620. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  621. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  622. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  623. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  624. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  625. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  626. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  627. package/scripts/benchmark-session-evaluator.mjs +169 -0
  628. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  629. package/scripts/benchmark-session-usage.mjs +28 -0
  630. package/scripts/benchmark-session.mjs +343 -50
  631. package/scripts/benchmark-webui-journey.mjs +678 -0
  632. package/scripts/check-public-wording.mjs +46 -0
  633. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  634. package/scripts/phase-tools-evaluation.mjs +1 -0
  635. package/scripts/pi-auto.sh +7 -1
  636. package/scripts/pi-usage-history.mjs +201 -11
  637. package/scripts/piagent-cli.mjs +8 -0
  638. package/scripts/private-holdout-readiness.mjs +7 -1
  639. package/scripts/public-evaluation-exposure.mjs +140 -0
  640. package/scripts/select-independent-verification.mjs +62 -0
  641. package/scripts/typescript-loader.mjs +135 -1
  642. package/scripts/update-global.mjs +6 -7
  643. package/scripts/verify-local.sh +36 -55
  644. package/scripts/verify-release-identity.mjs +5 -3
  645. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -0,0 +1,337 @@
1
+ import { createHash, createHmac, createSecretKey, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { discoverRuntimeIntegrityFiles } from "../capabilities/runtime-integrity.js";
5
+ import { compileCompositeContract } from "./acceptance-composite-contract.js";
6
+ import { compileIndependentContract } from "./acceptance-independent-contract.js";
7
+ import { openAcceptanceEvidenceStore } from "./acceptance-evidence-store.js";
8
+ import { validateModulePaths } from "./acceptance-executor/module-graph.mjs";
9
+ import { validateContractSelection } from "./acceptance-contract-selection.js";
10
+ import { expectedNodeProfile } from "./acceptance-executor/node-profile.mjs";
11
+
12
+ export const HOST_CONTRACT_CONFIGURATION_VERSION = "approved-host-contracts-v1";
13
+ export const HOST_CONTRACT_SET_VERSION = "approved-host-contract-set-v1";
14
+ export const NODE_HOST_CONTRACT_CONFIGURATION_VERSION = "approved-host-contracts-v2";
15
+ export const NODE_HOST_CONTRACT_SET_VERSION = "approved-host-contract-set-v2";
16
+ const HASH = /^[a-f0-9]{64}$/;
17
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
18
+ const freeze = (value) => { if (value && typeof value === "object") { Object.values(value).forEach(freeze); Object.freeze(value); } return value; };
19
+ const exact = (value, fields) => value && typeof value === "object" && !Array.isArray(value)
20
+ && Object.keys(value).length === fields.length && fields.every((field) => Object.hasOwn(value, field));
21
+ const COMPOSITE_PLAN_CONTEXT_VERSION = "composite-plan-context-v1";
22
+ const MATERIAL_PATH = /^(?!\/)(?!.*\/\/)(?!.*\/$)(?!.*(?:^|\/)(?:\.{1,2}|\.git|\.pi|node_modules)(?:\/|$))[^\\\0-\x1f\x7f:%?#]+$/;
23
+
24
+ function parseStrictCompositeDeclarations(raw) {
25
+ if (typeof raw !== "string" || !raw.isWellFormed() || Buffer.byteLength(raw) < 1 || Buffer.byteLength(raw) > 1024 * 1024) {
26
+ throw new TypeError("Invalid composite declaration bytes");
27
+ }
28
+ let value;
29
+ try { value = JSON.parse(raw); } catch { throw new TypeError("Invalid composite declaration JSON"); }
30
+ const stack = [];
31
+ for (const match of raw.matchAll(/"(?:\\.|[^"\\])*"|[{}\[\],:]/g)) {
32
+ const token = match[0], current = stack.at(-1);
33
+ if (token === "{") stack.push({ keys: new Set(), key: true });
34
+ else if (token === "[") stack.push({ keys: null });
35
+ else if (token === "}" || token === "]") stack.pop();
36
+ else if (current?.keys && token === ",") current.key = true;
37
+ else if (current?.keys && token === ":") current.key = false;
38
+ else if (current?.keys && current.key && token.startsWith('"')) {
39
+ const key = JSON.parse(token);
40
+ if (current.keys.has(key)) throw new TypeError("Duplicate composite declaration key");
41
+ current.keys.add(key);
42
+ }
43
+ if (stack.length > 20) throw new TypeError("Composite declaration nesting exceeds bound");
44
+ }
45
+ return value;
46
+ }
47
+
48
+ function validateCompositeHostContract(contract, backend) {
49
+ if (!exact(contract, ["route", "criterionId", "criterionHash", "maxAttempts", "planContext"])
50
+ || contract.route !== "composite" || typeof contract.criterionId !== "string" || !/^[a-z][a-z0-9._-]{0,63}$/.test(contract.criterionId)
51
+ || !HASH.test(contract.criterionHash) || !Number.isSafeInteger(contract.maxAttempts) || contract.maxAttempts < 1 || contract.maxAttempts > 8
52
+ || !exact(contract.planContext, ["version", "contractText", "declarationsText", "identity", "materialBindings"])
53
+ || contract.planContext.version !== COMPOSITE_PLAN_CONTEXT_VERSION || typeof contract.planContext.contractText !== "string"
54
+ || !contract.planContext.contractText.isWellFormed() || Buffer.byteLength(contract.planContext.contractText) < 1
55
+ || Buffer.byteLength(contract.planContext.contractText) > 1024 * 1024) throw new TypeError("Invalid approved composite criterion contract");
56
+ const declarations = parseStrictCompositeDeclarations(contract.planContext.declarationsText);
57
+ const compiled = compileCompositeContract(contract.planContext.contractText, declarations);
58
+ if (compiled.criterionBinding !== "matched" || compiled.contract.criterionId !== contract.criterionId
59
+ || compiled.contract.criterionHash !== contract.criterionHash
60
+ || compiled.codePlans.some(plan => JSON.stringify(plan.profile) !== JSON.stringify(backend?.profile))) {
61
+ throw new TypeError("Approved composite criterion binding mismatch");
62
+ }
63
+ const identity = contract.planContext.identity;
64
+ if (!exact(identity, ["suiteDigest", "configDigest", "armDigest"])
65
+ || ![identity.suiteDigest, identity.configDigest, identity.armDigest].every(value => HASH.test(value))) {
66
+ throw new TypeError("Invalid approved composite identity");
67
+ }
68
+ const bindings = contract.planContext.materialBindings;
69
+ if (!Array.isArray(bindings) || bindings.length > 32 || bindings.length !== declarations.materials.length) {
70
+ throw new TypeError("Invalid approved composite material bindings");
71
+ }
72
+ const declared = new Map(declarations.materials.map(material => [material.id, material])), ids = new Set(), paths = new Set();
73
+ for (const binding of bindings) {
74
+ if (!exact(binding, ["id", "mode", "relativePath", "sha256"]) || !declared.has(binding.id) || ids.has(binding.id)
75
+ || !["frozen", "current", "protected"].includes(binding.mode) || typeof binding.relativePath !== "string"
76
+ || binding.relativePath.length > 1024 || !MATERIAL_PATH.test(binding.relativePath) || paths.has(binding.relativePath)
77
+ || binding.mode === "frozen" !== HASH.test(binding.sha256 ?? "")
78
+ || binding.mode !== "frozen" && binding.sha256 !== null
79
+ || binding.mode === "protected" && declared.get(binding.id).byteLength !== 0) {
80
+ throw new TypeError("Invalid approved composite material binding");
81
+ }
82
+ ids.add(binding.id); paths.add(binding.relativePath);
83
+ }
84
+ return compiled;
85
+ }
86
+
87
+ export function installedContractVerifierDigest(root) {
88
+ const canonical = fs.realpathSync.native(root), digest = createHash("sha256");
89
+ digest.update(HOST_CONTRACT_CONFIGURATION_VERSION);
90
+ const files = discoverRuntimeIntegrityFiles(canonical);
91
+ const familyLibrary = "adapters/node-typescript/contract-families.json";
92
+ if (fs.existsSync(path.join(canonical, familyLibrary)) && !files.includes(familyLibrary)) files.push(familyLibrary);
93
+ for (const required of ["packages/piagent-core/extensions/acceptance-authenticated-admission.js", "packages/piagent-core/extensions/acceptance-durable-execution.js",
94
+ "packages/piagent-core/extensions/acceptance-host-configuration.js"]) if (!files.includes(required)) files.push(required);
95
+ for (const relative of files.sort()) {
96
+ const file = path.join(canonical, relative), stat = fs.lstatSync(file);
97
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 16 * 1024 * 1024) throw new Error("Unsafe installed verifier file");
98
+ const bytes = fs.readFileSync(file);
99
+ digest.update(JSON.stringify([relative, bytes.length])); digest.update(bytes);
100
+ }
101
+ return digest.digest("hex");
102
+ }
103
+
104
+ /** Structural/semantic validation only; a payload is not authenticated authority. */
105
+ /** Request-set native-only steps grant no criterion receipts. Unknown requests
106
+ * and mutation-capable tasks cannot borrow another request's authority. */
107
+ export function independentRequestAdmissionBlock(request, task) {
108
+ if (!request) return "independent host approval does not cover the current operator request";
109
+ if (request.nativeOnly === true && (task.changeMode !== "read-only" || task.mutationPolicy !== "forbidden")) {
110
+ return "native-only host approval requires a read-only mutation-forbidden task";
111
+ }
112
+ return undefined;
113
+ }
114
+
115
+ export function validateHostContractPayload(payload) {
116
+ if ([HOST_CONTRACT_SET_VERSION, NODE_HOST_CONTRACT_SET_VERSION].includes(payload?.version)) {
117
+ if (!exact(payload, ["version", "projectId", "verifierDigest", "plans"])
118
+ || !HASH.test(payload.projectId) || !HASH.test(payload.verifierDigest)) throw new TypeError("Invalid host contract set");
119
+ validatePlanList(payload.plans, payload.version === NODE_HOST_CONTRACT_SET_VERSION ? 3 : 1);
120
+ return payload;
121
+ }
122
+ const schemaVersion = payload?.version === NODE_HOST_CONTRACT_CONFIGURATION_VERSION ? 3
123
+ : payload?.version === HOST_CONTRACT_CONFIGURATION_VERSION ? 1 : null;
124
+ if (!exact(payload, ["version", "projectId", "operatorRequestDigest", "verifierDigest", "backend", "contracts"])
125
+ || schemaVersion === null || !HASH.test(payload.projectId)
126
+ || !HASH.test(payload.verifierDigest)) throw new TypeError("Invalid host contract approval");
127
+ validateContractBody(payload, schemaVersion);
128
+ return payload;
129
+ }
130
+
131
+ /** The same plan validation used by the operator CLI, without filesystem writes. */
132
+ export function validateHostContractPlan(plan) {
133
+ if ([2, 4].includes(plan?.schemaVersion)) {
134
+ if (!exact(plan, ["schemaVersion", "plans"])) throw new TypeError("Invalid host contract plan set");
135
+ validatePlanList(plan.plans, plan.schemaVersion === 4 ? 3 : 1);
136
+ return plan;
137
+ }
138
+ if (Object.hasOwn(plan ?? {}, "nativeOnly")) throw new TypeError("Native-only steps require an explicit request set");
139
+ validateSinglePlan(plan);
140
+ return plan;
141
+ }
142
+
143
+ function validateSinglePlan(plan) {
144
+ if (!exact(plan, ["schemaVersion", "operatorRequestDigest", "backend", "contracts",
145
+ ...(Object.hasOwn(plan ?? {}, "nativeOnly") ? ["nativeOnly"] : [])]) || ![1, 3].includes(plan.schemaVersion)) {
146
+ throw new TypeError("Invalid host contract plan");
147
+ }
148
+ validateContractBody(plan, plan.schemaVersion);
149
+ }
150
+
151
+ function validatePlanList(plans, schemaVersion) {
152
+ if (!Array.isArray(plans) || plans.length < 1 || plans.length > 32) throw new TypeError("Invalid host contract plan count");
153
+ const requests = new Set();
154
+ for (const plan of plans) {
155
+ validateSinglePlan(plan);
156
+ if (plan.schemaVersion !== schemaVersion) throw new TypeError("Mixed host contract plan versions");
157
+ if (requests.has(plan.operatorRequestDigest)) throw new TypeError("Ambiguous approved operator request");
158
+ requests.add(plan.operatorRequestDigest);
159
+ }
160
+ }
161
+
162
+ function validateContractBody(payload, schemaVersion = 1) {
163
+ const nodeProfile = schemaVersion === 3;
164
+ const hasDockerCommand = Object.hasOwn(payload.backend ?? {}, "dockerCommand");
165
+ const backendFields = nodeProfile
166
+ ? ["imageId", "dockerSocket", ...(hasDockerCommand ? ["dockerCommand"] : []), "timeoutMs", "profile"]
167
+ : ["imageId", "dockerSocket", "timeoutMs"];
168
+ if (Object.hasOwn(payload.backend ?? {}, "startupAllowanceMs")) backendFields.push("startupAllowanceMs");
169
+ if (!/^operator-request-v1:[a-f0-9]{64}$/.test(payload.operatorRequestDigest)
170
+ || !exact(payload.backend, backendFields)
171
+ || !/^sha256:[a-f0-9]{64}$/.test(payload.backend.imageId) || typeof payload.backend.dockerSocket !== "string"
172
+ || !path.isAbsolute(payload.backend.dockerSocket) || payload.backend.dockerSocket.includes("\0")
173
+ || hasDockerCommand && (!nodeProfile
174
+ || JSON.stringify(Object.keys(payload.backend.dockerCommand ?? {})) !== JSON.stringify(["path", "sha256"])
175
+ || typeof payload.backend.dockerCommand.path !== "string"
176
+ || !path.isAbsolute(payload.backend.dockerCommand.path)
177
+ || path.normalize(payload.backend.dockerCommand.path) !== payload.backend.dockerCommand.path
178
+ || payload.backend.dockerCommand.path.includes("\0")
179
+ || !HASH.test(String(payload.backend.dockerCommand.sha256 ?? "")))
180
+ || Object.hasOwn(payload.backend, "startupAllowanceMs") && (!Number.isSafeInteger(payload.backend.startupAllowanceMs)
181
+ || payload.backend.startupAllowanceMs < 0 || payload.backend.startupAllowanceMs > 60000)
182
+ || !Number.isSafeInteger(payload.backend.timeoutMs) || payload.backend.timeoutMs < 25 || payload.backend.timeoutMs > 30000
183
+ || nodeProfile && JSON.stringify(payload.backend.profile) !== JSON.stringify(expectedNodeProfile())
184
+ || !Array.isArray(payload.contracts) || payload.contracts.length > 12
185
+ || (Object.hasOwn(payload, "nativeOnly")
186
+ ? !nodeProfile || payload.nativeOnly !== true || payload.contracts.length !== 0
187
+ : payload.contracts.length < 1)) throw new TypeError("Invalid host contract approval");
188
+ const ids = new Set();
189
+ for (const contract of payload.contracts) {
190
+ if (nodeProfile && contract?.route === "composite") {
191
+ validateCompositeHostContract(contract, payload.backend);
192
+ if (ids.has(contract.criterionId)) throw new TypeError("Invalid approved criterion contract");
193
+ ids.add(contract.criterionId);
194
+ continue;
195
+ }
196
+ if (!exact(contract, [...(nodeProfile ? ["route"] : []), "criterionId", "criterionHash", "sourcePath", "exportName", "maxAttempts", "checks",
197
+ ...(Object.hasOwn(contract, "modulePaths") ? ["modulePaths"] : []), ...(Object.hasOwn(contract, "selection") ? ["selection"] : [])])
198
+ || typeof contract.criterionId !== "string" || !/^[a-z0-9][a-z0-9:._-]{0,79}$/.test(contract.criterionId)
199
+ || ids.has(contract.criterionId) || !HASH.test(contract.criterionHash) || typeof contract.sourcePath !== "string"
200
+ || !contract.sourcePath || path.isAbsolute(contract.sourcePath) || contract.sourcePath.includes("\\") || contract.sourcePath.includes("\0")
201
+ || contract.sourcePath.split("/").some((part) => ["", ".", "..", ".git", ".pi", "node_modules"].includes(part))
202
+ || nodeProfile && contract.route !== "code"
203
+ || !Number.isSafeInteger(contract.maxAttempts) || contract.maxAttempts < 1 || contract.maxAttempts > 8) throw new TypeError("Invalid approved criterion contract");
204
+ ids.add(contract.criterionId);
205
+ if (Object.hasOwn(contract, "selection")) validateContractSelection(contract.selection, contract.criterionHash);
206
+ if (Object.hasOwn(contract, "modulePaths")) validateModulePaths(contract.sourcePath, contract.modulePaths);
207
+ compileIndependentContract(JSON.stringify({ schemaVersion: nodeProfile ? 2 : 1, ...(nodeProfile ? { profile: payload.backend.profile } : {}),
208
+ source: "export const placeholder = 0;", exportName: contract.exportName, checks: contract.checks }));
209
+ }
210
+ }
211
+
212
+ function privateDirectory(directory, projectRoot) {
213
+ const root = fs.realpathSync.native(projectRoot);
214
+ if (!path.isAbsolute(directory) || fs.realpathSync.native(directory) !== directory) throw new Error("Authority path must be canonical");
215
+ const relative = path.relative(root, directory);
216
+ if (!relative || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative))) throw new Error("Authority must be outside the candidate project");
217
+ const stat = fs.lstatSync(directory);
218
+ if (!stat.isDirectory() || stat.uid !== process.getuid() || (stat.mode & 0o077) !== 0) throw new Error("Authority directory must be private and host-owned");
219
+ }
220
+
221
+ function readPrivate(file, maximum) {
222
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
223
+ try {
224
+ const stat = fs.fstatSync(fd);
225
+ if (!stat.isFile() || stat.nlink !== 1 || stat.uid !== process.getuid() || (stat.mode & 0o077) !== 0
226
+ || stat.size < 1 || stat.size > maximum) throw new Error("Invalid private authority file");
227
+ const bytes = fs.readFileSync(fd);
228
+ if (bytes.length !== stat.size) throw new Error("Authority changed while reading");
229
+ return bytes;
230
+ } finally { fs.closeSync(fd); }
231
+ }
232
+
233
+ const signatureVersion = payload => [NODE_HOST_CONTRACT_CONFIGURATION_VERSION, NODE_HOST_CONTRACT_SET_VERSION].includes(payload?.version)
234
+ ? NODE_HOST_CONTRACT_CONFIGURATION_VERSION : HOST_CONTRACT_CONFIGURATION_VERSION;
235
+ const signature = (key, configPath, payload) => createHmac("sha256", key)
236
+ .update(`${signatureVersion(payload)}\0${configPath}\0${JSON.stringify(payload)}`).digest("hex");
237
+
238
+ /** Read-only preview; validation creates no key, receipt, or execution. */
239
+ export function prepareHostContractApproval({ projectRoot, installedRoot, operatorRequestDigest, backend, contracts, plans }) {
240
+ if (plans !== undefined && [operatorRequestDigest, backend, contracts].some(value => value !== undefined)) {
241
+ throw new TypeError("Cannot mix a single approved request with a plan set");
242
+ }
243
+ const identity = { projectId: hash(fs.realpathSync.native(projectRoot)), verifierDigest: installedContractVerifierDigest(installedRoot) };
244
+ const nodeProfile = plans === undefined ? backend?.profile !== undefined : plans[0]?.schemaVersion === 3;
245
+ const text = JSON.stringify(plans === undefined
246
+ ? { version: nodeProfile ? NODE_HOST_CONTRACT_CONFIGURATION_VERSION : HOST_CONTRACT_CONFIGURATION_VERSION, ...identity, operatorRequestDigest, backend, contracts }
247
+ : { version: nodeProfile ? NODE_HOST_CONTRACT_SET_VERSION : HOST_CONTRACT_SET_VERSION, ...identity, plans });
248
+ if (Buffer.byteLength(text) > 2 * 1024 * 1024) throw new TypeError("Host approval is too large");
249
+ const payload = JSON.parse(text);
250
+ validateHostContractPayload(payload);
251
+ return freeze(payload);
252
+ }
253
+
254
+ /** Explicit operator setup only. A new directory is required; nothing is overwritten. */
255
+ export function writeHostContractApproval({ directory, projectRoot, installedRoot, operatorRequestDigest, backend, contracts, plans, approved = false }) {
256
+ if (approved !== true || typeof directory !== "string" || !path.isAbsolute(directory)
257
+ || path.resolve(directory) !== directory || fs.realpathSync.native(path.dirname(directory)) !== path.dirname(directory)) throw new Error("Explicit canonical host approval is required");
258
+ const root = fs.realpathSync.native(projectRoot), relative = path.relative(root, directory);
259
+ if (!relative || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative))) throw new Error("Authority must be outside the candidate project");
260
+ const payload = prepareHostContractApproval({ projectRoot, installedRoot, operatorRequestDigest, backend, contracts, plans });
261
+ const configPath = path.join(directory, "approval.json"), bytes = randomBytes(32), key = createSecretKey(bytes);
262
+ const envelope = JSON.stringify({ payload, signature: signature(key, configPath, payload) });
263
+ if (Buffer.byteLength(envelope) > 2 * 1024 * 1024) throw new Error("Host approval is too large");
264
+ fs.mkdirSync(directory, { mode: 0o700 });
265
+ privateDirectory(directory, projectRoot);
266
+ function write(name, content) {
267
+ const fd = fs.openSync(path.join(directory, name), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW, 0o600);
268
+ try { fs.writeFileSync(fd, content); fs.fsyncSync(fd); } finally { fs.closeSync(fd); }
269
+ }
270
+ try { write("authority.key", bytes); write("approval.json", envelope); }
271
+ finally { bytes.fill(0); }
272
+ const fd = fs.openSync(directory, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
273
+ try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); }
274
+ return Object.freeze({ configPath, verifierDigest: payload.verifierDigest });
275
+ }
276
+
277
+ export function openHostContractConfiguration({ configPath, projectRoot, installedRoot }) {
278
+ const directory = path.dirname(configPath);
279
+ privateDirectory(directory, projectRoot);
280
+ if (path.basename(configPath) !== "approval.json" || path.resolve(configPath) !== configPath) throw new Error("Invalid host approval path");
281
+ const bytes = readPrivate(path.join(directory, "authority.key"), 32);
282
+ if (bytes.length !== 32) throw new Error("Invalid host authority key");
283
+ const key = createSecretKey(bytes); bytes.fill(0);
284
+ const text = readPrivate(configPath, 2 * 1024 * 1024).toString("utf8"), envelope = JSON.parse(text);
285
+ if (!exact(envelope, ["payload", "signature"]) || !HASH.test(envelope.signature)
286
+ || !timingSafeEqual(Buffer.from(signature(key, configPath, envelope.payload), "hex"), Buffer.from(envelope.signature, "hex"))) throw new Error("Host approval is unauthenticated");
287
+ validateHostContractPayload(envelope.payload);
288
+ if (envelope.payload.projectId !== hash(fs.realpathSync.native(projectRoot)) || envelope.payload.verifierDigest !== installedContractVerifierDigest(installedRoot)) {
289
+ throw new Error("Host approval project or installed verifier changed");
290
+ }
291
+ const store = openAcceptanceEvidenceStore({ filePath: path.join(directory, "evidence.sqlite"), projectRoot, key });
292
+ const payload = freeze(envelope.payload);
293
+ const setVersion = [HOST_CONTRACT_SET_VERSION, NODE_HOST_CONTRACT_SET_VERSION].includes(payload.version);
294
+ const requests = setVersion ? payload.plans.map(plan => freeze({
295
+ version: payload.version === NODE_HOST_CONTRACT_SET_VERSION ? NODE_HOST_CONTRACT_CONFIGURATION_VERSION : HOST_CONTRACT_CONFIGURATION_VERSION,
296
+ projectId: payload.projectId, verifierDigest: payload.verifierDigest,
297
+ operatorRequestDigest: plan.operatorRequestDigest, backend: plan.backend, contracts: plan.contracts,
298
+ ...(plan.nativeOnly === true ? { nativeOnly: true } : {})
299
+ })) : [payload];
300
+ function withCompositeAuthority({ contract, binding, create }) {
301
+ const owner = payload.contracts?.includes(contract) ? payload : requests.find(request => request.contracts.includes(contract));
302
+ if (!owner) {
303
+ throw new Error("Composite contract is not owned by this host approval");
304
+ }
305
+ if (contract.route !== "composite" || typeof create !== "function") throw new TypeError("Invalid composite authority request");
306
+ const compiled = validateCompositeHostContract(contract, owner.backend), plan = contract.planContext;
307
+ if (binding.suiteDigest !== plan.identity.suiteDigest || binding.configDigest !== plan.identity.configDigest
308
+ || binding.armDigest !== plan.identity.armDigest || binding.projectId !== payload.projectId
309
+ || binding.criterionId !== contract.criterionId || binding.criterionHash !== contract.criterionHash) {
310
+ throw new Error("Composite authority binding does not match the approved plan");
311
+ }
312
+ // The KeyObject is a same-process capability handed only to the trusted
313
+ // runtime callback. It is never returned, serialized, or placed in task data.
314
+ return create(Object.freeze({ key, directory, projectRoot, compiled,
315
+ contractText: plan.contractText, declarations: parseStrictCompositeDeclarations(plan.declarationsText),
316
+ maxAttempts: contract.maxAttempts }));
317
+ }
318
+ function withCompositeRecovery(create) {
319
+ if (typeof create !== "function" || !requests.some(request => request.contracts.some(contract => contract.route === "composite"))) {
320
+ throw new TypeError("Invalid composite recovery authority request");
321
+ }
322
+ return create(Object.freeze({ key, directory, projectRoot, payload }));
323
+ }
324
+ const configuration = { payload, store,
325
+ forRequest(operatorRequestDigest) { return requests.find(request => request.operatorRequestDigest === operatorRequestDigest) ?? null; },
326
+ isCurrent() {
327
+ try {
328
+ privateDirectory(directory, projectRoot);
329
+ const currentKey = readPrivate(path.join(directory, "authority.key"), 32);
330
+ const sameKey = currentKey.length === 32 && createSecretKey(currentKey).equals(key); currentKey.fill(0);
331
+ return sameKey && readPrivate(configPath, 2 * 1024 * 1024).toString("utf8") === text
332
+ && installedContractVerifierDigest(installedRoot) === envelope.payload.verifierDigest;
333
+ } catch { return false; }
334
+ }, withCompositeAuthority, withCompositeRecovery, close: () => store.close()
335
+ };
336
+ return Object.freeze(configuration);
337
+ }
@@ -0,0 +1,25 @@
1
+ import { hasExplicitInputRejection, malformedIdentifierContractText } from "./acceptance-boundary-guidance.js";
2
+
3
+ function normalizedText(value) {
4
+ return String(value ?? "").normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/\s+/g, " ");
5
+ }
6
+
7
+ function uniqueStrings(values) {
8
+ return [...new Set(values.filter((item) => typeof item === "string" && item.trim()).map((item) => item.trim()))];
9
+ }
10
+
11
+ /** Pair one malformed-input criterion only with the smallest related identifier declaration. */
12
+ export function malformedIdentifierCriterionText(primary, task = {}, excluded = new Set()) {
13
+ const direct = malformedIdentifierContractText(primary);
14
+ if (direct) return direct;
15
+ if (!hasExplicitInputRejection(primary)) return primary;
16
+ const candidates = uniqueStrings([task?.summary, task?.expectedOutput, ...(task?.acceptanceCriteria ?? [])])
17
+ .filter((candidate) => candidate !== primary && !excluded.has(candidate));
18
+ for (const candidate of candidates) {
19
+ const candidateContract = malformedIdentifierContractText(candidate);
20
+ if (candidateContract && !normalizedText(candidate).includes(normalizedText(primary))) continue;
21
+ const related = malformedIdentifierContractText(`${primary}\n${candidate}`);
22
+ if (related) return related;
23
+ }
24
+ return primary;
25
+ }
@@ -0,0 +1,209 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { runIsolatedContract } from "./acceptance-isolated-executor.js";
4
+ import { parseRequest, validateValue, MAX_STRING_LENGTH } from "./acceptance-executor/protocol.mjs";
5
+ import { canonicalValue } from "./acceptance-executor/values.mjs";
6
+ import { CASE_CAPABILITY_FIELDS, OBSERVATION_CAPABILITY_FIELDS, callbackIds, validateCallbackTrace, validateReturnIdentity, validateErrorObservation } from "./acceptance-executor/capabilities.mjs";
7
+ import { validateReferenceIdentity } from "./acceptance-executor/reference-identity.mjs";
8
+ import { validateDeclaredApi, observeDeclaredApi } from "./acceptance-declared-api.js";
9
+
10
+ export const INDEPENDENT_CONTRACT_VERSION = "bounded-module-contract-comparison-v6";
11
+ export const NODE_INDEPENDENT_CONTRACT_VERSION = "bounded-node-profile-contract-comparison-v3";
12
+ const ID = /^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,159}$/;
13
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
14
+ const ERROR_CLASSES = ["TypeError", "RangeError", "SyntaxError", "ReferenceError", "EvalError", "URIError", "Error", "non-error"];
15
+
16
+ function shape(value, keys, required = keys) {
17
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype
18
+ || Object.keys(value).some((key) => !keys.includes(key)) || required.some((key) => !Object.hasOwn(value, key))) {
19
+ throw new TypeError("Invalid independent contract object");
20
+ }
21
+ }
22
+
23
+ function freeze(value) {
24
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
25
+ for (const child of Object.values(value)) freeze(child);
26
+ Object.freeze(value);
27
+ }
28
+ return value;
29
+ }
30
+
31
+ function validateExpected(expected, item, nodeProfile = false) {
32
+ const { args } = item;
33
+ shape(expected, ["outcome", "value", "errorClass", "clockReads", "dateArgsAfter", "argsAfter", "publicApi", ...OBSERVATION_CAPABILITY_FIELDS], ["outcome"]);
34
+ if (Object.hasOwn(expected, "publicApi")) {
35
+ if (!nodeProfile) throw new TypeError("Declared API requires the explicit Node contract profile");
36
+ validateDeclaredApi(expected.publicApi);
37
+ }
38
+ if (nodeProfile && item.invocation?.kind === "construct" && !["constructed", "throw"].includes(expected.outcome)) {
39
+ throw new TypeError("Invalid constructor expectation");
40
+ }
41
+ if (expected.outcome === "return") {
42
+ validateValue(expected.value, false, new Set(), { typedBytes: nodeProfile });
43
+ if (Object.hasOwn(expected, "errorClass")) throw new TypeError("Conflicting expected result");
44
+ } else if (expected.outcome === "throw") {
45
+ if (!ERROR_CLASSES.includes(expected.errorClass) || Object.hasOwn(expected, "value")) throw new TypeError("Invalid expected exception");
46
+ } else if (nodeProfile && expected.outcome === "constructed") {
47
+ if (item.invocation?.kind !== "construct" || Object.hasOwn(expected, "value") || Object.hasOwn(expected, "errorClass")) {
48
+ throw new TypeError("Invalid expected construction");
49
+ }
50
+ } else throw new TypeError("Invalid expected outcome");
51
+ if (Object.hasOwn(expected, "clockReads") && (!Number.isSafeInteger(expected.clockReads) || expected.clockReads < 0)) {
52
+ throw new TypeError("Invalid expected clock reads");
53
+ }
54
+ if (Object.hasOwn(expected, "dateArgsAfter")) {
55
+ const indexes = args.flatMap((arg, index) => arg.type === "date" ? [index] : []);
56
+ if (!Array.isArray(expected.dateArgsAfter) || expected.dateArgsAfter.length !== indexes.length) throw new TypeError("Incomplete expected Date state");
57
+ expected.dateArgsAfter.forEach((arg, index) => {
58
+ shape(arg, ["index", "value"]);
59
+ if (arg.index !== indexes[index]) throw new TypeError("Wrong expected Date argument");
60
+ validateValue({ type: "number", value: arg.value }, false);
61
+ });
62
+ }
63
+ if (Object.hasOwn(expected, "argsAfter")) {
64
+ if (!item.observeArgs || !Array.isArray(expected.argsAfter) || expected.argsAfter.length !== args.length) throw new TypeError("Incomplete expected argument state");
65
+ expected.argsAfter.forEach((arg) => validateValue(arg, true, callbackIds(item), { typedBytes: nodeProfile }));
66
+ }
67
+ if (item.callbacks) validateCallbackTrace(expected.callbackTrace, item, { nodeProfile });
68
+ else if (Object.hasOwn(expected, "callbackTrace")) throw new TypeError("Unexpected expected callback trace");
69
+ if (item.referencePairs || Object.hasOwn(expected, "referenceIdentity")) validateReferenceIdentity(expected.referenceIdentity, item);
70
+ if (item.observeIdentity && expected.outcome === "return" || Object.hasOwn(expected, "returnIdentity")) {
71
+ if (expected.outcome !== "return") throw new TypeError("Return identity on an exception");
72
+ validateReturnIdentity(expected.returnIdentity, item);
73
+ }
74
+ if (item.observeError && expected.outcome === "throw" || Object.hasOwn(expected, "errorObservation")) {
75
+ if (expected.outcome !== "throw") throw new TypeError("Error observation on a return");
76
+ validateErrorObservation(expected.errorObservation, item, { nodeProfile });
77
+ }
78
+ if (item.observeErrorMessage && expected.outcome === "throw" || Object.hasOwn(expected, "errorMessage")) {
79
+ if (!item.observeErrorMessage || expected.outcome !== "throw") throw new TypeError("Unexpected expected error message");
80
+ shape(expected.errorMessage, ["includes", "ignoreCase"]);
81
+ if (typeof expected.errorMessage.includes !== "string" || !expected.errorMessage.includes.length
82
+ || expected.errorMessage.includes.length > MAX_STRING_LENGTH || typeof expected.errorMessage.ignoreCase !== "boolean") {
83
+ throw new TypeError("Invalid expected error message");
84
+ }
85
+ }
86
+ }
87
+
88
+ /** Compile a HOST-OWNED, independently specified plan, not model-authored proof. */
89
+ export function compileIndependentContract(planText) {
90
+ if (typeof planText !== "string" || Buffer.byteLength(planText) > 1024 * 1024) throw new TypeError("Contract plan size exceeded");
91
+ const plan = JSON.parse(planText);
92
+ const nodeProfile = plan?.schemaVersion === 2;
93
+ shape(plan, ["schemaVersion", "profile", "source", "exportName", "checks", "moduleGraph"],
94
+ nodeProfile ? ["schemaVersion", "profile", "source", "exportName", "checks"] : ["schemaVersion", "source", "exportName", "checks"]);
95
+ if (!nodeProfile && plan.schemaVersion !== 1 || !Array.isArray(plan.checks) || plan.checks.length < 1 || plan.checks.length > 256) {
96
+ throw new TypeError("Invalid contract checks");
97
+ }
98
+ const ids = new Set();
99
+ const cases = [];
100
+ for (const check of plan.checks) {
101
+ shape(check, ["id", "cases"]);
102
+ if (typeof check.id !== "string" || !ID.test(check.id) || ids.has(check.id) || !Array.isArray(check.cases)
103
+ || check.cases.length < 1 || check.cases.length > 256) throw new TypeError("Invalid independent check");
104
+ ids.add(check.id);
105
+ for (const item of check.cases) {
106
+ shape(item, ["id", "args", "clock", "expected", "sequence", "exportName", "reset", "observeArgs", "invocation", ...CASE_CAPABILITY_FIELDS],
107
+ nodeProfile ? ["id", "args", "expected", "invocation"] : ["id", "args", "expected"]);
108
+ const { expected, ...input } = item;
109
+ cases.push(input);
110
+ if (cases.length > 256) throw new TypeError("Too many independent cases");
111
+ }
112
+ }
113
+ const requestText = JSON.stringify({ schemaVersion: nodeProfile ? 2 : 1, ...(nodeProfile ? { profile: plan.profile } : {}),
114
+ source: plan.source, exportName: plan.exportName, cases,
115
+ ...(Object.hasOwn(plan, "moduleGraph") ? { moduleGraph: plan.moduleGraph } : {}) });
116
+ parseRequest(requestText); // Validate all guest inputs before validating dependent expected state.
117
+ // Every failing step can retain its full replay prefix. Bound the worst-case
118
+ // repeated input bytes before execution, not after a large receipt is built.
119
+ let sequence, prefixBytes = 2, historyBytes = 0;
120
+ for (const item of cases) {
121
+ if (!item.sequence || item.sequence !== sequence) prefixBytes = 2;
122
+ sequence = item.sequence;
123
+ if (!sequence) continue;
124
+ prefixBytes += Buffer.byteLength(JSON.stringify(item)) + 1;
125
+ historyBytes += prefixBytes;
126
+ if (historyBytes > 2 * 1024 * 1024) throw new TypeError("Counterexample history budget exceeded");
127
+ }
128
+ for (const check of plan.checks) for (const item of check.cases) validateExpected(item.expected, item, nodeProfile);
129
+ const version = nodeProfile ? NODE_INDEPENDENT_CONTRACT_VERSION : INDEPENDENT_CONTRACT_VERSION;
130
+ return freeze({ version, plan, requestText, planDigest: hash(JSON.stringify([version, plan])) });
131
+ }
132
+
133
+ function matches(expected, observed) {
134
+ if (expected.outcome !== observed.outcome) return false;
135
+ if (Object.hasOwn(expected, "publicApi") && !isDeepStrictEqual(expected.publicApi, observed.publicApi)) return false;
136
+ if (expected.outcome === "return" && !isDeepStrictEqual(canonicalValue(expected.value), canonicalValue(observed.value))) return false;
137
+ if (expected.outcome === "throw" && expected.errorClass !== observed.errorClass) return false;
138
+ if (Object.hasOwn(expected, "errorMessage")) {
139
+ if (typeof observed.errorMessage !== "string" || observed.errorMessage.length > MAX_STRING_LENGTH) return false;
140
+ // Literal text only, with ECMAScript /i semantics. No plan-supplied pattern
141
+ // syntax, flags, callbacks or expectations enter the guest.
142
+ const literal = expected.errorMessage.includes.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
143
+ if (!new RegExp(literal, expected.errorMessage.ignoreCase ? "i" : "").test(observed.errorMessage)) return false;
144
+ }
145
+ if (Object.hasOwn(expected, "clockReads") && expected.clockReads !== observed.clockReads) return false;
146
+ if (Object.hasOwn(expected, "dateArgsAfter") && !isDeepStrictEqual(expected.dateArgsAfter, observed.dateArgsAfter)) return false;
147
+ if (Object.hasOwn(expected, "argsAfter") && !isDeepStrictEqual(expected.argsAfter.map(canonicalValue), observed.argsAfter?.map(canonicalValue))) return false;
148
+ const canonicalTrace = trace => trace?.map(call => call.event === "call" ? { ...call, args: call.args.map(canonicalValue) } : call);
149
+ if (Object.hasOwn(expected, "callbackTrace") && !isDeepStrictEqual(canonicalTrace(expected.callbackTrace), canonicalTrace(observed.callbackTrace))) return false;
150
+ if (Object.hasOwn(expected, "returnIdentity") && !isDeepStrictEqual(expected.returnIdentity, observed.returnIdentity)) return false;
151
+ if (Object.hasOwn(expected, "referenceIdentity") && !isDeepStrictEqual(expected.referenceIdentity, observed.referenceIdentity)) return false;
152
+ if (Object.hasOwn(expected, "errorObservation") && (expected.errorObservation.identity !== observed.errorObservation?.identity
153
+ || !observed.errorObservation || !isDeepStrictEqual(canonicalValue(expected.errorObservation.properties), canonicalValue(observed.errorObservation.properties)))) return false;
154
+ return true;
155
+ }
156
+
157
+ /**
158
+ * Actual observations come only from this invocation of the isolated adapter.
159
+ * Expected outputs remain on the host; guest output cannot select a verdict.
160
+ * This returns diagnostic evidence, NOT an authenticated durable receipt or
161
+ * completion authority. Runtime contract approval and snapshot binding remain
162
+ * required at integration. Unsupported execution is never a passed case.
163
+ */
164
+ export async function runIndependentContract({ planText, ...backend } = {}) {
165
+ const compiled = compileIndependentContract(planText);
166
+ const execution = await runIsolatedContract({ ...backend, ...(compiled.plan.schemaVersion === 2 ? { profile: compiled.plan.profile } : {}), requestText: compiled.requestText });
167
+ return compareIndependentExecution(compiled, execution);
168
+ }
169
+
170
+ /** Host comparison only: this pure projection does not certify an execution. */
171
+ export function compareIndependentExecution(compiled, execution) {
172
+ const counterexamples = [];
173
+ const observations = new Map((execution.observation?.cases ?? []).map((item) => [item.id, item]));
174
+ const api = compiled.plan.checks.some(check => check.cases.some(item => Object.hasOwn(item.expected, "publicApi")))
175
+ ? observeDeclaredApi(compiled.plan.source) : null;
176
+ let sequence, history = [];
177
+ const checks = compiled.plan.checks.map((check) => {
178
+ let caseCount = 0, incomplete = false, error = false, counterexampleRef;
179
+ for (const item of check.cases) {
180
+ const { expected: _expected, ...input } = item;
181
+ if (!item.sequence || item.sequence !== sequence) history = [];
182
+ sequence = item.sequence; history.push(input);
183
+ let observed = observations.get(item.id);
184
+ if (!observed || observed.outcome === "unsupported") { incomplete = true; continue; }
185
+ if (observed.outcome === "error") { error = true; continue; }
186
+ if (Object.hasOwn(item.expected, "publicApi")) {
187
+ if (api?.status !== "observed") { incomplete = true; continue; }
188
+ observed = { ...observed, publicApi: api.value };
189
+ }
190
+ caseCount += 1;
191
+ if (!matches(item.expected, observed)) {
192
+ const evidence = { version: compiled.version ?? INDEPENDENT_CONTRACT_VERSION, planDigest: compiled.planDigest,
193
+ runId: execution.runId, sourceDigest: execution.sourceDigest, imageId: execution.imageId,
194
+ checkId: check.id, input: { ...input, ...(sequence ? { prefix: history.slice() } : {}) },
195
+ expected: item.expected, observed };
196
+ const digest = hash(JSON.stringify(evidence));
197
+ counterexamples.push({ digest, evidence });
198
+ counterexampleRef ??= digest;
199
+ }
200
+ }
201
+ const status = error ? "error" : counterexampleRef ? "fail" : incomplete ? "unknown" : "pass";
202
+ return { id: check.id, status, caseCount, ...(status === "fail" ? { counterexampleRef } : {}) };
203
+ });
204
+ const statuses = checks.map((check) => check.status);
205
+ const verdict = execution.status !== "completed" || !execution.cleanupConfirmed || statuses.includes("error") ? "error"
206
+ : statuses.includes("fail") ? "fail" : statuses.includes("unknown") ? "unknown" : "pass";
207
+ return freeze({ version: compiled.version ?? INDEPENDENT_CONTRACT_VERSION, planDigest: compiled.planDigest,
208
+ verdict, execution, checks, counterexamples });
209
+ }