@piagent/platform 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +24 -15
  3. package/README.vi.md +36 -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 +27 -3
  10. package/benchmarks/production-v1/suite.json +5 -1
  11. package/benchmarks/production-v2/grade.mjs +892 -0
  12. package/benchmarks/production-v2/project/README.md +7 -0
  13. package/benchmarks/production-v2/project/config/service.json +4 -0
  14. package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
  15. package/benchmarks/production-v2/project/docs/ops.md +3 -0
  16. package/benchmarks/production-v2/project/logs/incident.log +2 -0
  17. package/benchmarks/production-v2/project/package.json +11 -0
  18. package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
  19. package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
  20. package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
  21. package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
  22. package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
  23. package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
  24. package/benchmarks/production-v2/project/src/data/csv.js +3 -0
  25. package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
  26. package/benchmarks/production-v2/project/src/data/migration.js +9 -0
  27. package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
  28. package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
  29. package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
  30. package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
  31. package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
  32. package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
  33. package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
  34. package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
  35. package/benchmarks/production-v2/project/src/platform/args.js +10 -0
  36. package/benchmarks/production-v2/project/src/platform/config.js +7 -0
  37. package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
  38. package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
  39. package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
  40. package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
  41. package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
  42. package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
  43. package/benchmarks/production-v2/project/vendor/README.md +1 -0
  44. package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
  45. package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
  46. package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
  47. package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
  48. package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
  49. package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
  50. package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
  51. package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
  52. package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
  53. package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
  54. package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
  55. package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
  56. package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
  57. package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
  58. package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
  59. package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
  60. package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  61. package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  62. package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
  63. package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
  64. package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  65. package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
  66. package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  67. package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
  68. package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
  69. package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
  70. package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
  71. package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
  72. package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
  73. package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
  74. package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
  75. package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
  76. package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
  77. package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
  78. package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
  79. package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
  80. package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
  81. package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
  82. package/benchmarks/production-v2/spend-control.v1.json +115 -0
  83. package/benchmarks/production-v2/suite.json +1009 -0
  84. package/benchmarks/production-v2/variant.mjs +169 -0
  85. package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
  86. package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
  87. package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
  88. package/benchmarks/production-v3/grade.mjs +1017 -0
  89. package/benchmarks/production-v3/project/README.md +7 -0
  90. package/benchmarks/production-v3/project/config/service.json +4 -0
  91. package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
  92. package/benchmarks/production-v3/project/docs/ops.md +3 -0
  93. package/benchmarks/production-v3/project/logs/incident.log +2 -0
  94. package/benchmarks/production-v3/project/package.json +11 -0
  95. package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
  96. package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
  97. package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
  98. package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
  99. package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
  100. package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
  101. package/benchmarks/production-v3/project/src/data/csv.js +3 -0
  102. package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
  103. package/benchmarks/production-v3/project/src/data/migration.js +9 -0
  104. package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
  105. package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
  106. package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
  107. package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
  108. package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
  109. package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
  110. package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
  111. package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
  112. package/benchmarks/production-v3/project/src/platform/args.js +10 -0
  113. package/benchmarks/production-v3/project/src/platform/config.js +7 -0
  114. package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
  115. package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
  116. package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
  117. package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
  118. package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
  119. package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
  120. package/benchmarks/production-v3/project/vendor/README.md +1 -0
  121. package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
  122. package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
  123. package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
  124. package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
  125. package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
  126. package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
  127. package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
  128. package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
  129. package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
  130. package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
  131. package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
  132. package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
  133. package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
  134. package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
  135. package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
  136. package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
  137. package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
  138. package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
  139. package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
  140. package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
  141. package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
  142. package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
  143. package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
  144. package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
  145. package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
  146. package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
  147. package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
  148. package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
  149. package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
  150. package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
  151. package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
  152. package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
  153. package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
  154. package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
  155. package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
  156. package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
  157. package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
  158. package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
  159. package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
  160. package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
  161. package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
  162. package/benchmarks/production-v3/spend-control.v1.json +121 -0
  163. package/benchmarks/production-v3/suite.json +1010 -0
  164. package/benchmarks/production-v3/variant.mjs +178 -0
  165. package/catalog/capabilities.json +16 -16
  166. package/docs/authority-manifest.md +1 -1
  167. package/docs/auto-delegation-policy.md +38 -73
  168. package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
  169. package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
  170. package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
  171. package/docs/benchmark-public-contract-addendum-v2.md +85 -0
  172. package/docs/benchmark-public-contract-addendum-v3.md +116 -0
  173. package/docs/command-reference-vietnamese.md +30 -35
  174. package/docs/context-engine.md +5 -3
  175. package/docs/context-window-policy.md +37 -1
  176. package/docs/distribution-standard.md +9 -9
  177. package/docs/en/architecture.md +26 -13
  178. package/docs/languages.json +4 -4
  179. package/docs/operator-manual-vietnamese.md +26 -46
  180. package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
  181. package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
  182. package/docs/piagent-core-improvement-plan.md +528 -0
  183. package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
  184. package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
  185. package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
  186. package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
  187. package/docs/piagent-open-session-wait.md +19 -0
  188. package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
  189. package/docs/publishing-for-teams.md +7 -0
  190. package/docs/quality-benchmark.md +299 -23
  191. package/docs/quickstart-vietnamese.md +2 -2
  192. package/docs/release-install-policy.md +32 -9
  193. package/docs/research/harness-next-evidence-review.md +113 -0
  194. package/docs/runtime-harness-standard.md +3 -3
  195. package/docs/security-threat-model.md +1 -1
  196. package/docs/subagent-orchestration-capabilities.md +19 -51
  197. package/docs/subagents-and-multiagent.md +21 -47
  198. package/docs/task-implementation-contract.md +3 -3
  199. package/docs/task-lifecycle-vietnamese.md +1 -1
  200. package/docs/team-onboarding.md +7 -7
  201. package/docs/third-party-neutrality.md +7 -0
  202. package/docs/usage-observability.md +1 -1
  203. package/docs/vi/architecture.md +26 -13
  204. package/docs-site/architecture.html +1 -1
  205. package/docs-site/benchmark.html +89 -95
  206. package/docs-site/commands.html +1 -1
  207. package/docs-site/content/benchmark.html +88 -94
  208. package/docs-site/content/en/benchmark.html +134 -90
  209. package/docs-site/content/en/index.html +19 -19
  210. package/docs-site/content/en/runtime.html +5 -5
  211. package/docs-site/content/en/whats-new.html +23 -1
  212. package/docs-site/content/en/workflows.html +2 -2
  213. package/docs-site/content/index.html +19 -19
  214. package/docs-site/content/runtime.html +6 -6
  215. package/docs-site/content/whats-new.html +23 -1
  216. package/docs-site/content/workflows.html +2 -2
  217. package/docs-site/context-engine.html +1 -1
  218. package/docs-site/en/architecture.html +1 -1
  219. package/docs-site/en/benchmark.html +135 -91
  220. package/docs-site/en/commands.html +1 -1
  221. package/docs-site/en/context-engine.html +1 -1
  222. package/docs-site/en/index.html +20 -20
  223. package/docs-site/en/mcp-approval.html +1 -1
  224. package/docs-site/en/mcp-auth.html +1 -1
  225. package/docs-site/en/mcp-servers.html +1 -1
  226. package/docs-site/en/mcp.html +1 -1
  227. package/docs-site/en/permissions.html +1 -1
  228. package/docs-site/en/profiles.html +1 -1
  229. package/docs-site/en/quickstart.html +1 -1
  230. package/docs-site/en/runtime.html +6 -6
  231. package/docs-site/en/scope.html +1 -1
  232. package/docs-site/en/security.html +1 -1
  233. package/docs-site/en/team.html +1 -1
  234. package/docs-site/en/whats-new.html +24 -2
  235. package/docs-site/en/workflows.html +3 -3
  236. package/docs-site/index.html +20 -20
  237. package/docs-site/mcp-approval.html +1 -1
  238. package/docs-site/mcp-auth.html +1 -1
  239. package/docs-site/mcp-servers.html +1 -1
  240. package/docs-site/mcp.html +1 -1
  241. package/docs-site/permissions.html +1 -1
  242. package/docs-site/profiles.html +1 -1
  243. package/docs-site/quickstart.html +1 -1
  244. package/docs-site/runtime.html +7 -7
  245. package/docs-site/scope.html +1 -1
  246. package/docs-site/security.html +1 -1
  247. package/docs-site/team.html +1 -1
  248. package/docs-site/whats-new.html +24 -2
  249. package/docs-site/workflows.html +3 -3
  250. package/evals/architecture-conformance-v1/lane.json +18 -0
  251. package/evals/architecture-conformance-v1/runner.mjs +77 -0
  252. package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
  253. package/evals/fixtures/approved-host-contracts.valid.json +43 -0
  254. package/evals/fixtures/benchmark-assurance-evidence.invalid.json +1 -1
  255. package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
  256. package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
  257. package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
  258. package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
  259. package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
  260. package/evals/fixtures/codex-relative-efficiency-v1.invalid.json +4 -0
  261. package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -0
  262. package/evals/fixtures/composite-criterion.invalid.json +10 -0
  263. package/evals/fixtures/composite-criterion.valid.json +33 -0
  264. package/evals/fixtures/contract-family-library.invalid.json +42 -0
  265. package/evals/fixtures/contract-family-library.valid.json +41 -0
  266. package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
  267. package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
  268. package/evals/fixtures/helper-request.invalid.json +1 -1
  269. package/evals/fixtures/helper-request.valid.json +1 -1
  270. package/evals/fixtures/host-contract-plan.invalid.json +42 -0
  271. package/evals/fixtures/host-contract-plan.valid.json +41 -0
  272. package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -0
  273. package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
  274. package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
  275. package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
  276. package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
  277. package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
  278. package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
  279. package/evals/fixtures/task-authority-snapshot.valid.json +4 -4
  280. package/evals/fs4-readiness-matrix.v1.json +2 -2
  281. package/evals/fs5-artifact-archive/README.md +32 -0
  282. package/evals/fs5-artifact-archive/manifest.json +148 -0
  283. package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
  284. package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
  285. package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
  286. package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
  287. package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
  288. package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
  289. package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
  290. package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
  291. package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
  292. package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
  293. package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
  294. package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
  295. package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
  296. package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
  297. package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
  298. package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
  299. package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
  300. package/evals/fs5-causal-arm.v1.json +10 -6
  301. package/evals/fs5-pilot-protocol.v1.json +3 -3
  302. package/evals/fs5-pilot-protocol.v2.json +8 -8
  303. package/evals/fs5-pilot-protocol.v3.json +8 -8
  304. package/evals/fs5-pilot-protocol.v4.json +7 -7
  305. package/evals/fs5-pilot-protocol.v5.json +10 -8
  306. package/evals/harness-next/development-corpus.mjs +106 -0
  307. package/evals/harness-next/resource-budget-probe.mjs +38 -0
  308. package/evals/harness-next/run-calibration.mjs +83 -0
  309. package/evals/harness-next/run-resource-probe.mjs +55 -0
  310. package/evals/harness-next/selected-development-corpus.mjs +27 -0
  311. package/evals/harness-next.v1.json +51 -0
  312. package/evals/long-horizon-v1/README.md +19 -0
  313. package/evals/long-horizon-v1/runner.mjs +116 -48
  314. package/evals/long-horizon-v1/worker.mjs +77 -30
  315. package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
  316. package/evals/private-holdout-v1/README.md +5 -2
  317. package/evals/private-holdout-v1/public-exposure.v1.json +1 -1
  318. package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
  319. package/evals/runtime-conformance-v1/README.md +43 -0
  320. package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
  321. package/evals/runtime-conformance-v1/lane.json +57 -0
  322. package/evals/runtime-conformance-v1/paid-canary.json +31 -0
  323. package/evals/runtime-conformance-v1/runner.mjs +456 -0
  324. package/package.json +9 -4
  325. package/packages/piagent-core/README.md +15 -6
  326. package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
  327. package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
  328. package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
  329. package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
  330. package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
  331. package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
  332. package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
  333. package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
  334. package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
  335. package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
  336. package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
  337. package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +699 -0
  338. package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
  339. package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
  340. package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
  341. package/packages/piagent-core/benchmark/benchmark-core.js +111 -110
  342. package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
  343. package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
  344. package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
  345. package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
  346. package/packages/piagent-core/benchmark/benchmark-forensics.js +67 -52
  347. package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
  348. package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
  349. package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
  350. package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
  351. package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
  352. package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
  353. package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
  354. package/packages/piagent-core/benchmark/benchmark-preflight.js +70 -7
  355. package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
  356. package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
  357. package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
  358. package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +462 -0
  359. package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
  360. package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
  361. package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
  362. package/packages/piagent-core/benchmark/benchmark-record-validation.js +343 -8
  363. package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
  364. package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
  365. package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
  366. package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
  367. package/packages/piagent-core/benchmark/benchmark-runtime-causal.js +244 -0
  368. package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
  369. package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
  370. package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
  371. package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
  372. package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +246 -33
  373. package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
  374. package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
  375. package/packages/piagent-core/benchmark/benchmark-suite.js +232 -4
  376. package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
  377. package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
  378. package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
  379. package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
  380. package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
  381. package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
  382. package/packages/piagent-core/benchmark/benchmark-usage.js +410 -37
  383. package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
  384. package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
  385. package/packages/piagent-core/capabilities/runtime-integrity.js +6 -0
  386. package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
  387. package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
  388. package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
  389. package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
  390. package/packages/piagent-core/extensions/acceptance-behavior-proof.js +1000 -0
  391. package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
  392. package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
  393. package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
  394. package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
  395. package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
  396. package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
  397. package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
  398. package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
  399. package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
  400. package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
  401. package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
  402. package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
  403. package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
  404. package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
  405. package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
  406. package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
  407. package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
  408. package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
  409. package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
  410. package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
  411. package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
  412. package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
  413. package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
  414. package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
  415. package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
  416. package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
  417. package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
  418. package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
  419. package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
  420. package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
  421. package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
  422. package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
  423. package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
  424. package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
  425. package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
  426. package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
  427. package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
  428. package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
  429. package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
  430. package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
  431. package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
  432. package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
  433. package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
  434. package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
  435. package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
  436. package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
  437. package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
  438. package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
  439. package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
  440. package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
  441. package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
  442. package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
  443. package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
  444. package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
  445. package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
  446. package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
  447. package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
  448. package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
  449. package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
  450. package/packages/piagent-core/extensions/acceptance-receipt.js +208 -180
  451. package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
  452. package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
  453. package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
  454. package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
  455. package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
  456. package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
  457. package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
  458. package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
  459. package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
  460. package/packages/piagent-core/extensions/context-engine.js +12 -17
  461. package/packages/piagent-core/extensions/context-index-policy.js +4 -0
  462. package/packages/piagent-core/extensions/context-query-paths.js +57 -0
  463. package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
  464. package/packages/piagent-core/extensions/criterion-graph.js +4 -1
  465. package/packages/piagent-core/extensions/failure-types.ts +2 -2
  466. package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
  467. package/packages/piagent-core/extensions/guard-types.ts +9 -1
  468. package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
  469. package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
  470. package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
  471. package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
  472. package/packages/piagent-core/extensions/task-contract-view.js +4 -4
  473. package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
  474. package/packages/piagent-core/extensions/task-journal.js +48 -3
  475. package/packages/piagent-core/extensions/task-lifecycle.js +32 -0
  476. package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
  477. package/packages/piagent-core/extensions/task-state.js +140 -43
  478. package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
  479. package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
  480. package/packages/piagent-core/extensions/verification-intelligence.js +109 -20
  481. package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
  482. package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
  483. package/packages/piagent-core/extensions/workspace-revision.js +48 -0
  484. package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
  485. package/packages/piagent-core/package.json +3 -3
  486. package/packages/piagent-core/policies/base-policy.json +43 -2
  487. package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
  488. package/packages/piagent-core/prompts/be-to-fe.md +2 -8
  489. package/packages/piagent-core/prompts/plan.md +1 -1
  490. package/packages/piagent-core/prompts/platform-improve.md +2 -6
  491. package/packages/piagent-core/prompts/review.md +2 -7
  492. package/packages/piagent-core/prompts/scout.md +1 -1
  493. package/packages/piagent-core/prompts/task.md +4 -3
  494. package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
  495. package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
  496. package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
  497. package/packages/piagent-core/runtime/hooks/completion-hook.ts +83 -89
  498. package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -7
  499. package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
  500. package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
  501. package/packages/piagent-core/runtime/hooks/session-start-hook.ts +150 -19
  502. package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
  503. package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
  504. package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
  505. package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
  506. package/packages/piagent-core/runtime/hooks/tool-result-value-helpers.ts +66 -0
  507. package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
  508. package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
  509. package/packages/piagent-core/runtime/inspection/bounded-emission-guard.ts +286 -0
  510. package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
  511. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  512. package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
  513. package/packages/piagent-core/runtime/inspection/task-subagent-tree.ts +27 -4
  514. package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
  515. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
  516. package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
  517. package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
  518. package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
  519. package/packages/piagent-core/runtime/orchestration/helper-lifecycle.ts +16 -12
  520. package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
  521. package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
  522. package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
  523. package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
  524. package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
  525. package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
  526. package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
  527. package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
  528. package/packages/piagent-core/runtime/product/efficiency-metrics.ts +15 -7
  529. package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
  530. package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
  531. package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
  532. package/packages/piagent-core/runtime/quality/edit-freshness-guard.ts +102 -0
  533. package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
  534. package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
  535. package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
  536. package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
  537. package/packages/piagent-core/runtime/recovery/continuation-budget.ts +12 -3
  538. package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
  539. package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
  540. package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
  541. package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
  542. package/packages/piagent-core/runtime/recovery/pristine-task-policy-refresh.ts +91 -0
  543. package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
  544. package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
  545. package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
  546. package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
  547. package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
  548. package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
  549. package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
  550. package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
  551. package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
  552. package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
  553. package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
  554. package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
  555. package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
  556. package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
  557. package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
  558. package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
  559. package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
  560. package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
  561. package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
  562. package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
  563. package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
  564. package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
  565. package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
  566. package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
  567. package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
  568. package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
  569. package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
  570. package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
  571. package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
  572. package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
  573. package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
  574. package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
  575. package/packages/piagent-core/runtime/session/usage.ts +4 -3
  576. package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
  577. package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
  578. package/packages/piagent-core/runtime/tools/phase-tools.ts +10 -9
  579. package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
  580. package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
  581. package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
  582. package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
  583. package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
  584. package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
  585. package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
  586. package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
  587. package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
  588. package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
  589. package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
  590. package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
  591. package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +101 -0
  592. package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
  593. package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
  594. package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
  595. package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
  596. package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
  597. package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
  598. package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
  599. package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +201 -0
  600. package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
  601. package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
  602. package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
  603. package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
  604. package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
  605. package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
  606. package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
  607. package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
  608. package/packages/piagent-core/subagents/piagent-oracle.md +5 -3
  609. package/packages/piagent-core/subagents/piagent-planner.md +6 -4
  610. package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
  611. package/packages/piagent-core/subagents/piagent-scout.md +4 -2
  612. package/packages/piagent-core/subagents/piagent-worker.md +6 -4
  613. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.js → MarkdownMessage-DGk34zJT.js} +1 -1
  614. package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
  615. package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
  616. package/packages/piagent-webui/dist/client/index.html +2 -2
  617. package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
  618. package/packages/piagent-webui/extension/piagent-webui.ts +13 -3
  619. package/packages/piagent-webui/extension/review-controller.ts +29 -6
  620. package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
  621. package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
  622. package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
  623. package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
  624. package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
  625. package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
  626. package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
  627. package/packages/piagent-webui/gateway/gateway-session-stream.ts +170 -32
  628. package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
  629. package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
  630. package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
  631. package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
  632. package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
  633. package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
  634. package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
  635. package/packages/piagent-webui/gateway/session-operation-lifecycle.ts +237 -0
  636. package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
  637. package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
  638. package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
  639. package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
  640. package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
  641. package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
  642. package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
  643. package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
  644. package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +118 -117
  645. package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
  646. package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
  647. package/packages/piagent-webui/server/loopback-server.ts +9 -7
  648. package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
  649. package/packages/piagent-webui/server/transcript-projection.ts +150 -11
  650. package/packages/piagent-webui/shared/message-correlation.ts +25 -0
  651. package/schemas/approved-host-contracts.schema.json +973 -0
  652. package/schemas/benchmark-attempt-outcome.schema.json +303 -0
  653. package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
  654. package/schemas/codex-relative-efficiency-v1.schema.json +155 -0
  655. package/schemas/composite-criterion.schema.json +788 -0
  656. package/schemas/contract-family-library.schema.json +28 -0
  657. package/schemas/contract-selection-recipe.schema.json +31 -0
  658. package/schemas/failure-evidence.schema.json +2 -2
  659. package/schemas/helper-request.schema.json +16 -4
  660. package/schemas/host-contract-plan.schema.json +25 -0
  661. package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
  662. package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
  663. package/schemas/piagent-webui/runtime-event-v2.schema.json +46 -5
  664. package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
  665. package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
  666. package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
  667. package/schemas/piagent-webui/subagent-tree-v1.schema.json +11 -1
  668. package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
  669. package/schemas/project-profile.schema.json +1 -1
  670. package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
  671. package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
  672. package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
  673. package/schemas/public-contracts/revocation-v1.schema.json +87 -0
  674. package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
  675. package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
  676. package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
  677. package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
  678. package/schemas/task-contract.schema.json +45 -0
  679. package/scripts/approve-independent-verification.mjs +57 -0
  680. package/scripts/benchmark-arm-observer.mjs +320 -0
  681. package/scripts/benchmark-budget-ipc.mjs +34 -0
  682. package/scripts/benchmark-budget-launcher.mjs +91 -0
  683. package/scripts/benchmark-budget-processes.mjs +133 -0
  684. package/scripts/benchmark-budget-publication.mjs +228 -0
  685. package/scripts/benchmark-budget-runtime.mjs +136 -0
  686. package/scripts/benchmark-candidate-ablation.mjs +265 -0
  687. package/scripts/benchmark-codex-journey.mjs +406 -0
  688. package/scripts/benchmark-independent-verification.mjs +628 -0
  689. package/scripts/benchmark-journey-outcome.mjs +92 -0
  690. package/scripts/benchmark-production-v3-human-review.mjs +192 -0
  691. package/scripts/benchmark-public-input-catalog.mjs +158 -0
  692. package/scripts/benchmark-registered-plan-author.mjs +355 -0
  693. package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
  694. package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
  695. package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
  696. package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
  697. package/scripts/benchmark-runner-completion.mjs +133 -0
  698. package/scripts/benchmark-runner-configuration.mjs +159 -0
  699. package/scripts/benchmark-runner-core.mjs +224 -387
  700. package/scripts/benchmark-runner-finalization.mjs +144 -27
  701. package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
  702. package/scripts/benchmark-runner-schedule.mjs +256 -0
  703. package/scripts/benchmark-runner-support.mjs +136 -4
  704. package/scripts/benchmark-runner.mjs +95 -18
  705. package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
  706. package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
  707. package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
  708. package/scripts/benchmark-scoped-pi-router.mjs +196 -0
  709. package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
  710. package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
  711. package/scripts/benchmark-scoped-session-custody.mjs +599 -0
  712. package/scripts/benchmark-scoped-session-factory.mjs +342 -0
  713. package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
  714. package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
  715. package/scripts/benchmark-session-evaluator.mjs +169 -0
  716. package/scripts/benchmark-session-provider-boundary.mjs +62 -0
  717. package/scripts/benchmark-session-usage.mjs +28 -0
  718. package/scripts/benchmark-session.mjs +343 -50
  719. package/scripts/benchmark-webui-journey.mjs +678 -0
  720. package/scripts/check-public-wording.mjs +46 -0
  721. package/scripts/configure-subagents.sh +42 -34
  722. package/scripts/fs4-readiness-evaluation.mjs +7 -1
  723. package/scripts/helper-evaluation.mjs +1 -1
  724. package/scripts/phase-tools-evaluation.mjs +1 -0
  725. package/scripts/pi-auto.sh +7 -1
  726. package/scripts/pi-usage-history.mjs +201 -11
  727. package/scripts/piagent-cli.mjs +8 -0
  728. package/scripts/private-holdout-readiness.mjs +7 -1
  729. package/scripts/public-evaluation-exposure.mjs +140 -0
  730. package/scripts/select-independent-verification.mjs +62 -0
  731. package/scripts/team-doctor.sh +1 -1
  732. package/scripts/typescript-loader.mjs +135 -1
  733. package/scripts/update-global.mjs +6 -7
  734. package/scripts/verify-local.sh +41 -55
  735. package/scripts/verify-release-identity.mjs +5 -3
  736. package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
