@piagent/platform 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +8 -2
  3. package/README.vi.md +11 -2
  4. package/adapters/common/assurance-producers.json +109 -0
  5. package/adapters/common/structured-assurance-facts.mjs +153 -0
  6. package/adapters/node-typescript/contract-families.json +2811 -0
  7. package/adapters/node-typescript/contract-families.md +90 -0
  8. package/benchmarks/production-v1/grade.mjs +20 -0
  9. package/benchmarks/production-v1/spend-control.v1.json +3 -3
  10. package/benchmarks/production-v2/grade.mjs +892 -0
  11. package/benchmarks/production-v2/project/README.md +7 -0
  12. package/benchmarks/production-v2/project/config/service.json +4 -0
  13. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  14. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  15. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  16. package/benchmarks/production-v2/project/package.json +11 -0
  17. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  18. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  19. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  20. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  21. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  22. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  23. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  25. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  26. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  27. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  28. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  29. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  30. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  31. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  32. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  33. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  34. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  36. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  37. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  38. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  39. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  41. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  42. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  43. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  44. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  45. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  46. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  47. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  48. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  49. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  50. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  51. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  52. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  53. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  54. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  55. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  56. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  59. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  62. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  64. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  66. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  67. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  68. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  69. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  70. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  71. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  72. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  73. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  74. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  75. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  76. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  78. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  79. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  80. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  81. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  82. package/benchmarks/production-v2/suite.json +1009 -0
  83. package/benchmarks/production-v2/variant.mjs +169 -0
  84. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  85. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  86. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  87. package/benchmarks/production-v3/grade.mjs +1017 -0
  88. package/benchmarks/production-v3/project/README.md +7 -0
  89. package/benchmarks/production-v3/project/config/service.json +4 -0
  90. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  91. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  92. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  93. package/benchmarks/production-v3/project/package.json +11 -0
  94. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  95. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  96. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  97. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  98. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  99. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  100. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  101. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  102. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  103. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  104. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  105. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  106. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  107. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  108. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  109. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  110. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  111. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  113. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  114. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  115. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  116. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  117. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  118. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  119. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  120. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  121. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  122. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  123. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  124. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  125. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  126. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  127. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  128. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  129. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  130. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  131. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  132. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  133. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  136. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  139. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  141. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  143. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  144. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  145. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  146. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  147. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  148. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  149. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  150. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  151. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  152. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  153. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  155. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  156. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  157. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  158. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  159. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  160. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  161. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  162. package/benchmarks/production-v3/suite.json +1010 -0
  163. package/benchmarks/production-v3/variant.mjs +178 -0
  164. package/catalog/capabilities.json +2 -2
  165. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  166. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  167. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  168. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  169. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  170. package/docs/command-reference-vietnamese.md +10 -7
  171. package/docs/context-window-policy.md +3 -3
  172. package/docs/distribution-standard.md +9 -9
  173. package/docs/languages.json +2 -2
  174. package/docs/model-options.md +20 -15
  175. package/docs/operator-manual-vietnamese.md +12 -12
  176. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  177. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  178. package/docs/piagent-core-improvement-plan.md +528 -0
  179. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  180. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  181. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  182. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  183. package/docs/piagent-open-session-wait.md +19 -0
  184. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  185. package/docs/publishing-for-teams.md +3 -0
  186. package/docs/quality-benchmark.md +128 -8
  187. package/docs/quickstart-vietnamese.md +2 -2
  188. package/docs/release-install-policy.md +38 -11
  189. package/docs/research/harness-next-evidence-review.md +113 -0
  190. package/docs/team-onboarding.md +7 -7
  191. package/docs/third-party-neutrality.md +7 -0
  192. package/docs/usage-observability.md +1 -1
  193. package/docs-site/architecture.html +1 -1
  194. package/docs-site/benchmark.html +1 -1
  195. package/docs-site/commands.html +1 -1
  196. package/docs-site/content/en/runtime.html +1 -1
  197. package/docs-site/content/en/whats-new.html +23 -0
  198. package/docs-site/content/runtime.html +2 -2
  199. package/docs-site/content/whats-new.html +23 -0
  200. package/docs-site/context-engine.html +1 -1
  201. package/docs-site/en/architecture.html +1 -1
  202. package/docs-site/en/benchmark.html +1 -1
  203. package/docs-site/en/commands.html +1 -1
  204. package/docs-site/en/context-engine.html +1 -1
  205. package/docs-site/en/index.html +1 -1
  206. package/docs-site/en/mcp-approval.html +1 -1
  207. package/docs-site/en/mcp-auth.html +1 -1
  208. package/docs-site/en/mcp-servers.html +1 -1
  209. package/docs-site/en/mcp.html +1 -1
  210. package/docs-site/en/permissions.html +1 -1
  211. package/docs-site/en/profiles.html +1 -1
  212. package/docs-site/en/quickstart.html +1 -1
  213. package/docs-site/en/runtime.html +2 -2
  214. package/docs-site/en/scope.html +1 -1
  215. package/docs-site/en/security.html +1 -1
  216. package/docs-site/en/team.html +1 -1
  217. package/docs-site/en/whats-new.html +24 -1
  218. package/docs-site/en/workflows.html +1 -1
  219. package/docs-site/index.html +1 -1
  220. package/docs-site/mcp-approval.html +1 -1
  221. package/docs-site/mcp-auth.html +1 -1
  222. package/docs-site/mcp-servers.html +1 -1
  223. package/docs-site/mcp.html +1 -1
  224. package/docs-site/permissions.html +1 -1
  225. package/docs-site/profiles.html +1 -1
  226. package/docs-site/quickstart.html +1 -1
  227. package/docs-site/runtime.html +3 -3
  228. package/docs-site/scope.html +1 -1
  229. package/docs-site/security.html +1 -1
  230. package/docs-site/team.html +1 -1
  231. package/docs-site/whats-new.html +24 -1
  232. package/docs-site/workflows.html +1 -1
  233. package/evals/architecture-conformance-v1/lane.json +18 -0
  234. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  235. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  236. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  237. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  238. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  239. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  240. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  241. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  242. package/evals/fixtures/composite-criterion.valid.json +33 -0
  243. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  244. package/evals/fixtures/contract-family-library.valid.json +41 -0
  245. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  246. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  247. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  248. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  249. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  250. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  251. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  252. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  253. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  254. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  255. package/evals/fs5-artifact-archive/README.md +32 -0
  256. package/evals/fs5-artifact-archive/manifest.json +148 -0
  257. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  258. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  259. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  260. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  261. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  262. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  263. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  264. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  265. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  266. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  267. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  268. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  269. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  270. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  271. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  272. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  273. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  274. package/evals/fs5-causal-arm.v1.json +9 -5
  275. package/evals/fs5-pilot-protocol.v1.json +1 -1
  276. package/evals/fs5-pilot-protocol.v4.json +4 -4
  277. package/evals/fs5-pilot-protocol.v5.json +6 -5
  278. package/evals/harness-next/development-corpus.mjs +106 -0
  279. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  280. package/evals/harness-next/run-calibration.mjs +83 -0
  281. package/evals/harness-next/run-resource-probe.mjs +55 -0
  282. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  283. package/evals/harness-next.v1.json +51 -0
  284. package/evals/long-horizon-v1/README.md +19 -0
  285. package/evals/long-horizon-v1/runner.mjs +116 -48
  286. package/evals/long-horizon-v1/worker.mjs +77 -30
  287. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  288. package/evals/private-holdout-v1/README.md +5 -2
  289. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  290. package/package.json +9 -4
  291. package/packages/piagent-core/README.md +2 -2
  292. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  293. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  294. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  295. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  296. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  297. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  298. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  299. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  300. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  301. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  302. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  303. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
  304. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  305. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  306. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  307. package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
  308. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  309. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  310. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  311. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  312. package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
  313. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  314. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  315. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  316. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  317. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  318. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  319. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  320. package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
  321. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  322. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  323. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  324. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
  325. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  326. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  327. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  328. package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
  329. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  330. package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
  331. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  332. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  333. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  334. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  335. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  336. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  337. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
  338. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  339. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  340. package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
  341. package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
  342. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  343. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  344. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  345. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  346. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  347. package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
  348. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  349. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  350. package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
  351. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  352. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  353. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  354. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  355. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
  356. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  357. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  358. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  359. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  360. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  361. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  362. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  363. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  364. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  365. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  366. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  367. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  368. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  369. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  370. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  371. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  372. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  373. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  374. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  375. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  376. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  377. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  378. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  379. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  380. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  381. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  382. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  383. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  384. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  385. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  386. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  387. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  388. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  389. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  390. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  391. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  392. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  393. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  394. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  395. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  396. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  397. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  398. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  399. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  400. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  401. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  402. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  403. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  404. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  405. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  406. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  407. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  408. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  409. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  410. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  411. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  412. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  413. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  414. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  415. package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
  416. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  417. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  418. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  419. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  420. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  421. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  422. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  423. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  424. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  425. package/packages/piagent-core/extensions/context-engine.js +11 -6
  426. package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
  427. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  428. package/packages/piagent-core/extensions/guard-types.ts +5 -1
  429. package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
  430. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  431. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  432. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  433. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  434. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  435. package/packages/piagent-core/extensions/task-journal.js +48 -3
  436. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  437. package/packages/piagent-core/extensions/task-state.js +74 -38
  438. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  439. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  440. package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
  441. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  442. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  443. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  444. package/packages/piagent-core/package.json +3 -3
  445. package/packages/piagent-core/policies/base-policy.json +1 -0
  446. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  447. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  448. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  449. package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
  450. package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
  451. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  452. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  453. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
  454. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
  455. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  456. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  457. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  458. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  459. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  460. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  461. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  462. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
  463. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
  464. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  465. package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
  466. package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
  467. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  468. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  469. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  470. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  471. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  472. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
  473. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  474. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  475. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  476. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  477. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  478. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
  479. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  480. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
  481. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  482. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  483. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
  484. package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
  485. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  486. package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
  487. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  488. package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
  489. package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
  490. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  491. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
  492. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  493. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
  494. package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
  495. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  496. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  497. package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
  498. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  499. package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
  500. package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
  501. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  502. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  503. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  504. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  505. package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
  506. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  507. package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
  508. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  509. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  510. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  511. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  512. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  513. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  514. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  515. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  516. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  517. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  518. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
  519. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  520. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  521. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  522. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  523. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  524. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  525. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  526. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
  527. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  528. package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
  529. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  530. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  531. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  532. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  533. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  534. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  535. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
  536. package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
  537. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  538. package/packages/piagent-webui/dist/client/index.html +2 -2
  539. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  540. package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
  541. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  542. package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
  543. package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
  544. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  545. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  546. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  547. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  548. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  549. package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
  550. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  551. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  552. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  553. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  554. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  555. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  556. package/packages/piagent-webui/gateway/session-inspection-registry.ts +14 -6
  557. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  558. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  559. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  560. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  561. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  562. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  563. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
  564. package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
  565. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  566. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  567. package/packages/piagent-webui/server/transcript-projection.ts +65 -12
  568. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  569. package/schemas/approved-host-contracts.schema.json +973 -0
  570. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  571. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  572. package/schemas/composite-criterion.schema.json +788 -0
  573. package/schemas/contract-family-library.schema.json +28 -0
  574. package/schemas/contract-selection-recipe.schema.json +31 -0
  575. package/schemas/failure-evidence.schema.json +2 -2
  576. package/schemas/helper-request.schema.json +16 -4
  577. package/schemas/host-contract-plan.schema.json +25 -0
  578. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  579. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  580. package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
  581. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  582. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  583. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  584. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  585. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  586. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  587. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  588. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  589. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  590. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  591. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  592. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  593. package/schemas/task-contract.schema.json +30 -0
  594. package/scripts/approve-independent-verification.mjs +57 -0
  595. package/scripts/benchmark-arm-observer.mjs +320 -0
  596. package/scripts/benchmark-budget-ipc.mjs +34 -0
  597. package/scripts/benchmark-budget-launcher.mjs +91 -0
  598. package/scripts/benchmark-budget-processes.mjs +133 -0
  599. package/scripts/benchmark-budget-publication.mjs +228 -0
  600. package/scripts/benchmark-budget-runtime.mjs +136 -0
  601. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  602. package/scripts/benchmark-codex-journey.mjs +406 -0
  603. package/scripts/benchmark-independent-verification.mjs +628 -0
  604. package/scripts/benchmark-journey-outcome.mjs +92 -0
  605. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  606. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  607. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  608. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  609. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  610. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  611. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  612. package/scripts/benchmark-runner-completion.mjs +133 -0
  613. package/scripts/benchmark-runner-configuration.mjs +159 -0
  614. package/scripts/benchmark-runner-core.mjs +217 -388
  615. package/scripts/benchmark-runner-finalization.mjs +140 -27
  616. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  617. package/scripts/benchmark-runner-schedule.mjs +256 -0
  618. package/scripts/benchmark-runner-support.mjs +136 -4
  619. package/scripts/benchmark-runner.mjs +95 -18
  620. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  621. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  622. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  623. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  624. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  625. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  626. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  627. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  628. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  629. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  630. package/scripts/benchmark-session-evaluator.mjs +169 -0
  631. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  632. package/scripts/benchmark-session-usage.mjs +28 -0
  633. package/scripts/benchmark-session.mjs +343 -50
  634. package/scripts/benchmark-webui-journey.mjs +678 -0
  635. package/scripts/check-public-wording.mjs +46 -0
  636. package/scripts/configure-model-scope.sh +6 -2
  637. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  638. package/scripts/install-global.sh +2 -2
  639. package/scripts/model-route-evaluation-core.ts +1 -0
  640. package/scripts/phase-tools-evaluation.mjs +1 -0
  641. package/scripts/pi-auto.sh +7 -1
  642. package/scripts/pi-model-route.mjs +1 -1
  643. package/scripts/pi-usage-history.mjs +201 -11
  644. package/scripts/piagent-cli.mjs +8 -0
  645. package/scripts/private-holdout-readiness.mjs +7 -1
  646. package/scripts/public-evaluation-exposure.mjs +140 -0
  647. package/scripts/select-independent-verification.mjs +62 -0
  648. package/scripts/setup.sh +2 -2
  649. package/scripts/typescript-loader.mjs +135 -1
  650. package/scripts/update-global.mjs +6 -7
  651. package/scripts/verify-local.sh +37 -56
  652. package/scripts/verify-release-identity.mjs +5 -3
  653. package/templates/global/settings.json +5 -1
  654. package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
