@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
@@ -1,7 +1,11 @@
1
+ import { dependencyGraphNonMutationEvidence } from "./acceptance-parameter-contract.js"; import { finiteIntervalNonMutationEvidence } from "./acceptance-temporal-contract.js";
1
2
  import crypto from "node:crypto";
2
3
  import fs from "node:fs";
3
4
  import path from "node:path";
4
5
 
6
+ import { acceptanceContractConjuncts } from "./acceptance-contract-conjunction.js";
7
+ import { pureRecordNonMutationEvidence, byteArrayNonMutationEvidence, braceScope, sameScope, unconditionalEvidenceScope, constantDeclarations, literalBinding, splitTopLevel, flatObjectSnapshot, stableDeepSnapshot, boundStringValue, exactBoundValue, callArgumentNames } from "./acceptance-literal-dataflow.js";
8
+ import { acceptanceResultContractEvidence } from "./acceptance-result-contract-evidence.js";
5
9
  import { criterionGraphValidationErrors } from "./criterion-graph.js";
6
10
  import { regexCanStartAfterLexicalChunks } from "./javascript-regex-evidence.js";
7
11
  import { normalizePathCandidate } from "./policy-core.js";
@@ -16,6 +20,40 @@ function sha256(value) {
16
20
  return crypto.createHash("sha256").update(String(value ?? "")).digest("hex");
17
21
  }
18
22
 
