@piagent/platform 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +24 -15
- package/README.vi.md +36 -2
- package/adapters/common/assurance-producers.json +109 -0
- package/adapters/common/structured-assurance-facts.mjs +153 -0
- package/adapters/node-typescript/contract-families.json +2811 -0
- package/adapters/node-typescript/contract-families.md +90 -0
- package/benchmarks/production-v1/grade.mjs +20 -0
- package/benchmarks/production-v1/spend-control.v1.json +27 -3
- package/benchmarks/production-v1/suite.json +5 -1
- package/benchmarks/production-v2/grade.mjs +892 -0
- package/benchmarks/production-v2/project/README.md +7 -0
- package/benchmarks/production-v2/project/config/service.json +4 -0
- package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v2/project/docs/ops.md +3 -0
- package/benchmarks/production-v2/project/logs/incident.log +2 -0
- package/benchmarks/production-v2/project/package.json +11 -0
- package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
- package/benchmarks/production-v2/project/src/data/csv.js +3 -0
- package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v2/project/src/data/migration.js +9 -0
- package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
- package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v2/project/src/platform/args.js +10 -0
- package/benchmarks/production-v2/project/src/platform/config.js +7 -0
- package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v2/project/vendor/README.md +1 -0
- package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
- package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
- package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
- package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
- package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
- package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
- package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
- package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v2/spend-control.v1.json +115 -0
- package/benchmarks/production-v2/suite.json +1009 -0
- package/benchmarks/production-v2/variant.mjs +169 -0
- package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
- package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
- package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
- package/benchmarks/production-v3/grade.mjs +1017 -0
- package/benchmarks/production-v3/project/README.md +7 -0
- package/benchmarks/production-v3/project/config/service.json +4 -0
- package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v3/project/docs/ops.md +3 -0
- package/benchmarks/production-v3/project/logs/incident.log +2 -0
- package/benchmarks/production-v3/project/package.json +11 -0
- package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
- package/benchmarks/production-v3/project/src/data/csv.js +3 -0
- package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v3/project/src/data/migration.js +9 -0
- package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
- package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v3/project/src/platform/args.js +10 -0
- package/benchmarks/production-v3/project/src/platform/config.js +7 -0
- package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
- package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v3/project/vendor/README.md +1 -0
- package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
- package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
- package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
- package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
- package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
- package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
- package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
- package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
- package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
- package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
- package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
- package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
- package/benchmarks/production-v3/spend-control.v1.json +121 -0
- package/benchmarks/production-v3/suite.json +1010 -0
- package/benchmarks/production-v3/variant.mjs +178 -0
- package/catalog/capabilities.json +16 -16
- package/docs/authority-manifest.md +1 -1
- package/docs/auto-delegation-policy.md +38 -73
- package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
- package/docs/benchmark-public-contract-addendum-v2.md +85 -0
- package/docs/benchmark-public-contract-addendum-v3.md +116 -0
- package/docs/command-reference-vietnamese.md +30 -35
- package/docs/context-engine.md +5 -3
- package/docs/context-window-policy.md +37 -1
- package/docs/distribution-standard.md +9 -9
- package/docs/en/architecture.md +26 -13
- package/docs/languages.json +4 -4
- package/docs/operator-manual-vietnamese.md +26 -46
- package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
- package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
- package/docs/piagent-core-improvement-plan.md +528 -0
- package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
- package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
- package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
- package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
- package/docs/piagent-open-session-wait.md +19 -0
- package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
- package/docs/publishing-for-teams.md +7 -0
- package/docs/quality-benchmark.md +299 -23
- package/docs/quickstart-vietnamese.md +2 -2
- package/docs/release-install-policy.md +32 -9
- package/docs/research/harness-next-evidence-review.md +113 -0
- package/docs/runtime-harness-standard.md +3 -3
- package/docs/security-threat-model.md +1 -1
- package/docs/subagent-orchestration-capabilities.md +19 -51
- package/docs/subagents-and-multiagent.md +21 -47
- package/docs/task-implementation-contract.md +3 -3
- package/docs/task-lifecycle-vietnamese.md +1 -1
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs/vi/architecture.md +26 -13
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +89 -95
- package/docs-site/commands.html +1 -1
- package/docs-site/content/benchmark.html +88 -94
- package/docs-site/content/en/benchmark.html +134 -90
- package/docs-site/content/en/index.html +19 -19
- package/docs-site/content/en/runtime.html +5 -5
- package/docs-site/content/en/whats-new.html +23 -1
- package/docs-site/content/en/workflows.html +2 -2
- package/docs-site/content/index.html +19 -19
- package/docs-site/content/runtime.html +6 -6
- package/docs-site/content/whats-new.html +23 -1
- package/docs-site/content/workflows.html +2 -2
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +135 -91
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +20 -20
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +6 -6
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +24 -2
- package/docs-site/en/workflows.html +3 -3
- package/docs-site/index.html +20 -20
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +7 -7
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +24 -2
- package/docs-site/workflows.html +3 -3
- package/evals/architecture-conformance-v1/lane.json +18 -0
- package/evals/architecture-conformance-v1/runner.mjs +77 -0
- package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
- package/evals/fixtures/approved-host-contracts.valid.json +43 -0
- package/evals/fixtures/benchmark-assurance-evidence.invalid.json +1 -1
- package/evals/fixtures/benchmark-assurance-evidence.valid.json +1 -1
- package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
- package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
- package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
- package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
- package/evals/fixtures/codex-relative-efficiency-v1.invalid.json +4 -0
- package/evals/fixtures/codex-relative-efficiency-v1.valid.json +94 -0
- package/evals/fixtures/composite-criterion.invalid.json +10 -0
- package/evals/fixtures/composite-criterion.valid.json +33 -0
- package/evals/fixtures/contract-family-library.invalid.json +42 -0
- package/evals/fixtures/contract-family-library.valid.json +41 -0
- package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
- package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
- package/evals/fixtures/helper-request.invalid.json +1 -1
- package/evals/fixtures/helper-request.valid.json +1 -1
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/piagent-webui/subagent-tree-v1.valid.json +7 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
- package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
- package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
- package/evals/fixtures/task-authority-snapshot.valid.json +4 -4
- package/evals/fs4-readiness-matrix.v1.json +2 -2
- package/evals/fs5-artifact-archive/README.md +32 -0
- package/evals/fs5-artifact-archive/manifest.json +148 -0
- package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
- package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
- package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
- package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
- package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
- package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
- package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
- package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
- package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
- package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
- package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
- package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
- package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
- package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
- package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
- package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
- package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
- package/evals/fs5-causal-arm.v1.json +10 -6
- package/evals/fs5-pilot-protocol.v1.json +3 -3
- package/evals/fs5-pilot-protocol.v2.json +8 -8
- package/evals/fs5-pilot-protocol.v3.json +8 -8
- package/evals/fs5-pilot-protocol.v4.json +7 -7
- package/evals/fs5-pilot-protocol.v5.json +10 -8
- package/evals/harness-next/development-corpus.mjs +106 -0
- package/evals/harness-next/resource-budget-probe.mjs +38 -0
- package/evals/harness-next/run-calibration.mjs +83 -0
- package/evals/harness-next/run-resource-probe.mjs +55 -0
- package/evals/harness-next/selected-development-corpus.mjs +27 -0
- package/evals/harness-next.v1.json +51 -0
- package/evals/long-horizon-v1/README.md +19 -0
- package/evals/long-horizon-v1/runner.mjs +116 -48
- package/evals/long-horizon-v1/worker.mjs +77 -30
- package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
- package/evals/private-holdout-v1/README.md +5 -2
- package/evals/private-holdout-v1/public-exposure.v1.json +1 -1
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/evals/runtime-conformance-v1/README.md +43 -0
- package/evals/runtime-conformance-v1/evaluate-paid-canary.mjs +198 -0
- package/evals/runtime-conformance-v1/lane.json +57 -0
- package/evals/runtime-conformance-v1/paid-canary.json +31 -0
- package/evals/runtime-conformance-v1/runner.mjs +456 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +15 -6
- package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
- package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
- package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
- package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
- package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
- package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
- package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
- package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
- package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
- package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
- package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
- package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +699 -0
- package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
- package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
- package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
- package/packages/piagent-core/benchmark/benchmark-core.js +111 -110
- package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
- package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
- package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
- package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
- package/packages/piagent-core/benchmark/benchmark-forensics.js +67 -52
- package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
- package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
- package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
- package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
- package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
- package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-preflight.js +70 -7
- package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
- package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
- package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
- package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +462 -0
- package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
- package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.js +343 -8
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +94 -5
- package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
- package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
- package/packages/piagent-core/benchmark/benchmark-runtime-causal.js +244 -0
- package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
- package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
- package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
- package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +246 -33
- package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
- package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
- package/packages/piagent-core/benchmark/benchmark-suite.js +232 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +33 -1
- package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
- package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
- package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
- package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-usage.js +410 -37
- package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
- package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
- package/packages/piagent-core/capabilities/runtime-integrity.js +6 -0
- package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
- package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
- package/packages/piagent-core/extensions/acceptance-behavior-proof.js +1000 -0
- package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
- package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
- package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
- package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
- package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
- package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
- package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
- package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
- package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
- package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
- package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
- package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
- package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
- package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
- package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
- package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
- package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
- package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
- package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
- package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
- package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
- package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
- package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
- package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
- package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
- package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
- package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
- package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
- package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
- package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
- package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
- package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
- package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
- package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
- package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
- package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
- package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
- package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
- package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
- package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
- package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
- package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
- package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
- package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
- package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
- package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
- package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
- package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
- package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
- package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
- package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
- package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
- package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
- package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
- package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
- package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
- package/packages/piagent-core/extensions/acceptance-receipt.js +208 -180
- package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
- package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
- package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
- package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
- package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
- package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
- package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
- package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
- package/packages/piagent-core/extensions/context-engine.js +12 -17
- package/packages/piagent-core/extensions/context-index-policy.js +4 -0
- package/packages/piagent-core/extensions/context-query-paths.js +57 -0
- package/packages/piagent-core/extensions/criterion-context-pack.js +109 -4
- package/packages/piagent-core/extensions/criterion-graph.js +4 -1
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/fallback-base-policy.ts +101 -0
- package/packages/piagent-core/extensions/guard-types.ts +9 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +374 -364
- package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
- package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
- package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
- package/packages/piagent-core/extensions/task-contract-view.js +4 -4
- package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
- package/packages/piagent-core/extensions/task-journal.js +48 -3
- package/packages/piagent-core/extensions/task-lifecycle.js +32 -0
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +140 -43
- package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
- package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
- package/packages/piagent-core/extensions/verification-intelligence.js +109 -20
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-evidence-roots.js +52 -16
- package/packages/piagent-core/extensions/workspace-revision.js +48 -0
- package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
- package/packages/piagent-core/package.json +3 -3
- package/packages/piagent-core/policies/base-policy.json +43 -2
- package/packages/piagent-core/policy/authority-manifest.v1.json +3 -3
- package/packages/piagent-core/prompts/be-to-fe.md +2 -8
- package/packages/piagent-core/prompts/plan.md +1 -1
- package/packages/piagent-core/prompts/platform-improve.md +2 -6
- package/packages/piagent-core/prompts/review.md +2 -7
- package/packages/piagent-core/prompts/scout.md +1 -1
- package/packages/piagent-core/prompts/task.md +4 -3
- package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
- package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
- package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
- package/packages/piagent-core/runtime/hooks/completion-hook.ts +83 -89
- package/packages/piagent-core/runtime/hooks/input-hook.ts +98 -7
- package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
- package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
- package/packages/piagent-core/runtime/hooks/session-start-hook.ts +150 -19
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +111 -92
- package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
- package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
- package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
- package/packages/piagent-core/runtime/hooks/tool-result-value-helpers.ts +66 -0
- package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
- package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
- package/packages/piagent-core/runtime/inspection/bounded-emission-guard.ts +286 -0
- package/packages/piagent-core/runtime/inspection/runtime-event-store.ts +37 -7
- package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
- package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
- package/packages/piagent-core/runtime/inspection/task-subagent-tree.ts +27 -4
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +69 -11
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +104 -22
- package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
- package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
- package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
- package/packages/piagent-core/runtime/orchestration/helper-lifecycle.ts +16 -12
- package/packages/piagent-core/runtime/orchestration/minimal-delegation-policy.ts +71 -0
- package/packages/piagent-core/runtime/orchestration/owned-work-budget.ts +28 -20
- package/packages/piagent-core/runtime/orchestration/role-policy.ts +27 -9
- package/packages/piagent-core/runtime/orchestration/subagent-tool-policy.ts +329 -0
- package/packages/piagent-core/runtime/policy/block-remedy.ts +0 -4
- package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
- package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
- package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
- package/packages/piagent-core/runtime/product/efficiency-metrics.ts +15 -7
- package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
- package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
- package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
- package/packages/piagent-core/runtime/quality/edit-freshness-guard.ts +102 -0
- package/packages/piagent-core/runtime/quality/exact-output-contract.ts +20 -10
- package/packages/piagent-core/runtime/quality/performance-assurance.ts +3 -3
- package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
- package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
- package/packages/piagent-core/runtime/recovery/continuation-budget.ts +12 -3
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +196 -58
- package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
- package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
- package/packages/piagent-core/runtime/recovery/pristine-task-policy-refresh.ts +91 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +31 -40
- package/packages/piagent-core/runtime/recovery/resume-state.ts +120 -19
- package/packages/piagent-core/runtime/recovery/semantic-repair-handshake.ts +7 -13
- package/packages/piagent-core/runtime/recovery/task-evidence-coverage-refresh.ts +217 -0
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +28 -10
- package/packages/piagent-core/runtime/registration/knowledge-tools.ts +9 -5
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/operator-request-intake.ts +49 -0
- package/packages/piagent-core/runtime/registration/policy-tools.ts +8 -6
- package/packages/piagent-core/runtime/registration/session-commands.ts +10 -8
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +39 -20
- package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +21 -12
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +24 -15
- package/packages/piagent-core/runtime/registration/task-start-manifest.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +79 -79
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/runtime-limits.ts +16 -2
- package/packages/piagent-core/runtime/session/adaptive-context-analysis.ts +461 -0
- package/packages/piagent-core/runtime/session/adaptive-context-governor.ts +464 -0
- package/packages/piagent-core/runtime/session/adaptive-context-ledger.ts +265 -0
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -18
- package/packages/piagent-core/runtime/session/operator-request-carry.ts +44 -0
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +37 -39
- package/packages/piagent-core/runtime/session/source-checkout-read-grants.ts +35 -0
- package/packages/piagent-core/runtime/session/system-prompt.ts +76 -14
- package/packages/piagent-core/runtime/session/task-contract-presentation.ts +39 -0
- package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
- package/packages/piagent-core/runtime/session/usage.ts +4 -3
- package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
- package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
- package/packages/piagent-core/runtime/tools/phase-tools.ts +10 -9
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +22 -5
- package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
- package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
- package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
- package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
- package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
- package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
- package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
- package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
- package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
- package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
- package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +101 -0
- package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
- package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
- package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
- package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
- package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
- package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +201 -0
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +276 -169
- package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
- package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
- package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
- package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
- package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
- package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
- package/packages/piagent-core/subagents/piagent-oracle.md +5 -3
- package/packages/piagent-core/subagents/piagent-planner.md +6 -4
- package/packages/piagent-core/subagents/piagent-reviewer.md +5 -3
- package/packages/piagent-core/subagents/piagent-scout.md +4 -2
- package/packages/piagent-core/subagents/piagent-worker.md +6 -4
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-CxeZqTte.js → MarkdownMessage-DGk34zJT.js} +1 -1
- package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
- package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
- package/packages/piagent-webui/dist/client/index.html +2 -2
- package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
- package/packages/piagent-webui/extension/piagent-webui.ts +13 -3
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +7 -8
- package/packages/piagent-webui/extension/session-stream-adapter.ts +88 -16
- package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
- package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
- package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
- package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
- package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
- package/packages/piagent-webui/gateway/gateway-session-stream.ts +170 -32
- package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
- package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
- package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
- package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
- package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
- package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
- package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
- package/packages/piagent-webui/gateway/session-operation-lifecycle.ts +237 -0
- package/packages/piagent-webui/gateway/session-operation-retry-control.ts +38 -0
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-operation-watchdog.ts +9 -2
- package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
- package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
- package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
- package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
- package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
- package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +118 -117
- package/packages/piagent-webui/ownership/session-lease-store.ts +5 -2
- package/packages/piagent-webui/server/core-inspection-provider.ts +75 -15
- package/packages/piagent-webui/server/loopback-server.ts +9 -7
- package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
- package/packages/piagent-webui/server/transcript-projection.ts +150 -11
- package/packages/piagent-webui/shared/message-correlation.ts +25 -0
- package/schemas/approved-host-contracts.schema.json +973 -0
- package/schemas/benchmark-attempt-outcome.schema.json +303 -0
- package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
- package/schemas/codex-relative-efficiency-v1.schema.json +155 -0
- package/schemas/composite-criterion.schema.json +788 -0
- package/schemas/contract-family-library.schema.json +28 -0
- package/schemas/contract-selection-recipe.schema.json +31 -0
- package/schemas/failure-evidence.schema.json +2 -2
- package/schemas/helper-request.schema.json +16 -4
- package/schemas/host-contract-plan.schema.json +25 -0
- package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
- package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
- package/schemas/piagent-webui/runtime-event-v2.schema.json +46 -5
- package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
- package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
- package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
- package/schemas/piagent-webui/subagent-tree-v1.schema.json +11 -1
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/project-profile.schema.json +1 -1
- package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
- package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
- package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
- package/schemas/public-contracts/revocation-v1.schema.json +87 -0
- package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
- package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
- package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
- package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
- package/schemas/task-contract.schema.json +45 -0
- package/scripts/approve-independent-verification.mjs +57 -0
- package/scripts/benchmark-arm-observer.mjs +320 -0
- package/scripts/benchmark-budget-ipc.mjs +34 -0
- package/scripts/benchmark-budget-launcher.mjs +91 -0
- package/scripts/benchmark-budget-processes.mjs +133 -0
- package/scripts/benchmark-budget-publication.mjs +228 -0
- package/scripts/benchmark-budget-runtime.mjs +136 -0
- package/scripts/benchmark-candidate-ablation.mjs +265 -0
- package/scripts/benchmark-codex-journey.mjs +406 -0
- package/scripts/benchmark-independent-verification.mjs +628 -0
- package/scripts/benchmark-journey-outcome.mjs +92 -0
- package/scripts/benchmark-production-v3-human-review.mjs +192 -0
- package/scripts/benchmark-public-input-catalog.mjs +158 -0
- package/scripts/benchmark-registered-plan-author.mjs +355 -0
- package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
- package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
- package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
- package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
- package/scripts/benchmark-runner-completion.mjs +133 -0
- package/scripts/benchmark-runner-configuration.mjs +159 -0
- package/scripts/benchmark-runner-core.mjs +224 -387
- package/scripts/benchmark-runner-finalization.mjs +144 -27
- package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
- package/scripts/benchmark-runner-schedule.mjs +256 -0
- package/scripts/benchmark-runner-support.mjs +136 -4
- package/scripts/benchmark-runner.mjs +95 -18
- package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
- package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
- package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
- package/scripts/benchmark-scoped-pi-router.mjs +196 -0
- package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
- package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
- package/scripts/benchmark-scoped-session-custody.mjs +599 -0
- package/scripts/benchmark-scoped-session-factory.mjs +342 -0
- package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
- package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
- package/scripts/benchmark-session-evaluator.mjs +169 -0
- package/scripts/benchmark-session-provider-boundary.mjs +62 -0
- package/scripts/benchmark-session-usage.mjs +28 -0
- package/scripts/benchmark-session.mjs +343 -50
- package/scripts/benchmark-webui-journey.mjs +678 -0
- package/scripts/check-public-wording.mjs +46 -0
- package/scripts/configure-subagents.sh +42 -34
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/helper-evaluation.mjs +1 -1
- package/scripts/phase-tools-evaluation.mjs +1 -0
- package/scripts/pi-auto.sh +7 -1
- package/scripts/pi-usage-history.mjs +201 -11
- package/scripts/piagent-cli.mjs +8 -0
- package/scripts/private-holdout-readiness.mjs +7 -1
- package/scripts/public-evaluation-exposure.mjs +140 -0
- package/scripts/select-independent-verification.mjs +62 -0
- package/scripts/team-doctor.sh +1 -1
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +41 -55
- package/scripts/verify-release-identity.mjs +5 -3
- package/packages/piagent-webui/dist/client/assets/index-DynIMe8I.js +0 -176
|
@@ -1,43 +1,15 @@
|
|
|
1
1
|
import type { FailureClassification } from "../../extensions/failure-types.ts";
|
|
2
2
|
import { failureClassificationValidationErrors } from "../../extensions/failure-types.ts";
|
|
3
|
+
import {
|
|
4
|
+
RECOVERY_ACTIONS, RECOVERY_CEILINGS, RECOVERY_POLICY_VERSION, RECOVERY_REASON_CODES, recoveryDecisionValidationErrors
|
|
5
|
+
} from "../../extensions/recovery-decision-validation.ts";
|
|
3
6
|
import type { TrajectoryPhase } from "../trajectory/trajectory-types.ts";
|
|
4
7
|
|
|
5
|
-
export
|
|
6
|
-
export const RECOVERY_ACTIONS = Object.freeze(["repair", "retry", "fresh-session", "ask-operator", "handoff", "blocked"] as const);
|
|
7
|
-
export const RECOVERY_CEILINGS = Object.freeze({
|
|
8
|
-
sourceRepairPasses: 1,
|
|
9
|
-
transientVerifierRetries: 1,
|
|
10
|
-
unknownDiagnosticPasses: 1,
|
|
11
|
-
providerRetries: 1
|
|
12
|
-
} as const);
|
|
8
|
+
export { RECOVERY_ACTIONS, RECOVERY_CEILINGS, RECOVERY_POLICY_VERSION, RECOVERY_REASON_CODES, recoveryDecisionValidationErrors };
|
|
13
9
|
|
|
14
10
|
export type RecoveryAction = typeof RECOVERY_ACTIONS[number];
|
|
15
11
|
export type RecoveryDisposition = "scheduled" | "failed" | "succeeded" | "declined";
|
|
16
|
-
export type RecoveryReasonCode =
|
|
17
|
-
| "feature-disabled"
|
|
18
|
-
| "invalid-input"
|
|
19
|
-
| "terminal-phase"
|
|
20
|
-
| "handoff-already-observed"
|
|
21
|
-
| "no-failure"
|
|
22
|
-
| "stale-verifier-evidence"
|
|
23
|
-
| "source-repair-eligible"
|
|
24
|
-
| "dependency-mutation-not-authorized"
|
|
25
|
-
| "read-only-task"
|
|
26
|
-
| "repair-ceiling-reached"
|
|
27
|
-
| "repeated-hypothesis"
|
|
28
|
-
| "operator-environment-action"
|
|
29
|
-
| "provider-transient-retry"
|
|
30
|
-
| "provider-retry-exhausted"
|
|
31
|
-
| "permission-expansion-forbidden"
|
|
32
|
-
| "scope-replan-required"
|
|
33
|
-
| "transient-verifier-retry"
|
|
34
|
-
| "transient-retry-unavailable"
|
|
35
|
-
| "unknown-diagnostic-pass"
|
|
36
|
-
| "unknown-diagnostic-exhausted"
|
|
37
|
-
| "global-continuation-budget-exhausted"
|
|
38
|
-
| "repeated-progress-signature"
|
|
39
|
-
| "continuation-journal-unavailable"
|
|
40
|
-
| "manual-lifecycle-handoff";
|
|
12
|
+
export type RecoveryReasonCode = typeof RECOVERY_REASON_CODES[number];
|
|
41
13
|
|
|
42
14
|
export type RecoveryHistoryEntry = {
|
|
43
15
|
taskId: string;
|
|
@@ -68,6 +40,7 @@ export type RecoveryPolicyInput = {
|
|
|
68
40
|
exactVerifierAvailable?: boolean;
|
|
69
41
|
currentTreeMatchesEvidence?: boolean;
|
|
70
42
|
dependencyMutationAuthorized?: boolean;
|
|
43
|
+
independentDisposition?: "cancelled" | "reconcile" | "unsupported" | "halt" | "approval";
|
|
71
44
|
};
|
|
72
45
|
|
|
73
46
|
export type RecoveryDecision = {
|
|
@@ -93,10 +66,20 @@ export type RecoveryDecision = {
|
|
|
93
66
|
hypothesisRef: string | null;
|
|
94
67
|
};
|
|
95
68
|
|
|
96
|
-
const HASH = /^[a-f0-9]{64}$/;
|
|
97
69
|
const REF = /^[a-z0-9][a-z0-9:._-]{0,255}$/i;
|
|
98
70
|
const COUNTED_DISPOSITIONS = new Set<RecoveryDisposition>(["scheduled", "failed", "succeeded"]);
|
|
99
71
|
|
|
72
|
+
export function applyProofCapabilityHandoff(selected: RecoveryDecision, missing: string[] = [], hasIndependentRecovery = false): RecoveryDecision {
|
|
73
|
+
let reason: RecoveryReasonCode | undefined;
|
|
74
|
+
if (selected.failureCategory === "unknown" && !hasIndependentRecovery && selected.action !== "blocked"
|
|
75
|
+
&& missing.some(item => /^critical acceptance evidence independent-required\b/i.test(item))) reason = "independent-acceptance-proof-required";
|
|
76
|
+
else if (selected.failureCategory === "unknown" && !hasIndependentRecovery && selected.action !== "blocked"
|
|
77
|
+
&& missing.some(item => /^critical acceptance evidence source-proof-required\b/i.test(item))) reason = "source-acceptance-proof-required";
|
|
78
|
+
else if (missing.some(item => /^critical acceptance evidence adapter-unresolved\b/i.test(item))) reason = "deterministic-adapter-proof-required";
|
|
79
|
+
return reason ? { ...selected, action: "handoff", continuation: "none", nextPhase: null,
|
|
80
|
+
sourceMutationAllowed: false, reasonCodes: [reason] } : selected;
|
|
81
|
+
}
|
|
82
|
+
|
|
100
83
|
function validIdentity(input: RecoveryPolicyInput): boolean {
|
|
101
84
|
return Boolean(
|
|
102
85
|
input.task?.taskId?.trim()
|
|
@@ -178,19 +161,27 @@ function repairDecision(input: RecoveryPolicyInput): RecoveryDecision {
|
|
|
178
161
|
}
|
|
179
162
|
|
|
180
163
|
export function selectRecoveryDecision(input: RecoveryPolicyInput): RecoveryDecision {
|
|
181
|
-
const invalidClassification = failureClassificationValidationErrors(input.classification).length > 0
|
|
182
|
-
|| !HASH.test(String(input.classification?.evidenceDigest ?? ""));
|
|
164
|
+
const invalidClassification = failureClassificationValidationErrors(input.classification).length > 0;
|
|
183
165
|
if (!validIdentity(input) || invalidClassification) return decision(input, "blocked", ["invalid-input"]);
|
|
184
166
|
if (!input.featureEnabled) return decision(input, "handoff", ["feature-disabled"]);
|
|
185
167
|
if (input.currentPhase === "terminal") return decision(input, "blocked", ["terminal-phase"]);
|
|
186
168
|
if (input.currentPhase === "handoff") return decision(input, "handoff", ["handoff-already-observed"]);
|
|
187
169
|
if (input.classification.category === "passed") return decision(input, "handoff", ["no-failure"]);
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
//
|
|
170
|
+
// Protected-path evidence cannot be repaired by another model turn. The
|
|
171
|
+
// failure category also accepts historical scope diagnostics for replay
|
|
172
|
+
// compatibility, but current task scope itself is advisory.
|
|
191
173
|
if (input.classification.category === "scope-protected-path") {
|
|
192
|
-
return decision(input, "handoff", ["
|
|
174
|
+
return decision(input, "handoff", ["protected-path-forbidden"]);
|
|
193
175
|
}
|
|
176
|
+
const independentCategories = { cancelled: "unknown", reconcile: "environment", unsupported: "unknown", halt: "unknown", approval: "environment" };
|
|
177
|
+
if (input.independentDisposition !== undefined && (typeof input.independentDisposition !== "string"
|
|
178
|
+
|| !Object.hasOwn(independentCategories, input.independentDisposition)
|
|
179
|
+
|| independentCategories[input.independentDisposition] !== input.classification.category)) return decision(input, "blocked", ["invalid-input"]);
|
|
180
|
+
if (input.independentDisposition === "cancelled") return decision(input, "handoff", ["independent-execution-cancelled"]);
|
|
181
|
+
if (input.independentDisposition === "reconcile") return decision(input, "ask-operator", ["independent-execution-reconciliation-required"], { continuation: "operator" });
|
|
182
|
+
if (input.independentDisposition === "unsupported") return decision(input, "handoff", ["independent-verifier-unsupported"]);
|
|
183
|
+
if (input.independentDisposition === "halt") return decision(input, "handoff", ["independent-verification-halted"]);
|
|
184
|
+
if (input.independentDisposition === "approval") return decision(input, "ask-operator", ["operator-environment-action"], { continuation: "operator" });
|
|
194
185
|
|
|
195
186
|
const counts = countsFor(input);
|
|
196
187
|
if (input.currentTreeMatchesEvidence === false && input.exactVerifierAvailable === true) {
|
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
import { currentWorkspaceRevisionDigest } from "../../extensions/workspace-revision.js";
|
|
2
3
|
|
|
3
4
|
import type { TaskContract } from "../../extensions/guard-types.ts";
|
|
4
5
|
import { allVerifyCommandsPassCurrentTree } from "../../extensions/task-contract-view.js";
|
|
5
|
-
import { criterionGraphGuidance } from "../../extensions/criterion-graph.js";
|
|
6
6
|
import { replayTaskCheckpoints, taskRecoveryDecision } from "../../extensions/task-journal.js";
|
|
7
7
|
import { taskDigestMigrationArchiveStatus, workingTreeSnapshot, workingTreeSnapshotHasUnavailableEvidence } from "../../extensions/task-state.js";
|
|
8
8
|
import { workingTreeEvidenceDigest } from "../../extensions/task-lifecycle.js";
|
|
9
9
|
import { hashEvidenceCommand } from "../../extensions/runtime-evidence.js";
|
|
10
10
|
import { WORKING_TREE_DIGEST_ALGORITHM, isCurrentWorkingTreeDigest, workingTreeSnapshotUsesCurrentAlgorithm } from "../../extensions/working-tree-digest.js";
|
|
11
|
-
import { handoffProjectionPath, readHandoffProjection } from "./handoff-projection.ts";
|
|
11
|
+
import { handoffIdentityMatchesTask, handoffProjectionPath, readHandoffProjection } from "./handoff-projection.ts";
|
|
12
12
|
import { inspectTaskAuthorityResumePolicy, type AuthorityResumeDecision } from "../policy/authority-resume-policy.ts";
|
|
13
|
+
import { presentedAcceptanceCriteria, presentedCriterionGraphGuidance } from "../session/task-contract-presentation.ts";
|
|
14
|
+
import { operatorRequestCarryLines } from "../session/operator-request-carry.ts";
|
|
13
15
|
import { readTrajectoryStore } from "../trajectory/trajectory-store.ts";
|
|
14
16
|
import { findVerifierFileSnapshot, inspectVerifierStaleness, readVerifierFileSnapshots } from "../inspection/verifier-snapshot-store.ts";
|
|
15
17
|
|
|
16
18
|
export const RESUME_STATE_VERSION = "resume-v1" as const;
|
|
17
19
|
export const RESUME_CONTEXT_VERSION = "resume-context-v1" as const;
|
|
18
|
-
export const RESUME_CONTEXT_MAX_CHARS =
|
|
20
|
+
export const RESUME_CONTEXT_MAX_CHARS = 12_000;
|
|
21
|
+
// Validated task text is bounded in Unicode code points by JSON Schema. Astral
|
|
22
|
+
// characters occupy two UTF-16 code units, so the exceptional resume ceiling
|
|
23
|
+
// must cover the worst valid lossless task even though the normal target stays
|
|
24
|
+
// at 12k. This overflow is explicit and is never used for routine compaction.
|
|
25
|
+
export const RESUME_CONTEXT_LOSSLESS_MAX_CHARS = 40_000;
|
|
26
|
+
export const RESUME_CONTEXT_LOSSLESS_OVERFLOW_MARKER = `[Piagent lossless resume overflow: the ${RESUME_CONTEXT_MAX_CHARS}-character target was exceeded; complete authoritative task truth is retained.]`;
|
|
27
|
+
export const LEGACY_TASK_TRUTH_OVERFLOW_MARKER = `[Piagent legacy-task-truth-overflow: automatic continuation is paused because lossless task truth exceeds the ${RESUME_CONTEXT_LOSSLESS_MAX_CHARS}-character exceptional ceiling.]`;
|
|
19
28
|
type ResumePlanStep = {
|
|
20
29
|
id: string;
|
|
21
30
|
title: string;
|
|
@@ -153,44 +162,129 @@ function limitedLines(values: unknown[], maximumItems: number, maximumChars: num
|
|
|
153
162
|
return selected;
|
|
154
163
|
}
|
|
155
164
|
|
|
165
|
+
function losslessManualResumeContent(task: TaskContract): string {
|
|
166
|
+
return [
|
|
167
|
+
"[Piagent durable task resume]",
|
|
168
|
+
RESUME_CONTEXT_LOSSLESS_OVERFLOW_MARKER,
|
|
169
|
+
`Task: ${compact(task.taskId, 120)} (${compact(task.taskRunId, 120)})`,
|
|
170
|
+
`Goal: ${task.summary}`,
|
|
171
|
+
`Expected output: ${task.expectedOutput}`,
|
|
172
|
+
"Acceptance focus:", ...presentedAcceptanceCriteria(task).map((value, index) => `- C${index + 1}: ${value}`),
|
|
173
|
+
"Exact verifier commands:", ...task.verifyCommands.map((value, index) => `${index + 1}. ${value}`),
|
|
174
|
+
"Continue only under the current runtime-enforced task state and every durable task clause above; do not infer progress from transcript memory."
|
|
175
|
+
].join("\n");
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Exact UTF-16 traffic size for the smallest lossless automatic legacy resume. */
|
|
179
|
+
export function legacyTaskResumeTruthChars(task: TaskContract): number {
|
|
180
|
+
return operatorRequestCarryLines(task).length > 0 ? 0 : losslessManualResumeContent(task).length;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function legacyTaskTruthOverflowsAutomaticResume(task: TaskContract): boolean {
|
|
184
|
+
const chars = legacyTaskResumeTruthChars(task);
|
|
185
|
+
return chars > RESUME_CONTEXT_LOSSLESS_MAX_CHARS;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function legacyOverflowResumeContent(task: TaskContract): string {
|
|
189
|
+
return [
|
|
190
|
+
"[Piagent durable task resume]",
|
|
191
|
+
LEGACY_TASK_TRUTH_OVERFLOW_MARKER,
|
|
192
|
+
`Task: ${compact(task.taskId, 120)} (${compact(task.taskRunId, 120)})`,
|
|
193
|
+
"The durable task remains byte-for-byte intact, but its complete acceptance truth cannot be injected safely in one automatic resume.",
|
|
194
|
+
"Do not mutate or auto-continue this task. Ask the operator to re-intake the original request as a new bounded task or provide an explicit compact handoff."
|
|
195
|
+
].join("\n");
|
|
196
|
+
}
|
|
197
|
+
|
|
156
198
|
export function buildTaskResumeContext(task: TaskContract, resume: ResumeState): {
|
|
157
199
|
customType: "piagent-runtime-task-resume";
|
|
158
200
|
content: string;
|
|
159
201
|
details: Record<string, unknown>;
|
|
160
202
|
} {
|
|
161
|
-
|
|
203
|
+
if (legacyTaskTruthOverflowsAutomaticResume(task)) {
|
|
204
|
+
return {
|
|
205
|
+
customType: "piagent-runtime-task-resume",
|
|
206
|
+
content: legacyOverflowResumeContent(task),
|
|
207
|
+
details: {
|
|
208
|
+
resumeContextVersion: RESUME_CONTEXT_VERSION, taskId: task.taskId, taskRunId: task.taskRunId,
|
|
209
|
+
phase: resume.phase, checkpointId: resume.latestCheckpoint?.checkpointId ?? null,
|
|
210
|
+
decision: "blocked", enforcementSafe: false, verifierEvidenceCurrent: resume.verifierEvidenceCurrent,
|
|
211
|
+
staleVerifierEvidence: resume.staleVerifierEvidence, losslessOverflow: true,
|
|
212
|
+
legacyTaskTruthOverflow: true, nextAction: resume.reconstruction.nextAction
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
const operatorTruth = operatorRequestCarryLines(task);
|
|
217
|
+
const presentedCriteria = presentedAcceptanceCriteria(task);
|
|
218
|
+
const criteria = operatorTruth.length > 0
|
|
219
|
+
? limitedLines(presentedCriteria, 8, 180, (value, index) => `- C${index + 1}: ${value}`)
|
|
220
|
+
: presentedCriteria.map((value, index) => `- C${index + 1}: ${value}`);
|
|
162
221
|
const scope = limitedLines(task.scope, 8, 100, (value) => `- ${value}`);
|
|
163
222
|
const plan = resume.reconstruction.plan.slice(0, 12).map((step) => (
|
|
164
223
|
`- ${step.id}: ${step.status}; ${compact(step.title, 140)}${step.dependsOn.length > 0 ? `; after=${step.dependsOn.join(",")}` : ""}`
|
|
165
224
|
));
|
|
166
225
|
if (resume.reconstruction.plan.length > 12) plan.push(`- [${resume.reconstruction.plan.length - 12} more steps retained in the Task Contract]`);
|
|
167
|
-
const verifiers =
|
|
168
|
-
const executionMap =
|
|
226
|
+
const verifiers = task.verifyCommands.map((value, index) => `${index + 1}. ${value}`);
|
|
227
|
+
const executionMap = presentedCriterionGraphGuidance(task, 8).map((line: string) => `- ${line}`);
|
|
169
228
|
const next = resume.reconstruction.nextAction;
|
|
170
229
|
const lines = [
|
|
171
230
|
"[Piagent durable task resume]",
|
|
172
231
|
"This brief is reconstructed from the current Task Contract, journal, trajectory, handoff and working tree. Durable files remain authoritative.",
|
|
173
232
|
`Task: ${compact(task.taskId, 160)} (${compact(task.taskRunId, 160)})`,
|
|
174
|
-
`Goal: ${compact(task.summary, 500)}`,
|
|
175
|
-
|
|
233
|
+
`Goal: ${operatorTruth.length > 0 ? compact(task.summary, 500) : task.summary}`,
|
|
234
|
+
...operatorTruth,
|
|
235
|
+
`Expected output: ${operatorTruth.length > 0 ? compact(task.expectedOutput, 400) : task.expectedOutput}`,
|
|
176
236
|
"Acceptance focus:", ...criteria,
|
|
177
|
-
"
|
|
237
|
+
"Initial focus (advisory):", ...scope,
|
|
238
|
+
"Initial focus guides retrieval/review and neither authorizes nor forbids mutation.",
|
|
178
239
|
"Work plan/progress:", ...plan,
|
|
179
240
|
...(executionMap.length > 0 ? ["Execution map (planning only):", ...executionMap] : []),
|
|
180
241
|
`Current phase/checkpoint: ${resume.phase ?? "unknown"} / ${resume.latestCheckpoint?.checkpointId ?? "none"}`,
|
|
181
242
|
`Verifier state: current=${resume.verifierEvidenceCurrent}; stale=${resume.staleVerifierEvidence}; tree=${resume.currentTreeDigest}`,
|
|
182
243
|
"Exact verifier commands:", ...verifiers,
|
|
183
244
|
`Next safe action: ${next.action}${next.stepId ? ` (${next.stepId})` : ""}. ${compact(next.reason, 500)}`,
|
|
184
|
-
...(next.exactCommands.length > 0 ? ["Required commands for that action:", ...
|
|
245
|
+
...(next.exactCommands.length > 0 ? ["Required commands for that action:", ...next.exactCommands.map((value, index) => `${index + 1}. ${value}`)] : []),
|
|
185
246
|
`Resume safety: decision=${resume.decision}; enforcementSafe=${resume.enforcementSafe}; handoff=${resume.handoff.exists ? resume.handoff.path : "none"}.`,
|
|
186
247
|
"Do not infer progress from transcript memory, reopen completed steps, or mutate when the next action is inspect-handoff, wait-paused, or terminal."
|
|
187
248
|
];
|
|
188
249
|
let content = lines.join("\n");
|
|
189
250
|
if (content.length > RESUME_CONTEXT_MAX_CHARS) {
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
251
|
+
const boundedOperatorTruth = operatorRequestCarryLines(task);
|
|
252
|
+
content = boundedOperatorTruth.length > 0 ? [
|
|
253
|
+
"[Piagent durable task resume]",
|
|
254
|
+
`Task: ${compact(task.taskId, 160)} (${compact(task.taskRunId, 160)})`,
|
|
255
|
+
...boundedOperatorTruth,
|
|
256
|
+
"Acceptance focus:", ...limitedLines(presentedAcceptanceCriteria(task), 8, 160, (value, index) => `- C${index + 1}: ${value}`),
|
|
257
|
+
`Current phase/checkpoint: ${resume.phase ?? "unknown"} / ${resume.latestCheckpoint?.checkpointId ?? "none"}`,
|
|
258
|
+
"Exact verifier commands:", ...verifiers,
|
|
259
|
+
`Next safe action: ${next.action}${next.stepId ? ` (${next.stepId})` : ""}. ${compact(next.reason, 400)}`,
|
|
260
|
+
`Resume safety: decision=${resume.decision}; enforcementSafe=${resume.enforcementSafe}.`,
|
|
261
|
+
"Continue from current source. Preserve every operator clause exactly; do not infer progress from transcript memory."
|
|
262
|
+
].join("\n") : losslessManualResumeContent(task);
|
|
263
|
+
if (content.length > RESUME_CONTEXT_MAX_CHARS && boundedOperatorTruth.length > 0) {
|
|
264
|
+
content = [
|
|
265
|
+
"[Piagent durable task resume]",
|
|
266
|
+
RESUME_CONTEXT_LOSSLESS_OVERFLOW_MARKER,
|
|
267
|
+
`Task: ${compact(task.taskId, 120)} (${compact(task.taskRunId, 120)})`,
|
|
268
|
+
...boundedOperatorTruth,
|
|
269
|
+
"Acceptance focus:", ...limitedLines(presentedAcceptanceCriteria(task), 12, 220, (value, index) => `- C${index + 1}: ${value}`),
|
|
270
|
+
"Exact verifier commands:", ...verifiers,
|
|
271
|
+
`Next safe action: ${next.action}${next.stepId ? ` (${next.stepId})` : ""}. ${compact(next.reason, 300)}`,
|
|
272
|
+
`Resume safety: decision=${resume.decision}; enforcementSafe=${resume.enforcementSafe}.`,
|
|
273
|
+
"Continue only from current source, the complete operator request, exact verifiers, and durable atomic acceptance facts."
|
|
274
|
+
].join("\n");
|
|
275
|
+
if (content.length > RESUME_CONTEXT_LOSSLESS_MAX_CHARS) {
|
|
276
|
+
content = [
|
|
277
|
+
"[Piagent durable task resume]",
|
|
278
|
+
RESUME_CONTEXT_LOSSLESS_OVERFLOW_MARKER,
|
|
279
|
+
`Task: ${compact(task.taskId, 120)} (${compact(task.taskRunId, 120)})`,
|
|
280
|
+
...boundedOperatorTruth,
|
|
281
|
+
"Exact verifier commands:", ...verifiers,
|
|
282
|
+
`Next safe action: ${next.action}${next.stepId ? ` (${next.stepId})` : ""}. ${compact(next.reason, 240)}`,
|
|
283
|
+
`Resume safety: decision=${resume.decision}; enforcementSafe=${resume.enforcementSafe}.`,
|
|
284
|
+
"The complete operator request above is the acceptance source of truth. Continue only from current source and these exact verifiers."
|
|
285
|
+
].join("\n");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
194
288
|
}
|
|
195
289
|
return {
|
|
196
290
|
customType: "piagent-runtime-task-resume",
|
|
@@ -205,6 +299,7 @@ export function buildTaskResumeContext(task: TaskContract, resume: ResumeState):
|
|
|
205
299
|
enforcementSafe: resume.enforcementSafe,
|
|
206
300
|
verifierEvidenceCurrent: resume.verifierEvidenceCurrent,
|
|
207
301
|
staleVerifierEvidence: resume.staleVerifierEvidence,
|
|
302
|
+
losslessOverflow: content.length > RESUME_CONTEXT_MAX_CHARS,
|
|
208
303
|
nextAction: resume.reconstruction.nextAction
|
|
209
304
|
}
|
|
210
305
|
};
|
|
@@ -218,8 +313,10 @@ export function inspectTaskResumeState(
|
|
|
218
313
|
options: { protectedPaths?: string[] } = {}
|
|
219
314
|
): ResumeState {
|
|
220
315
|
const currentTreeDigest = workingTreeEvidenceDigest(currentDigests);
|
|
316
|
+
const workspaceRevisionDigest = currentWorkspaceRevisionDigest(cwd);
|
|
221
317
|
const authorityPolicy = inspectTaskAuthorityResumePolicy(cwd, task);
|
|
222
318
|
const archive = taskDigestMigrationArchiveStatus(cwd, task);
|
|
319
|
+
const legacyTruthOverflow = task.trace.outcome === "pending" && legacyTaskTruthOverflowsAutomaticResume(task);
|
|
223
320
|
const algorithmReady = task.workingTreeDigestAlgorithm === WORKING_TREE_DIGEST_ALGORITHM
|
|
224
321
|
&& isCurrentWorkingTreeDigest(currentTreeDigest)
|
|
225
322
|
&& workingTreeSnapshotUsesCurrentAlgorithm(currentDigests)
|
|
@@ -233,7 +330,7 @@ export function inspectTaskResumeState(
|
|
|
233
330
|
try {
|
|
234
331
|
const handoff = readHandoffProjection(cwd, task.taskRunId);
|
|
235
332
|
handoffExists = Boolean(handoff);
|
|
236
|
-
if (handoff && (handoff.identity
|
|
333
|
+
if (handoff && !handoffIdentityMatchesTask(handoff.identity, task)) {
|
|
237
334
|
handoffValid = false;
|
|
238
335
|
warnings.push("handoff identity conflicts with the task contract");
|
|
239
336
|
}
|
|
@@ -242,13 +339,14 @@ export function inspectTaskResumeState(
|
|
|
242
339
|
warnings.push(`handoff projection is invalid: ${error instanceof Error ? error.message : String(error)}`);
|
|
243
340
|
}
|
|
244
341
|
const passingEvidence = task.verifyEvidence.filter((evidence) => evidence.observed === true && evidence.matchedProfileCommand === true && evidence.exitCode === 0);
|
|
245
|
-
const invalidatedVerifierCommands = strings(passingEvidence.filter((evidence) => !isCurrentWorkingTreeDigest(evidence.workingTreeDigest) || evidence.workingTreeDigest !== currentTreeDigest
|
|
246
|
-
|
|
342
|
+
const invalidatedVerifierCommands = strings(passingEvidence.filter((evidence) => !isCurrentWorkingTreeDigest(evidence.workingTreeDigest) || evidence.workingTreeDigest !== currentTreeDigest
|
|
343
|
+
|| !workspaceRevisionDigest || evidence.preWorkspaceRevisionDigest !== workspaceRevisionDigest || evidence.workspaceRevisionDigest !== workspaceRevisionDigest).map((evidence) => evidence.command), 50);
|
|
344
|
+
const verifierEvidenceCurrent = algorithmReady && !refreshRequired && (task.changeMode === "read-only" || allVerifyCommandsPassCurrentTree(task, currentTreeDigest, workspaceRevisionDigest));
|
|
247
345
|
const staleVerifierEvidence = refreshRequired || (invalidatedVerifierCommands.length > 0 && !verifierEvidenceCurrent);
|
|
248
346
|
const invalidatedFiles = staleVerifierEvidence
|
|
249
347
|
? staleVerifierFiles(cwd, task, passingEvidence, currentDigests, currentTreeDigest, options.protectedPaths ?? null)
|
|
250
348
|
: { files: [], known: true };
|
|
251
|
-
if (staleVerifierEvidence) warnings.push("working tree changed
|
|
349
|
+
if (staleVerifierEvidence) warnings.push("working tree or workspace baseline changed, or the prior verifier lacks baseline binding; prior evidence is stale");
|
|
252
350
|
const latest = journal.checkpoints.at(-1);
|
|
253
351
|
const latestCheckpoint = latest ? {
|
|
254
352
|
checkpointId: String(latest.checkpointId ?? "checkpoint"),
|
|
@@ -265,8 +363,9 @@ export function inspectTaskResumeState(
|
|
|
265
363
|
if (!trajectory.enforcementSafe) warnings.push(`trajectory state is unsafe: ${trajectory.warnings[0] ?? "unknown error"}`);
|
|
266
364
|
if (!algorithmReady) warnings.push("working-tree digest algorithm/evidence is not current and proof-capable");
|
|
267
365
|
if (!archive.valid) warnings.push(archive.reason);
|
|
366
|
+
if (legacyTruthOverflow) warnings.push("legacy-task-truth-overflow requires explicit operator re-intake or compact handoff");
|
|
268
367
|
if (refreshRequired) warnings.push("legacy evidence was archived; run each exact configured verifier once against the current wt-content-v2 tree");
|
|
269
|
-
const enforcementSafe = authorityReady && !identityConflict && algorithmReady && archive.valid && journal.corruptions.length === 0 && trajectory.enforcementSafe && handoffValid;
|
|
368
|
+
const enforcementSafe = authorityReady && !identityConflict && !legacyTruthOverflow && algorithmReady && archive.valid && journal.corruptions.length === 0 && trajectory.enforcementSafe && handoffValid;
|
|
270
369
|
const recovery = refreshRequired ? { decision: "resume", reason: "Digest migration requires current exact verifier evidence." } : taskRecoveryDecision(task, journal);
|
|
271
370
|
const decision: ResumeState["decision"] = terminal
|
|
272
371
|
? "terminal"
|
|
@@ -281,6 +380,8 @@ export function inspectTaskResumeState(
|
|
|
281
380
|
: "resume";
|
|
282
381
|
const reason = terminal
|
|
283
382
|
? `Task contract is immutable after ${task.trace.outcome}.`
|
|
383
|
+
: legacyTruthOverflow
|
|
384
|
+
? "legacy-task-truth-overflow: automatic continuation is paused; ask the operator to re-intake the original request or provide a compact handoff."
|
|
284
385
|
: journal.corruptions.length > 0
|
|
285
386
|
? `task journal is corrupt: ${journal.corruptions[0]}`
|
|
286
387
|
: !authorityReady
|
|
@@ -11,7 +11,6 @@ import { safeTaskId } from "../../extensions/task-state.js";
|
|
|
11
11
|
import { isCurrentWorkingTreeDigest } from "../../extensions/working-tree-digest.js";
|
|
12
12
|
|
|
13
13
|
const HASH = /^[a-f0-9]{64}$/;
|
|
14
|
-
const GLOB = /[?*[\]{}]/;
|
|
15
14
|
const MAX_FILE_BYTES = 256 * 1024;
|
|
16
15
|
export const MAX_SEMANTIC_REPAIR_PATHS = 12;
|
|
17
16
|
export const MAX_SEMANTIC_REPAIR_REVISIONS = 2;
|
|
@@ -106,13 +105,6 @@ function tokenHash(token: string): string {
|
|
|
106
105
|
return crypto.createHash("sha256").update(token).digest("hex");
|
|
107
106
|
}
|
|
108
107
|
|
|
109
|
-
function exactDeclaredPath(task: TaskContract, target: string): boolean {
|
|
110
|
-
return (task.scope ?? []).some((candidate) => {
|
|
111
|
-
const normalized = normalizePathCandidate(candidate);
|
|
112
|
-
return Boolean(normalized && !GLOB.test(normalized) && normalized === target);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
108
|
function isTestPath(file: string): boolean {
|
|
117
109
|
return /(^|\/)(?:test|tests|spec|__tests__)(\/|$)|[._-](?:test|spec)\.[cm]?[jt]sx?$/i.test(file);
|
|
118
110
|
}
|
|
@@ -146,12 +138,13 @@ export function decideSemanticRepairHandshake(input: {
|
|
|
146
138
|
verifierCurrent: boolean;
|
|
147
139
|
}): SemanticRepairHandshakeDecision {
|
|
148
140
|
const targets = uniquePaths(input.mutationTargets), delta = new Set(uniquePaths(input.currentDeltaPaths));
|
|
141
|
+
const targetSet = new Set(targets);
|
|
149
142
|
const empty = { authorized: false, conflictCodes: [], eligibleTargets: [], eligiblePaths: [], pathConflictCodes: {} };
|
|
150
143
|
if (!input.verifierCurrent || targets.length === 0 || delta.size === 0) return empty;
|
|
151
|
-
const candidates = uniquePaths([...delta, ...
|
|
144
|
+
const candidates = uniquePaths([...delta, ...targets]);
|
|
152
145
|
const pathConflictCodes: Record<string, string[]> = {}, sourceTexts = new Map<string, string>();
|
|
153
146
|
for (const file of candidates) {
|
|
154
|
-
if (isTestPath(file) || (!delta.has(file) && !
|
|
147
|
+
if (isTestPath(file) || (!delta.has(file) && !targetSet.has(file))) continue;
|
|
155
148
|
const source = readSmallFile(input.cwd, file), conflicts = contentLinkedConflictCodes(input.task, source);
|
|
156
149
|
if (conflicts.length === 0) continue;
|
|
157
150
|
pathConflictCodes[file] = conflicts;
|
|
@@ -161,7 +154,7 @@ export function decideSemanticRepairHandshake(input: {
|
|
|
161
154
|
if (sourcePaths.length === 0) return empty;
|
|
162
155
|
const relatedTests = candidates.filter((file) => (
|
|
163
156
|
isTestPath(file)
|
|
164
|
-
&& (delta.has(file) ||
|
|
157
|
+
&& (delta.has(file) || targetSet.has(file))
|
|
165
158
|
&& sourcePaths.some((sourcePath) => acceptanceExecutableTestBinding({
|
|
166
159
|
sourceEntry: { path: sourcePath, text: sourceTexts.get(sourcePath) ?? "" },
|
|
167
160
|
testEntry: { path: file, text: readSmallFile(input.cwd, file) }
|
|
@@ -181,8 +174,9 @@ export function decideSemanticRepairHandshake(input: {
|
|
|
181
174
|
* This is intentionally narrower than semantic repair: every target must be
|
|
182
175
|
* an actual current task delta, must have been observed in this task, and must
|
|
183
176
|
* still carry successful structured-mutation authorship for the exact task,
|
|
184
|
-
* run, and session. The caller separately enforces
|
|
185
|
-
*
|
|
177
|
+
* run, and session. The caller separately enforces CAP-09/12/13 and every
|
|
178
|
+
* normal protected-path, permission, approval, and exact-target guard before
|
|
179
|
+
* persisting the reservation; task scope is advisory.
|
|
186
180
|
*/
|
|
187
181
|
export function decideBoundedRecoveryHandshake(input: {
|
|
188
182
|
task: TaskContract;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { TaskContract } from "../../extensions/guard-types.ts";
|
|
5
|
+
import { readTaskJournal } from "../../extensions/task-journal.js";
|
|
6
|
+
import {
|
|
7
|
+
directChildGitEvidenceRoots,
|
|
8
|
+
normalizedGitPath
|
|
9
|
+
} from "../../extensions/workspace-evidence-roots.js";
|
|
10
|
+
import {
|
|
11
|
+
workingTreeSnapshot,
|
|
12
|
+
workingTreeSnapshotHasUnavailableEvidence
|
|
13
|
+
} from "../../extensions/task-state.js";
|
|
14
|
+
import { workingTreeEvidenceDigest } from "../../extensions/working-tree-digest.js";
|
|
15
|
+
import { readMutationProvenance } from "../inspection/mutation-provenance-store.ts";
|
|
16
|
+
import { readTaskBaselineManifest } from "../inspection/source-evidence-store.ts";
|
|
17
|
+
|
|
18
|
+
// Some filesystems expose timestamps at coarse granularity. Requiring a clear
|
|
19
|
+
// pre-task gap prevents a file created in the same timestamp bucket as task
|
|
20
|
+
// startup from being mistaken for legacy baseline state.
|
|
21
|
+
const LEGACY_EVIDENCE_TIMESTAMP_SAFETY_MS = 2_000;
|
|
22
|
+
|
|
23
|
+
export type TaskEvidenceCoverageRefresh = {
|
|
24
|
+
task: TaskContract;
|
|
25
|
+
refreshed: boolean;
|
|
26
|
+
reason: string;
|
|
27
|
+
addedPaths: string[];
|
|
28
|
+
retainedMutationPaths: string[];
|
|
29
|
+
ambiguousPaths: string[];
|
|
30
|
+
previousBaselineDigest: string;
|
|
31
|
+
nextBaselineDigest: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function strings(value: unknown): string[] {
|
|
35
|
+
return Array.isArray(value)
|
|
36
|
+
? [...new Set(value.filter((item): item is string => typeof item === "string" && item.trim().length > 0)
|
|
37
|
+
.map((item) => normalizedGitPath(item).replace(/\/$/, "")))]
|
|
38
|
+
: [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function decodedMutationPath(value: unknown): string | undefined {
|
|
42
|
+
if (typeof value !== "string" || value.length > 8192 || !/^[A-Za-z0-9_-]*$/.test(value)) return undefined;
|
|
43
|
+
try {
|
|
44
|
+
const decoded = Buffer.from(value, "base64url").toString("utf8");
|
|
45
|
+
const normalized = normalizedGitPath(decoded);
|
|
46
|
+
return normalized && normalized !== "." && normalized !== ".." && !normalized.startsWith("../")
|
|
47
|
+
? normalized
|
|
48
|
+
: undefined;
|
|
49
|
+
} catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function journalMutationPaths(cwd: string, taskRunId: string): { paths: string[]; corruptions: string[] } {
|
|
55
|
+
const journal = readTaskJournal(cwd, { taskRunId });
|
|
56
|
+
const paths: string[] = [];
|
|
57
|
+
for (const event of journal.events) {
|
|
58
|
+
if (event.eventType !== "checkpoint" || event.taskRunId !== taskRunId) continue;
|
|
59
|
+
const evidence = event.data?.evidence;
|
|
60
|
+
if (!evidence || typeof evidence !== "object" || Array.isArray(evidence)) continue;
|
|
61
|
+
paths.push(...strings((evidence as Record<string, unknown>).files));
|
|
62
|
+
paths.push(...strings((evidence as Record<string, unknown>).targetPaths));
|
|
63
|
+
}
|
|
64
|
+
return { paths: [...new Set(paths)].sort(), corruptions: journal.corruptions };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function provenanceMutationPaths(cwd: string, taskRunId: string): { paths: string[]; corruptions: string[] } {
|
|
68
|
+
const provenance = readMutationProvenance(cwd, taskRunId);
|
|
69
|
+
const paths = provenance.records.flatMap((record) => record.changes
|
|
70
|
+
.map((change) => decodedMutationPath(change.repoPathBase64))
|
|
71
|
+
.filter((item): item is string => Boolean(item)));
|
|
72
|
+
return { paths: [...new Set(paths)].sort(), corruptions: provenance.corruptions };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function isLegacyLooseHiddenPath(file: string, childGitPrefixes: string[]): boolean {
|
|
76
|
+
const normalized = normalizedGitPath(file);
|
|
77
|
+
if (!normalized || normalized === "." || normalized === ".." || normalized.startsWith("../")) return false;
|
|
78
|
+
if (childGitPrefixes.some((prefix) => normalized === prefix || normalized.startsWith(`${prefix}/`))) return false;
|
|
79
|
+
return normalized.split("/").some((segment) => segment.startsWith(".") && segment.length > 1);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function fileStatePredatesTask(cwd: string, file: string, createdAt: string): boolean {
|
|
83
|
+
const taskStartedAt = Date.parse(createdAt);
|
|
84
|
+
if (!Number.isFinite(taskStartedAt)) return false;
|
|
85
|
+
const absolute = path.resolve(cwd, file);
|
|
86
|
+
const relative = path.relative(cwd, absolute);
|
|
87
|
+
if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) return false;
|
|
88
|
+
|
|
89
|
+
// The legacy inventory has no content digest for this path. Metadata that is
|
|
90
|
+
// older than the task is the only local positive evidence that the exact file
|
|
91
|
+
// state existed before task execution. A symlink, unreadable component, zero
|
|
92
|
+
// timestamp, or any task-time ctime/mtime remains an ordinary task delta.
|
|
93
|
+
let current = cwd;
|
|
94
|
+
try {
|
|
95
|
+
for (const segment of relative.split(path.sep).filter(Boolean)) {
|
|
96
|
+
current = path.join(current, segment);
|
|
97
|
+
const component = fs.lstatSync(current);
|
|
98
|
+
if (component.isSymbolicLink()) return false;
|
|
99
|
+
}
|
|
100
|
+
const stat = fs.lstatSync(absolute);
|
|
101
|
+
if (!stat.isFile() || stat.isSymbolicLink()) return false;
|
|
102
|
+
const timestamps = [stat.birthtimeMs, stat.ctimeMs, stat.mtimeMs];
|
|
103
|
+
const latestSafeTimestamp = taskStartedAt - LEGACY_EVIDENCE_TIMESTAMP_SAFETY_MS;
|
|
104
|
+
return timestamps.every((value) => Number.isFinite(value) && value > 0 && value <= latestSafeTimestamp);
|
|
105
|
+
} catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function manifestProvenBaselinePaths(
|
|
111
|
+
cwd: string,
|
|
112
|
+
task: TaskContract,
|
|
113
|
+
previousBaseline: Record<string, string>,
|
|
114
|
+
current: Record<string, string>,
|
|
115
|
+
candidates: string[]
|
|
116
|
+
): string[] {
|
|
117
|
+
if (candidates.length === 0) return [];
|
|
118
|
+
try {
|
|
119
|
+
const manifest = readTaskBaselineManifest(cwd, task.taskRunId);
|
|
120
|
+
if (!manifest || manifest.taskId !== task.taskId || manifest.taskRunId !== task.taskRunId) return [];
|
|
121
|
+
const expanded = { ...previousBaseline };
|
|
122
|
+
for (const file of candidates) expanded[file] = current[file];
|
|
123
|
+
return workingTreeEvidenceDigest(expanded) === manifest.baselineTreeDigest ? candidates : [];
|
|
124
|
+
} catch {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Reconcile the one coverage gap introduced when parent-workspace evidence
|
|
131
|
+
* began including hidden project source. Only paths the legacy collector could
|
|
132
|
+
* not see are adopted, and any path with durable mutation evidence remains a
|
|
133
|
+
* real task delta. Existing baseline entries are never rewritten.
|
|
134
|
+
*/
|
|
135
|
+
export function refreshLegacyHiddenWorkspaceEvidenceCoverage(
|
|
136
|
+
cwd: string,
|
|
137
|
+
task: TaskContract
|
|
138
|
+
): TaskEvidenceCoverageRefresh {
|
|
139
|
+
const previousBaseline = task.baselineFileDigests ?? {};
|
|
140
|
+
const previousBaselineDigest = workingTreeEvidenceDigest(previousBaseline);
|
|
141
|
+
const unchanged = (
|
|
142
|
+
reason: string,
|
|
143
|
+
retainedMutationPaths: string[] = [],
|
|
144
|
+
ambiguousPaths: string[] = []
|
|
145
|
+
): TaskEvidenceCoverageRefresh => ({
|
|
146
|
+
task,
|
|
147
|
+
refreshed: false,
|
|
148
|
+
reason,
|
|
149
|
+
addedPaths: [],
|
|
150
|
+
retainedMutationPaths,
|
|
151
|
+
ambiguousPaths,
|
|
152
|
+
previousBaselineDigest,
|
|
153
|
+
nextBaselineDigest: previousBaselineDigest
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
if (task.trace.outcome !== "pending" || task.changeMode !== "source-change") return unchanged("task-not-refreshable");
|
|
157
|
+
if (!previousBaseline || typeof previousBaseline !== "object" || Array.isArray(previousBaseline)) return unchanged("baseline-unavailable");
|
|
158
|
+
const childGitPrefixes = directChildGitEvidenceRoots(cwd).map((root) => normalizedGitPath(root.prefix)).filter(Boolean);
|
|
159
|
+
if (childGitPrefixes.length === 0) return unchanged("not-parent-multi-repo-workspace");
|
|
160
|
+
|
|
161
|
+
const current = workingTreeSnapshot(cwd) as Record<string, string>;
|
|
162
|
+
if (workingTreeSnapshotHasUnavailableEvidence(current)) return unchanged("current-evidence-unavailable");
|
|
163
|
+
const candidates = Object.keys(current)
|
|
164
|
+
.filter((file) => previousBaseline[file] === undefined && isLegacyLooseHiddenPath(file, childGitPrefixes))
|
|
165
|
+
.sort();
|
|
166
|
+
if (candidates.length === 0) return unchanged("coverage-current");
|
|
167
|
+
|
|
168
|
+
const journal = journalMutationPaths(cwd, task.taskRunId);
|
|
169
|
+
const provenance = provenanceMutationPaths(cwd, task.taskRunId);
|
|
170
|
+
if (journal.corruptions.length > 0 || provenance.corruptions.length > 0) {
|
|
171
|
+
return unchanged("mutation-evidence-unavailable");
|
|
172
|
+
}
|
|
173
|
+
const mutated = new Set([
|
|
174
|
+
...strings(task.observedChangedFiles),
|
|
175
|
+
...strings(task.changedFiles),
|
|
176
|
+
...journal.paths,
|
|
177
|
+
...provenance.paths
|
|
178
|
+
]);
|
|
179
|
+
const retainedMutationPaths = candidates.filter((file) => mutated.has(file));
|
|
180
|
+
const unclaimedCandidates = candidates.filter((file) => !mutated.has(file));
|
|
181
|
+
// A current, integrity-validated baseline manifest is stronger than file
|
|
182
|
+
// timestamps: if adding the currently observed missing paths reconstructs
|
|
183
|
+
// its exact task-start tree digest, none of those paths changed after start.
|
|
184
|
+
// Legacy manifests that did not cover the paths simply fail this equality
|
|
185
|
+
// and retain the conservative timestamp fallback.
|
|
186
|
+
const manifestProven = new Set(manifestProvenBaselinePaths(cwd, task, previousBaseline, current, unclaimedCandidates));
|
|
187
|
+
const addedPaths = unclaimedCandidates.filter((file) => manifestProven.has(file) || fileStatePredatesTask(cwd, file, task.createdAt));
|
|
188
|
+
const added = new Set(addedPaths);
|
|
189
|
+
const ambiguousPaths = unclaimedCandidates.filter((file) => !added.has(file));
|
|
190
|
+
if (addedPaths.length === 0) {
|
|
191
|
+
return unchanged(
|
|
192
|
+
ambiguousPaths.length > 0 ? "coverage-candidates-ambiguous" : "coverage-candidates-have-mutation-evidence",
|
|
193
|
+
retainedMutationPaths,
|
|
194
|
+
ambiguousPaths
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const baselineFileDigests = { ...previousBaseline };
|
|
199
|
+
for (const file of addedPaths) baselineFileDigests[file] = current[file];
|
|
200
|
+
const refreshed: TaskContract = {
|
|
201
|
+
...task,
|
|
202
|
+
baselineChangedFiles: Object.keys(baselineFileDigests).sort(),
|
|
203
|
+
baselineFileDigests
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
task: refreshed,
|
|
207
|
+
refreshed: true,
|
|
208
|
+
reason: ambiguousPaths.length > 0
|
|
209
|
+
? "legacy-hidden-workspace-coverage-partially-expanded"
|
|
210
|
+
: "legacy-hidden-workspace-coverage-expanded",
|
|
211
|
+
addedPaths,
|
|
212
|
+
retainedMutationPaths,
|
|
213
|
+
ambiguousPaths,
|
|
214
|
+
previousBaselineDigest,
|
|
215
|
+
nextBaselineDigest: workingTreeEvidenceDigest(baselineFileDigests)
|
|
216
|
+
};
|
|
217
|
+
}
|
|
@@ -143,7 +143,8 @@ export function registerActivityInspector(pi: ExtensionAPI, dependencies: Inspec
|
|
|
143
143
|
runtimeInstanceId: WEBUI_RUNTIME_INSTANCE_REF,
|
|
144
144
|
eventCursor: events.currentCursor(),
|
|
145
145
|
resyncRequired: events.resyncRequired(),
|
|
146
|
-
eventReplay: events.retention()
|
|
146
|
+
eventReplay: events.retention(),
|
|
147
|
+
operationLiveness: typeof ctx.isIdle === "function" ? ctx.isIdle() ? "idle" : "running" : "unknown"
|
|
147
148
|
});
|
|
148
149
|
cached.set(key, { at: Date.now(), view });
|
|
149
150
|
return view;
|