@piagent/platform 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +8 -2
- package/README.vi.md +11 -2
- package/adapters/common/assurance-producers.json +109 -0
- package/adapters/common/structured-assurance-facts.mjs +153 -0
- package/adapters/node-typescript/contract-families.json +2811 -0
- package/adapters/node-typescript/contract-families.md +90 -0
- package/benchmarks/production-v1/grade.mjs +20 -0
- package/benchmarks/production-v1/spend-control.v1.json +3 -3
- package/benchmarks/production-v2/grade.mjs +892 -0
- package/benchmarks/production-v2/project/README.md +7 -0
- package/benchmarks/production-v2/project/config/service.json +4 -0
- package/benchmarks/production-v2/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v2/project/docs/ops.md +3 -0
- package/benchmarks/production-v2/project/logs/incident.log +2 -0
- package/benchmarks/production-v2/project/package.json +11 -0
- package/benchmarks/production-v2/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v2/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v2/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v2/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v2/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v2/project/src/backend/revocation-cache.js +3 -0
- package/benchmarks/production-v2/project/src/data/csv.js +3 -0
- package/benchmarks/production-v2/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v2/project/src/data/migration.js +9 -0
- package/benchmarks/production-v2/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v2/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v2/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/request-lifecycle.js +15 -0
- package/benchmarks/production-v2/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v2/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v2/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v2/project/src/platform/args.js +10 -0
- package/benchmarks/production-v2/project/src/platform/config.js +7 -0
- package/benchmarks/production-v2/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v2/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v2/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/expiry.js +5 -0
- package/benchmarks/production-v2/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v2/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v2/project/vendor/README.md +1 -0
- package/benchmarks/production-v2/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v2/prompts/backend-frontend-contract-sync.md +12 -0
- package/benchmarks/production-v2/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v2/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v2/prompts/chunked-record-boundary.md +9 -0
- package/benchmarks/production-v2/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v2/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v2/prompts/destructive-history-refusal.md +3 -0
- package/benchmarks/production-v2/prompts/expiry-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/idempotent-replay-conflict.md +11 -0
- package/benchmarks/production-v2/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v2/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v2/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v2/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v2/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v2/prompts/pagination-boundary.md +7 -0
- package/benchmarks/production-v2/prompts/protected-env-refusal.md +2 -0
- package/benchmarks/production-v2/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v2/prompts/reconnect-chat-event-order.md +19 -0
- package/benchmarks/production-v2/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v2/prompts/resumable-checkpoint-partial-failure.md +11 -0
- package/benchmarks/production-v2/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v2/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v2/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v2/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v2/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v2/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v2/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v2/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v2/spend-control.v1.json +115 -0
- package/benchmarks/production-v2/suite.json +1009 -0
- package/benchmarks/production-v2/variant.mjs +169 -0
- package/benchmarks/production-v3/CONTRACT-REVISION-20260922.md +31 -0
- package/benchmarks/production-v3/calibration/corpus.v1.json +63 -0
- package/benchmarks/production-v3/calibration/human-review-rubric.v1.json +36 -0
- package/benchmarks/production-v3/grade.mjs +1017 -0
- package/benchmarks/production-v3/project/README.md +7 -0
- package/benchmarks/production-v3/project/config/service.json +4 -0
- package/benchmarks/production-v3/project/data/audit-ledger.jsonl +1 -0
- package/benchmarks/production-v3/project/docs/ops.md +3 -0
- package/benchmarks/production-v3/project/logs/incident.log +2 -0
- package/benchmarks/production-v3/project/package.json +11 -0
- package/benchmarks/production-v3/project/scripts/check.mjs +21 -0
- package/benchmarks/production-v3/project/src/backend/auth.js +3 -0
- package/benchmarks/production-v3/project/src/backend/billing-window.js +4 -0
- package/benchmarks/production-v3/project/src/backend/cache.js +15 -0
- package/benchmarks/production-v3/project/src/backend/invoice.js +4 -0
- package/benchmarks/production-v3/project/src/backend/revocation-cache.js +12 -0
- package/benchmarks/production-v3/project/src/data/csv.js +3 -0
- package/benchmarks/production-v3/project/src/data/dedup.js +5 -0
- package/benchmarks/production-v3/project/src/data/migration.js +9 -0
- package/benchmarks/production-v3/project/src/data/ndjson-stream.js +5 -0
- package/benchmarks/production-v3/project/src/data/versioned-replay.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/chat-events.js +7 -0
- package/benchmarks/production-v3/project/src/frontend/pagination.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/request-lifecycle.js +23 -0
- package/benchmarks/production-v3/project/src/frontend/search-state.js +8 -0
- package/benchmarks/production-v3/project/src/frontend/unicode-search.js +7 -0
- package/benchmarks/production-v3/project/src/fullstack/contract-sync.js +10 -0
- package/benchmarks/production-v3/project/src/platform/args.js +10 -0
- package/benchmarks/production-v3/project/src/platform/config.js +7 -0
- package/benchmarks/production-v3/project/src/platform/workflow-session.js +9 -0
- package/benchmarks/production-v3/project/src/platform/workspace.js +13 -0
- package/benchmarks/production-v3/project/src/reliability/checkpoint.js +5 -0
- package/benchmarks/production-v3/project/src/reliability/expiry.js +14 -0
- package/benchmarks/production-v3/project/src/reliability/retry.js +15 -0
- package/benchmarks/production-v3/project/test/smoke.test.js +21 -0
- package/benchmarks/production-v3/project/vendor/README.md +1 -0
- package/benchmarks/production-v3/prompts/abort-reconnect-supersession.md +11 -0
- package/benchmarks/production-v3/prompts/backend-frontend-contract-sync.md +20 -0
- package/benchmarks/production-v3/prompts/billing-cutoff-clock-skew.md +11 -0
- package/benchmarks/production-v3/prompts/bounded-retry.md +7 -0
- package/benchmarks/production-v3/prompts/chunked-record-boundary.md +11 -0
- package/benchmarks/production-v3/prompts/cli-double-dash.md +7 -0
- package/benchmarks/production-v3/prompts/config-precedence.md +6 -0
- package/benchmarks/production-v3/prompts/destructive-history-refusal.md +9 -0
- package/benchmarks/production-v3/prompts/expiry-boundary.md +14 -0
- package/benchmarks/production-v3/prompts/idempotent-replay-conflict.md +13 -0
- package/benchmarks/production-v3/prompts/incident-diagnosis.md +4 -0
- package/benchmarks/production-v3/prompts/invoice-rounding.md +9 -0
- package/benchmarks/production-v3/prompts/journeys/config-precedence-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/expiry-boundary-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/quoted-csv-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/recover-after-uncertain-send.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/repository-prompt-injection-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/resumable-checkpoint-partial-failure-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/stable-dedup-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/stale-search-response-scout.md +3 -0
- package/benchmarks/production-v3/prompts/journeys/tenant-cache-isolation-scout.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/verify-current-contract.md +4 -0
- package/benchmarks/production-v3/prompts/journeys/workflow-switch-same-session-scout.md +4 -0
- package/benchmarks/production-v3/prompts/pagination-boundary.md +9 -0
- package/benchmarks/production-v3/prompts/protected-env-refusal.md +8 -0
- package/benchmarks/production-v3/prompts/quoted-csv.md +6 -0
- package/benchmarks/production-v3/prompts/reconnect-chat-event-order.md +20 -0
- package/benchmarks/production-v3/prompts/repository-prompt-injection.md +5 -0
- package/benchmarks/production-v3/prompts/resumable-checkpoint-partial-failure.md +15 -0
- package/benchmarks/production-v3/prompts/revoked-session-cache.md +10 -0
- package/benchmarks/production-v3/prompts/schema-migration.md +6 -0
- package/benchmarks/production-v3/prompts/stable-dedup.md +6 -0
- package/benchmarks/production-v3/prompts/stale-search-response.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-cache-isolation.md +6 -0
- package/benchmarks/production-v3/prompts/tenant-role-authorization.md +6 -0
- package/benchmarks/production-v3/prompts/unicode-search.md +6 -0
- package/benchmarks/production-v3/prompts/workflow-switch-same-session.md +30 -0
- package/benchmarks/production-v3/prompts/workspace-order.md +7 -0
- package/benchmarks/production-v3/public-checks/abort-reconnect-supersession.js +34 -0
- package/benchmarks/production-v3/public-checks/expiry-boundary.js +29 -0
- package/benchmarks/production-v3/public-checks/revoked-session-cache.js +20 -0
- package/benchmarks/production-v3/spend-control.v1.json +121 -0
- package/benchmarks/production-v3/suite.json +1010 -0
- package/benchmarks/production-v3/variant.mjs +178 -0
- package/catalog/capabilities.json +2 -2
- package/docs/benchmark-codex-mcp-metadata-contract-v1.md +159 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v2.md +182 -0
- package/docs/benchmark-codex-mcp-metadata-contract-v3.md +194 -0
- package/docs/benchmark-public-contract-addendum-v2.md +85 -0
- package/docs/benchmark-public-contract-addendum-v3.md +116 -0
- package/docs/command-reference-vietnamese.md +10 -7
- package/docs/context-window-policy.md +3 -3
- package/docs/distribution-standard.md +9 -9
- package/docs/languages.json +2 -2
- package/docs/operator-manual-vietnamese.md +12 -12
- package/docs/piagent-codex-benchmark-recovery-plan.md +1817 -0
- package/docs/piagent-core-evaluation-specs-2026-09-06.json +706 -0
- package/docs/piagent-core-improvement-plan.md +528 -0
- package/docs/piagent-core-offline-implementation-2026-09-06.md +219 -0
- package/docs/piagent-core-plan-checkpoint-2026-09-06.json +69 -0
- package/docs/piagent-core-reasoning-research-2026-09-06.md +225 -0
- package/docs/piagent-core-research-sources-2026-09-06.json +416 -0
- package/docs/piagent-open-session-wait.md +19 -0
- package/docs/piagent-runtime-benchmark-execution-plan.md +685 -0
- package/docs/publishing-for-teams.md +2 -0
- package/docs/quality-benchmark.md +128 -8
- package/docs/quickstart-vietnamese.md +2 -2
- package/docs/release-install-policy.md +32 -9
- package/docs/research/harness-next-evidence-review.md +113 -0
- package/docs/team-onboarding.md +7 -7
- package/docs/third-party-neutrality.md +7 -0
- package/docs/usage-observability.md +1 -1
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/runtime.html +1 -1
- package/docs-site/content/en/whats-new.html +11 -0
- package/docs-site/content/runtime.html +2 -2
- package/docs-site/content/whats-new.html +11 -0
- package/docs-site/context-engine.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +1 -1
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/index.html +1 -1
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +2 -2
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +12 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +1 -1
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +3 -3
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +12 -1
- package/docs-site/workflows.html +1 -1
- package/evals/architecture-conformance-v1/lane.json +18 -0
- package/evals/architecture-conformance-v1/runner.mjs +77 -0
- package/evals/fixtures/approved-host-contracts.invalid.json +43 -0
- package/evals/fixtures/approved-host-contracts.valid.json +43 -0
- package/evals/fixtures/benchmark-attempt-outcome.invalid.json +42 -0
- package/evals/fixtures/benchmark-attempt-outcome.valid.json +42 -0
- package/evals/fixtures/benchmark-independent-verification-plan.invalid.json +7 -0
- package/evals/fixtures/benchmark-independent-verification-plan.valid.json +21 -0
- package/evals/fixtures/composite-criterion.invalid.json +10 -0
- package/evals/fixtures/composite-criterion.valid.json +33 -0
- package/evals/fixtures/contract-family-library.invalid.json +42 -0
- package/evals/fixtures/contract-family-library.valid.json +41 -0
- package/evals/fixtures/contract-selection-recipe.invalid.json +29 -0
- package/evals/fixtures/contract-selection-recipe.valid.json +29 -0
- package/evals/fixtures/host-contract-plan.invalid.json +42 -0
- package/evals/fixtures/host-contract-plan.valid.json +41 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.invalid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v2.valid.json +42 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.invalid.json +57 -0
- package/evals/fixtures/scoped-project-verification-receipt-v3.valid.json +57 -0
- package/evals/fixtures/scoped-verification-receipt-v1.invalid.json +40 -0
- package/evals/fixtures/scoped-verification-receipt-v1.valid.json +40 -0
- package/evals/fs5-artifact-archive/README.md +32 -0
- package/evals/fs5-artifact-archive/manifest.json +148 -0
- package/evals/fs5-artifact-archive/sha256/1f073f6d42c093a3182685e0e096144c8b3befd87594aeea1af05ce17653860c.txt +380 -0
- package/evals/fs5-artifact-archive/sha256/1ff46984c5ff668647dfad94248cd9dcfb72384a8aa529279345582f90d7486a.txt +331 -0
- package/evals/fs5-artifact-archive/sha256/20a5e1ef1cab3234a888b876b3cec52e702a05bc5ac000b691f94c651beed9ca.txt +800 -0
- package/evals/fs5-artifact-archive/sha256/29bb79e96b047d79056626d747baa0b3a6ca9d4da7ad80b9668c0085e5581706.txt +116 -0
- package/evals/fs5-artifact-archive/sha256/2bcc0cf6c18eee0c080c30e727610b0f10a278f5862855d920ba5797f07a2f2d.txt +252 -0
- package/evals/fs5-artifact-archive/sha256/37ecc65febe2c5947ac9288ad958bc149e0f08c6beda137edb1c660908853832.txt +324 -0
- package/evals/fs5-artifact-archive/sha256/5d937632d2cfff34dbbb781dd367bb78feb64c36d571c36ca15f2cc40c576af8.txt +142 -0
- package/evals/fs5-artifact-archive/sha256/6057c7bf2f40f8e3db7e293f08d745133c05293b75e9f363fb4e2e53bd09a76a.txt +244 -0
- package/evals/fs5-artifact-archive/sha256/62ea354afb6816b148ae9bd95ffb1ee5e29580eb4a22473e1ae19dbb471ec36b.txt +930 -0
- package/evals/fs5-artifact-archive/sha256/8987775b742f3b3650d75cce84e6d58fcdd3dfb835d03dac4c2bfe6d9eea3a2e.txt +903 -0
- package/evals/fs5-artifact-archive/sha256/902e886d0920b66811f54d0d1d933d70f8fab8704813b46d578bee6af1f21eef.txt +942 -0
- package/evals/fs5-artifact-archive/sha256/976a9908adfd765ee7be0655616f39a44fff64824f5e8535d726082e550b02eb.txt +910 -0
- package/evals/fs5-artifact-archive/sha256/9c07bda5bfe7bb7b0959844ccea6790735cc9f154d8d5972e18785148cea6d9a.txt +101 -0
- package/evals/fs5-artifact-archive/sha256/b936a604db87a697bf69581c33d753e26d9e5e2ccce40bf9c9b2070948f49919.txt +931 -0
- package/evals/fs5-artifact-archive/sha256/bf91f69473f48fc3de7c7c55e7ce893ba0511074c4ec930d9f3bcb9615d8e9d5.txt +950 -0
- package/evals/fs5-artifact-archive/sha256/ce4ed1b4a033f2a8cb4632d1336b0867edb3454ce1380f0642c4055149e6ac59.txt +784 -0
- package/evals/fs5-artifact-archive/sha256/db97f444db8ba604512daf0aa26b3fe1e2a120ace2b21d4730db5b18aa0c528f.txt +950 -0
- package/evals/fs5-causal-arm.v1.json +9 -5
- package/evals/fs5-pilot-protocol.v1.json +1 -1
- package/evals/fs5-pilot-protocol.v4.json +4 -4
- package/evals/fs5-pilot-protocol.v5.json +6 -5
- package/evals/harness-next/development-corpus.mjs +106 -0
- package/evals/harness-next/resource-budget-probe.mjs +38 -0
- package/evals/harness-next/run-calibration.mjs +83 -0
- package/evals/harness-next/run-resource-probe.mjs +55 -0
- package/evals/harness-next/selected-development-corpus.mjs +27 -0
- package/evals/harness-next.v1.json +51 -0
- package/evals/long-horizon-v1/README.md +19 -0
- package/evals/long-horizon-v1/runner.mjs +116 -48
- package/evals/long-horizon-v1/worker.mjs +77 -30
- package/evals/private-holdout-v1/CURRENT_BOUNDARY.md +53 -0
- package/evals/private-holdout-v1/README.md +5 -2
- package/evals/private-holdout-v1/public-exposure.v2.json +273 -0
- package/package.json +9 -4
- package/packages/piagent-core/README.md +2 -2
- package/packages/piagent-core/benchmark/benchmark-all-attempt-efficiency.js +55 -0
- package/packages/piagent-core/benchmark/benchmark-artifact-binding.js +49 -0
- package/packages/piagent-core/benchmark/benchmark-bootstrap.js +265 -14
- package/packages/piagent-core/benchmark/benchmark-budget-governor.js +271 -0
- package/packages/piagent-core/benchmark/benchmark-campaign.js +592 -0
- package/packages/piagent-core/benchmark/benchmark-candidate.js +8 -3
- package/packages/piagent-core/benchmark/benchmark-checkpoint.js +67 -0
- package/packages/piagent-core/benchmark/benchmark-claim-restrictions.js +269 -2
- package/packages/piagent-core/benchmark/benchmark-cli.js +120 -3
- package/packages/piagent-core/benchmark/benchmark-codex-events.js +235 -0
- package/packages/piagent-core/benchmark/benchmark-codex-outcome.js +20 -0
- package/packages/piagent-core/benchmark/benchmark-codex-relative-efficiency.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-codex-rollout.js +521 -0
- package/packages/piagent-core/benchmark/benchmark-codex.js +104 -8
- package/packages/piagent-core/benchmark/benchmark-comparison.js +284 -1
- package/packages/piagent-core/benchmark/benchmark-core.js +107 -107
- package/packages/piagent-core/benchmark/benchmark-diagnostic-source-evidence.js +40 -0
- package/packages/piagent-core/benchmark/benchmark-diagnostic-treatment.js +104 -0
- package/packages/piagent-core/benchmark/benchmark-evaluator-v3.js +226 -0
- package/packages/piagent-core/benchmark/benchmark-execution-guard.js +23 -1
- package/packages/piagent-core/benchmark/benchmark-forensics.js +63 -50
- package/packages/piagent-core/benchmark/benchmark-goal-assessment.js +193 -0
- package/packages/piagent-core/benchmark/benchmark-goal-report.js +87 -0
- package/packages/piagent-core/benchmark/benchmark-independent-verification-observation.js +64 -0
- package/packages/piagent-core/benchmark/benchmark-matrix-summary.js +141 -0
- package/packages/piagent-core/benchmark/benchmark-matrix.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-normalized-cost.js +62 -0
- package/packages/piagent-core/benchmark/benchmark-pi-home.js +1 -0
- package/packages/piagent-core/benchmark/benchmark-preflight.js +69 -8
- package/packages/piagent-core/benchmark/benchmark-process.js +23 -9
- package/packages/piagent-core/benchmark/benchmark-production-completion.js +84 -0
- package/packages/piagent-core/benchmark/benchmark-production-stage-validation.js +209 -0
- package/packages/piagent-core/benchmark/benchmark-provider-free-evidence.js +162 -45
- package/packages/piagent-core/benchmark/benchmark-provider-free-owner.js +24 -0
- package/packages/piagent-core/benchmark/benchmark-provider-wire.js +378 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.d.ts +2 -0
- package/packages/piagent-core/benchmark/benchmark-record-validation.js +269 -3
- package/packages/piagent-core/benchmark/benchmark-release-claim-controls.js +132 -0
- package/packages/piagent-core/benchmark/benchmark-report.js +79 -4
- package/packages/piagent-core/benchmark/benchmark-resume-recovery.js +280 -10
- package/packages/piagent-core/benchmark/benchmark-runner-policy.js +88 -1
- package/packages/piagent-core/benchmark/benchmark-runtime-identity.js +50 -1
- package/packages/piagent-core/benchmark/benchmark-runtime.js +102 -10
- package/packages/piagent-core/benchmark/benchmark-safety-evidence.js +74 -0
- package/packages/piagent-core/benchmark/benchmark-service-tier.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-stage-diagnostic.js +144 -128
- package/packages/piagent-core/benchmark/benchmark-suite-identity.js +264 -1
- package/packages/piagent-core/benchmark/benchmark-suite-runtime.js +4 -0
- package/packages/piagent-core/benchmark/benchmark-suite.js +211 -4
- package/packages/piagent-core/benchmark/benchmark-summary-support.js +30 -2
- package/packages/piagent-core/benchmark/benchmark-timing-contract.js +189 -0
- package/packages/piagent-core/benchmark/benchmark-timing-diagnostics.js +110 -139
- package/packages/piagent-core/benchmark/benchmark-transport-evidence.js +203 -0
- package/packages/piagent-core/benchmark/benchmark-transport-observation.js +147 -0
- package/packages/piagent-core/benchmark/benchmark-tree-identity.js +2 -1
- package/packages/piagent-core/benchmark/benchmark-usage.js +395 -33
- package/packages/piagent-core/benchmark/benchmark-workflow.js +136 -38
- package/packages/piagent-core/benchmark/fs5-pilot-protocol.js +21 -2
- package/packages/piagent-core/capabilities/runtime-integrity.js +3 -0
- package/packages/piagent-core/extensions/acceptance-api-baseline.js +24 -0
- package/packages/piagent-core/extensions/acceptance-assessment.js +153 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.d.ts +41 -0
- package/packages/piagent-core/extensions/acceptance-authenticated-admission.js +120 -0
- package/packages/piagent-core/extensions/acceptance-behavior-proof.js +264 -70
- package/packages/piagent-core/extensions/acceptance-boundary-binding.js +31 -0
- package/packages/piagent-core/extensions/acceptance-boundary-guidance.js +214 -0
- package/packages/piagent-core/extensions/acceptance-callable-scanner.js +244 -0
- package/packages/piagent-core/extensions/acceptance-clause-group.js +45 -0
- package/packages/piagent-core/extensions/acceptance-composite-contract.js +334 -0
- package/packages/piagent-core/extensions/acceptance-contract-conjunction.js +78 -0
- package/packages/piagent-core/extensions/acceptance-contract-selection.js +161 -0
- package/packages/piagent-core/extensions/acceptance-contract-semantics.js +211 -211
- package/packages/piagent-core/extensions/acceptance-declared-api.js +126 -0
- package/packages/piagent-core/extensions/acceptance-diagnostic-policy.ts +14 -0
- package/packages/piagent-core/extensions/acceptance-document-content.js +73 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.d.ts +59 -0
- package/packages/piagent-core/extensions/acceptance-durable-execution.js +139 -0
- package/packages/piagent-core/extensions/acceptance-error-classes.js +1 -1
- package/packages/piagent-core/extensions/acceptance-evidence-store.js +223 -0
- package/packages/piagent-core/extensions/acceptance-executable-evidence.js +490 -88
- package/packages/piagent-core/extensions/acceptance-execution-diagnostics.js +34 -0
- package/packages/piagent-core/extensions/acceptance-execution-snapshot.js +174 -0
- package/packages/piagent-core/extensions/acceptance-executor/.dockerignore +21 -0
- package/packages/piagent-core/extensions/acceptance-executor/Dockerfile +5 -0
- package/packages/piagent-core/extensions/acceptance-executor/README.md +103 -0
- package/packages/piagent-core/extensions/acceptance-executor/budget.mjs +54 -0
- package/packages/piagent-core/extensions/acceptance-executor/callback-intrinsics.mjs +126 -0
- package/packages/piagent-core/extensions/acceptance-executor/capabilities.mjs +127 -0
- package/packages/piagent-core/extensions/acceptance-executor/guest.mjs +285 -0
- package/packages/piagent-core/extensions/acceptance-executor/intrinsics.mjs +133 -0
- package/packages/piagent-core/extensions/acceptance-executor/invocation.mjs +39 -0
- package/packages/piagent-core/extensions/acceptance-executor/jobs.mjs +29 -0
- package/packages/piagent-core/extensions/acceptance-executor/module-graph.mjs +70 -0
- package/packages/piagent-core/extensions/acceptance-executor/node-profile.mjs +398 -0
- package/packages/piagent-core/extensions/acceptance-executor/package-lock.json +40 -0
- package/packages/piagent-core/extensions/acceptance-executor/package.json +10 -0
- package/packages/piagent-core/extensions/acceptance-executor/protocol.mjs +248 -0
- package/packages/piagent-core/extensions/acceptance-executor/reference-identity.mjs +61 -0
- package/packages/piagent-core/extensions/acceptance-executor/references.mjs +14 -0
- package/packages/piagent-core/extensions/acceptance-executor/structured-clone.mjs +53 -0
- package/packages/piagent-core/extensions/acceptance-executor/values.mjs +97 -0
- package/packages/piagent-core/extensions/acceptance-executor/worker.mjs +75 -0
- package/packages/piagent-core/extensions/acceptance-expiry-calendar-proof.js +162 -0
- package/packages/piagent-core/extensions/acceptance-expression-parser.js +155 -0
- package/packages/piagent-core/extensions/acceptance-focused-verification.js +40 -0
- package/packages/piagent-core/extensions/acceptance-host-configuration.js +337 -0
- package/packages/piagent-core/extensions/acceptance-identifier-criteria.js +25 -0
- package/packages/piagent-core/extensions/acceptance-independent-contract.js +209 -0
- package/packages/piagent-core/extensions/acceptance-independent-registry.js +106 -0
- package/packages/piagent-core/extensions/acceptance-input-provenance.js +40 -0
- package/packages/piagent-core/extensions/acceptance-integer-domains.js +322 -0
- package/packages/piagent-core/extensions/acceptance-invalid-input-receipt.js +20 -0
- package/packages/piagent-core/extensions/acceptance-invalid-partitions.js +26 -0
- package/packages/piagent-core/extensions/acceptance-invalid-sentinel-proof.js +477 -0
- package/packages/piagent-core/extensions/acceptance-isolated-executor.js +254 -0
- package/packages/piagent-core/extensions/acceptance-lexical-sentinels.js +130 -0
- package/packages/piagent-core/extensions/acceptance-literal-dataflow.js +735 -0
- package/packages/piagent-core/extensions/acceptance-local-binding.js +106 -0
- package/packages/piagent-core/extensions/acceptance-normalizer-evidence.js +719 -0
- package/packages/piagent-core/extensions/acceptance-obligations.js +75 -0
- package/packages/piagent-core/extensions/acceptance-parameter-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-precedence-contract.js +572 -0
- package/packages/piagent-core/extensions/acceptance-proof-capability.js +26 -0
- package/packages/piagent-core/extensions/acceptance-receipt.js +139 -152
- package/packages/piagent-core/extensions/acceptance-result-contract-evidence.js +159 -0
- package/packages/piagent-core/extensions/acceptance-source-origin.js +214 -0
- package/packages/piagent-core/extensions/acceptance-state-machine-evidence.js +64 -8
- package/packages/piagent-core/extensions/acceptance-tagged-event-evidence.js +685 -0
- package/packages/piagent-core/extensions/acceptance-temporal-contract.js +756 -0
- package/packages/piagent-core/extensions/acceptance-temporal-dataflow-proof.js +618 -0
- package/packages/piagent-core/extensions/acceptance-test-binding-evidence.js +20 -2
- package/packages/piagent-core/extensions/acceptance-test-bindings.js +86 -0
- package/packages/piagent-core/extensions/acceptance-tuple-shapes.js +12 -0
- package/packages/piagent-core/extensions/context-engine.js +11 -6
- package/packages/piagent-core/extensions/criterion-context-pack.js +96 -4
- package/packages/piagent-core/extensions/failure-types.ts +2 -2
- package/packages/piagent-core/extensions/guard-types.ts +5 -1
- package/packages/piagent-core/extensions/piagent-guard.ts +197 -155
- package/packages/piagent-core/extensions/readonly-inline-inspection.ts +378 -0
- package/packages/piagent-core/extensions/recovery-decision-validation.ts +92 -0
- package/packages/piagent-core/extensions/shell-write-targets.js +15 -14
- package/packages/piagent-core/extensions/task-contract-view.js +4 -4
- package/packages/piagent-core/extensions/task-digest-migration.js +2 -2
- package/packages/piagent-core/extensions/task-journal.js +48 -3
- package/packages/piagent-core/extensions/task-runtime-audit.js +8 -2
- package/packages/piagent-core/extensions/task-state.js +74 -38
- package/packages/piagent-core/extensions/task-terminal-disposition.js +10 -0
- package/packages/piagent-core/extensions/trajectory-contract.ts +5 -0
- package/packages/piagent-core/extensions/verification-intelligence.js +60 -8
- package/packages/piagent-core/extensions/workflow-catalog.ts +98 -0
- package/packages/piagent-core/extensions/workspace-revision.js +48 -0
- package/packages/piagent-core/extensions/workspace-verification-snapshot.js +13 -0
- package/packages/piagent-core/package.json +3 -3
- package/packages/piagent-core/policies/base-policy.json +1 -0
- package/packages/piagent-core/runtime/context/adaptive-planner.ts +7 -3
- package/packages/piagent-core/runtime/hooks/agent-start-hook.ts +60 -59
- package/packages/piagent-core/runtime/hooks/agent-start-types.ts +48 -0
- package/packages/piagent-core/runtime/hooks/completion-hook.ts +76 -83
- package/packages/piagent-core/runtime/hooks/input-hook.ts +92 -7
- package/packages/piagent-core/runtime/hooks/protected-refusal-completion.ts +86 -0
- package/packages/piagent-core/runtime/hooks/session-hooks.ts +5 -2
- package/packages/piagent-core/runtime/hooks/session-start-hook.ts +50 -18
- package/packages/piagent-core/runtime/hooks/tool-result-hook.ts +53 -20
- package/packages/piagent-core/runtime/hooks/tool-result-metadata.ts +9 -0
- package/packages/piagent-core/runtime/hooks/tool-result-navigation.ts +36 -0
- package/packages/piagent-core/runtime/hooks/tool-result-retrieval.ts +42 -0
- package/packages/piagent-core/runtime/input/chat-images.ts +1 -1
- package/packages/piagent-core/runtime/inspection/activity-event-adapter.ts +1 -1
- package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
- package/packages/piagent-core/runtime/inspection/task-handoff-history.ts +2 -2
- package/packages/piagent-core/runtime/inspection/tool-failure-classification.ts +49 -8
- package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +61 -15
- package/packages/piagent-core/runtime/inspection/workspace-file-reader.ts +2 -132
- package/packages/piagent-core/runtime/model/provider-wire-fingerprint.ts +20 -0
- package/packages/piagent-core/runtime/model/service-tier-runtime.ts +242 -0
- package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +75 -14
- package/packages/piagent-core/runtime/product/activity-inspector.ts +6 -3
- package/packages/piagent-core/runtime/product/edit-verifier-timing.ts +26 -0
- package/packages/piagent-core/runtime/product/efficiency-metrics.ts +12 -7
- package/packages/piagent-core/runtime/product/operator-projections.ts +8 -3
- package/packages/piagent-core/runtime/product/task-usage-hooks.ts +78 -0
- package/packages/piagent-core/runtime/product/task-usage.ts +104 -0
- package/packages/piagent-core/runtime/quality/protected-refusal-handoff.ts +35 -0
- package/packages/piagent-core/runtime/recovery/acceptance-recovery-guidance.ts +21 -0
- package/packages/piagent-core/runtime/recovery/continuation-budget.ts +11 -2
- package/packages/piagent-core/runtime/recovery/diagnostic-delivery.ts +61 -0
- package/packages/piagent-core/runtime/recovery/handoff-projection.ts +192 -57
- package/packages/piagent-core/runtime/recovery/handoff-verifier-binding.ts +24 -0
- package/packages/piagent-core/runtime/recovery/independent-verification-recovery.ts +79 -0
- package/packages/piagent-core/runtime/recovery/recovery-policy.ts +27 -39
- package/packages/piagent-core/runtime/recovery/resume-state.ts +8 -5
- package/packages/piagent-core/runtime/registration/activity-inspector-command.ts +2 -1
- package/packages/piagent-core/runtime/registration/context-commands.ts +12 -8
- package/packages/piagent-core/runtime/registration/operator-catalogs.ts +4 -9
- package/packages/piagent-core/runtime/registration/policy-tools.ts +5 -3
- package/packages/piagent-core/runtime/registration/session-commands.ts +9 -7
- package/packages/piagent-core/runtime/registration/session-wait-tool.ts +54 -0
- package/packages/piagent-core/runtime/registration/task-completion-tools.ts +27 -11
- package/packages/piagent-core/runtime/registration/task-start-conditional-mutation.ts +45 -0
- package/packages/piagent-core/runtime/registration/task-start-guidance.ts +5 -2
- package/packages/piagent-core/runtime/registration/task-start-tool.ts +23 -23
- package/packages/piagent-core/runtime/registration/workflow-commands.ts +64 -93
- package/packages/piagent-core/runtime/session/completion-signals.ts +23 -0
- package/packages/piagent-core/runtime/session/message-signals.ts +6 -22
- package/packages/piagent-core/runtime/session/retrieval-evidence-runtime.ts +188 -0
- package/packages/piagent-core/runtime/session/runtime-state.ts +29 -35
- package/packages/piagent-core/runtime/session/system-prompt.ts +3 -3
- package/packages/piagent-core/runtime/session/uncertain-send-continuation.ts +231 -0
- package/packages/piagent-core/runtime/session/usage.ts +4 -3
- package/packages/piagent-core/runtime/tools/apply-patch-tool.ts +6 -6
- package/packages/piagent-core/runtime/tools/phase-tool-runtime.ts +1 -1
- package/packages/piagent-core/runtime/tools/phase-tools.ts +3 -2
- package/packages/piagent-core/runtime/tools/session-wait.ts +42 -0
- package/packages/piagent-core/runtime/tools/tool-groups.ts +10 -3
- package/packages/piagent-core/runtime/trajectory/trajectory-runtime.ts +192 -5
- package/packages/piagent-core/runtime/trajectory/trajectory-types.ts +3 -2
- package/packages/piagent-core/runtime/verification/acceptance-api-baseline.js +488 -0
- package/packages/piagent-core/runtime/verification/completion-preparation.ts +22 -0
- package/packages/piagent-core/runtime/verification/composite-completion-finalizer.ts +105 -0
- package/packages/piagent-core/runtime/verification/composite-journal-anchor.ts +181 -0
- package/packages/piagent-core/runtime/verification/composite-runtime-binding.ts +76 -0
- package/packages/piagent-core/runtime/verification/composite-scoped-mediation.ts +318 -0
- package/packages/piagent-core/runtime/verification/composite-session-persistence.ts +175 -0
- package/packages/piagent-core/runtime/verification/composite-task-publication.ts +273 -0
- package/packages/piagent-core/runtime/verification/exact-verifier-reuse.ts +11 -11
- package/packages/piagent-core/runtime/verification/host-project-verification.ts +71 -0
- package/packages/piagent-core/runtime/verification/independent-acceptance-runtime.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-assurance-facts.ts +500 -0
- package/packages/piagent-core/runtime/verification/runtime-contract-runner.ts +107 -0
- package/packages/piagent-core/runtime/verification/shell-verification-snapshots.ts +56 -0
- package/packages/piagent-core/runtime/workflows/change-clarification.ts +61 -0
- package/packages/piagent-core/runtime/workflows/input-routing.ts +21 -14
- package/packages/piagent-core/runtime/workflows/runtime-intake-compaction.ts +44 -7
- package/packages/piagent-core/runtime/workflows/task-followup-policy.ts +163 -0
- package/packages/piagent-core/runtime/workflows/task-intake.ts +221 -242
- package/packages/piagent-core/runtime/workflows/task-repair-intent.ts +67 -0
- package/packages/piagent-core/runtime/workflows/task-scope-resolution.ts +83 -0
- package/packages/piagent-core/runtime/workflows/webui-runtime-command.ts +5 -2
- package/packages/piagent-core/runtime/workflows/webui-workflow.ts +39 -32
- package/packages/piagent-core/runtime/workflows/workflow-follow-up.ts +33 -0
- package/packages/piagent-core/security/workspace-file-reader.ts +132 -0
- package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-B4XehTCU.js → MarkdownMessage-DGk34zJT.js} +1 -1
- package/packages/piagent-webui/dist/client/assets/{index-BV-_03yl.css → index-DVahUVWy.css} +1 -1
- package/packages/piagent-webui/dist/client/assets/index-DiKRmCEP.js +176 -0
- package/packages/piagent-webui/dist/client/index.html +2 -2
- package/packages/piagent-webui/extension/dispatch-user-entry.ts +13 -0
- package/packages/piagent-webui/extension/piagent-webui.ts +10 -2
- package/packages/piagent-webui/extension/review-controller.ts +29 -6
- package/packages/piagent-webui/extension/same-session-bridge.ts +6 -7
- package/packages/piagent-webui/extension/session-stream-adapter.ts +60 -11
- package/packages/piagent-webui/extension/source-mutation-controller.ts +29 -3
- package/packages/piagent-webui/extension/source-open-controller.ts +29 -7
- package/packages/piagent-webui/extension/source-revert-controller.ts +26 -3
- package/packages/piagent-webui/gateway/gateway-events.ts +22 -5
- package/packages/piagent-webui/gateway/gateway-service.ts +7 -2
- package/packages/piagent-webui/gateway/gateway-session-stream.ts +141 -19
- package/packages/piagent-webui/gateway/rpc-ui-context.ts +34 -9
- package/packages/piagent-webui/gateway/runtime-command-controller.ts +46 -6
- package/packages/piagent-webui/gateway/runtime-session-controls.ts +17 -2
- package/packages/piagent-webui/gateway/session-catalog.ts +9 -3
- package/packages/piagent-webui/gateway/session-command-controller.ts +29 -9
- package/packages/piagent-webui/gateway/session-effective-options.ts +2 -9
- package/packages/piagent-webui/gateway/session-inspection-registry.ts +11 -2
- package/packages/piagent-webui/gateway/session-operation-settlement.ts +28 -0
- package/packages/piagent-webui/gateway/session-prompt-dispatch.ts +37 -0
- package/packages/piagent-webui/gateway/session-runtime-close.ts +36 -0
- package/packages/piagent-webui/gateway/session-runtime-factory.ts +183 -6
- package/packages/piagent-webui/gateway/session-runtime-ownership.ts +48 -0
- package/packages/piagent-webui/gateway/session-runtime-state.ts +24 -0
- package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +114 -114
- package/packages/piagent-webui/server/core-inspection-provider.ts +73 -14
- package/packages/piagent-webui/server/loopback-server.ts +9 -7
- package/packages/piagent-webui/server/terminal-delivery-receipt.ts +144 -0
- package/packages/piagent-webui/server/transcript-projection.ts +65 -12
- package/packages/piagent-webui/shared/message-correlation.ts +25 -0
- package/schemas/approved-host-contracts.schema.json +973 -0
- package/schemas/benchmark-attempt-outcome.schema.json +303 -0
- package/schemas/benchmark-independent-verification-plan.schema.json +34 -0
- package/schemas/composite-criterion.schema.json +788 -0
- package/schemas/contract-family-library.schema.json +28 -0
- package/schemas/contract-selection-recipe.schema.json +31 -0
- package/schemas/failure-evidence.schema.json +2 -2
- package/schemas/helper-request.schema.json +16 -4
- package/schemas/host-contract-plan.schema.json +25 -0
- package/schemas/piagent-webui/gateway-protocol-v1.schema.json +16 -2
- package/schemas/piagent-webui/runtime-command-v1.schema.json +26 -3
- package/schemas/piagent-webui/runtime-event-v2.schema.json +32 -1
- package/schemas/piagent-webui/session-live-state-v1.schema.json +2 -0
- package/schemas/piagent-webui/snapshot-v1.schema.json +3 -0
- package/schemas/piagent-webui/source-change-v1.schema.json +12 -0
- package/schemas/piagent-webui/transcript-v1.schema.json +2 -1
- package/schemas/public-contracts/codex-mcp-metadata-v1.schema.json +206 -0
- package/schemas/public-contracts/codex-mcp-metadata-v2.schema.json +228 -0
- package/schemas/public-contracts/codex-mcp-metadata-v3.schema.json +233 -0
- package/schemas/public-contracts/revocation-v1.schema.json +87 -0
- package/schemas/public-contracts/subscription-contract-v1.schema.json +76 -0
- package/schemas/scoped-project-verification-receipt-v2.schema.json +83 -0
- package/schemas/scoped-project-verification-receipt-v3.schema.json +295 -0
- package/schemas/scoped-verification-receipt-v1.schema.json +76 -0
- package/schemas/task-contract.schema.json +30 -0
- package/scripts/approve-independent-verification.mjs +57 -0
- package/scripts/benchmark-arm-observer.mjs +320 -0
- package/scripts/benchmark-budget-ipc.mjs +34 -0
- package/scripts/benchmark-budget-launcher.mjs +91 -0
- package/scripts/benchmark-budget-processes.mjs +133 -0
- package/scripts/benchmark-budget-publication.mjs +228 -0
- package/scripts/benchmark-budget-runtime.mjs +136 -0
- package/scripts/benchmark-candidate-ablation.mjs +265 -0
- package/scripts/benchmark-codex-journey.mjs +406 -0
- package/scripts/benchmark-independent-verification.mjs +628 -0
- package/scripts/benchmark-journey-outcome.mjs +92 -0
- package/scripts/benchmark-production-v3-human-review.mjs +192 -0
- package/scripts/benchmark-public-input-catalog.mjs +158 -0
- package/scripts/benchmark-registered-plan-author.mjs +355 -0
- package/scripts/benchmark-registered-plan-recipe-support.mjs +85 -0
- package/scripts/benchmark-registered-plan-recipes-backend.mjs +165 -0
- package/scripts/benchmark-registered-plan-recipes-data.mjs +164 -0
- package/scripts/benchmark-registered-plan-recipes-platform.mjs +165 -0
- package/scripts/benchmark-runner-completion.mjs +133 -0
- package/scripts/benchmark-runner-configuration.mjs +159 -0
- package/scripts/benchmark-runner-core.mjs +217 -388
- package/scripts/benchmark-runner-finalization.mjs +140 -27
- package/scripts/benchmark-runner-provider-boundary.mjs +44 -0
- package/scripts/benchmark-runner-schedule.mjs +256 -0
- package/scripts/benchmark-runner-support.mjs +136 -4
- package/scripts/benchmark-runner.mjs +95 -18
- package/scripts/benchmark-scoped-broker-custody.mjs +483 -0
- package/scripts/benchmark-scoped-docs-verifier.mjs +203 -0
- package/scripts/benchmark-scoped-frozen-qualification.mjs +676 -0
- package/scripts/benchmark-scoped-pi-router.mjs +196 -0
- package/scripts/benchmark-scoped-project-verification-receipt.mjs +49 -0
- package/scripts/benchmark-scoped-project-verifier.mjs +461 -0
- package/scripts/benchmark-scoped-session-custody.mjs +599 -0
- package/scripts/benchmark-scoped-session-factory.mjs +342 -0
- package/scripts/benchmark-scoped-tool-broker.mjs +523 -0
- package/scripts/benchmark-scoped-verification-supervisor.mjs +773 -0
- package/scripts/benchmark-session-evaluator.mjs +169 -0
- package/scripts/benchmark-session-provider-boundary.mjs +62 -0
- package/scripts/benchmark-session-usage.mjs +28 -0
- package/scripts/benchmark-session.mjs +343 -50
- package/scripts/benchmark-webui-journey.mjs +678 -0
- package/scripts/check-public-wording.mjs +46 -0
- package/scripts/fs4-readiness-evaluation.mjs +7 -1
- package/scripts/phase-tools-evaluation.mjs +1 -0
- package/scripts/pi-auto.sh +7 -1
- package/scripts/pi-usage-history.mjs +201 -11
- package/scripts/piagent-cli.mjs +8 -0
- package/scripts/private-holdout-readiness.mjs +7 -1
- package/scripts/public-evaluation-exposure.mjs +140 -0
- package/scripts/select-independent-verification.mjs +62 -0
- package/scripts/typescript-loader.mjs +135 -1
- package/scripts/update-global.mjs +6 -7
- package/scripts/verify-local.sh +36 -55
- package/scripts/verify-release-identity.mjs +5 -3
- package/packages/piagent-webui/dist/client/assets/index-CgOEyRPG.js +0 -176
|
@@ -5,6 +5,9 @@ import os from "node:os";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { spawn, spawnSync } from "node:child_process";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { collectBenchmarkCandidate } from "../../packages/piagent-core/benchmark/benchmark-candidate.js";
|
|
9
|
+
import { checkpointDirectory, checkpointDigest, readCheckpoint, writeCheckpoint, writeCheckpointBytes } from "../../packages/piagent-core/benchmark/benchmark-checkpoint.js";
|
|
10
|
+
import { acquireBenchmarkRunLock } from "../../packages/piagent-core/benchmark/benchmark-run-lock.js";
|
|
8
11
|
|
|
9
12
|
import { buildContextEfficiencyReport } from "../../packages/piagent-core/extensions/context-engine.js";
|
|
10
13
|
import { recordCompletionAudit, recordTaskStartCheckpoint } from "../../packages/piagent-core/extensions/task-runtime-audit.js";
|
|
@@ -12,7 +15,7 @@ import { inspectTaskContinuationBudget, reserveTaskContinuation } from "../../pa
|
|
|
12
15
|
import { buildHandoffProjection, readHandoffProjection, writeHandoffProjection } from "../../packages/piagent-core/runtime/recovery/handoff-projection.ts";
|
|
13
16
|
import { inspectTaskResumeState } from "../../packages/piagent-core/runtime/recovery/resume-state.ts";
|
|
14
17
|
import { createBoundTaskAuthority } from "../../packages/piagent-core/runtime/policy/task-authority-runtime.ts";
|
|
15
|
-
import { bindSessionTask, workingTreeSnapshot, writeTaskContract } from "../../packages/piagent-core/extensions/task-state.js";
|
|
18
|
+
import { activeSessionTask, bindSessionTask, workingTreeSnapshot, writeTaskContract } from "../../packages/piagent-core/extensions/task-state.js";
|
|
16
19
|
import { readTaskJournal } from "../../packages/piagent-core/extensions/task-journal.js";
|
|
17
20
|
import { workingTreeEvidenceDigest } from "../../packages/piagent-core/extensions/working-tree-digest.js";
|
|
18
21
|
|
|
@@ -25,7 +28,7 @@ const option = (name) => {
|
|
|
25
28
|
return index >= 0 ? argumentsList[index + 1] : undefined;
|
|
26
29
|
};
|
|
27
30
|
const calibrationFast = argumentsList.includes("--calibration-fast");
|
|
28
|
-
|
|
31
|
+
let outputPath = path.resolve(option("--output") ?? path.join(process.cwd(), "long-horizon-report.json"));
|
|
29
32
|
const totalUnits = calibrationFast ? 9 : lane.totalUnits;
|
|
30
33
|
const crashAfterUnit = calibrationFast ? 3 : lane.hardCrashAfterUnit;
|
|
31
34
|
const handoffAfterUnit = calibrationFast ? 6 : lane.handoffAfterUnit;
|
|
@@ -33,18 +36,52 @@ const compactionUnits = calibrationFast ? [2, 4, 6, 8] : lane.compactionUnits;
|
|
|
33
36
|
const tickMilliseconds = calibrationFast ? Number(option("--tick-ms") ?? 2) : lane.tickMilliseconds;
|
|
34
37
|
const evidenceClass = calibrationFast ? "calibration-fast" : "provider-free-long-horizon";
|
|
35
38
|
if (!calibrationFast && option("--tick-ms") !== undefined) throw new Error("wall-clock evidence cannot override tick duration");
|
|
39
|
+
if (!Number.isFinite(tickMilliseconds) || tickMilliseconds < 0) throw new Error("invalid tick duration");
|
|
40
|
+
if (argumentsList.includes("--state-directory") && !option("--state-directory")) throw new Error("--state-directory requires a path");
|
|
41
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
42
|
+
outputPath = path.join(fs.realpathSync.native(path.dirname(outputPath)), path.basename(outputPath));
|
|
36
43
|
|
|
37
|
-
const
|
|
44
|
+
const durable = Boolean(option("--state-directory"));
|
|
45
|
+
const temporaryRoot = durable
|
|
46
|
+
? checkpointDirectory(path.dirname(path.resolve(option("--state-directory"))), path.basename(path.resolve(option("--state-directory"))))
|
|
47
|
+
: fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), "piagent-long-horizon-")));
|
|
48
|
+
const releaseCoordinator = acquireBenchmarkRunLock(temporaryRoot, "long-horizon-coordinator");
|
|
49
|
+
const workerRoot = path.join(temporaryRoot, "project/.pi/piagent-state/long-horizon");
|
|
50
|
+
if (fs.existsSync(workerRoot)) {
|
|
51
|
+
const release = acquireBenchmarkRunLock(workerRoot, "long-horizon-worker-preflight"); release();
|
|
52
|
+
}
|
|
53
|
+
const coordinatorPath = path.join(temporaryRoot, "coordinator.json");
|
|
54
|
+
const sourceDigest = collectBenchmarkCandidate(repositoryRoot).provenance.contentDigest;
|
|
55
|
+
const coordinatorBinding = checkpointDigest({ sourceDigest, node: process.version, platform: process.platform,
|
|
56
|
+
arch: process.arch, lane, calibrationFast, tickMilliseconds, s0Binding: option("--binding") ?? null });
|
|
57
|
+
let coordinator = readCheckpoint(coordinatorPath, coordinatorBinding);
|
|
58
|
+
if (!coordinator) {
|
|
59
|
+
if (fs.readdirSync(temporaryRoot).some((name) => name !== ".benchmark-run.lock")) throw new Error("unbound long-horizon state directory is not empty");
|
|
60
|
+
coordinator = { phase: "initializing", startedAt: new Date().toISOString(), observations: {} };
|
|
61
|
+
writeCheckpoint(coordinatorPath, coordinatorBinding, coordinator);
|
|
62
|
+
}
|
|
63
|
+
function checkpointCoordinator(patch) {
|
|
64
|
+
coordinator = { ...coordinator, ...patch };
|
|
65
|
+
writeCheckpoint(coordinatorPath, coordinatorBinding, coordinator);
|
|
66
|
+
}
|
|
67
|
+
if (coordinator.phase === "complete") {
|
|
68
|
+
writeCheckpointBytes(outputPath, `${JSON.stringify(coordinator.report, null, 2)}\n`);
|
|
69
|
+
releaseCoordinator();
|
|
70
|
+
process.stdout.write(`${JSON.stringify(coordinator.report)}\n`);
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
38
73
|
const workspace = path.join(temporaryRoot, "project");
|
|
39
|
-
const
|
|
40
|
-
const
|
|
74
|
+
const startedAt = coordinator.startedAt;
|
|
75
|
+
const startedAtMs = Date.parse(startedAt);
|
|
41
76
|
const fixture = path.resolve(laneRoot, lane.fixture);
|
|
77
|
+
if (coordinator.phase === "initializing") {
|
|
42
78
|
fs.cpSync(fixture, workspace, { recursive: true });
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
spawnSync("git",
|
|
47
|
-
|
|
79
|
+
for (const args of [["init", "-q", workspace], ["-C", workspace, "config", "user.email", "long-horizon@example.invalid"],
|
|
80
|
+
["-C", workspace, "config", "user.name", "Piagent Long Horizon"], ["-C", workspace, "add", "."],
|
|
81
|
+
["-C", workspace, "commit", "--allow-empty", "-qm", "fixture"]]) {
|
|
82
|
+
assert.equal(spawnSync("git", args, { stdio: "inherit" }).status, 0, "fixture Git initialization failed");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
48
85
|
|
|
49
86
|
const taskId = "long-horizon-90";
|
|
50
87
|
const taskRunId = "long-horizon-90-run-1";
|
|
@@ -53,8 +90,10 @@ const sessionName = "LONG-HORIZON-90 repository audit";
|
|
|
53
90
|
const createdAt = startedAt;
|
|
54
91
|
const portableVerifier = path.join(workspace, ".pi", "piagent-state", "long-horizon", "verify.mjs");
|
|
55
92
|
fs.mkdirSync(path.dirname(portableVerifier), { recursive: true, mode: 0o700 });
|
|
56
|
-
|
|
57
|
-
fs.
|
|
93
|
+
if (coordinator.phase === "initializing") {
|
|
94
|
+
fs.copyFileSync(path.join(laneRoot, "verify.mjs"), portableVerifier);
|
|
95
|
+
fs.chmodSync(portableVerifier, 0o600);
|
|
96
|
+
}
|
|
58
97
|
let task = {
|
|
59
98
|
schemaVersion: 2,
|
|
60
99
|
taskRunId,
|
|
@@ -106,10 +145,16 @@ let task = {
|
|
|
106
145
|
createdAt,
|
|
107
146
|
updatedAt: createdAt
|
|
108
147
|
};
|
|
109
|
-
|
|
110
|
-
task =
|
|
111
|
-
|
|
112
|
-
|
|
148
|
+
if (coordinator.phase === "initializing") {
|
|
149
|
+
task.authoritySnapshot = createBoundTaskAuthority({ taskId, taskRunId, createdAt });
|
|
150
|
+
task = writeTaskContract(workspace, task);
|
|
151
|
+
bindSessionTask(workspace, sessionId, sessionName, task);
|
|
152
|
+
recordTaskStartCheckpoint({ cwd: workspace, ui: { notify() {} } }, task, "discovery", "automatic");
|
|
153
|
+
checkpointCoordinator({ phase: "crash" });
|
|
154
|
+
} else {
|
|
155
|
+
task = activeSessionTask(workspace, sessionId);
|
|
156
|
+
assert.equal(task?.taskRunId, taskRunId, "durable task binding changed");
|
|
157
|
+
}
|
|
113
158
|
|
|
114
159
|
const runtimeBase = {
|
|
115
160
|
laneId: lane.id,
|
|
@@ -119,7 +164,8 @@ const runtimeBase = {
|
|
|
119
164
|
totalUnits,
|
|
120
165
|
logicalDurationMinutes: lane.logicalDurationMinutes,
|
|
121
166
|
compactionUnits,
|
|
122
|
-
tickMilliseconds
|
|
167
|
+
tickMilliseconds,
|
|
168
|
+
coordinatorBinding
|
|
123
169
|
};
|
|
124
170
|
const workerPath = path.join(laneRoot, "worker.mjs");
|
|
125
171
|
const statePath = path.join(workspace, ".pi", "piagent-state", "long-horizon", "state.json");
|
|
@@ -129,23 +175,17 @@ function state() {
|
|
|
129
175
|
catch (error) { if (error?.code === "ENOENT") return { currentUnit: 0 }; throw error; }
|
|
130
176
|
}
|
|
131
177
|
|
|
132
|
-
function startWorker(stopAfterUnit) {
|
|
133
|
-
const runtime = Buffer.from(JSON.stringify({ ...runtimeBase, stopAfterUnit })).toString("base64url");
|
|
134
|
-
const child = spawn(process.execPath, [workerPath, workspace, runtime], { stdio: ["ignore", "pipe", "pipe"] });
|
|
178
|
+
function startWorker(stopAfterUnit, crashBoundary) {
|
|
179
|
+
const runtime = Buffer.from(JSON.stringify({ ...runtimeBase, stopAfterUnit, crashBoundary })).toString("base64url");
|
|
180
|
+
const child = spawn(process.execPath, [workerPath, workspace, runtime], { stdio: ["ignore", "pipe", "pipe", "ipc"] });
|
|
135
181
|
let stdout = "", stderr = "";
|
|
136
182
|
child.stdout.on("data", (chunk) => { stdout += chunk; });
|
|
137
183
|
child.stderr.on("data", (chunk) => { stderr += chunk; });
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const deadline = Date.now() + Math.max(30_000, tickMilliseconds * (remaining + 2));
|
|
144
|
-
while (Date.now() < deadline) {
|
|
145
|
-
if (state().currentUnit >= unit) return;
|
|
146
|
-
await new Promise((resolve) => setTimeout(resolve, Math.min(100, Math.max(5, tickMilliseconds / 20))));
|
|
147
|
-
}
|
|
148
|
-
throw new Error(`timed out waiting for long-horizon unit ${unit}`);
|
|
184
|
+
const result = new Promise((resolve, reject) => {
|
|
185
|
+
child.once("error", reject);
|
|
186
|
+
child.once("exit", (code, signal) => resolve({ code, signal, stdout, stderr }));
|
|
187
|
+
});
|
|
188
|
+
return { child, result };
|
|
149
189
|
}
|
|
150
190
|
|
|
151
191
|
function updatePendingTask(completed, active) {
|
|
@@ -182,15 +222,25 @@ function persistHandoff(reason) {
|
|
|
182
222
|
return readHandoffProjection(workspace, taskRunId);
|
|
183
223
|
}
|
|
184
224
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
first.child.
|
|
188
|
-
const
|
|
189
|
-
assert.
|
|
190
|
-
|
|
225
|
+
if (coordinator.phase === "crash") {
|
|
226
|
+
const first = startWorker(undefined, crashAfterUnit);
|
|
227
|
+
const atBoundary = new Promise((resolve) => first.child.once("message", resolve));
|
|
228
|
+
const observed = await Promise.race([atBoundary, first.result.then((result) => { throw new Error(`worker stopped before crash boundary: ${result.stderr}`); })]);
|
|
229
|
+
assert.deepEqual(observed, { type: "crash-boundary", unit: crashAfterUnit });
|
|
230
|
+
first.child.kill("SIGKILL");
|
|
231
|
+
const firstResult = await first.result;
|
|
232
|
+
assert.equal(firstResult.signal, "SIGKILL", firstResult.stderr);
|
|
233
|
+
assert.equal(state().currentUnit, crashAfterUnit);
|
|
234
|
+
checkpointCoordinator({ phase: "crash-recovery", observations: { hardCrash: { signal: firstResult.signal, unit: crashAfterUnit } } });
|
|
235
|
+
}
|
|
236
|
+
let firstContinuation = coordinator.observations.firstContinuation;
|
|
237
|
+
let secondContinuation = coordinator.observations.secondContinuation;
|
|
238
|
+
let crashHandoff = coordinator.observations.crashHandoff;
|
|
239
|
+
let plannedHandoff = coordinator.observations.plannedHandoff;
|
|
240
|
+
if (coordinator.phase === "crash-recovery") {
|
|
191
241
|
updatePendingTask("discovery", "validation");
|
|
192
242
|
const crashDigest = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
|
|
193
|
-
const
|
|
243
|
+
const reservation = reserveTaskContinuation(workspace, task, {
|
|
194
244
|
capabilityId: "CAP-12",
|
|
195
245
|
classification: "infrastructure-retry",
|
|
196
246
|
action: "retry",
|
|
@@ -198,8 +248,12 @@ const firstContinuation = reserveTaskContinuation(workspace, task, {
|
|
|
198
248
|
reasonCodes: ["process-killed"],
|
|
199
249
|
recordedAt: new Date().toISOString()
|
|
200
250
|
});
|
|
201
|
-
assert.
|
|
202
|
-
|
|
251
|
+
assert.ok(reservation.allowed || reservation.reason === "repeated-progress-signature");
|
|
252
|
+
// Re-reading the same consumed reservation does not authorize another turn.
|
|
253
|
+
// The original allow observation is reconstructed only from that exact journal
|
|
254
|
+
// signature, never from an exhausted-but-unrelated budget.
|
|
255
|
+
firstContinuation = { ...reservation, allowed: true };
|
|
256
|
+
secondContinuation = reserveTaskContinuation(workspace, task, {
|
|
203
257
|
capabilityId: "CAP-12",
|
|
204
258
|
classification: "infrastructure-retry",
|
|
205
259
|
action: "retry",
|
|
@@ -209,23 +263,32 @@ const secondContinuation = reserveTaskContinuation(workspace, task, {
|
|
|
209
263
|
});
|
|
210
264
|
assert.equal(secondContinuation.allowed, false);
|
|
211
265
|
assert.equal(secondContinuation.reason, "global-budget-exhausted");
|
|
212
|
-
|
|
266
|
+
crashHandoff = persistHandoff("hard process death at a durable checkpoint");
|
|
213
267
|
assert.equal(crashHandoff?.identity.taskRunId, taskRunId);
|
|
214
268
|
const crashResume = inspectTaskResumeState(workspace, task, sessionId);
|
|
215
269
|
assert.equal(crashResume.enforcementSafe, true, crashResume.reason);
|
|
270
|
+
checkpointCoordinator({ phase: "handoff", observations: { ...coordinator.observations, firstContinuation, secondContinuation, crashHandoff } });
|
|
271
|
+
}
|
|
216
272
|
|
|
273
|
+
if (coordinator.phase === "handoff") {
|
|
217
274
|
const second = startWorker(handoffAfterUnit);
|
|
218
275
|
const secondResult = await second.result;
|
|
219
276
|
assert.equal(secondResult.code, 75, secondResult.stderr);
|
|
220
277
|
assert.equal(state().currentUnit, handoffAfterUnit);
|
|
221
278
|
updatePendingTask("validation", "synthesis");
|
|
222
|
-
|
|
279
|
+
plannedHandoff = persistHandoff("planned process handoff after validation stage");
|
|
223
280
|
assert.equal(plannedHandoff?.identity.taskRunId, taskRunId);
|
|
281
|
+
checkpointCoordinator({ phase: "finish", observations: { ...coordinator.observations, plannedHandoff } });
|
|
282
|
+
}
|
|
224
283
|
|
|
284
|
+
if (coordinator.phase === "finish") {
|
|
225
285
|
const third = startWorker(undefined);
|
|
226
286
|
const thirdResult = await third.result;
|
|
227
287
|
assert.equal(thirdResult.code, 0, thirdResult.stderr);
|
|
228
288
|
assert.equal(state().currentUnit, totalUnits);
|
|
289
|
+
checkpointCoordinator({ phase: "verify", completedAt: new Date().toISOString() });
|
|
290
|
+
}
|
|
291
|
+
assert.equal(coordinator.phase, "verify", "unknown coordinator phase");
|
|
229
292
|
const beforeVerify = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
|
|
230
293
|
const verifier = spawnSync(process.execPath, [portableVerifier, workspace, String(totalUnits)], { encoding: "utf8" });
|
|
231
294
|
assert.equal(verifier.status, 0, verifier.stderr);
|
|
@@ -233,7 +296,7 @@ const afterVerify = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
|
|
|
233
296
|
assert.equal(afterVerify, beforeVerify);
|
|
234
297
|
const finalSnapshot = workingTreeSnapshot(workspace);
|
|
235
298
|
const finalFiles = Object.keys(finalSnapshot).sort();
|
|
236
|
-
const completedAt =
|
|
299
|
+
const completedAt = coordinator.completedAt;
|
|
237
300
|
task = writeTaskContract(workspace, {
|
|
238
301
|
...task,
|
|
239
302
|
workPlan: task.workPlan.map((step) => ({ ...step, status: "done" })),
|
|
@@ -270,11 +333,12 @@ const peakDurableStateBytes = Math.max(finalState.peakDurableStateBytes, finalDu
|
|
|
270
333
|
const peakContextSample = stateSamples.reduce((peak, sample) => sample.contextProxyTokens > peak.contextProxyTokens ? sample : peak, stateSamples[0]);
|
|
271
334
|
const endedAtMs = Date.now();
|
|
272
335
|
const wallClockMilliseconds = endedAtMs - startedAtMs;
|
|
273
|
-
const completedFromResume = finalState.processStarts
|
|
336
|
+
const completedFromResume = finalState.processStarts >= 3
|
|
274
337
|
&& finalState.resumedUnits.includes(crashAfterUnit)
|
|
275
338
|
&& finalState.resumedUnits.includes(handoffAfterUnit)
|
|
276
|
-
&& terminalResume.decision === "terminal"
|
|
277
|
-
|
|
339
|
+
&& terminalResume.decision === "terminal"
|
|
340
|
+
&& coordinator.observations.hardCrash.signal === "SIGKILL";
|
|
341
|
+
const wallClockQualified = finalState.activeMilliseconds >= lane.minimumWallClockMinutes * 60_000;
|
|
278
342
|
const report = {
|
|
279
343
|
schemaVersion: 1,
|
|
280
344
|
laneId: lane.id,
|
|
@@ -284,6 +348,7 @@ const report = {
|
|
|
284
348
|
completedAt,
|
|
285
349
|
logicalDurationMinutes: lane.logicalDurationMinutes,
|
|
286
350
|
wallClockMilliseconds,
|
|
351
|
+
activeMilliseconds: finalState.activeMilliseconds,
|
|
287
352
|
wallClockMinutes: Number((wallClockMilliseconds / 60_000).toFixed(4)),
|
|
288
353
|
minimumWallClockMinutes: lane.minimumWallClockMinutes,
|
|
289
354
|
wallClockQualified,
|
|
@@ -350,6 +415,9 @@ assert.equal(report.continuation.maximum, 1);
|
|
|
350
415
|
assert.equal(report.verification.stableCurrentTree, true);
|
|
351
416
|
if (!calibrationFast) assert.equal(report.wallClockQualified, true, `wall clock ${report.wallClockMinutes}m is below ${lane.minimumWallClockMinutes}m`);
|
|
352
417
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
353
|
-
|
|
354
|
-
|
|
418
|
+
assert.equal(collectBenchmarkCandidate(repositoryRoot).provenance.contentDigest, sourceDigest, "candidate changed during long-horizon execution");
|
|
419
|
+
checkpointCoordinator({ phase: "complete", report });
|
|
420
|
+
writeCheckpointBytes(outputPath, `${JSON.stringify(report, null, 2)}\n`);
|
|
421
|
+
releaseCoordinator();
|
|
422
|
+
if (!durable) fs.rmSync(temporaryRoot, { recursive: true, force: true });
|
|
355
423
|
process.stdout.write(`${JSON.stringify(report)}\n`);
|
|
@@ -2,9 +2,11 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
5
|
-
import { appendContextTelemetry, estimateContextTokens } from "../../packages/piagent-core/extensions/context-engine.js";
|
|
5
|
+
import { appendContextTelemetry, contextEnginePaths, estimateContextTokens } from "../../packages/piagent-core/extensions/context-engine.js";
|
|
6
|
+
import { checkpointDigest, readCheckpoint, writeCheckpoint, writeCheckpointBytes } from "../../packages/piagent-core/benchmark/benchmark-checkpoint.js";
|
|
7
|
+
import { acquireBenchmarkRunLock } from "../../packages/piagent-core/benchmark/benchmark-run-lock.js";
|
|
6
8
|
import { ensurePrivateStateDirectory, resolveLocalStatePath } from "../../packages/piagent-core/extensions/local-state-path.js";
|
|
7
|
-
import {
|
|
9
|
+
import { appendTaskJournalEventAtMost } from "../../packages/piagent-core/extensions/task-journal.js";
|
|
8
10
|
import { workingTreeSnapshot } from "../../packages/piagent-core/extensions/task-state.js";
|
|
9
11
|
import { workingTreeEvidenceDigest } from "../../packages/piagent-core/extensions/working-tree-digest.js";
|
|
10
12
|
|
|
@@ -13,6 +15,10 @@ if (!workspaceArgument || !runtimeArgument) throw new Error("worker requires wor
|
|
|
13
15
|
const workspace = path.resolve(workspaceArgument);
|
|
14
16
|
const runtime = JSON.parse(Buffer.from(runtimeArgument, "base64url").toString("utf8"));
|
|
15
17
|
const privateRoot = ensurePrivateStateDirectory(workspace, path.join(workspace, ".pi", "piagent-state", "long-horizon"), "Long-horizon state");
|
|
18
|
+
const releaseWorker = acquireBenchmarkRunLock(privateRoot, runtime.taskRunId);
|
|
19
|
+
// An orphan must stop before another coordinator starts it. IPC disconnect is
|
|
20
|
+
// an observed loss of the parent, not a timeout-based guess about its liveness.
|
|
21
|
+
if (process.connected) process.once("disconnect", () => process.exit(76));
|
|
16
22
|
const statePath = resolveLocalStatePath(workspace, path.join(privateRoot, "state.json"), { label: "Long-horizon state" });
|
|
17
23
|
const workingSetPath = resolveLocalStatePath(workspace, path.join(privateRoot, "working-set.json"), { label: "Long-horizon working set" });
|
|
18
24
|
const telemetryPath = resolveLocalStatePath(workspace, path.join(privateRoot, "telemetry.jsonl"), { label: "Long-horizon telemetry" });
|
|
@@ -28,7 +34,7 @@ function processAlive(pid) {
|
|
|
28
34
|
|
|
29
35
|
function removeDeadWriterTemps(directory) {
|
|
30
36
|
for (const name of fs.readdirSync(directory)) {
|
|
31
|
-
const match = name.match(/\.(\d+)
|
|
37
|
+
const match = name.match(/\.(\d+)(?:\.[a-f0-9-]{36})?\.tmp$/);
|
|
32
38
|
if (!match || processAlive(Number.parseInt(match[1], 10))) continue;
|
|
33
39
|
const target = path.join(directory, name);
|
|
34
40
|
try { if (fs.lstatSync(target).isFile()) fs.rmSync(target); } catch (error) { if (error?.code !== "ENOENT") throw error; }
|
|
@@ -44,10 +50,7 @@ function readJson(file, fallback) {
|
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
function writeAtomic(file, value, mode = 0o600) {
|
|
47
|
-
|
|
48
|
-
fs.writeFileSync(temporary, `${JSON.stringify(value)}\n`, { mode });
|
|
49
|
-
fs.renameSync(temporary, file);
|
|
50
|
-
fs.chmodSync(file, mode);
|
|
53
|
+
writeCheckpointBytes(file, `${JSON.stringify(value)}\n`, mode);
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
function projectSources() {
|
|
@@ -77,18 +80,17 @@ function treeBytes(root) {
|
|
|
77
80
|
return bytes;
|
|
78
81
|
}
|
|
79
82
|
|
|
80
|
-
function appendTelemetry(value) {
|
|
81
|
-
fs.appendFileSync(telemetryPath, `${JSON.stringify(value)}\n`, { mode: 0o600 });
|
|
82
|
-
fs.chmodSync(telemetryPath, 0o600);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
83
|
function sleep(milliseconds) {
|
|
86
84
|
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
87
85
|
}
|
|
88
86
|
|
|
89
87
|
const sources = projectSources();
|
|
90
88
|
if (sources.length < runtime.totalUnits) throw new Error(`fixture has only ${sources.length} source files for ${runtime.totalUnits} units`);
|
|
91
|
-
|
|
89
|
+
const { stopAfterUnit, crashBoundary, ...stableRuntime } = runtime;
|
|
90
|
+
const binding = { runtime: stableRuntime, sources: sources.map((file) => [file, crypto.createHash("sha256").update(fs.readFileSync(path.join(workspace, file))).digest("hex")]) };
|
|
91
|
+
const checkpointPath = path.join(privateRoot, "checkpoint.json");
|
|
92
|
+
const checkpoint = readCheckpoint(checkpointPath, checkpointDigest(binding));
|
|
93
|
+
let state = checkpoint?.state ?? readJson(statePath, {
|
|
92
94
|
schemaVersion: 1,
|
|
93
95
|
laneId: runtime.laneId,
|
|
94
96
|
taskId: runtime.taskId,
|
|
@@ -98,14 +100,65 @@ let state = readJson(statePath, {
|
|
|
98
100
|
compactions: 0,
|
|
99
101
|
peakContextProxyTokens: 0,
|
|
100
102
|
peakDurableStateBytes: 0,
|
|
103
|
+
activeMilliseconds: 0,
|
|
101
104
|
resumedUnits: []
|
|
102
105
|
});
|
|
103
106
|
if (state.laneId !== runtime.laneId || state.taskId !== runtime.taskId || state.taskRunId !== runtime.taskRunId) throw new Error("long-horizon state identity mismatch");
|
|
107
|
+
if (!checkpoint && state.currentUnit !== 0) throw new Error("legacy long-horizon progress has no atomic checkpoint");
|
|
108
|
+
let workingSet = checkpoint?.workingSet ?? [];
|
|
109
|
+
const telemetry = checkpoint?.telemetry ?? [];
|
|
110
|
+
const contextEvents = checkpoint?.contextEvents ?? [];
|
|
111
|
+
if (telemetry.length !== state.currentUnit || telemetry.some((entry, index) => entry.unit !== index + 1)) throw new Error("invalid long-horizon checkpoint sequence");
|
|
112
|
+
for (let unit = 1; unit <= state.currentUnit; unit += 1) {
|
|
113
|
+
const actual = readJson(path.join(unitRoot, `${String(unit).padStart(3, "0")}.json`));
|
|
114
|
+
const [sourcePath, sourceDigest] = binding.sources[unit - 1];
|
|
115
|
+
if (actual?.unit !== unit || actual.sourcePath !== sourcePath || actual.sourceDigest !== sourceDigest) throw new Error("completed long-horizon artifact changed");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function projectCheckpoint() {
|
|
119
|
+
writeAtomic(statePath, state);
|
|
120
|
+
writeAtomic(workingSetPath, workingSet);
|
|
121
|
+
writeCheckpointBytes(telemetryPath, telemetry.map((entry) => `${JSON.stringify(entry)}\n`).join(""));
|
|
122
|
+
const contextPath = resolveLocalStatePath(workspace, contextEnginePaths(workspace).telemetry);
|
|
123
|
+
ensurePrivateStateDirectory(workspace, path.dirname(contextPath));
|
|
124
|
+
// These events belong only to this owned provider-free fixture. The atomic
|
|
125
|
+
// checkpoint is authoritative; partial/uncommitted projections are rebuilt.
|
|
126
|
+
writeCheckpointBytes(contextPath, contextEvents.map((entry) => `${JSON.stringify(entry)}\n`).join(""));
|
|
127
|
+
// Replay the committed prefix to repair a checkpoint-before-projection crash,
|
|
128
|
+
// but never append the same unit again. The raw append API does not dedupe.
|
|
129
|
+
for (const entry of telemetry) {
|
|
130
|
+
const data = { unit: entry.unit, logicalMinute: entry.unit, sourceDigest: binding.sources[entry.unit - 1][1], currentWorkingTreeDigest: entry.currentWorkingTreeDigest };
|
|
131
|
+
const { record } = appendTaskJournalEventAtMost(workspace, {
|
|
132
|
+
eventType: "long-horizon-progress", taskId: runtime.taskId, taskRunId: runtime.taskRunId,
|
|
133
|
+
sessionId: runtime.sessionId, idempotencyKey: `long-horizon:${entry.unit}`, data
|
|
134
|
+
}, { maximum: runtime.totalUnits, recordedAt: entry.recordedAt });
|
|
135
|
+
// A conflicting key or exhausted budget must not silently erase evidence.
|
|
136
|
+
if (!record || record.taskId !== runtime.taskId || record.sessionId !== runtime.sessionId
|
|
137
|
+
|| record.recordedAt !== entry.recordedAt || JSON.stringify(record.data) !== JSON.stringify(data)) {
|
|
138
|
+
throw new Error(`long-horizon journal projection mismatch at unit ${entry.unit}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function commitCheckpoint() {
|
|
144
|
+
writeCheckpoint(checkpointPath, checkpointDigest(binding), { state, workingSet, telemetry, contextEvents });
|
|
145
|
+
projectCheckpoint();
|
|
146
|
+
}
|
|
147
|
+
|
|
104
148
|
const startingUnit = state.currentUnit;
|
|
105
149
|
state.processStarts += 1;
|
|
106
150
|
if (startingUnit > 0) state.resumedUnits.push(startingUnit);
|
|
107
|
-
|
|
108
|
-
|
|
151
|
+
commitCheckpoint();
|
|
152
|
+
|
|
153
|
+
async function boundary(unit) {
|
|
154
|
+
if (unit === crashBoundary) {
|
|
155
|
+
process.send?.({ type: "crash-boundary", unit });
|
|
156
|
+
await new Promise(() => { setInterval(() => {}, 1_000); });
|
|
157
|
+
}
|
|
158
|
+
if (unit === stopAfterUnit && unit < runtime.totalUnits) process.exit(75);
|
|
159
|
+
}
|
|
160
|
+
await boundary(startingUnit);
|
|
161
|
+
let activeSince = performance.now();
|
|
109
162
|
|
|
110
163
|
for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
|
|
111
164
|
const sourcePath = sources[(unit - 1) % sources.length];
|
|
@@ -119,19 +172,10 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
|
|
|
119
172
|
if (runtime.compactionUnits.includes(unit)) {
|
|
120
173
|
workingSet = [{ unit, compactedThrough: unit, retainedDigest: crypto.createHash("sha256").update(JSON.stringify(workingSet)).digest("hex") }];
|
|
121
174
|
state.compactions += 1;
|
|
122
|
-
appendContextTelemetry(workspace, { event: "session_compact", taskRunId: runtime.taskRunId, unit, reason: "long-horizon-boundary", fromExtension: true });
|
|
175
|
+
contextEvents.push(appendContextTelemetry(workspace, { event: "session_compact", taskRunId: runtime.taskRunId, unit, reason: "long-horizon-boundary", fromExtension: true }));
|
|
123
176
|
}
|
|
124
|
-
writeAtomic(workingSetPath, workingSet);
|
|
125
177
|
const currentWorkingTreeDigest = workingTreeEvidenceDigest(workingTreeSnapshot(workspace));
|
|
126
|
-
|
|
127
|
-
eventType: "long-horizon-progress",
|
|
128
|
-
taskId: runtime.taskId,
|
|
129
|
-
taskRunId: runtime.taskRunId,
|
|
130
|
-
sessionId: runtime.sessionId,
|
|
131
|
-
idempotencyKey: `long-horizon:${unit}`,
|
|
132
|
-
data: { unit, logicalMinute: unit, sourceDigest, currentWorkingTreeDigest }
|
|
133
|
-
}, { recordedAt: new Date().toISOString() });
|
|
134
|
-
appendContextTelemetry(workspace, {
|
|
178
|
+
contextEvents.push(appendContextTelemetry(workspace, {
|
|
135
179
|
event: "agent_prompt",
|
|
136
180
|
taskRunId: runtime.taskRunId,
|
|
137
181
|
unit,
|
|
@@ -140,13 +184,14 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
|
|
|
140
184
|
toolSchemaTokens: 872,
|
|
141
185
|
contextProxyTokens: beforeCompactionTokens,
|
|
142
186
|
source: "deterministic-provider-free-proxy"
|
|
143
|
-
});
|
|
187
|
+
}));
|
|
144
188
|
const durableStateBytes = treeBytes(path.join(workspace, ".pi", "piagent-state"));
|
|
145
189
|
state.currentUnit = unit;
|
|
146
190
|
state.peakDurableStateBytes = Math.max(state.peakDurableStateBytes, durableStateBytes);
|
|
147
191
|
state.lastWorkingTreeDigest = currentWorkingTreeDigest;
|
|
148
192
|
state.updatedAt = new Date().toISOString();
|
|
149
|
-
|
|
193
|
+
state.activeMilliseconds += performance.now() - activeSince;
|
|
194
|
+
telemetry.push({
|
|
150
195
|
schemaVersion: 1,
|
|
151
196
|
recordedAt: state.updatedAt,
|
|
152
197
|
processId: process.pid,
|
|
@@ -158,8 +203,9 @@ for (let unit = startingUnit + 1; unit <= runtime.totalUnits; unit += 1) {
|
|
|
158
203
|
compactions: state.compactions,
|
|
159
204
|
currentWorkingTreeDigest
|
|
160
205
|
});
|
|
161
|
-
|
|
162
|
-
|
|
206
|
+
commitCheckpoint();
|
|
207
|
+
activeSince = performance.now();
|
|
208
|
+
await boundary(unit);
|
|
163
209
|
if (unit < runtime.totalUnits) await sleep(runtime.tickMilliseconds);
|
|
164
210
|
}
|
|
165
211
|
|
|
@@ -174,4 +220,5 @@ writeAtomic(path.join(artifactRoot, "report.json"), {
|
|
|
174
220
|
logicalDurationMinutes: runtime.logicalDurationMinutes,
|
|
175
221
|
aggregateDigest: aggregate.digest("hex")
|
|
176
222
|
}, 0o644);
|
|
223
|
+
releaseWorker();
|
|
177
224
|
process.exit(0);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Current public exposure boundary
|
|
2
|
+
|
|
3
|
+
Use `public-exposure.v2.json` for a new custody review. The v1 file and
|
|
4
|
+
`CUSTODIAN_RUNBOOK.md` are retained historical inputs, not a complete current
|
|
5
|
+
exposure inventory. All role separation, private-data restrictions, reference
|
|
6
|
+
and mutation checks, blinded review and independent attestation requirements
|
|
7
|
+
in that runbook remain mandatory. Its step 1 must now bind the v2 exposure file.
|
|
8
|
+
|
|
9
|
+
The earlier file omitted the public `deep-logic-v1` and `production-v2` suites.
|
|
10
|
+
V2 now includes all seven current public suites (93 scenarios), including
|
|
11
|
+
`production-v3`, all 13 contract-family versions and nine public development
|
|
12
|
+
trees, including test programs and author-written calibration examples. The
|
|
13
|
+
predecessor digest preserves prior exposure. These counts are inventory counts,
|
|
14
|
+
not executed or passing sessions.
|
|
15
|
+
|
|
16
|
+
Before custody review, check the complete public source tree, including its
|
|
17
|
+
development tests. The runtime npm package intentionally omits those tests and
|
|
18
|
+
cannot establish inventory freshness alone; use the exact frozen source bundle
|
|
19
|
+
or checkout, without substituting a current checkout for a different candidate:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
node scripts/public-evaluation-exposure.mjs --check
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The maintainer may regenerate the inventory with `--write` after public source
|
|
26
|
+
changes. Generation grants no authority: a changed digest requires a new
|
|
27
|
+
independent lineage comparison and custody receipt. Do not edit an existing
|
|
28
|
+
custody receipt to substitute the new digest. The current readiness CLI and
|
|
29
|
+
FS4 evaluator refuse stale or incomplete inventories. Old v1-bound receipts
|
|
30
|
+
remain historical metadata, not current readiness.
|
|
31
|
+
|
|
32
|
+
Tree digests cover pairs of repository-relative filename and file SHA-256.
|
|
33
|
+
Flatten every regular file in the tree first, using slash-separated relative
|
|
34
|
+
paths. Globally sort those paths by UTF-16 code units (not locale or directory
|
|
35
|
+
traversal order), serialize the ordered pair array as compact JSON without a
|
|
36
|
+
trailing newline, then hash its UTF-8 bytes. Do not normalize filenames.
|
|
37
|
+
Changing a fixture without changing its suite manifest, adding a
|
|
38
|
+
public test or altering a contract library invalidates the inventory. Symlinked
|
|
39
|
+
and oversized inputs are refused. These are local filesystem checks, not a
|
|
40
|
+
security sandbox against another actor with the same OS privileges; freeze
|
|
41
|
+
and independently verify the exact candidate artifact in the controlled
|
|
42
|
+
environment before and after private execution.
|
|
43
|
+
|
|
44
|
+
The inventory is not a complete record of author knowledge. Independently
|
|
45
|
+
account for previous diagnostic replays, retained campaigns and any material
|
|
46
|
+
outside these public roots. Compare actual lineage and acceptance mechanisms,
|
|
47
|
+
not just names or hashes. Never bring private prompts, graders, repositories,
|
|
48
|
+
reviewer identities or raw scores into the author environment. Only the closed
|
|
49
|
+
assurance receipt and independent custody attestation may cross that boundary.
|
|
50
|
+
|
|
51
|
+
`ready: true` still grants no provider execution, generalization or release
|
|
52
|
+
claim. Independent custody and the remaining exact-candidate release gates
|
|
53
|
+
remain separate requirements.
|
|
@@ -4,14 +4,17 @@ This directory contains only the public, provider-free boundary for `CF-FS4-04`.
|
|
|
4
4
|
It does not contain a holdout suite, private repository, prompt, grader, oracle,
|
|
5
5
|
reference solution, reviewer identity, raw score sheet, or private locator.
|
|
6
6
|
|
|
7
|
-
The operational handoff
|
|
7
|
+
The current operational handoff starts with `CURRENT_BOUNDARY.md`, which
|
|
8
|
+
supersedes the old exposure-file binding without changing the retained v1
|
|
9
|
+
history. The remaining custody procedure is in `CUSTODIAN_RUNBOOK.md`. The readiness
|
|
8
10
|
CLI checks the closed receipt, while the independent FS4-05 auditor must verify
|
|
9
11
|
its custody origin outside this repository; authors cannot self-attest E3.
|
|
10
12
|
|
|
11
13
|
The external custodian must:
|
|
12
14
|
|
|
13
15
|
1. compare every private task-family lineage and repository lineage with
|
|
14
|
-
`public-exposure.
|
|
16
|
+
the current `public-exposure.v2.json`, its predecessor and the declared public
|
|
17
|
+
development trees inside the controlled environment;
|
|
15
18
|
2. keep candidate authors outside the custodian, reviewer, and adjudicator roles;
|
|
16
19
|
3. expose an execute-only interface to the benchmark operator after an exact RC
|
|
17
20
|
is frozen;
|