@@ -1,40 +1,31 @@
1
+ import { finiteIntervalRecordEvidence } from "./acceptance-temporal-contract.js";
1
2
  import path from "node:path";
2
- import { acceptanceBoundaryProofGuidance } from "./acceptance-boundary-guidance.js";
3
- import { evidenceTopLevelArguments, executableRejectionAssertions } from "./acceptance-executable-evidence.js";
4
- import { ERROR_CONSTRUCTORS, ERROR_CONSTRUCTOR_DISPLAY_NAMES, errorMappingsProveContract,
5
- hasAmbiguousErrorClassIntent, rejectionStatementErrorClass, requestedErrorClasses, requestedErrorPartitionMapping } from "./acceptance-error-classes.js";
3
+ import { browserWindowReferencesAreLocal, nativeErrorReferencesAreUnshadowed } from "./acceptance-local-binding.js";
4
+ import { callableBodies } from "./acceptance-callable-scanner.js";
5
+ import { acceptanceIntegerConstraintTargets as integerConstraintTargets } from "./acceptance-contract-conjunction.js";
6
+ import { acceptanceBoundaryProofGuidance, isoTimestampProofGuidance, malformedIdentifierContract, malformedTaggedEventRequirements, rejectionClassProofGuidance } from "./acceptance-boundary-guidance.js";
7
+ import { executableRejectionAssertions } from "./acceptance-executable-evidence.js";
8
+ import { ERROR_CONSTRUCTORS, ERROR_CONSTRUCTOR_DISPLAY_NAMES, errorMappingsProveContract, hasAmbiguousErrorClassIntent, rejectionStatementErrorClass, requestedErrorClasses, requestedErrorPartitionMapping } from "./acceptance-error-classes.js";
9
+ import { inputDerivedNames } from "./acceptance-input-provenance.js";
10
+ import { consumeJavaScriptStringEscape, eraseJavaScriptLexeme as erasedLexeme, isJavaScriptLineTerminator, normalizedJavaScriptLineTerminator, regexLiteralSentinel, stringLiteralSentinel, validJavaScriptRegexLiteral } from "./acceptance-lexical-sentinels.js";
11
+ import { exactNormalizerInvocation, synchronousNormalizerProof } from "./acceptance-normalizer-evidence.js";
12
+ import { casePreservingCallableBodies } from "./acceptance-expiry-calendar-proof.js";
13
+ import { invalidSentinelRejectionProof, withInvalidSentinelDiagnostics } from "./acceptance-invalid-sentinel-proof.js";
6
14
  import { statefulTerminalRejectionEvidence } from "./acceptance-state-machine-evidence.js";
