@piagent/platform 1.6.1 → 1.8.0
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 +71 -0
- package/README.md +8 -2
- package/README.vi.md +11 -2
- package/adapters/common/assurance-producers.json +109 -0
- package/adapters/common/structured-assurance-facts.mjs +153 -0
- package/adapters/node-typescript/contract-families.json +2811 -0
- package/adapters/node-typescript/contract-families.md +90 -0
- package/benchmarks/production-v1/grade.mjs +20 -0
- package/benchmarks/production-v1/spend-control.v1.json +3 -3
- package/benchmarks/production-v2/grade.mjs +892 -0
- package/benchmarks/production-v2/project/README.md +7 -0
- package/benchmarks/production-v2/project/config/service.json +4 -0
- package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v2/project/docs/ops.md +3 -0
- package/benchmarks/production-v2/project/logs/incident.log +2 -0
- package/benchmarks/production-v2/project/package.json +11 -0
- package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
- package/benchmarks/production-v2/project/src/data/csv.js +3 -0
- package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v2/project/src/data/migration.js +9 -0
- package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
- package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v2/project/src/platform/args.js +10 -0
- package/benchmarks/production-v2/project/src/platform/config.js +7 -0
- package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v2/project/vendor/README.md +1 -0
- package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
- package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
- package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
- package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
- package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
- package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
- package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
- package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v2/spend-control.v1.json +115 -0
- package/benchmarks/production-v2/suite.json +1009 -0
- package/benchmarks/production-v2/variant.mjs +169 -0
- package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
- package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
- package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
- package/benchmarks/production-v3/grade.mjs +1017 -0
- package/benchmarks/production-v3/project/README.md +7 -0
- package/benchmarks/production-v3/project/config/service.json +4 -0
- package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v3/project/docs/ops.md +3 -0
- package/benchmarks/production-v3/project/logs/incident.log +2 -0
- package/benchmarks/production-v3/project/package.json +11 -0
- package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
- package/benchmarks/production-v3/project/src/data/csv.js +3 -0
- package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v3/project/src/data/migration.js +9 -0
- package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
- package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v3/project/src/platform/args.js +10 -0
- package/benchmarks/production-v3/project/src/platform/config.js +7 -0
- package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
- package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v3/project/vendor/README.md +1 -0
- package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
- package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
- package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
- package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
- package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
- package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
- package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
- package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
- package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
- package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
- package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
- package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
- package/benchmarks/production-v3/spend-control.v1.json +121 -0
- package/benchmarks/production-v3/suite.json +1010 -0
- package/benchmarks/production-v3/variant.mjs +178 -0
- package/catalog/capabilities.json +2 -2
- package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
- package/docs/benchmark-public-contract-addendum-v2.md +85 -0
- package/docs/benchmark-public-contract-addendum-v3.md +116 -0
- package/docs/command-reference-vietnamese.md +10 -7
- package/docs/context-window-policy.md +3 -3
- package/docs/distribution-standard.md +9 -9
- package/docs/languages.json +2 -2
- package/docs/model-options.md +20 -15
- package/docs/operator-manual-vietnamese.md +12 -12
- package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
- package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
- package/docs/piagent-core-improvement-plan.md +528 -0
- package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
- package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
- package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
- package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
- package/docs/piagent-open-session-wait.md +19 -0
- package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
- package/docs/publishing-for-teams.md +3 -0
- package/docs/quality-benchmark.md +128 -8
- package/docs/quickstart-vietnamese.md +2 -2
- package/docs/release-install-policy.md +38 -11
- package/docs/research/harness-next-evidence-review.md +113 -0
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/runtime.html +1 -1
- package/docs-site/content/en/whats-new.html +23 -0
- package/docs-site/content/runtime.html +2 -2
- package/docs-site/content/whats-new.html +23 -0
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +1 -1
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +1 -1
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +2 -2
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +24 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +1 -1
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +3 -3
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +24 -1
- package/docs-site/workflows.html +1 -1
- package/evals/architecture-conformance-v1/lane.json +18 -0
- package/evals/architecture-conformance-v1/runner.mjs +77 -0
- package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
- package/evals/fixtures/approved-host-contracts.valid.json +43 -0
- package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
- package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
- package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
- package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
- package/evals/fixtures/composite-criterion.invalid.json +10 -0
- package/evals/fixtures/composite-criterion.valid.json +33 -0
- package/evals/fixtures/contract-family-library.invalid.json +42 -0
- package/evals/fixtures/contract-family-library.valid.json +41 -0
- package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
- package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
- package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
- package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
- package/evals/fs5-artifact-archive/README.md +32 -0
- package/evals/fs5-artifact-archive/manifest.json +148 -0
- package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
- package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
- package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
- package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
- package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
- package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
- package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
- package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
- package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
- package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
- package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
- package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
- package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
- package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
- package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
- package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
- package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
- package/evals/fs5-causal-arm.v1.json +9 -5
- package/evals/fs5-pilot-protocol.v1.json +1 -1
- package/evals/fs5-pilot-protocol.v4.json +4 -4
- package/evals/fs5-pilot-protocol.v5.json +6 -5
- package/evals/harness-next/development-corpus.mjs +106 -0
- package/evals/harness-next/resource-budget-probe.mjs +38 -0
- package/evals/harness-next/run-calibration.mjs +83 -0
- package/evals/harness-next/run-resource-probe.mjs +55 -0
- package/evals/harness-next/selected-development-corpus.mjs +27 -0
- package/evals/harness-next.v1.json +51 -0
- package/evals/long-horizon-v1/README.md +19 -0
- package/evals/long-horizon-v1/runner.mjs +116 -48
- package/evals/long-horizon-v1/worker.mjs +77 -30
- package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
- package/evals/private-holdout-v1/README.md +5 -2
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +2 -2
- package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
- package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
- package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
- package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
- package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
- package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
- package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
- package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
- package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
- package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
- package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
- package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
- package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
- package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
- package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
- package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
- package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
- package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
- package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
- package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
- package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
- package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
- package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
- package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
- package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
- package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
- package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
- package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
- package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
- package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
- package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
- package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
- package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
- package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
- package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
- package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
- package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
- package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
- package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
- package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
- package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
- package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
- package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
- package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
- package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
- package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
- package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
- package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
- package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
- package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
- package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
- package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
- package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
- package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
- package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
- package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
- package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
- package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
- package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
- package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
- package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
- package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
- package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
- package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
- package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
- package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
- package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
- package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
- package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
- package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
- package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
- package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
- package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
- package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
- package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
- package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
- package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
- package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
- package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
- package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
- package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
- package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
- package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
- package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
- package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
- package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
- package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
- package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
- package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
- package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
- package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
- package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
- package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
- package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
- package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
- package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
- package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
- package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
- package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
- package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
- package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
- package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
- package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
- package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
- package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
- package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
- package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
- package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
- package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
- package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
- package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
- package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
- package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
- package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
- package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
- package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
- package/packages/piagent-core/extensions/context-engine.js +11 -6
- package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/guard-types.ts +5 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
- package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
- package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
- package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
- package/packages/piagent-core/extensions/task-contract-view.js +4 -4
- package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
- package/packages/piagent-core/extensions/task-journal.js +48 -3
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +74 -38
- package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
- package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
- package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-revision.js +48 -0
- package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
- package/packages/piagent-core/package.json +3 -3
- package/packages/piagent-core/policies/base-policy.json +1 -0
- package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
- package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
- package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
- package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
- package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
- package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
- package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
- package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
- package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
- package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
- package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
- package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
- package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
- package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
- package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
- package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
- package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
- package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
- package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
- package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
- package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
- package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
- package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
- package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
- package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
- package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
- package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
- package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
- package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
- package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
- package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
- package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
- package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
- package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
- package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
- package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
- package/packages/piagent-core/runtime/session/usage.ts +4 -3
- package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
- package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
- package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
- package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
- package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
- package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
- package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
- package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
- package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
- package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
- package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
- package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
- package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
- package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
- package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
- package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
- package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
- package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
- package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
- package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
- package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
- package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
- package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
- package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
- package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
- package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
- package/packages/piagent-webui/dist/client/assets/index-Cui9AAV_.js +176 -0
- package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
- package/packages/piagent-webui/dist/client/index.html +2 -2
- package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
- package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
- package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
- package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
- package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
- package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
- package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
- package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
- package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
- package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
- package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
- package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
- package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
- package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
- package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
- package/packages/piagent-webui/gateway/session-inspection-registry.ts +14 -6
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
- package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
- package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
- package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
- package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
- package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
- package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
- package/packages/piagent-webui/server/loopback-server.ts +9 -7
- package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
- package/packages/piagent-webui/server/transcript-projection.ts +65 -12
- package/packages/piagent-webui/shared/message-correlation.ts +25 -0
- package/schemas/approved-host-contracts.schema.json +973 -0
- package/schemas/benchmark-attempt-outcome.schema.json +303 -0
- package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
- package/schemas/composite-criterion.schema.json +788 -0
- package/schemas/contract-family-library.schema.json +28 -0
- package/schemas/contract-selection-recipe.schema.json +31 -0
- package/schemas/failure-evidence.schema.json +2 -2
- package/schemas/helper-request.schema.json +16 -4
- package/schemas/host-contract-plan.schema.json +25 -0
- package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
- package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
- package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
- package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
- package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
- package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
- package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
- package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
- package/schemas/public-contracts/revocation-v1.schema.json +87 -0
- package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
- package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
- package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
- package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
- package/schemas/task-contract.schema.json +30 -0
- package/scripts/approve-independent-verification.mjs +57 -0
- package/scripts/benchmark-arm-observer.mjs +320 -0
- package/scripts/benchmark-budget-ipc.mjs +34 -0
- package/scripts/benchmark-budget-launcher.mjs +91 -0
- package/scripts/benchmark-budget-processes.mjs +133 -0
- package/scripts/benchmark-budget-publication.mjs +228 -0
- package/scripts/benchmark-budget-runtime.mjs +136 -0
- package/scripts/benchmark-candidate-ablation.mjs +265 -0
- package/scripts/benchmark-codex-journey.mjs +406 -0
- package/scripts/benchmark-independent-verification.mjs +628 -0
- package/scripts/benchmark-journey-outcome.mjs +92 -0
- package/scripts/benchmark-production-v3-human-review.mjs +192 -0
- package/scripts/benchmark-public-input-catalog.mjs +158 -0
- package/scripts/benchmark-registered-plan-author.mjs +355 -0
- package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
- package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
- package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
- package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
- package/scripts/benchmark-runner-completion.mjs +133 -0
- package/scripts/benchmark-runner-configuration.mjs +159 -0
- package/scripts/benchmark-runner-core.mjs +217 -388
- package/scripts/benchmark-runner-finalization.mjs +140 -27
- package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
- package/scripts/benchmark-runner-schedule.mjs +256 -0
- package/scripts/benchmark-runner-support.mjs +136 -4
- package/scripts/benchmark-runner.mjs +95 -18
- package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
- package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
- package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
- package/scripts/benchmark-scoped-pi-router.mjs +196 -0
- package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
- package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
- package/scripts/benchmark-scoped-session-custody.mjs +599 -0
- package/scripts/benchmark-scoped-session-factory.mjs +342 -0
- package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
- package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
- package/scripts/benchmark-session-evaluator.mjs +169 -0
- package/scripts/benchmark-session-provider-boundary.mjs +62 -0
- package/scripts/benchmark-session-usage.mjs +28 -0
- package/scripts/benchmark-session.mjs +343 -50
- package/scripts/benchmark-webui-journey.mjs +678 -0
- package/scripts/check-public-wording.mjs +46 -0
- package/scripts/configure-model-scope.sh +6 -2
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/install-global.sh +2 -2
- package/scripts/model-route-evaluation-core.ts +1 -0
- package/scripts/phase-tools-evaluation.mjs +1 -0
- package/scripts/pi-auto.sh +7 -1
- package/scripts/pi-model-route.mjs +1 -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/setup.sh +2 -2
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +37 -56
- package/scripts/verify-release-identity.mjs +5 -3
- package/templates/global/settings.json +5 -1
- package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { observedFocusedTestSummary, retainFocusedVerification, unresolvedFocusedVerification } from "./acceptance-focused-verification.js";
|
|
1
2
|
import fs from "node:fs";
|
|
2
3
|
import os from "node:os";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import crypto from "node:crypto";
|
|
5
6
|
import { execFileSync } from "node:child_process";
|
|
6
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { apiBaselineCriterionEvidence as apiBaselineEvidence } from "../runtime/verification/acceptance-api-baseline.js";
|
|
7
9
|
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
8
10
|
import { StringEnum } from "@earendil-works/pi-ai";
|
|
9
11
|
import { Type } from "typebox";
|
|
@@ -17,6 +19,7 @@ import {
|
|
|
17
19
|
unresolvedExpansionReason
|
|
18
20
|
} from "./shell-reach.ts";
|
|
19
21
|
import { extractShellWritePathCandidates, shellHasFileWriteRedirection } from "./shell-write-targets.js";
|
|
22
|
+
import { isProjectMutatingShellCommand, isReadOnlyTaskShellCommand } from "./readonly-inline-inspection.ts";
|
|
20
23
|
import { commandMatchesVerifyPlan, createBashResultLedger, findMatchingObservedBashResult, readObservedBashResults } from "./runtime-evidence.js";
|
|
21
24
|
import { findPackageRoot, findPlatformRoot, readJsonFile } from "./guard-io.js";
|
|
22
25
|
import {
|
|
@@ -70,25 +73,22 @@ import {
|
|
|
70
73
|
priorTaskAttempts, repositoryFileManifest, repositoryFileManifestDetails, resolveTaskContract, safeTaskId, summarizeAttempt, taskContractValidationErrors, taskDigestMigrationArchiveStatus,
|
|
71
74
|
workPlanDependencyError, workingTreeSnapshot, workingTreeSnapshotHasUnavailableEvidence, writeTaskContract
|
|
72
75
|
} from "./task-state.js";
|
|
73
|
-
import { classifyRecordedVerificationFailure, classifyVerificationFailure, latestObservedVerification, meaningfulVerificationCommands, selectCompletionRecoveryClassification, selectVerificationPlan } from "./verification-intelligence.js";
|
|
76
|
+
import { classifyRecordedVerificationFailure, classifyVerificationFailure, latestObservedVerification, meaningfulVerificationCommands, recordedFailureForObservation, selectCompletionRecoveryClassification, selectVerificationPlan } from "./verification-intelligence.js";
|
|
74
77
|
import { executionBackendToolDecision } from "./execution-backend.js";
|
|
75
78
|
import { replayTaskCheckpoints } from "./task-journal.js";
|
|
76
79
|
import type { FailureClassification } from "./failure-types.ts";
|
|
77
80
|
import { recordCompletionAudit, recordMutationCheckpoint, recordTaskProgressCheckpoints, recordTaskStartCheckpoint, recordVerificationCheckpoint } from "./task-runtime-audit.js";
|
|
78
81
|
import {
|
|
79
|
-
applyAcceptanceRecoveryProvenance,
|
|
80
|
-
|
|
81
|
-
acceptanceProofGuidance,
|
|
82
|
-
acceptanceSemanticConflicts,
|
|
83
|
-
buildAcceptanceReceipt,
|
|
84
|
-
invalidateAcceptanceReceiptAfterMutation,
|
|
85
|
-
refreshAcceptanceReceipt
|
|
82
|
+
applyAcceptanceRecoveryProvenance, acceptanceBaselineGuidance, acceptanceProofGuidance, acceptanceSemanticConflicts,
|
|
83
|
+
buildAcceptanceReceipt, invalidateAcceptanceReceiptAfterMutation, refreshAcceptanceReceipt
|
|
86
84
|
} from "./acceptance-receipt.js";
|
|
87
85
|
import { acceptanceLanguageAdapterForPath, isAcceptanceTestPath } from "./acceptance-language-adapters.js";
|
|
88
86
|
import { allVerifyCommandsPassCurrentTree, changedSnapshotFiles, compactTaskDetails, mergeObservedTaskContext, passingVerifyCommandsForDigest, taskDeltaFilesFromSnapshot } from "./task-contract-view.js";
|
|
89
87
|
import { applyRuntimeLifecycleObservation, runtimeLifecycleMode, workingTreeEvidenceDigest } from "./task-lifecycle.js";
|
|
90
88
|
import { completeTaskDigestRefresh } from "./task-digest-migration.js";
|
|
91
89
|
import { WORKING_TREE_DIGEST_ALGORITHM, isCurrentWorkingTreeDigest, workingTreeObservation, workingTreeSnapshotUsesCurrentAlgorithm } from "./working-tree-digest.js";
|
|
90
|
+
import { currentWorkspaceRevisionDigest } from "./workspace-revision.js";
|
|
91
|
+
import { captureWorkspaceVerificationSnapshot } from "./workspace-verification-snapshot.js";
|
|
92
92
|
import { appendJsonlBounded } from "./state-retention.js";
|
|
93
93
|
import { ensurePrivateStateDirectory, resolveLocalStatePath } from "./local-state-path.js";
|
|
94
94
|
import { hasDurableContextEvidence } from "./context-evidence.js";
|
|
@@ -104,6 +104,7 @@ import {
|
|
|
104
104
|
import { cleanSessionNameInput, currentSessionName, hasOperatorSessionName } from "../runtime/session/message-signals.ts";
|
|
105
105
|
import { buildSemanticCompactionInstructions } from "../runtime/session/system-prompt.ts";
|
|
106
106
|
import { buildContextPreflight, buildUsageSnapshot, formatContextPreflight, formatCount, formatPercent, formatUsageSnapshot } from "../runtime/session/usage.ts";
|
|
107
|
+
import { registerTaskUsageHooks } from "../runtime/product/task-usage-hooks.ts";
|
|
107
108
|
import {
|
|
108
109
|
formatToolResultCaptureStatus,
|
|
109
110
|
readRecentToolResultCaptures
|
|
@@ -111,6 +112,9 @@ import {
|
|
|
111
112
|
import { RuntimeSessionState } from "../runtime/session/runtime-state.ts";
|
|
112
113
|
import type { ObservedTaskContext } from "../runtime/session/runtime-state.ts";
|
|
113
114
|
import { reuseCurrentTreeExactVerifier } from "../runtime/verification/exact-verifier-reuse.ts";
|
|
115
|
+
import { IndependentAcceptanceRuntime } from "../runtime/verification/independent-acceptance-runtime.ts";
|
|
116
|
+
import { independentAcceptanceState } from "./acceptance-independent-registry.js";
|
|
117
|
+
import { independentVerificationRecovery } from "../runtime/recovery/independent-verification-recovery.ts";
|
|
114
118
|
import {
|
|
115
119
|
PIAGENT_TOOL_GROUPS,
|
|
116
120
|
PIAGENT_TOOL_NAMES,
|
|
@@ -119,6 +123,7 @@ import {
|
|
|
119
123
|
} from "../runtime/tools/tool-groups.ts";
|
|
120
124
|
import type { PiagentToolGroup } from "../runtime/tools/tool-groups.ts";
|
|
121
125
|
import { freshRequestParts, shortTaskLabel } from "../runtime/workflows/input-routing.ts";
|
|
126
|
+
import { completedFollowupAcceptanceEvidenceFiles } from "../runtime/workflows/task-followup-policy.ts";
|
|
122
127
|
import {
|
|
123
128
|
automaticAcceptanceCriteria,
|
|
124
129
|
automaticReviewLenses,
|
|
@@ -142,7 +147,8 @@ import { readRuntimeVersionMetadata, RuntimeSnapshotCapture } from "../runtime/m
|
|
|
142
147
|
import { recordRuntimeSnapshotTelemetry } from "../runtime/model/snapshot-telemetry.ts";
|
|
143
148
|
import { captureAuthenticatedModelCatalogFromContext } from "../runtime/model/authenticated-catalog.ts";
|
|
144
149
|
import { normalizeOpenAiCodexReasoningPayload } from "../runtime/model/openai-codex-reasoning.ts";
|
|
145
|
-
import { buildOpenAiCodexWireFingerprint } from "../runtime/model/provider-wire-fingerprint.ts";
|
|
150
|
+
import { buildOpenAiCodexWireFingerprint, measureProviderPayload } from "../runtime/model/provider-wire-fingerprint.ts";
|
|
151
|
+
import { registerFastModeCommand, ServiceTierRuntime } from "../runtime/model/service-tier-runtime.ts";
|
|
146
152
|
import { ModelRouteRuntime, readModelRouteEvents } from "../runtime/model/model-route-runtime.ts";
|
|
147
153
|
import { parentRoutingModeFromEnvironment, routingObjectiveFromEnvironment } from "../runtime/model/model-route-policy.ts";
|
|
148
154
|
import { ModelSelectionProvenanceTracker } from "../runtime/model/model-selection-provenance.ts";
|
|
@@ -156,7 +162,7 @@ import { PhaseToolRuntime, phaseToolModeFromEnvironment } from "../runtime/tools
|
|
|
156
162
|
import { parseApplyPatchTargets, registerApplyPatchTool } from "../runtime/tools/apply-patch-tool.ts";
|
|
157
163
|
import { authorityReplacementState, ensureTaskAuthorityResumePolicy } from "../runtime/policy/authority-resume-policy.ts";
|
|
158
164
|
import { taskAuthorityDecision } from "../runtime/policy/task-authority-runtime.ts";
|
|
159
|
-
import { selectRecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
|
|
165
|
+
import { applyProofCapabilityHandoff, selectRecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
|
|
160
166
|
import type { RecoveryDecision } from "../runtime/recovery/recovery-policy.ts";
|
|
161
167
|
import { inspectTaskResumeState } from "../runtime/recovery/resume-state.ts";
|
|
162
168
|
import { SemanticRepairRuntime } from "../runtime/recovery/semantic-repair-runtime.ts";
|
|
@@ -169,6 +175,7 @@ import { performanceReviewToolDecision, performanceReviewToolKind } from "../run
|
|
|
169
175
|
import { expectedModelMutationProof } from "../runtime/quality/model-mutation-proof.ts";
|
|
170
176
|
import { EditFreshnessGuard, editFreshnessModeFromEnvironment } from "../runtime/quality/edit-freshness-guard.ts";
|
|
171
177
|
import { captureVerifierFileSnapshot } from "../runtime/inspection/verifier-snapshot-store.ts";
|
|
178
|
+
import { finalGateConfig } from "./acceptance-diagnostic-policy.ts";
|
|
172
179
|
import { fallbackBasePolicy } from "./fallback-base-policy.ts";
|
|
173
180
|
import { prefixCompletions, registerPiagentTool, registerRuntimeCommand, registerRuntimeTool } from "../runtime/registration/extension-registration.ts";
|
|
174
181
|
import { FRESH_COMMAND_ACTIONS, FRESH_COMMAND_HELP, ONBOARDING_COMMAND_ACTIONS, WORKFLOW_COMMAND_EXCLUSIONS } from "../runtime/registration/operator-catalogs.ts";
|
|
@@ -201,7 +208,6 @@ import type {
|
|
|
201
208
|
ContextIndexSettings,
|
|
202
209
|
ExecPolicyConfig,
|
|
203
210
|
ExternalActionPolicyConfig,
|
|
204
|
-
FinalGateConfig,
|
|
205
211
|
MemorySettings,
|
|
206
212
|
OrchestrationMode,
|
|
207
213
|
OrchestrationPolicySettings,
|
|
@@ -236,7 +242,7 @@ type TaskStartParameters = {
|
|
|
236
242
|
riskLane: "tiny" | "normal" | "high-risk";
|
|
237
243
|
intakeMode?: "model" | "runtime";
|
|
238
244
|
changeMode?: "source-change" | "read-only";
|
|
239
|
-
mutationPolicy?: "required" | "forbidden";
|
|
245
|
+
mutationPolicy?: "required" | "allowed" | "forbidden";
|
|
240
246
|
verifyGroup?: string;
|
|
241
247
|
maxAttempts?: number;
|
|
242
248
|
expectedOutput: string;
|
|
@@ -297,7 +303,6 @@ const TECH_OPTIONS: TechOption[] = [
|
|
|
297
303
|
{ id: "node-typescript", label: "Node TypeScript", role: "runtime", description: "Node.js TypeScript library/tooling project.", context7Query: "typescript node.js", topics: ["typescript", "node", "testing"] },
|
|
298
304
|
{ id: "python", label: "Python", role: "runtime", description: "Python app/library runtime.", context7Query: "python", topics: ["packaging", "typing", "testing"] }
|
|
299
305
|
];
|
|
300
|
-
|
|
301
306
|
const PROFILE_TECH_ROLES: Record<string, TechRole[]> = {
|
|
302
307
|
"web-frontend": ["frontend", "database"],
|
|
303
308
|
"backend-api": ["backend", "database"],
|
|
@@ -311,7 +316,6 @@ const PROFILE_TECH_ROLES: Record<string, TechRole[]> = {
|
|
|
311
316
|
docs: ["docs"],
|
|
312
317
|
generic: ["runtime"]
|
|
313
318
|
};
|
|
314
|
-
|
|
315
319
|
const DEFAULT_MEMORY_SETTINGS: Required<MemorySettings> = {
|
|
316
320
|
enabled: true,
|
|
317
321
|
mode: "manual",
|
|
@@ -324,7 +328,6 @@ const DEFAULT_MEMORY_SETTINGS: Required<MemorySettings> = {
|
|
|
324
328
|
maxInjectedChars: 4000,
|
|
325
329
|
externalPackages: []
|
|
326
330
|
};
|
|
327
|
-
|
|
328
331
|
const DEFAULT_CONTEXT_INDEX_SETTINGS: Required<ContextIndexSettings> = {
|
|
329
332
|
enabled: true,
|
|
330
333
|
path: CONTEXT_INDEX_FILE,
|
|
@@ -335,14 +338,12 @@ const DEFAULT_CONTEXT_INDEX_SETTINGS: Required<ContextIndexSettings> = {
|
|
|
335
338
|
includeTechStack: true,
|
|
336
339
|
includeMemoryPointers: true
|
|
337
340
|
};
|
|
338
|
-
|
|
339
341
|
const DEFAULT_RUNTIME_POLICY: Required<RuntimePolicySettings> = {
|
|
340
342
|
execPolicy: "enforce",
|
|
341
343
|
contextBudget: "enforce",
|
|
342
344
|
toolRegistry: "advisory",
|
|
343
345
|
finalGate: "enforce"
|
|
344
346
|
};
|
|
345
|
-
|
|
346
347
|
const DEFAULT_ORCHESTRATION_POLICY: ResolvedOrchestrationPolicy = {
|
|
347
348
|
defaultMode: "solo-first",
|
|
348
349
|
maxConcurrentSubagents: 1,
|
|
@@ -368,7 +369,6 @@ const DEFAULT_ORCHESTRATION_POLICY: ResolvedOrchestrationPolicy = {
|
|
|
368
369
|
"Keep review lenses explicit so cheap review work catches drift before release."
|
|
369
370
|
]
|
|
370
371
|
};
|
|
371
|
-
|
|
372
372
|
const PERMISSION_PROFILE_MODES = ["read-only", "workspace-write", "trusted-full-access"] as const;
|
|
373
373
|
const PERMISSION_PROFILE_ALIASES: Record<string, PermissionProfileMode> = {
|
|
374
374
|
readonly: "read-only",
|
|
@@ -389,14 +389,11 @@ const WRITE_TOOL_NAMES = new Set(["write", "edit"]);
|
|
|
389
389
|
const SHELL_TOOL_NAMES = new Set(["bash", "shell", "exec"]);
|
|
390
390
|
const MAX_MCP_PROXY_ARGS_CHARS = 131_072;
|
|
391
391
|
const SESSION_PERMISSION_OVERRIDES = new Map<string, PermissionProfileMode>();
|
|
392
|
-
|
|
393
392
|
const DEFAULT_POLICY = fallbackBasePolicy(CONTEXT_INDEX_FILE, DEFAULT_ORCHESTRATION_POLICY);
|
|
394
|
-
|
|
395
393
|
// Which platform supplies the adapters is fixed by where this file is installed,
|
|
396
394
|
// so it is resolved once here rather than threaded through every profile load.
|
|
397
395
|
const PLATFORM_ROOT = findPlatformRoot(path.dirname(fileURLToPath(import.meta.url)));
|
|
398
396
|
const UPDATE_CHECK_MODULE = fileURLToPath(new URL("./update-check.js", import.meta.url));
|
|
399
|
-
|
|
400
397
|
// The installed version, read from the package this file ships in. A maintainer
|
|
401
398
|
// working in the repository is not running a release and has nothing to update
|
|
402
399
|
// to, so only a tree Pi or npm placed is given a version to compare.
|
|
@@ -404,7 +401,6 @@ function installedPlatformVersion(): string | undefined {
|
|
|
404
401
|
if (!isInstalledPlatform(PLATFORM_ROOT)) return undefined;
|
|
405
402
|
return readJsonFile<{ version?: string }>(path.join(PLATFORM_ROOT, "package.json"))?.version;
|
|
406
403
|
}
|
|
407
|
-
|
|
408
404
|
function updateAvailabilityNotice(): string | undefined {
|
|
409
405
|
const installed = installedPlatformVersion();
|
|
410
406
|
if (!installed) return undefined;
|
|
@@ -1297,16 +1293,6 @@ function externalActionPolicyConfig(policy: BasePolicy): Required<ExternalAction
|
|
|
1297
1293
|
};
|
|
1298
1294
|
}
|
|
1299
1295
|
|
|
1300
|
-
function finalGateConfig(policy: BasePolicy): Required<FinalGateConfig> {
|
|
1301
|
-
return {
|
|
1302
|
-
defaultMode: policy.finalGate?.defaultMode ?? DEFAULT_POLICY.finalGate?.defaultMode ?? "enforce",
|
|
1303
|
-
requireTaskContract: policy.finalGate?.requireTaskContract ?? true,
|
|
1304
|
-
requireContextManifest: policy.finalGate?.requireContextManifest ?? true,
|
|
1305
|
-
requireVerifyEvidence: policy.finalGate?.requireVerifyEvidence ?? true,
|
|
1306
|
-
requireTrace: policy.finalGate?.requireTrace ?? true,
|
|
1307
|
-
requirePassingVerify: policy.finalGate?.requirePassingVerify ?? true
|
|
1308
|
-
};
|
|
1309
|
-
}
|
|
1310
1296
|
|
|
1311
1297
|
function boundedInteger(value: unknown, fallback: number, minimum: number, maximum: number): number {
|
|
1312
1298
|
const numberValue = typeof value === "number" ? value : Number(value);
|
|
@@ -1699,32 +1685,6 @@ function isTaskMutationTool(toolName: string, input: Record<string, unknown>): b
|
|
|
1699
1685
|
.some((token) => tokens.has(token));
|
|
1700
1686
|
}
|
|
1701
1687
|
|
|
1702
|
-
function isReadOnlyTaskShellCommand(
|
|
1703
|
-
command: string,
|
|
1704
|
-
segments: Array<{ words: string[] }>
|
|
1705
|
-
): boolean {
|
|
1706
|
-
if (/[<>]|`|\$\(/.test(command)) {
|
|
1707
|
-
return false;
|
|
1708
|
-
}
|
|
1709
|
-
const safeCommands = new Set(["pwd", "ls", "find", "rg", "grep", "cat", "sed", "head", "tail", "wc", "stat", "file", "test", "[", "which", "printf", "sort"]);
|
|
1710
|
-
const safeGitSubcommands = new Set(["status", "diff", "log", "show", "ls-files", "rev-parse"]);
|
|
1711
|
-
return segments.length > 0 && segments.every((segment) => {
|
|
1712
|
-
const words = segment.words.filter(Boolean);
|
|
1713
|
-
const executable = path.basename(words[0] ?? "");
|
|
1714
|
-
if (executable === "sed" && words.some((word) => /^-.*i/.test(word))) return false;
|
|
1715
|
-
if (executable === "find" && words.some((word) => ["-delete", "-exec", "-execdir", "-ok", "-okdir", "-fprint", "-fprint0", "-fprintf", "-fls"].includes(word))) return false;
|
|
1716
|
-
if (executable === "sort" && words.slice(1).some((word) => (
|
|
1717
|
-
word === "--output"
|
|
1718
|
-
|| word.startsWith("--output=")
|
|
1719
|
-
|| /^-[^-]*o/.test(word)
|
|
1720
|
-
))) return false;
|
|
1721
|
-
if (safeCommands.has(executable)) return true;
|
|
1722
|
-
if (executable === "git") return safeGitSubcommands.has(words[1] ?? "");
|
|
1723
|
-
if (executable === "command") return words[1] === "-v";
|
|
1724
|
-
return false;
|
|
1725
|
-
});
|
|
1726
|
-
}
|
|
1727
|
-
|
|
1728
1688
|
function shellTouchesGrantedSourceCheckout(cwd: string, command: string, roots: string[]): boolean {
|
|
1729
1689
|
if (roots.length === 0) return false;
|
|
1730
1690
|
for (const root of roots) {
|
|
@@ -1735,37 +1695,6 @@ function shellTouchesGrantedSourceCheckout(cwd: string, command: string, roots:
|
|
|
1735
1695
|
.some((candidate) => Boolean(grantedSourceCheckoutRootForPath(cwd, normalizeRelative(cwd, candidate) ?? candidate, roots)));
|
|
1736
1696
|
}
|
|
1737
1697
|
|
|
1738
|
-
const PROJECT_MUTATING_EXECUTABLES = new Set([
|
|
1739
|
-
"apply_patch", "bash", "chmod", "chown", "cp", "dd", "install", "ln", "make", "mkdir", "mv", "prename", "rename",
|
|
1740
|
-
"node", "patch", "perl", "php", "python", "python3", "rm", "rmdir", "rsync", "ruby", "scp", "sh",
|
|
1741
|
-
"tee", "touch", "truncate", "zsh"
|
|
1742
|
-
]);
|
|
1743
|
-
|
|
1744
|
-
function isProjectMutatingShellCommand(command: string, segments: Array<{ words: string[] }>): boolean {
|
|
1745
|
-
if (shellHasFileWriteRedirection(command)) return true;
|
|
1746
|
-
const noAliases = new Map<string, string>();
|
|
1747
|
-
for (const segment of segments) {
|
|
1748
|
-
const words = segment.words.filter(Boolean);
|
|
1749
|
-
if (words.length === 0) continue;
|
|
1750
|
-
if (externalExecutableIndex(words, PROJECT_MUTATING_EXECUTABLES, noAliases) !== undefined) return true;
|
|
1751
|
-
const executable = path.basename(words[0] ?? "").toLowerCase();
|
|
1752
|
-
if (executable === "find" && words.some((word) => ["-delete", "-exec", "-execdir", "-ok", "-okdir", "-fprint", "-fprint0", "-fprintf", "-fls"].includes(word))) return true;
|
|
1753
|
-
if (executable === "sed" && words.some((word) => /^-[^-]*i/.test(word) || word === "--in-place" || word.startsWith("--in-place="))) return true;
|
|
1754
|
-
if (executable === "git") {
|
|
1755
|
-
const subcommand = words.slice(1).find((word, index, values) => {
|
|
1756
|
-
if (!word.startsWith("-")) return index === 0 || !["-C", "-c", "--git-dir", "--work-tree"].includes(values[index - 1]);
|
|
1757
|
-
return false;
|
|
1758
|
-
});
|
|
1759
|
-
if (["apply", "checkout", "clean", "mv", "reset", "restore", "rm", "switch"].includes(subcommand ?? "")) return true;
|
|
1760
|
-
}
|
|
1761
|
-
if (["npm", "pnpm", "yarn", "bun"].includes(executable)) {
|
|
1762
|
-
const subcommand = words.find((word, index) => index > 0 && !word.startsWith("-"));
|
|
1763
|
-
if (["add", "ci", "install", "link", "remove", "uninstall", "update", "upgrade"].includes(subcommand ?? "")) return true;
|
|
1764
|
-
}
|
|
1765
|
-
}
|
|
1766
|
-
return false;
|
|
1767
|
-
}
|
|
1768
|
-
|
|
1769
1698
|
const EXPLICIT_SHELL_MUTATORS = new Set([
|
|
1770
1699
|
"apply_patch", "chmod", "chown", "cp", "dd", "install", "ln", "mkdir", "mv", "patch", "prename", "rename",
|
|
1771
1700
|
"rm", "rmdir", "rsync", "scp", "tee", "touch", "truncate"
|
|
@@ -1937,18 +1866,20 @@ function recordObservedTaskVerification(
|
|
|
1937
1866
|
},
|
|
1938
1867
|
pendingContext: ObservedTaskContext[],
|
|
1939
1868
|
maxManifestFiles: number, shellSnapshotBefore?: Record<string, string>,
|
|
1940
|
-
eventTree?: ReturnType<typeof
|
|
1941
|
-
readProtectedPaths: string[] = []
|
|
1869
|
+
eventTree?: ReturnType<typeof captureWorkspaceVerificationSnapshot>,
|
|
1870
|
+
readProtectedPaths: string[] = [], preWorkspaceRevisionDigest?: string, diagnosticFocused = false
|
|
1942
1871
|
): TaskContract | undefined {
|
|
1943
1872
|
const task = activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined;
|
|
1944
1873
|
if (!task || task.trace.outcome !== "pending") return;
|
|
1945
1874
|
const command = String(observed.normalizedCommand ?? observed.command ?? "").trim();
|
|
1946
1875
|
const observedAtMs = Date.parse(observed.recordedAt ?? "");
|
|
1947
1876
|
const taskCreatedAtMs = Date.parse(task.createdAt);
|
|
1877
|
+
const matchedProfileCommand = commandMatchesVerifyPlan(command, task.verifyCommands);
|
|
1878
|
+
const focusedTest = diagnosticFocused && observedFocusedTestSummary(observed.outputText);
|
|
1948
1879
|
if (
|
|
1949
1880
|
!command
|
|
1950
1881
|
|| !observed.commandHash
|
|
1951
|
-
|| !
|
|
1882
|
+
|| (!matchedProfileCommand && !focusedTest)
|
|
1952
1883
|
|| !Number.isFinite(observedAtMs)
|
|
1953
1884
|
|| !Number.isFinite(taskCreatedAtMs)
|
|
1954
1885
|
|| observedAtMs < taskCreatedAtMs
|
|
@@ -1957,6 +1888,7 @@ function recordObservedTaskVerification(
|
|
|
1957
1888
|
if (!eventTree?.proofCapable) return;
|
|
1958
1889
|
const currentDigests = eventTree.snapshot as Record<string, string>;
|
|
1959
1890
|
const currentDigest = eventTree.digest;
|
|
1891
|
+
const workspaceRevisionDigest = eventTree.workspaceRevisionDigest ?? undefined;
|
|
1960
1892
|
const preWorkingTreeDigest = shellSnapshotBefore && workingTreeSnapshotUsesCurrentAlgorithm(shellSnapshotBefore) ? workingTreeEvidenceDigest(shellSnapshotBefore) : undefined;
|
|
1961
1893
|
const exitCode = Number.isInteger(observed.exitCode) ? observed.exitCode as number : observed.isError ? 1 : 0;
|
|
1962
1894
|
const classification = classifyVerificationFailure(observed.outputText, exitCode);
|
|
@@ -1964,6 +1896,7 @@ function recordObservedTaskVerification(
|
|
|
1964
1896
|
evidence.command.trim() === command
|
|
1965
1897
|
&& evidence.exitCode === exitCode
|
|
1966
1898
|
&& evidence.workingTreeDigest === currentDigest && evidence.observedAt === observed.recordedAt
|
|
1899
|
+
&& evidence.workspaceRevisionDigest === workspaceRevisionDigest && evidence.preWorkspaceRevisionDigest === preWorkspaceRevisionDigest
|
|
1967
1900
|
));
|
|
1968
1901
|
const contextAdded = mergeObservedTaskContext(task, pendingContext, maxManifestFiles, redactText);
|
|
1969
1902
|
if (!duplicate) {
|
|
@@ -1972,16 +1905,17 @@ function recordObservedTaskVerification(
|
|
|
1972
1905
|
task.verifyEvidence.push({
|
|
1973
1906
|
command: redactText(command),
|
|
1974
1907
|
exitCode,
|
|
1975
|
-
summary: `Runtime observed configured verifier exit ${exitCode} (${classification.category}${classification.retryable ? ", retryable" : ""}).`,
|
|
1908
|
+
summary: `Runtime observed ${matchedProfileCommand ? "configured" : "focused"} verifier exit ${exitCode} (${classification.category}${classification.retryable ? ", retryable" : ""}).`,
|
|
1976
1909
|
recordedAt: evidenceRecordedAt,
|
|
1977
1910
|
observed: true,
|
|
1978
1911
|
observedAt,
|
|
1979
1912
|
isError: observed.isError === true,
|
|
1980
|
-
matchedProfileCommand
|
|
1913
|
+
matchedProfileCommand,
|
|
1981
1914
|
preWorkingTreeDigest,
|
|
1982
|
-
workingTreeDigest: currentDigest
|
|
1915
|
+
workingTreeDigest: currentDigest,
|
|
1916
|
+
preWorkspaceRevisionDigest, workspaceRevisionDigest
|
|
1983
1917
|
});
|
|
1984
|
-
task.verifyEvidence = task.verifyEvidence.slice(-100);
|
|
1918
|
+
task.verifyEvidence = diagnosticFocused ? retainFocusedVerification(task.verifyEvidence, currentDigest, workspaceRevisionDigest) : task.verifyEvidence.slice(-100);
|
|
1985
1919
|
try {
|
|
1986
1920
|
captureVerifierFileSnapshot({
|
|
1987
1921
|
projectRoot: ctx.cwd, taskId: task.taskId, taskRunId: task.taskRunId, sessionId: task.sessionId,
|
|
@@ -1994,18 +1928,20 @@ function recordObservedTaskVerification(
|
|
|
1994
1928
|
}
|
|
1995
1929
|
}
|
|
1996
1930
|
|
|
1997
|
-
const
|
|
1998
|
-
const
|
|
1999
|
-
const
|
|
1931
|
+
const taskLocalDelta = taskChangedFileEvidence(ctx.cwd, task, currentDigests).expected;
|
|
1932
|
+
const hasChanges = taskLocalDelta.length > 0;
|
|
1933
|
+
const verificationCanSettleSourceTask = hasChanges || task.mutationPolicy === "allowed";
|
|
1934
|
+
const allPassing = verificationCanSettleSourceTask && allVerifyCommandsPassCurrentTree(task, currentDigest, workspaceRevisionDigest ?? null);
|
|
1935
|
+
const lifecycle = verificationCanSettleSourceTask
|
|
2000
1936
|
? applyRuntimeLifecycleObservation(task, allPassing ? "verification-complete" : "verification-pending", nowIso())
|
|
2001
1937
|
: { changed: false, mode: runtimeLifecycleMode(task) };
|
|
2002
1938
|
const acceptance = refreshAcceptanceReceipt(task, {
|
|
2003
|
-
cwd: ctx.cwd,
|
|
2004
|
-
changedFiles:
|
|
1939
|
+
cwd: ctx.cwd, apiBaselineEvidence,
|
|
1940
|
+
changedFiles: taskAcceptanceEvidenceFiles(ctx.cwd, task, currentDigests, taskLocalDelta),
|
|
2005
1941
|
currentWorkingTreeDigest: currentDigest
|
|
2006
1942
|
});
|
|
2007
1943
|
task.acceptanceReceipt = acceptance.task.acceptanceReceipt;
|
|
2008
|
-
if (!task.workingTreeDigestMigration || (shellSnapshotBefore && changedSnapshotFiles(shellSnapshotBefore, currentDigests).length === 0)) Object.assign(task, completeTaskDigestRefresh(task, currentDigest));
|
|
1944
|
+
if (!task.workingTreeDigestMigration || (shellSnapshotBefore && changedSnapshotFiles(shellSnapshotBefore, currentDigests).length === 0)) Object.assign(task, completeTaskDigestRefresh(task, currentDigest, workspaceRevisionDigest ?? null));
|
|
2009
1945
|
if (duplicate && contextAdded.length === 0 && !lifecycle.changed) return task;
|
|
2010
1946
|
|
|
2011
1947
|
const written = writeTask(ctx.cwd, task);
|
|
@@ -2035,7 +1971,8 @@ function recordObservedTaskVerification(
|
|
|
2035
1971
|
retryable: classification.retryable,
|
|
2036
1972
|
failureClassification: classification,
|
|
2037
1973
|
preWorkingTreeDigest,
|
|
2038
|
-
workingTreeDigest: currentDigest
|
|
1974
|
+
workingTreeDigest: currentDigest,
|
|
1975
|
+
preWorkspaceRevisionDigest, workspaceRevisionDigest
|
|
2039
1976
|
}
|
|
2040
1977
|
});
|
|
2041
1978
|
return written;
|
|
@@ -2085,14 +2022,14 @@ function completionTaskProjection(
|
|
|
2085
2022
|
failureReason: undefined,
|
|
2086
2023
|
ruledOut: undefined,
|
|
2087
2024
|
trace: {
|
|
2088
|
-
outcome: "completed",
|
|
2025
|
+
outcome: "completed" as const,
|
|
2089
2026
|
notes: "Runtime finalized from observed context, working-tree changes, current verification, and completed work-plan evidence.",
|
|
2090
2027
|
recordedAt: nowIso()
|
|
2091
2028
|
}
|
|
2092
2029
|
};
|
|
2093
2030
|
return refreshAcceptanceReceipt(projected, {
|
|
2094
|
-
cwd,
|
|
2095
|
-
changedFiles,
|
|
2031
|
+
cwd, apiBaselineEvidence,
|
|
2032
|
+
changedFiles: taskAcceptanceEvidenceFiles(cwd, projected, finalFileDigests, changedFiles),
|
|
2096
2033
|
currentWorkingTreeDigest: workingTreeEvidenceDigest(finalFileDigests)
|
|
2097
2034
|
}).task as TaskContract;
|
|
2098
2035
|
}
|
|
@@ -3505,6 +3442,20 @@ function taskChangedFileEvidence(
|
|
|
3505
3442
|
};
|
|
3506
3443
|
}
|
|
3507
3444
|
|
|
3445
|
+
function taskAcceptanceEvidenceFiles(
|
|
3446
|
+
cwd: string,
|
|
3447
|
+
task: TaskContract,
|
|
3448
|
+
currentDigests: Record<string, string>,
|
|
3449
|
+
taskLocalDelta: string[] = taskChangedFileEvidence(cwd, task, currentDigests).expected
|
|
3450
|
+
): string[] {
|
|
3451
|
+
return completedFollowupAcceptanceEvidenceFiles(
|
|
3452
|
+
task,
|
|
3453
|
+
listTaskContracts(cwd) as TaskContract[],
|
|
3454
|
+
taskLocalDelta,
|
|
3455
|
+
currentDigests
|
|
3456
|
+
);
|
|
3457
|
+
}
|
|
3458
|
+
|
|
3508
3459
|
function exactReviewPathCoverage(expectedPaths: string[], reviewedPaths: string[] | undefined): boolean {
|
|
3509
3460
|
const expected = [...new Set(expectedPaths)].sort();
|
|
3510
3461
|
const reviewed = [...new Set(reviewedPaths ?? [])].sort();
|
|
@@ -3543,8 +3494,9 @@ function evaluateTaskGate(
|
|
|
3543
3494
|
warnings: string[];
|
|
3544
3495
|
currentWorkingTreeDigest?: string;
|
|
3545
3496
|
changedFileEvidence?: ReturnType<typeof taskChangedFileEvidence>;
|
|
3497
|
+
acceptanceProof?: { mode: "enforce" | "diagnostic"; pendingCriterionIds: string[]; missing: string[] };
|
|
3546
3498
|
} {
|
|
3547
|
-
const finalGate = finalGateConfig(policy);
|
|
3499
|
+
const finalGate = finalGateConfig(policy, DEFAULT_POLICY);
|
|
3548
3500
|
const missing: string[] = [];
|
|
3549
3501
|
const warnings: string[] = [];
|
|
3550
3502
|
if (!task) {
|
|
@@ -3552,14 +3504,24 @@ function evaluateTaskGate(
|
|
|
3552
3504
|
}
|
|
3553
3505
|
const currentDigests = options.currentDigests ?? workingTreeSnapshot(cwd) as Record<string, string>;
|
|
3554
3506
|
const currentWorkingTreeDigest = options.currentWorkingTreeDigest ?? workingTreeEvidenceDigest(currentDigests);
|
|
3507
|
+
const independentState = independentAcceptanceState(cwd, task, currentWorkingTreeDigest);
|
|
3508
|
+
if (independentState.block) missing.push(independentState.block);
|
|
3509
|
+
const compositeFacts = new Set<string>();
|
|
3510
|
+
for (const [id, assessment] of independentState.assessments) {
|
|
3511
|
+
if (assessment.verdict !== "pass") missing.push(`independent contract evidence (${id}:${assessment.verdict}${assessment.executionDiagnostics?.reasons.length ? `; ${assessment.executionDiagnostics.reasons.join(", ")}` : ""})`);
|
|
3512
|
+
else if (assessment.assurance === "bounded-composite-contract-tested" && Array.isArray(assessment.factKinds)) {
|
|
3513
|
+
for (const kind of assessment.factKinds) if (typeof kind === "string") compositeFacts.add(kind);
|
|
3514
|
+
}
|
|
3515
|
+
}
|
|
3516
|
+
const compositeContext = compositeFacts.has("context-current"), compositeVerifier = compositeFacts.has("project-verifier-current");
|
|
3555
3517
|
if (task.workingTreeDigestAlgorithm !== WORKING_TREE_DIGEST_ALGORITHM || task.workingTreeDigestMigration?.status === "verification-refresh-required" || !workingTreeSnapshotUsesCurrentAlgorithm(currentDigests) || !isCurrentWorkingTreeDigest(currentWorkingTreeDigest) || currentWorkingTreeDigest !== workingTreeEvidenceDigest(currentDigests) || Object.values(task.baselineFileDigests).some((digest) => !isCurrentWorkingTreeDigest(digest)) || (task.workingTreeDigestMigration && (!taskDigestMigrationArchiveStatus(cwd, task).valid || replayTaskCheckpoints(cwd, task.taskRunId, task).corruptions.length > 0))) missing.push("current working-tree digest evidence");
|
|
3556
3518
|
if (workingTreeSnapshotHasUnavailableEvidence(currentDigests)) missing.push("complete working-tree content evidence");
|
|
3557
3519
|
if (taskContractValidationErrors(task).length > 0) missing.push("valid session-bound task contract v2");
|
|
3558
3520
|
if (task.attempt > task.maxAttempts) missing.push(`attempt within maxAttempts (${task.attempt}/${task.maxAttempts})`);
|
|
3559
3521
|
const plannedVerifyCommands = meaningfulVerificationCommands(task.verifyCommands);
|
|
3560
|
-
if (task.changeMode === "source-change" && plannedVerifyCommands.length === 0) missing.push("meaningful verify command");
|
|
3561
|
-
if (finalGate.requireContextManifest && !hasDurableContextEvidence(task)) missing.push("context manifest");
|
|
3562
|
-
if (task.changeMode === "source-change" && finalGate.requireVerifyEvidence && task.verifyEvidence.length === 0) missing.push("verify evidence");
|
|
3522
|
+
if (task.changeMode === "source-change" && plannedVerifyCommands.length === 0 && !compositeVerifier) missing.push("meaningful verify command");
|
|
3523
|
+
if (finalGate.requireContextManifest && !hasDurableContextEvidence(task) && !compositeContext) missing.push("context manifest");
|
|
3524
|
+
if (task.changeMode === "source-change" && finalGate.requireVerifyEvidence && task.verifyEvidence.length === 0 && !compositeVerifier) missing.push("verify evidence");
|
|
3563
3525
|
if (task.verifyEvidence.some((evidence) => evidence.observed !== true)) {
|
|
3564
3526
|
warnings.push("Unobserved verify evidence is ignored by the passing verify gate.");
|
|
3565
3527
|
}
|
|
@@ -3574,19 +3536,21 @@ function evaluateTaskGate(
|
|
|
3574
3536
|
warnings.push("Verification evidence from a different working-tree snapshot is stale and is ignored.");
|
|
3575
3537
|
}
|
|
3576
3538
|
let missingVerifyCommands: string[] = [];
|
|
3577
|
-
if (task.changeMode === "source-change" && finalGate.requirePassingVerify && plannedVerifyCommands.length > 0) {
|
|
3578
|
-
const passingCommands = passingVerifyCommandsForDigest(task, currentWorkingTreeDigest);
|
|
3539
|
+
if (task.changeMode === "source-change" && finalGate.requirePassingVerify && plannedVerifyCommands.length > 0 && !compositeVerifier) {
|
|
3540
|
+
const passingCommands = passingVerifyCommandsForDigest(task, currentWorkingTreeDigest, currentWorkspaceRevisionDigest(cwd));
|
|
3579
3541
|
missingVerifyCommands = plannedVerifyCommands.filter((command) => !passingCommands.has(command.trim()));
|
|
3580
3542
|
if (missingVerifyCommands.length > 0) missing.push(`observed passing verify evidence for every configured command (${missingVerifyCommands.length} missing)`);
|
|
3581
3543
|
}
|
|
3544
|
+
if (finalGate.acceptanceProofMode === "diagnostic" && unresolvedFocusedVerification(task.verifyEvidence, currentWorkingTreeDigest, currentWorkspaceRevisionDigest(cwd)).length > 0) missing.push("current passing rerun of failed focused verification");
|
|
3582
3545
|
if (finalGate.requireTrace && task.trace.outcome !== "completed") missing.push("completed final trace");
|
|
3583
3546
|
const incompleteSteps = (task.workPlan ?? []).filter((step) => step.status === "pending" || step.status === "in-progress" || step.status === "failed");
|
|
3584
3547
|
if (task.trace.outcome === "completed" && incompleteSteps.length > 0) {
|
|
3585
3548
|
missing.push(`completed work plan (${incompleteSteps.map((step) => `${step.id}:${step.status}`).join(", ")})`);
|
|
3586
3549
|
}
|
|
3587
3550
|
const changedFileEvidence = taskChangedFileEvidence(cwd, task, currentDigests);
|
|
3551
|
+
const acceptanceEvidenceFiles = taskAcceptanceEvidenceFiles(cwd, task, currentDigests, changedFileEvidence.expected);
|
|
3588
3552
|
if (task.changeMode === "source-change" && task.trace.outcome === "completed" && task.mutationPolicy !== "forbidden") {
|
|
3589
|
-
if (task.changedFiles.length === 0) missing.push("changed files");
|
|
3553
|
+
if (task.mutationPolicy !== "allowed" && task.changedFiles.length === 0) missing.push("changed files");
|
|
3590
3554
|
if (changedFileEvidence.undeclared.length > 0) missing.push(`declared observed changes (${changedFileEvidence.undeclared.join(", ")})`);
|
|
3591
3555
|
if (changedFileEvidence.unsupportedClaims.length > 0) missing.push(`supported changed-file claims (${changedFileEvidence.unsupportedClaims.join(", ")})`);
|
|
3592
3556
|
if (changedFileEvidence.outsideScope.length > 0) {
|
|
@@ -3597,19 +3561,30 @@ function evaluateTaskGate(
|
|
|
3597
3561
|
missing.push(`mutation-forbidden task has observed changes (${changedFileEvidence.expected.join(", ")})`);
|
|
3598
3562
|
}
|
|
3599
3563
|
const acceptance = refreshAcceptanceReceipt(task, {
|
|
3600
|
-
cwd,
|
|
3601
|
-
changedFiles:
|
|
3564
|
+
cwd, apiBaselineEvidence,
|
|
3565
|
+
changedFiles: acceptanceEvidenceFiles,
|
|
3602
3566
|
currentWorkingTreeDigest
|
|
3603
3567
|
});
|
|
3604
3568
|
const semanticEnforcement = taskAuthorityDecision(task, "CAP-13", "block").allowed;
|
|
3569
|
+
// Runtime-derived critical proof gates completion. A zero-delta review
|
|
3570
|
+
// uses its strictly bound evidence scope without claiming a new mutation.
|
|
3571
|
+
// Neutral artifacts with missing content proof use source-proof-required;
|
|
3572
|
+
// unsupported language policy remains under the existing CAP-13 authority.
|
|
3573
|
+
const proofMissing: string[] = [];
|
|
3574
|
+
const runtimeCriticalProofEnforcement = task.changeMode === "source-change"
|
|
3575
|
+
&& task.acceptanceReceipt?.source === "runtime";
|
|
3605
3576
|
const abstainedIds = new Set(acceptance.adapterAbstained.map((criterion) => criterion.id));
|
|
3606
|
-
const
|
|
3607
|
-
const
|
|
3608
|
-
|
|
3609
|
-
|
|
3577
|
+
const independentIds = new Set(acceptance.independentRequired.map((criterion) => criterion.id));
|
|
3578
|
+
const sourceProofIds = new Set(acceptance.sourceProofRequired.map((criterion) => criterion.id));
|
|
3579
|
+
const adapterCritical = acceptance.criticalMissing.filter((criterion) => abstainedIds.has(criterion.id) && !independentIds.has(criterion.id));
|
|
3580
|
+
const linkedCritical = acceptance.criticalMissing.filter((criterion) => !abstainedIds.has(criterion.id) && !independentIds.has(criterion.id) && !sourceProofIds.has(criterion.id));
|
|
3581
|
+
if ((semanticEnforcement || runtimeCriticalProofEnforcement) && sourceProofIds.size > 0) proofMissing.push(`critical acceptance evidence source-proof-required (${acceptance.sourceProofRequired.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: source proof remains unestablished after current focused tests passed; seek assessment, not source repair without a counterexample`);
|
|
3582
|
+
if ((semanticEnforcement || runtimeCriticalProofEnforcement) && independentIds.size > 0) proofMissing.push(`critical acceptance evidence independent-required (${acceptance.independentRequired.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: an approved independent assessment must cover every clause; missing proof is not an observed source defect`);
|
|
3583
|
+
if ((semanticEnforcement || runtimeCriticalProofEnforcement) && linkedCritical.length > 0) proofMissing.push(`critical acceptance evidence (${linkedCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")})`);
|
|
3584
|
+
if (semanticEnforcement && adapterCritical.length > 0) proofMissing.push(`critical acceptance evidence adapter-unresolved (${adapterCritical.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}); remedy: add a direct-relative focused test or configure a deterministic adapter`);
|
|
3610
3585
|
const acceptanceConflicts = acceptanceSemanticConflicts(task, {
|
|
3611
3586
|
cwd,
|
|
3612
|
-
changedFiles:
|
|
3587
|
+
changedFiles: acceptanceEvidenceFiles
|
|
3613
3588
|
});
|
|
3614
3589
|
if (semanticEnforcement && acceptanceConflicts.length > 0) {
|
|
3615
3590
|
missing.push(`acceptance semantic conflicts (${acceptanceConflicts.join(", ")})`);
|
|
@@ -3619,11 +3594,16 @@ function evaluateTaskGate(
|
|
|
3619
3594
|
if (semanticEnforcement && acceptance.adapterAbstained.length > 0) {
|
|
3620
3595
|
warnings.push(`Acceptance proof adapter abstained; rigorous criteria remain pending and hand off without an automatic model retry: ${acceptance.adapterAbstained.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}`);
|
|
3621
3596
|
}
|
|
3622
|
-
if (!semanticEnforcement && (
|
|
3597
|
+
if (!semanticEnforcement && (adapterCritical.length > 0 || acceptanceConflicts.length > 0)) warnings.push("Adapter-unknown acceptance proof and semantic conflicts remain advisory under the pinned task authority; known runtime-linked critical proof still gates source-task completion.");
|
|
3623
3598
|
if (normalMissing.length > 0) {
|
|
3624
3599
|
warnings.push(`Acceptance criteria pending evidence: ${normalMissing.map((criterion) => `${criterion.id}:${criterion.obligation}`).join(", ")}`);
|
|
3625
3600
|
}
|
|
3626
|
-
|
|
3601
|
+
const acceptanceProof = { mode: finalGate.acceptanceProofMode,
|
|
3602
|
+
pendingCriterionIds: acceptance.missing.map(criterion => criterion.id), missing: proofMissing };
|
|
3603
|
+
if (finalGate.acceptanceProofMode === "diagnostic" && acceptanceProof.pendingCriterionIds.length > 0) {
|
|
3604
|
+
warnings.push(`Diagnostic acceptance: ${acceptanceProof.pendingCriterionIds.length} criteria remain unproved; no quality claim. ${proofMissing.join("; ")}`);
|
|
3605
|
+
} else missing.push(...proofMissing);
|
|
3606
|
+
return { decision: missing.length === 0 ? "pass" : "fail", missing, missingVerifyCommands, warnings, currentWorkingTreeDigest, changedFileEvidence, ...(finalGate.acceptanceProofMode === "diagnostic" ? { acceptanceProof } : {}) };
|
|
3627
3607
|
}
|
|
3628
3608
|
|
|
3629
3609
|
function appendTrace(cwd: string, payload: Record<string, unknown>): void {
|
|
@@ -3795,15 +3775,28 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
3795
3775
|
const routingObjective = routingObjectiveFromEnvironment(process.env.PIAGENT_ROUTING_OBJECTIVE);
|
|
3796
3776
|
const autoContextEnabled = environmentFeatureEnabled("PIAGENT_AUTO_CONTEXT");
|
|
3797
3777
|
const autoRecoveryEnabled = environmentFeatureEnabled("PIAGENT_AUTO_RECOVERY");
|
|
3798
|
-
const
|
|
3799
|
-
maxObservedContext: contextBudgetConfig(policy).maxManifestFiles
|
|
3800
|
-
|
|
3778
|
+
const independentVerificationConfigPath = process.env.PIAGENT_INDEPENDENT_VERIFICATION_CONFIG,
|
|
3779
|
+
runtimeState = new RuntimeSessionState({ maxObservedContext: contextBudgetConfig(policy).maxManifestFiles });
|
|
3780
|
+
const independentAcceptance = new IndependentAcceptanceRuntime({ state: runtimeState, installedRoot: PLATFORM_ROOT,
|
|
3781
|
+
configPath: independentVerificationConfigPath,
|
|
3782
|
+
writeTask,
|
|
3783
|
+
activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined,
|
|
3784
|
+
authorizeSourceRead: (ctx, sourcePath) => {
|
|
3785
|
+
if (!ctx.isProjectTrusted()) return false;
|
|
3786
|
+
const profile = loadProfileFromContext(ctx), paths = effectiveProtectedPaths(policy, profile);
|
|
3787
|
+
const capabilities = verifyProjectCapabilityState(extensionDir, ctx.cwd, true, { sessionId: ctx.sessionManager.getSessionId() });
|
|
3788
|
+
if (!capabilities.ok) return false;
|
|
3789
|
+
const permission = resolvePermissionProfile(profile, policy, permissionOverrideFromContext(ctx));
|
|
3790
|
+
return !evaluatePathLikeToolAccess(ctx.cwd, "read", { path: sourcePath }, paths.writeProtectedPaths, paths.readProtectedPaths,
|
|
3791
|
+
paths.readOnlyPaths, permission.mode === "trusted-full-access" ? undefined : capabilities.filesystemRead).block;
|
|
3792
|
+
} });
|
|
3801
3793
|
const editFreshnessGuard = new EditFreshnessGuard(editFreshnessModeFromEnvironment(process.env.PIAGENT_EDIT_FRESHNESS));
|
|
3802
3794
|
const sourceMutationGuardBindings = createSourceMutationGuardBindings(policy, loadProfileFromContext);
|
|
3803
3795
|
const runtimeSnapshotCapture = new RuntimeSnapshotCapture(), runtimeVersions = readRuntimeVersionMetadata(PLATFORM_ROOT);
|
|
3804
3796
|
const solverShadow = solverMode === "off" ? undefined : new SolverShadowRuntime(solverMode);
|
|
3805
3797
|
const modelRouteRuntime = new ModelRouteRuntime(parentRoutingMode, routingObjective);
|
|
3806
3798
|
const modelSelectionProvenance = new ModelSelectionProvenanceTracker();
|
|
3799
|
+
const serviceTierRuntime = new ServiceTierRuntime({ environmentValue: process.env.PIAGENT_FAST_MODE });
|
|
3807
3800
|
const trajectoryRuntime = new TrajectoryRuntime(), phaseToolRuntime = new PhaseToolRuntime(pi, dynamicToolsEnabled ? phaseToolModeFromEnvironment(process.env.PIAGENT_PHASE_TOOLS) : "off", telemetry, (ctx) => {
|
|
3808
3801
|
const task = activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined; return task && authorityReplacementState(ctx.cwd, task).required ? "new-attempt-required" : task?.workingTreeDigestMigration?.status;
|
|
3809
3802
|
}, (ctx) => {
|
|
@@ -3847,8 +3840,25 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
3847
3840
|
providerReasoningReasonCode: normalized.reasonCode
|
|
3848
3841
|
});
|
|
3849
3842
|
}
|
|
3843
|
+
const serviceTier = serviceTierRuntime.applyProviderRequest(
|
|
3844
|
+
pi,
|
|
3845
|
+
ctx,
|
|
3846
|
+
normalized.changed ? normalized.payload : event.payload
|
|
3847
|
+
);
|
|
3848
|
+
if (serviceTier.receipt.enabled || serviceTier.observationChanged) {
|
|
3849
|
+
telemetry(ctx, {
|
|
3850
|
+
event: "provider_request_service_tier",
|
|
3851
|
+
fastMode: serviceTier.receipt.mode,
|
|
3852
|
+
requestedServiceTier: serviceTier.receipt.requestedServiceTier,
|
|
3853
|
+
observedRequestServiceTier: serviceTier.receipt.observedRequestServiceTier,
|
|
3854
|
+
providerResponseServiceTier: serviceTier.receipt.providerResponseServiceTier,
|
|
3855
|
+
providerResponseEvidence: serviceTier.receipt.providerResponseEvidence,
|
|
3856
|
+
applied: serviceTier.receipt.applied,
|
|
3857
|
+
reasonCode: serviceTier.receipt.reasonCode
|
|
3858
|
+
});
|
|
3859
|
+
}
|
|
3850
3860
|
const wire = buildOpenAiCodexWireFingerprint({
|
|
3851
|
-
payload:
|
|
3861
|
+
payload: serviceTier.payload,
|
|
3852
3862
|
provider: ctx.model?.provider,
|
|
3853
3863
|
modelId: ctx.model?.id,
|
|
3854
3864
|
workingDirectory: ctx.cwd,
|
|
@@ -3873,10 +3883,11 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
3873
3883
|
providerTextVerbosity: wire.textVerbosity,
|
|
3874
3884
|
providerToolChoiceKind: wire.toolChoiceKind,
|
|
3875
3885
|
providerToolChoiceHash: wire.toolChoiceHash,
|
|
3876
|
-
requestPrefixFingerprint: wire.requestPrefixFingerprint
|
|
3886
|
+
requestPrefixFingerprint: wire.requestPrefixFingerprint,
|
|
3887
|
+
payloadMeasurement: measureProviderPayload(serviceTier.payload)
|
|
3877
3888
|
});
|
|
3878
3889
|
}
|
|
3879
|
-
return normalized.changed ?
|
|
3890
|
+
return normalized.changed || serviceTier.changed ? serviceTier.payload : undefined;
|
|
3880
3891
|
});
|
|
3881
3892
|
|
|
3882
3893
|
function freshModelRouteBoundary(ctx: ExtensionContext): boolean {
|
|
@@ -3957,6 +3968,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
3957
3968
|
}
|
|
3958
3969
|
}
|
|
3959
3970
|
|
|
3971
|
+
function preferApplyPatchBeforeWriters(toolNames: string[]): string[] {
|
|
3972
|
+
if (!toolNames.includes("apply_patch")) return [...toolNames];
|
|
3973
|
+
const withoutPatch = toolNames.filter((toolName) => toolName !== "apply_patch");
|
|
3974
|
+
const firstWriter = withoutPatch.findIndex((toolName) => toolName === "edit" || toolName === "write");
|
|
3975
|
+
if (firstWriter < 0) return [...toolNames];
|
|
3976
|
+
withoutPatch.splice(firstWriter, 0, "apply_patch");
|
|
3977
|
+
return withoutPatch;
|
|
3978
|
+
}
|
|
3979
|
+
|
|
3960
3980
|
function activateToolGroups(ctx: ExtensionContext, groups: PiagentToolGroup[], additive = false): string[] {
|
|
3961
3981
|
const current = pi.getActiveTools();
|
|
3962
3982
|
if (!dynamicToolsEnabled) return current;
|
|
@@ -3975,7 +3995,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
3975
3995
|
}
|
|
3976
3996
|
}
|
|
3977
3997
|
const ordered = [
|
|
3978
|
-
...current.filter((toolName) => selected.has(toolName) && !PIAGENT_TOOL_NAMES.has(toolName)),
|
|
3998
|
+
...preferApplyPatchBeforeWriters(current.filter((toolName) => selected.has(toolName) && !PIAGENT_TOOL_NAMES.has(toolName))),
|
|
3979
3999
|
...PIAGENT_TOOL_ORDER.filter((toolName) => selected.has(toolName))
|
|
3980
4000
|
];
|
|
3981
4001
|
const unchanged = ordered.length === current.length && ordered.every((toolName, index) => toolName === current[index]);
|
|
@@ -4004,22 +4024,22 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4004
4024
|
let recordedClassification: FailureClassification | undefined;
|
|
4005
4025
|
try {
|
|
4006
4026
|
const replay = replayTaskCheckpoints(ctx.cwd, task.taskRunId, task);
|
|
4007
|
-
if (replay.corruptions.length === 0)
|
|
4008
|
-
|
|
4009
|
-
|
|
4010
|
-
.at(-1) as any;
|
|
4011
|
-
recordedClassification = checkpoint?.evidence?.failureClassification as FailureClassification | undefined;
|
|
4012
|
-
}
|
|
4027
|
+
if (replay.corruptions.length === 0 && failed) recordedClassification = recordedFailureForObservation(
|
|
4028
|
+
replay.checkpoints, failed, currentTreeDigest, currentWorkspaceRevisionDigest(ctx.cwd)
|
|
4029
|
+
) as FailureClassification | undefined;
|
|
4013
4030
|
} catch {
|
|
4014
4031
|
// A missing/corrupt journal cannot grant recovery mutation; the fallback
|
|
4015
4032
|
// classifier remains fail-closed for unknown evidence.
|
|
4016
4033
|
}
|
|
4017
|
-
const
|
|
4034
|
+
const gateClassification = selectCompletionRecoveryClassification(
|
|
4018
4035
|
recordedClassification,
|
|
4019
4036
|
gate?.missing,
|
|
4020
4037
|
summary,
|
|
4021
4038
|
failed?.exitCode ?? 1
|
|
4022
4039
|
);
|
|
4040
|
+
const independentRecovery = independentVerificationRecovery(ctx.cwd, task, currentTreeDigest ?? workingTreeEvidenceDigest(workingTreeSnapshot(ctx.cwd)));
|
|
4041
|
+
const classification = gateClassification.category === "scope-protected-path"
|
|
4042
|
+
? gateClassification : independentRecovery?.classification ?? gateClassification;
|
|
4023
4043
|
const trajectory = trajectoryRuntime.status(ctx.cwd, task.taskRunId);
|
|
4024
4044
|
// Task scope is a retrieval/review hint, not filesystem authority. Recovery
|
|
4025
4045
|
// may update a dependency or config file when repository evidence requires
|
|
@@ -4037,16 +4057,16 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4037
4057
|
classification,
|
|
4038
4058
|
currentPhase: trajectory.enforcementSafe ? trajectory.phase ?? "verify" : "handoff",
|
|
4039
4059
|
history: runtimeState.recoveryHistory(task.taskId),
|
|
4040
|
-
proposedHypothesisRef: classification.reasonCodes[0] ? `reason:${classification.reasonCodes[0]}` : null,
|
|
4060
|
+
proposedHypothesisRef: independentRecovery?.hypothesisRef ?? (classification.reasonCodes[0] ? `reason:${classification.reasonCodes[0]}` : null),
|
|
4041
4061
|
exactVerifierAvailable: (gate?.missingVerifyCommands.length ?? task.verifyCommands.length) > 0,
|
|
4042
4062
|
currentTreeMatchesEvidence: currentTreeDigest && latestExactVerifier?.workingTreeDigest
|
|
4043
|
-
? currentTreeDigest === latestExactVerifier.workingTreeDigest
|
|
4063
|
+
? currentTreeDigest === latestExactVerifier.workingTreeDigest && latestExactVerifier.preWorkspaceRevisionDigest === currentWorkspaceRevisionDigest(ctx.cwd)
|
|
4064
|
+
&& latestExactVerifier.workspaceRevisionDigest === latestExactVerifier.preWorkspaceRevisionDigest
|
|
4044
4065
|
: true,
|
|
4045
|
-
dependencyMutationAuthorized
|
|
4066
|
+
dependencyMutationAuthorized,
|
|
4067
|
+
independentDisposition: independentRecovery?.independentDisposition
|
|
4046
4068
|
});
|
|
4047
|
-
return gate?.missing
|
|
4048
|
-
? { ...selected, action: "handoff", continuation: "none", nextPhase: null, sourceMutationAllowed: false, reasonCodes: ["unknown-diagnostic-exhausted"] }
|
|
4049
|
-
: selected;
|
|
4069
|
+
return applyProofCapabilityHandoff(selected, gate?.missing, Boolean(independentRecovery));
|
|
4050
4070
|
}
|
|
4051
4071
|
|
|
4052
4072
|
function trajectoryRecoveryOptions(ctx: ExtensionContext, task: TaskContract, options: any): any {
|
|
@@ -4112,7 +4132,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4112
4132
|
})));
|
|
4113
4133
|
},
|
|
4114
4134
|
telemetry,
|
|
4115
|
-
afterStart: async (ctx) => {
|
|
4135
|
+
afterStart: async (ctx) => {
|
|
4136
|
+
await independentAcceptance.activate(ctx);
|
|
4137
|
+
const serviceTier = serviceTierRuntime.restore(ctx);
|
|
4138
|
+
if (serviceTier.enabled && serviceTier.reasonCode === "provider-not-supported") {
|
|
4139
|
+
ctx.ui.notify("Piagent Fast mode is enabled, but the active provider is not OpenAI Codex; no service tier was changed.", "warning");
|
|
4140
|
+
}
|
|
4141
|
+
sourceMutationGuardBindings.bind(ctx);
|
|
4142
|
+
await activityInspector.refresh(ctx);
|
|
4143
|
+
}
|
|
4116
4144
|
});
|
|
4117
4145
|
|
|
4118
4146
|
registerSessionHooks(pi, {
|
|
@@ -4126,13 +4154,17 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4126
4154
|
flushObservedTaskContext,
|
|
4127
4155
|
onTurnEnd: activityInspector.refresh,
|
|
4128
4156
|
onAgentSettled: activityInspector.refresh,
|
|
4129
|
-
beforeShutdown: (ctx) => {
|
|
4157
|
+
beforeShutdown: async (ctx) => {
|
|
4158
|
+
await independentAcceptance.clear(ctx);
|
|
4159
|
+
serviceTierRuntime.forget(ctx);
|
|
4130
4160
|
sourceMutationGuardBindings.unbind(ctx);
|
|
4131
4161
|
editFreshnessGuard.clear(ctx);
|
|
4132
4162
|
activityInspector.dispose(ctx);
|
|
4133
4163
|
sessionCapabilityDigests.delete(`${ctx.cwd}\0${ctx.sessionManager.getSessionId()}`);
|
|
4134
4164
|
}
|
|
4135
4165
|
});
|
|
4166
|
+
registerTaskUsageHooks(pi, { activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined, telemetry });
|
|
4167
|
+
pi.on("turn_end", (event, ctx) => independentAcceptance.observeTurnEnd(ctx, event.message));
|
|
4136
4168
|
|
|
4137
4169
|
registerInputHook(pi, {
|
|
4138
4170
|
state: runtimeState,
|
|
@@ -4184,10 +4216,15 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4184
4216
|
|
|
4185
4217
|
registerCompletionHook(pi, {
|
|
4186
4218
|
state: runtimeState,
|
|
4219
|
+
prepareIndependentAcceptance: (ctx, task, response) => independentAcceptance.prepare(ctx, task, response),
|
|
4220
|
+
deferIndependentCompletion: (ctx, task, response, finalizer) => independentAcceptance.deferCompletion(ctx, task, response, finalizer),
|
|
4221
|
+
projectIndependentLifecycle: (ctx, task, candidate) => independentAcceptance.projectLifecycle(ctx, task, candidate),
|
|
4222
|
+
nativeRefusalFallbackAllowed: () => !independentVerificationConfigPath,
|
|
4187
4223
|
maxManifestFiles: contextBudgetConfig(policy).maxManifestFiles,
|
|
4188
4224
|
activeTask: (ctx) => activeSessionTask(ctx.cwd, ctx.sessionManager.getSessionId()) as TaskContract | undefined,
|
|
4189
4225
|
flushObservedTaskContext,
|
|
4190
4226
|
completionProjection: completionTaskProjection,
|
|
4227
|
+
acceptanceEvidenceFiles: taskAcceptanceEvidenceFiles,
|
|
4191
4228
|
evaluateGate: (cwd, task, currentDigests, currentDigest) => {
|
|
4192
4229
|
const gate = evaluateTaskGate(cwd, task, policy, { currentDigests, currentWorkingTreeDigest: currentDigest });
|
|
4193
4230
|
const repairBlock = (taskAuthorityDecision(task, "CAP-13", "block").allowed
|
|
@@ -4219,7 +4256,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4219
4256
|
redactText,
|
|
4220
4257
|
observedTaskContext: observedTaskContextFromToolResult,
|
|
4221
4258
|
recordObservedTaskChanges,
|
|
4222
|
-
recordObservedTaskVerification,
|
|
4259
|
+
recordObservedTaskVerification: (...args) => recordObservedTaskVerification(...args, policy.finalGate?.acceptanceProofMode === "diagnostic"),
|
|
4223
4260
|
extractLikelyPath: extractLikelyPathFromInput,
|
|
4224
4261
|
mutationTargets: taskMutationTargets,
|
|
4225
4262
|
isShellTool: (toolName) => SHELL_TOOL_NAMES.has(toolName),
|
|
@@ -4298,7 +4335,8 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4298
4335
|
});
|
|
4299
4336
|
return { block: true, reason: `Blocked ${event.toolName}: ${helperPreflight.reason} Do not retry this helper; continue in the parent.` };
|
|
4300
4337
|
}
|
|
4301
|
-
const verifierReuse = reuseCurrentTreeExactVerifier({ cwd: ctx.cwd, task, toolName: event.toolName, toolInput, sessionEntries: ctx.sessionManager.getEntries() as unknown[]
|
|
4338
|
+
const verifierReuse = reuseCurrentTreeExactVerifier({ cwd: ctx.cwd, task, toolName: event.toolName, toolInput, sessionEntries: ctx.sessionManager.getEntries() as unknown[],
|
|
4339
|
+
getHostProjectVerificationDigest: (snapshot, command) => task ? runtimeState.projectVerification.currentDigest(ctx, task, snapshot, command) : null });
|
|
4302
4340
|
if (verifierReuse.reused) {
|
|
4303
4341
|
telemetry(ctx, { event: "verifier_evidence_reused", recordedAt: nowIso(), taskRunId: task?.taskRunId, toolCallId: event.toolCallId, reasonCode: verifierReuse.reasonCode, commandDigest: verifierReuse.commandDigest, workingTreeDigest: verifierReuse.workingTreeDigest }); return;
|
|
4304
4342
|
}
|
|
@@ -4329,7 +4367,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4329
4367
|
const expectedReviewPaths = taskDeltaFilesFromSnapshot(task, currentSnapshot);
|
|
4330
4368
|
const targets = targetInspection.targets;
|
|
4331
4369
|
const boundedTargetMutation = targets.length > 0;
|
|
4332
|
-
const verifierCurrent = allVerifyCommandsPassCurrentTree(task, currentDigest);
|
|
4370
|
+
const verifierCurrent = allVerifyCommandsPassCurrentTree(task, currentDigest, currentWorkspaceRevisionDigest(ctx.cwd));
|
|
4333
4371
|
|
|
4334
4372
|
if (phase.phase === "verify" && boundedTargetMutation && semanticRepairEnabled && semanticRepairRuntime.prepare({
|
|
4335
4373
|
ctx, task, event, currentDigest, currentDeltaPaths: expectedReviewPaths, targetPaths: targets,
|
|
@@ -4579,7 +4617,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4579
4617
|
const governedTaskProfile = !profileMode.startsWith("unprofiled") && !profileMode.includes("unreadable");
|
|
4580
4618
|
const taskContractRequired = governedTaskProfile
|
|
4581
4619
|
&& runtime.finalGate === "enforce"
|
|
4582
|
-
&& finalGateConfig(policy).requireTaskContract;
|
|
4620
|
+
&& finalGateConfig(policy, DEFAULT_POLICY).requireTaskContract;
|
|
4583
4621
|
if (sessionTask?.trace.outcome === "pending" && (sessionTask.changeMode === "read-only" || sessionTask.mutationPolicy === "forbidden")
|
|
4584
4622
|
&& !SHELL_TOOL_NAMES.has(event.toolName) && isTaskMutationTool(event.toolName, toolInput)) {
|
|
4585
4623
|
return {
|
|
@@ -4620,7 +4658,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4620
4658
|
reason: "Shared source checkouts are shell-inaccessible. Inspect the exact session-granted checkout with read, grep, find, or ls; cache mutation is never authorized."
|
|
4621
4659
|
};
|
|
4622
4660
|
}
|
|
4623
|
-
shellProjectMutation = isProjectMutatingShellCommand(command, execDecision.segments);
|
|
4661
|
+
shellProjectMutation = isProjectMutatingShellCommand(command, execDecision.segments, ctx.cwd);
|
|
4624
4662
|
configuredVerifierShell = Boolean(sessionTask && commandMatchesVerifyPlan(command, sessionTask.verifyCommands));
|
|
4625
4663
|
const shellWriteCandidates = extractShellWritePathCandidates(command);
|
|
4626
4664
|
shellMutationTargetBounded = shellWriteCandidates.length > 0;
|
|
@@ -4636,7 +4674,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4636
4674
|
const mutationForbidden = sessionTask?.trace.outcome === "pending"
|
|
4637
4675
|
&& (sessionTask.changeMode === "read-only" || sessionTask.mutationPolicy === "forbidden");
|
|
4638
4676
|
const exactForbiddenTaskVerifier = mutationForbidden && sessionTask.changeMode === "source-change" && configuredVerifierShell;
|
|
4639
|
-
if (mutationForbidden && !exactForbiddenTaskVerifier && !isReadOnlyTaskShellCommand(command, execDecision.segments)) {
|
|
4677
|
+
if (mutationForbidden && !exactForbiddenTaskVerifier && !isReadOnlyTaskShellCommand(command, execDecision.segments, ctx.cwd)) {
|
|
4640
4678
|
return {
|
|
4641
4679
|
block: true,
|
|
4642
4680
|
reason: `Task ${sessionTask.taskId} ${sessionTask.changeMode === "read-only" ? "is read-only; this shell command is not in the read-only inspection allowlist" : "forbids source mutation; this shell command is neither bounded inspection nor an exact configured verifier"}.`
|
|
@@ -4841,7 +4879,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4841
4879
|
&& sessionTask.changeMode === "source-change"
|
|
4842
4880
|
&& (shellProjectMutation || configuredVerifierShell)
|
|
4843
4881
|
) {
|
|
4844
|
-
runtimeState.rememberShellMutationSnapshot(ctx, event.toolName, event.input);
|
|
4882
|
+
runtimeState.rememberShellMutationSnapshot(ctx, event.toolName, event.input, event.toolCallId);
|
|
4845
4883
|
}
|
|
4846
4884
|
}
|
|
4847
4885
|
});
|
|
@@ -4863,6 +4901,8 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4863
4901
|
createTaskRunId, crypto, currentSessionName, defaultRolePolicy, defaultWorkPlan, digestJson,
|
|
4864
4902
|
dynamicToolsEnabled, effectiveProtectedPaths, emitRuntimeMessage, ensureContextIndexV2, estimateContextTokens,
|
|
4865
4903
|
evaluateExecPolicy, evaluateModelRoute, evaluateRetrievalRoute, evaluateRuntimeSolver, evaluateTaskGate, evaluateToolPolicy, execPolicyConfig,
|
|
4904
|
+
prepareIndependentAcceptance: (ctx: ExtensionContext, task: TaskContract, response?: { origin: "assistant"; bytes: string }) =>
|
|
4905
|
+
independentAcceptance.prepare(ctx, task, response),
|
|
4866
4906
|
extensionDir, externalActionPolicyConfig, extractDocument, finalGateConfig, findMatchingObservedBashResult,
|
|
4867
4907
|
formatContextPreflight, formatCount, formatLiveTaskStatus, formatPercent, formatTechOptionsText, formatTechSelectionSummary,
|
|
4868
4908
|
formatToolResultCaptureStatus, formatUsageSnapshot, fs, hasGitEvidenceRoot, hasOperatorSessionName, helpersMode,
|
|
@@ -4880,7 +4920,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4880
4920
|
safeTaskId, searchContextIndex, searchContextIndexV2, searchMemoryFiles, selectRuntimeAction,
|
|
4881
4921
|
selectValueFromUi, selectVerificationPlan, semanticCompactionInstructions, sendWorkflowFollowUp, setPermissionOverrideForContext,
|
|
4882
4922
|
semanticRepairCompletionBlock: (cwd: string, taskRunId: string) => semanticRepairRuntime.completionBlock(cwd, taskRunId),
|
|
4883
|
-
freshRequestParts, shellArg, shortTaskLabel, solverShadow, summarizeAttempt, taskChangedFileEvidence,
|
|
4923
|
+
freshRequestParts, shellArg, shortTaskLabel, solverShadow, summarizeAttempt, taskAcceptanceEvidenceFiles, taskChangedFileEvidence,
|
|
4884
4924
|
techContextDirPath, techContextFilePath, techContextRelativePath, techOptionById, techStackPath,
|
|
4885
4925
|
telemetry, toolRegistryConfig, trajectoryRuntime, uniqueStrings, usageExactCommands,
|
|
4886
4926
|
validTaskScopePattern, validateNewWorkPlan, verifierCommandInstructions, verifyProjectCapabilityState, workingTreeEvidenceDigest,
|
|
@@ -4911,9 +4951,10 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4911
4951
|
|
|
4912
4952
|
function commandArgs(raw: string): { action: string; rest: string; tokens: string[] } {
|
|
4913
4953
|
const trimmed = String(raw ?? "").trim();
|
|
4914
|
-
const
|
|
4915
|
-
const action = (
|
|
4916
|
-
|
|
4954
|
+
const match = /^(\S+)(?:\s+([\s\S]*))?$/.exec(trimmed);
|
|
4955
|
+
const action = (match?.[1] ?? "").toLowerCase();
|
|
4956
|
+
const rest = match?.[2] ?? "";
|
|
4957
|
+
return { action, rest, tokens: rest.split(/\s+/).filter(Boolean) };
|
|
4917
4958
|
}
|
|
4918
4959
|
|
|
4919
4960
|
function shellArg(value: string): string {
|
|
@@ -4945,6 +4986,7 @@ export default function piagentGuard(pi: ExtensionAPI) {
|
|
|
4945
4986
|
}
|
|
4946
4987
|
|
|
4947
4988
|
registerPermissionCommands(pi, registrationDeps);
|
|
4989
|
+
registerFastModeCommand(pi, serviceTierRuntime);
|
|
4948
4990
|
const profileCommandApi = registerProfileCommands(pi, registrationDeps);
|
|
4949
4991
|
registerMemoryMcpCommands(pi, registrationDeps);
|
|
4950
4992
|
const contextCommandApi = registerContextCommands(pi, registrationDeps);
|