@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,3 +1,7 @@
1
+ import { assertionCarrierBindings, testRunnerBindings, importedCallableBindingIsStable, assertionCarrierIsStable, TEST_RUNNER_EXPORT_KINDS } from "./acceptance-test-bindings.js";
2
+ import { INVALID_DATE_CONSTRUCTION, tupleRegistrationIsClosed } from "./acceptance-tuple-shapes.js";
3
+ import { browserWindowReferencesAreLocal, directPrimitiveArgument } from "./acceptance-local-binding.js";
4
+
1
5
  const ERROR_CONSTRUCTORS = ["typeerror", "rangeerror", "syntaxerror", "referenceerror", "urierror", "evalerror", "aggregateerror", "error"];
2
6
 
3
7
  function uniqueStrings(values) {
@@ -8,60 +12,15 @@ function escapeRegex(value) {
8
12
  return String(value ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
13
  }
10
14
 
11
- function assertionCarrierBindings(testText) {
12
- const bindings = [];
13
- const add = (name, start, end) => {
14
- if (name) bindings.push({ name: name.toLowerCase(), start, end });
15
- };
16
- for (const match of testText.matchAll(/\bimport\s+([a-z_$][a-z0-9_$]*)\s+from\s+__pi_node_assert_module_literal__\s*;?/gi)) {
17
- add(match[1], match.index, match.index + match[0].length);
18
- }
19
- for (const match of testText.matchAll(/\bimport\s+\*\s+as\s+([a-z_$][a-z0-9_$]*)\s+from\s+__pi_node_assert_module_literal__\s*;?/gi)) {
20
- add(match[1], match.index, match.index + match[0].length);
21
- }
22
- for (const match of testText.matchAll(/\bimport\s*\{([^}]{1,500})\}\s*from\s+__pi_node_assert_module_literal__\s*;?/gi)) {
23
- for (const item of match[1].split(",")) {
24
- const strict = item.trim().match(/^strict(?:\s+as\s+([a-z_$][a-z0-9_$]*))?$/i);
25
- if (strict) add(strict[1] ?? "strict", match.index, match.index + match[0].length);
26
- }
27
- }
28
- for (const match of testText.matchAll(/\bconst\s+([a-z_$][a-z0-9_$]*)\s*=\s*require\s*\(\s*__pi_node_assert_module_literal__\s*\)(?:\s*\.\s*strict)?\s*;?/gi)) {
29
- add(match[1], match.index, match.index + match[0].length);
30
- }
31
- for (const match of testText.matchAll(/\bconst\s*\{\s*strict\s*:\s*([a-z_$][a-z0-9_$]*)\s*\}\s*=\s*require\s*\(\s*__pi_node_assert_module_literal__\s*\)\s*;?/gi)) {
32
- add(match[1], match.index, match.index + match[0].length);
33
- }
34
- return bindings.slice(0, 8);
35
- }
36
-
37
- function assertionCarrierIsStable(testText, binding) {
38
- const escaped = escapeRegex(binding.name);
39
- const withoutDeclaration = `${testText.slice(0, binding.start)}${" ".repeat(binding.end - binding.start)}${testText.slice(binding.end)}`;
40
- if (assertionCarrierBindings(testText).filter((candidate) => candidate.name === binding.name).length !== 1) return false;
41
- if (new RegExp(`\\b(?:const|let|var|function|class)\\s+${escaped}\\b|\\bfunction\\b[^({]{0,200}\\([^)]*\\b${escaped}\\b|\\bcatch\\s*\\([^)]*\\b${escaped}\\b|(?:\\([^)]*\\b${escaped}\\b[^)]*\\)|\\b${escaped})\\s*=>`, "i").test(withoutDeclaration)) return false;
42
- if (new RegExp(`(?<![.$a-z0-9_])${escaped}\\b\\s*(?:(?<![=!<>])=(?!=|>)|\\+\\+|--|[+*/%&|^-]=)|(?:\\+\\+|--)\\s*\\b${escaped}\\b`, "i").test(withoutDeclaration)) return false;
43
- if (new RegExp(`\\b(?:const|let|var)\\s+[a-z_$][a-z0-9_$]*\\s*=\\s*${escaped}\\b|\\b(?:const|let|var)\\s*\\{[^}\\n]{0,500}\\}\\s*=\\s*${escaped}\\b`, "i").test(withoutDeclaration)) return false;
44
- if (new RegExp(`(?<![.$a-z0-9_])[a-z_$][a-z0-9_$]*\\s*(?<![=!<>])=(?!=|>)\\s*${escaped}\\b`, "i").test(withoutDeclaration)) return false;
45
- const member = `${escaped}\\s*(?:\\.\\s*[a-z_$][a-z0-9_$]*|\\[[^\\]]{1,300}\\])`;
46
- if (new RegExp(`\\b${member}\\s*(?:=|\\+\\+|--|[+*/%&|^-]=|(?:&&|\\|\\||\\?\\?)=)|(?:\\+\\+|--)\\s*\\b${member}|\\bdelete\\s+${escaped}\\s*(?:\\.|\\[)|\\b${escaped}\\s*\\.\\s*__(?:definegetter|definesetter)__\\s*\\(`, "i").test(withoutDeclaration)) return false;
47
- if (new RegExp(`(?:\\{[^}\\n]{0,500}\\b${member}[^}\\n]{0,500}\\}|\\[[^\\]\\n]{0,500}\\b${member}[^\\]\\n]{0,500}\\])\\s*=|\\bfor(?:\\s+await)?\\s*\\(\\s*(?:${member}|\\{[^}\\n]{0,500}\\b${member}[^}\\n]{0,500}\\}|\\[[^\\]\\n]{0,500}\\b${member}[^\\]\\n]{0,500}\\])\\s+(?:of|in)\\b`, "i").test(withoutDeclaration)) return false;
48
- if (new RegExp(`\\b(?:object|reflect)\\s*\\.\\s*[a-z_$][a-z0-9_$]*\\s*\\(\\s*${escaped}\\s*[,)]|\\b[a-z_$][a-z0-9_$.]*\\s*\\(\\s*${escaped}\\s*[,)]`, "i").test(withoutDeclaration)) return false;
49
- for (const match of withoutDeclaration.matchAll(new RegExp(`\\b${escaped}\\b`, "gi"))) {
50
- const suffix = withoutDeclaration.slice(match.index + match[0].length);
51
- if (/^\s*\(/.test(suffix) || /^\s*\.\s*[a-z_$][a-z0-9_$]*\s*\(/i.test(suffix)) continue;
52
- return false;
53
- }
54
- return true;
55
- }
56
-
57
15
  function assertionEvidenceFileSupported(testText) {
58
- if (/\\|__pi_(?:code_generation|module_loader)_module_literal__|\b(?:eval|createrequire)\b|\b(?:process|globalthis|global|window|self|this)\b|\bmodule\s*\.\s*(?:require|constructor|_load)\b|\.\s*constructor\b|\bfunction\s*\(|(?:=|[,([])\s*function\b(?!\s+[a-z_$][a-z0-9_$]*\s*\()/i.test(testText)) return false;
16
+ if (!browserWindowReferencesAreLocal(testText)) return false;
17
+ if (/\\|__pi_(?:code_generation|module_loader)_module_literal__|\b(?:eval|createrequire)\b|\b(?:process|globalthis|global|self|this)\b|\bmodule\s*\.\s*(?:require|constructor|_load)\b|\.\s*constructor\b|\bfunction\s*\(|(?:=|[,([])\s*function\b(?!\s+[a-z_$][a-z0-9_$]*\s*\()/i.test(testText)) return false;
59
18
  if (/\brequire\b(?!\s*\()/i.test(testText)) return false;
60
19
  for (const match of testText.matchAll(/\b(?:require|import)\s*\(/gi)) {
61
20
  const open = testText.indexOf("(", match.index);
62
21
  const end = balancedEnd(testText, open);
63
22
  const argument = end === -1 ? "" : testText.slice(open + 1, end - 1).trim();
64
- if (!/^__pi_(?:bound_string_\d+|string|node_assert_module)_literal__$/.test(argument)) return false;
23
+ if (!/^__pi_(?:bound_string_\d+|string|node_assert_module|node_test_module)_literal__$/.test(argument)) return false;
65
24
  }
66
25
  return true;
67
26
  }
@@ -70,6 +29,103 @@ function nodeAssertModuleReferenceCount(testText) {
70
29
  return [...testText.matchAll(/__pi_node_assert_module_literal__/g)].length;
71
30
  }
72
31
 
32
+ export function literalArrayIterationEnvironmentIsStable(testText) {
33
+ const code = String(testText ?? "");
34
+ if (/\barray\s*\.\s*prototype\b|\bsymbol\b|\breflect\b|__proto__|\bobject\s*\.\s*(?:get|set|define|assign)/i.test(code)) return false;
35
+ const intrinsic = "(?:array|symbol)";
36
+ if (new RegExp(`\\b(?:const|let|var|function|class)\\s+${intrinsic}\\b|\\bimport\\s+(?:\\*\\s+as\\s+)?${intrinsic}\\b|\\bimport\\s*\\{[^}\\n]{0,500}\\bas\\s+${intrinsic}\\b`, "i").test(code)) return false;
37
+ if (new RegExp(`\\b(?:const|let|var)\\s+(?:\\{[^}\\n]{0,500}\\b${intrinsic}\\b|\\[[^\\]\\n]{0,500}\\b${intrinsic}\\b)|\\b(?:function|catch)\\b[^({]{0,200}\\([^)]*\\b${intrinsic}\\b`, "i").test(code)) return false;
38
+ if (new RegExp(`(?:\\([^)]*\\b${intrinsic}\\b[^)]*\\)|\\b${intrinsic})\\s*=>|(?<![.$a-z0-9_])${intrinsic}\\s*(?:(?<![=!<>])=(?!=|>)|\\+\\+|--|[+*/%&|^-]=)`, "i").test(code)) return false;
39
+ return true;
40
+ }
41
+
42
+ function moduleBackedBindings(code, moduleToken, exportedNames = []) {
43
+ const names = new Set(), token = escapeRegex(moduleToken);
44
+ const add = (name) => { if (/^[a-z_$][a-z0-9_$]*$/i.test(name ?? "")) names.add(name.toLowerCase()); };
45
+ for (const match of code.matchAll(new RegExp(`\\bimport\\s+([a-z_$][a-z0-9_$]*)(?:\\s*,\\s*\\{[^}]{1,500}\\})?\\s+from\\s+${token}\\b`, "gi"))) add(match[1]);
46
+ for (const match of code.matchAll(new RegExp(`\\bimport\\s+\\*\\s+as\\s+([a-z_$][a-z0-9_$]*)\\s+from\\s+${token}\\b`, "gi"))) add(match[1]);
47
+ for (const match of code.matchAll(new RegExp(`\\bimport\\s+(?:[a-z_$][a-z0-9_$]*\\s*,\\s*)?\\{([^}]{1,500})\\}\\s*from\\s+${token}\\b`, "gi"))) {
48
+ for (const raw of match[1].split(",")) {
49
+ const item = raw.trim().match(/^([a-z_$][a-z0-9_$]*)(?:\s+as\s+([a-z_$][a-z0-9_$]*))?$/i);
50
+ if (item && exportedNames.includes(item[1].toLowerCase())) add(item[2] ?? item[1]);
51
+ }
52
+ }
53
+ for (const match of code.matchAll(new RegExp(`\\b(?:const|let|var)\\s+([a-z_$][a-z0-9_$]*)\\s*=\\s*require\\s*\\(\\s*${token}\\s*\\)(?:\\s*\\.\\s*(?:strict|${exportedNames.join("|")}))?\\s*;?`, "gi"))) add(match[1]);
54
+ for (const match of code.matchAll(new RegExp(`\\b(?:const|let|var)\\s*\\{([^}]{1,500})\\}\\s*=\\s*require\\s*\\(\\s*${token}\\s*\\)`, "gi"))) {
55
+ for (const raw of match[1].split(",")) {
56
+ const item = raw.trim().match(/^([a-z_$][a-z0-9_$]*)(?:\s*:\s*([a-z_$][a-z0-9_$]*))?$/i);
57
+ if (item && exportedNames.includes(item[1].toLowerCase())) add(item[2] ?? item[1]);
58
+ }
59
+ }
60
+ for (let pass = 0; pass < 4; pass += 1) {
61
+ const priorSize = names.size;
62
+ for (const name of [...names]) {
63
+ const backed = `${escapeRegex(name)}(?:\\s*\\.\\s*[a-z_$][a-z0-9_$]*|\\s*\\[[^\\]\\n]{1,300}\\])?`;
64
+ for (const match of code.matchAll(new RegExp(`\\b(?:const|let|var)\\s+([a-z_$][a-z0-9_$]*)\\s*=\\s*${backed}\\s*(?:;|\\n|$)`, "gi"))) add(match[1]);
65
+ for (const match of code.matchAll(new RegExp(`(?<![.$a-z0-9_])([a-z_$][a-z0-9_$]*)\\s*=\\s*${backed}\\s*(?:;|\\n|$)`, "gi"))) add(match[1]);
66
+ for (const match of code.matchAll(new RegExp(`\\b(?:const|let|var)\\s*\\{([^}]{1,500})\\}\\s*=\\s*${escapeRegex(name)}\\b`, "gi"))) {
67
+ for (const raw of match[1].split(",")) add(raw.trim().match(/^(?:[a-z_$][a-z0-9_$]*\s*:\s*)?([a-z_$][a-z0-9_$]*)$/i)?.[1]);
68
+ }
69
+ }
70
+ if (names.size === priorSize) break;
71
+ }
72
+ return [...names];
73
+ }
74
+
75
+ function withoutModuleBindingDeclarations(code, moduleToken) {
76
+ const token = escapeRegex(moduleToken), blank = (match) => " ".repeat(match.length);
77
+ return String(code ?? "")
78
+ .replace(new RegExp(`\\bimport\\s+[^;\\n]{1,800}?\\s+from\\s+${token}\\s*;?`, "gi"), blank)
79
+ .replace(new RegExp(`\\b(?:const|let|var)\\s+[^;\\n]{1,800}?=\\s*require\\s*\\(\\s*${token}\\s*\\)[^;\\n]*;?`, "gi"), blank);
80
+ }
81
+
82
+ function moduleBindingEscapes(code, binding) {
83
+ // Returning a direct module method call does not return the module binding.
84
+ // Bare members and bound methods remain escapes; mutation checks still apply.
85
+ const name = `(?<![.$a-z0-9_])${escapeRegex(binding)}\\b`;
86
+ if (new RegExp(`\\b(?:const|let|var)\\s+[a-z_$][a-z0-9_$]*\\s*=\\s*(?:${name}|\\{[^}\\n]{0,500}${name}|\\[[^\\]\\n]{0,500}${name})`, "i").test(code)) return true;
87
+ if (new RegExp(`(?<![=!<>])=(?!=|>)\\s*${name}|\\breturn\\s+${name}|=>\\s*${name}(?!\\s*\\.\\s*[a-z_$][a-z0-9_$]*\\s*\\()|\\.\\.\\.\\s*${name}`, "i").test(code)) return true;
88
+ if (new RegExp(`(?:\\(|\\{|\\[|,|:)\\s*(?:[a-z_$][a-z0-9_$]*\\s*:\\s*)?${name}\\s*(?:,|\\)|\\}|\\])`, "i").test(code)) return true;
89
+ return new RegExp(`(?:\\(|,)\\s*${name}\\s*(?:,|\\))`, "i").test(code);
90
+ }
91
+
92
+ function moduleTargetIsMutated(code, target) {
93
+ const member = "(?:\\s*\\.\\s*[a-z_$][a-z0-9_$]*|\\s*\\[[^\\]\\n]{1,300}\\])";
94
+ const lvalue = `(?:${target})(?:${member}){1,4}`;
95
+ if (new RegExp(`${lvalue}\\s*(?:=(?!=|>)|\\+\\+|--|[+*/%&|^-]=|(?:&&|\\|\\||\\?\\?)=)|(?:\\+\\+|--)\\s*${lvalue}|\\bdelete\\s+${lvalue}`, "i").test(code)) return true;
96
+ if (new RegExp(`\\b(?:object\\s*\\.\\s*(?:assign|defineproperties|defineproperty|setprototypeof)|reflect\\s*\\.\\s*(?:defineproperty|set|setprototypeof))\\s*\\(\\s*(?:${target})\\s*[,)]`, "i").test(code)) return true;
97
+ return new RegExp(`(?:${target})\\s*\\.\\s*__(?:definegetter|definesetter)__\\s*\\(`, "i").test(code);
98
+ }
99
+
100
+ /** Reject corpus-wide mutation of assertion carriers or test registration APIs. */
101
+ export function testProofIntrinsicsAreStable(testText) {
102
+ const code = String(testText ?? "");
103
+ if (/__pi_node_process_module_literal__|\bprocess\s*(?:\.|\[)/i.test(code)) return false;
104
+ if (/\bimport\s+(?:__pi_bound_string_\d+__|__pi_template_literal__)\s*(?=;|\b(?:assert|with)\b|[\r\n]|$)/i.test(code)) return false;
105
+ if (/__pi_template_literal__/.test(code)
106
+ && /__pi_node_(?:assert|test)_module_literal__/.test(code)) return false;
107
+ for (const match of code.matchAll(/\b(?:import|require)\s*\(/gi)) {
108
+ const open = code.indexOf("(", match.index), end = balancedEnd(code, open);
109
+ const argument = end === -1 ? "" : code.slice(open + 1, end - 1).trim();
110
+ if (!/^__pi_(?:bound_string_\d+|node_assert_module|node_process_module|node_test_module)_literal__$/.test(argument)) return false;
111
+ if (/^__pi_node_(?:assert|test)_module_literal__$/.test(argument) && /^import/i.test(match[0])) return false;
112
+ }
113
+ const modules = [
114
+ { token: "__pi_node_assert_module_literal__", exports: ["default", "strict"] },
115
+ { token: "__pi_node_test_module_literal__", exports: ["default", ...TEST_RUNNER_EXPORT_KINDS.keys()] }
116
+ ];
117
+ for (const module of modules) {
118
+ const direct = `require\\s*\\(\\s*${module.token}\\s*\\)(?:\\s*\\.\\s*strict)?`;
119
+ if (moduleTargetIsMutated(code, direct)) return false;
120
+ const declarationFree = withoutModuleBindingDeclarations(code, module.token);
121
+ for (const binding of moduleBackedBindings(code, module.token, module.exports)) {
122
+ if (moduleBindingEscapes(declarationFree, binding)) return false;
123
+ if (moduleTargetIsMutated(code, `(?<![.$a-z0-9_])${escapeRegex(binding)}\\b`)) return false;
124
+ }
125
+ }
126
+ return true;
127
+ }
128
+
73
129
  function balancedEnd(text, openIndex, opening = "(", closing = ")", ceiling = 8_000) {
74
130
  if (text[openIndex] !== opening) return -1;
75
131
  let depth = 0;
@@ -106,6 +162,141 @@ function topLevelArgumentRanges(text, openIndex, endIndex) {
106
162
  export function evidenceTopLevelArguments(text, openIndex, endIndex) {
107
163
  return topLevelArgumentRanges(text, openIndex, endIndex).map((argument) => argument.text);
108
164
  }
165
+ function operationArguments(operation, target) {
166
+ const callable = String(target ?? "").replace(/^\*\./, "");
167
+ if (!callable) return [];
168
+ const text = String(operation ?? "");
169
+ const pattern = new RegExp(`(?:^|[^a-z0-9_$])${escapeRegex(callable)}\\s*\\(`, "gi");
170
+ for (const match of text.matchAll(pattern)) {
171
+ const open = text.indexOf("(", match.index + match[0].length - 1);
172
+ const end = balancedEnd(text, open);
173
+ if (end !== -1) return topLevelArgumentRanges(text, open, end).map((item) => item.text.trim());
174
+ }
175
+ return [];
176
+ }
177
+
178
+ function literalBooleanTernarySelection(raw) {
179
+ let value = String(raw ?? "").trim();
180
+ while (value.startsWith("(") && balancedEnd(value, 0) === value.length) value = value.slice(1, -1).trim();
181
+ let question = -1, colon = -1, parentheses = 0, brackets = 0, braces = 0, ternaries = 0;
182
+ for (let index = 0; index < value.length; index += 1) {
183
+ if (value[index] === "(") parentheses += 1;
184
+ else if (value[index] === ")") parentheses -= 1;
185
+ else if (value[index] === "[") brackets += 1;
186
+ else if (value[index] === "]") brackets -= 1;
187
+ else if (value[index] === "{") braces += 1;
188
+ else if (value[index] === "}") braces -= 1;
189
+ else if (parentheses === 0 && brackets === 0 && braces === 0 && value[index] === "?") {
190
+ if (question === -1) question = index;
191
+ ternaries += 1;
192
+ } else if (parentheses === 0 && brackets === 0 && braces === 0 && value[index] === ":" && ternaries > 0) {
193
+ ternaries -= 1;
194
+ if (ternaries === 0) { colon = index; break; }
195
+ }
196
+ if (parentheses < 0 || brackets < 0 || braces < 0) return { kind: "unknown" };
197
+ }
198
+ if (question === -1) return { kind: "plain", value };
199
+ if (colon === -1 || ternaries !== 0) return { kind: "unknown" };
200
+ const condition = value.slice(0, question).trim();
201
+ const conditionValue = simpleConstantValue(condition);
202
+ if (conditionValue === undefined) return { kind: "unknown" };
203
+ return {
204
+ kind: "selected",
205
+ value: conditionValue ? value.slice(question + 1, colon).trim() : value.slice(colon + 1).trim()
206
+ };
207
+ }
208
+
209
+ function annotateInvalidArgumentCoverage(assertions) {
210
+ const proofPartitions = new Set(["fractional", "invalid-calendar-date-string", "invalid-date-object", "invalid-date-string", "missing", "negative", "non-finite-number", "unsafe-integer"]);
211
+ const directInvalidPartitions = new Set(["invalid-calendar-date-string", "invalid-date-object", "invalid-date-string", "missing", "non-finite-number"]);
212
+ const argumentPartitions = (raw, collection = false) => {
213
+ let selected = literalBooleanTernarySelection(raw);
214
+ if (selected.kind === "unknown") return new Set();
215
+ while (selected.kind === "selected") {
216
+ selected = literalBooleanTernarySelection(selected.value);
217
+ if (selected.kind === "unknown") return new Set();
218
+ }
219
+ const value = selected.value;
220
+ const values = collection && value.startsWith("[") && balancedEnd(value, 0, "[", "]") === value.length
221
+ ? topLevelArgumentRanges(value, 0, value.length).map((item) => item.text.trim()) : [value];
222
+ const partitions = new Set();
223
+ for (const item of values) {
224
+ if (/^new\s+date\b/i.test(item)) {
225
+ if (INVALID_DATE_CONSTRUCTION.test(item)) partitions.add("invalid-date-object");
226
+ continue; // Constructor arguments are not the value passed to the entrypoint.
227
+ }
228
+ if (!directPrimitiveArgument(item)) continue;
229
+ for (const partition of evidencePartitionSignals(item)) if (proofPartitions.has(partition)) partitions.add(partition);
230
+ if (/^__pi_(?:invalid_(?:calendar_)?date|unparseable_date)_string_literal__$/.test(item)) partitions.add("invalid-date-string");
231
+ if (item === "__pi_invalid_calendar_date_string_literal__") partitions.add("invalid-calendar-date-string");
232
+ if (/^(?:number\.)?(?:nan|positive_infinity|negative_infinity|infinity)$/i.test(item)) partitions.add("non-finite-number");
233
+ }
234
+ return partitions;
235
+ };
236
+ const groups = new Map();
237
+ for (const assertion of assertions) {
238
+ if (!new Set(["rejects", "throws"]).has(assertion.mode)) continue;
239
+ for (const target of assertion.targets) {
240
+ const argumentsList = operationArguments(assertion.operation, target);
241
+ if (argumentsList.length === 0) continue;
242
+ const key = `${target}\u0000${assertion.mode}\u0000${[...assertion.errorClasses].sort().join(",")}`;
243
+ const entries = groups.get(key) ?? [];
244
+ entries.push({ assertion, argumentsList });
245
+ groups.set(key, entries);
246
+ }
247
+ }
248
+ for (const entries of groups.values()) {
249
+ const required = new Set();
250
+ const partitionsByIndex = new Map();
251
+ const addPartitions = (index, values) => {
252
+ const partitions = partitionsByIndex.get(index) ?? new Set();
253
+ for (const value of values) if (proofPartitions.has(value)) partitions.add(value);
254
+ partitionsByIndex.set(index, partitions);
255
+ };
256
+ for (const { assertion, argumentsList } of entries) {
257
+ if (argumentsList.length === 1) required.add(0);
258
+ for (let index = 0; index < argumentsList.length; index += 1) {
259
+ const directPartitions = argumentPartitions(argumentsList[index]);
260
+ if ([...directPartitions].some((partition) => directInvalidPartitions.has(partition))) {
261
+ required.add(index);
262
+ addPartitions(index, directPartitions);
263
+ }
264
+ for (const binding of assertion.iterationBindings ?? []) {
265
+ if (!new RegExp(`\\b${escapeRegex(binding.variable)}\\b`, "i").test(argumentsList[index])) continue;
266
+ required.add(index);
267
+ if (literalBooleanTernarySelection(argumentsList[index]).value === binding.variable) addPartitions(index, argumentPartitions(binding.literal, true));
268
+ }
269
+ }
270
+ }
271
+ const maximumArity = Math.max(0, ...entries.map((entry) => entry.argumentsList.length));
272
+ for (let index = 0; index < maximumArity; index += 1) {
273
+ const corpora = new Map();
274
+ for (const { argumentsList } of entries) {
275
+ if (argumentsList.length !== maximumArity) continue;
276
+ const fixed = argumentsList.map((value, argumentIndex) => argumentIndex === index ? "__varying__" : value).join("\u0000");
277
+ const values = corpora.get(fixed) ?? new Set();
278
+ values.add(argumentsList[index]);
279
+ corpora.set(fixed, values);
280
+ }
281
+ // Three independently asserted values with every other argument fixed
282
+ // form a bounded invalid-input corpus rather than incidental variation.
283
+ for (const values of corpora.values()) {
284
+ if (values.size < 3) continue;
285
+ required.add(index);
286
+ for (const value of values) addPartitions(index, argumentPartitions(value));
287
+ }
288
+ }
289
+ for (const { assertion } of entries) {
290
+ assertion.invalidArgumentIndices = [...new Set([...(assertion.invalidArgumentIndices ?? []), ...required])]
291
+ .sort((left, right) => left - right);
292
+ assertion.invalidArgumentPartitions = [...required].sort((left, right) => left - right).map((index) => ({
293
+ index,
294
+ partitions: [...(partitionsByIndex.get(index) ?? [])].sort()
295
+ }));
296
+ }
297
+ }
298
+ return assertions;
299
+ }
109
300
 
110
301
  function evidenceErrorClasses(text) {
111
302
  return ERROR_CONSTRUCTORS.filter((name) => (
@@ -152,8 +343,8 @@ function simpleConstantValue(raw) {
152
343
 
153
344
  function operationTargets(raw, callableNames) {
154
345
  let operation = String(raw ?? "").trim();
155
- const arrow = operation.indexOf("=>");
156
- if (arrow !== -1) operation = operation.slice(arrow + 2).trim();
346
+ const arrow = operation.match(/^(?:async\s+)?(?:\([^()]*\)|[a-z_$][a-z0-9_$]*)\s*=>/i);
347
+ if (arrow) operation = operation.slice(arrow[0].length).trim();
157
348
  else if (/^function\b/.test(operation)) operation = operation.slice(operation.indexOf("{")).trim();
158
349
  if (operation.startsWith("{") && balancedEnd(operation, 0, "{", "}") === operation.length) operation = operation.slice(1, -1).trim();
159
350
  operation = operation.replace(/^(?:return\s+)?(?:await\s+)?/, "").replace(/;\s*$/, "").trim();
@@ -191,7 +382,7 @@ function evidencePartitionSignals(text) {
191
382
  if (/\bundefined\b/.test(text)) signals.add("missing");
192
383
  if (/__pi_empty_string_literal__/.test(text)) signals.add("empty-string");
193
384
  if (/__pi_whitespace_string_literal__/.test(text)) signals.add("whitespace-string");
194
- if (/(?:^|[^\w.])-\s*(?:\d+(?:\.\d+)?|infinity)\b/.test(text)) signals.add("negative");
385
+ if (/(?:^|[^\w.])-\s*(?:\d+(?:\.\d+)?)\b/.test(text)) signals.add("negative");
195
386
  if (/(?:^|[^\w.])(?:\d+\.\d+|\.\d+)(?:[^\w.]|$)/.test(text)) signals.add("fractional");
196
387
  if (/(?:^|[^\w.])0n?(?:[^\w.]|$)/.test(text)) signals.add("zero");
197
388
  if (/\b(?:nan|infinity)\b|number\.(?:positive_|negative_)?infinity/.test(text)) signals.add("non-finite");
@@ -222,6 +413,59 @@ function literalArrayPartitionSignals(literal) {
222
413
  return signals;
223
414
  }
224
415
 
416
+ function constantTupleRows(literal, testText) {
417
+ const atom = String.raw`(?:undefined|null|true|false|nan|infinity|number\.(?:nan|(?:positive_|negative_)?infinity)|-?(?:\d+(?:\.\d+)?|\.\d+)|__pi_[a-z0-9_]*string_literal__)`;
418
+ const cell = new RegExp(`^${atom}$`, "i");
419
+ const elements = (text) => {
420
+ const values = topLevelArgumentRanges(text, 0, text.length).map((item) => item.text);
421
+ if (values.at(-1) === "" && /,\s*\]$/.test(text)) values.pop();
422
+ return values;
423
+ };
424
+ const rows = elements(literal);
425
+ if (rows.length === 0 || rows.length > 24) return undefined;
426
+ const values = rows.map((row) => boundedNonEmptyArrayLiteral(row)
427
+ ? elements(row) : []);
428
+ if (values.some((row) => row.length !== 2 || row.some((value) => !cell.test(value) && !INVALID_DATE_CONSTRUCTION.test(value)))) return undefined;
429
+ // A literal Date allocation is the only admitted cell call. Its constructor
430
+ // and the primitive intrinsic values must not be rebound or escape by alias.
431
+ const intrinsic = "(?:date|number|nan|infinity|undefined)";
432
+ if (new RegExp(`\\b(?:const|let|var|class|function)\\s+${intrinsic}\\b|\\b(?:import|function|catch)\\b[^;{}]{0,300}\\b${intrinsic}\\b`, "i").test(testText)
433
+ || new RegExp(`\\b(?:const|let|var)\\s*(?:\\{[^}]{0,500}\\b${intrinsic}\\b|\\[[^\\]]{0,500}\\b${intrinsic}\\b)|(?:\\([^)]*\\b${intrinsic}\\b[^)]*\\)|\\b${intrinsic})\\s*=>`, "i").test(testText)
434
+ || new RegExp(`\\b${intrinsic}\\b(?:\\s*\\.\\s*[a-z_$][a-z0-9_$]*)?\\s*(?:=(?!=|>)|\\+\\+|--|[+*/%&|^-]=)`, "i").test(testText)) return undefined;
435
+ for (const match of testText.matchAll(/\b(?:date|number)\b/gi)) {
436
+ const before = testText.slice(0, match.index), after = testText.slice(match.index + match[0].length);
437
+ if (match[0].toLowerCase() === "date" && /\bnew\s*$/.test(before) && /^\s*\(/.test(after)) continue;
438
+ if (/^\s*\.\s*(?:parse|now|utc|isfinite|isnan|isinteger|issafeinteger)\s*\(/i.test(after)) continue;
439
+ if (/^\s*\.\s*(?:nan|(?:positive_|negative_)?infinity)\b(?!\s*(?:\[|\.|=|\+\+|--))/i.test(after)) continue;
440
+ return undefined;
441
+ }
442
+ return values;
443
+ }
444
+
445
+ function tupleTargetImportsAreStable(testText, callableNames) {
446
+ const imports = [...testText.matchAll(/\bimport\s+([^;]{1,800}?)\s+from\s+__pi_[a-z0-9_]+__\s*;?/gi)];
447
+ return [...callableNames].every((name) => {
448
+ const root = name.split(".")[0];
449
+ if (!/^[a-z_$][a-z0-9_$]*$/i.test(root)) return false;
450
+ const matches = imports.filter((item) => new RegExp(`\\b${escapeRegex(root)}\\b`, "i").test(item[1]));
451
+ const bindings = matches.map((item) => ({ name: root, start: item.index, end: item.index + item[0].length }));
452
+ return bindings.length === 1 && importedCallableBindingIsStable(testText, bindings[0], bindings);
453
+ });
454
+ }
455
+
456
+ function tupleExpectedErrorClasses(assertion) {
457
+ const invocation = assertion.match(/^[a-z_$][a-z0-9_$]*\.(?:throws|rejects)\s*\(/i);
458
+ if (!invocation) return undefined;
459
+ const open = invocation[0].length - 1, end = balancedEnd(assertion, open);
460
+ if (end !== assertion.length) return undefined;
461
+ const args = topLevelArgumentRanges(assertion, open, end).map((item) => item.text);
462
+ if (args.length !== 2 && args.length !== 3) return undefined;
463
+ if (args.length === 3 && !/^__pi_(?:[a-z0-9_]*string|error_name_[a-z]+)_literal__$/.test(args[2])) return undefined;
464
+ const expected = ERROR_CONSTRUCTORS.find((name) => args[1] === name
465
+ || new RegExp(`^\\{\\s*name\\s*:\\s*__pi_error_name_${name}_literal__\\s*,?\\s*\\}$`).test(args[1]));
466
+ return expected ? [expected] : undefined;
467
+ }
468
+
225
469
  function assertionHelperDeclarations(testText) {
226
470
  const declarations = [];
227
471
  for (const match of testText.matchAll(/\bfunction\s+([a-z_$][a-z0-9_$]*)\s*\(([^)]*)\)\s*\{/gi)) {
@@ -265,57 +509,82 @@ function rejectionAssertionHelpers(testText, assertionCarriers) {
265
509
  function registrationArgumentsEnabled(argumentsList) {
266
510
  if (argumentsList.length <= 2) return true;
267
511
  if (argumentsList.length !== 3 || !/^\{[\s\S]{0,800}\}$/.test(argumentsList[1].text)) return false;
268
- for (const match of argumentsList[1].text.matchAll(/\b(?:skip|todo)\s*:\s*([^,}]{1,200})/g)) {
269
- if (simpleConstantValue(match[1]) !== false) return false;
270
- }
271
- return true;
512
+ const options = argumentsList[1].text;
513
+ if (/\.\.\.|\[[^\]]+\]\s*:|__pi_(?:bound_string_\d+__|string_literal__)\s*:/.test(options)) return false;
514
+ const withoutDisabledFlags = options.replace(/\b(?:skip|todo)\s*:\s*false\b/g, "");
515
+ return !/\b(?:skip|todo)\b/.test(withoutDisabledFlags);
272
516
  }
273
517
 
274
518
  function callbackBodyRange(text, argument) {
275
- const value = text.slice(argument.start, argument.end);
276
- const arrow = value.indexOf("=>");
277
- const functionBody = arrow === -1 ? value.indexOf("{") : -1;
278
- let bodyStart = argument.start + (arrow === -1 ? functionBody : arrow + 2);
279
- if (bodyStart < argument.start) return undefined;
519
+ let expressionStart = argument.start, expressionEnd = argument.end;
520
+ while (/\s/.test(text[expressionStart] ?? "")) expressionStart += 1;
521
+ while (/\s/.test(text[expressionEnd - 1] ?? "")) expressionEnd -= 1;
522
+ while (text[expressionStart] === "(" && balancedEnd(text, expressionStart) === expressionEnd) {
523
+ expressionStart += 1; expressionEnd -= 1;
524
+ while (/\s/.test(text[expressionStart] ?? "")) expressionStart += 1;
525
+ while (/\s/.test(text[expressionEnd - 1] ?? "")) expressionEnd -= 1;
526
+ }
527
+ const value = text.slice(expressionStart, expressionEnd);
528
+ const arrow = value.match(/^(?:async\s+)?(?:\([^)]*\)|[a-z_$][a-z0-9_$]*)\s*=>\s*/i);
529
+ const callable = arrow ?? value.match(/^(?:async\s+)?function(?:\s+[a-z_$][a-z0-9_$]*)?\s*\([^)]*\)\s*/i);
530
+ if (!callable) return undefined;
531
+ let bodyStart = expressionStart + callable[0].length;
280
532
  while (/\s/.test(text[bodyStart] ?? "")) bodyStart += 1;
281
- if (text[bodyStart] !== "{") return arrow === -1 ? undefined : { start: bodyStart, end: argument.end, braced: false };
533
+ if (text[bodyStart] !== "{") return arrow ? { start: bodyStart, end: expressionEnd, braced: false } : undefined;
282
534
  const end = balancedEnd(text, bodyStart, "{", "}");
283
- return end === -1 || end > argument.end + 1 ? undefined : { start: bodyStart + 1, end: end - 1, braced: true };
535
+ return end !== expressionEnd ? undefined : { start: bodyStart + 1, end: end - 1, braced: true };
284
536
  }
285
537
 
286
- export function executableRejectionAssertions(testText, callableNames, modeHintsOnly = false) {
538
+ export function executableRejectionAssertions(testText, callableNames, modeHintsOnly = false, includeSuccess = false,
539
+ literalIterationEnvironmentStable = true) {
287
540
  const assertions = [];
288
541
  const carrierBindings = assertionCarrierBindings(testText);
289
542
  const assertionCarriers = new Set((assertionEvidenceFileSupported(testText)
290
543
  && carrierBindings.length === 1 && nodeAssertModuleReferenceCount(testText) === 1 ? carrierBindings : [])
291
544
  .filter((binding) => assertionCarrierIsStable(testText, binding))
292
545
  .map((binding) => binding.name));
546
+ const runnerBindings = testRunnerBindings(testText);
547
+ const liveRunnerBindings = new Map(runnerBindings
548
+ .filter((binding) => importedCallableBindingIsStable(testText, binding, runnerBindings))
549
+ .map((binding) => [binding.name, binding.kind]));
550
+ const literalIterationStable = literalIterationEnvironmentStable
551
+ && literalArrayIterationEnvironmentIsStable(testText);
552
+ const registrationNames = (kind, fallbacks) => uniqueStrings([
553
+ ...fallbacks, ...runnerBindings.filter((binding) => binding.kind === kind).map((binding) => binding.name)
554
+ ]);
555
+ const registrationPattern = (names, suffix) => new RegExp(
556
+ `\\b(${names.map(escapeRegex).join("|")})${suffix}\\s*\\(`, "gi"
557
+ );
558
+ const suiteNames = registrationNames("suite", ["context", "describe", "suite"]);
559
+ const testNames = registrationNames("test", ["it", "specify", "test"]);
293
560
  const declarationRanges = assertionHelperDeclarations(testText).map(({ start, end }) => ({ start, end }));
294
561
  const skippedRanges = [];
295
562
  const suiteRanges = [];
296
563
  const registeredRanges = [];
297
- for (const match of testText.matchAll(/\b(?:context|describe|it|specify|suite|test)\.(?:skip|todo)\s*\(/g)) {
564
+ for (const match of testText.matchAll(registrationPattern([...suiteNames, ...testNames], "\\.(?:skip|todo)"))) {
298
565
  const open = testText.indexOf("(", match.index);
299
566
  const end = balancedEnd(testText, open);
300
567
  if (end !== -1) skippedRanges.push({ start: match.index, end });
301
568
  }
302
- for (const match of testText.matchAll(/\b(?:context|describe|suite)(?:\.only)?\s*\(/g)) {
569
+ for (const match of testText.matchAll(registrationPattern(suiteNames, "(?:\\.only)?"))) {
303
570
  const open = testText.indexOf("(", match.index);
304
571
  const end = balancedEnd(testText, open);
305
572
  if (end === -1) continue;
306
573
  const argumentsList = topLevelArgumentRanges(testText, open, end);
307
574
  const callback = callbackBodyRange(testText, argumentsList.at(-1));
308
- if (!registrationArgumentsEnabled(argumentsList) || !callback) skippedRanges.push({ start: match.index, end });
309
- else suiteRanges.push({ ...callback, callStart: match.index });
575
+ if (liveRunnerBindings.get(match[1].toLowerCase()) !== "suite"
576
+ || !registrationArgumentsEnabled(argumentsList) || !callback) skippedRanges.push({ start: match.index, end });
577
+ else suiteRanges.push({ ...callback, callStart: match.index, tupleCallbackClosed: tupleRegistrationIsClosed(argumentsList) });
310
578
  }
311
- for (const match of testText.matchAll(/\b(?:it|specify|test)(?:\.(?:concurrent|only))?\s*\(/g)) {
579
+ for (const match of testText.matchAll(registrationPattern(testNames, "(?:\\.(?:concurrent|only))?"))) {
312
580
  const open = testText.indexOf("(", match.index);
313
581
  const end = balancedEnd(testText, open);
314
582
  if (end === -1) continue;
315
583
  const argumentsList = topLevelArgumentRanges(testText, open, end);
316
584
  const callback = callbackBodyRange(testText, argumentsList.at(-1));
317
- if (!registrationArgumentsEnabled(argumentsList) || !callback) skippedRanges.push({ start: match.index, end });
318
- else registeredRanges.push({ ...callback, callStart: match.index });
585
+ if (liveRunnerBindings.get(match[1].toLowerCase()) !== "test"
586
+ || !registrationArgumentsEnabled(argumentsList) || !callback) skippedRanges.push({ start: match.index, end });
587
+ else registeredRanges.push({ ...callback, callStart: match.index, tupleCallbackClosed: tupleRegistrationIsClosed(argumentsList) });
319
588
  }
320
589
  const bracedDepthAt = (offset) => {
321
590
  let depth = 0;
@@ -335,16 +604,8 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
335
604
  const topLevelCall = (start) => {
336
605
  if (bracedDepthAt(start) !== 0) return false;
337
606
  const prefix = testText.slice(Math.max(testText.lastIndexOf(";", start - 1) + 1, 0), start);
338
- return !/=>|\bfunction\b|\?|&&/.test(prefix);
607
+ return !/=>|\bfunction\b|\?|&&|\|\|/.test(prefix);
339
608
  };
340
- const liveSuites = [];
341
- for (const suite of suiteRanges) {
342
- if (topLevelCall(suite.callStart) || liveSuites.some((range) => rangeDirectlyContains(range, suite.callStart))) liveSuites.push(suite);
343
- }
344
- suiteRanges.splice(0, suiteRanges.length, ...liveSuites);
345
- const liveRegistrations = registeredRanges.filter((range) => topLevelCall(range.callStart)
346
- || suiteRanges.some((suite) => rangeDirectlyContains(suite, range.callStart)));
347
- registeredRanges.splice(0, registeredRanges.length, ...liveRegistrations);
348
609
  const statementRange = (start) => {
349
610
  let bodyStart = start;
350
611
  while (/\s/.test(testText[bodyStart] ?? "")) bodyStart += 1;
@@ -352,6 +613,53 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
352
613
  const semicolon = testText.indexOf(";", bodyStart);
353
614
  return { start: bodyStart, end: semicolon === -1 ? testText.length : semicolon + 1 };
354
615
  };
616
+ const statementAbruptlyExits = (raw) => {
617
+ let body = String(raw ?? "").trim();
618
+ if (body.startsWith("{") && balancedEnd(body, 0, "{", "}") === body.length) body = body.slice(1, -1).trim();
619
+ return /^(?:(?:break|continue)\s*;?|return(?:[ \t]+[^;{}\r\n]*)?\s*;?|throw\s+[^;{}]+\s*;?|process\.exit\s*\([^;{}]*\)\s*;?)$/.test(body);
620
+ };
621
+ const directStatementAtDepth = (containerStart, offset, baseDepth) => {
622
+ let boundary = containerStart, braces = baseDepth, brackets = 0, parentheses = 0;
623
+ for (let index = containerStart; index < offset; index += 1) {
624
+ const character = testText[index];
625
+ if (character === "{") braces += 1;
626
+ else if (character === "}") { braces = Math.max(0, braces - 1); if (braces === baseDepth) boundary = index + 1; }
627
+ else if (braces === baseDepth && character === "[") brackets += 1;
628
+ else if (braces === baseDepth && character === "]") brackets -= 1;
629
+ else if (braces === baseDepth && character === "(") parentheses += 1;
630
+ else if (braces === baseDepth && character === ")") parentheses -= 1;
631
+ else if (braces === baseDepth && !brackets && !parentheses && character === ";") boundary = index + 1;
632
+ }
633
+ return !testText.slice(boundary, offset).trim();
634
+ };
635
+ const abruptBefore = (containerStart, start, baseDepth) => {
636
+ const prefix = testText.slice(containerStart, start);
637
+ for (const match of prefix.matchAll(/\b(?:break|continue|return|throw)\b|\bprocess\s*\.\s*exit\s*\(/g)) {
638
+ const absolute = containerStart + match.index;
639
+ if (bracedDepthAt(absolute) === baseDepth && directStatementAtDepth(containerStart, absolute, baseDepth)) return true;
640
+ }
641
+ for (const match of prefix.matchAll(/\bif\s*\(/g)) {
642
+ const absolute = containerStart + match.index;
643
+ if (bracedDepthAt(absolute) !== baseDepth || !directStatementAtDepth(containerStart, absolute, baseDepth)) continue;
644
+ const open = testText.indexOf("(", absolute), conditionEnd = balancedEnd(testText, open);
645
+ if (conditionEnd === -1 || conditionEnd > start
646
+ || simpleConstantValue(testText.slice(open + 1, conditionEnd - 1)) === false) continue;
647
+ const consequent = statementRange(conditionEnd);
648
+ if (consequent.end !== -1 && consequent.end <= start
649
+ && statementAbruptlyExits(testText.slice(consequent.start, consequent.end))) return true;
650
+ }
651
+ return false;
652
+ };
653
+ const topLevelAbruptBefore = (start) => abruptBefore(0, start, 0);
654
+ const liveSuites = [];
655
+ for (const suite of suiteRanges) {
656
+ if (!topLevelAbruptBefore(suite.callStart)
657
+ && (topLevelCall(suite.callStart) || liveSuites.some((range) => rangeDirectlyContains(range, suite.callStart)))) liveSuites.push(suite);
658
+ }
659
+ suiteRanges.splice(0, suiteRanges.length, ...liveSuites);
660
+ const liveRegistrations = registeredRanges.filter((range) => !topLevelAbruptBefore(range.callStart)
661
+ && (topLevelCall(range.callStart) || suiteRanges.some((suite) => rangeDirectlyContains(suite, range.callStart))));
662
+ registeredRanges.splice(0, registeredRanges.length, ...liveRegistrations);
355
663
  const conditionalRanges = [];
356
664
  for (const match of testText.matchAll(/\bif\s*\(/g)) {
357
665
  const open = testText.indexOf("(", match.index);
@@ -369,16 +677,35 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
369
677
  }
370
678
  const triviallyDisabled = (start) => {
371
679
  const prefix = testText.slice(Math.max(0, start - 600), start);
372
- if (prefix.match(/(?:^|[;{])\s*(?:\(([^()]{1,160})\)|([^;{}()]{1,160}))\s*&&[\s\S]{0,400}$/)) return true;
680
+ if (prefix.match(/(?:^|[;{])\s*(?:\(([^()]{1,160})\)|([^;{}()]{1,160}))\s*(?:&&|\|\|)[\s\S]{0,400}$/)) return true;
373
681
  return Boolean(prefix.match(/(?:^|[;{])\s*(?:\(([^()]{1,160})\)|([^;{}()]{1,160}))\s*\?[\s\S]{0,400}$/));
374
682
  };
375
683
  const directlyInside = rangeDirectlyContains;
684
+ const transparentTryRanges = [];
376
685
  const directBaseContext = (start) => {
377
- if (registeredRanges.some((range) => directlyInside(range, start))) return true;
686
+ if ([...registeredRanges, ...transparentTryRanges].some((range) => directlyInside(range, start))) return true;
378
687
  if (bracedDepthAt(start) !== 0) return false;
379
688
  const prefix = testText.slice(Math.max(testText.lastIndexOf(";", start - 1) + 1, 0), start);
380
689
  return !/=>|\bfunction\b/.test(prefix);
381
690
  };
691
+ // A catch-free try with a restoration-only finally cannot turn a failed
692
+ // assertion into success. Keep the body in the same live registration;
693
+ // catches, abrupt finalizers and uncalled/nested conditional blocks abstain.
694
+ for (const match of testText.matchAll(/\btry\s*\{/g)) {
695
+ if (!directBaseContext(match.index) || triviallyDisabled(match.index)
696
+ || [...declarationRanges, ...skippedRanges, ...conditionalRanges].some(range => match.index >= range.start && match.index < range.end)) continue;
697
+ const parent = [...registeredRanges, ...transparentTryRanges].filter(range => directlyInside(range, match.index)).at(-1);
698
+ if (abruptBefore(parent?.start ?? 0, match.index, bracedDepthAt(parent?.start ?? 0))) continue;
699
+ const open = testText.indexOf("{", match.index), end = balancedEnd(testText, open, "{", "}");
700
+ if (end === -1) continue;
701
+ const finalizer = testText.slice(end).match(/^\s*finally\s*\{/);
702
+ if (!finalizer) continue;
703
+ const finalOpen = end + finalizer[0].lastIndexOf("{"), finalEnd = balancedEnd(testText, finalOpen, "{", "}");
704
+ if (finalEnd === -1) continue;
705
+ const cleanup = testText.slice(finalOpen + 1, finalEnd - 1);
706
+ if (!/^(?:\s*[a-z_$][a-z0-9_$]*(?:\s*\.\s*[a-z_$][a-z0-9_$]*)*\s*=\s*[a-z_$][a-z0-9_$]*\s*;)*\s*$/i.test(cleanup)) continue;
707
+ transparentTryRanges.push({ start: open + 1, end: end - 1, braced: true });
708
+ }
382
709
  const structurallyConnected = (start) => directBaseContext(start)
383
710
  && ![...declarationRanges, ...skippedRanges, ...conditionalRanges].some((range) => start >= range.start && start < range.end)
384
711
  && !triviallyDisabled(start);
@@ -408,6 +735,24 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
408
735
  };
409
736
  const iterationRanges = [];
410
737
  const unsupportedControlRanges = [];
738
+ const tupleAncestryIsClosed = (start) => {
739
+ const callbacks = [...suiteRanges, ...registeredRanges];
740
+ const ancestry = callbacks.filter((range) => start >= range.start && start < range.end).sort((a, b) => a.start - b.start);
741
+ if (ancestry.some((range) => !range.tupleCallbackClosed)) return false;
742
+ let parentStart = 0;
743
+ for (const child of [...ancestry, { callStart: start }]) {
744
+ const masked = callbacks.filter((range) => range.start >= parentStart && range.end <= child.callStart);
745
+ let prefix = testText.slice(parentStart, child.callStart);
746
+ for (const range of masked.sort((a, b) => b.start - a.start)) {
747
+ prefix = `${prefix.slice(0, range.start - parentStart)}${" ".repeat(range.end - range.start)}${prefix.slice(range.end - parentStart)}`;
748
+ }
749
+ if (/\b(?:return|throw|break|continue|if|switch|try|catch|finally|while|do|yield|await|with)\b/.test(prefix)
750
+ || unsupportedControlRanges.some((range) => range.start >= parentStart && range.end <= child.callStart
751
+ && !masked.some((callback) => range.start >= callback.start && range.end <= callback.end))) return false;
752
+ parentStart = child.start;
753
+ }
754
+ return true;
755
+ };
411
756
  for (const match of testText.matchAll(/\bfor\s*\(/g)) {
412
757
  if (!structurallyConnected(match.index)) continue;
413
758
  const open = testText.indexOf("(", match.index);
@@ -418,8 +763,23 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
418
763
  const header = testText.slice(open + 1, headerEnd - 1);
419
764
  const iterationBody = testText[body.start] === "{" ? { start: body.start + 1, end: body.end - 1, braced: true } : { ...body, braced: false };
420
765
  const forOf = header.match(/^\s*(?:const|let)\s+([a-z_$][a-z0-9_$]*)\s+of\s+([\s\S]+?)\s*$/i);
421
- const iterable = forOf && iterationLiteral(forOf[2], match.index);
766
+ const iterable = forOf && literalIterationStable && iterationLiteral(forOf[2], match.index);
767
+ const tuple = header.match(/^\s*const\s+\[\s*([a-z_$][a-z0-9_$]*)\s*,\s*([a-z_$][a-z0-9_$]*)\s*,?\s*\]\s+of\s+([\s\S]+?)\s*$/i);
768
+ const tupleIterable = tuple && literalIterationStable && iterationLiteral(tuple[3], match.index);
769
+ const tupleRows = tupleIterable && constantTupleRows(tupleIterable.literal, testText);
770
+ const tupleVariables = tuple?.slice(1, 3);
771
+ const protectedNames = new Set([...ERROR_CONSTRUCTORS, "date", "number", "nan", "infinity", "undefined",
772
+ ...assertionCarriers, ...liveRunnerBindings.keys(), ...[...callableNames].flatMap((name) => name.split("."))]);
773
+ const tupleBindingClosed = tupleIterable && (!tupleIterable.binding
774
+ || [...testText.matchAll(new RegExp(`\\b${escapeRegex(tupleIterable.binding)}\\b`, "g"))].length === 2);
775
+ const tupleContainerStart = registrationAt(match.index)?.start ?? 0;
776
+ const tupleReachable = !abruptBefore(tupleContainerStart, match.index, bracedDepthAt(tupleContainerStart));
422
777
  if (iterable) iterationRanges.push({ ...iterationBody, ...iterable, kind: "for-of", variable: forOf[1] });
778
+ else if (tupleRows && tupleBindingClosed && tupleReachable && tupleAncestryIsClosed(match.index)
779
+ && tupleTargetImportsAreStable(testText, callableNames) && new Set(tupleVariables).size === 2
780
+ && tupleVariables.every((name) => !protectedNames.has(name))) {
781
+ iterationRanges.push({ ...iterationBody, ...tupleIterable, kind: "for-of", tupleRows, tupleVariables });
782
+ }
423
783
  else if (modeHintsOnly && forOf) iterationRanges.push({ ...iterationBody, kind: "for-of", variable: forOf[1] });
424
784
  else unsupportedControlRanges.push(body);
425
785
  }
@@ -436,7 +796,7 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
436
796
  receiverStart = receiver ? receiverStart - receiver[1].length : -1;
437
797
  }
438
798
  const receiverText = receiverStart < 0 ? "" : testText.slice(receiverStart, match.index).trim();
439
- const iterable = receiverStart < 0 ? undefined : iterationLiteral(receiverText, receiverStart);
799
+ const iterable = receiverStart < 0 || !literalIterationStable ? undefined : iterationLiteral(receiverText, receiverStart);
440
800
  const argumentsList = topLevelArgumentRanges(testText, open, end);
441
801
  const callback = callbackBodyRange(testText, argumentsList.at(-1));
442
802
  const callbackText = argumentsList.at(-1)?.text ?? "";
@@ -450,11 +810,11 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
450
810
  if (headerEnd !== -1) unsupportedControlRanges.push(statementRange(headerEnd));
451
811
  }
452
812
  const abruptlyUnreachable = (start) => {
453
- const containers = [...registeredRanges, ...iterationRanges]
813
+ const containers = [...registeredRanges, ...transparentTryRanges, ...iterationRanges]
454
814
  .filter((range) => start >= range.start && start < range.end)
455
815
  .sort((left, right) => right.start - left.start);
456
- const prefix = testText.slice(containers[0]?.start ?? 0, start);
457
- return /(?:^|[;{}])\s*(?:break|continue|return(?:\s+[^;{}]*)?|throw\s+[^;{}]+|process\.exit\s*\([^;{}]*\));[\s\S]*$/.test(prefix);
816
+ return (containers.length > 0 ? containers : [{ start: 0 }])
817
+ .some(container => abruptBefore(container.start, start, bracedDepthAt(container.start)));
458
818
  };
459
819
  const iterationVariableIsLive = (range, start) => {
460
820
  const escaped = escapeRegex(range.variable);
@@ -488,6 +848,34 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
488
848
  const returnedConciseCallback = registeredRanges.some((range) => !range.braced && start === range.start);
489
849
  if (!/^(?:await|return(?:\s+await)?)$/.test(promisePrefix) && !returnedConciseCallback) return;
490
850
  }
851
+ const tupleIteration = containingIterations.find((range) => range.tupleRows);
852
+ if (tupleIteration) {
853
+ const tuplePrefix = testText.slice(tupleIteration.start, start).trim();
854
+ if (containingIterations.length !== 1 || !["throws", "rejects"].includes(mode)
855
+ || tuplePrefix !== (mode === "rejects" ? "await" : "")
856
+ || testText.slice(end, tupleIteration.end).replace(/;/g, "").trim()) return;
857
+ const callback = String(operation ?? "").trim();
858
+ const expectedErrors = tupleExpectedErrorClasses(assertion);
859
+ if (!expectedErrors) return;
860
+ if (mode === "throws" && /^async\b/.test(callback)) return;
861
+ const invocation = callback.match(/^(?:async\s+)?\(\s*\)\s*=>\s*([a-z_$][a-z0-9_$.]*)\s*\(/i);
862
+ const open = invocation ? callback.indexOf("(", invocation[0].length - 1) : -1;
863
+ const callEnd = open < 0 ? -1 : balancedEnd(callback, open);
864
+ const argumentsList = callEnd === callback.length ? topLevelArgumentRanges(callback, open, callEnd).map((item) => item.text) : [];
865
+ if (argumentsList.length !== 2 || new Set(argumentsList).size !== 2
866
+ || argumentsList.some((argument) => !tupleIteration.tupleVariables.includes(argument))) return;
867
+ const targets = operationTargets(operation, callableNames);
868
+ if (targets.length !== 1) return;
869
+ // Expand each closed row independently. Values never migrate between
870
+ // argument positions or assertions with different expected error classes.
871
+ for (const row of tupleIteration.tupleRows) {
872
+ const values = argumentsList.map((argument) => row[tupleIteration.tupleVariables.indexOf(argument)]);
873
+ const expanded = `${callback.slice(0, open + 1)}${values.join(", ")})`;
874
+ assertions.push({ targets, errorClasses: expectedErrors, partitions: evidencePartitionSignals(expanded), mode, operation: expanded,
875
+ iterationLiterals: [], iterationVariables: [], iterationBindings: [] });
876
+ }
877
+ return;
878
+ }
491
879
  const referencedIterations = containingIterations.filter((range) => (
492
880
  new RegExp(`\\b${escapeRegex(range.variable)}\\b`, "i").test(assertion)
493
881
  ));
@@ -498,7 +886,13 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
498
886
  for (const range of referencedIterations) {
499
887
  if (range.literal) for (const signal of literalArrayPartitionSignals(range.literal)) partitions.add(signal);
500
888
  }
501
- assertions.push({ targets, errorClasses, partitions, mode });
889
+ assertions.push({
890
+ targets, errorClasses, partitions, mode, operation,
891
+ iterationLiterals: referencedIterations.map((range) => range.literal).filter(Boolean).slice(0, 8),
892
+ iterationVariables: referencedIterations.map((range) => range.variable).filter(Boolean).slice(0, 8),
893
+ iterationBindings: referencedIterations.map((range) => ({ variable: range.variable, literal: range.literal }))
894
+ .filter((item) => item.variable && item.literal).slice(0, 8)
895
+ });
502
896
  };
503
897
  for (const match of testText.matchAll(/\b([a-z_$][a-z0-9_$]*)\.(?:throws|rejects)\s*\(/gi)) {
504
898
  if (!assertionCarriers.has(match[1].toLowerCase())) continue;
@@ -508,6 +902,14 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
508
902
  record(match.index, end, evidenceErrorClasses(end === -1 ? "" : testText.slice(match.index, end)), argumentsList[0]?.text,
509
903
  /\.rejects\s*\(/i.test(match[0]) ? "rejects" : "throws");
510
904
  }
905
+ if (includeSuccess) for (const match of testText.matchAll(/\b([a-z_$][a-z0-9_$]*)\.(doesnotthrow|deepequal|deepstrictequal|equal|strictequal|notequal|notstrictequal|ok)\s*\(/gi)) {
906
+ if (!assertionCarriers.has(match[1].toLowerCase())) continue;
907
+ const open = testText.indexOf("(", match.index);
908
+ const end = balancedEnd(testText, open);
909
+ const argumentsList = end === -1 ? [] : topLevelArgumentRanges(testText, open, end);
910
+ if (match[2].toLowerCase() !== "doesnotthrow" && /^(?:async\s*)?(?:function\b|(?:\([^)]*\)|[a-z_$][a-z0-9_$]*)\s*=>)/i.test(argumentsList[0]?.text ?? "")) continue;
911
+ record(match.index, end, [], argumentsList[0]?.text, "does-not-throw");
912
+ }
511
913
  for (const helper of rejectionAssertionHelpers(testText, assertionCarriers)) {
512
914
  for (const match of testText.matchAll(new RegExp(`\\b${escapeRegex(helper.name)}\\s*\\(`, "g"))) {
513
915
  if (match.index >= helper.start && match.index < helper.end) continue;
@@ -530,5 +932,5 @@ export function executableRejectionAssertions(testText, callableNames, modeHints
530
932
  record(match.index, end, evidenceErrorClasses(end === -1 ? "" : testText.slice(match.index, end)), argumentsList[0]?.text,
531
933
  /\.rejects/i.test(chain[0]) ? "rejects" : "throws");
532
934
  }
533
- return assertions.slice(0, 64);
935
+ return annotateInvalidArgumentCoverage(assertions).slice(0, 64);
534
936
  }