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