@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
|
@@ -1,22 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { inferAcceptanceObligations } from "./acceptance-obligations.js";
|
|
2
|
+
export { inferAcceptanceObligations };
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import { changedFileAcceptanceCorpus, emptyAcceptanceCorpus, isAcceptanceTestPath } from "./acceptance-language-adapters.js";
|
|
4
5
|
import { durableContextEvidenceEntries, hasDurableContextEvidence } from "./context-evidence.js";
|
|
5
6
|
import { matchesAnyPath, normalizePathCandidate } from "./policy-core.js";
|
|
6
7
|
import { baselineReturnRepresentationConflicts, returnRepresentationGuidance } from "./return-contract.js";
|
|
7
8
|
import { hasLengthPrefixedIdentityKey, tenantAssertionSignals } from "./tenant-contract.js";
|
|
8
|
-
import {
|
|
9
|
+
import { acceptanceTextHash as sha256, acceptanceEvidenceKey as evidenceKey, compoundAcceptanceCriterion, acceptanceCriterionBindingValid, resetUnprovenCriterion, criterionBehaviorProofDisposition, criterionRequiresBehavioralProof, durableBehaviorProofRequired, genericCriterionEvidence, genericFallbackEvidence, isVerificationOnlyCriterion, verifierCommandsCoverTests } from "./acceptance-behavior-proof.js";
|
|
10
|
+
import { allConfiguredVerifierEvidenceCurrent as hasCurrentPassingVerifier, latestObservedVerificationEvidence, meaningfulVerificationCommands, verificationEvidenceProvesStableTree, verificationProjectionWorkspaceRevision } from "./verification-intelligence.js";
|
|
9
11
|
import {
|
|
10
12
|
acceptanceContractProofGuidance,
|
|
11
13
|
acceptanceContractSemanticConflicts,
|
|
12
14
|
acceptanceInvalidInputEvidence
|
|
13
15
|
} from "./acceptance-contract-semantics.js";
|
|
16
|
+
import { malformedIdentifierCriterionText } from "./acceptance-identifier-criteria.js";
|
|
17
|
+
import { contextualTemporalCriterion } from "./acceptance-temporal-contract.js";
|
|
18
|
+
import { temporalProofReasonGuidance } from "./acceptance-boundary-guidance.js";
|
|
19
|
+
import { acceptancePrecedenceContractGuidance, acceptancePrecedenceReceiptEvidence } from "./acceptance-precedence-contract.js";
|
|
14
20
|
import { isCurrentWorkingTreeDigest, WORKING_TREE_DIGEST_ALGORITHM } from "./working-tree-digest.js";
|
|
15
|
-
|
|
21
|
+
import { independentAcceptanceState, applyIndependentCriterionAssessment } from "./acceptance-independent-registry.js";
|
|
22
|
+
import { missingAcceptanceProofCapabilities } from "./acceptance-proof-capability.js";
|
|
23
|
+
import { boundAcceptanceClauseGroup, allClauseEvidence } from "./acceptance-clause-group.js";
|
|
24
|
+
import { documentContentCriterionEvidence } from "./acceptance-document-content.js";
|
|
25
|
+
import { invalidInputReceiptProof } from "./acceptance-invalid-input-receipt.js";
|
|
26
|
+
import { boundaryTargetHasLiveSuccess } from "./acceptance-boundary-binding.js";
|
|
27
|
+
import { apiBaselineCriterionEvidence, apiBaselineRecoveryProjection } from "./acceptance-api-baseline.js";
|
|
16
28
|
export const ACCEPTANCE_RECEIPT_SCHEMA_VERSION = 1;
|
|
17
29
|
export const ACCEPTANCE_STATUSES = new Set(["pending", "satisfied", "blocked"]);
|
|
18
30
|
export const ACCEPTANCE_PRIORITIES = new Set(["normal", "critical"]);
|
|
19
|
-
|
|
20
31
|
const CRITICAL_OBLIGATIONS = new Set([
|
|
21
32
|
"authorization-deny-case",
|
|
22
33
|
"tenant-boundary",
|
|
@@ -25,7 +36,6 @@ const CRITICAL_OBLIGATIONS = new Set([
|
|
|
25
36
|
"boundary-case",
|
|
26
37
|
"read-only-evidence"
|
|
27
38
|
]);
|
|
28
|
-
|
|
29
39
|
const MAX_CRITERIA = 12;
|
|
30
40
|
const MAX_EVIDENCE_PER_CRITERION = 8;
|
|
31
41
|
const RECEIPT_FIELDS = new Set(["schemaVersion", "source", "promptHash", "generatedAt", "criteria", "provenance", "helperUsage"]);
|
|
@@ -34,7 +44,7 @@ const EVIDENCE_FIELDS = new Set(["kind", "summary", "paths", "command", "exitCod
|
|
|
34
44
|
const PROVENANCE_FIELDS = new Set(["assurance", "disposition", "repairCount", "retryCount", "finalRecoveryDisposition", "failureRef", "recoveryRef", "handoffRef", "recordedAt"]);
|
|
35
45
|
const FAILURE_REF_FIELDS = new Set(["evidenceDigest", "category", "captureRef"]);
|
|
36
46
|
const RECOVERY_REF_FIELDS = new Set(["policyVersion", "action", "reasonCodes"]);
|
|
37
|
-
const HELPER_USAGE_FIELDS = new Set(["mode", "used", "reasonCodes", "helpers", "recordedAt"]);
|
|
47
|
+
const HELPER_USAGE_FIELDS = new Set(["mode", "used", "decision", "projectedSavingsRatio", "reasonCodes", "helpers", "recordedAt"]);
|
|
38
48
|
const HELPER_ENTRY_FIELDS = new Set(["role", "disposition", "requestRef", "outputDigest", "calls", "tokens"]);
|
|
39
49
|
const HELPER_ROLES = new Set(["retriever", "scout", "planner", "worker", "reviewer", "oracle", "researcher"]);
|
|
40
50
|
const RECEIPT_DISPOSITIONS = new Set(["first-pass-success", "repaired-success", "blocked", "partial", "failed", "pending"]);
|
|
@@ -43,12 +53,7 @@ const RECOVERY_ACTIONS = new Set(["repair", "retry", "fresh-session", "ask-opera
|
|
|
43
53
|
const FAILURE_CATEGORIES = new Set(["passed", "compile-typecheck", "test-assertion", "lint-format", "dependency-config", "environment", "provider-network", "permission-policy", "scope-protected-path", "flaky-infrastructure", "unknown"]);
|
|
44
54
|
const HASH = /^[a-f0-9]{64}$/;
|
|
45
55
|
const SAFE_REF = /^[a-z0-9.][a-z0-9:._/-]{0,511}$/i;
|
|
46
|
-
const READ_ONLY_BOUNDARY = /\b(?:read-only|no
|
|
47
|
-
|
|
48
|
-
function sha256(value) {
|
|
49
|
-
return crypto.createHash("sha256").update(String(value ?? "")).digest("hex");
|
|
50
|
-
}
|
|
51
|
-
|
|
56
|
+
const READ_ONLY_BOUNDARY = /\b(?:read-only|no\s+(?:code|source|project|file|workspace|repo(?:sitory)?)?\s*(?:edits?|changes?|mutations?)|do not\s+(?:edit|change|modify|mutate|touch)(?: files?| source| project| repo| workspace)?|leave\s+(?:the\s+)?(?:source|project|repo|workspace)\s+(?:unchanged|unmodified)|khong\s+(?:sua|edit|thay\s+doi)(?: file| source| project)?)\b/;
|
|
52
57
|
function compactId(value, fallback = "criterion") {
|
|
53
58
|
return String(value ?? fallback)
|
|
54
59
|
.trim()
|
|
@@ -80,11 +85,6 @@ function normalizedText(value) {
|
|
|
80
85
|
.replace(/[\u0300-\u036f]/g, "")
|
|
81
86
|
.toLowerCase();
|
|
82
87
|
}
|
|
83
|
-
|
|
84
|
-
function includesAny(text, patterns) {
|
|
85
|
-
return patterns.some((pattern) => pattern.test(text));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
88
|
function pathBoundaryMentioned(text, patterns) {
|
|
89
89
|
const value = normalizedText(text);
|
|
90
90
|
return uniqueStrings(patterns).some((pattern) => {
|
|
@@ -95,73 +95,26 @@ function pathBoundaryMentioned(text, patterns) {
|
|
|
95
95
|
return value.includes(lower) || (Boolean(basename) && value.includes(basename));
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
function readOnlyBoundaryTiedToPattern(text, patterns) {
|
|
99
|
+
return normalizedText(text)
|
|
100
|
+
.split(/(?:\r?\n+|[.!?;]+|\s+[—–]\s+)/)
|
|
101
|
+
.some((clause) => READ_ONLY_BOUNDARY.test(clause) && pathBoundaryMentioned(clause, patterns));
|
|
102
|
+
}
|
|
99
103
|
function changedFilesRespectBoundaries(changedFiles, boundaryPatterns) {
|
|
100
104
|
const patterns = uniqueStrings(boundaryPatterns);
|
|
101
105
|
if (patterns.length === 0) return true;
|
|
102
106
|
return uniqueStrings(changedFiles).every((file) => !matchesAnyPath(file, patterns));
|
|
103
107
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
.replace(/`[^`\n]*`/g, " ")
|
|
109
|
-
.replace(/\b(?:[a-z0-9_.@-]+\/)+[a-z0-9_.@/-]+\b/g, " ");
|
|
110
|
-
const obligations = [];
|
|
111
|
-
if (changeMode === "read-only" || READ_ONLY_BOUNDARY.test(value)) {
|
|
112
|
-
obligations.push("read-only-evidence");
|
|
113
|
-
}
|
|
114
|
-
const actorAccessControl = includesAny(accessControlText, [
|
|
115
|
-
/\b(?:admins?|roles?|owners?|users?|callers?|resources?)\b[\s\S]{0,80}\b(?:access|allow(?:ed)?|deny|denied|block(?:ed)?|forbid(?:den)?|manag(?:e|es|ed|ing))\b/,
|
|
116
|
-
/\b(?:access|allow(?:ed)?|deny|denied|block(?:ed)?|forbid(?:den)?|manag(?:e|es|ed|ing))\b[\s\S]{0,80}\b(?:admins?|roles?|owners?|users?|callers?|resources?)\b/
|
|
117
|
-
]);
|
|
118
|
-
const explicitAuthorization = includesAny(accessControlText, [
|
|
119
|
-
/\bauth(?:orization)?\b/, /\bunauthoriz(?:ed|ation)\b/, /\bpermission\b/
|
|
120
|
-
]) || actorAccessControl;
|
|
121
|
-
const ownerAccessControl = /\bowner\b/.test(accessControlText) && includesAny(accessControlText, [
|
|
122
|
-
/\busers?\b/, /\bresources?\b/, /\baccess\b/, /\bmanag(?:e|es|ed|ing)\b/, /\bauth(?:orization)?\b/, /\bpermission\b/, /\broles?\b/
|
|
108
|
+
function acceptanceReadOnlyInferenceOptions(input, text) {
|
|
109
|
+
const boundaryPatterns = uniqueStrings([
|
|
110
|
+
...(Array.isArray(input?.outOfScope) ? input.outOfScope : []),
|
|
111
|
+
...(Array.isArray(input?.protectedPaths) ? input.protectedPaths : [])
|
|
123
112
|
]);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
/\bcache\b/, /\bcache[- ]?key\b/, /\bstorage\b/, /\bcollision\b/, /\bentity\b/, /\bsame tuple\b/
|
|
130
|
-
]);
|
|
131
|
-
const strongAuthorization = includesAny(accessControlText, [
|
|
132
|
-
/\bauth(?:orization)?\b/, /\bunauthoriz(?:ed|ation)\b/, /\bpermission\b/
|
|
133
|
-
]);
|
|
134
|
-
const tenantActorAccess = tenantMentioned && actorAccessControl;
|
|
135
|
-
const explicitTenantAccessBoundary = includesAny(value, [
|
|
136
|
-
/\bcross[- ]tenant\b/, /\bsame[- ]tenant\b/, /\btenant boundary\b/,
|
|
137
|
-
/\btenantid\b[\s\S]{0,100}\b(?:equal|match|same non-empty|access|allow|deny|block|forbid)/,
|
|
138
|
-
/\b(?:access|allow|deny|block|forbid)[\s\S]{0,100}\btenantid\b/
|
|
139
|
-
]) && includesAny(value, [
|
|
140
|
-
/\baccess\b/, /\ballow(?:ed)?\b/, /\b(?:deny|denied)\b/, /\bblock(?:ed)?\b/, /\bforbid(?:den)?\b/,
|
|
141
|
-
/\bequal\b/, /\bmatch(?:es|ed|ing)?\b/, /\bsame non-empty\b/
|
|
142
|
-
]);
|
|
143
|
-
if (tenantMentioned) {
|
|
144
|
-
if (tenantStorage) {
|
|
145
|
-
obligations.push("tenant-storage-isolation");
|
|
146
|
-
} else if (strongAuthorization || ownerAccessControl || tenantActorAccess || explicitTenantAccessBoundary) {
|
|
147
|
-
obligations.push("tenant-boundary");
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
const explicitInvalidInput = includesAny(value, [/\binvalid\b/, /\btypeerror\b/, /\bthrow\b/, /\bnon-negative\b/, /\bpositive integer\b/, /\binteger\b/]);
|
|
151
|
-
const rejectInvalidInput = /\breject(?:s|ed|ion)?\b/.test(value)
|
|
152
|
-
&& !/\breject(?:s|ed|ion)?\s+(?:no\s+)?valid\b/.test(value)
|
|
153
|
-
&& includesAny(value, [/\binvalid\b/, /\bbad\b/, /\bmalformed\b/, /\bnegative\b/, /\bnull\b/, /\bundefined\b/, /\bnon[- ]?(?:number|numeric)\b/, /\bout[- ]?of[- ]?range\b/]);
|
|
154
|
-
if (explicitInvalidInput || rejectInvalidInput) {
|
|
155
|
-
obligations.push("invalid-input-rejection");
|
|
156
|
-
}
|
|
157
|
-
if (includesAny(value, [/\bboundary\b/, /\bceil(?:ing)?\b/, /\bclamp\b/, /\bmin(?:imum)?\b/, /\bmax(?:imum)?\b/, /\binclusive\b/, /\bzero\b/, /\b0\b/, /\bexpiry\b/, /\bround(?:ing)?\b/, /\bedge\b/, /\bfalsey\b/, /\bfalsy\b/, /\bnullish\b/, /\bdefault(?:s)?\b/, /\bpreserv(?:e|ed|es|ing)\b/])) {
|
|
158
|
-
obligations.push("boundary-case");
|
|
159
|
-
}
|
|
160
|
-
if (includesAny(value, [/\bmutation\b/, /\bunchanged\b/, /\bwithout changing\b/, /\bbackward\b/, /\bapi\b/, /\bexported api\b/, /\bfocused\b/])) {
|
|
161
|
-
obligations.push("backward-compatibility");
|
|
162
|
-
}
|
|
163
|
-
if (changeMode === "source-change") obligations.push("verification-evidence");
|
|
164
|
-
return [...new Set(obligations)];
|
|
113
|
+
return {
|
|
114
|
+
mutationPolicy: input?.mutationPolicy,
|
|
115
|
+
readOnlyBoundary: boundaryPatterns.length > 0
|
|
116
|
+
&& readOnlyBoundaryTiedToPattern(text, boundaryPatterns)
|
|
117
|
+
};
|
|
165
118
|
}
|
|
166
119
|
|
|
167
120
|
function generatedCriterionForObligation(obligation) {
|
|
@@ -191,7 +144,6 @@ const GENERATED_ACCEPTANCE_TEXTS = new Set([
|
|
|
191
144
|
"authorization-deny-case", "tenant-boundary", "tenant-storage-isolation", "invalid-input-rejection", "boundary-case",
|
|
192
145
|
"backward-compatibility", "read-only-evidence", "verification-evidence"
|
|
193
146
|
].map((obligation) => generatedCriterionForObligation(obligation)));
|
|
194
|
-
|
|
195
147
|
function acceptanceTaskText(task) {
|
|
196
148
|
return [
|
|
197
149
|
task?.summary,
|
|
@@ -209,7 +161,7 @@ function acceptanceCriterionText(task, criterion) {
|
|
|
209
161
|
? matched
|
|
210
162
|
: acceptanceTaskText(task);
|
|
211
163
|
}
|
|
212
|
-
|
|
164
|
+
function invalidInputCriterionText(task, criterion) { const selected = acceptanceCriterionText(task, criterion), identifierContext = malformedIdentifierCriterionText(selected, task, GENERATED_ACCEPTANCE_TEXTS); return contextualTemporalCriterion(identifierContext, selected, task, GENERATED_ACCEPTANCE_TEXTS); }
|
|
213
165
|
/**
|
|
214
166
|
* Produce bounded, task-derived proof guidance without a second model call.
|
|
215
167
|
* These hints remain generic: they describe semantic partitions from the
|
|
@@ -227,8 +179,9 @@ function semanticConflictReasons(obligation, task, corpus, criterion) {
|
|
|
227
179
|
|
|
228
180
|
/**
|
|
229
181
|
* Surface a concrete existing return contract before implementation starts.
|
|
230
|
-
* This is intentionally source-derived and bounded to exact
|
|
231
|
-
*
|
|
182
|
+
* This is intentionally source-derived and bounded to exact known files; it
|
|
183
|
+
* does not turn the task's initial focus into write authority or guess from
|
|
184
|
+
* benchmark scenario names and hidden expectations.
|
|
232
185
|
*/
|
|
233
186
|
export function acceptanceBaselineGuidance(task, options = {}) {
|
|
234
187
|
if (!options.cwd) return [];
|
|
@@ -237,7 +190,7 @@ export function acceptanceBaselineGuidance(task, options = {}) {
|
|
|
237
190
|
...(Array.isArray(task?.changedFiles) ? task.changedFiles : []),
|
|
238
191
|
...(Array.isArray(task?.observedChangedFiles) ? task.observedChangedFiles : [])
|
|
239
192
|
]).filter((file) => !/[?*\[\]{}]/.test(file) && !isAcceptanceTestPath(file));
|
|
240
|
-
return returnRepresentationGuidance(acceptanceTaskText(task), options.cwd, files);
|
|
193
|
+
return uniqueStrings([...returnRepresentationGuidance(acceptanceTaskText(task), options.cwd, files), ...acceptancePrecedenceContractGuidance({ taskText: acceptanceTaskText(task), sourceEntries: changedFileAcceptanceCorpus(options.cwd, files).sourceEntries })]);
|
|
241
194
|
}
|
|
242
195
|
|
|
243
196
|
export function acceptanceSemanticConflicts(task, options = {}) {
|
|
@@ -247,7 +200,11 @@ export function acceptanceSemanticConflicts(task, options = {}) {
|
|
|
247
200
|
: { ...emptyAcceptanceCorpus(changedFiles.length > 0 ? changedFiles : ["inline.js"]), sourceText: normalizedText(options.sourceText), allText: normalizedText(options.sourceText) };
|
|
248
201
|
if (!corpus.adapter.proofCapable) return [];
|
|
249
202
|
const obligations = task?.acceptanceReceipt?.criteria?.map((criterion) => criterion.obligation)
|
|
250
|
-
?? inferAcceptanceObligations(
|
|
203
|
+
?? inferAcceptanceObligations(
|
|
204
|
+
acceptanceTaskText(task),
|
|
205
|
+
task?.changeMode,
|
|
206
|
+
acceptanceReadOnlyInferenceOptions(task, acceptanceTaskText(task))
|
|
207
|
+
);
|
|
251
208
|
return uniqueStrings([
|
|
252
209
|
...obligations.flatMap((obligation) => semanticConflictReasons(obligation, task, corpus)),
|
|
253
210
|
...(options.cwd ? baselineReturnRepresentationConflicts(acceptanceTaskText(task), options.cwd, corpus.sourceFiles) : [])
|
|
@@ -258,7 +215,6 @@ function criterionId(text, obligation, index) {
|
|
|
258
215
|
const prefix = compactId(obligation ?? "criterion").slice(0, 24);
|
|
259
216
|
return `ac-${String(index + 1).padStart(2, "0")}-${prefix}-${sha256(text).slice(0, 8)}`.slice(0, 80);
|
|
260
217
|
}
|
|
261
|
-
|
|
262
218
|
export function buildAcceptanceReceipt(input = {}) {
|
|
263
219
|
const changeMode = input.changeMode === "read-only" ? "read-only" : "source-change";
|
|
264
220
|
const baseText = [
|
|
@@ -266,12 +222,26 @@ export function buildAcceptanceReceipt(input = {}) {
|
|
|
266
222
|
input.expectedOutput,
|
|
267
223
|
...(Array.isArray(input.acceptanceCriteria) ? input.acceptanceCriteria : [])
|
|
268
224
|
].filter(Boolean).join("\n");
|
|
269
|
-
const obligations = inferAcceptanceObligations(
|
|
225
|
+
const obligations = inferAcceptanceObligations(
|
|
226
|
+
baseText,
|
|
227
|
+
changeMode,
|
|
228
|
+
acceptanceReadOnlyInferenceOptions(input, baseText)
|
|
229
|
+
);
|
|
230
|
+
// Generated lifecycle metadata may suggest advisory checks, but cannot
|
|
231
|
+
// create a mandatory product requirement absent from operator intent.
|
|
232
|
+
// Keep the full receipt hash and useful existing follow-up diagnostics.
|
|
233
|
+
const operatorText = [input.summary, ...(Array.isArray(input.acceptanceCriteria) ? input.acceptanceCriteria : [])].filter(Boolean).join("\n");
|
|
234
|
+
const operatorObligations = new Set(inferAcceptanceObligations(operatorText, changeMode,
|
|
235
|
+
acceptanceReadOnlyInferenceOptions(input, operatorText)));
|
|
270
236
|
const texts = uniqueStrings(Array.isArray(input.acceptanceCriteria) ? input.acceptanceCriteria : []);
|
|
271
237
|
const generatedObligations = new Map();
|
|
272
238
|
for (const obligation of obligations) {
|
|
273
239
|
const generated = generatedCriterionForObligation(obligation);
|
|
274
|
-
if (!texts.some((text) => inferAcceptanceObligations(
|
|
240
|
+
if (!texts.some((text) => inferAcceptanceObligations(
|
|
241
|
+
text,
|
|
242
|
+
changeMode,
|
|
243
|
+
acceptanceReadOnlyInferenceOptions(input, text)
|
|
244
|
+
).includes(obligation))) {
|
|
275
245
|
texts.push(generated);
|
|
276
246
|
generatedObligations.set(generated, obligation);
|
|
277
247
|
}
|
|
@@ -282,17 +252,25 @@ export function buildAcceptanceReceipt(input = {}) {
|
|
|
282
252
|
: generatedCriterionForObligation("verification-evidence"));
|
|
283
253
|
}
|
|
284
254
|
const acceptanceCriteria = texts.slice(0, MAX_CRITERIA);
|
|
255
|
+
const durableBehaviorProof = durableBehaviorProofRequired(input.source === "runtime" ? operatorText : baseText, changeMode);
|
|
285
256
|
const criteria = acceptanceCriteria.map((text, index) => {
|
|
286
|
-
const inferred = inferAcceptanceObligations(
|
|
257
|
+
const inferred = inferAcceptanceObligations(
|
|
258
|
+
text,
|
|
259
|
+
changeMode,
|
|
260
|
+
acceptanceReadOnlyInferenceOptions(input, text)
|
|
261
|
+
);
|
|
287
262
|
const obligation = generatedObligations.get(text)
|
|
288
263
|
?? inferred.find((item) => item !== "verification-evidence" && item !== "backward-compatibility")
|
|
289
|
-
??
|
|
264
|
+
?? (isVerificationOnlyCriterion(text) ? "verification-evidence" : undefined)
|
|
265
|
+
?? (inferred.includes("backward-compatibility") ? "backward-compatibility" : undefined)
|
|
290
266
|
?? "requested-behavior";
|
|
291
267
|
return {
|
|
292
268
|
id: criterionId(text, obligation, index),
|
|
293
269
|
hash: sha256(text),
|
|
294
270
|
obligation,
|
|
295
|
-
priority:
|
|
271
|
+
priority: input.source === "runtime" && generatedObligations.has(text) && !operatorObligations.has(obligation)
|
|
272
|
+
? "normal"
|
|
273
|
+
: compoundAcceptanceCriterion(text) || CRITICAL_OBLIGATIONS.has(obligation) || (durableBehaviorProof && obligation !== "verification-evidence") ? "critical" : "normal",
|
|
296
274
|
status: "pending",
|
|
297
275
|
evidence: []
|
|
298
276
|
};
|
|
@@ -351,20 +329,30 @@ export function normalizeAcceptanceReceipt(value) {
|
|
|
351
329
|
|
|
352
330
|
function normalizeHelperUsage(value) {
|
|
353
331
|
if (!isRecord(value) || !["off", "recommend", "on"].includes(value.mode)) return undefined;
|
|
354
|
-
const
|
|
332
|
+
const rawHelpers = Array.isArray(value.helpers) ? value.helpers.slice(0, 3).filter(isRecord) : [];
|
|
333
|
+
const helpers = rawHelpers.map((item) => ({
|
|
355
334
|
role: HELPER_ROLES.has(item.role) ? item.role : "scout",
|
|
356
335
|
disposition: compactId(item.disposition ?? "unknown"),
|
|
357
336
|
requestRef: HASH.test(String(item.requestRef)) ? item.requestRef : sha256(item.requestRef),
|
|
358
337
|
outputDigest: item.outputDigest === null || HASH.test(String(item.outputDigest)) ? item.outputDigest : null,
|
|
359
338
|
calls: Number.isInteger(item.calls) ? Math.max(0, Math.min(100, item.calls)) : 0,
|
|
360
339
|
tokens: Number.isInteger(item.tokens) ? Math.max(0, Math.min(100_000_000, item.tokens)) : 0
|
|
361
|
-
}))
|
|
362
|
-
|
|
340
|
+
}));
|
|
341
|
+
const used = helpers.some((item) => !["solo", "recommend", "unavailable", "blocked"].includes(item.disposition));
|
|
342
|
+
const helperDecision = rawHelpers.find((item) => ["dispatch", "skip"].includes(item.decision))?.decision;
|
|
343
|
+
const decision = ["dispatch", "skip"].includes(value.decision) ? value.decision : helperDecision ?? (used ? "dispatch" : "skip");
|
|
344
|
+
const rawProjectedSavings = typeof value.projectedSavingsRatio === "number"
|
|
345
|
+
? value.projectedSavingsRatio
|
|
346
|
+
: rawHelpers.find((item) => typeof item.projectedSavingsRatio === "number")?.projectedSavingsRatio;
|
|
347
|
+
const projectedSavingsRatio = typeof rawProjectedSavings === "number" && Number.isFinite(rawProjectedSavings)
|
|
348
|
+
? Math.max(-10, Math.min(1, rawProjectedSavings))
|
|
349
|
+
: null;
|
|
350
|
+
return { mode: value.mode, used, decision, projectedSavingsRatio, reasonCodes: uniqueStrings(value.reasonCodes).map(compactId).slice(0, 16), helpers, recordedAt: validTimestamp(value.recordedAt) ? value.recordedAt : new Date().toISOString() };
|
|
363
351
|
}
|
|
364
352
|
|
|
365
353
|
export function applyAcceptanceHelperUsage(task, input = {}) {
|
|
366
354
|
const receipt = normalizeAcceptanceReceipt(task?.acceptanceReceipt); if (!receipt) return task;
|
|
367
|
-
const helperUsage = normalizeHelperUsage({ mode: input.mode ?? "off", reasonCodes: input.reasonCodes ?? [], helpers: input.helpers ?? [], recordedAt: input.recordedAt ?? new Date().toISOString() });
|
|
355
|
+
const helperUsage = normalizeHelperUsage({ mode: input.mode ?? "off", decision: input.decision, projectedSavingsRatio: input.projectedSavingsRatio, reasonCodes: input.reasonCodes ?? [], helpers: input.helpers ?? [], recordedAt: input.recordedAt ?? new Date().toISOString() });
|
|
368
356
|
return { ...task, acceptanceReceipt: { ...receipt, criteria: structuredClone(task.acceptanceReceipt.criteria), helperUsage } };
|
|
369
357
|
}
|
|
370
358
|
|
|
@@ -525,17 +513,6 @@ function normalizeAcceptanceEvidence(value) {
|
|
|
525
513
|
};
|
|
526
514
|
}
|
|
527
515
|
|
|
528
|
-
function evidenceKey(evidence) {
|
|
529
|
-
return JSON.stringify({
|
|
530
|
-
kind: evidence.kind,
|
|
531
|
-
summary: evidence.summary,
|
|
532
|
-
paths: evidence.paths ?? [],
|
|
533
|
-
command: evidence.command,
|
|
534
|
-
exitCode: evidence.exitCode,
|
|
535
|
-
workingTreeDigest: evidence.workingTreeDigest
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
|
|
539
516
|
function addEvidence(criterion, evidence, recordedAt) {
|
|
540
517
|
const normalized = normalizeAcceptanceEvidence({ ...evidence, recordedAt });
|
|
541
518
|
if (!normalized) return false;
|
|
@@ -562,10 +539,10 @@ function declaredCallableNames(sourceText) {
|
|
|
562
539
|
return names;
|
|
563
540
|
}
|
|
564
541
|
|
|
565
|
-
function contractCallableTargets(task, criterion, sourceText = "") {
|
|
542
|
+
function contractCallableTargets(task, criterion, sourceText = "", criterionText) {
|
|
566
543
|
const ignored = new Set(["api", "boolean", "date", "error", "false", "null", "string", "true", "typeerror", "undefined"]);
|
|
567
544
|
const explicit = [];
|
|
568
|
-
const text = acceptanceCriterionText(task, criterion);
|
|
545
|
+
const text = criterionText ?? acceptanceCriterionText(task, criterion);
|
|
569
546
|
let previousEnd = 0;
|
|
570
547
|
let roleGroup = false;
|
|
571
548
|
for (const match of text.matchAll(/`([A-Za-z_$][A-Za-z0-9_$]*)\s*\([^`]*\)`/g)) {
|
|
@@ -587,12 +564,12 @@ function contractCallableTargets(task, criterion, sourceText = "") {
|
|
|
587
564
|
return uniqueStrings([primary.name, ...productEntrypoints.map(({ name }) => name)]).slice(0, 8);
|
|
588
565
|
}
|
|
589
566
|
|
|
590
|
-
function namedCodeTargets(task, criterion, sourceText = "") {
|
|
591
|
-
const text = acceptanceCriterionText(task, criterion);
|
|
567
|
+
function namedCodeTargets(task, criterion, sourceText = "", criterionText) {
|
|
568
|
+
const text = criterionText ?? acceptanceCriterionText(task, criterion);
|
|
592
569
|
const ignored = new Set([
|
|
593
570
|
"api", "boolean", "date", "error", "false", "null", "string", "true", "typeerror", "undefined"
|
|
594
571
|
]);
|
|
595
|
-
const targets = contractCallableTargets(task, criterion, sourceText);
|
|
572
|
+
const targets = contractCallableTargets(task, criterion, sourceText, text);
|
|
596
573
|
const callables = declaredCallableNames(sourceText);
|
|
597
574
|
for (const sentence of text.split(/(?<=[.!?])\s+/)) {
|
|
598
575
|
if (!/\b(?:validat(?:e|es|ed|ion)|invalid|reject(?:s|ed|ion)?|throw(?:s|ing)?|malformed)\b/i.test(sentence)) continue;
|
|
@@ -602,10 +579,7 @@ function namedCodeTargets(task, criterion, sourceText = "") {
|
|
|
602
579
|
}
|
|
603
580
|
return uniqueStrings(targets).slice(0, 8);
|
|
604
581
|
}
|
|
605
|
-
|
|
606
|
-
function explicitlyCallableTargets(task, criterion, sourceText = "") {
|
|
607
|
-
return contractCallableTargets(task, criterion, sourceText);
|
|
608
|
-
}
|
|
582
|
+
function explicitlyCallableTargets(task, criterion, sourceText = "", criterionText) { return contractCallableTargets(task, criterion, sourceText, criterionText); }
|
|
609
583
|
|
|
610
584
|
function booleanAssertionSignals(testText) {
|
|
611
585
|
const text = String(testText ?? "");
|
|
@@ -633,8 +607,8 @@ function hasStructuredCompositeIdentity(sourceText) {
|
|
|
633
607
|
return jsonTuple || nestedLookup || hasLengthPrefixedIdentityKey(text);
|
|
634
608
|
}
|
|
635
609
|
|
|
636
|
-
function focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion) {
|
|
637
|
-
if (!verifierEvidence || corpus.sourceFiles.length === 0 || corpus.testFiles
|
|
610
|
+
function focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion, cwd) {
|
|
611
|
+
if (!verifierEvidence || corpus.sourceFiles.length === 0 || !verifierCommandsCoverTests(task, corpus.testFiles, cwd)) return undefined;
|
|
638
612
|
const targets = namedCodeTargets(task, criterion, corpus.sourceText);
|
|
639
613
|
const targetCoverage = targets.length === 0 || targets.every((target) => (
|
|
640
614
|
new RegExp(`\\b${escapeRegex(target.toLowerCase())}\\b`).test(corpus.testText)
|
|
@@ -670,23 +644,12 @@ function focusedContractEvidence(obligation, task, corpus, verifierEvidence, cri
|
|
|
670
644
|
};
|
|
671
645
|
}
|
|
672
646
|
|
|
673
|
-
function
|
|
674
|
-
|
|
675
|
-
|| !isCurrentWorkingTreeDigest(currentWorkingTreeDigest)) return false;
|
|
676
|
-
const planned = meaningfulVerificationCommands(task?.verifyCommands ?? []);
|
|
677
|
-
const latest = latestObservedVerificationEvidence(task?.verifyEvidence);
|
|
678
|
-
return planned.length > 0 && planned.every((command) => {
|
|
679
|
-
const evidence = latest.get(command.trim());
|
|
680
|
-
return verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest);
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDigest, criterion) {
|
|
685
|
-
const passingVerifier = hasCurrentPassingVerifier(task, currentWorkingTreeDigest);
|
|
647
|
+
function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, sourceProofRequiredIds, apiBaselineEvidence, strictClauseProof = false) {
|
|
648
|
+
const passingVerifier = hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest);
|
|
686
649
|
const latestVerifyEvidence = latestObservedVerificationEvidence(task?.verifyEvidence);
|
|
687
650
|
const verifyEvidence = meaningfulVerificationCommands(task?.verifyCommands ?? [])
|
|
688
651
|
.map((command) => latestVerifyEvidence.get(command.trim()))
|
|
689
|
-
.filter((evidence) => verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest));
|
|
652
|
+
.filter((evidence) => verificationEvidenceProvesStableTree(evidence, currentWorkingTreeDigest, workspaceRevisionDigest));
|
|
690
653
|
const verifier = verifyEvidence[0];
|
|
691
654
|
const verifierEvidence = verifier ? {
|
|
692
655
|
kind: "verify-command",
|
|
@@ -696,10 +659,22 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
|
|
|
696
659
|
workingTreeDigest: currentWorkingTreeDigest
|
|
697
660
|
} : undefined;
|
|
698
661
|
if (semanticConflictReasons(obligation, task, corpus, criterion).length > 0) return undefined;
|
|
662
|
+
// An exact API-preservation clause cannot borrow weaker evidence from an inferred category.
|
|
663
|
+
const api = apiBaselineCriterionEvidence({ task, criterion, cwd, corpus, currentWorkingTreeDigest, workspaceRevisionDigest, apiBaselineEvidence });
|
|
664
|
+
if (api.handled) return api.evidence;
|
|
665
|
+
const document = documentContentCriterionEvidence({ task, criterion, corpus, cwd, passingVerifier, verifierEvidence, currentWorkingTreeDigest, workspaceRevisionDigest });
|
|
666
|
+
if (document.handled) return document.evidence;
|
|
667
|
+
// Group children require a checker covering the complete clause. Legacy
|
|
668
|
+
// lexical/category matches may cover only one phrase in a longer sentence.
|
|
669
|
+
if (strictClauseProof) {
|
|
670
|
+
const text = acceptanceCriterionText(task, criterion);
|
|
671
|
+
return /^(?:Run the configured verification[.]?|The configured verification command passes after the final mutation[.]?)$/.test(text)
|
|
672
|
+
&& passingVerifier ? verifierEvidence : undefined;
|
|
673
|
+
}
|
|
699
674
|
|
|
700
675
|
if (obligation === "read-only-evidence") {
|
|
701
676
|
const readOnlyEvidence = durableContextEvidenceEntries(task);
|
|
702
|
-
const readOnlyOk = task.changeMode === "read-only"
|
|
677
|
+
const readOnlyOk = (task.changeMode === "read-only" || task.mutationPolicy === "forbidden")
|
|
703
678
|
&& corpus.files.length === 0
|
|
704
679
|
&& hasDurableContextEvidence(task);
|
|
705
680
|
if (readOnlyOk) return {
|
|
@@ -716,9 +691,9 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
|
|
|
716
691
|
].filter(Boolean).join("\n");
|
|
717
692
|
const combinedText = `${taskText}\n${corpus.allText}`;
|
|
718
693
|
const sourceChangeReadOnlyOk = corpus.files.length > 0
|
|
719
|
-
&&
|
|
694
|
+
&& boundaryPatterns.length > 0
|
|
695
|
+
&& readOnlyBoundaryTiedToPattern(combinedText, boundaryPatterns)
|
|
720
696
|
&& changedFilesRespectBoundaries(corpus.files, boundaryPatterns)
|
|
721
|
-
&& (boundaryPatterns.length === 0 || pathBoundaryMentioned(combinedText, boundaryPatterns))
|
|
722
697
|
&& hasDurableContextEvidence(task);
|
|
723
698
|
if (sourceChangeReadOnlyOk) {
|
|
724
699
|
return {
|
|
@@ -732,54 +707,56 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
|
|
|
732
707
|
return undefined;
|
|
733
708
|
}
|
|
734
709
|
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
710
|
+
const precedence = acceptancePrecedenceReceiptEvidence({ obligation, taskText: acceptanceCriterionText(task, criterion), sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries, namedTargets: namedCodeTargets(task, criterion, corpus.sourceText), passingVerifier, verifierEvidence, sourceFiles: corpus.sourceFiles, testFiles: corpus.testFiles, verifierCoversTests: verifierCommandsCoverTests(task, corpus.testFiles, cwd) }); if (precedence.handled) return precedence.evidence;
|
|
711
|
+
|
|
712
|
+
const generic = genericCriterionEvidence({ obligation, task, criterion, taskText: acceptanceTaskText(task), corpus, verifierEvidence, passingVerifier, cwd });
|
|
713
|
+
if (generic.handled) {
|
|
714
|
+
// A neutral artifact (for example a runbook) has no executable source
|
|
715
|
+
// linkage. Passing project smoke cannot establish its required content;
|
|
716
|
+
// use the existing finite missing-proof handoff without granting authority.
|
|
717
|
+
if (!generic.evidence && passingVerifier && criterion.priority === "critical"
|
|
718
|
+
&& obligation === "requested-behavior" && corpus.adapter.status === "neutral"
|
|
719
|
+
&& corpus.files.length > 0) sourceProofRequiredIds?.add(criterion.id);
|
|
720
|
+
return generic.evidence;
|
|
738
721
|
}
|
|
739
722
|
|
|
740
723
|
if (!corpus.adapter.proofCapable) return undefined;
|
|
741
724
|
|
|
742
725
|
if (obligation === "tenant-boundary") {
|
|
743
|
-
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion);
|
|
726
|
+
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion, cwd);
|
|
744
727
|
}
|
|
745
728
|
|
|
746
729
|
if (obligation === "tenant-storage-isolation") {
|
|
747
|
-
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion);
|
|
730
|
+
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion, cwd);
|
|
748
731
|
}
|
|
749
732
|
|
|
750
733
|
if (obligation === "authorization-deny-case") {
|
|
751
|
-
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion);
|
|
734
|
+
return focusedContractEvidence(obligation, task, corpus, verifierEvidence, criterion, cwd);
|
|
752
735
|
}
|
|
753
736
|
|
|
754
737
|
if (obligation === "invalid-input-rejection") {
|
|
755
|
-
const
|
|
756
|
-
|
|
757
|
-
sourceText: corpus.sourceText,
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
738
|
+
const criterionText = invalidInputCriterionText(task, criterion);
|
|
739
|
+
const result = invalidInputReceiptProof({
|
|
740
|
+
proofInput: { taskText: criterionText, contextText: acceptanceTaskText(task), sourceText: corpus.sourceText, testText: corpus.testText,
|
|
741
|
+
sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries,
|
|
742
|
+
namedTargets: namedCodeTargets(task, criterion, corpus.sourceText, criterionText),
|
|
743
|
+
provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText, criterionText) },
|
|
744
|
+
passingVerifier, verifierEvidence, sourceFiles: corpus.sourceFiles, testFiles: corpus.testFiles,
|
|
745
|
+
verifierCoversTests: verifierCommandsCoverTests(task, corpus.testFiles, cwd)
|
|
763
746
|
});
|
|
764
|
-
if (
|
|
765
|
-
|
|
766
|
-
...verifierEvidence,
|
|
767
|
-
kind: "verifier-backed-focused-test",
|
|
768
|
-
summary: "Configured verifier passed with focused invalid-input tests for named entrypoints.",
|
|
769
|
-
paths: [...new Set([...corpus.sourceFiles, ...corpus.testFiles])]
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
return undefined;
|
|
747
|
+
if (result.sourceProofRequired) sourceProofRequiredIds?.add(criterion.id);
|
|
748
|
+
return result.evidence;
|
|
773
749
|
}
|
|
774
750
|
|
|
775
751
|
if (obligation === "boundary-case") {
|
|
752
|
+
if (!boundaryTargetHasLiveSuccess({ task, criterion, corpus })) return undefined;
|
|
776
753
|
const expirySourceOk = /\b(?:expiresat|expiry|expires|expired|timestamp|now)\b/.test(corpus.sourceText)
|
|
777
754
|
&& /(?:===|!==|>=|<=|>|<)/.test(corpus.sourceText);
|
|
778
755
|
const testOk = /boundary|edge|zero|ceil|clamp|min|max|inclusive|exact|equal|equality|expired|expiry|past|future|partial|round|falsey|falsy|nullish|default|retrylimit|label|\bfalse\b|\b0\b/.test(corpus.testText);
|
|
779
756
|
const sourceOk = /math\.ceil|ceil|clamp|min|max|round|zero|return\s+0|\?\?|nullish|falsey|falsy|default|retrylimit|enabled|label/.test(corpus.sourceText)
|
|
780
757
|
|| expirySourceOk
|
|
781
758
|
|| (passingVerifier && corpus.sourceFiles.length > 0 && testOk);
|
|
782
|
-
if (passingVerifier && corpus.sourceFiles.length > 0 && corpus.testFiles
|
|
759
|
+
if (passingVerifier && corpus.sourceFiles.length > 0 && verifierCommandsCoverTests(task, corpus.testFiles, cwd) && sourceOk && testOk) {
|
|
783
760
|
return {
|
|
784
761
|
...verifierEvidence,
|
|
785
762
|
kind: "verifier-backed-focused-test",
|
|
@@ -790,19 +767,56 @@ function evidenceForObligation(obligation, task, corpus, currentWorkingTreeDiges
|
|
|
790
767
|
return undefined;
|
|
791
768
|
}
|
|
792
769
|
|
|
793
|
-
return
|
|
770
|
+
return genericFallbackEvidence({ behavioral: generic.behavioral, corpus, verifierEvidence, passingVerifier });
|
|
794
771
|
}
|
|
795
772
|
|
|
796
773
|
export function refreshAcceptanceReceipt(task, options = {}) {
|
|
797
774
|
const receipt = normalizeAcceptanceReceipt(task?.acceptanceReceipt);
|
|
798
|
-
if (!receipt) return { task, missing: [], criticalMissing: [], changed: false };
|
|
775
|
+
if (!receipt) return { task, missing: [], criticalMissing: [], adapterAbstained: [], independentRequired: [], sourceProofRequired: [], changed: false };
|
|
799
776
|
const cwd = options.cwd;
|
|
800
777
|
const changedFiles = uniqueStrings(options.changedFiles ?? task.changedFiles ?? task.observedChangedFiles ?? []);
|
|
801
778
|
const currentWorkingTreeDigest = options.currentWorkingTreeDigest;
|
|
779
|
+
const workspaceRevisionDigest = verificationProjectionWorkspaceRevision(task, options);
|
|
802
780
|
const recordedAt = options.recordedAt ?? new Date().toISOString();
|
|
803
781
|
const corpus = cwd ? changedFileAcceptanceCorpus(cwd, changedFiles) : emptyAcceptanceCorpus(changedFiles);
|
|
782
|
+
const independent = independentAcceptanceState(cwd, task, currentWorkingTreeDigest).assessments;
|
|
783
|
+
const sourceProofRequiredIds = new Set();
|
|
804
784
|
let changed = false;
|
|
805
|
-
for (const criterion of receipt.criteria) {
|
|
785
|
+
for (const [index, criterion] of receipt.criteria.entries()) {
|
|
786
|
+
if (!acceptanceCriterionBindingValid(task, receipt, criterion, index)) {
|
|
787
|
+
changed = resetUnprovenCriterion(criterion) || changed;
|
|
788
|
+
continue;
|
|
789
|
+
}
|
|
790
|
+
const compound = compoundAcceptanceCriterion(task.acceptanceCriteria[index]);
|
|
791
|
+
const runtimeArtifactContent = receipt.source === "runtime" && task.changeMode === "source-change"
|
|
792
|
+
&& criterion.obligation === "requested-behavior" && corpus.adapter.status === "neutral"
|
|
793
|
+
&& corpus.files.length > 0;
|
|
794
|
+
if ((compound || runtimeArtifactContent) && criterion.priority !== "critical") { criterion.priority = "critical"; changed = true; }
|
|
795
|
+
if (independent.has(criterion.id)) { changed = applyIndependentCriterionAssessment(criterion, independent.get(criterion.id), currentWorkingTreeDigest, recordedAt) || changed; continue; }
|
|
796
|
+
if (compound) {
|
|
797
|
+
const group = boundAcceptanceClauseGroup(task, receipt, criterion, index);
|
|
798
|
+
const childEvidence = group && task.changeMode === "source-change" && cwd
|
|
799
|
+
&& task.workingTreeDigestAlgorithm === WORKING_TREE_DIGEST_ALGORITHM && isCurrentWorkingTreeDigest(currentWorkingTreeDigest)
|
|
800
|
+
? group.children.map(child => {
|
|
801
|
+
const inferred = inferAcceptanceObligations(child.text, task.changeMode);
|
|
802
|
+
const obligation = inferred.find(item => item !== "verification-evidence" && item !== "backward-compatibility")
|
|
803
|
+
?? (isVerificationOnlyCriterion(child.text) ? "verification-evidence" : undefined)
|
|
804
|
+
?? (inferred.includes("backward-compatibility") ? "backward-compatibility" : "requested-behavior");
|
|
805
|
+
const derived = { id: child.id, hash: child.hash, obligation, priority: "critical", status: "pending", evidence: [] };
|
|
806
|
+
const projected = { ...task, expectedOutput: [task.expectedOutput, group.context].filter(Boolean).join("\n"),
|
|
807
|
+
acceptanceCriteria: task.acceptanceCriteria.map((text, position) => position === index ? child.text : text),
|
|
808
|
+
acceptanceReceipt: { ...receipt, criteria: receipt.criteria.map((item, position) => position === index ? derived : item) } };
|
|
809
|
+
const evidence = evidenceForObligation(obligation, projected, corpus, currentWorkingTreeDigest, derived, cwd,
|
|
810
|
+
workspaceRevisionDigest, undefined, options.apiBaselineEvidence, true);
|
|
811
|
+
return { id: child.id, hash: child.hash, evidence };
|
|
812
|
+
}) : [];
|
|
813
|
+
const evidence = allClauseEvidence(group, childEvidence, currentWorkingTreeDigest);
|
|
814
|
+
const previous = JSON.stringify(criterion);
|
|
815
|
+
resetUnprovenCriterion(criterion);
|
|
816
|
+
if (evidence) addEvidence(criterion, evidence, recordedAt);
|
|
817
|
+
changed = JSON.stringify(criterion) !== previous || changed;
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
806
820
|
if (task?.changeMode === "source-change" && cwd) {
|
|
807
821
|
const previousStatus = criterion.status;
|
|
808
822
|
const previousEvidence = (criterion.evidence ?? []).map(evidenceKey);
|
|
@@ -810,7 +824,7 @@ export function refreshAcceptanceReceipt(task, options = {}) {
|
|
|
810
824
|
criterion.evidence = [];
|
|
811
825
|
const evidence = task?.workingTreeDigestAlgorithm === WORKING_TREE_DIGEST_ALGORITHM
|
|
812
826
|
&& isCurrentWorkingTreeDigest(currentWorkingTreeDigest)
|
|
813
|
-
? evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion)
|
|
827
|
+
? evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, sourceProofRequiredIds, options.apiBaselineEvidence)
|
|
814
828
|
: undefined;
|
|
815
829
|
if (evidence) addEvidence(criterion, evidence, recordedAt);
|
|
816
830
|
const nextEvidence = (criterion.evidence ?? []).map(evidenceKey);
|
|
@@ -818,17 +832,15 @@ export function refreshAcceptanceReceipt(task, options = {}) {
|
|
|
818
832
|
continue;
|
|
819
833
|
}
|
|
820
834
|
if (criterion.status === "satisfied") continue;
|
|
821
|
-
const evidence = evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion);
|
|
835
|
+
const evidence = evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, undefined, options.apiBaselineEvidence);
|
|
822
836
|
if (evidence) changed = addEvidence(criterion, evidence, recordedAt) || changed;
|
|
823
837
|
}
|
|
824
|
-
const missing =
|
|
825
|
-
|
|
838
|
+
const { missing, criticalMissing, adapterAbstained, independentRequired, sourceProofRequired } = missingAcceptanceProofCapabilities(task, receipt, {
|
|
839
|
+
corpus, passingVerifier: hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest),
|
|
840
|
+
taskText: acceptanceTaskText(task), independentAssessments: independent, sourceProofRequiredIds
|
|
841
|
+
});
|
|
826
842
|
return {
|
|
827
|
-
task: { ...task, acceptanceReceipt: receipt },
|
|
828
|
-
receipt,
|
|
829
|
-
missing,
|
|
830
|
-
criticalMissing,
|
|
831
|
-
changed
|
|
843
|
+
task: { ...task, acceptanceReceipt: receipt }, receipt, missing, criticalMissing, adapterAbstained, independentRequired, sourceProofRequired, changed
|
|
832
844
|
};
|
|
833
845
|
}
|
|
834
846
|
|
|
@@ -847,31 +859,47 @@ export function acceptanceCriticalRecoveryProjection(task, options = {}) {
|
|
|
847
859
|
const corpus = changedFileAcceptanceCorpus(cwd, changedFiles);
|
|
848
860
|
if (!corpus.adapter.proofCapable) return [];
|
|
849
861
|
if (corpus.sourceEntries.length === 0 && corpus.testEntries.length === 0) return [];
|
|
850
|
-
const
|
|
862
|
+
const workspaceRevisionDigest = verificationProjectionWorkspaceRevision(task, options);
|
|
863
|
+
const verifierCurrent = hasCurrentPassingVerifier(task, currentWorkingTreeDigest, workspaceRevisionDigest);
|
|
864
|
+
const independent = independentAcceptanceState(cwd, task, currentWorkingTreeDigest).assessments;
|
|
851
865
|
const projections = [];
|
|
852
866
|
for (const criterion of receipt.criteria.filter((item) => item.priority === "critical")) {
|
|
867
|
+
// Advisory recovery must honor the same live authority as receipt refresh.
|
|
868
|
+
// A copied status or stale/failed assessment cannot suppress missing proof.
|
|
869
|
+
const assessment = independent.get(criterion.id);
|
|
870
|
+
if (assessment?.verdict === "pass" && assessment.completionAllowed === true) continue;
|
|
871
|
+
const disposition = criterionBehaviorProofDisposition({ obligation: criterion.obligation, task, criterion, taskText: acceptanceTaskText(task), corpus, passingVerifier: verifierCurrent });
|
|
853
872
|
const criterionText = (Array.isArray(task?.acceptanceCriteria) ? task.acceptanceCriteria : [])
|
|
854
873
|
.find((text) => typeof text === "string" && sha256(text) === criterion.hash && !GENERATED_ACCEPTANCE_TEXTS.has(text));
|
|
855
|
-
if (!criterionText
|
|
856
|
-
const
|
|
857
|
-
|
|
874
|
+
if (!criterionText) continue;
|
|
875
|
+
const api = apiBaselineRecoveryProjection({ task, criterion, criterionText, cwd, corpus, currentWorkingTreeDigest, workspaceRevisionDigest, apiBaselineEvidence: options.apiBaselineEvidence }); if (api.handled) { if (api.projection) projections.push(api.projection); continue; }
|
|
876
|
+
if (compoundAcceptanceCriterion(criterionText)) {
|
|
877
|
+
projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText, targets: [], missingDimensions: ["independent-compound-proof"], proofHints: ["Use an approved independent assessment covering every clause of this exact criterion. A partial verifier or source heuristic cannot prove the group; do not edit source solely to satisfy that heuristic."] });
|
|
878
|
+
continue;
|
|
879
|
+
}
|
|
880
|
+
if (disposition === "unknown") { projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: [], missingDimensions: ["adapter-linkage"], proofHints: ["Add a focused executable test with a direct relative import to the changed source, or configure a deterministic language adapter that resolves this helper/barrel path; then rerun the exact verifier."] }); continue; }
|
|
881
|
+
if (evidenceForObligation(criterion.obligation, task, corpus, currentWorkingTreeDigest, criterion, cwd, workspaceRevisionDigest, undefined, options.apiBaselineEvidence)) continue;
|
|
882
|
+
const evidenceCriterionText = criterion.obligation === "invalid-input-rejection" ? invalidInputCriterionText(task, criterion) : criterionText;
|
|
883
|
+
const targets = namedCodeTargets(task, criterion, corpus.sourceText, evidenceCriterionText);
|
|
884
|
+
const missingDimensions = [], sourceProofReasons = [];
|
|
858
885
|
if (!verifierCurrent) missingDimensions.push("current-verifier");
|
|
859
886
|
if (criterion.obligation === "invalid-input-rejection") {
|
|
860
887
|
if (corpus.sourceFiles.length === 0 || corpus.testFiles.length === 0) continue;
|
|
861
888
|
const proof = acceptanceInvalidInputEvidence({
|
|
862
|
-
taskText:
|
|
889
|
+
taskText: evidenceCriterionText, contextText: acceptanceTaskText(task), sourceText: corpus.sourceText, testText: corpus.testText,
|
|
863
890
|
sourceEntries: corpus.sourceEntries, testEntries: corpus.testEntries,
|
|
864
|
-
namedTargets: targets, provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText)
|
|
891
|
+
namedTargets: targets, provenanceTargets: explicitlyCallableTargets(task, criterion, corpus.sourceText, evidenceCriterionText), includeDiagnostics: true
|
|
865
892
|
});
|
|
866
|
-
if (!proof.sourceOk) missingDimensions.push("source-
|
|
893
|
+
if (!proof.sourceOk) { missingDimensions.push("source-proof-unknown"); sourceProofReasons.push(...(proof.sourceReasons ?? [])); }
|
|
867
894
|
if (!proof.testOk) missingDimensions.push("executable-focused-test");
|
|
868
895
|
}
|
|
869
896
|
if (missingDimensions.length === 0) missingDimensions.push("focused-evidence");
|
|
870
|
-
const
|
|
871
|
-
|
|
897
|
+
const diagnosticHints = sourceProofReasons.length > 0 ? [`Source proof abstained: ${sourceProofReasons.join(", ")}. This is missing verification evidence, not an observed implementation defect.`, ...temporalProofReasonGuidance(sourceProofReasons)] : [];
|
|
898
|
+
const proofHints = [...diagnosticHints, ...acceptanceContractProofGuidance(evidenceCriterionText)];
|
|
899
|
+
if (missingDimensions.includes("source-proof-unknown")) proofHints.push("Use an approved independent validator for the declared invalid partitions and error classes. Do not rewrite source solely to satisfy the analyzer; source repair needs a concrete observed counterexample.");
|
|
872
900
|
if (missingDimensions.includes("executable-focused-test")) proofHints.push("Add live entrypoint-bound rejection assertions; dynamic, skipped, dead, mutable, or unresolved proof remains pending.");
|
|
873
901
|
if (missingDimensions.includes("current-verifier")) proofHints.push("Run the exact configured verifier against one unchanged current working-tree snapshot.");
|
|
874
|
-
projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: uniqueStrings(targets).slice(0, 8), missingDimensions: uniqueStrings(missingDimensions), proofHints: uniqueStrings(proofHints).slice(0, 6).map((hint) => hint.slice(0, 300)) });
|
|
902
|
+
projections.push({ criterionId: criterion.id, criterionHash: criterion.hash, criterionText: criterionText.slice(0, 700), targets: uniqueStrings(targets).slice(0, 8), missingDimensions: uniqueStrings(missingDimensions), proofHints: uniqueStrings(proofHints).slice(0, 6).map((hint) => hint.slice(0, 300)), diagnosticHints: uniqueStrings(diagnosticHints).slice(0, 2).map((hint) => hint.slice(0, 300)) });
|
|
875
903
|
}
|
|
876
904
|
return projections.slice(0, MAX_CRITERIA);
|
|
877
905
|
}
|
|
@@ -902,7 +930,7 @@ export function acceptanceReceiptValidationErrors(value) {
|
|
|
902
930
|
}
|
|
903
931
|
if (value.helperUsage !== undefined) {
|
|
904
932
|
const usage = value.helperUsage;
|
|
905
|
-
if (!isRecord(usage) || hasUnsupportedField(usage, HELPER_USAGE_FIELDS) || !["off", "recommend", "on"].includes(usage.mode) || typeof usage.used !== "boolean" || !Array.isArray(usage.reasonCodes) || usage.reasonCodes.length > 16 || usage.reasonCodes.some((item) => typeof item !== "string" || compactId(item) !== item) || !Array.isArray(usage.helpers) || usage.helpers.length > 3 || !validTimestamp(usage.recordedAt)) errors.push("acceptanceReceipt helperUsage is invalid");
|
|
933
|
+
if (!isRecord(usage) || hasUnsupportedField(usage, HELPER_USAGE_FIELDS) || !["off", "recommend", "on"].includes(usage.mode) || typeof usage.used !== "boolean" || (usage.decision !== undefined && !["dispatch", "skip"].includes(usage.decision)) || (usage.projectedSavingsRatio !== undefined && usage.projectedSavingsRatio !== null && (typeof usage.projectedSavingsRatio !== "number" || !Number.isFinite(usage.projectedSavingsRatio) || usage.projectedSavingsRatio < -10 || usage.projectedSavingsRatio > 1)) || !Array.isArray(usage.reasonCodes) || usage.reasonCodes.length > 16 || usage.reasonCodes.some((item) => typeof item !== "string" || compactId(item) !== item) || !Array.isArray(usage.helpers) || usage.helpers.length > 3 || !validTimestamp(usage.recordedAt)) errors.push("acceptanceReceipt helperUsage is invalid");
|
|
906
934
|
else for (const helper of usage.helpers) if (!isRecord(helper) || hasUnsupportedField(helper, HELPER_ENTRY_FIELDS) || !HELPER_ROLES.has(helper.role) || typeof helper.disposition !== "string" || compactId(helper.disposition) !== helper.disposition || !HASH.test(String(helper.requestRef)) || (helper.outputDigest !== null && !HASH.test(String(helper.outputDigest))) || !Number.isInteger(helper.calls) || helper.calls < 0 || helper.calls > 100 || !Number.isInteger(helper.tokens) || helper.tokens < 0 || helper.tokens > 100_000_000) errors.push("acceptanceReceipt helper entry is invalid");
|
|
907
935
|
}
|
|
908
936
|
if (!Array.isArray(value.criteria) || value.criteria.length === 0 || value.criteria.length > MAX_CRITERIA) {
|