@piagent/platform 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +24 -15
- package/README.vi.md +36 -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 +27 -3
- package/benchmarks/production-v1/suite.json +5 -1
- 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 +16 -16
- package/docs/authority-manifest.md +1 -1
- package/docs/auto-delegation-policy.md +38 -73
- 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 +30 -35
- package/docs/context-engine.md +5 -3
- package/docs/context-window-policy.md +37 -1
- package/docs/distribution-standard.md +9 -9
- package/docs/en/architecture.md +26 -13
- package/docs/languages.json +4 -4
- package/docs/operator-manual-vietnamese.md +26 -46
- 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 +7 -0
- package/docs/quality-benchmark.md +299 -23
- 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/runtime-harness-standard.md +3 -3
- package/docs/security-threat-model.md +1 -1
- package/docs/subagent-orchestration-capabilities.md +19 -51
- package/docs/subagents-and-multiagent.md +21 -47
- package/docs/task-implementation-contract.md +3 -3
- package/docs/task-lifecycle-vietnamese.md +1 -1
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs/vi/architecture.md +26 -13
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +89 -95
- package/docs-site/commands.html +1 -1
- package/docs-site/content/benchmark.html +88 -94
- package/docs-site/content/en/benchmark.html +134 -90
- package/docs-site/content/en/index.html +19 -19
- package/docs-site/content/en/runtime.html +5 -5
- package/docs-site/content/en/whats-new.html +23 -1
- package/docs-site/content/en/workflows.html +2 -2
- package/docs-site/content/index.html +19 -19
- package/docs-site/content/runtime.html +6 -6
- package/docs-site/content/whats-new.html +23 -1
- package/docs-site/content/workflows.html +2 -2
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +135 -91
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +20 -20
- 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 +6 -6
- 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 +24 -2
- package/docs-site/en/workflows.html +3 -3
- package/docs-site/index.html +20 -20
- 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 +7 -7
- 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 +24 -2
- package/docs-site/workflows.html +3 -3
- 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-assurance-evidence.invalid.json +1 -1
- package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
- 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/codex-relative-efficiency-v1.invalid.json +4 -0
- package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -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/helper-request.invalid.json +1 -1
- package/evals/fixtures/helper-request.valid.json +1 -1
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -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/fixtures/task-authority-snapshot.valid.json +4 -4
- package/evals/fs4-readiness-matrix.v1.json +2 -2
- 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 +10 -6
- package/evals/fs5-pilot-protocol.v1.json +3 -3
- package/evals/fs5-pilot-protocol.v2.json +8 -8
- package/evals/fs5-pilot-protocol.v3.json +8 -8
- package/evals/fs5-pilot-protocol.v4.json +7 -7
- package/evals/fs5-pilot-protocol.v5.json +10 -8
- 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.v1.json +1 -1
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/evals/runtime-conformance-v1/README.md +43 -0
- package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
- package/evals/runtime-conformance-v1/lane.json +57 -0
- package/evals/runtime-conformance-v1/paid-canary.json +31 -0
- package/evals/runtime-conformance-v1/runner.mjs +456 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +15 -6
- 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 +699 -0
- 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 +111 -110
- 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 +67 -52
- 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 +70 -7
- 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 +462 -0
- 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 +343 -8
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
- 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-causal.js +244 -0
- 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 +246 -33
- 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 +232 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
- 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 +410 -37
- 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 +6 -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 +1000 -0
- 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 +208 -180
- 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 +12 -17
- package/packages/piagent-core/extensions/context-index-policy.js +4 -0
- package/packages/piagent-core/extensions/context-query-paths.js +57 -0
- package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
- package/packages/piagent-core/extensions/criterion-graph.js +4 -1
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
- package/packages/piagent-core/extensions/guard-types.ts +9 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
- 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-lifecycle.js +32 -0
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +140 -43
- 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 +109 -20
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
- 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 +43 -2
- package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
- package/packages/piagent-core/prompts/be-to-fe.md +2 -8
- package/packages/piagent-core/prompts/plan.md +1 -1
- package/packages/piagent-core/prompts/platform-improve.md +2 -6
- package/packages/piagent-core/prompts/review.md +2 -7
- package/packages/piagent-core/prompts/scout.md +1 -1
- package/packages/piagent-core/prompts/task.md +4 -3
- 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 +83 -89
- package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -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 +150 -19
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
- 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/hooks/tool-result-value-helpers.ts +66 -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/bounded-emission-guard.ts +286 -0
- package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
- 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/task-subagent-tree.ts +27 -4
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
- 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/orchestration/helper-lifecycle.ts +16 -12
- package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
- package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
- package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
- package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
- package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
- 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 +15 -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/edit-freshness-guard.ts +102 -0
- package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
- package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
- 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 +12 -3
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
- 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/pristine-task-policy-refresh.ts +91 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
- package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
- package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
- package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
- package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
- package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
- package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
- package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
- package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
- package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
- package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
- package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
- package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
- package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
- package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
- package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
- 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 +10 -9
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
- 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 +101 -0
- 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 +201 -0
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
- 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-core/subagents/piagent-oracle.md +5 -3
- package/packages/piagent-core/subagents/piagent-planner.md +6 -4
- package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
- package/packages/piagent-core/subagents/piagent-scout.md +4 -2
- package/packages/piagent-core/subagents/piagent-worker.md +6 -4
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.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 +13 -3
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
- package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
- 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 +170 -32
- 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-lifecycle.ts +237 -0
- package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
- 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 +118 -117
- package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
- package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
- 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 +150 -11
- 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/codex-relative-efficiency-v1.schema.json +155 -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 +46 -5
- 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/subagent-tree-v1.schema.json +11 -1
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/project-profile.schema.json +1 -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 +45 -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 +224 -387
- package/scripts/benchmark-runner-finalization.mjs +144 -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/configure-subagents.sh +42 -34
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/helper-evaluation.mjs +1 -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/team-doctor.sh +1 -1
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +41 -55
- package/scripts/verify-release-identity.mjs +5 -3
- package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { evidenceBooleanAlgebra, parseEvidenceStatements } from "./acceptance-expression-parser.js";
|
|
2
|
+
|
|
3
|
+
const term = (kind, ...values) => [kind, ...values];
|
|
4
|
+
const key = (value) => JSON.stringify(value);
|
|
5
|
+
const same = (left, right) => key(left) === key(right);
|
|
6
|
+
const number = (value) => term("number", value);
|
|
7
|
+
const part = (name) => term("part", name);
|
|
8
|
+
const INPUT = term("input"), UNDEFINED = term("undefined"), ZONE = part("zone");
|
|
9
|
+
const ABRUPT = term("abrupt");
|
|
10
|
+
const INTRINSIC_DATE_GET_TIME = ["member", ["member", ["member", ["id", "Date"], "prototype"], "getTime"], "call"];
|
|
11
|
+
const containsDateReference = (value) => /"(?:owned-date|date-view)"/.test(key(value));
|
|
12
|
+
const YEAR = part("year"), MONTH = part("month"), DAY = part("day");
|
|
13
|
+
const HOUR = part("hour"), MINUTE = part("minute"), SECOND = part("second");
|
|
14
|
+
const DAYS = part("days-in-month"), MILLISECOND = part("millisecond");
|
|
15
|
+
const OFFSET_HOUR = part("offset-hour"), OFFSET_MINUTE = part("offset-minute");
|
|
16
|
+
const RESERVED = /^(?:Date|Number|Math|TypeError|RegExp|NaN|undefined|arguments)$|^__pi_/;
|
|
17
|
+
const REGEX_FRACTIONS = new Map([
|
|
18
|
+
["__pi_strict_iso_timestamp_optional_seconds_capturing_fraction_regex_literal__", "digits"],
|
|
19
|
+
["__pi_strict_iso_timestamp_optional_seconds_dot_fraction_regex_literal__", "dot"]
|
|
20
|
+
]);
|
|
21
|
+
const LITERALS = new Map([
|
|
22
|
+
["__pi_empty_string_literal__", ""], ["__pi_zero_string_literal__", "0"], ["__pi_two_digit_zero_string_literal__", "00"],
|
|
23
|
+
["__pi_millisecond_padding_string_literal__", "000"], ["__pi_positive_sign_string_literal__", "+"],
|
|
24
|
+
["__pi_negative_sign_string_literal__", "-"],
|
|
25
|
+
["__pi_utc_z_string_literal__", "Z"], ["__pi_typeof_string_literal__", "string"],
|
|
26
|
+
["__pi_typeof_number_literal__", "number"]
|
|
27
|
+
]);
|
|
28
|
+
const fail = (reason = "unsupported-temporal-dataflow") => { throw new Error(reason); };
|
|
29
|
+
const leapYear = (year) => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
30
|
+
|
|
31
|
+
function proveTypeError(expression) {
|
|
32
|
+
if (expression[0] !== "new" || !same(expression[1], ["id", "TypeError"]) || expression[2].length > 1) fail("typeerror-rejection-unproven");
|
|
33
|
+
// Template markers deliberately retain no claim that interpolation is pure.
|
|
34
|
+
// Coercing an invalid Date can execute user code before TypeError exists.
|
|
35
|
+
if (expression[2].some((arg) => arg[0] !== "id" || !/^__pi_[a-z0-9_]*(?:string|number)_literal__$/.test(arg[1]))) fail("rejection-message-effect-unproven");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function temporalModel(mode, helperNames = {}, graph = new Map(), budget = { remaining: 15000 }, rules = {}) {
|
|
39
|
+
const logic = evidenceBooleanAlgebra();
|
|
40
|
+
const boolean = (value) => term("boolean", value);
|
|
41
|
+
const atom = (name) => logic.atom(name);
|
|
42
|
+
const isString = atom("input:string"), isDate = atom("input:date"), isNumber = atom("input:number");
|
|
43
|
+
const matched = atom("input:strict-iso-match"), dateFinite = atom("input:date-finite");
|
|
44
|
+
const omitted = atom("public:omitted-now"), noArguments = atom("public:no-arguments");
|
|
45
|
+
const zoneZ = atom("zone:Z"), zonePlus = logic.and(logic.not(zoneZ), atom("zone:positive"));
|
|
46
|
+
const zoneMinus = logic.and(logic.not(zoneZ), logic.not(zonePlus));
|
|
47
|
+
const dateValid = logic.and(isDate, dateFinite), numberValid = logic.and(isNumber, atom("input:number-finite"));
|
|
48
|
+
let assumptions = logic.not(logic.or(logic.and(isString, isDate), logic.and(isString, isNumber), logic.and(isDate, isNumber)));
|
|
49
|
+
assumptions = logic.and(assumptions, logic.or(logic.not(noArguments), omitted));
|
|
50
|
+
const asBoolean = (value) => value?.[0] === "boolean" ? value[1]
|
|
51
|
+
: value?.[0] === "match" ? matched : fail("unproven-temporal-condition");
|
|
52
|
+
function comparison(operator, left, right) {
|
|
53
|
+
if (operator === "!==") return logic.not(comparison("===", left, right));
|
|
54
|
+
if (operator === ">") return comparison("<", right, left);
|
|
55
|
+
if (operator === ">=") return comparison("<=", right, left);
|
|
56
|
+
if (operator === "<" && left[0] === "arguments-length" && same(right, number(2))) return omitted;
|
|
57
|
+
if (operator === "<") return logic.not(comparison("<=", right, left));
|
|
58
|
+
if (left[0] === "choose") return logic.or(logic.and(left[1], comparison(operator, left[2], right)), logic.and(logic.not(left[1]), comparison(operator, left[3], right)));
|
|
59
|
+
if (right[0] === "choose") return logic.or(logic.and(right[1], comparison(operator, left, right[2])), logic.and(logic.not(right[1]), comparison(operator, left, right[3])));
|
|
60
|
+
if (left[0] === "number" && right[0] === "number") return Number(operator === "<" ? left[1] < right[1] : operator === "<=" ? left[1] <= right[1] : left[1] === right[1]);
|
|
61
|
+
if (operator === "===") {
|
|
62
|
+
if (same(left, right)) return 1;
|
|
63
|
+
if (left[0] === "arguments-length" && same(right, number(1))) return logic.and(omitted, logic.not(noArguments));
|
|
64
|
+
if (left[0] === "arguments-length" && same(right, number(0))) return noArguments;
|
|
65
|
+
if (right[0] === "arguments-length") return comparison(operator, right, left);
|
|
66
|
+
if (left[0] === "typeof" && same(left[1], INPUT) && right[0] === "string") return right[1] === "string" ? isString : right[1] === "number" ? isNumber : fail();
|
|
67
|
+
if (right[0] === "typeof") return comparison(operator, right, left);
|
|
68
|
+
if (same(left, ZONE) && same(right, term("string", "Z"))) return zoneZ;
|
|
69
|
+
if (same(right, ZONE)) return comparison(operator, right, left);
|
|
70
|
+
if (left[0] === "zone-sign" && right[0] === "string") return right[1] === "+" ? zonePlus : right[1] === "-" ? zoneMinus : right[1] === "Z" ? zoneZ : fail();
|
|
71
|
+
if (right[0] === "zone-sign") return comparison(operator, right, left);
|
|
72
|
+
if (left[0] === "calendar-roundtrip" && same(right, left[2])) return atom(`roundtrip:${left[1]}`);
|
|
73
|
+
if (right[0] === "calendar-roundtrip") return comparison(operator, right, left);
|
|
74
|
+
if (left[0] === "optional-second" && same(right, UNDEFINED)) return atom("capture:second-missing");
|
|
75
|
+
if (left[0] === "optional-fraction" && same(right, UNDEFINED)) return atom("capture:fraction-missing");
|
|
76
|
+
}
|
|
77
|
+
return atom(key([operator, left, right]));
|
|
78
|
+
}
|
|
79
|
+
const arithmetic = (operator, left, right) => {
|
|
80
|
+
if (operator === "+" && same(left, term("fraction-digits")) && same(right, term("string", "000"))) return term("padded-fraction");
|
|
81
|
+
if (operator === "*" && same(left, number(60)) && same(right, OFFSET_HOUR)) return term("offset-hours-in-minutes");
|
|
82
|
+
if (operator === "*" && same(left, OFFSET_HOUR) && same(right, number(60))) return term("offset-hours-in-minutes");
|
|
83
|
+
if (operator === "+" && ((left[0] === "offset-hours-in-minutes" && same(right, OFFSET_MINUTE)) || (right[0] === "offset-hours-in-minutes" && same(left, OFFSET_MINUTE)))) return term("offset-minutes");
|
|
84
|
+
if (operator === "*" && left[0] === "signed-offset-minutes" && same(right, number(60000))) return term("signed-offset-milliseconds");
|
|
85
|
+
if (operator === "*" && right[0] === "signed-offset-minutes" && same(left, number(60000))) return term("signed-offset-milliseconds");
|
|
86
|
+
if (operator === "-" && left[0] === "local-milliseconds" && right[0] === "signed-offset-milliseconds") return term("iso-time");
|
|
87
|
+
return term("arithmetic", operator, left, right);
|
|
88
|
+
};
|
|
89
|
+
const modulo = (divisor) => arithmetic("%", YEAR, number(divisor));
|
|
90
|
+
const leap = logic.and(comparison("===", modulo(4), number(0)), logic.or(comparison("!==", modulo(100), number(0)), comparison("===", modulo(400), number(0))));
|
|
91
|
+
const calendarValid = logic.and(comparison("<=", number(1), MONTH), comparison("<=", MONTH, number(12)), comparison("<=", number(1), DAY), comparison("<=", DAY, DAYS), comparison("<=", HOUR, number(23)), comparison("<=", MINUTE, number(59)), comparison("<=", SECOND, number(59)));
|
|
92
|
+
const zoneValid = logic.or(zoneZ, logic.and(comparison("<=", OFFSET_HOUR, number(23)), comparison("<=", OFFSET_MINUTE, number(59))));
|
|
93
|
+
const stringValid = logic.and(isString, matched, calendarValid, zoneValid);
|
|
94
|
+
assumptions = logic.and(assumptions, logic.or(logic.not(calendarValid), comparison("<=", DAY, number(31))));
|
|
95
|
+
const implies = (path, required) => logic.implies(logic.and(assumptions, path), required);
|
|
96
|
+
const timeValid = logic.and(comparison("<=", HOUR, number(23)), comparison("<=", MINUTE, number(59)), comparison("<=", SECOND, number(59)));
|
|
97
|
+
const civilComponents = () => [YEAR, arithmetic("-", MONTH, number(1)), DAY, HOUR, MINUTE, SECOND, MILLISECOND];
|
|
98
|
+
const civilCalendar = (value) => value?.[0] === "civil-date" && same(value.slice(1), civilComponents());
|
|
99
|
+
function calendarRoundtrip(member, value, state) {
|
|
100
|
+
if (!civilCalendar(value) || !implies(state.path, timeValid)) fail("calendar-roundtrip-unproven");
|
|
101
|
+
const fields = { getUTCFullYear: ["year", YEAR], getUTCMonth: ["month", arithmetic("-", MONTH, number(1))], getUTCDate: ["day", DAY] };
|
|
102
|
+
if (!fields[member]) fail();
|
|
103
|
+
const allEqual = logic.and(...Object.values(fields).map(([name]) => atom(`roundtrip:${name}`)));
|
|
104
|
+
// Under bounded time fields, all three UTC calendar fields round-trip iff
|
|
105
|
+
// the requested civil date exists. Each equality alone is insufficient.
|
|
106
|
+
assumptions = logic.and(assumptions, logic.or(logic.not(allEqual), calendarValid), logic.or(logic.not(calendarValid), allEqual));
|
|
107
|
+
return term("calendar-roundtrip", ...fields[member]);
|
|
108
|
+
}
|
|
109
|
+
function linearTime(value, path, sign) {
|
|
110
|
+
const bounded = (coefficients, bound) => Number.isSafeInteger(bound) && bound <= Number.MAX_SAFE_INTEGER
|
|
111
|
+
&& [...coefficients.values()].every(Number.isSafeInteger) ? { coefficients, bound } : null;
|
|
112
|
+
const scalar = (value) => bounded(new Map(value === 0 ? [] : [["constant", value]]), Math.abs(value));
|
|
113
|
+
const variable = (name, bound) => bounded(new Map([[name, 1]]), bound);
|
|
114
|
+
const scale = (value, factor) => value && Number.isSafeInteger(factor)
|
|
115
|
+
? bounded(new Map([...value.coefficients].map(([name, coefficient]) => [name, coefficient * factor]).filter(([, coefficient]) => coefficient !== 0)), value.bound * Math.abs(factor)) : null;
|
|
116
|
+
const sum = (left, right) => {
|
|
117
|
+
if (!left || !right) return null;
|
|
118
|
+
const coefficients = new Map(left.coefficients);
|
|
119
|
+
for (const [name, coefficient] of right.coefficients) coefficients.set(name, (coefficients.get(name) ?? 0) + coefficient);
|
|
120
|
+
return bounded(new Map([...coefficients].filter(([, coefficient]) => coefficient !== 0)), left.bound + right.bound);
|
|
121
|
+
};
|
|
122
|
+
const constant = (value) => value && [...value.coefficients.keys()].every((name) => name === "constant") ? value.coefficients.get("constant") ?? 0 : null;
|
|
123
|
+
const cache = new Map();
|
|
124
|
+
const visit = (item) => {
|
|
125
|
+
if (++steps > 5000 || --budget.remaining < 0) fail("temporal-proof-complexity-limit");
|
|
126
|
+
if (cache.has(item)) return cache.get(item);
|
|
127
|
+
const result = calculate(item);
|
|
128
|
+
cache.set(item, result);
|
|
129
|
+
return result;
|
|
130
|
+
};
|
|
131
|
+
const calculate = (item) => {
|
|
132
|
+
if (item[0] === "number") return scalar(item[1]);
|
|
133
|
+
if (item[0] === "local-milliseconds") return variable("local", 400_000_000_000_000);
|
|
134
|
+
if (same(item, OFFSET_HOUR)) return variable("hour", 99);
|
|
135
|
+
if (same(item, OFFSET_MINUTE)) return variable("minute", 99);
|
|
136
|
+
if (item[0] === "offset-hours-in-minutes") return scale(variable("hour", 99), 60);
|
|
137
|
+
if (item[0] === "iso-time") return sum(variable("local", 400_000_000_000_000), scale(sum(scale(variable("hour", 99), 60), variable("minute", 99)), -sign * 60000));
|
|
138
|
+
if (["offset-minutes", "zone-offset-minutes", "signed-offset-minutes", "signed-offset-milliseconds"].includes(item[0])) {
|
|
139
|
+
const offset = sum(scale(variable("hour", 99), 60), variable("minute", 99));
|
|
140
|
+
return item[0] === "offset-minutes" ? offset : item[0] === "zone-offset-minutes" ? scale(offset, sign === 0 ? 0 : 1)
|
|
141
|
+
: scale(offset, sign * (item[0] === "signed-offset-milliseconds" ? 60000 : 1));
|
|
142
|
+
}
|
|
143
|
+
if (item[0] === "negative") return scale(visit(item[1]), -1);
|
|
144
|
+
if (item[0] === "choose") return implies(path, item[1]) ? visit(item[2]) : implies(path, logic.not(item[1])) ? visit(item[3]) : null;
|
|
145
|
+
if (item[0] !== "arithmetic") return null;
|
|
146
|
+
const left = visit(item[2]), right = visit(item[3]);
|
|
147
|
+
if (item[1] === "+") return sum(left, right);
|
|
148
|
+
if (item[1] === "-") return sum(left, scale(right, -1));
|
|
149
|
+
if (item[1] === "*") {
|
|
150
|
+
const leftConstant = constant(left), rightConstant = constant(right);
|
|
151
|
+
return leftConstant !== null ? scale(right, leftConstant) : rightConstant !== null ? scale(left, rightConstant) : null;
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
};
|
|
155
|
+
return visit(value);
|
|
156
|
+
}
|
|
157
|
+
function isIsoTime(value, path) {
|
|
158
|
+
if (value[0] === "iso-time") return true;
|
|
159
|
+
return [[zoneZ, 0], [zonePlus, 1], [zoneMinus, -1]].every(([zone, sign]) => {
|
|
160
|
+
const selected = logic.and(path, zone);
|
|
161
|
+
if (implies(selected, 0)) return true;
|
|
162
|
+
const actual = linearTime(value, selected, sign)?.coefficients;
|
|
163
|
+
const expected = new Map([["local", 1], ...sign === 0 ? [] : [["hour", -sign * 3_600_000], ["minute", -sign * 60_000]]]);
|
|
164
|
+
return actual && actual.size === expected.size && [...expected].every(([name, coefficient]) => actual.get(name) === coefficient);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function timeClipIsIdentity(value, path) {
|
|
168
|
+
// The affine model contains only finite integer atoms, and bounds every
|
|
169
|
+
// intermediate arithmetic result. TimeClip is identity only inside the
|
|
170
|
+
// actual Date range; finite/fractional/overflowing unknowns do not qualify.
|
|
171
|
+
return [[zoneZ, 0], [zonePlus, 1], [zoneMinus, -1]].every(([zone, sign]) => {
|
|
172
|
+
const selected = logic.and(path, zone);
|
|
173
|
+
if (implies(selected, 0)) return true;
|
|
174
|
+
const result = linearTime(value, selected, sign);
|
|
175
|
+
return result !== null && result.bound <= 8_640_000_000_000_000;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function dateTimestamp(receiver, state) {
|
|
179
|
+
if (same(receiver, INPUT)) {
|
|
180
|
+
if (!implies(state.path, isDate)) fail("date-input-type-unproven");
|
|
181
|
+
return term("date-time");
|
|
182
|
+
}
|
|
183
|
+
if (receiver[0] === "date-view") return receiver[1];
|
|
184
|
+
if (receiver[0] !== "owned-date") fail("date-read-provenance-unproven");
|
|
185
|
+
const value = state.heap.get(receiver[1]);
|
|
186
|
+
if (value?.[0] === "timeclipped-date") return value[1];
|
|
187
|
+
if (value?.[0] === "proleptic-utc" || civilCalendar(value)) return term("local-milliseconds");
|
|
188
|
+
fail("proleptic-year-unproven");
|
|
189
|
+
}
|
|
190
|
+
function choose(condition, yes, no, path = 1) {
|
|
191
|
+
if (condition === 1 || same(yes, no)) return yes;
|
|
192
|
+
if (condition === 0) return no;
|
|
193
|
+
if (condition === atom("capture:second-missing") && same(yes, number(0)) && no[0] === "optional-second-number") return SECOND;
|
|
194
|
+
if (condition === atom("capture:second-missing") && same(yes, term("string", "00")) && no[0] === "optional-second") return term("capture", "second");
|
|
195
|
+
if (condition === atom("capture:fraction-missing") && same(yes, term("string", "")) && no[0] === "optional-fraction") return term(no[1] === "dot" ? "fraction-dot" : "fraction-digits");
|
|
196
|
+
if (condition === atom("capture:fraction-missing") && same(yes, number(0)) && same(no, MILLISECOND)) return MILLISECOND;
|
|
197
|
+
if (condition === logic.and(comparison("===", MONTH, number(2)), leap) && same(yes, number(29)) && no[0] === "nonleap-month-days") return DAYS;
|
|
198
|
+
if (condition === zoneZ && same(yes, number(0)) && no[0] === "offset-minutes") return term("zone-offset-minutes");
|
|
199
|
+
if (condition === zonePlus && ["offset-minutes", "zone-offset-minutes"].includes(yes[0]) && same(no, term("negative", yes))) return term("signed-offset-minutes");
|
|
200
|
+
if (mode === "public" && yes[0] === "clock" && no[0] === "current-time"
|
|
201
|
+
&& implies(path, logic.or(logic.and(condition, omitted), logic.and(logic.not(condition), logic.not(omitted))))) return term("current-time");
|
|
202
|
+
return term("choose", condition, yes, no);
|
|
203
|
+
}
|
|
204
|
+
const captures = (match, slot, state) => {
|
|
205
|
+
if (match?.[0] !== "match" || !implies(state.path, matched)) fail("iso-capture-provenance-unproven");
|
|
206
|
+
if (slot >= 1 && slot <= 5) return term("capture", ["year", "month", "day", "hour", "minute"][slot - 1]);
|
|
207
|
+
if (slot === 6) return term("optional-second");
|
|
208
|
+
if (slot === 7) return term("optional-fraction", match[1]);
|
|
209
|
+
if (slot === 8) return ZONE;
|
|
210
|
+
fail("iso-capture-topology-unproven");
|
|
211
|
+
};
|
|
212
|
+
const defaulted = (value, fallback) => {
|
|
213
|
+
if (value[0] === "optional-second" && (same(fallback, term("string", "00")) || same(fallback, number(0)))) return term("capture", "second");
|
|
214
|
+
if (value[0] === "optional-fraction" && same(fallback, term("string", ""))) return term(value[1] === "dot" ? "fraction-dot" : "fraction-digits");
|
|
215
|
+
fail("iso-capture-default-unproven");
|
|
216
|
+
};
|
|
217
|
+
let allocations = 0, steps = 0, expiryCoverage = 0, nowCoverage = 0, clockCoverage = 0;
|
|
218
|
+
const visited = new Set();
|
|
219
|
+
const visitedTrees = new Set(), frames = [];
|
|
220
|
+
const branch = (state, condition, expression) => {
|
|
221
|
+
const selected = clone(state, condition);
|
|
222
|
+
return { state: selected, value: evaluate(expression, selected) };
|
|
223
|
+
};
|
|
224
|
+
const publicArgument = (value, path) => {
|
|
225
|
+
if (value[0] === "choose") return publicArgument(value[2], logic.and(path, value[1])) && publicArgument(value[3], logic.and(path, logic.not(value[1])));
|
|
226
|
+
return value[0] === "clock" ? implies(path, omitted) : value[0] === "now-input" && implies(path, logic.not(omitted));
|
|
227
|
+
};
|
|
228
|
+
const missingNowCall = (value, path) => value[0] === "choose"
|
|
229
|
+
? logic.or(missingNowCall(value[2], logic.and(path, value[1])), missingNowCall(value[3], logic.and(path, logic.not(value[1]))))
|
|
230
|
+
: value[0] === "now-input" ? logic.and(path, noArguments) : 0;
|
|
231
|
+
const cover = (previous, path) => { if (!implies(logic.and(previous, path), 0)) fail("duplicate-temporal-effect"); return logic.or(previous, path); };
|
|
232
|
+
function evaluate(node, state) {
|
|
233
|
+
if (++steps > 5000 || --budget.remaining < 0) fail("temporal-proof-complexity-limit");
|
|
234
|
+
// A proven abrupt callee has no normal value. In particular its caller
|
|
235
|
+
// must not evaluate the remainder of a binary expression or argument list.
|
|
236
|
+
if (state.path === 0) return ABRUPT;
|
|
237
|
+
const [kind, a, b, c] = node;
|
|
238
|
+
if (kind === "number") return node;
|
|
239
|
+
if (kind === "id") {
|
|
240
|
+
if (state.env.has(a)) return state.env.get(a);
|
|
241
|
+
if (LITERALS.has(a)) return term("string", LITERALS.get(a));
|
|
242
|
+
if (REGEX_FRACTIONS.has(a)) return term("regex", REGEX_FRACTIONS.get(a));
|
|
243
|
+
if (/^__pi_[a-z0-9_]*string_literal__$/.test(a)) return term("static-message");
|
|
244
|
+
if (a === "arguments" && (mode !== "public" || frames.length > 0)) fail("helper-arguments-unproven");
|
|
245
|
+
if (["Date", "Number", "Math", "TypeError", "arguments"].includes(a)) return term("intrinsic", a);
|
|
246
|
+
if (a === "undefined") return UNDEFINED;
|
|
247
|
+
if (a === "true" || a === "false") return boolean(Number(a === "true"));
|
|
248
|
+
fail("unbound-temporal-identifier");
|
|
249
|
+
}
|
|
250
|
+
if (kind === "unary") {
|
|
251
|
+
const value = evaluate(b, state);
|
|
252
|
+
return a === "!" ? boolean(logic.not(asBoolean(value))) : a === "typeof" ? term("typeof", value) : term("negative", value);
|
|
253
|
+
}
|
|
254
|
+
if (kind === "binary") {
|
|
255
|
+
const left = evaluate(b, state);
|
|
256
|
+
if (state.path === 0) return ABRUPT;
|
|
257
|
+
if (a === "??") {
|
|
258
|
+
if (!["optional-second", "optional-fraction"].includes(left[0])) fail("nullish-capture-provenance-unproven");
|
|
259
|
+
// These captures are strings or undefined, never null. Evaluate the
|
|
260
|
+
// fallback only on the missing branch, preserving abrupt completion.
|
|
261
|
+
const missing = atom(`capture:${left[0] === "optional-second" ? "second" : "fraction"}-missing`);
|
|
262
|
+
const present = defaulted(left, left[0] === "optional-second" ? number(0) : term("string", ""));
|
|
263
|
+
const right = branch(state, missing, c);
|
|
264
|
+
state.path = logic.or(logic.and(state.path, logic.not(missing)), right.state.path);
|
|
265
|
+
return right.state.path === 0 ? present : defaulted(left, right.value);
|
|
266
|
+
}
|
|
267
|
+
if (a === "&&" || a === "||") {
|
|
268
|
+
const condition = asBoolean(left), selected = a === "&&" ? condition : logic.not(condition);
|
|
269
|
+
const right = branch(state, selected, c);
|
|
270
|
+
state.path = logic.or(logic.and(state.path, logic.not(selected)), right.state.path);
|
|
271
|
+
const rightCondition = right.state.path === 0 ? 0 : asBoolean(right.value);
|
|
272
|
+
return boolean(a === "&&" ? logic.and(condition, rightCondition) : logic.or(condition, rightCondition));
|
|
273
|
+
}
|
|
274
|
+
const right = evaluate(c, state);
|
|
275
|
+
if (state.path === 0) return ABRUPT;
|
|
276
|
+
if (a === "instanceof") return !same(right, term("intrinsic", "Date")) ? fail() : same(left, INPUT) ? boolean(isDate)
|
|
277
|
+
: ["owned-date", "date-view"].includes(left[0]) ? boolean(1) : fail();
|
|
278
|
+
return ["===", "!==", "<", "<=", ">", ">="].includes(a) ? boolean(comparison(a, left, right)) : arithmetic(a, left, right);
|
|
279
|
+
}
|
|
280
|
+
if (kind === "select") {
|
|
281
|
+
const condition = asBoolean(evaluate(a, state));
|
|
282
|
+
const yes = branch(state, condition, b), no = branch(state, logic.not(condition), c);
|
|
283
|
+
state.path = logic.or(yes.state.path, no.state.path);
|
|
284
|
+
if (yes.state.path === 0) return no.value;
|
|
285
|
+
if (no.state.path === 0) return yes.value;
|
|
286
|
+
return choose(condition, yes.value, no.value, state.path);
|
|
287
|
+
}
|
|
288
|
+
if (kind === "array") return term("array", a.map((item) => evaluate(item, state)));
|
|
289
|
+
if (kind === "index") {
|
|
290
|
+
const base = evaluate(a, state), index = evaluate(b, state);
|
|
291
|
+
if (base[0] === "match" && index[0] === "number") return captures(base, index[1], state);
|
|
292
|
+
if (same(base, ZONE) && same(index, number(0))) return term("zone-sign");
|
|
293
|
+
const table = [31, choose(leap, number(29), number(28)), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].map((value) => typeof value === "number" ? number(value) : value);
|
|
294
|
+
if (same(base, term("array", table)) && same(index, arithmetic("-", MONTH, number(1)))) return DAYS;
|
|
295
|
+
fail("calendar-binding-unproven");
|
|
296
|
+
}
|
|
297
|
+
if (kind === "member") {
|
|
298
|
+
if (same(evaluate(a, state), term("intrinsic", "arguments")) && b === "length") return term("arguments-length");
|
|
299
|
+
fail();
|
|
300
|
+
}
|
|
301
|
+
if (kind === "new") {
|
|
302
|
+
if (!same(evaluate(a, state), term("intrinsic", "Date")) || b.length !== 1) fail();
|
|
303
|
+
const value = evaluate(b[0], state);
|
|
304
|
+
if (state.path === 0) return ABRUPT;
|
|
305
|
+
const initial = value[0] === "utc" ? value : same(value, number(0)) ? term("civil-date", ...[1970, 0, 1, 0, 0, 0, 0].map(number))
|
|
306
|
+
: timeClipIsIdentity(value, state.path) ? term("timeclipped-date", value) : fail("date-timeclip-unproven");
|
|
307
|
+
const id = ++allocations; state.heap.set(id, initial); return term("owned-date", id);
|
|
308
|
+
}
|
|
309
|
+
if (kind !== "call") fail();
|
|
310
|
+
if (same(a, INTRINSIC_DATE_GET_TIME)) {
|
|
311
|
+
if (b.length !== 1) fail("intrinsic-date-read-arity-unproven");
|
|
312
|
+
const receiver = evaluate(b[0], state);
|
|
313
|
+
return state.path === 0 ? ABRUPT : dateTimestamp(receiver, state);
|
|
314
|
+
}
|
|
315
|
+
if (a[0] === "id" && Object.values(helperNames).includes(a[1])) {
|
|
316
|
+
if (b.length !== 1) fail();
|
|
317
|
+
const value = evaluate(b[0], state);
|
|
318
|
+
if (a[1] === helperNames.expiry) {
|
|
319
|
+
if (mode === "now") {
|
|
320
|
+
if (!same(value, INPUT) || !implies(state.path, isDate)) fail("date-delegation-unproven");
|
|
321
|
+
state.path = logic.and(state.path, dateFinite);
|
|
322
|
+
return term("date-time");
|
|
323
|
+
}
|
|
324
|
+
if (value[0] !== "expiry-input") fail("expiry-input-provenance-unproven");
|
|
325
|
+
expiryCoverage = cover(expiryCoverage, state.path);
|
|
326
|
+
// The proven expiry normalizer throws on undefined. Consequently an
|
|
327
|
+
// invocation with no arguments cannot continue beyond this call.
|
|
328
|
+
state.path = logic.and(state.path, logic.not(noArguments));
|
|
329
|
+
return term("expiry-time");
|
|
330
|
+
}
|
|
331
|
+
// A proven current-time normalizer rejects the absent second input when
|
|
332
|
+
// called before expiry normalization. This abrupt path has no later
|
|
333
|
+
// clock read or expiry call; explicit undefined is never a clock fallback.
|
|
334
|
+
state.path = logic.and(state.path, logic.not(missingNowCall(value, state.path)));
|
|
335
|
+
if (state.path === 0) return ABRUPT;
|
|
336
|
+
if (!publicArgument(value, state.path)) fail("explicit-now-provenance-unproven");
|
|
337
|
+
nowCoverage = cover(nowCoverage, state.path); return term("current-time");
|
|
338
|
+
}
|
|
339
|
+
if (a[0] === "id" && graph.has(a[1])) {
|
|
340
|
+
if (mode === "public" || b.length !== 1) fail("unproven-temporal-helper-call");
|
|
341
|
+
const value = evaluate(b[0], state);
|
|
342
|
+
if (state.path === 0) return ABRUPT;
|
|
343
|
+
// A closed synchronous reader receives an immutable timestamp view, not
|
|
344
|
+
// the caller's heap. No setter or reference return accepts that view.
|
|
345
|
+
const argument = value[0] === "owned-date" ? term("date-view", dateTimestamp(value, state)) : value;
|
|
346
|
+
if (containsDateReference(argument) && argument[0] !== "date-view") fail("temporal-helper-owned-escape");
|
|
347
|
+
const { callable, ast } = graph.get(a[1]);
|
|
348
|
+
if (frames.includes(a[1]) || frames.length >= 8) fail("cyclic-temporal-helper");
|
|
349
|
+
const callee = { path: state.path, env: new Map(), heap: new Map() };
|
|
350
|
+
bind(callee, callable.exactParameters[0], argument);
|
|
351
|
+
frames.push(a[1]); visitedTrees.add(ast);
|
|
352
|
+
let results;
|
|
353
|
+
try { results = execute(ast, [callee]); } finally { frames.pop(); }
|
|
354
|
+
let normal = 0, returned = ABRUPT;
|
|
355
|
+
for (const result of results) {
|
|
356
|
+
if (result.path === 0) continue;
|
|
357
|
+
if (!result.terminal) fail("unterminated-temporal-helper");
|
|
358
|
+
if (result.terminal === "throw") continue;
|
|
359
|
+
if (containsDateReference(result.value)) fail("temporal-helper-owned-escape");
|
|
360
|
+
returned = normal === 0 ? result.value : choose(result.path, result.value, returned);
|
|
361
|
+
normal = logic.or(normal, result.path);
|
|
362
|
+
}
|
|
363
|
+
state.path = normal;
|
|
364
|
+
return returned;
|
|
365
|
+
}
|
|
366
|
+
if (a[0] === "id" && a[1] === "Number") {
|
|
367
|
+
if (b.length !== 1) fail();
|
|
368
|
+
const value = evaluate(b[0], state);
|
|
369
|
+
if (value[0] === "capture") return part(value[1]);
|
|
370
|
+
if (value[0] === "optional-second") return term("optional-second-number");
|
|
371
|
+
if (value[0] === "offset-hour-text") return OFFSET_HOUR;
|
|
372
|
+
if (value[0] === "offset-minute-text") return OFFSET_MINUTE;
|
|
373
|
+
if (value[0] === "millisecond-text") return MILLISECOND;
|
|
374
|
+
fail("numeric-capture-provenance-unproven");
|
|
375
|
+
}
|
|
376
|
+
if (a[0] !== "member") fail();
|
|
377
|
+
const receiver = evaluate(a[1], state), member = a[2], args = b.map((item) => evaluate(item, state));
|
|
378
|
+
if (receiver[0] === "intrinsic") {
|
|
379
|
+
if (receiver[1] === "Number" && ["isFinite", "isNaN"].includes(member) && args.length === 1) {
|
|
380
|
+
if (same(args[0], INPUT) && member === "isFinite") return boolean(numberValid);
|
|
381
|
+
if (args[0][0] === "date-time") return boolean(member === "isFinite" ? dateFinite : logic.not(dateFinite));
|
|
382
|
+
if (same(args[0], MILLISECOND) && member === "isFinite") return boolean(1);
|
|
383
|
+
if (isIsoTime(args[0], state.path)) {
|
|
384
|
+
const finite = atom("parse:finite");
|
|
385
|
+
assumptions = logic.and(assumptions, logic.or(logic.not(stringValid), finite));
|
|
386
|
+
return boolean(member === "isFinite" ? finite : logic.not(finite));
|
|
387
|
+
}
|
|
388
|
+
if (timeClipIsIdentity(args[0], state.path)) return boolean(Number(member === "isFinite"));
|
|
389
|
+
}
|
|
390
|
+
if (receiver[1] === "Math" && member === "trunc" && args.length === 1 && same(args[0], MILLISECOND)) return MILLISECOND;
|
|
391
|
+
if (receiver[1] === "Date" && member === "parse" && args.length === 1 && same(args[0], INPUT)) return term("iso-time");
|
|
392
|
+
if (receiver[1] === "Date" && member === "UTC" && [3, 7].includes(args.length)) return term("utc", ...args);
|
|
393
|
+
if (receiver[1] === "Date" && member === "now" && args.length === 0 && mode === "public") {
|
|
394
|
+
if (!implies(state.path, omitted)) fail("eager-clock-fallback-unproven");
|
|
395
|
+
if (rules.expiryBeforeClock && !implies(state.path, expiryCoverage)) fail("clock-before-expiry-validation");
|
|
396
|
+
clockCoverage = cover(clockCoverage, state.path); return term("clock");
|
|
397
|
+
}
|
|
398
|
+
fail();
|
|
399
|
+
}
|
|
400
|
+
if (member === "exec" && receiver[0] === "regex" && args.length === 1 && same(args[0], INPUT)) {
|
|
401
|
+
if (!implies(state.path, isString)) fail("iso-input-type-unproven");
|
|
402
|
+
return term("match", receiver[1]);
|
|
403
|
+
}
|
|
404
|
+
if (member === "match" && same(receiver, INPUT) && args.length === 1 && args[0][0] === "regex") {
|
|
405
|
+
if (!implies(state.path, isString)) fail("iso-input-type-unproven");
|
|
406
|
+
return term("match", args[0][1]);
|
|
407
|
+
}
|
|
408
|
+
if (member === "getTime" && args.length === 0) return dateTimestamp(receiver, state);
|
|
409
|
+
if (receiver[0] === "owned-date") {
|
|
410
|
+
const value = state.heap.get(receiver[1]);
|
|
411
|
+
if (["getUTCFullYear", "getUTCMonth", "getUTCDate"].includes(member) && args.length === 0 && value?.[0] === "civil-date") return calendarRoundtrip(member, value, state);
|
|
412
|
+
if (member === "getUTCDate" && args.length === 0 && value.length === 4 && value[1][0] === "number" && value[1][1] >= 100 && value[1][1] <= 9999 && !leapYear(value[1][1]) && same(value[2], MONTH) && same(value[3], number(0))) return term("nonleap-month-days");
|
|
413
|
+
fail("proleptic-year-unproven");
|
|
414
|
+
}
|
|
415
|
+
if (member === "slice") {
|
|
416
|
+
if (same(receiver, ZONE) && same(args, [number(1), number(3)])) return term("offset-hour-text");
|
|
417
|
+
if (same(receiver, ZONE) && (same(args, [number(4)]) || same(args, [number(4), number(6)]))) return term("offset-minute-text");
|
|
418
|
+
if (receiver[0] === "fraction-dot" && same(args, [number(1)])) return term("fraction-digits");
|
|
419
|
+
if (receiver[0] === "padded-fraction" && same(args, [number(0), number(3)])) return term("millisecond-text");
|
|
420
|
+
if ((receiver[0] === "fraction-digits" || (receiver[0] === "optional-fraction" && receiver[1] === "digits"
|
|
421
|
+
&& implies(state.path, logic.not(atom("capture:fraction-missing")))))
|
|
422
|
+
&& same(args, [number(0), number(3)])) return term("millisecond-prefix");
|
|
423
|
+
fail("zone-or-fraction-capture-unproven");
|
|
424
|
+
}
|
|
425
|
+
if (member === "padEnd" && receiver[0] === "millisecond-prefix" && same(args, [number(3), term("string", "0")])) return term("millisecond-text");
|
|
426
|
+
if (member === "startsWith" && same(receiver, ZONE) && args.length === 1 && args[0][0] === "string") {
|
|
427
|
+
if (args[0][1] === "+") return boolean(zonePlus);
|
|
428
|
+
if (args[0][1] === "-") return boolean(zoneMinus);
|
|
429
|
+
}
|
|
430
|
+
fail();
|
|
431
|
+
}
|
|
432
|
+
const bind = (state, name, value) => {
|
|
433
|
+
if (RESERVED.test(name) || [...graph.keys(), ...Object.values(helperNames)].some((known) => known.toLowerCase() === name.toLowerCase()) || [...state.env.keys()].some((known) => known.toLowerCase() === name.toLowerCase())) fail("temporal-binding-collision");
|
|
434
|
+
state.env.set(name, value);
|
|
435
|
+
};
|
|
436
|
+
const clone = (state, condition) => ({ ...state, env: new Map(state.env), heap: new Map(state.heap), path: logic.and(state.path, condition) });
|
|
437
|
+
function execute(statements, states) {
|
|
438
|
+
for (const statement of statements) {
|
|
439
|
+
const next = [];
|
|
440
|
+
for (const state of states) {
|
|
441
|
+
if (state.terminal || state.path === 0) { next.push(state); continue; }
|
|
442
|
+
visited.add(statement);
|
|
443
|
+
const [kind, a, b, c] = statement;
|
|
444
|
+
if (kind === "block") { next.push(...execute(a, [state])); continue; }
|
|
445
|
+
if (kind === "if") {
|
|
446
|
+
const condition = asBoolean(evaluate(a, state));
|
|
447
|
+
next.push(...execute([b], [clone(state, condition)]), ...execute([c], [clone(state, logic.not(condition))]));
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
if (kind === "const") {
|
|
451
|
+
for (const [binding, expression] of a) {
|
|
452
|
+
const value = evaluate(expression, state);
|
|
453
|
+
if (state.path === 0) break;
|
|
454
|
+
if (binding[0] === "bind") bind(state, binding[1], value);
|
|
455
|
+
else binding[1].forEach((slot, index) => {
|
|
456
|
+
if (slot) bind(state, slot[0], slot[1] ? defaulted(captures(value, index, state), evaluate(slot[1], state)) : captures(value, index, state));
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
} else if (kind === "return") { state.terminal = "return"; state.value = evaluate(a, state); }
|
|
460
|
+
else if (kind === "throw") {
|
|
461
|
+
proveTypeError(a);
|
|
462
|
+
state.terminal = "throw";
|
|
463
|
+
} else if (kind === "expression") {
|
|
464
|
+
if (a[0] === "call" && a[1][0] === "id" && graph.has(a[1][1])) {
|
|
465
|
+
evaluate(a, state);
|
|
466
|
+
if (state.path !== 0) fail("discarded-temporal-helper-return");
|
|
467
|
+
next.push(state); continue;
|
|
468
|
+
}
|
|
469
|
+
if (a[0] !== "call" || a[1][0] !== "member") fail("unapproved-temporal-effect");
|
|
470
|
+
const receiver = evaluate(a[1][1], state), args = a[2].map((item) => evaluate(item, state)), value = state.heap.get(receiver[1]);
|
|
471
|
+
if (receiver[0] !== "owned-date") fail("owned-date-effect-unproven");
|
|
472
|
+
if (value?.[0] === "civil-date") {
|
|
473
|
+
// Every intermediate effect must be modeled: an overflowing or
|
|
474
|
+
// TimeClipping setter cannot disappear behind a later overwrite.
|
|
475
|
+
if (a[1][2] === "setUTCFullYear" && same(args, civilComponents().slice(0, 3))) state.heap.set(receiver[1], term("civil-date", ...args, ...value.slice(4)));
|
|
476
|
+
else if (a[1][2] === "setUTCHours" && same(args, civilComponents().slice(3)) && implies(state.path, timeValid)) state.heap.set(receiver[1], term("civil-date", ...value.slice(1, 4), ...args));
|
|
477
|
+
else fail("unapproved-temporal-effect");
|
|
478
|
+
next.push(state); continue;
|
|
479
|
+
}
|
|
480
|
+
if (a[1][2] !== "setUTCFullYear" || args.length !== 1) fail("unapproved-temporal-effect");
|
|
481
|
+
const year = args[0];
|
|
482
|
+
const calendarArgs = [arithmetic("-", MONTH, number(1)), DAY, HOUR, MINUTE, SECOND, MILLISECOND];
|
|
483
|
+
if (receiver[0] !== "owned-date" || value?.[0] !== "utc" || value[1]?.[0] !== "number" || value[1][1] < 100 || value[1][1] > 9999 || !leapYear(value[1][1]) || !same(value.slice(2), calendarArgs) || !same(year, YEAR)) fail("proleptic-year-unproven");
|
|
484
|
+
state.heap.set(receiver[1], term("proleptic-utc", ...calendarArgs));
|
|
485
|
+
} else fail();
|
|
486
|
+
next.push(state);
|
|
487
|
+
}
|
|
488
|
+
states = next;
|
|
489
|
+
if (states.length > 128) fail("temporal-proof-complexity-limit");
|
|
490
|
+
}
|
|
491
|
+
return states;
|
|
492
|
+
}
|
|
493
|
+
function prove(callable) {
|
|
494
|
+
const parameters = callable.exactParameters;
|
|
495
|
+
const ast = graph.get(callable.exactDeclarationName)?.ast ?? parseEvidenceStatements(callable.exactBody);
|
|
496
|
+
visitedTrees.add(ast);
|
|
497
|
+
const state = { path: 1, env: new Map(parameters.map((name, index) => [name, mode === "public" ? term(index === 0 ? "expiry-input" : "now-input") : INPUT])), heap: new Map() };
|
|
498
|
+
const results = execute(ast, [state]).filter((item) => item.path !== 0);
|
|
499
|
+
let success = 0;
|
|
500
|
+
const splitReturns = (result) => result.terminal === "return" && result.value[0] === "choose"
|
|
501
|
+
? [...splitReturns({ ...result, path: logic.and(result.path, result.value[1]), value: result.value[2] }),
|
|
502
|
+
...splitReturns({ ...result, path: logic.and(result.path, logic.not(result.value[1])), value: result.value[3] })]
|
|
503
|
+
: result.path === 0 ? [] : [result];
|
|
504
|
+
for (const result of results.flatMap(splitReturns)) {
|
|
505
|
+
if (!result.terminal) fail("unterminated-temporal-path");
|
|
506
|
+
if (result.terminal === "throw") { if (mode === "public") fail(); continue; }
|
|
507
|
+
let domain;
|
|
508
|
+
if (mode === "public") {
|
|
509
|
+
const expected = boolean(comparison("<=", term("expiry-time"), term("current-time")));
|
|
510
|
+
if (!same(result.value, expected)) fail("inclusive-temporal-return-unproven");
|
|
511
|
+
domain = 1;
|
|
512
|
+
} else if (result.value[0] === "date-time") domain = dateValid;
|
|
513
|
+
else if (mode === "expiry" && isIsoTime(result.value, result.path)) domain = stringValid;
|
|
514
|
+
else if (mode === "now" && same(result.value, INPUT)) domain = numberValid;
|
|
515
|
+
else fail(mode === "expiry" && timeClipIsIdentity(result.value, result.path) ? "iso-offset-arithmetic-unproven" : "temporal-return-provenance-unproven");
|
|
516
|
+
if (!implies(result.path, domain)) fail(mode === "expiry" ? "calendar-or-zone-validation-unproven" : "finite-now-validation-unproven");
|
|
517
|
+
success = logic.or(success, result.path);
|
|
518
|
+
}
|
|
519
|
+
const expected = mode === "public" ? logic.not(noArguments) : logic.or(dateValid, mode === "expiry" ? stringValid : numberValid);
|
|
520
|
+
if (!implies(expected, success)) fail("valid-temporal-input-rejected");
|
|
521
|
+
if (mode === "public" && (!implies(logic.not(noArguments), expiryCoverage) || !implies(logic.not(omitted), nowCoverage) || !implies(logic.and(omitted, logic.not(noArguments)), clockCoverage))) fail("public-temporal-normalization-unproven");
|
|
522
|
+
const everyStatementVisited = (items) => items.every((item) => (visited.has(item) || (item[0] === "block" && item[1].length === 0)) && (item[0] !== "block" || everyStatementVisited(item[1])) && (item[0] !== "if" || everyStatementVisited([item[2], item[3]])));
|
|
523
|
+
if (![...visitedTrees].every(everyStatementVisited)) fail("unreachable-temporal-statement");
|
|
524
|
+
return new Set([...graph].filter(([, entry]) => visitedTrees.has(entry.ast)).map(([name]) => name));
|
|
525
|
+
}
|
|
526
|
+
return { prove };
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Closed temporal helpers are proved by dataflow and all Boolean paths. Capture
|
|
531
|
+
* topology, calendar bounds, proleptic reconstruction, error class and lazy
|
|
532
|
+
* omission handling are independent obligations, not a source-text template.
|
|
533
|
+
*/
|
|
534
|
+
export function temporalDataflowModuleProof(bodies, publicName, rules = {}) {
|
|
535
|
+
try {
|
|
536
|
+
const declarations = bodies.exactDeclarations ?? [];
|
|
537
|
+
if (declarations.some((item) => RESERVED.test(item.name))) fail("temporal-binding-collision");
|
|
538
|
+
if (declarations.length < 3 || declarations.length > 9) fail("closed-temporal-module-unproven");
|
|
539
|
+
const graph = new Map(declarations.map((item) => {
|
|
540
|
+
const callable = bodies.get(item.name.toLowerCase());
|
|
541
|
+
return [item.name, { callable, ast: parseEvidenceStatements(callable.exactBody), edges: new Set() }];
|
|
542
|
+
}));
|
|
543
|
+
let nodes = 0;
|
|
544
|
+
const budget = { remaining: 15000 };
|
|
545
|
+
const walk = (node, action) => {
|
|
546
|
+
if (!Array.isArray(node)) return;
|
|
547
|
+
if (++nodes > 5000) fail("temporal-proof-complexity-limit");
|
|
548
|
+
action(node); for (const child of node) walk(child, action);
|
|
549
|
+
};
|
|
550
|
+
for (const entry of graph.values()) walk(entry.ast, (node) => {
|
|
551
|
+
if (node[0] === "throw") proveTypeError(node[1]);
|
|
552
|
+
if (node[0] === "call" && node[1][0] === "id" && graph.has(node[1][1])) {
|
|
553
|
+
if (node[2].length !== 1) fail("unproven-temporal-helper-call");
|
|
554
|
+
entry.edges.add(node[1][1]);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
const reached = new Set(), active = new Set();
|
|
558
|
+
const visit = (name) => {
|
|
559
|
+
if (active.has(name)) fail("cyclic-temporal-helper");
|
|
560
|
+
if (reached.has(name)) return;
|
|
561
|
+
active.add(name); reached.add(name);
|
|
562
|
+
for (const edge of graph.get(name).edges) visit(edge);
|
|
563
|
+
active.delete(name);
|
|
564
|
+
};
|
|
565
|
+
visit(publicName);
|
|
566
|
+
if (reached.size !== graph.size) fail("unreachable-temporal-helper");
|
|
567
|
+
const helpers = [...graph.values()].map((item) => item.callable).filter((item) => item.exactDeclarationName !== publicName);
|
|
568
|
+
const requireClosedCoverage = (...coverages) => {
|
|
569
|
+
const covered = new Set(coverages.flatMap((coverage) => [...coverage]));
|
|
570
|
+
if ([...graph.keys()].some((name) => !covered.has(name))) fail("unreachable-temporal-helper");
|
|
571
|
+
};
|
|
572
|
+
const directParsers = helpers.filter((item) => [...REGEX_FRACTIONS.keys()].some((regex) => item.exactBody.includes(regex)));
|
|
573
|
+
// Preserve precise diagnostics for the original closed two-helper surface.
|
|
574
|
+
if (helpers.length === 2 && directParsers.length === 1) {
|
|
575
|
+
const expiry = directParsers[0], now = helpers.find((item) => item !== expiry);
|
|
576
|
+
const expiryCoverage = temporalModel("expiry", {}, graph, budget, rules).prove(expiry);
|
|
577
|
+
const nowCoverage = temporalModel("now", { expiry: expiry.exactDeclarationName }, graph, budget, rules).prove(now);
|
|
578
|
+
const publicCoverage = temporalModel("public", { expiry: expiry.exactDeclarationName, now: now.exactDeclarationName }, graph, budget, rules).prove(graph.get(publicName).callable);
|
|
579
|
+
requireClosedCoverage(expiryCoverage, nowCoverage, publicCoverage);
|
|
580
|
+
return { proven: true, reasons: [], expiry, now };
|
|
581
|
+
}
|
|
582
|
+
const failures = [];
|
|
583
|
+
const proveRole = (role, callable, names = {}) => {
|
|
584
|
+
try { return temporalModel(role, names, graph, budget, rules).prove(callable); }
|
|
585
|
+
catch (error) {
|
|
586
|
+
if (budget.remaining < 0) throw error;
|
|
587
|
+
failures.push({ role, name: callable.exactDeclarationName, error }); return null;
|
|
588
|
+
}
|
|
589
|
+
};
|
|
590
|
+
const expiryCandidates = helpers.map((callable) => ({ callable, coverage: proveRole("expiry", callable) })).filter((item) => item.coverage);
|
|
591
|
+
for (const { callable: expiry, coverage: expiryCoverage } of expiryCandidates) {
|
|
592
|
+
const nowCandidates = helpers.filter((item) => item !== expiry)
|
|
593
|
+
.map((callable) => ({ callable, coverage: proveRole("now", callable, { expiry: expiry.exactDeclarationName }) })).filter((item) => item.coverage);
|
|
594
|
+
for (const { callable: now, coverage: nowCoverage } of nowCandidates) {
|
|
595
|
+
try {
|
|
596
|
+
const publicCoverage = temporalModel("public", { expiry: expiry.exactDeclarationName, now: now.exactDeclarationName }, graph, budget, rules).prove(graph.get(publicName).callable);
|
|
597
|
+
requireClosedCoverage(expiryCoverage, nowCoverage, publicCoverage);
|
|
598
|
+
return { proven: true, reasons: [], expiry, now };
|
|
599
|
+
} catch (error) {
|
|
600
|
+
if (budget.remaining < 0) throw error;
|
|
601
|
+
failures.push({ role: "public", name: publicName, error });
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
const publicFailure = failures.find((entry) => entry.role === "public");
|
|
606
|
+
if (publicFailure) throw publicFailure.error;
|
|
607
|
+
// Only report a failed expiry obligation from an actual public callee
|
|
608
|
+
// which reaches the strict parser. Failed speculative leaf-role trials
|
|
609
|
+
// are not diagnostics for the public implementation.
|
|
610
|
+
const reachesParser = (name) => directParsers.some((parser) => parser.exactDeclarationName === name)
|
|
611
|
+
|| [...graph.get(name).edges].some(reachesParser);
|
|
612
|
+
const expiryFailure = failures.find((entry) => entry.role === "expiry" && graph.get(publicName).edges.has(entry.name) && reachesParser(entry.name));
|
|
613
|
+
if (expiryFailure) throw expiryFailure.error;
|
|
614
|
+
fail("temporal-helper-composition-unproven");
|
|
615
|
+
} catch (error) {
|
|
616
|
+
return { proven: false, reasons: [error instanceof Error && /^[a-z-]+$/.test(error.message) ? error.message : "unsupported-temporal-dataflow"] };
|
|
617
|
+
}
|
|
618
|
+
}
|