15
+ import { malformedTaggedEventEvidence } from "./acceptance-tagged-event-evidence.js";
7
16
  import { boundRejectionTestEvidence, callableAssertionMode } from "./acceptance-test-binding-evidence.js";
17
+ import { routeNamedSourceTargets } from "./acceptance-source-origin.js";
18
+ import { rejectedIntegerParameter, integerParameterBindingEvidence, orderedRecordRejectionEvidence, dependencyCycleEvidence } from "./acceptance-parameter-contract.js";
19
+ import { integerDomainEvidence } from "./acceptance-integer-domains.js";
20
+ import { requestedInvalidPartitions } from "./acceptance-invalid-partitions.js";
21
+ import { temporalContractEvidence, temporalInputRequirements } from "./acceptance-temporal-contract.js";
8
22
  import { regexCanStartAfterLexicalChunks } from "./javascript-regex-evidence.js";
9
- const INTEGER_TARGET_STOPWORDS = new Set([
10
- "and", "basis", "cents", "input", "inputs", "items", "money", "number", "numbers", "or", "points", "typeerror", "value", "values"
11
- ]);
12
-
13
23
  function normalizedText(value) {
14
24
  return String(value ?? "")
15
25
  .normalize("NFD")
16
26
  .replace(/[\u0300-\u036f]/g, "")
17
27
  .toLowerCase();
18
28
  }
19
-
20
- function erasedLexeme(value) {
21
- return String(value ?? "").replace(/[^\r\n]/g, " ");
22
- }
23
-
24
- function stringLiteralSentinel(value) {
25
- if (value.length === 0) return "__pi_empty_string_literal__";
26
- if (value === '"') return "__pi_double_quote_string_literal__";
27
- if (/^(?:\s|\\[nrtvf0])+$/u.test(value)) return "__pi_whitespace_string_literal__";
28
- if (["assert", "assert/strict", "node:assert", "node:assert/strict"].includes(value.trim().toLowerCase())) {
29
- return "__pi_node_assert_module_literal__";
30
- }
31
- if (["node:vm", "vm"].includes(value.trim().toLowerCase())) return "__pi_code_generation_module_literal__";
32
- if (["module", "node:module"].includes(value.trim().toLowerCase())) return "__pi_module_loader_module_literal__";
33
- const errorName = value.trim().toLowerCase().match(/^(typeerror|rangeerror|syntaxerror|referenceerror|urierror|evalerror|aggregateerror|error)$/)?.[1];
34
- if (errorName) return `__pi_error_name_${errorName}_literal__`;
35
- return "__pi_string_literal__";
36
- }
37
-
38
29
  /**
39
30
  * Return a bounded lexical evidence view of JavaScript/TypeScript source.
40
31
  *
@@ -53,16 +44,17 @@ function lexJavaScriptEvidence(value, bindStrings = false) {
53
44
  while (index < source.length) {
54
45
  const current = source[index];
55
46
  const next = source[index + 1];
56
-
47
+ if (isJavaScriptLineTerminator(current)) { output.push(normalizedJavaScriptLineTerminator(current)); index += 1; continue; }
57
48
  if (current === "/" && next === "/") {
58
49
  let end = index + 2;
59
- while (end < source.length && source[end] !== "\n" && source[end] !== "\r") end += 1;
50
+ while (end < source.length && !isJavaScriptLineTerminator(source[end])) end += 1;
60
51
  output.push(erasedLexeme(source.slice(index, end)));
61
52
  index = end;
62
53
  continue;
63
54
  }
64
55
  if (current === "/" && next === "*") {
65
56
  const closing = source.indexOf("*/", index + 2);
57
+ if (closing === -1) { output.push("__pi_invalid_comment_lexeme__"); index = source.length; continue; }
66
58
  const end = closing === -1 ? source.length : closing + 2;