@@ -0,0 +1,572 @@
1
+ import path from "node:path";
2
+
3
+ const ASSIGNMENT_OPERATORS = new Set(["=", "+=", "-=", "*=", "/=", "%=", "&&=", "||=", "??=", "++", "--"]);
4
+ const MUTATING_METHODS = new Set(["copywithin", "fill", "pop", "push", "reverse", "shift", "sort", "splice", "unshift"]);
5
+ const FALSEY_PARTITIONS = new Set(["false", "zero", "empty-string", "null"]);
6
+
7
+ function escapeRegex(value) {
8
+ return String(value ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
+ }
10
+
11
+ function normalizedText(value) {
12
+ return String(value ?? "").normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
13
+ }
14
+
15
+ function onlyUndefinedPrecedenceContract(value) {
16
+ const text = normalizedText(value);
17
+ const undefinedOnly = /\babsent\s+only\s+when[^.\n]{0,100}\bundefined\b/.test(text)
18
+ || /\bonly\s+undefined[^.\n]{0,100}\b(?:fall(?:s)?\s+through|absent|missing)\b/.test(text)
19
+ || /\bundefined[^.\n]{0,100}\bonly\s+(?:value\s+)?(?:that\s+)?fall(?:s)?\s+through\b/.test(text);
20
+ return undefinedOnly
21
+ && /\b(?:precedence|priority|fall(?:s)?\s+through|fallback)\b/.test(text)
22
+ && /\b(?:for\s+each|each|every)\s+(?:static\s+)?(?:key|field|property)\b/.test(text);
23
+ }
24
+
25
+ function readString(source, start, quote) {
26
+ let value = "";
27
+ let cursor = start + 1;
28
+ let dynamic = false;
29
+ while (cursor < source.length) {
30
+ const current = source[cursor];
31
+ if (current === "\\") {
32
+ const next = source[cursor + 1];
33
+ const escapes = { n: "\n", r: "\r", t: "\t", b: "\b", f: "\f", v: "\v", "0": "\0" };
34
+ value += Object.hasOwn(escapes, next) ? escapes[next] : (next ?? "");
35
+ cursor += 2;
36
+ continue;
37
+ }
38
+ if (quote === "`" && current === "$" && source[cursor + 1] === "{") dynamic = true;
39
+ if (current === quote) return { value, dynamic, end: cursor + 1 };
40
+ value += current;
41
+ cursor += 1;
42
+ }
43
+ return { value, dynamic: true, end: source.length };
44
+ }
45
+
46
+ function tokenize(sourceValue) {
47
+ const source = String(sourceValue ?? "");
48
+ const tokens = [];
49
+ const operators = ["===", "!==", "...", "??=", "||=", "&&=", "=>", "??", "||", "&&", "?.", "++", "--", "+=", "-=", "*=", "/=", "%=", "==", "!=", "<=", ">="];
50
+ for (let cursor = 0; cursor < source.length;) {
51
+ const current = source[cursor], next = source[cursor + 1];
52
+ if (/\s/.test(current)) { cursor += 1; continue; }
53
+ if (current === "/" && next === "/") {
54
+ cursor = source.indexOf("\n", cursor + 2);
55
+ if (cursor === -1) break;
56
+ continue;
57
+ }
58
+ if (current === "/" && next === "*") {
59
+ const end = source.indexOf("*/", cursor + 2);
60
+ cursor = end === -1 ? source.length : end + 2;
61
+ continue;
62
+ }
63
+ if (current === "\"" || current === "'" || current === "`") {
64
+ const parsed = readString(source, cursor, current);
65
+ tokens.push({ type: parsed.dynamic ? "dynamic-string" : "string", value: parsed.value, start: cursor, end: parsed.end });
66
+ cursor = parsed.end;
67
+ continue;
68
+ }
69
+ const identifier = source.slice(cursor).match(/^[A-Za-z_$][A-Za-z0-9_$]*/)?.[0];
70
+ if (identifier) {
71
+ tokens.push({ type: "identifier", value: identifier, start: cursor, end: cursor + identifier.length });
72
+ cursor += identifier.length;
73
+ continue;
74
+ }
75
+ const number = source.slice(cursor).match(/^(?:0|[1-9]\d*)(?:\.\d+)?/)?.[0];
76
+ if (number) {
77
+ tokens.push({ type: "number", value: number, start: cursor, end: cursor + number.length });
78
+ cursor += number.length;
79
+ continue;
80
+ }
81
+ const operator = operators.find((candidate) => source.startsWith(candidate, cursor));
82
+ if (operator) {
83
+ tokens.push({ type: "punctuator", value: operator, start: cursor, end: cursor + operator.length });
84
+ cursor += operator.length;
85
+ continue;
86
+ }
87
+ tokens.push({ type: "punctuator", value: current, start: cursor, end: cursor + 1 });
88
+ cursor += 1;
89
+ }
90
+ return tokens;
91
+ }
92
+
93
+ function matchingToken(tokens, openIndex, opening = "(", closing = ")") {
94
+ if (tokens[openIndex]?.value !== opening) return -1;
95
+ let depth = 0;
96
+ for (let index = openIndex; index < tokens.length; index += 1) {
97
+ if (tokens[index].value === opening) depth += 1;
98
+ else if (tokens[index].value === closing && --depth === 0) return index;
99
+ }
100
+ return -1;
101
+ }
102
+
103
+ function splitTopLevel(tokens, separator = ",") {
104
+ const output = [];
105
+ let start = 0, parentheses = 0, braces = 0, brackets = 0;
106
+ for (let index = 0; index < tokens.length; index += 1) {
107
+ const value = tokens[index].value;
108
+ if (value === "(") parentheses += 1;
109
+ else if (value === ")") parentheses -= 1;
110
+ else if (value === "{") braces += 1;
111
+ else if (value === "}") braces -= 1;
112
+ else if (value === "[") brackets += 1;
113
+ else if (value === "]") brackets -= 1;
114
+ else if (value === separator && parentheses === 0 && braces === 0 && brackets === 0) {
115
+ output.push(tokens.slice(start, index));
116
+ start = index + 1;
117
+ }
118
+ }
119
+ output.push(tokens.slice(start));
120
+ return output.filter((item) => item.length > 0);
121
+ }
122
+
123
+ function stripOuterParentheses(tokens) {
124
+ let value = tokens;
125
+ while (value[0]?.value === "(" && matchingToken(value, 0) === value.length - 1) value = value.slice(1, -1);
126
+ return value;
127
+ }
128
+
129
+ function parameterNames(tokens) {
130
+ return splitTopLevel(tokens).map((part) => part.find((token) => token.type === "identifier")?.value).filter(Boolean);
131
+ }
132
+
133
+ function exportedCallables(entry) {
134
+ const tokens = tokenize(entry?.text);
135
+ const callables = [];
136
+ for (let index = 0; index < tokens.length; index += 1) {
137
+ if (tokens[index].value !== "export") continue;
138
+ let cursor = index + 1;
139
+ const asynchronous = tokens[cursor]?.value === "async";
140
+ if (asynchronous) cursor += 1;
141
+ if (tokens[cursor]?.value === "function" && tokens[cursor + 1]?.type === "identifier" && tokens[cursor + 2]?.value === "(") {
142
+ const parametersEnd = matchingToken(tokens, cursor + 2);
143
+ const bodyStart = parametersEnd >= 0 ? parametersEnd + 1 : -1;
144
+ const bodyEnd = bodyStart >= 0 && tokens[bodyStart]?.value === "{" ? matchingToken(tokens, bodyStart, "{", "}") : -1;
145
+ if (bodyEnd >= 0) callables.push({
146
+ name: tokens[cursor + 1].value,
147
+ parameters: parameterNames(tokens.slice(cursor + 3, parametersEnd)),
148
+ body: tokens.slice(bodyStart + 1, bodyEnd), tokens, path: entry.path, asynchronous
149
+ });
150
+ }
151
+ }
152
+ return callables;
153
+ }
154
+
155
+ function taskMentionsCallable(taskText, name, namedTargets) {
156
+ return (Array.isArray(namedTargets) && namedTargets.some((target) => normalizedText(target) === normalizedText(name)))
157
+ || new RegExp(`(?:\\b|\`)${escapeRegex(name)}(?:\\b|\`)`, "i").test(String(taskText ?? ""));
158
+ }
159
+
160
+ function returnObject(callable) {
161
+ if (callable.body.filter((token) => token.value === "return").length !== 1) return { disposition: "ambiguous" };
162
+ let parentheses = 0, braces = 0, brackets = 0;
163
+ for (let index = 0; index < callable.body.length; index += 1) {
164
+ const value = callable.body[index].value;
165
+ if (value === "(") parentheses += 1;
166
+ else if (value === ")") parentheses -= 1;
167
+ else if (value === "{") braces += 1;
168
+ else if (value === "}") braces -= 1;
169
+ else if (value === "[") brackets += 1;
170
+ else if (value === "]") brackets -= 1;
171
+ if (value !== "return" || parentheses !== 0 || braces !== 0 || brackets !== 0) continue;
172
+ if (callable.body[index + 1]?.value !== "{") return { disposition: "ambiguous" };
173
+ const end = matchingToken(callable.body, index + 1, "{", "}");
174
+ if (end < 0) return { disposition: "ambiguous" };
175
+ const properties = [];
176
+ for (const raw of splitTopLevel(callable.body.slice(index + 2, end))) {
177
+ if (raw[0]?.value === "..." || raw[0]?.value === "[") return { disposition: "ambiguous" };
178
+ const colon = raw.findIndex((token) => token.value === ":");
179
+ if (colon !== 1 || !["identifier", "string"].includes(raw[0]?.type)) return { disposition: "ambiguous" };
180
+ properties.push({ key: String(raw[0].value), expression: raw.slice(colon + 1) });
181
+ }
182
+ return { disposition: "resolved", properties };
183
+ }
184
+ return { disposition: "ambiguous" };
185
+ }
186
+
187
+ function memberReference(tokens) {
188
+ const value = stripOuterParentheses(tokens);
189
+ return value.length === 3 && value[0].type === "identifier" && value[1].value === "." && value[2].type === "identifier"
190
+ ? { root: value[0].value, key: value[2].value } : undefined;
191
+ }
192
+
193
+ function expressionResolution(tokens, key) {
194
+ const value = stripOuterParentheses(tokens);
195
+ if (value[0]?.type === "identifier" && value[1]?.value === "(" && matchingToken(value, 1) === value.length - 1) {
196
+ const members = splitTopLevel(value.slice(2, -1)).map(memberReference);
197
+ if (members.length >= 2 && members.every((member) => member?.key === key)) {
198
+ return { selector: value[0].value, layers: members.map((member) => member.root), forbidden: false };
199
+ }
200
+ }
201
+ const operators = value.filter((token) => token.value === "||" || token.value === "??").map((token) => token.value);
202
+ if (operators.length > 0) {
203
+ const operator = operators[0];
204
+ const parts = splitTopLevel(value, operator);
205
+ const members = parts.map(memberReference);
206
+ if (operators.every((item) => item === operator) && members.length >= 2 && members.every((member) => member?.key === key)) {
207
+ return { selector: operator, layers: members.map((member) => member.root), forbidden: true };
208
+ }
209
+ }
210
+ return undefined;
211
+ }
212
+
213
+ function helperExpression(tokens, helperName) {
214
+ for (let index = 0; index < tokens.length; index += 1) {
215
+ if (!["const", "let", "var"].includes(tokens[index].value) || tokens[index + 1]?.value !== helperName || tokens[index + 2]?.value !== "=") continue;
216
+ let cursor = index + 3, parameterTokens = [];
217
+ if (tokens[cursor]?.value === "(") {
218
+ const end = matchingToken(tokens, cursor);
219
+ if (end < 0) return undefined;
220
+ parameterTokens = tokens.slice(cursor + 1, end);
221
+ cursor = end + 1;
222
+ } else {
223
+ parameterTokens = [tokens[cursor]];
224
+ cursor += 1;
225
+ }
226
+ if (tokens[cursor]?.value !== "=>") return undefined;
227
+ const end = tokens.findIndex((token, candidate) => candidate > cursor && token.value === ";");
228
+ return { declaration: tokens[index].value, parameters: parameterNames(parameterTokens), expression: tokens.slice(cursor + 1, end < 0 ? tokens.length : end) };
229
+ }
230
+ return undefined;
231
+ }
232
+
233
+ function selectorProvesUndefinedOnly(callable, selector) {
234
+ if (["||", "??"].includes(selector)) return "rejected";
235
+ const helper = helperExpression(callable.body, selector) ?? helperExpression(callable.tokens, selector);
236
+ if (!helper) return "abstain";
237
+ if (helper.declaration !== "const" || helper.parameters.length !== 1) return "rejected";
238
+ const expression = stripOuterParentheses(helper.expression);
239
+ if (expression.some((token) => token.value === "||" || token.value === "??")) return "rejected";
240
+ if (expression[0]?.value !== helper.parameters[0] || expression[1]?.value !== "." || expression[2]?.value !== "find" || expression[3]?.value !== "(") return "rejected";
241
+ const end = matchingToken(expression, 3);
242
+ if (end !== expression.length - 1) return "rejected";
243
+ const callback = expression.slice(4, end);
244
+ const arrow = callback.findIndex((token) => token.value === "=>");
245
+ if (arrow < 0) return "rejected";
246
+ const parameters = parameterNames(stripOuterParentheses(callback.slice(0, arrow)));
247
+ const predicate = stripOuterParentheses(callback.slice(arrow + 1));
248
+ if (parameters.length !== 1 || predicate.length !== 3 || predicate[1].value !== "!==") return "rejected";
249
+ return (predicate[0].value === parameters[0] && predicate[2].value === "undefined")
250
+ || (predicate[2].value === parameters[0] && predicate[0].value === "undefined") ? "proved" : "rejected";
251
+ }
252
+
253
+ function selectorBindingIsStable(callable, selector) {
254
+ if (callable.parameters.includes(selector)) return false;
255
+ let declarations = 0;
256
+ for (let index = 0; index < callable.tokens.length; index += 1) {
257
+ if (["const", "let", "var", "function"].includes(callable.tokens[index].value) && callable.tokens[index + 1]?.value === selector) declarations += 1;
258
+ if (callable.tokens[index].value !== selector) continue;
259
+ const declaration = ["const", "let", "var", "function"].includes(callable.tokens[index - 1]?.value);
260
+ if (!declaration && (ASSIGNMENT_OPERATORS.has(callable.tokens[index + 1]?.value) || ["++", "--"].includes(callable.tokens[index - 1]?.value))) return false;
261
+ if ([".", "["].includes(callable.tokens[index + 1]?.value)) {
262
+ for (let cursor = index + 2; cursor < Math.min(callable.tokens.length, index + 8); cursor += 1) {
263
+ if (ASSIGNMENT_OPERATORS.has(callable.tokens[cursor].value)) return false;
264
+ if ([",", ";", ")"].includes(callable.tokens[cursor].value)) break;
265
+ }
266
+ }
267
+ }
268
+ return declarations === 1;
269
+ }
270
+
271
+ function hasAlternateControlFlow(callable) {
272
+ return callable.asynchronous || callable.body.some((token) => ["if", "switch", "try", "catch", "throw"].includes(token.value));
273
+ }
274
+
275
+ function mutatesInput(callable) {
276
+ const roots = new Set(callable.parameters);
277
+ const tokens = callable.body;
278
+ for (let index = 0; index < tokens.length; index += 1) {
279
+ const value = tokens[index].value;
280
+ if (value === "delete" && roots.has(tokens[index + 1]?.value) && [".", "["].includes(tokens[index + 2]?.value)) return true;
281
+ if (roots.has(value) && [".", "["].includes(tokens[index + 1]?.value)) {
282
+ for (let cursor = index + 2; cursor < Math.min(tokens.length, index + 8); cursor += 1) {
283
+ if (ASSIGNMENT_OPERATORS.has(tokens[cursor].value)) return true;
284
+ if ([",", ";", ")"].includes(tokens[cursor].value)) break;
285
+ }
286
+ }
287
+ if (["object", "reflect"].includes(value.toLowerCase()) && tokens[index + 1]?.value === "."
288
+ && ["assign", "defineproperty", "defineproperties", "set"].includes(tokens[index + 2]?.value.toLowerCase())
289
+ && tokens[index + 3]?.value === "(" && roots.has(tokens[index + 4]?.value)) return true;
290
+ if (tokens[index].type === "identifier" && tokens[index + 1]?.value === "(" && roots.has(tokens[index + 2]?.value)
291
+ && [",", ")"].includes(tokens[index + 3]?.value)) return true;
292
+ }
293
+ return false;
294
+ }
295
+
296
+ function taskLayersMatch(taskText, layers) {
297
+ const clauses = normalizedText(taskText).split(/[.!?;\n]+/);
298
+ return clauses.some((clause) => {
299
+ if (!/\b(?:precedence|priority|fallback)\b/.test(clause)) return false;
300
+ const positions = layers.map((layer) => clause.search(new RegExp(`\\b${escapeRegex(normalizedText(layer))}\\b`)));
301
+ return positions.every((position) => position >= 0) && positions.every((position, index) => index === 0 || positions[index - 1] < position);
302
+ });
303
+ }
304
+
305
+ function sourceContract(input) {
306
+ const candidates = (input.sourceEntries ?? []).flatMap(exportedCallables)
307
+ .filter((callable) => taskMentionsCallable(input.taskText, callable.name, input.namedTargets));
308
+ if (candidates.length !== 1) return { disposition: "abstain" };
309
+ const callable = candidates[0], returned = returnObject(callable);
310
+ if (returned.disposition !== "resolved") return { disposition: "abstain", callable };
311
+ if (returned.properties.length < 2) return { disposition: "not-applicable", callable };
312
+ const resolutions = returned.properties.map((property) => expressionResolution(property.expression, property.key));
313
+ if (resolutions.some((item) => !item)) return { disposition: "abstain", callable };
314
+ const keys = returned.properties.map((property) => property.key);
315
+ const layers = resolutions[0].layers;
316
+ const sameShape = resolutions.every((item) => item.selector === resolutions[0].selector
317
+ && item.layers.length === layers.length && item.layers.every((layer, index) => layer === layers[index]));
318
+ const selectorProof = selectorProvesUndefinedOnly(callable, resolutions[0].selector);
319
+ if (selectorProof === "abstain") return { disposition: "abstain", callable, keys, layers };
320
+ if (hasAlternateControlFlow(callable)) return { disposition: "abstain", callable, keys, layers };
321
+ const sourceOk = sameShape && layers.length >= 2 && layers.every((layer) => callable.parameters.includes(layer))
322
+ && taskLayersMatch(input.taskText, layers) && !resolutions[0].forbidden
323
+ && selectorProof === "proved" && selectorBindingIsStable(callable, resolutions[0].selector) && !mutatesInput(callable);
324
+ return { disposition: "applicable", callable, keys, layers, sourceOk };
325
+ }
326
+
327
+ function relativeImportMatches(testPath, sourcePath, specifier) {
328
+ if (!specifier.startsWith(".")) return false;
329
+ const resolved = path.posix.normalize(path.posix.join(path.posix.dirname(String(testPath).replaceAll("\\", "/")), specifier));
330
+ const source = path.posix.normalize(String(sourcePath).replaceAll("\\", "/"));
331
+ return resolved === source || (!path.posix.extname(resolved) && [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"].some((extension) => `${resolved}${extension}` === source));
332
+ }
333
+
334
+ function importBindings(tokens, testPath, contract) {
335
+ const targetBindings = [], assertionBindings = [];
336
+ const importRanges = [];
337
+ for (let index = 0; index < tokens.length; index += 1) {
338
+ if (tokens[index].value !== "import") continue;
339
+ const from = tokens.findIndex((token, candidate) => candidate > index && candidate < index + 30 && token.value === "from");
340
+ if (from < 0 || tokens[from + 1]?.type !== "string") continue;
341
+ importRanges.push([index, from + 1]);
342
+ const specifier = tokens[from + 1].value;
343
+ if (["node:assert", "node:assert/strict", "assert", "assert/strict"].includes(specifier)) {
344
+ if (tokens[index + 1]?.type === "identifier") assertionBindings.push(tokens[index + 1].value);
345
+ if (tokens[index + 1]?.value === "*" && tokens[index + 2]?.value === "as" && tokens[index + 3]?.type === "identifier") assertionBindings.push(tokens[index + 3].value);
346
+ }
347
+ if (!relativeImportMatches(testPath, contract.callable.path, specifier) || tokens[index + 1]?.value !== "{") continue;
348
+ const close = matchingToken(tokens, index + 1, "{", "}");
349
+ for (const part of splitTopLevel(tokens.slice(index + 2, close))) {
350
+ if (part[0]?.value !== contract.callable.name) continue;
351
+ targetBindings.push(part[2]?.value === "as" && part[3]?.type === "identifier" ? part[3].value : part[0].value);
352
+ }
353
+ }
354
+ return { targetBindings: [...new Set(targetBindings)], assertionBindings: [...new Set(assertionBindings)], importRanges };
355
+ }
356
+
357
+ function literalValue(tokens, environment = {}) {
358
+ const value = stripOuterParentheses(tokens);
359
+ if (value.length !== 1) return undefined;
360
+ const token = value[0];
361
+ if (token.type === "string") return { kind: "string", value: token.value };
362
+ if (token.type === "number" && Number(token.value) === 0) return { kind: "zero", value: 0 };
363
+ if (token.value === "false") return { kind: "false", value: false };
364
+ if (token.value === "true") return { kind: "true", value: true };
365
+ if (token.value === "null") return { kind: "null", value: null };
366
+ if (token.value === "undefined") return { kind: "undefined", value: undefined };
367
+ return environment[token.value];
368
+ }
369
+
370
+ function partition(value) {
371
+ if (!value) return undefined;
372
+ if (value.kind === "string" && value.value === "") return "empty-string";
373
+ return FALSEY_PARTITIONS.has(value.kind) ? value.kind : undefined;
374
+ }
375
+
376
+ function sameLiteral(left, right) {
377
+ return Boolean(left && right && left.kind === right.kind && Object.is(left.value, right.value));
378
+ }
379
+
380
+ function literalArray(tokens, environment = {}) {
381
+ const value = stripOuterParentheses(tokens);
382
+ if (value[0]?.value !== "[" || matchingToken(value, 0, "[", "]") !== value.length - 1) return undefined;
383
+ const items = splitTopLevel(value.slice(1, -1)).map((item) => literalValue(item, environment));
384
+ return items.length > 0 && items.every(Boolean) ? items : undefined;
385
+ }
386
+
387
+ function constArrays(tokens) {
388
+ const arrays = new Map();
389
+ for (let index = 0; index < tokens.length; index += 1) {
390
+ if (tokens[index].value !== "const" || tokens[index + 1]?.type !== "identifier" || tokens[index + 2]?.value !== "=" || tokens[index + 3]?.value !== "[") continue;
391
+ const end = matchingToken(tokens, index + 3, "[", "]"), values = end < 0 ? undefined : literalArray(tokens.slice(index + 3, end + 1));
392
+ if (!values) continue;
393
+ const name = tokens[index + 1].value;
394
+ let mutable = false;
395
+ for (let cursor = end + 1; cursor < tokens.length; cursor += 1) {
396
+ if (tokens[cursor].value !== name) continue;
397
+ if (ASSIGNMENT_OPERATORS.has(tokens[cursor + 1]?.value)
398
+ || (tokens[cursor + 1]?.value === "." && MUTATING_METHODS.has(tokens[cursor + 2]?.value.toLowerCase()))) { mutable = true; break; }
399
+ }
400
+ if (!mutable) arrays.set(name, values);
401
+ }
402
+ return arrays;
403
+ }
404
+
405
+ function literalLoops(tokens, arrays) {
406
+ const loops = [];
407
+ for (let index = 0; index < tokens.length; index += 1) {
408
+ if (tokens[index].value !== "for" || tokens[index + 1]?.value !== "(") continue;
409
+ const headerEnd = matchingToken(tokens, index + 1), header = headerEnd < 0 ? [] : tokens.slice(index + 2, headerEnd);
410
+ if (header[0]?.value !== "const" || header[1]?.type !== "identifier" || header[2]?.value !== "of") continue;
411
+ const iterable = header.slice(3), values = literalArray(iterable) ?? (iterable.length === 1 ? arrays.get(iterable[0].value) : undefined);
412
+ if (!values || tokens[headerEnd + 1]?.value !== "{") continue;
413
+ const bodyEnd = matchingToken(tokens, headerEnd + 1, "{", "}");
414
+ if (bodyEnd > headerEnd) loops.push({ variable: header[1].value, values, start: headerEnd + 2, end: bodyEnd });
415
+ }
416
+ return loops;
417
+ }
418
+
419
+ function environmentsFor(index, loops) {
420
+ let environments = [{}];
421
+ for (const loop of loops.filter((item) => item.start <= index && index < item.end).sort((left, right) => left.start - right.start)) {
422
+ environments = environments.flatMap((environment) => loop.values.map((value) => ({ ...environment, [loop.variable]: value })));
423
+ }
424
+ return environments;
425
+ }
426
+
427
+ function runtimeObject(tokens, environment) {
428
+ const value = stripOuterParentheses(tokens);
429
+ if (value[0]?.value !== "{" || matchingToken(value, 0, "{", "}") !== value.length - 1) return undefined;
430
+ const object = new Map();
431
+ for (const property of splitTopLevel(value.slice(1, -1))) {
432
+ if (property[0]?.value === "...") return undefined;
433
+ let key, colon;
434
+ if (property[0]?.value === "[") {
435
+ const close = matchingToken(property, 0, "[", "]");
436
+ const computed = literalValue(property.slice(1, close), environment);
437
+ if (computed?.kind !== "string") return undefined;
438
+ key = computed.value; colon = close + 1;
439
+ } else {
440
+ key = property[0]?.value; colon = 1;
441
+ }
442
+ if (!key || property[colon]?.value !== ":") return undefined;
443
+ const resolved = literalValue(property.slice(colon + 1), environment);
444
+ if (!resolved) return undefined;
445
+ object.set(String(key), resolved);
446
+ }
447
+ return object;
448
+ }
449
+
450
+ function targetCall(tokens, binding, environment, contract) {
451
+ const value = stripOuterParentheses(tokens);
452
+ if (value[0]?.value !== binding || value[1]?.value !== "(") return undefined;
453
+ const callEnd = matchingToken(value, 1);
454
+ if (callEnd < 0) return undefined;
455
+ const args = splitTopLevel(value.slice(2, callEnd)).map((item) => runtimeObject(item, environment));
456
+ if (args.length !== contract.layers.length || args.some((item) => !item)) return undefined;
457
+ let selectedKey;
458
+ const suffix = value.slice(callEnd + 1);
459
+ if (suffix.length === 2 && suffix[0].value === "." && suffix[1].type === "identifier") selectedKey = suffix[1].value;
460
+ if (suffix[0]?.value === "[" && suffix.at(-1)?.value === "]") {
461
+ const computed = literalValue(suffix.slice(1, -1), environment);
462
+ if (computed?.kind === "string") selectedKey = computed.value;
463
+ }
464
+ if (suffix.length > 0 && !selectedKey) return undefined;
465
+ const result = new Map();
466
+ for (const key of contract.keys) {
467
+ const values = args.map((object) => object.has(key) ? object.get(key) : { kind: "undefined", value: undefined });
468
+ result.set(key, { value: values.find((item) => item.kind !== "undefined") ?? values.at(-1), values });
469
+ }
470
+ return { result, selectedKey };
471
+ }
472
+
473
+ function disabledOrDeadEvidence(tokens) {
474
+ for (let index = 0; index < tokens.length; index += 1) {
475
+ if (["xit", "xtest", "xdescribe"].includes(tokens[index].value.toLowerCase())) return true;
476
+ if (["test", "it", "describe"].includes(tokens[index].value.toLowerCase()) && tokens[index + 1]?.value === "." && ["skip", "todo"].includes(tokens[index + 2]?.value.toLowerCase())) return true;
477
+ if (["if", "switch", "try", "catch", "finally", "return", "break", "continue", "throw", "&&", "||", "??", "?"].includes(tokens[index].value)) return true;
478
+ }
479
+ return false;
480
+ }
481
+
482
+ function bindingIsStable(tokens, binding, importRanges) {
483
+ for (let index = 0; index < tokens.length; index += 1) {
484
+ if (tokens[index].value !== binding || importRanges.some(([start, end]) => start <= index && index <= end)) continue;
485
+ if (tokens[index + 1]?.value === "(") continue;
486
+ return false;
487
+ }
488
+ return true;
489
+ }
490
+
491
+ function assertionBindingIsStable(tokens, binding, importRanges) {
492
+ for (let index = 0; index < tokens.length; index += 1) {
493
+ if (tokens[index].value !== binding || importRanges.some(([start, end]) => start <= index && index <= end)) continue;
494
+ if (tokens[index + 1]?.value === "." && tokens[index + 2]?.type === "identifier" && tokens[index + 3]?.value === "(") continue;
495
+ return false;
496
+ }
497
+ return true;
498
+ }
499
+
500
+ function recordCoverage(coverage, key, selected, expected) {
501
+ if (!selected || !sameLiteral(selected.value, expected)) return;
502
+ const first = selected.values[0], falsey = partition(first);
503
+ if (falsey) coverage.get(key).partitions.add(falsey);
504
+ if (first?.kind === "undefined" && selected.values.slice(1).some((value) => value.kind !== "undefined")) coverage.get(key).undefinedFallback = true;
505
+ }
506
+
507
+ function testContract(input, contract) {
508
+ const coverage = new Map(contract.keys.map((key) => [key, { partitions: new Set(), undefinedFallback: false }]));
509
+ let boundFile = false;
510
+ for (const entry of input.testEntries ?? []) {
511
+ const tokens = tokenize(entry.text);
512
+ if (tokens.some((token) => token.type === "dynamic-string") || disabledOrDeadEvidence(tokens)) continue;
513
+ const bindings = importBindings(tokens, entry.path, contract);
514
+ const assertionBindings = bindings.assertionBindings.filter((binding) => assertionBindingIsStable(tokens, binding, bindings.importRanges));
515
+ if (bindings.targetBindings.length !== 1 || assertionBindings.length === 0
516
+ || !bindingIsStable(tokens, bindings.targetBindings[0], bindings.importRanges)) continue;
517
+ boundFile = true;
518
+ const arrays = constArrays(tokens), loops = literalLoops(tokens, arrays);
519
+ for (let index = 0; index < tokens.length; index += 1) {
520
+ if (!assertionBindings.includes(tokens[index].value) || tokens[index + 1]?.value !== "."
521
+ || !["equal", "strictequal", "deepequal"].includes(tokens[index + 2]?.value.toLowerCase()) || tokens[index + 3]?.value !== "(") continue;
522
+ const end = matchingToken(tokens, index + 3), args = end < 0 ? [] : splitTopLevel(tokens.slice(index + 4, end));
523
+ if (args.length < 2) continue;
524
+ for (const environment of environmentsFor(index, loops)) {
525
+ const actual = targetCall(args[0], bindings.targetBindings[0], environment, contract);
526
+ if (!actual) continue;
527
+ if (actual.selectedKey) {
528
+ const expected = literalValue(args[1], environment);
529
+ if (coverage.has(actual.selectedKey)) recordCoverage(coverage, actual.selectedKey, actual.result.get(actual.selectedKey), expected);
530
+ continue;
531
+ }
532
+ const expected = runtimeObject(args[1], environment);
533
+ if (!expected) continue;
534
+ for (const key of contract.keys) if (expected.has(key)) recordCoverage(coverage, key, actual.result.get(key), expected.get(key));
535
+ }
536
+ }
537
+ }
538
+ return boundFile && [...coverage.values()].every((item) => item.undefinedFallback
539
+ && [...FALSEY_PARTITIONS].every((partitionName) => item.partitions.has(partitionName)));
540
+ }
541
+
542
+ export function acceptancePrecedenceContractEvidence(input = {}) {
543
+ if (!onlyUndefinedPrecedenceContract(input.taskText)) return { disposition: "not-applicable", sourceOk: false, testOk: false };
544
+ const contract = sourceContract(input);
545
+ if (contract.disposition !== "applicable") return { ...contract, sourceOk: false, testOk: false };
546
+ const testOk = testContract(input, contract);
547
+ return { ...contract, testOk, proved: contract.sourceOk && testOk };
548
+ }
549
+
550
+ export function acceptancePrecedenceContractGuidance(input = {}) {
551
+ if (!onlyUndefinedPrecedenceContract(input.taskText)) return [];
552
+ const contract = sourceContract(input);
553
+ if (contract.disposition !== "applicable") return [];
554
+ const line = `Defined-fallback proof for ${contract.callable.name}: keys ${contract.keys.join(", ")}; precedence ${contract.layers.join(" > ")}. For every key, prove undefined fallback and preserve null, false, 0, and empty string with assertions bound directly to ${contract.callable.name}.`;
555
+ return line.trim().split(/\s+/).length <= 120 ? [line] : [];
556
+ }
557
+
558
+ export function acceptancePrecedenceReceiptEvidence(input = {}) {
559
+ if (input.obligation !== "boundary-case") return { handled: false };
560
+ const proof = acceptancePrecedenceContractEvidence(input);
561
+ if (proof.disposition === "not-applicable") return { handled: false };
562
+ const complete = proof.proved && input.passingVerifier && (input.sourceFiles ?? []).length > 0 && input.verifierCoversTests;
563
+ return {
564
+ handled: true,
565
+ evidence: complete ? {
566
+ ...input.verifierEvidence,
567
+ kind: "verifier-backed-defined-fallback-test",
568
+ summary: "Configured verifier passed with per-key defined-fallback source and focused-test proof.",
569
+ paths: [...new Set([...(input.sourceFiles ?? []), ...(input.testFiles ?? [])])]
570
+ } : undefined
571
+ };
572
+ }
@@ -0,0 +1,26 @@
1
+ import {
2
+ acceptanceCriterionBindingValid,
3
+ compoundAcceptanceCriterion,
4
+ criterionBehaviorProofDisposition,
5
+ criterionRequiresBehavioralProof
6
+ } from "./acceptance-behavior-proof.js";
7
+
8
+ // This projection diagnoses missing proof; it never grants acceptance or
9
+ // independent authority. A current counterexample retains its repair route.
10
+ export function missingAcceptanceProofCapabilities(task, receipt, { corpus, passingVerifier, taskText, independentAssessments, sourceProofRequiredIds = new Set() }) {
11
+ const missing = receipt.criteria.filter(criterion => criterion.status !== "satisfied");
12
+ const adapterAbstained = missing.filter(criterion => criterionBehaviorProofDisposition({
13
+ obligation: criterion.obligation, task, criterion, taskText, corpus, passingVerifier
14
+ }) === "unknown");
15
+ const criticalMissing = missing.filter(criterion => criterion.priority === "critical"
16
+ || criterionRequiresBehavioralProof(task, criterion, taskText));
17
+ // Grouped requirements have no local matcher route. Do not diagnose a stale
18
+ // binding as a capability gap or reinterpret a signed failure as unsupported.
19
+ const independentRequired = receipt.criteria.filter((criterion, index) => criterion.status !== "satisfied"
20
+ && acceptanceCriterionBindingValid(task, receipt, criterion, index)
21
+ && compoundAcceptanceCriterion(task.acceptanceCriteria[index])
22
+ && !independentAssessments.has(criterion.id));
23
+ const sourceProofRequired = criticalMissing.filter(criterion => sourceProofRequiredIds.has(criterion.id)
24
+ && !independentAssessments.has(criterion.id));
25
+ return { missing, criticalMissing, adapterAbstained, independentRequired, sourceProofRequired };
26
+ }