23
+ export { sha256 as acceptanceTextHash };
24
+
25
+ // A multiline criterion preserves distinct intake clauses. No legacy matcher
26
+ // proves their conjunction; an independent assessment must cover the full hash.
27
+ export function compoundAcceptanceCriterion(text) {
28
+ return /[\r\n]/.test(String(text ?? "").trim());
29
+ }
30
+
31
+ export function acceptanceCriterionBindingValid(task, receipt, criterion, index) {
32
+ const texts = task?.acceptanceCriteria;
33
+ return Array.isArray(texts) && texts.length === receipt.criteria.length
34
+ && typeof texts[index] === "string" && sha256(texts[index]) === criterion.hash
35
+ && receipt.criteria.filter((item) => item.id === criterion.id).length === 1;
36
+ }
37
+
38
+ export function resetUnprovenCriterion(criterion) {
39
+ const changed = criterion.status !== "pending" || criterion.evidence.length > 0 || criterion.priority !== "critical";
40
+ criterion.status = "pending";
41
+ criterion.evidence = [];
42
+ criterion.priority = "critical";
43
+ return changed;
44
+ }
45
+
46
+ export function acceptanceEvidenceKey(evidence) {
47
+ return JSON.stringify({
48
+ kind: evidence.kind,
49
+ summary: evidence.summary,
50
+ paths: evidence.paths ?? [],
51
+ command: evidence.command,
52
+ exitCode: evidence.exitCode,
53
+ workingTreeDigest: evidence.workingTreeDigest
54
+ });
55
+ }
56
+
19
57
  function escapeRegex(value) {
20
58
  return String(value ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
59
  }
@@ -27,7 +65,7 @@ function normalizedText(value) {
27
65
  export function durableBehaviorProofRequired(text, changeMode = "source-change") {
28
66
  const value = String(text ?? "");
29
67
  if (changeMode === "read-only") return false;
30
- return /\b(?:concurren|do not mutate|must not mutate|without mutating|return shape|returned? (?:element|object|value|representation)|preserve (?:the )?(?:api|input|output|return)|public api|exact error|typeerror|syntaxerror|rangeerror)\b/i.test(value);
68
+ return /\b(?:concurren|do not mutate|must not mutate|without mutating|inputs? must remain unchanged|return shape|returned? (?:element|object|value|representation)|preserve (?:the )?(?:api|input|output|return)|public api|exact error|typeerror|syntaxerror|rangeerror)\b/i.test(value);
31
69
  }
32
70
 
33
71
  function boundCriterionGraphNode(task, criterion) {
@@ -134,10 +172,6 @@ function bindJavaScriptStrings(value) {
134
172
  return { code: output.join(""), strings };
135
173
  }
136
174
 
137
- function boundStringValue(token, strings) {
138
- const index = Number(String(token ?? "").match(/^__pi_bound_string_(\d+)__$/)?.[1]);
139
- return Number.isInteger(index) ? strings[index] : undefined;
140
- }
141
175
 
142
176
  function moduleRecords(entry) {
143
177
  const evidence = String(entry.evidenceText ?? "");
@@ -195,39 +229,55 @@ function exportedNames(sourceEntries) {
195
229
  return names;
196
230
  }
197
231
 
198
- function resolvedSpecifierMatchesSource(testPath, specifier, sourceFiles) {
199
- if (!specifier.startsWith(".")) return false;
232
+ function resolvedSpecifierSources(testPath, specifier, sourceFiles) {
233
+ if (!specifier.startsWith(".")) return [];
200
234
  const resolved = normalizePathCandidate(path.posix.normalize(path.posix.join(path.posix.dirname(testPath), specifier)));
201
235
  const candidates = new Set([resolved, resolved.replace(/\.[a-z0-9]+$/i, "")]);
202
- for (const source of sourceFiles.map((file) => normalizePathCandidate(file))) {
236
+ return sourceFiles.map((file) => normalizePathCandidate(file)).filter((source) => {
203
237
  const stem = source.replace(/\.[a-z0-9]+$/i, "");
204
- if (candidates.has(source) || candidates.has(stem) || stem === `${resolved.replace(/\/$/, "")}/index`) return true;
205
- }
206
- return false;
238
+ return candidates.has(source) || candidates.has(stem) || stem === `${resolved.replace(/\/$/, "")}/index`;
239
+ });
207
240
  }
208
241
 
209
242
  /* linked = proven; unknown = alias/barrel/indirect may be valid; unlinked = only unrelated imports. */
210
243
  function testSourceLinkage(corpus) {
211
- const sourceExports = exportedNames(corpus.sourceEntries);
244
+ const sourceExports = new Map(corpus.sourceEntries.map((entry) => [
245
+ normalizePathCandidate(entry.path), exportedNames([entry])
246
+ ]));
212
247
  const linkedEntries = [];
213
248
  let unresolvedProjectImport = false;
214
249
  for (const entry of corpus.testEntries) {
215
250
  const records = moduleRecords(entry);
216
251
  const callables = new Set();
252
+ const callableBindings = [];
217
253
  let linked = false;
218
254
  for (const record of records) {
219
- const bindings = importedBindings(record);
220
- if (resolvedSpecifierMatchesSource(entry.path, record.specifier, corpus.sourceFiles)) {
255
+ const importBindings = importedBindings(record);
256
+ const sourcePaths = resolvedSpecifierSources(entry.path, record.specifier, corpus.sourceFiles);
257
+ if (sourcePaths.length > 0) {
221
258
  linked = true;
222
- for (const binding of bindings) {
223
- if (binding.exported === "*") sourceExports.forEach((name) => callables.add(`${binding.local}.${name}`));
224
- else callables.add(binding.local);
259
+ for (const binding of importBindings) {
260
+ if (binding.exported === "*") sourcePaths.forEach((sourcePath) => {
261
+ for (const name of sourceExports.get(sourcePath) ?? []) {
262
+ const testName = `${binding.local}.${name}`;
263
+ callables.add(testName);
264
+ callableBindings.push({ sourceName: name, sourcePath, testName });
265
+ }
266
+ });
267
+ else {
268
+ callables.add(binding.local);
269
+ for (const sourcePath of sourcePaths) {
270
+ if (sourceExports.get(sourcePath)?.has(binding.exported)) {
271
+ callableBindings.push({ sourceName: binding.exported, sourcePath, testName: binding.local });
272
+ }
273
+ }
274
+ }
225
275
  }
226
276
  continue;
227
277
  }
228
278
  if (record.specifier.startsWith(".") || /^[#@~]/.test(record.specifier)) unresolvedProjectImport = true;
229
279
  }
230
- if (linked) linkedEntries.push({ entry, callables: [...callables] });
280
+ if (linked) linkedEntries.push({ entry, callables: [...callables], bindings: callableBindings });
231
281
  }
232
282
  if (linkedEntries.length > 0) return { status: "linked", entries: linkedEntries };
233
283
  return { status: unresolvedProjectImport ? "unknown" : "unlinked", entries: [] };
@@ -242,6 +292,21 @@ function balancedCallEnd(code, openIndex) {
242
292
  return -1;
243
293
  }
244
294
 
295
+ function enclosingTestDescriptions(code, strings, callStart) {
296
+ const descriptions = [];
297
+ const pattern = new RegExp(`\\b(?:it|test)\\s*\\(\\s*(${BOUND_STRING}[0-9]+__)\\s*,`, "g");
298
+ for (const match of code.matchAll(pattern)) {
299
+ if (match.index >= callStart) break;
300
+ const open = code.indexOf("(", match.index);
301
+ const end = balancedCallEnd(code, open);
302
+ const description = boundStringValue(match[1], strings);
303
+ if (end > callStart && typeof description === "string" && description.trim()) {
304
+ descriptions.push({ start: match.index, description });
305
+ }
306
+ }
307
+ return descriptions.sort((left, right) => right.start - left.start).map((item) => item.description);
308
+ }
309
+
245
310
  function assertionSlices(code) {
246
311
  const assertions = [];
247
312
  const pattern = /\b(?:assert(?:\.[a-z][a-z0-9_]*)?|expect)\s*\(/gi;
@@ -268,19 +333,17 @@ function assignedCallNames(code, callStart) {
268
333
 
269
334
  function nextBindingWrite(code, name, after) {
270
335
  const escaped = escapeRegex(name);
271
- const pattern = new RegExp(`\\b(?:const|let|var)\\s+${escaped}\\s*=|\\b${escaped}\\s*=(?!=|>)`, "g");
336
+ const pattern = new RegExp(`\\b(?:const|let|var)\\s+${escaped}\\s*=|\\b${escaped}\\s*(?:=(?!=|>)|(?:\\|\\||&&|\\?\\?|\\*\\*|<<|>>>?|[+*/%&|^\\-])=|\\+\\+|--)|(?:\\+\\+|--)\\s*\\b${escaped}\\b|[\\[{][^;\\n]*\\b${escaped}\\b[^;\\n]*[\\]}]\\s*=(?!=|>)`, "g");
272
337
  pattern.lastIndex = after;
273
338
  return pattern.exec(code)?.index ?? Number.POSITIVE_INFINITY;
274
339
  }
275
340
 
276
- function callArgumentNames(slice) {
277
- const body = slice.slice(slice.indexOf("(") + 1, -1);
278
- return [...body.matchAll(/(?:^|,)\s*([a-z_$][a-z0-9_$]*)\s*(?=,|$)/gi)].map((match) => match[1]);
279
- }
341
+
280
342
 
281
343
  function callableSlices(code, strings, callables) {
282
344
  const calls = [];
283
345
  const assertions = assertionSlices(code);
346
+ const declarations = constantDeclarations(code);
284
347
  for (const callable of callables) {
285
348
  const pattern = new RegExp(`\\b${escapeRegex(callable)}\\s*\\(`, "g");
286
349
  for (const match of code.matchAll(pattern)) {
@@ -288,7 +351,7 @@ function callableSlices(code, strings, callables) {
288
351
  const end = balancedCallEnd(code, open);
289
352
  if (end < 0) continue;
290
353
  const slice = code.slice(match.index, end);
291
- const values = [...slice.matchAll(/__pi_bound_string_[0-9]+__/g)]
354
+ let values = [...slice.matchAll(/__pi_bound_string_[0-9]+__/g)]
292
355
  .map((item) => boundStringValue(item[0], strings)).filter((item) => typeof item === "string");
293
356
  const argumentNames = callArgumentNames(slice);
294
357
  const resultNames = [...new Set(assignedCallNames(code, match.index))];
@@ -305,33 +368,37 @@ function callableSlices(code, strings, callables) {
305
368
  [...assertion.code.matchAll(/__pi_bound_string_[0-9]+__/g)]
306
369
  .map((item) => boundStringValue(item[0], strings)).filter((item) => typeof item === "string")
307
370
  ));
308
- if (boundAssertions.length > 0) calls.push({
371
+ const call = {
372
+ callable,
309
373
  slice, values, strings, resultNames, argumentNames, assertionValues, prelude: code.slice(0, match.index),
310
- assertions: boundAssertions.map((item) => item.code)
311
- });
374
+ assertions: boundAssertions.map((item) => item.code),
375
+ descriptions: enclosingTestDescriptions(code, strings, match.index),
376
+ code, declarations, start: match.index, end,
377
+ safeScope: unconditionalEvidenceScope(code, match.index),
378
+ scopedAssertions: boundAssertions.filter((assertion) => unconditionalEvidenceScope(code, assertion.start)
379
+ && sameScope(braceScope(code, assertion.start), braceScope(code, match.index)))
380
+ };
381
+ const callableRoot = callable.split(".")[0];
382
+ const callScope = braceScope(code, match.index);
383
+ if (declarations.some((entry) => entry.name === callableRoot && entry.start < match.index
384
+ && entry.scope.every((open, index) => callScope[index] === open))) call.safeScope = false;
385
+ for (const shadow of code.matchAll(new RegExp(`\\b(?:function|class)\\s+${escapeRegex(callableRoot)}\\b`, "g"))) {
386
+ if (braceScope(code, shadow.index).every((open, index) => callScope[index] === open)) call.safeScope = false;
387
+ }
388
+ const argumentsList = splitTopLevel(slice.slice(slice.indexOf("(") + 1, -1));
389
+ if (call.safeScope && argumentsList.length === 1 && /^[a-z_$][a-z0-9_$]*$/i.test(argumentsList[0])) {
390
+ const literal = literalBinding(call, argumentsList[0], match.index);
391
+ if (literal?.kind === "array" && literal.elements.every((item) => typeof item.value === "string")) {
392
+ call.values = literal.elements.map((item) => item.value);
393
+ call.assertions = call.scopedAssertions.map((assertion) => assertion.code);
394
+ }
395
+ }
396
+ if (boundAssertions.length > 0) calls.push(call);
312
397
  }
313
398
  }
314
399
  return calls;
315
400
  }
316
401
 
317
- function splitTopLevel(value) {
318
- const parts = [];
319
- let start = 0, round = 0, square = 0, curly = 0;
320
- for (let index = 0; index < value.length; index += 1) {
321
- const token = value[index];
322
- if (token === "(") round += 1;
323
- else if (token === ")") round -= 1;
324
- else if (token === "[") square += 1;
325
- else if (token === "]") square -= 1;
326
- else if (token === "{") curly += 1;
327
- else if (token === "}") curly -= 1;
328
- else if (token === "," && round === 0 && square === 0 && curly === 0) {
329
- parts.push(value.slice(start, index).trim()); start = index + 1;
330
- }
331
- }
332
- parts.push(value.slice(start).trim());
333
- return parts;
334
- }
335
402
 
336
403
  function assertionComparisons(call) {
337
404
  return call.assertions.flatMap((assertion) => {
@@ -354,23 +421,24 @@ function assertionComparisons(call) {
354
421
  });
355
422
  }
356
423
 
357
- function exactBoundValue(expression, strings) {
358
- const value = String(expression ?? "").trim();
359
- if (value === "true") return true;
360
- if (value === "false") return false;
361
- return boundStringValue(value, strings);
362
- }
363
424
 
364
425
  function propertyExpression(objectExpression, property, strings) {
365
426
  const value = String(objectExpression ?? "").trim();
366
427
  if (!(value.startsWith("{") && value.endsWith("}"))) return undefined;
367
- for (const member of splitTopLevel(value.slice(1, -1))) {
428
+ const members = splitTopLevel(value.slice(1, -1));
429
+ if (members.at(-1) === "") members.pop();
430
+ const fields = new Map();
431
+ for (const member of members) {
368
432
  const colon = member.indexOf(":");
369
- if (colon < 0) continue;
370
- const key = member.slice(0, colon).trim();
371
- if (key === property || boundStringValue(key, strings) === property) return member.slice(colon + 1).trim();
433
+ if (colon < 0) return undefined;
434
+ const rawKey = member.slice(0, colon).trim();
435
+ const key = boundStringValue(rawKey, strings) ?? (/^[a-z_$][a-z0-9_$]*$/i.test(rawKey) ? rawKey : undefined);
436
+ // Bound strings retain escape spelling; do not mistake escaped aliases
437
+ // for distinct runtime property names without a verified decoder.
438
+ if (key === undefined || key.includes("\\") || key === "__proto__" || fields.has(key)) return undefined;
439
+ fields.set(key, member.slice(colon + 1).trim());
372
440
  }
373
- return undefined;
441
+ return fields.get(property);
374
442
  }
375
443
 
376
444
  function callResultExpression(call, expression) {
@@ -446,12 +514,14 @@ function repeatedFlagExpectedValue(values) {
446
514
 
447
515
  function preCallSnapshotName(call, argument) {
448
516
  const escaped = escapeRegex(argument);
517
+ const objectSnapshot = flatObjectSnapshot(call, argument, assertionComparisons);
518
+ if (objectSnapshot) return objectSnapshot.name;
449
519
  const deepPatterns = [
450
520
  new RegExp(`\\b(?:const|let)\\s+([a-z_$][a-z0-9_$]*)\\s*=\\s*structuredClone\\s*\\(\\s*${escaped}\\s*\\)`, "gi"),
451
521
  new RegExp(`\\b(?:const|let)\\s+([a-z_$][a-z0-9_$]*)\\s*=\\s*JSON\\.parse\\s*\\(\\s*JSON\\.stringify\\s*\\(\\s*${escaped}\\s*\\)\\s*\\)`, "gi")
452
522
  ];
453
523
  const deep = deepPatterns.flatMap((pattern) => [...call.prelude.matchAll(pattern)].map((match) => match[1])).at(-1);
454
- if (deep) return deep;
524
+ if (deep) return stableDeepSnapshot(call, argument, deep, assertionComparisons) ? deep : undefined;
455
525
  const declaration = [...call.prelude.matchAll(new RegExp(`\\b(?:const|let)\\s+${escaped}\\s*=\\s*\\[([^\\]]*)\\]`, "gi"))].at(-1);
456
526
  const primitiveIndexFactory = new RegExp("\\b(?:const|let)\\s+" + escaped + "\\s*=\\s*Array\\.from\\s*\\(\\s*\\{\\s*length\\s*:\\s*\\d+\\s*\\}\\s*,\\s*\\(\\s*[a-z_$][a-z0-9_$]*\\s*,\\s*([a-z_$][a-z0-9_$]*)\\s*\\)\\s*=>\\s*\\1\\s*\\)", "i").test(call.prelude);
457
527
  const primitiveElements = primitiveIndexFactory || declaration && splitTopLevel(declaration[1]).every((item) => {
@@ -468,17 +538,125 @@ function preCallSnapshotName(call, argument) {
468
538
  return shallowPatterns.flatMap((pattern) => [...call.prelude.matchAll(pattern)].map((match) => match[1])).at(-1);
469
539
  }
470
540
 
471
- function nonMutationAssertion(call) {
472
- return call.argumentNames.some((argument) => {
541
+ function nonMutationAssertion(call, requireAll = false) {
542
+ const argumentsList = splitTopLevel(call.slice.slice(call.slice.indexOf("(") + 1, -1));
543
+ if (requireAll && (call.argumentNames.length !== argumentsList.length || !call.safeScope)) return false;
544
+ const provesArgument = (argument) => {
545
+ if (requireAll && literalBinding(call, argument, call.start)?.kind === "primitive") return true;
473
546
  const snapshot = preCallSnapshotName(call, argument);
474
547
  if (!snapshot) return false;
475
- return call.assertions.some((assertion) => (
548
+ const assertions = requireAll ? call.scopedAssertions.map((entry) => entry.code) : call.assertions;
549
+ return assertions.some((assertion) => (
476
550
  new RegExp(`\\bassert\\.(?:deepEqual|deepStrictEqual|strictEqual)\\s*\\(\\s*${escapeRegex(argument)}\\s*,\\s*${escapeRegex(snapshot)}\\b`, "i").test(assertion)
477
551
  || new RegExp(`\\bexpect\\s*\\(\\s*${escapeRegex(argument)}\\s*\\)\\s*\\.to(?:Strict)?Equal\\s*\\(\\s*${escapeRegex(snapshot)}\\b`, "i").test(assertion)
478
552
  ));
553
+ };
554
+ return call.argumentNames.length > 0 && (requireAll ? call.argumentNames.every(provesArgument) : call.argumentNames.some(provesArgument));
555
+ }
556
+
557
+
558
+ function primitiveContractParameters(task) {
559
+ const contracts = new Map();
560
+ const text = [task?.summary, ...(Array.isArray(task?.acceptanceCriteria) ? task.acceptanceCriteria : [])]
561
+ .filter(Boolean).join("\n");
562
+ const pattern = /`([a-z_$][a-z0-9_$]*)`\s+(?:must|should|has\s+to)\s+be\s+(?:an?\s+)?(?:non[- ]empty\s+)?(string|integer|number|boolean|bigint|symbol)\b/gi;
563
+ for (const match of text.matchAll(pattern)) contracts.set(match[1], match[2].toLowerCase());
564
+ return contracts;
565
+ }
566
+
567
+ function balancedBlockEnd(code, openIndex) {
568
+ let depth = 0;
569
+ for (let index = openIndex; index < code.length; index += 1) {
570
+ if (code[index] === "{") depth += 1;
571
+ else if (code[index] === "}" && --depth === 0) return index + 1;
572
+ }
573
+ return -1;
574
+ }
575
+
576
+ function declaredFunctionBody(sourceEntries, callable) {
577
+ const local = callable.split(".").at(-1);
578
+ if (!/^[a-z_$][a-z0-9_$]*$/i.test(local ?? "")) return undefined;
579
+ const pattern = new RegExp(`\\bfunction\\s+${escapeRegex(local)}\\s*\\(([^)]*)\\)\\s*\\{`, "i");
580
+ for (const entry of sourceEntries) {
581
+ const match = pattern.exec(entry.text);
582
+ if (!match) continue;
583
+ const open = entry.text.indexOf("{", match.index + match[0].length - 1);
584
+ const end = balancedBlockEnd(entry.text, open);
585
+ const parameters = match[1].split(",").map((item) => item.trim());
586
+ if (end > open && parameters.every((item) => /^[a-z_$][a-z0-9_$]*$/i.test(item))) {
587
+ return { body: entry.text.slice(open + 1, end - 1), parameters };
588
+ }
589
+ }
590
+ return undefined;
591
+ }
592
+
593
+ function primitiveGuardIndex(body, parameter, type) {
594
+ const escaped = escapeRegex(parameter);
595
+ const pattern = type === "integer"
596
+ ? new RegExp(`!\\s*Number\\.is(?:Safe)?Integer\\s*\\(\\s*${escaped}\\s*\\)`, "i")
597
+ : new RegExp(`typeof\\s+${escaped}\\s*!==?\\s*["']${escapeRegex(type)}["']`, "i");
598
+ const match = pattern.exec(body);
599
+ if (!match) return -1;
600
+ const ifStart = body.lastIndexOf("if", match.index);
601
+ const open = ifStart >= 0 ? body.indexOf("(", ifStart + 2) : -1;
602
+ const close = open >= 0 ? balancedCallEnd(body, open) : -1;
603
+ if (ifStart < 0 || open < 0 || match.index < open || match.index >= close) return -1;
604
+ const consequent = body.slice(close, close + 320);
605
+ return /^\s*(?:throw\b|\{[\s\S]{0,260}\bthrow\b)/.test(consequent) ? match.index : -1;
606
+ }
607
+
608
+ function parameterMutationObserved(body, parameter) {
609
+ const escaped = escapeRegex(parameter);
610
+ return [
611
+ new RegExp(`\\b${escaped}\\s*(?:\\[[^\\]]+\\]|\\.[a-z_$][a-z0-9_$]*)?\\s*(?:=(?!=|>)|\\+=|-=|\\*=|\/=|%=|\\+\\+|--)`, "i"),
612
+ new RegExp(`(?:\\+\\+|--)\\s*${escaped}\\b|\\bdelete\\s+${escaped}\\b`, "i"),
613
+ new RegExp(`\\b(?:Object\\.(?:assign|definePropert(?:y|ies))|Reflect\\.(?:deleteProperty|set))\\s*\\(\\s*${escaped}\\b`, "i"),
614
+ new RegExp(`\\b${escaped}\\.(?:copyWithin|fill|pop|push|reverse|shift|sort|splice|unshift)\\s*\\(`, "i")
615
+ ].some((pattern) => pattern.test(body));
616
+ }
617
+
618
+ function primitiveNonMutationEvidence(task, profiles, sourceEntries) {
619
+ const contracts = primitiveContractParameters(task);
620
+ if (contracts.size === 0) return false;
621
+ const callables = [...new Set(profiles.flatMap((profile) => profile.callables))];
622
+ return callables.length > 0 && callables.every((callable) => {
623
+ const declared = declaredFunctionBody(sourceEntries, callable);
624
+ if (!declared || declared.parameters.length === 0) return false;
625
+ return declared.parameters.every((parameter) => {
626
+ const type = contracts.get(parameter);
627
+ if (!type || parameterMutationObserved(declared.body, parameter)) return false;
628
+ const guard = primitiveGuardIndex(declared.body, parameter, type);
629
+ if (guard < 0) return false;
630
+ const prefix = declared.body.slice(0, guard);
631
+ return !new RegExp(`\\b[a-z_$][a-z0-9_$.]*\\s*\\([^)]*\\b${escapeRegex(parameter)}\\b`, "i").test(prefix);
632
+ });
479
633
  });
480
634
  }
481
635
 
636
+ function dependencyNeutralEvidence(corpus) {
637
+ const manifest = /(?:^|\/)(?:package(?:-lock)?\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|deno\.jsonc?|bun\.lockb?|requirements[^/]*\.txt|pyproject\.toml|poetry\.lock|cargo\.toml|cargo\.lock|go\.mod|go\.sum)$/i;
638
+ if (corpus.files.some((file) => manifest.test(file))) return false;
639
+ return corpus.sourceEntries.length > 0 && corpus.sourceEntries.every((entry) => (
640
+ moduleRecords(entry).every((record) => record.specifier.startsWith(".") || record.specifier.startsWith("node:"))
641
+ ));
642
+ }
643
+
644
+ function semanticTerm(value) {
645
+ if (/^(?:[a-z]+s|[a-z]+es)$/i.test(value) && !/(?:ss|us)$/i.test(value)) {
646
+ if (/(?:ches|shes|ses|xes|zes)$/i.test(value)) return value.slice(0, -2);
647
+ return value.slice(0, -1);
648
+ }
649
+ return value;
650
+ }
651
+
652
+ function semanticTerms(value) {
653
+ const separated = String(value ?? "").replace(/([a-z0-9])([A-Z])/g, "$1 $2");
654
+ return new Set((normalizedText(separated).match(/[a-z][a-z0-9_$]{1,}/g) ?? [])
655
+ .map(semanticTerm)
656
+ .filter((word) => !BEHAVIOR_STOPWORDS.has(word)
657
+ && !new Set(["and", "the", "with", "from", "into", "this", "that", "for", "are", "was", "were", "has", "have", "then"]).has(word)));
658
+ }
659
+
482
660
  function definedExpectedExpression(expression, strings, prelude = "") {
483
661
  const value = String(expression ?? "").trim();
484
662
  if (!value || /^(?:undefined|null|void\b)/i.test(value)) return false;
@@ -526,11 +704,11 @@ function assertionProvesDefinedField(call, field) {
526
704
 
527
705
  function linkedTestEvidence(linkage) {
528
706
  const profiles = [];
529
- for (const { entry, callables } of linkage.entries) {
707
+ for (const { entry, callables, bindings } of linkage.entries) {
530
708
  if (!/\b(?:assert(?:\.[a-z][a-z0-9_]*)?\s*\(|expect\s*\()/i.test(entry.evidenceText)) continue;
531
709
  const bound = bindJavaScriptStrings(entry.text);
532
710
  const calls = callableSlices(bound.code, bound.strings, callables);
533
- if (calls.length > 0) profiles.push({ path: entry.path, code: bound.code, calls, callables });
711
+ if (calls.length > 0) profiles.push({ path: entry.path, raw: entry.text, evidenceCode: normalizedText(entry.evidenceText), code: bound.code, calls, callables, bindings });
534
712
  }
535
713
  return profiles;
536
714
  }
@@ -688,14 +866,14 @@ export function verifierCommandsCoverTests(task, testPaths, cwd) {
688
866
  }));
689
867
  }
690
868
 
691
- function criterionBehaviorMatches(task, criterion, profiles, sourceFiles) {
692
- const rawCriterion = boundCriterionText(task, criterion);
869
+ function criterionConjunctMatches(task, rawCriterion, profiles, corpus) {
693
870
  if (!rawCriterion || profiles.length === 0) return false;
694
871
  const text = normalizedText(rawCriterion);
695
872
  const calls = profiles.flatMap((profile) => profile.calls);
696
873
  const code = calls.flatMap((call) => call.assertions).join("\n");
697
874
  const requirements = [];
698
- if (rawCriterion.split(";").filter((clause) => clause.trim()).length > 1) return false;
875
+ const resultEvidence = acceptanceResultContractEvidence(rawCriterion, profiles, corpus.sourceEntries, [task?.summary, task?.expectedOutput, ...(task?.acceptanceCriteria ?? [])].filter(Boolean).join("\n"));
876
+ if (resultEvidence !== undefined) requirements.push(resultEvidence);
699
877
  if (/\bfocused\s+tests?\b/.test(text)) requirements.push(calls.length > 0);
700
878
  if (/--[a-z0-9_-]+=[a-z0-9_<[{]/i.test(text) || /\bname\s*=\s*value\b/.test(text)) {
701
879
  requirements.push(calls.some((call) => call.values.some((value) => {
@@ -734,8 +912,13 @@ function criterionBehaviorMatches(task, criterion, profiles, sourceFiles) {
734
912
  return expected !== undefined && assertedFlagValue(call, expected.name.slice(2), expected.value);
735
913
  }));
736
914
  }
737
- if (/\b(?:do not|must not|without)\s+mutat|\bpreserve\s+(?:the\s+)?input/.test(text)) {
738
- requirements.push(calls.some(nonMutationAssertion));
915
+ if (/\b(?:do not|must not|without)\s+mutat|\b(?:do not|must not)\s+[^.;]{0,100}\bor\s+mutat|\bpreserve\s+(?:the\s+)?input|\binputs? must remain unchanged\b/.test(text)) {
916
+ const requireAll = /\binputs\b|\b(?:both|either|all|any)\s+(?:of\s+)?(?:the\s+)?(?:arguments?|inputs?)\b/.test(text);
917
+ requirements.push(dependencyGraphNonMutationEvidence({rawCriterion,profiles,sourceEntries:corpus.sourceEntries}) || pureRecordNonMutationEvidence({rawCriterion,profiles,sourceEntries:corpus.sourceEntries}) || byteArrayNonMutationEvidence({rawCriterion,profiles,sourceEntries:corpus.sourceEntries}) || finiteIntervalNonMutationEvidence({ rawCriterion, profiles, sourceEntries: corpus.sourceEntries, contextText: [task?.summary, task?.expectedOutput, ...(task?.acceptanceCriteria ?? [])].filter(Boolean).join("\n") }) || calls.some((call) => nonMutationAssertion({ ...call, sourceEntries: corpus.sourceEntries }, requireAll))
918
+ || primitiveNonMutationEvidence(task, profiles, corpus.sourceEntries));
919
+ }
920
+ if (/\b(?:do not|must not|without)\s+add(?:ing)?\s+(?:new\s+)?dependenc/.test(text)) {
921
+ requirements.push(dependencyNeutralEvidence(corpus));
739
922
  }
740
923
  if (/\breturn shape\b|\breturned? (?:object|representation)\b/.test(text)) {
741
924
  requirements.push(calls.some((call) => assertionProvesDefinedField(call, "flags")
@@ -746,12 +929,23 @@ function criterionBehaviorMatches(task, criterion, profiles, sourceFiles) {
746
929
  if (errorClass) requirements.push(new RegExp(`\\b(?:assert\\.throws|rejects|tothrow)\\b[\\s\\S]{0,240}\\b${errorClass}\\b`, "i").test(code));
747
930
  if (requirements.length > 0) return requirements.every(Boolean);
748
931
  const names = new Set(profiles.flatMap((profile) => profile.callables).flatMap((name) => name.split(".")));
749
- const paths = [...sourceFiles, ...profiles.map((profile) => profile.path)].join("\n");
932
+ const paths = [...corpus.sourceFiles, ...profiles.map((profile) => profile.path)].join("\n");
750
933
  const anchors = [...rawCriterion.matchAll(/\b[a-z_$][a-z0-9_$]{3,}\b/gi)]
751
934
  .map((match) => match[0]).filter((word) => !BEHAVIOR_STOPWORDS.has(word.toLowerCase()));
752
- return anchors.some((anchor) => names.has(anchor)
935
+ const direct = anchors.some((anchor) => names.has(anchor)
753
936
  || new RegExp(`\\b${escapeRegex(anchor)}\\b`, "i").test(code)
754
937
  || new RegExp(`(?:^|[/_.-])${escapeRegex(anchor)}(?:[/_.-]|$)`, "i").test(paths));
938
+ const criterionTerms = semanticTerms(rawCriterion);
939
+ const descriptionTerms = semanticTerms(calls.flatMap((call) => call.descriptions ?? []).join("\n"));
940
+ const descriptionOverlap = [...criterionTerms].filter((term) => descriptionTerms.has(term));
941
+ return direct || descriptionOverlap.length >= 2;
942
+ }
943
+
944
+ function criterionBehaviorMatches(task, criterion, profiles, corpus) {
945
+ const rawCriterion = boundCriterionText(task, criterion);
946
+ const conjuncts = acceptanceContractConjuncts(rawCriterion);
947
+ return conjuncts.length > 0
948
+ && conjuncts.every((conjunct) => criterionConjunctMatches(task, conjunct, profiles, corpus));
755
949
  }
756
950
 
757
951
  function behavioralFocusRequired(input) {
@@ -777,7 +971,7 @@ function focusedBehaviorEvidence(input) {
777
971
  if (criterionBehaviorProofDisposition(input) !== "linked") return undefined;
778
972
  const linkage = testSourceLinkage(input.corpus);
779
973
  const profiles = linkedTestEvidence(linkage).filter((profile) => verifierCommandsCoverTests(input.task, [profile.path], input.cwd));
780
- if (!criterionBehaviorMatches(input.task, input.criterion, profiles, input.corpus.sourceFiles)) return undefined;
974
+ if (!criterionBehaviorMatches(input.task, input.criterion, profiles, input.corpus)) return undefined;
781
975
  return {
782
976
  ...input.verifierEvidence,
783
977
  kind: "verifier-backed-focused-test",
@@ -0,0 +1,31 @@
1
+ import { createHash } from "node:crypto";
2
+ import { namedTargetBindings, sanitizeJavaScriptEvidence, sourceExports } from "./acceptance-contract-semantics.js";
3
+ import { executableRejectionAssertions } from "./acceptance-executable-evidence.js";
4
+ import { routeNamedSourceTargets } from "./acceptance-source-origin.js";
5
+
6
+ // This is an additional provenance gate, not a numeric semantics prover. A
7
+ // positive operation cannot borrow a rejection assertion or another function's
8
+ // boundary tests. Keep the exact criterion hash and immediate subject context;
9
+ // unresolved pronouns/ownership stay unproven instead of guessing by test names.
10
+ export function boundaryTargetHasLiveSuccess({ task, criterion, corpus }) {
11
+ const criteria = task.acceptanceCriteria ?? [];
12
+ const index = criteria.findIndex(text => typeof text === "string"
13
+ && createHash("sha256").update(text).digest("hex") === criterion.hash);
14
+ const text = index >= 0 ? criteria[index] : "";
15
+ if (!/\bclamps?\b/i.test(text)) return true;
16
+ if (!/^otherwise\s+it\b|^`[A-Za-z_$][\w$]*`\s+clamps?\b/i.test(text.trim())) return true;
17
+ const subjectText = /^otherwise\s+it\b/i.test(text.trim()) ? criteria[index - 1] : text;
18
+ const target = String(subjectText ?? "").trim().match(/^`([A-Za-z_$][\w$]*)`\s+(?:returns?|clamps?)\b/i)?.[1]?.toLowerCase();
19
+ if (!target) return false;
20
+ const { strictTargets, unresolvedTargets } = routeNamedSourceTargets({ namedTargets: [target], provenanceTargets: new Set(),
21
+ sourceEntries: corpus.sourceEntries, exports: corpus.sourceEntries.flatMap(sourceExports), taskText: subjectText });
22
+ if (strictTargets.length !== 1 || unresolvedTargets.length > 0) return false;
23
+ const binding = namedTargetBindings(corpus.sourceEntries, corpus.testEntries, [target])[0];
24
+ return Boolean(binding?.sourceName && binding.testBindings.some(testBinding => {
25
+ const entry = corpus.testEntries.find(item => item.path === testBinding.testPath);
26
+ if (!entry) return false;
27
+ const code = sanitizeJavaScriptEvidence(entry.text).toLowerCase();
28
+ return executableRejectionAssertions(code, new Set([testBinding.testName]), false, true)
29
+ .some(assertion => assertion.mode === "does-not-throw" && assertion.targets.includes(testBinding.testName));
30
+ }));
31
+ }