67
59
  output.push(erasedLexeme(source.slice(index, end)));
68
60
  index = end;
@@ -71,37 +63,42 @@ function lexJavaScriptEvidence(value, bindStrings = false) {
71
63
  if (current === "'" || current === '"') {
72
64
  const quote = current;
73
65
  let end = index + 1;
74
- let payload = "";
75
- let closed = false;
66
+ let cooked = "";
67
+ let closed = false, invalidEscape = false;
76
68
  while (end < source.length) {
77
69
  const character = source[end];
78
70
  if (character === "\\") {
79
- payload += source.slice(end, Math.min(source.length, end + 2));
80
- end += 2;
71
+ const consumed = consumeJavaScriptStringEscape(source, end);
72
+ invalidEscape ||= !consumed.valid;
73
+ cooked += consumed.cooked;
74
+ end = consumed.nextIndex;
81
75
  continue;
82
76
  }
77
+ if (character === "\n" || character === "\r") break;
83
78
  if (character === quote) {
84
79
  end += 1;
85
80
  closed = true;
86
81
  break;
87
82
  }
88
- payload += character;
83
+ cooked += character;
89
84
  end += 1;
90
85
  }
91
- if (!closed) output.push(erasedLexeme(source.slice(index, end)));
86
+ if (!closed) output.push("__pi_invalid_string_lexeme__");
87
+ else if (invalidEscape) output.push("__pi_invalid_escape_lexeme__");
92
88
  else if (bindStrings) {
93
89
  output.push(`__pi_bound_string_${strings.length}__`);
94
- strings.push(payload);
95
- } else output.push(stringLiteralSentinel(payload));
90
+ strings.push(cooked);
91
+ } else output.push(stringLiteralSentinel(cooked));
96
92
  index = end;
97
93
  continue;
98
94
  }
99
95
  if (current === "`") {
100
- let end = index + 1;
101
- let closed = false;
96
+ let end = index + 1, closed = false, invalidEscape = false;
102
97
  while (end < source.length) {
103
98
  if (source[end] === "\\") {
104
- end += 2;
99
+ const consumed = consumeJavaScriptStringEscape(source, end);
100
+ invalidEscape ||= !consumed.valid;
101
+ end = consumed.nextIndex;
105
102
  continue;
106
103
  }
107
104
  if (source[end] === "`") {
@@ -111,17 +108,18 @@ function lexJavaScriptEvidence(value, bindStrings = false) {
111
108
  }
112
109
  end += 1;
113
110
  }
114
- output.push(closed ? "__pi_template_literal__" : erasedLexeme(source.slice(index, end)));
111
+ output.push(closed && !invalidEscape ? "__pi_template_literal__" : "__pi_invalid_template_lexeme__");
115
112
  index = end;
116
113
  continue;
117
114
  }
118
115
  if (current === "/" && next !== "=" && regexCanStartAfterLexicalChunks(output)) {
119
- let end = index + 1;
116
+ let end = index + 1, payload = "";
120
117
  let inClass = false;
121
118
  let closed = false;
122
119
  while (end < source.length) {
123
120
  const character = source[end];
124
121
  if (character === "\\") {
122
+ payload += source.slice(end, Math.min(source.length, end + 2));
125
123
  end += 2;
126
124
  continue;
127
125
  }
@@ -129,19 +127,21 @@ function lexJavaScriptEvidence(value, bindStrings = false) {
129
127
  else if (character === "]") inClass = false;
130
128
  else if (character === "/" && !inClass) {
131
129
  end += 1;
130
+ const flagsStart = end;
132
131
  while (/[a-z]/iu.test(source[end] ?? "")) end += 1;
132
+ const flags = source.slice(flagsStart, end);
133
133
  closed = true;
134
+ output.push(validJavaScriptRegexLiteral(payload, flags) ? regexLiteralSentinel(payload, flags) : "__pi_invalid_regex_lexeme__");
134
135
  break;
135
- } else if (character === "\n" || character === "\r") {
136
+ } else if (isJavaScriptLineTerminator(character)) {
136
137
  break;
137
138
  }
139
+ payload += character;
138
140
  end += 1;
139
141
  }
140
- if (closed) {
141
- output.push("__pi_regex_literal__");
142
- index = end;
143
- continue;
144
- }
142
+ if (!closed) output.push("__pi_invalid_regex_lexeme__");
143
+ index = end;
144
+ continue;
145
145
  }
146
146
  output.push(current);
147
147
  index += 1;
@@ -149,16 +149,13 @@ function lexJavaScriptEvidence(value, bindStrings = false) {
149
149
  const code = output.join("");
150
150
  return bindStrings ? { code, strings } : code;
151
151
  }
152
-
153
152
  export function sanitizeJavaScriptEvidence(value) {
154
153
  return lexJavaScriptEvidence(value, false);
155
154
  }
156
-
157
155
  function uniqueStrings(values) {
158
156
  return [...new Set((Array.isArray(values) ? values : []).filter((item) => typeof item === "string" && item.trim()).map((item) => item.trim()))];
159
157
  }
160
158
  function hasReservedEvidenceIdentifier(value) { return /\b__pi_[a-z0-9_]*\b/i.test(String(value ?? "")); }
161
-
162
159
  function escapeRegex(value) {
163
160
  return String(value ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
164
161
  }
@@ -175,18 +172,6 @@ function integerGuardHelpers(sourceText) {
175
172
  return uniqueStrings(helpers).slice(0, 12);
176
173
  }
177
174
 
178
- function integerConstraintTargets(text, sourceText = "") {
179
- const value = normalizedText(text);
180
- const source = normalizedText(sourceText);
181
- const candidates = [];
182
- for (const match of value.matchAll(/\b(?:an?\s+)?(?:non-negative\s+|positive\s+)?integer\s+([a-z_$][a-z0-9_$]*)\b/g)) candidates.push(match[1]);
183
- for (const match of value.matchAll(/`([a-z_$][a-z0-9_$]*)`[^.\n]{0,120}\b(?:is|must be|must remain)\s+(?:an?\s+)?(?:non-negative\s+|positive\s+)?(?:safe\s+)?integer\b/g)) candidates.push(match[1]);
184
- return uniqueStrings(candidates)
185
- .map((item) => item.toLowerCase())
186
- .filter((item) => !INTEGER_TARGET_STOPWORDS.has(item))
187
- .filter((item) => !source || new RegExp(`\\b${escapeRegex(item)}\\b`).test(source));
188
- }
189
-
190
175
  function onlyUndefinedContract(text) {
191
176
  const value = normalizedText(text);
192
177
  return /\babsent\s+only\s+when[^.\n]{0,80}\bundefined\b/.test(value)
@@ -255,7 +240,7 @@ function entryPath(value) {
255
240
  return path.posix.normalize(String(value ?? "").replace(/\\/g, "/").replace(/^\.\//, ""));
256
241
  }
257
242
 
258
- function sourceExports(entry) {
243
+ export function sourceExports(entry) {
259
244
  const code = normalizedText(sanitizeJavaScriptEvidence(entry?.text ?? entry?.evidenceText));
260
245
  const exports = [];
261
246
  for (const match of code.matchAll(/\bexport\s+(?:async\s+)?function\s+([a-z_$][a-z0-9_$]*)\b/g)) exports.push({ contractName: match[1], exportName: match[1], sourceName: match[1] });
@@ -384,7 +369,7 @@ function intrinsicErrorBindingsUntampered(code, errorNames) {
384
369
  }
385
370
 
386
371
  function lexicalEvidenceIsNonReflective(code) {
387
- return !/\\|__pi_(?:code_generation|module_loader)_module_literal__|\b(?:eval|createrequire)\b|\b(?:process|globalthis|global|window|self|this)\b|\.\s*constructor\b|\bfunction\s*\(|(?:=|[,([])\s*function\b(?!\s+[a-z_$][a-z0-9_$]*\s*\()/i.test(code);
372
+ return browserWindowReferencesAreLocal(code) && !/__pi_invalid_[a-z0-9_]*lexeme__|\\|__pi_(?:code_generation|module_loader)_module_literal__|\b(?:eval|createrequire)\b|\b(?:process|globalthis|global|self|this)\b|\.\s*constructor\b|\bfunction\s*\(|(?:=|[,([])\s*function\b(?!\s+[a-z_$][a-z0-9_$]*\s*\()/i.test(code);
388
373
  }
389
374
 
390
375
  function resolvedExportTestBindings(sourceEntries, testEntries) {
@@ -405,14 +390,15 @@ function resolvedExportTestBindings(sourceEntries, testEntries) {
405
390
  return resolved;
406
391
  }
407
392
 
408
- function namedTargetBindings(sourceEntries, testEntries, namedTargets) {
393
+ export function namedTargetBindings(sourceEntries, testEntries, namedTargets) {
409
394
  const exports = sourceEntries.flatMap(sourceExports);
410
395
  const imports = testEntries.flatMap(staticModuleBindings);
411
396
  const entries = new Map(testEntries.map((entry) => [entryPath(entry.path), entry]));
412
397
  return namedTargets.map((target) => {
413
- const matches = exports.filter((item) => item.contractName === target
414
- && sourceCallableBindingIsStable(sourceEntries.find((entry) => entryPath(entry?.path) === item.sourcePath), item.sourceName));
415
- if (matches.length !== 1) return { target, sourcePath: null, sourceName: null, testNames: [], testBindings: [] };
398
+ const matches = exports.filter((item) => item.contractName === target);
399
+ if (matches.length !== 1 || !sourceCallableBindingIsStable(
400
+ sourceEntries.find((entry) => entryPath(entry?.path) === matches[0].sourcePath), matches[0].sourceName
401
+ )) return { target, sourcePath: null, sourceName: null, testNames: [], testBindings: [] };
416
402
  const exported = matches[0];
417
403
  const testBindings = [];
418
404
  for (const binding of imports.filter((item) => importResolvesTo(item, exported.sourcePath))) {
@@ -433,81 +419,6 @@ function namedTargetBindings(sourceEntries, testEntries, namedTargets) {
433
419
  });
434
420
  }
435
421
 
436
- function formalParameterNames(parameters) {
437
- const wrapped = `(${String(parameters ?? "")})`;
438
- const names = [];
439
- for (const raw of evidenceTopLevelArguments(wrapped, 0, wrapped.length)) {
440
- const value = raw.trim().replace(/^(?:public|private|protected|readonly)\s+/, "").replace(/^\.\.\./, "");
441
- const direct = value.match(/^([a-z_$][a-z0-9_$]*)\s*(?:[?:=]|$)/i);
442
- if (direct) {
443
- names.push(direct[1]);
444
- continue;
445
- }
446
- const object = value.match(/^\{([^}]*)\}/)?.[1];
447
- if (object) {
448
- for (const item of object.split(",")) {
449
- const binding = item.trim().match(/^(?:[a-z_$][a-z0-9_$]*\s*:\s*)?([a-z_$][a-z0-9_$]*)/i);
450
- if (binding) names.push(binding[1]);
451
- }
452
- continue;
453
- }
454
- const array = value.match(/^\[([^\]]*)\]/)?.[1];
455
- if (array) names.push(...(array.match(/[a-z_$][a-z0-9_$]*/gi) ?? []));
456
- }
457
- return uniqueStrings(names).map((item) => item.toLowerCase()).slice(0, 16);
458
- }
459
-
460
- function callableBodies(code) {
461
- const bodies = new Map();
462
- const addBraced = (name, parameters, open, asynchronous = false) => {
463
- const end = evidenceBalancedEnd(code, open, "{", "}");
464
- if (end !== -1 && !bodies.has(name)) bodies.set(name, {
465
- body: code.slice(open + 1, end - 1),
466
- parameters: formalParameterNames(parameters), sourceCode: code, asynchronous
467
- });
468
- };
469
- for (const match of code.matchAll(/\b(?:async\s+)?function\s+([a-z_$][a-z0-9_$]*)\s*\(([^)]*)\)\s*\{/gi)) addBraced(match[1].toLowerCase(), match[2], match.index + match[0].lastIndexOf("{"), /^async\b/i.test(match[0]));
470
- for (const match of code.matchAll(/^\s*(?:async\s+)?([a-z_$][a-z0-9_$]*)\s*\(([^)]*)\)\s*\{/gim)) {
471
- if (!["catch", "for", "if", "switch", "while", "with"].includes(match[1].toLowerCase())) addBraced(match[1].toLowerCase(), match[2], match.index + match[0].lastIndexOf("{"), /^\s*async\b/i.test(match[0]));
472
- }
473
- for (const match of code.matchAll(/\b(?:const|let|var)\s+([a-z_$][a-z0-9_$]*)\s*=\s*(?:async\s*)?(?:\(([^)]*)\)|([a-z_$][a-z0-9_$]*))\s*=>\s*/gi)) {
474
- const start = match.index + match[0].length;
475
- if (code[start] === "{") addBraced(match[1].toLowerCase(), match[2] ?? match[3], start, /=\s*async\b/i.test(match[0]));
476
- else bodies.set(match[1].toLowerCase(), {
477
- body: code.slice(start, [code.indexOf(";", start), code.indexOf("\n", start)].filter((item) => item >= 0).sort((a, b) => a - b)[0] ?? code.length),
478
- parameters: formalParameterNames(match[2] ?? match[3]), sourceCode: code, asynchronous: /=\s*async\b/i.test(match[0])
479
- });
480
- }
481
- return bodies;
482
- }
483
-
484
- function inputDerivedNames(callable) {
485
- const derived = new Set(callable.parameters);
486
- const declarations = [...callable.body.matchAll(/\bconst\s+([a-z_$][a-z0-9_$]*|\{[^}\n]{1,300}\}|\[[^\]\n]{1,300}\])\s*=\s*([^;\n]{1,1000})/gi)];
487
- for (let pass = 0; pass < 4; pass += 1) {
488
- let changed = false;
489
- for (const match of declarations) {
490
- const initializer = match[2];
491
- if (/\b(?:process|globalthis)\b|\bimport\.meta\b|\bdate\.now\s*\(|\bmath\.random\s*\(/.test(initializer)) continue;
492
- if (![...derived].some((name) => new RegExp(`\\b${escapeRegex(name)}\\b`).test(initializer))) continue;
493
- const bindings = match[1].startsWith("{")
494
- ? match[1].slice(1, -1).split(",").map((item) => item.trim().match(/^(?:[a-z_$][a-z0-9_$]*\s*:\s*)?([a-z_$][a-z0-9_$]*)/i)?.[1])
495
- : match[1].startsWith("[")
496
- ? (match[1].match(/[a-z_$][a-z0-9_$]*/gi) ?? [])
497
- : [match[1]];
498
- for (const binding of bindings.filter(Boolean)) {
499
- const normalized = binding.toLowerCase();
500
- if (!derived.has(normalized)) {
501
- derived.add(normalized);
502
- changed = true;
503
- }
504
- }
505
- }
506
- if (!changed) break;
507
- }
508
- return [...derived].slice(0, 24);
509
- }
510
-
511
422
  function mergeValidationProof(target, candidate) {
512
423
  target.generic ||= candidate.generic;
513
424
  for (const partition of candidate.partitions) target.partitions.add(partition);
@@ -526,11 +437,18 @@ function positiveValidationConditionProof(condition, names, bodies, visited = ne
526
437
  proof.generic = true;
527
438
  proof.partitions.add("fractional");
528
439
  proof.partitions.add("non-finite");
440
+ proof.partitions.add("non-finite-number");
529
441
  if (integer[1] === "safeinteger") proof.partitions.add("unsafe-integer");
530
442
  }
531
443
  if (new RegExp(`number\\.isfinite\\s*\\(\\s*${escaped}\\b`).test(condition)) {
532
444
  proof.generic = true;
533
445
  proof.partitions.add("non-finite");
446
+ proof.partitions.add("non-finite-number");
447
+ proof.partitions.add("missing");
448
+ }
449
+ if (new RegExp(`typeof\\s+${escaped}\\b\\s*={2,3}\\s*__pi_typeof_(?!undefined_)[a-z]+_literal__`).test(condition)) {
450
+ proof.generic = true;
451
+ proof.partitions.add("missing");
534
452
  }
535
453
  if (new RegExp(`array\\.isarray\\s*\\(\\s*${escaped}\\b`).test(condition)) {
536
454
  proof.generic = true;
@@ -602,12 +520,23 @@ function validationConditionProof(condition, names, bodies) {
602
520
  || comparison.test(condition);
603
521
  if (!validationShape) continue;
604
522
  proof.generic = true;
523
+ if (new RegExp(`number\\.is(?:finite|integer|safeinteger)\\s*\\(\\s*${escaped}\\b`).test(condition)) {
524
+ proof.partitions.add("non-finite");
525
+ proof.partitions.add("non-finite-number");
526
+ }
605
527
  if (new RegExp(`!\\s*number\\.is(?:safe)?integer\\s*\\(\\s*${escaped}\\b|number\\.is(?:safe)?integer\\s*\\(\\s*${escaped}[^)]*\\)\\s*(?:===|==)\\s*false|\\b${escaped}\\b\\s*%\\s*1`).test(condition)) {
606
528
  proof.partitions.add("fractional");
607
529
  proof.partitions.add("non-finite");
530
+ proof.partitions.add("non-finite-number");
608
531
  }
609
532
  if (new RegExp(`!\\s*number\\.issafeinteger\\s*\\(\\s*${escaped}\\b`).test(condition)) proof.partitions.add("unsafe-integer");
610
- if (new RegExp(`!\\s*number\\.isfinite\\s*\\(\\s*${escaped}\\b`).test(condition)) proof.partitions.add("non-finite");
533
+ if (new RegExp(`!\\s*number\\.isfinite\\s*\\(\\s*${escaped}\\b`).test(condition)) {
534
+ proof.partitions.add("non-finite");
535
+ proof.partitions.add("non-finite-number");
536
+ }
537
+ if (new RegExp(`typeof\\s+${escaped}\\b\\s*!={1,2}\\s*__pi_typeof_(?!undefined_)[a-z]+_literal__`).test(condition)) {
538
+ proof.partitions.add("missing");
539
+ }
611
540
  if (new RegExp(`\\b${escaped}\\b\\s*(?:<\\s*[01]|<=\\s*0)|0\\s*>\\s*\\b${escaped}\\b|\\b${escaped}\\b\\s*<=\\s*-\\d|!\\s*\\(?\\s*\\b${escaped}\\b\\s*>=\\s*0`).test(condition)) proof.partitions.add("negative");
612
541
  if (new RegExp(`\\b${escaped}\\b\\s*(?:===|==|<=)\\s*0|\\b${escaped}\\b\\s*<\\s*1|!\\s*\\b${escaped}\\b`).test(condition)) proof.partitions.add("zero");
613
542
  if (new RegExp(`\\b${escaped}\\b\\s*(?:===|==)\\s*null|null\\s*(?:===|==)\\s*\\b${escaped}\\b|!\\s*\\b${escaped}\\b`).test(condition)) proof.partitions.add("null");
@@ -711,9 +640,10 @@ function inputNameWrittenBefore(callable, name, offset) {
711
640
  return new RegExp(`(?:\\+\\+|--)\\s*\\b${escaped}\\b`, "i").test(prefix);
712
641
  }
713
642
 
714
- function conditionalRejection(callable, requestedErrors, bodies, contractText = "", contractTarget = "") {
643
+ function conditionalRejection(callable, requestedErrors, bodies, contractText = "", contractTarget = "", requiredInputNames = null) {
715
644
  const proof = { generic: false, partitions: new Set(), errorMappings: [] };
716
- const names = inputDerivedNames(callable);
645
+ const seeds = Array.isArray(requiredInputNames) && requiredInputNames.length > 0 ? requiredInputNames : callable.parameters;
646
+ const names = inputDerivedNames(callable, seeds);
717
647
  for (const match of callable.body.matchAll(/\bif\s*\(/g)) {
718
648
  if (sourceBraceDepthAt(callable.body, match.index) !== 0 || priorUnconditionalExit(callable.body, match.index)) continue;
719
649
  const conditionOpen = callable.body.indexOf("(", match.index);
@@ -749,72 +679,83 @@ function conditionalRejection(callable, requestedErrors, bodies, contractText =
749
679
  for (const partition of validation.partitions) proof.errorMappings.push({ partition, errorClass: followingError });
750
680
  }
751
681
  }
752
- proof.generic ||= statefulTerminalRejectionEvidence(callable.body, callable.parameters, requestedErrors, contractText, contractTarget, callable.sourceCode);
682
+ proof.generic ||= statefulTerminalRejectionEvidence(callable.body, seeds, requestedErrors, contractText, contractTarget, callable.sourceCode);
753
683
  return { ...proof, names };
754
684
  }
755
685
  function sourceCallableProvesErrorMapping(bodies, name, mapping) {
756
686
  const observed = sourceCallableProof(bodies, name, []).errorMappings ?? [];
757
687
  return errorMappingsProveContract(observed, mapping);
758
688
  }
759
- function sourceCallableProof(bodies, name, requestedErrors, visited = new Set(), contractText = "", contractTarget = name) {
689
+ function sourceCallableProof(bodies, name, requestedErrors, visited = new Set(), contractText = "", contractTarget = name, requiredInputNames = null, omissionSensitiveInputNames = [], requestedPartitions = []) {
760
690
  if (visited.has(name) || visited.size >= 12) return { generic: false, partitions: new Set() };
761
691
  const callable = bodies.get(name);
762
692
  if (!callable) return { generic: false, partitions: new Set() };
763
- const proof = conditionalRejection(callable, requestedErrors, bodies, contractText, contractTarget);
693
+ const proof = conditionalRejection(callable, requestedErrors, bodies, contractText, contractTarget, requiredInputNames);
694
+ mergeValidationProof(proof, synchronousNormalizerProof({
695
+ bodies, name, requestedErrors, requiredInputNames,
696
+ inputDerivedNames, sourceCallableBindingIsStable, validationConditionProof
697
+ }));
698
+ const invalidSentinelProof = invalidSentinelRejectionProof({ bodies, name, requestedErrors, requestedPartitions, requiredInputNames, contractText }); mergeValidationProof(proof, invalidSentinelProof);
699
+ if (invalidSentinelProof.generic) return { ...proof, preservesExplicitUndefined: invalidSentinelProof.preservesExplicitUndefined === true };
700
+ if (invalidSentinelProof.candidate) return { generic: false, partitions: new Set(), errorMappings: [], names: proof.names };
764
701
  const nextVisited = new Set(visited).add(name);
765
702
  for (const match of callable.body.matchAll(/\b([a-z_$][a-z0-9_$]*)\s*\(/gi)) {
766
703
  const helper = match[1].toLowerCase();
767
- if (!bodies.has(helper) || !directSourceCall(callable.body, match.index)) continue;
704
+ if (!bodies.has(helper)) continue;
768
705
  const open = callable.body.indexOf("(", match.index);
769
706
  const end = evidenceBalancedEnd(callable.body, open);
770
707
  const argumentsText = end === -1 ? "" : callable.body.slice(open + 1, end - 1);
771
- if (!proof.names.some((candidate) => !inputNameWrittenBefore(callable, candidate, match.index)
772
- && new RegExp(`\\b${escapeRegex(candidate)}\\b`).test(argumentsText))) continue;
773
- const helperProof = sourceCallableProof(bodies, helper, requestedErrors, nextVisited, contractText, contractTarget);
708
+ const relevantArguments = proof.names.some((candidate) => !inputNameWrittenBefore(callable, candidate, match.index)
709
+ && new RegExp(`\\b${escapeRegex(candidate)}\\b`).test(argumentsText));
710
+ if (!relevantArguments) continue;
711
+ const directCall = directSourceCall(callable.body, match.index);
712
+ const invocationInputNames = Array.isArray(requiredInputNames) && requiredInputNames.length > 0 ? requiredInputNames : null;
713
+ const normalizerInvocation = end === -1 ? { accepted: false, derivedParameters: [] } : exactNormalizerInvocation({
714
+ callable, matchIndex: match.index, callEnd: end, argumentsText, helper,
715
+ helperParameters: bodies.get(helper)?.parameters ?? [],
716
+ inputDerivedNames: invocationInputNames ? (candidate) => inputDerivedNames(candidate, invocationInputNames) : inputDerivedNames,
717
+ helperBindingIsShadowedInCallable, omissionSensitiveInputNames
718
+ });
719
+ const helperParameters = bodies.get(helper)?.parameters ?? [];
720
+ const candidateProof = synchronousNormalizerProof({
721
+ bodies, name: helper, requestedErrors, requiredInputNames: normalizerInvocation.derivedParameters,
722
+ inputDerivedNames, sourceCallableBindingIsStable, validationConditionProof
723
+ });
724
+ const normalizerProof = normalizerInvocation.accepted ? candidateProof : { generic: false, partitions: new Set(), candidate: candidateProof.candidate };
725
+ const normalizerCall = normalizerProof.generic;
726
+ if (invocationInputNames && candidateProof.candidate && !normalizerCall) {
727
+ return { generic: false, partitions: new Set(), errorMappings: [], names: proof.names };
728
+ }
729
+ const modeledInvocation = directCall || normalizerInvocation.accepted;
730
+ if (candidateProof.candidate && !normalizerCall && modeledInvocation) {
731
+ return { generic: false, partitions: new Set(), errorMappings: [], names: proof.names };
732
+ }
733
+ if (!modeledInvocation && !normalizerCall) continue;
734
+ const helperProof = normalizerCall ? normalizerProof
735
+ : sourceCallableProof(bodies, helper, requestedErrors, nextVisited, contractText, contractTarget,
736
+ normalizerInvocation.accepted ? normalizerInvocation.derivedParameters : helperParameters, [], requestedPartitions);
737
+ if (!helperProof.generic) {
738
+ return { generic: false, partitions: new Set(), errorMappings: [], names: proof.names };
739
+ }
774
740
  proof.generic ||= helperProof.generic;
775
741
  for (const partition of helperProof.partitions) proof.partitions.add(partition);
776
742
  }
777
743
  return proof;
778
744
  }
779
- function sourceCallableProves(bodies, name, requestedErrors, requestedPartitions, contractText = "") {
780
- const proof = sourceCallableProof(bodies, name, requestedErrors, new Set(), contractText, name);
781
- return proof.generic && requestedPartitions.every((partition) => partitionCovered(partition, proof.partitions));
782
- }
783
-
784
- function evidenceCallableNames(sourceText) {
785
- const names = new Set();
786
- const ignored = new Set(["catch", "for", "if", "switch", "while", "with"]);
787
- for (const match of sourceText.matchAll(/\bfunction\s+([a-z_$][a-z0-9_$]*)\s*\(/gi)) names.add(match[1].toLowerCase());
788
- for (const match of sourceText.matchAll(/^\s*(?:async\s+)?([a-z_$][a-z0-9_$]*)\s*\([^)]*\)\s*\{/gim)) {
789
- if (!ignored.has(match[1].toLowerCase())) names.add(match[1].toLowerCase());
790
- }
791
- for (const match of sourceText.matchAll(/\b(?:const|let|var)\s+([a-z_$][a-z0-9_$]*)\s*=\s*(?:async\s*)?(?:\([^)]*\)|[a-z_$][a-z0-9_$]*)\s*=>/gi)) names.add(match[1].toLowerCase());
792
- return names;
793
- }
794
-
795
- function requestedInvalidPartitions(text) {
796
- const invalid = normalizedText(text)
797
- .split(/(?<=[.!?;])\s+|\n+/)
798
- .filter((clause) => /\b(?:invalid|malformed|reject(?:s|ed|ion)?|throw(?:s|ing)?|typeerror|rangeerror|syntaxerror)\b/.test(clause))
799
- .join("\n");
800
- const partitions = new Set();
801
- if (/\bnegative\b/.test(invalid)) partitions.add("negative");
802
- if (/\bfractional\b/.test(invalid)) partitions.add("fractional");
803
- if (/\bzero\b/.test(invalid)) partitions.add("zero");
804
- if (/\bnull\b/.test(invalid)) partitions.add("null");
805
- if (/\b(?:empty[- ]string|whitespace-only|string[^.\n]{0,80}non-whitespace)\b/.test(invalid)) partitions.add("empty-string");
806
- if (/\bwhitespace-only\b/.test(invalid)) partitions.add("whitespace-string");
807
- if (/\bnon-finite\b/.test(invalid)) partitions.add("non-finite");
808
- if (/\bunsafe[- ]integer\b/.test(invalid)) partitions.add("unsafe-integer");
809
- if (/\b(?:missing|undefined)\b/.test(invalid)) partitions.add("missing");
810
- if (/\bnon-array\b/.test(invalid)) partitions.add("non-array");
811
- if (/\bnon-string\b/.test(invalid)) partitions.add("non-string");
812
- if (/\breject(?:s|ed|ing)?\s+(?:an?\s+)?arrays?\b|\barrays?\s+(?:values?\s+)?(?:are|is|must be)\s+(?:invalid|rejected|disallowed|not allowed)\b/.test(invalid)) partitions.add("array");
813
- if (/\breject(?:s|ed|ing)?\s+(?:an?\s+)?plain[- ]objects?\b|\bplain[- ]objects?\s+(?:values?\s+)?(?:are|is|must be)\s+(?:invalid|rejected|disallowed|not allowed)\b/.test(invalid)) partitions.add("plain-object");
814
- if (/\breject(?:s|ed|ing)?\s+(?:an?\s+)?primitives?\b|\bprimitives?\s+(?:values?\s+)?(?:are|is|must be)\s+(?:invalid|rejected|disallowed|not allowed)\b/.test(invalid)) partitions.add("primitive");
815
- return [...partitions];
745
+ function sourceCallableProves(bodies, name, requestedErrors, requestedPartitions, contractText = "", requiredInputNames = null) {
746
+ const required = Array.isArray(requiredInputNames)
747
+ ? requiredInputNames.map((item) => typeof item === "string" ? { name: item, partitions: [] } : item).filter((item) => item?.name) : [];
748
+ const proofs = required.length > 0
749
+ ? required.map((item) => ({
750
+ proof: sourceCallableProof(bodies, name, requestedErrors, new Set(), contractText, name, [item.name], item.omissionSensitive ? [item.name] : [], [...new Set([...requestedPartitions, ...(item.partitions ?? [])])]),
751
+ partitions: [...new Set([...requestedPartitions, ...(item.partitions ?? [])])], inputName: item.name
752
+ }))
753
+ : [{ proof: sourceCallableProof(bodies, name, requestedErrors, new Set(), contractText, name, null, [], requestedPartitions), partitions: requestedPartitions, inputName: null }];
754
+ const callable = bodies.get(name);
755
+ return proofs.every(({ proof, partitions, inputName }) => proof.generic
756
+ && !(inputName && partitions.includes("missing") && callable?.defaultedParameters?.includes(inputName) && !proof.preservesExplicitUndefined)
757
+ && partitions.every((partition) => partitionCovered(partition, proof.partitions)));
816
758
  }
817
-
818
759
  function moduleBindingFreeCode(entry) {
819
760
  return normalizedText(sanitizeJavaScriptEvidence(entry?.text ?? ""))
820
761
  .replace(/\bimport\s+[\s\S]{1,800}?\s+from\s+__pi_(?:string|node_assert_module|code_generation_module|module_loader_module)_literal__\s*;?/g, " ")
@@ -847,8 +788,8 @@ export function acceptanceExecutableTestBinding(input = {}) {
847
788
  || typeof testEntry.path !== "string" || typeof testEntry.text !== "string") {
848
789
  return { linked: false, sourceNames: [], testNames: [] };
849
790
  }
850
- const sourceCode = normalizedText(sanitizeJavaScriptEvidence(sourceEntry.text));
851
- const testCode = normalizedText(sanitizeJavaScriptEvidence(testEntry.text));
791
+ const sourceCode = normalizedText(sanitizeJavaScriptEvidence(sourceEntry.text)), testCode = normalizedText(sanitizeJavaScriptEvidence(testEntry.text));
792
+ if ([sourceEntry.text, testEntry.text].some(hasReservedEvidenceIdentifier) || !lexicalEvidenceIsNonReflective(sourceCode) || !lexicalEvidenceIsNonReflective(testCode)) return { linked: false, sourceNames: [], testNames: [] };
852
793
  const bodies = callableBodies(sourceCode);
853
794
  const imports = staticModuleBindings(testEntry);
854
795
  const linkedSourceNames = [];
@@ -893,6 +834,7 @@ export function acceptanceInvalidInputEvidence(input = {}) {
893
834
  const requestedErrors = requestedErrorClasses(taskText);
894
835
  const ambiguousErrorIntent = hasAmbiguousErrorClassIntent(taskText);
895
836
  const requestedPartitions = requestedInvalidPartitions(taskText);
837
+ const taggedRequirements = malformedTaggedEventRequirements(taskText);
896
838
  // A constructor set alone cannot prove a mapping. Mixed-class evidence uses a narrow grammar;
897
839
  // ambiguous prose or indirect source/test proof abstains fail-closed.
898
840
  const requestedErrorMapping = requestedErrors.length > 1
@@ -903,19 +845,19 @@ export function acceptanceInvalidInputEvidence(input = {}) {
903
845
  .filter((entry) => entry && typeof entry.path === "string" && typeof entry.text === "string");
904
846
  const testEntries = (Array.isArray(input.testEntries) ? input.testEntries : [])
905
847
  .filter((entry) => entry && typeof entry.path === "string" && typeof entry.text === "string");
906
- const bodyMaps = new Map(sourceEntries.map((entry) => [entryPath(entry.path), callableBodies(normalizedText(sanitizeJavaScriptEvidence(entry.text)))]));
907
- if (sourceEntries.length === 0) bodyMaps.set("", callableBodies(sourceText));
848
+ const bodyMaps = new Map(sourceEntries.map((entry) => [entryPath(entry.path), casePreservingCallableBodies(sanitizeJavaScriptEvidence(entry.text), normalizedText(sanitizeJavaScriptEvidence(entry.text)))]));
849
+ if (sourceEntries.length === 0) bodyMaps.set("", casePreservingCallableBodies(sanitizeJavaScriptEvidence(input.sourceText), sourceText));
908
850
  const sourceLexicalOk = sourceEntries.length > 0 ? sourceEntries.every((entry) => !hasReservedEvidenceIdentifier(entry.text) && lexicalEvidenceIsNonReflective(normalizedText(sanitizeJavaScriptEvidence(entry.text)))) : !hasReservedEvidenceIdentifier(input.sourceText) && lexicalEvidenceIsNonReflective(sourceText);
909
851
  const testLexicalOk = testEntries.length > 0 ? testEntries.every((entry) => !hasReservedEvidenceIdentifier(entry.text) && lexicalEvidenceIsNonReflective(normalizedText(sanitizeJavaScriptEvidence(entry.text)))) : !hasReservedEvidenceIdentifier(input.testText) && lexicalEvidenceIsNonReflective(testText);
910
852
  const sourceConstructorOk = requestedErrors.length === 0 || (sourceEntries.length > 0
911
- ? sourceEntries.every((entry) => intrinsicErrorBindingsUntampered(normalizedText(sanitizeJavaScriptEvidence(entry.text)), requestedErrors))
912
- : intrinsicErrorBindingsUntampered(sourceText, requestedErrors));
853
+ ? sourceEntries.every((entry) => (intrinsicErrorBindingsUntampered(normalizedText(sanitizeJavaScriptEvidence(entry.text)), requestedErrors) || nativeErrorReferencesAreUnshadowed(entry.text, requestedErrors)))
854
+ : (intrinsicErrorBindingsUntampered(sourceText, requestedErrors) || nativeErrorReferencesAreUnshadowed(input.sourceText, requestedErrors)));
913
855
  const testConstructorOk = requestedErrors.length === 0 || (testEntries.length > 0
914
- ? testEntries.every((entry) => intrinsicErrorBindingsUntampered(normalizedText(sanitizeJavaScriptEvidence(entry.text)), requestedErrors))
915
- : intrinsicErrorBindingsUntampered(testText, requestedErrors));
856
+ ? testEntries.every((entry) => (intrinsicErrorBindingsUntampered(normalizedText(sanitizeJavaScriptEvidence(entry.text)), requestedErrors) || nativeErrorReferencesAreUnshadowed(entry.text, requestedErrors)))
857
+ : (intrinsicErrorBindingsUntampered(testText, requestedErrors) || nativeErrorReferencesAreUnshadowed(input.testText, requestedErrors)));
916
858
 
917
- const strictTargets = namedTargets.filter((target) => provenanceTargets.has(target));
918
- const structuralTargets = namedTargets.filter((target) => !provenanceTargets.has(target));
859
+ const { strictTargets, structuralTargets, unresolvedTargets } = routeNamedSourceTargets({
860
+ namedTargets, provenanceTargets, sourceEntries, exports: sourceEntries.flatMap(sourceExports), taskText });
919
861
  const bindings = strictTargets.length > 0 ? namedTargetBindings(sourceEntries, testEntries, strictTargets) : [];
920
862
  const inferred = namedTargets.length === 0 ? resolvedExportTestBindings(sourceEntries, testEntries) : [];
921
863
  const inferredAssertions = inferred.flatMap((binding) => {
@@ -932,16 +874,61 @@ export function acceptanceInvalidInputEvidence(input = {}) {
932
874
  testCodeEntries: testEntries.map((entry) => ({ path: entryPath(entry.path), code: normalizedText(sanitizeJavaScriptEvidence(entry.text)) })),
933
875
  fallbackTestCode: testText, bodyMaps
934
876
  });
877
+ const domains = integerDomainEvidence({ taskText, bindings, sourceEntries,
878
+ testCodeEntries: testEntries.map(entry => ({ path: entryPath(entry.path), raw: entry.text, code: normalizedText(sanitizeJavaScriptEvidence(entry.text)) })) });
879
+ if (domains) {
880
+ const sourceBound = unresolvedTargets.length === 0 && structuralTargets.length === 0 && sourceLexicalOk && sourceConstructorOk && !ambiguousErrorIntent;
881
+ const testsBound = unresolvedTargets.length === 0 && testLexicalOk && testConstructorOk && boundTestEvidence.targetOk && boundTestEvidence.modeOk && !ambiguousErrorIntent;
882
+ const evidence = { sourceOk: sourceBound && domains.sourceOk, testOk: testsBound && domains.testOk };
883
+ return input.includeDiagnostics === true ? { ...evidence, integerDomainProof: { ...domains.integerDomainProof,
884
+ rejectionEstablished: sourceBound && domains.integerDomainProof.rejectionEstablished,
885
+ wholeCriterionEstablished: evidence.sourceOk && evidence.testOk },
886
+ sourceReasons: domains.integerDomainProof.unprovedClauses.length > 0 ? ["additional-contract-clauses-unproved"] : [] } : evidence;
887
+ }
888
+ const temporal = temporalContractEvidence({ taskText, bindings, bodyMaps,
889
+ testRequirements: boundTestEvidence.bindingArgumentRequirements ?? [] });
890
+ const dependencyGraph=dependencyCycleEvidence({taskText,bindings:namedTargets.length?bindings:inferred,sourceEntries,testEntries});if(dependencyGraph)return {sourceOk:dependencyGraph.sourceOk && unresolvedTargets.length===0 && structuralTargets.length===0 && sourceLexicalOk && sourceConstructorOk && !ambiguousErrorIntent,testOk:dependencyGraph.testOk && unresolvedTargets.length===0 && testLexicalOk && testConstructorOk && !ambiguousErrorIntent,...(input.includeDiagnostics?{dependencyGraph,dependencyFlags:{testLexicalOk,testConstructorOk,sourceLexicalOk,sourceConstructorOk,unresolvedTargets,structuralTargets,ambiguousErrorIntent}}: {})}; const orderedRecords=orderedRecordRejectionEvidence({taskText,contextText:input.contextText,bindings:namedTargets.length?bindings:inferred,sourceEntries,testEntries}); if(orderedRecords)return {sourceOk:orderedRecords.sourceOk && unresolvedTargets.length===0 && structuralTargets.length===0 && sourceLexicalOk && sourceConstructorOk && !ambiguousErrorIntent,testOk:orderedRecords.testOk && unresolvedTargets.length===0 && testLexicalOk && testConstructorOk && !ambiguousErrorIntent,...(input.includeDiagnostics?{orderedRecords}: {})};
891
+ const finiteRecords = finiteIntervalRecordEvidence({ taskText, contextText: input.contextText, bindings: namedTargets.length ? bindings : inferred, sourceEntries,
892
+ testEntries: testEntries.map(entry => ({ ...entry, code: normalizedText(sanitizeJavaScriptEvidence(entry.text)) })) });
893
+ const declaredIntegerContract = rejectedIntegerParameter(taskText, input.contextText);
894
+ const integerContract = structuralTargets.length === 0 || declaredIntegerContract?.parameters ? declaredIntegerContract : null;
895
+ const integerCandidates = integerContract?.parameters && namedTargets.length === 0 ? inferred : bindings;
896
+ const integerBindings = new Map(integerCandidates.map(binding => [binding, integerParameterBindingEvidence({
897
+ contract: integerContract, binding: binding.testNames ? binding : { ...binding, target: binding.sourceName, testNames: [binding.testName] }, parameters: bodyMaps.get(binding.sourcePath)?.get(binding.sourceName)?.parameters ?? [],
898
+ assertions: namedTargets.length > 0 ? boundTestEvidence.assertions : inferredAssertions.filter(item => item.binding === binding).map(item => item.assertion), sourceEntries, testEntries })]));
935
899
  const assertions = namedTargets.length > 0 ? boundTestEvidence.assertions : inferredAssertions.map((item) => item.assertion);
936
900
  const mappingTestOk = namedTargets.length > 0 ? boundTestEvidence.mappingOk : requestedErrors.length <= 1;
937
- const targetOk = namedTargets.length > 0 ? boundTestEvidence.targetOk : assertions.length > 0;
938
- const sourceOk = sourceLexicalOk && sourceConstructorOk && (namedTargets.length > 0
901
+ const targetOk = unresolvedTargets.length === 0 && (namedTargets.length > 0 ? boundTestEvidence.targetOk : assertions.length > 0);
902
+ const requiredInputsForBinding = (binding) => {
903
+ if (integerBindings.get(binding)) return integerBindings.get(binding).inputs;
904
+ const requirement = (boundTestEvidence.bindingArgumentRequirements ?? [])
905
+ .find((item) => item.sourcePath === binding.sourcePath && item.sourceName === binding.sourceName);
906
+ const callable = (bodyMaps.get(binding.sourcePath) ?? new Map()).get(binding.sourceName);
907
+ const required = temporalInputRequirements({ binding, observed: requirement, parameters: callable?.parameters,
908
+ requestedPartitions, temporalBindings: temporal.bindings });
909
+ const temporalInputs = temporal.bindings
910
+ .find((item) => item.sourcePath === binding.sourcePath && item.sourceName === binding.sourceName)?.inputs ?? [];
911
+ return required?.map((item) => ({
912
+ ...item,
913
+ omissionSensitive: temporalInputs.some((temporalInput) => temporalInput.name === item.name
914
+ && temporalInput.partitions.includes("missing"))
915
+ })) ?? required;
916
+ };
917
+ const inferredTerminal = (binding) => {
918
+ const callable = bodyMaps.get(binding.sourcePath)?.get(binding.sourceName);
919
+ return sourceEntries.flatMap(sourceExports).length === 1 && inferred.every(item => item.sourcePath === binding.sourcePath && item.sourceName === binding.sourceName)
920
+ && requestedPartitions.length === 0 && callable && statefulTerminalRejectionEvidence(callable.body, callable.parameters, requestedErrors, taskText, binding.sourceName, callable.sourceCode, true);
921
+ };
922
+ const sourceOk = unresolvedTargets.length === 0 && sourceLexicalOk && sourceConstructorOk && (namedTargets.length > 0
939
923
  ? bindings.length === strictTargets.length
940
- && bindings.every((binding) => Boolean(binding.sourcePath) && Boolean(binding.sourceName) && sourceCallableProves(bodyMaps.get(binding.sourcePath) ?? new Map(), binding.sourceName, requestedErrors, requestedPartitions, taskText))
924
+ && bindings.every((binding) => Boolean(binding.sourcePath) && Boolean(binding.sourceName) && (sourceCallableProves(
925
+ bodyMaps.get(binding.sourcePath) ?? new Map(), binding.sourceName, requestedErrors, requestedPartitions, taskText,
926
+ requiredInputsForBinding(binding)
927
+ ) || integerBindings.get(binding)?.recordSourceOk === true || finiteRecords.provesSource?.(binding) === true))
941
928
  && structuralTargets.every((target) => [...bodyMaps.values()].filter((bodies) => bodies.has(target)).length === 1
942
929
  && [...bodyMaps.values()].some((bodies) => sourceCallableProves(bodies, target, requestedErrors, requestedPartitions, taskText)))
943
930
  : inferredAssertions.length > 0 && inferredAssertions.every(({ binding }) => (
944
- sourceCallableProves(bodyMaps.get(binding.sourcePath) ?? new Map(), binding.sourceName, requestedErrors, requestedPartitions, taskText)
931
+ sourceCallableProves(bodyMaps.get(binding.sourcePath) ?? new Map(), binding.sourceName, requestedErrors, requestedPartitions, taskText, integerContract?.parameters ? requiredInputsForBinding(binding) : null) || inferredTerminal(binding) || integerBindings.get(binding)?.recordSourceOk === true || finiteRecords.provesSource?.(binding) === true
945
932
  ))) && (requestedErrors.length <= 1 || Boolean(requestedErrorMapping && namedTargets.length > 0
946
933
  && bindings.every((binding) => sourceCallableProvesErrorMapping(
947
934
  bodyMaps.get(binding.sourcePath) ?? new Map(), binding.sourceName, requestedErrorMapping
@@ -954,8 +941,21 @@ export function acceptanceInvalidInputEvidence(input = {}) {
954
941
  ));
955
942
  const partitions = new Set(assertions.flatMap((assertion) => [...assertion.partitions]));
956
943
  const partitionOk = requestedPartitions.every((partition) => partitionCovered(partition, partitions));
957
- return { sourceOk: sourceOk && !ambiguousErrorIntent,
958
- testOk: testLexicalOk && testConstructorOk && targetOk && partitionOk && mappingTestOk && assertionModeOk && !ambiguousErrorIntent };
944
+ const sourceByPath = new Map(sourceEntries.map((entry) => [entryPath(entry.path), entry.text])), testByPath = new Map(testEntries.map((entry) => [entryPath(entry.path), entry.text]));
945
+ const sourceGroups = namedTargets.length > 0
946
+ ? [...bindings.map((item) => ({ raw: sourceByPath.get(item.sourcePath), name: item.sourceName })), ...structuralTargets.map((name) => {
947
+ const matches = [...bodyMaps.entries()].filter(([, bodies]) => bodies.has(name));
948
+ return { raw: matches.length === 1 ? sourceByPath.get(matches[0][0]) : undefined, name: matches.length === 1 ? name : undefined };
949
+ })] : inferred.map((item) => ({ raw: sourceByPath.get(item.sourcePath), name: item.sourceName }));
950
+ const testGroups = namedTargets.length > 0
951
+ ? [...bindings.map((item) => (item.testBindings ?? []).map((binding) => ({ raw: testByPath.get(binding.testPath), names: new Set([binding.testName]) }))),
952
+ ...structuralTargets.map((target) => testEntries.map((entry) => ({ raw: entry.text, names: new Set([`*.${target}`]) })))]
953
+ : inferred.map((item) => [{ raw: testByPath.get(item.testPath), names: new Set([item.testName]) }]);
954
+ const tagged = malformedTaggedEventEvidence({ requirements: taggedRequirements, requestedErrors, sourceGroups, testGroups,
955
+ sourceCorpus: sourceEntries.map((entry) => entry.text).join("\n"), testCorpus: testEntries.map((entry) => entry.text).join("\n") });
956
+ const integerSourceOk = !integerContract || (integerCandidates.length > 0 && [...integerBindings.values()].every(item => item.sourceOk));
957
+ const integerTestOk = !integerContract || (integerCandidates.length > 0 && [...integerBindings.values()].every(item => item.testOk));
958
+ return withInvalidSentinelDiagnostics({ sourceOk: sourceOk && finiteRecords.sourceOk && integerSourceOk && tagged.sourceOk && !ambiguousErrorIntent, testOk: finiteRecords.testOk && testLexicalOk && testConstructorOk && targetOk && partitionOk && mappingTestOk && assertionModeOk && temporal.testOk && integerTestOk && tagged.testOk && !ambiguousErrorIntent }, { enabled: input.includeDiagnostics === true, bodyMaps, namedTargets, requestedErrors, requestedPartitions });
959
959
  }
960
960
 
961
961
  export function acceptanceContractProofGuidance(raw) {
@@ -963,16 +963,16 @@ export function acceptanceContractProofGuidance(raw) {
963
963
  const guidance = [...acceptanceBoundaryProofGuidance(raw)];
964
964
  if (onlyUndefinedContract(raw)) guidance.push("Prove undefined falls through while null, false, 0, and empty string are each preserved at the highest-precedence position.");
965
965
  const requestedSpecificErrors = hasAmbiguousErrorClassIntent(raw) ? [] : requestedErrorClasses(raw).map((errorClass) => ERROR_CONSTRUCTOR_DISPLAY_NAMES[errorClass]).filter(Boolean);
966
- if (requestedSpecificErrors.length === 1) guidance.push(`Assert ${requestedSpecificErrors[0]} for every rejected partition named by the request; a different error class is not equivalent.`);
966
+ if (requestedSpecificErrors.length === 1) guidance.push(rejectionClassProofGuidance(raw, requestedSpecificErrors[0]));
967
967
  if (requestedSpecificErrors.length > 1) guidance.push(`Preserve the request's partition-to-error mapping: assert each rejected partition with its explicitly named class (${requestedSpecificErrors.join(", ")}); do not apply one class to every partition.`);
968
- const integerTargets = integerConstraintTargets(raw);
969
- if (integerTargets.length > 0) guidance.push(`Reject fractional values for every integer-constrained argument (${integerTargets.join(", ")}).`);
968
+ const integerTargets = integerConstraintTargets(raw); if (integerTargets.length > 0) guidance.push(`Reject fractional values for every integer-constrained argument (${integerTargets.join(", ")}).`);
970
969
  const nullRejectingTargets = nullRejectingDefaultTargets(raw);
971
970
  if (nullRejectingTargets.length > 0) guidance.push(`Prove omitted or undefined defaults separately from supplied null for: ${nullRejectingTargets.join(", ")}.`);
972
971
  if (/\bpositive integer\b/.test(value)) guidance.push("Exercise zero and a negative value for every positive-integer constraint.");
973
972
  if (/\bnon-negative\b/.test(value)) guidance.push("Exercise zero as valid and a negative value as invalid for every non-negative constraint.");
974
973
  if (/\binclusive\b|\bthrough\b|\bfrom\b[^.\n]{0,80}\bto\b/.test(value)) guidance.push("Exercise both inclusive endpoints and the nearest value outside each endpoint.");
975
974
  if (/\bround(?:ing)?\b|\bceil(?:ing)?\b|\bclamp\b/.test(value)) guidance.push("Exercise zero, exact, partial/rounding, below-minimum, and above-maximum behavior where applicable.");
975
+ guidance.push(...isoTimestampProofGuidance(raw));
976
976
  return uniqueStrings(guidance).slice(0, 8);
977
977
  }
978
978