@allocator-one/rcl 4.4.19
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/LICENSE +21 -0
- package/README.md +1415 -0
- package/dist/ci.d.ts +16 -0
- package/dist/ci.js +42 -0
- package/dist/ci.js.map +1 -0
- package/dist/config/data-dir.d.ts +6 -0
- package/dist/config/data-dir.js +12 -0
- package/dist/config/data-dir.js.map +1 -0
- package/dist/config/defaults.d.ts +82 -0
- package/dist/config/defaults.js +89 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/harness.d.ts +40 -0
- package/dist/config/harness.js +151 -0
- package/dist/config/harness.js.map +1 -0
- package/dist/config/loader.d.ts +13 -0
- package/dist/config/loader.js +131 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/provider-concurrency.d.ts +4 -0
- package/dist/config/provider-concurrency.js +6 -0
- package/dist/config/provider-concurrency.js.map +1 -0
- package/dist/config/providers.d.ts +3 -0
- package/dist/config/providers.js +9 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/schema.d.ts +179 -0
- package/dist/config/schema.js +115 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/consensus/claim-contract.d.ts +9 -0
- package/dist/consensus/claim-contract.js +307 -0
- package/dist/consensus/claim-contract.js.map +1 -0
- package/dist/consensus/claim-identity.d.ts +5 -0
- package/dist/consensus/claim-identity.js +39 -0
- package/dist/consensus/claim-identity.js.map +1 -0
- package/dist/consensus/deduper.d.ts +43 -0
- package/dist/consensus/deduper.js +1052 -0
- package/dist/consensus/deduper.js.map +1 -0
- package/dist/consensus/finding-identity.d.ts +20 -0
- package/dist/consensus/finding-identity.js +49 -0
- package/dist/consensus/finding-identity.js.map +1 -0
- package/dist/consensus/gating.d.ts +215 -0
- package/dist/consensus/gating.js +699 -0
- package/dist/consensus/gating.js.map +1 -0
- package/dist/consensus/parser.d.ts +22 -0
- package/dist/consensus/parser.js +255 -0
- package/dist/consensus/parser.js.map +1 -0
- package/dist/consensus/semantic-deduper.d.ts +10 -0
- package/dist/consensus/semantic-deduper.js +70 -0
- package/dist/consensus/semantic-deduper.js.map +1 -0
- package/dist/consensus/types.d.ts +196 -0
- package/dist/consensus/types.js +2 -0
- package/dist/consensus/types.js.map +1 -0
- package/dist/consensus/verification-contract.d.ts +8 -0
- package/dist/consensus/verification-contract.js +95 -0
- package/dist/consensus/verification-contract.js.map +1 -0
- package/dist/consensus/voter.d.ts +29 -0
- package/dist/consensus/voter.js +394 -0
- package/dist/consensus/voter.js.map +1 -0
- package/dist/converge/attempt-budget.d.ts +88 -0
- package/dist/converge/attempt-budget.js +717 -0
- package/dist/converge/attempt-budget.js.map +1 -0
- package/dist/converge/bound-fix-recovery-source.d.ts +24 -0
- package/dist/converge/bound-fix-recovery-source.js +25 -0
- package/dist/converge/bound-fix-recovery-source.js.map +1 -0
- package/dist/converge/bound-fix-recovery.d.ts +15 -0
- package/dist/converge/bound-fix-recovery.js +65 -0
- package/dist/converge/bound-fix-recovery.js.map +1 -0
- package/dist/converge/correction-anchors.d.ts +1 -0
- package/dist/converge/correction-anchors.js +2 -0
- package/dist/converge/correction-anchors.js.map +1 -0
- package/dist/converge/cycle-remote.d.ts +6 -0
- package/dist/converge/cycle-remote.js +41 -0
- package/dist/converge/cycle-remote.js.map +1 -0
- package/dist/converge/delivery-reconciliation.d.ts +17 -0
- package/dist/converge/delivery-reconciliation.js +53 -0
- package/dist/converge/delivery-reconciliation.js.map +1 -0
- package/dist/converge/finding-identity.d.ts +6 -0
- package/dist/converge/finding-identity.js +7 -0
- package/dist/converge/finding-identity.js.map +1 -0
- package/dist/converge/fresh-review.d.ts +37 -0
- package/dist/converge/fresh-review.js +351 -0
- package/dist/converge/fresh-review.js.map +1 -0
- package/dist/converge/launch-guard.d.ts +55 -0
- package/dist/converge/launch-guard.js +363 -0
- package/dist/converge/launch-guard.js.map +1 -0
- package/dist/converge/launch-preflight.d.ts +5 -0
- package/dist/converge/launch-preflight.js +41 -0
- package/dist/converge/launch-preflight.js.map +1 -0
- package/dist/converge/launch-record.d.ts +136 -0
- package/dist/converge/launch-record.js +86 -0
- package/dist/converge/launch-record.js.map +1 -0
- package/dist/converge/legacy-launch-health.d.ts +311 -0
- package/dist/converge/legacy-launch-health.js +159 -0
- package/dist/converge/legacy-launch-health.js.map +1 -0
- package/dist/converge/legacy-roster.d.ts +29 -0
- package/dist/converge/legacy-roster.js +268 -0
- package/dist/converge/legacy-roster.js.map +1 -0
- package/dist/converge/native-lock.d.ts +18 -0
- package/dist/converge/native-lock.js +122 -0
- package/dist/converge/native-lock.js.map +1 -0
- package/dist/converge/ordinary-pending-export.d.ts +67 -0
- package/dist/converge/ordinary-pending-export.js +175 -0
- package/dist/converge/ordinary-pending-export.js.map +1 -0
- package/dist/converge/ordinary-pending-package.d.ts +28 -0
- package/dist/converge/ordinary-pending-package.js +36 -0
- package/dist/converge/ordinary-pending-package.js.map +1 -0
- package/dist/converge/pending-legacy-resume.d.ts +119 -0
- package/dist/converge/pending-legacy-resume.js +720 -0
- package/dist/converge/pending-legacy-resume.js.map +1 -0
- package/dist/converge/pending-recovery-source.d.ts +131 -0
- package/dist/converge/pending-recovery-source.js +71 -0
- package/dist/converge/pending-recovery-source.js.map +1 -0
- package/dist/converge/recovery-launch.d.ts +66 -0
- package/dist/converge/recovery-launch.js +518 -0
- package/dist/converge/recovery-launch.js.map +1 -0
- package/dist/converge/retained-report.d.ts +29 -0
- package/dist/converge/retained-report.js +218 -0
- package/dist/converge/retained-report.js.map +1 -0
- package/dist/converge/retry-source.d.ts +25 -0
- package/dist/converge/retry-source.js +13 -0
- package/dist/converge/retry-source.js.map +1 -0
- package/dist/converge/review-cycle.d.ts +49 -0
- package/dist/converge/review-cycle.js +26 -0
- package/dist/converge/review-cycle.js.map +1 -0
- package/dist/converge/round-gap-schema.d.ts +66 -0
- package/dist/converge/round-gap-schema.js +51 -0
- package/dist/converge/round-gap-schema.js.map +1 -0
- package/dist/converge/round-gap.d.ts +38 -0
- package/dist/converge/round-gap.js +334 -0
- package/dist/converge/round-gap.js.map +1 -0
- package/dist/converge/run-state.d.ts +224 -0
- package/dist/converge/run-state.js +564 -0
- package/dist/converge/run-state.js.map +1 -0
- package/dist/converge/stale-report-schema.d.ts +42 -0
- package/dist/converge/stale-report-schema.js +79 -0
- package/dist/converge/stale-report-schema.js.map +1 -0
- package/dist/converge/stale-report-storage.d.ts +47 -0
- package/dist/converge/stale-report-storage.js +172 -0
- package/dist/converge/stale-report-storage.js.map +1 -0
- package/dist/converge/stale-report.d.ts +14 -0
- package/dist/converge/stale-report.js +213 -0
- package/dist/converge/stale-report.js.map +1 -0
- package/dist/converge/target-ownership.d.ts +29 -0
- package/dist/converge/target-ownership.js +95 -0
- package/dist/converge/target-ownership.js.map +1 -0
- package/dist/converge/terminal-rejection-schema.d.ts +42 -0
- package/dist/converge/terminal-rejection-schema.js +39 -0
- package/dist/converge/terminal-rejection-schema.js.map +1 -0
- package/dist/converge/terminal-rejection.d.ts +13 -0
- package/dist/converge/terminal-rejection.js +275 -0
- package/dist/converge/terminal-rejection.js.map +1 -0
- package/dist/coordination/registry-lock.d.ts +82 -0
- package/dist/coordination/registry-lock.js +498 -0
- package/dist/coordination/registry-lock.js.map +1 -0
- package/dist/discuss.d.ts +53 -0
- package/dist/discuss.js +112 -0
- package/dist/discuss.js.map +1 -0
- package/dist/dispatch/adapter.d.ts +32 -0
- package/dist/dispatch/adapter.js +2 -0
- package/dist/dispatch/adapter.js.map +1 -0
- package/dist/dispatch/anthropic.d.ts +10 -0
- package/dist/dispatch/anthropic.js +235 -0
- package/dist/dispatch/anthropic.js.map +1 -0
- package/dist/dispatch/async-lane.d.ts +127 -0
- package/dist/dispatch/async-lane.js +414 -0
- package/dist/dispatch/async-lane.js.map +1 -0
- package/dist/dispatch/capture-council.d.ts +63 -0
- package/dist/dispatch/capture-council.js +137 -0
- package/dist/dispatch/capture-council.js.map +1 -0
- package/dist/dispatch/captured-async.d.ts +67 -0
- package/dist/dispatch/captured-async.js +40 -0
- package/dist/dispatch/captured-async.js.map +1 -0
- package/dist/dispatch/captured-inputs.d.ts +50 -0
- package/dist/dispatch/captured-inputs.js +190 -0
- package/dist/dispatch/captured-inputs.js.map +1 -0
- package/dist/dispatch/checkpoint-async-context.d.ts +27 -0
- package/dist/dispatch/checkpoint-async-context.js +51 -0
- package/dist/dispatch/checkpoint-async-context.js.map +1 -0
- package/dist/dispatch/checkpoint-async-execution.d.ts +22 -0
- package/dist/dispatch/checkpoint-async-execution.js +130 -0
- package/dist/dispatch/checkpoint-async-execution.js.map +1 -0
- package/dist/dispatch/checkpoint-async-store.d.ts +134 -0
- package/dist/dispatch/checkpoint-async-store.js +534 -0
- package/dist/dispatch/checkpoint-async-store.js.map +1 -0
- package/dist/dispatch/checkpoint-async-unknown.d.ts +19 -0
- package/dist/dispatch/checkpoint-async-unknown.js +46 -0
- package/dist/dispatch/checkpoint-async-unknown.js.map +1 -0
- package/dist/dispatch/checkpoint-async.d.ts +252 -0
- package/dist/dispatch/checkpoint-async.js +270 -0
- package/dist/dispatch/checkpoint-async.js.map +1 -0
- package/dist/dispatch/checkpoint-gating-execution.d.ts +26 -0
- package/dist/dispatch/checkpoint-gating-execution.js +84 -0
- package/dist/dispatch/checkpoint-gating-execution.js.map +1 -0
- package/dist/dispatch/checkpoint-phase-limits.d.ts +5 -0
- package/dist/dispatch/checkpoint-phase-limits.js +11 -0
- package/dist/dispatch/checkpoint-phase-limits.js.map +1 -0
- package/dist/dispatch/checkpoint-verification-context.d.ts +15 -0
- package/dist/dispatch/checkpoint-verification-context.js +48 -0
- package/dist/dispatch/checkpoint-verification-context.js.map +1 -0
- package/dist/dispatch/checkpoint-verification.d.ts +213 -0
- package/dist/dispatch/checkpoint-verification.js +381 -0
- package/dist/dispatch/checkpoint-verification.js.map +1 -0
- package/dist/dispatch/checkpoint.d.ts +329 -0
- package/dist/dispatch/checkpoint.js +1418 -0
- package/dist/dispatch/checkpoint.js.map +1 -0
- package/dist/dispatch/google.d.ts +10 -0
- package/dist/dispatch/google.js +158 -0
- package/dist/dispatch/google.js.map +1 -0
- package/dist/dispatch/late-audit.d.ts +23 -0
- package/dist/dispatch/late-audit.js +133 -0
- package/dist/dispatch/late-audit.js.map +1 -0
- package/dist/dispatch/merge.d.ts +29 -0
- package/dist/dispatch/merge.js +112 -0
- package/dist/dispatch/merge.js.map +1 -0
- package/dist/dispatch/openai-compat.d.ts +30 -0
- package/dist/dispatch/openai-compat.js +166 -0
- package/dist/dispatch/openai-compat.js.map +1 -0
- package/dist/dispatch/openai.d.ts +10 -0
- package/dist/dispatch/openai.js +159 -0
- package/dist/dispatch/openai.js.map +1 -0
- package/dist/dispatch/original-execution.d.ts +30 -0
- package/dist/dispatch/original-execution.js +91 -0
- package/dist/dispatch/original-execution.js.map +1 -0
- package/dist/dispatch/original-launch.d.ts +37 -0
- package/dist/dispatch/original-launch.js +117 -0
- package/dist/dispatch/original-launch.js.map +1 -0
- package/dist/dispatch/quorum.d.ts +15 -0
- package/dist/dispatch/quorum.js +33 -0
- package/dist/dispatch/quorum.js.map +1 -0
- package/dist/dispatch/recovery-operation.d.ts +44 -0
- package/dist/dispatch/recovery-operation.js +146 -0
- package/dist/dispatch/recovery-operation.js.map +1 -0
- package/dist/dispatch/recovery-policy.d.ts +54 -0
- package/dist/dispatch/recovery-policy.js +157 -0
- package/dist/dispatch/recovery-policy.js.map +1 -0
- package/dist/dispatch/recovery.d.ts +78 -0
- package/dist/dispatch/recovery.js +299 -0
- package/dist/dispatch/recovery.js.map +1 -0
- package/dist/dispatch/retained-async.d.ts +13 -0
- package/dist/dispatch/retained-async.js +101 -0
- package/dist/dispatch/retained-async.js.map +1 -0
- package/dist/dispatch/reviewer-identity.d.ts +10 -0
- package/dist/dispatch/reviewer-identity.js +19 -0
- package/dist/dispatch/reviewer-identity.js.map +1 -0
- package/dist/dispatch/runner.d.ts +76 -0
- package/dist/dispatch/runner.js +415 -0
- package/dist/dispatch/runner.js.map +1 -0
- package/dist/dispatch/utils.d.ts +159 -0
- package/dist/dispatch/utils.js +381 -0
- package/dist/dispatch/utils.js.map +1 -0
- package/dist/dispatch/verification-execution.d.ts +48 -0
- package/dist/dispatch/verification-execution.js +252 -0
- package/dist/dispatch/verification-execution.js.map +1 -0
- package/dist/dispatch/verification-late-audit.d.ts +17 -0
- package/dist/dispatch/verification-late-audit.js +117 -0
- package/dist/dispatch/verification-late-audit.js.map +1 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.d.ts +30 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.js +100 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.d.ts +46 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.js +120 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.js.map +1 -0
- package/dist/evidence/claim-recovery/carrier-inventory.d.ts +49 -0
- package/dist/evidence/claim-recovery/carrier-inventory.js +340 -0
- package/dist/evidence/claim-recovery/carrier-inventory.js.map +1 -0
- package/dist/evidence/claim-recovery/claim-index.d.ts +12 -0
- package/dist/evidence/claim-recovery/claim-index.js +56 -0
- package/dist/evidence/claim-recovery/claim-index.js.map +1 -0
- package/dist/evidence/claim-recovery/confirmation.d.ts +53 -0
- package/dist/evidence/claim-recovery/confirmation.js +151 -0
- package/dist/evidence/claim-recovery/confirmation.js.map +1 -0
- package/dist/evidence/claim-recovery/context.d.ts +15 -0
- package/dist/evidence/claim-recovery/context.js +40 -0
- package/dist/evidence/claim-recovery/context.js.map +1 -0
- package/dist/evidence/claim-recovery/proof-storage.d.ts +6 -0
- package/dist/evidence/claim-recovery/proof-storage.js +97 -0
- package/dist/evidence/claim-recovery/proof-storage.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/anchors.d.ts +20 -0
- package/dist/evidence/claim-recovery/validation/anchors.js +22 -0
- package/dist/evidence/claim-recovery/validation/anchors.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.d.ts +9 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.js +364 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.d.ts +83 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.js +2 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/claim-split.d.ts +57 -0
- package/dist/evidence/claim-recovery/validation/claim-split.js +209 -0
- package/dist/evidence/claim-recovery/validation/claim-split.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/claims.d.ts +20 -0
- package/dist/evidence/claim-recovery/validation/claims.js +108 -0
- package/dist/evidence/claim-recovery/validation/claims.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/current-projection.d.ts +36 -0
- package/dist/evidence/claim-recovery/validation/current-projection.js +424 -0
- package/dist/evidence/claim-recovery/validation/current-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/lexical.d.ts +18 -0
- package/dist/evidence/claim-recovery/validation/lexical.js +91 -0
- package/dist/evidence/claim-recovery/validation/lexical.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/materials.d.ts +19 -0
- package/dist/evidence/claim-recovery/validation/materials.js +160 -0
- package/dist/evidence/claim-recovery/validation/materials.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-material.d.ts +27 -0
- package/dist/evidence/claim-recovery/validation/native-material.js +35 -0
- package/dist/evidence/claim-recovery/validation/native-material.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.d.ts +79 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.js +187 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-state.d.ts +45 -0
- package/dist/evidence/claim-recovery/validation/native-state.js +385 -0
- package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/obligations.d.ts +15 -0
- package/dist/evidence/claim-recovery/validation/obligations.js +65 -0
- package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.d.ts +45 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.js +208 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.d.ts +101 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.js +2 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence.d.ts +30 -0
- package/dist/evidence/claim-recovery/validation/occurrence.js +227 -0
- package/dist/evidence/claim-recovery/validation/occurrence.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/primitives.d.ts +11 -0
- package/dist/evidence/claim-recovery/validation/primitives.js +41 -0
- package/dist/evidence/claim-recovery/validation/primitives.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/receipts.d.ts +37 -0
- package/dist/evidence/claim-recovery/validation/receipts.js +83 -0
- package/dist/evidence/claim-recovery/validation/receipts.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.d.ts +8 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.js +42 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.d.ts +3 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.js +22 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +9 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.js +347 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/sighting.d.ts +2 -0
- package/dist/evidence/claim-recovery/validation/sighting.js +15 -0
- package/dist/evidence/claim-recovery/validation/sighting.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/sources.d.ts +15 -0
- package/dist/evidence/claim-recovery/validation/sources.js +2 -0
- package/dist/evidence/claim-recovery/validation/sources.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/types.d.ts +126 -0
- package/dist/evidence/claim-recovery/validation/types.js +2 -0
- package/dist/evidence/claim-recovery/validation/types.js.map +1 -0
- package/dist/evidence/claim-split.d.ts +1 -0
- package/dist/evidence/claim-split.js +2 -0
- package/dist/evidence/claim-split.js.map +1 -0
- package/dist/evidence/event-receipts.d.ts +16 -0
- package/dist/evidence/event-receipts.js +41 -0
- package/dist/evidence/event-receipts.js.map +1 -0
- package/dist/evidence/finding-recovery.d.ts +23 -0
- package/dist/evidence/finding-recovery.js +74 -0
- package/dist/evidence/finding-recovery.js.map +1 -0
- package/dist/evidence/finding-retriage.d.ts +14 -0
- package/dist/evidence/finding-retriage.js +57 -0
- package/dist/evidence/finding-retriage.js.map +1 -0
- package/dist/evidence/format.d.ts +18 -0
- package/dist/evidence/format.js +152 -0
- package/dist/evidence/format.js.map +1 -0
- package/dist/evidence/original-run/decode.d.ts +30 -0
- package/dist/evidence/original-run/decode.js +208 -0
- package/dist/evidence/original-run/decode.js.map +1 -0
- package/dist/evidence/original-run/journal.d.ts +31 -0
- package/dist/evidence/original-run/journal.js +157 -0
- package/dist/evidence/original-run/journal.js.map +1 -0
- package/dist/evidence/original-run/lock-path.d.ts +17 -0
- package/dist/evidence/original-run/lock-path.js +116 -0
- package/dist/evidence/original-run/lock-path.js.map +1 -0
- package/dist/evidence/original-run/lock-scope.d.ts +21 -0
- package/dist/evidence/original-run/lock-scope.js +61 -0
- package/dist/evidence/original-run/lock-scope.js.map +1 -0
- package/dist/evidence/original-run/lock.d.ts +33 -0
- package/dist/evidence/original-run/lock.js +259 -0
- package/dist/evidence/original-run/lock.js.map +1 -0
- package/dist/evidence/original-run/remote.d.ts +23 -0
- package/dist/evidence/original-run/remote.js +110 -0
- package/dist/evidence/original-run/remote.js.map +1 -0
- package/dist/evidence/original-run/source.d.ts +61 -0
- package/dist/evidence/original-run/source.js +267 -0
- package/dist/evidence/original-run/source.js.map +1 -0
- package/dist/evidence/reads.d.ts +11 -0
- package/dist/evidence/reads.js +16 -0
- package/dist/evidence/reads.js.map +1 -0
- package/dist/evidence/recover-finding.d.ts +17 -0
- package/dist/evidence/recover-finding.js +65 -0
- package/dist/evidence/recover-finding.js.map +1 -0
- package/dist/evidence/recover-run.d.ts +26 -0
- package/dist/evidence/recover-run.js +180 -0
- package/dist/evidence/recover-run.js.map +1 -0
- package/dist/evidence/retained-time-budget.d.ts +9 -0
- package/dist/evidence/retained-time-budget.js +14 -0
- package/dist/evidence/retained-time-budget.js.map +1 -0
- package/dist/evidence/retriage-finding.d.ts +12 -0
- package/dist/evidence/retriage-finding.js +67 -0
- package/dist/evidence/retriage-finding.js.map +1 -0
- package/dist/evidence/reviewer-lineage.d.ts +35 -0
- package/dist/evidence/reviewer-lineage.js +293 -0
- package/dist/evidence/reviewer-lineage.js.map +1 -0
- package/dist/evidence/reviewer-original.d.ts +67 -0
- package/dist/evidence/reviewer-original.js +148 -0
- package/dist/evidence/reviewer-original.js.map +1 -0
- package/dist/evidence/reviewer-recovery.d.ts +74 -0
- package/dist/evidence/reviewer-recovery.js +179 -0
- package/dist/evidence/reviewer-recovery.js.map +1 -0
- package/dist/evidence/reviewer-status.d.ts +145 -0
- package/dist/evidence/reviewer-status.js +302 -0
- package/dist/evidence/reviewer-status.js.map +1 -0
- package/dist/evidence/show.d.ts +10 -0
- package/dist/evidence/show.js +41 -0
- package/dist/evidence/show.js.map +1 -0
- package/dist/evidence/status.d.ts +38 -0
- package/dist/evidence/status.js +73 -0
- package/dist/evidence/status.js.map +1 -0
- package/dist/evidence/target.d.ts +17 -0
- package/dist/evidence/target.js +74 -0
- package/dist/evidence/target.js.map +1 -0
- package/dist/evidence/types.d.ts +176 -0
- package/dist/evidence/types.js +109 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2688 -0
- package/dist/index.js.map +1 -0
- package/dist/models/seed.d.ts +44 -0
- package/dist/models/seed.js +175 -0
- package/dist/models/seed.js.map +1 -0
- package/dist/models/server-stats.d.ts +80 -0
- package/dist/models/server-stats.js +109 -0
- package/dist/models/server-stats.js.map +1 -0
- package/dist/models/stats-store.d.ts +84 -0
- package/dist/models/stats-store.js +572 -0
- package/dist/models/stats-store.js.map +1 -0
- package/dist/output/artifacts.d.ts +16 -0
- package/dist/output/artifacts.js +29 -0
- package/dist/output/artifacts.js.map +1 -0
- package/dist/output/assembly-refusal.d.ts +8 -0
- package/dist/output/assembly-refusal.js +14 -0
- package/dist/output/assembly-refusal.js.map +1 -0
- package/dist/output/github.d.ts +12 -0
- package/dist/output/github.js +214 -0
- package/dist/output/github.js.map +1 -0
- package/dist/output/json.d.ts +3 -0
- package/dist/output/json.js +8 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/markdown.d.ts +3 -0
- package/dist/output/markdown.js +281 -0
- package/dist/output/markdown.js.map +1 -0
- package/dist/output/progress.d.ts +55 -0
- package/dist/output/progress.js +180 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/output/sanitize.d.ts +18 -0
- package/dist/output/sanitize.js +46 -0
- package/dist/output/sanitize.js.map +1 -0
- package/dist/output/terminal.d.ts +2 -0
- package/dist/output/terminal.js +172 -0
- package/dist/output/terminal.js.map +1 -0
- package/dist/prepare/chunker.d.ts +18 -0
- package/dist/prepare/chunker.js +325 -0
- package/dist/prepare/chunker.js.map +1 -0
- package/dist/prepare/language.d.ts +1 -0
- package/dist/prepare/language.js +99 -0
- package/dist/prepare/language.js.map +1 -0
- package/dist/prepare/prompt-builder.d.ts +44 -0
- package/dist/prepare/prompt-builder.js +102 -0
- package/dist/prepare/prompt-builder.js.map +1 -0
- package/dist/prepare/unified-diff.d.ts +40 -0
- package/dist/prepare/unified-diff.js +135 -0
- package/dist/prepare/unified-diff.js.map +1 -0
- package/dist/prompts/base.d.ts +3 -0
- package/dist/prompts/base.js +53 -0
- package/dist/prompts/base.js.map +1 -0
- package/dist/prompts/hardening.d.ts +19 -0
- package/dist/prompts/hardening.js +67 -0
- package/dist/prompts/hardening.js.map +1 -0
- package/dist/prompts/languages/elixir.d.ts +1 -0
- package/dist/prompts/languages/elixir.js +13 -0
- package/dist/prompts/languages/elixir.js.map +1 -0
- package/dist/prompts/languages/generic.d.ts +1 -0
- package/dist/prompts/languages/generic.js +11 -0
- package/dist/prompts/languages/generic.js.map +1 -0
- package/dist/prompts/languages/python.d.ts +1 -0
- package/dist/prompts/languages/python.js +14 -0
- package/dist/prompts/languages/python.js.map +1 -0
- package/dist/prompts/languages/typescript.d.ts +1 -0
- package/dist/prompts/languages/typescript.js +13 -0
- package/dist/prompts/languages/typescript.js.map +1 -0
- package/dist/prompts/plan.d.ts +15 -0
- package/dist/prompts/plan.js +55 -0
- package/dist/prompts/plan.js.map +1 -0
- package/dist/report/aggregation-inputs.d.ts +52 -0
- package/dist/report/aggregation-inputs.js +114 -0
- package/dist/report/aggregation-inputs.js.map +1 -0
- package/dist/report/assembly.d.ts +43 -0
- package/dist/report/assembly.js +133 -0
- package/dist/report/assembly.js.map +1 -0
- package/dist/report/blocking-health.d.ts +64 -0
- package/dist/report/blocking-health.js +156 -0
- package/dist/report/blocking-health.js.map +1 -0
- package/dist/report/checkpoint-assembly.d.ts +10 -0
- package/dist/report/checkpoint-assembly.js +17 -0
- package/dist/report/checkpoint-assembly.js.map +1 -0
- package/dist/report/checkpoint-consensus.d.ts +59 -0
- package/dist/report/checkpoint-consensus.js +197 -0
- package/dist/report/checkpoint-consensus.js.map +1 -0
- package/dist/report/checkpoint-gating.d.ts +36 -0
- package/dist/report/checkpoint-gating.js +110 -0
- package/dist/report/checkpoint-gating.js.map +1 -0
- package/dist/report/checkpoint-projection.d.ts +76 -0
- package/dist/report/checkpoint-projection.js +122 -0
- package/dist/report/checkpoint-projection.js.map +1 -0
- package/dist/report/consensus-assembly.d.ts +37 -0
- package/dist/report/consensus-assembly.js +33 -0
- package/dist/report/consensus-assembly.js.map +1 -0
- package/dist/report/recovery-source.d.ts +7 -0
- package/dist/report/recovery-source.js +7 -0
- package/dist/report/recovery-source.js.map +1 -0
- package/dist/report/reviewer-artifact.d.ts +118 -0
- package/dist/report/reviewer-artifact.js +381 -0
- package/dist/report/reviewer-artifact.js.map +1 -0
- package/dist/report/reviewer-evidence-schema.d.ts +42 -0
- package/dist/report/reviewer-evidence-schema.js +28 -0
- package/dist/report/reviewer-evidence-schema.js.map +1 -0
- package/dist/report/reviewer-evidence.d.ts +54 -0
- package/dist/report/reviewer-evidence.js +229 -0
- package/dist/report/reviewer-evidence.js.map +1 -0
- package/dist/report/reviewer-health.d.ts +62 -0
- package/dist/report/reviewer-health.js +105 -0
- package/dist/report/reviewer-health.js.map +1 -0
- package/dist/report/run-header.d.ts +219 -0
- package/dist/report/run-header.js +307 -0
- package/dist/report/run-header.js.map +1 -0
- package/dist/report/supplemental-async.d.ts +19 -0
- package/dist/report/supplemental-async.js +85 -0
- package/dist/report/supplemental-async.js.map +1 -0
- package/dist/report/uuid.d.ts +16 -0
- package/dist/report/uuid.js +41 -0
- package/dist/report/uuid.js.map +1 -0
- package/dist/resolver/git.d.ts +16 -0
- package/dist/resolver/git.js +77 -0
- package/dist/resolver/git.js.map +1 -0
- package/dist/resolver/github-client.d.ts +82 -0
- package/dist/resolver/github-client.js +27 -0
- package/dist/resolver/github-client.js.map +1 -0
- package/dist/resolver/github.d.ts +29 -0
- package/dist/resolver/github.js +166 -0
- package/dist/resolver/github.js.map +1 -0
- package/dist/resolver/local.d.ts +3 -0
- package/dist/resolver/local.js +75 -0
- package/dist/resolver/local.js.map +1 -0
- package/dist/resolver/plan.d.ts +8 -0
- package/dist/resolver/plan.js +44 -0
- package/dist/resolver/plan.js.map +1 -0
- package/dist/resolver/target.d.ts +35 -0
- package/dist/resolver/target.js +112 -0
- package/dist/resolver/target.js.map +1 -0
- package/dist/resolver/types.d.ts +43 -0
- package/dist/resolver/types.js +2 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/roles/builtin.d.ts +4 -0
- package/dist/roles/builtin.js +282 -0
- package/dist/roles/builtin.js.map +1 -0
- package/dist/roles/dispatcher.d.ts +26 -0
- package/dist/roles/dispatcher.js +96 -0
- package/dist/roles/dispatcher.js.map +1 -0
- package/dist/roles/legacy-4.1.10.d.ts +2 -0
- package/dist/roles/legacy-4.1.10.js +320 -0
- package/dist/roles/legacy-4.1.10.js.map +1 -0
- package/dist/roles/legacy-4.4.9.d.ts +4 -0
- package/dist/roles/legacy-4.4.9.js +282 -0
- package/dist/roles/legacy-4.4.9.js.map +1 -0
- package/dist/roles/loader.d.ts +10 -0
- package/dist/roles/loader.js +104 -0
- package/dist/roles/loader.js.map +1 -0
- package/dist/roles/types.d.ts +13 -0
- package/dist/roles/types.js +2 -0
- package/dist/roles/types.js.map +1 -0
- package/dist/telemetry/abort-signal.d.ts +13 -0
- package/dist/telemetry/abort-signal.js +40 -0
- package/dist/telemetry/abort-signal.js.map +1 -0
- package/dist/telemetry/attest.d.ts +98 -0
- package/dist/telemetry/attest.js +331 -0
- package/dist/telemetry/attest.js.map +1 -0
- package/dist/telemetry/attested-retry.d.ts +79 -0
- package/dist/telemetry/attested-retry.js +195 -0
- package/dist/telemetry/attested-retry.js.map +1 -0
- package/dist/telemetry/attested-reviewer-delivery.d.ts +58 -0
- package/dist/telemetry/attested-reviewer-delivery.js +238 -0
- package/dist/telemetry/attested-reviewer-delivery.js.map +1 -0
- package/dist/telemetry/backfill.d.ts +95 -0
- package/dist/telemetry/backfill.js +460 -0
- package/dist/telemetry/backfill.js.map +1 -0
- package/dist/telemetry/credentials.d.ts +44 -0
- package/dist/telemetry/credentials.js +87 -0
- package/dist/telemetry/credentials.js.map +1 -0
- package/dist/telemetry/deliver.d.ts +152 -0
- package/dist/telemetry/deliver.js +662 -0
- package/dist/telemetry/deliver.js.map +1 -0
- package/dist/telemetry/envelope-validation.d.ts +13 -0
- package/dist/telemetry/envelope-validation.js +196 -0
- package/dist/telemetry/envelope-validation.js.map +1 -0
- package/dist/telemetry/envelope.d.ts +159 -0
- package/dist/telemetry/envelope.js +288 -0
- package/dist/telemetry/envelope.js.map +1 -0
- package/dist/telemetry/events.d.ts +68 -0
- package/dist/telemetry/events.js +79 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/notice.d.ts +15 -0
- package/dist/telemetry/notice.js +67 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/outbox.d.ts +166 -0
- package/dist/telemetry/outbox.js +741 -0
- package/dist/telemetry/outbox.js.map +1 -0
- package/dist/telemetry/quarantine.d.ts +105 -0
- package/dist/telemetry/quarantine.js +224 -0
- package/dist/telemetry/quarantine.js.map +1 -0
- package/dist/telemetry/read-sink.d.ts +31 -0
- package/dist/telemetry/read-sink.js +25 -0
- package/dist/telemetry/read-sink.js.map +1 -0
- package/dist/telemetry/recovery/command.d.ts +16 -0
- package/dist/telemetry/recovery/command.js +70 -0
- package/dist/telemetry/recovery/command.js.map +1 -0
- package/dist/telemetry/recovery/discovery.d.ts +8 -0
- package/dist/telemetry/recovery/discovery.js +277 -0
- package/dist/telemetry/recovery/discovery.js.map +1 -0
- package/dist/telemetry/recovery/files.d.ts +20 -0
- package/dist/telemetry/recovery/files.js +123 -0
- package/dist/telemetry/recovery/files.js.map +1 -0
- package/dist/telemetry/recovery/plan.d.ts +10 -0
- package/dist/telemetry/recovery/plan.js +325 -0
- package/dist/telemetry/recovery/plan.js.map +1 -0
- package/dist/telemetry/recovery/source.d.ts +328 -0
- package/dist/telemetry/recovery/source.js +253 -0
- package/dist/telemetry/recovery/source.js.map +1 -0
- package/dist/telemetry/recovery/types.d.ts +100 -0
- package/dist/telemetry/recovery/types.js +2 -0
- package/dist/telemetry/recovery/types.js.map +1 -0
- package/dist/telemetry/recovery-request-budget.d.ts +39 -0
- package/dist/telemetry/recovery-request-budget.js +102 -0
- package/dist/telemetry/recovery-request-budget.js.map +1 -0
- package/dist/telemetry/report-consistency.d.ts +11 -0
- package/dist/telemetry/report-consistency.js +111 -0
- package/dist/telemetry/report-consistency.js.map +1 -0
- package/dist/telemetry/reviewer-delivery.d.ts +39 -0
- package/dist/telemetry/reviewer-delivery.js +279 -0
- package/dist/telemetry/reviewer-delivery.js.map +1 -0
- package/dist/telemetry/reviewer-preflight.d.ts +13 -0
- package/dist/telemetry/reviewer-preflight.js +56 -0
- package/dist/telemetry/reviewer-preflight.js.map +1 -0
- package/dist/telemetry/scrub.d.ts +53 -0
- package/dist/telemetry/scrub.js +205 -0
- package/dist/telemetry/scrub.js.map +1 -0
- package/dist/telemetry/sink.d.ts +212 -0
- package/dist/telemetry/sink.js +813 -0
- package/dist/telemetry/sink.js.map +1 -0
- package/dist/telemetry/terminal-reviewer-delivery.d.ts +18 -0
- package/dist/telemetry/terminal-reviewer-delivery.js +27 -0
- package/dist/telemetry/terminal-reviewer-delivery.js.map +1 -0
- package/dist/telemetry/transient-input.d.ts +2 -0
- package/dist/telemetry/transient-input.js +37 -0
- package/dist/telemetry/transient-input.js.map +1 -0
- package/dist/telemetry/verification.d.ts +9 -0
- package/dist/telemetry/verification.js +12 -0
- package/dist/telemetry/verification.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { decodeSupplementalAsync, isSupplementalAsync } from './supplemental-async.js';
|
|
3
|
+
import { decodeOriginalReport } from '../evidence/original-run/decode.js';
|
|
4
|
+
import { decodeCapturedInputs } from '../dispatch/captured-inputs.js';
|
|
5
|
+
import { decodeCheckpointProof, isCheckpointProof } from '../dispatch/checkpoint.js';
|
|
6
|
+
import { decodeOriginalLaunch } from '../dispatch/original-launch.js';
|
|
7
|
+
import { MAX_ARTIFACT_BYTES } from '../telemetry/envelope-validation.js';
|
|
8
|
+
import { decodeRecoveryOperation } from '../dispatch/recovery-operation.js';
|
|
9
|
+
import { originalRunReportSchema } from '../telemetry/recovery/source.js';
|
|
10
|
+
import { reviewerEvidenceDescriptorSchema, reviewerEvidenceSourceSchema } from './reviewer-evidence-schema.js';
|
|
11
|
+
export { reviewerEvidenceDescriptorSchema } from './reviewer-evidence-schema.js';
|
|
12
|
+
import { sha256Hex, stableStringify } from './run-header.js';
|
|
13
|
+
/** Shared artifact limit; the complete serialized report must fit, not merely its proof. */
|
|
14
|
+
export const MAX_REVIEWER_REPORT_BYTES = MAX_ARTIFACT_BYTES;
|
|
15
|
+
export const MAX_REVIEWER_LINEAGE_DEPTH = 32;
|
|
16
|
+
const inspected = new WeakSet();
|
|
17
|
+
function freeze(value) {
|
|
18
|
+
if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
19
|
+
for (const item of Object.values(value))
|
|
20
|
+
freeze(item);
|
|
21
|
+
Object.freeze(value);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function bound(bytes) {
|
|
26
|
+
if (typeof bytes !== 'string' || Buffer.byteLength(bytes, 'utf8') > MAX_REVIEWER_REPORT_BYTES ||
|
|
27
|
+
Buffer.from(bytes, 'utf8').toString('utf8') !== bytes)
|
|
28
|
+
throw new Error('reviewer_report_invalid_bytes');
|
|
29
|
+
}
|
|
30
|
+
function capturedProof(proof) {
|
|
31
|
+
if (!isCheckpointProof(proof))
|
|
32
|
+
throw new Error('reviewer_checkpoint_not_validated');
|
|
33
|
+
const bytes = proof.bindings['captured-inputs'];
|
|
34
|
+
if (bytes === undefined)
|
|
35
|
+
throw new Error('reviewer_checkpoint_missing_capture');
|
|
36
|
+
return decodeCapturedInputs(bytes, proof.plan);
|
|
37
|
+
}
|
|
38
|
+
/** Validate local launch bindings without treating its historical deadline as a new launch. */
|
|
39
|
+
function originalLaunch(proof, captured) {
|
|
40
|
+
const bytes = proof.bindings.launch;
|
|
41
|
+
if (bytes === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (proof.bindings.source !== undefined || proof.bindings.operation !== undefined) {
|
|
44
|
+
throw new Error('reviewer_mixed_launch_bindings');
|
|
45
|
+
}
|
|
46
|
+
const launch = decodeOriginalLaunch(bytes);
|
|
47
|
+
if (launch.target !== proof.plan.target || launch.planDigest !== proof.plan.digest ||
|
|
48
|
+
launch.capturedInputsSha256 !== captured.digest)
|
|
49
|
+
throw new Error('reviewer_original_launch_mismatch');
|
|
50
|
+
return launch;
|
|
51
|
+
}
|
|
52
|
+
/** Compact descriptor derived from the existing sealed journal, never its own report hash. */
|
|
53
|
+
export function describeReviewerEvidence(proof, supplementalAsync) {
|
|
54
|
+
const captured = capturedProof(proof), launch = originalLaunch(proof, captured);
|
|
55
|
+
if (captured.aggregation && !isSupplementalAsync(supplementalAsync))
|
|
56
|
+
throw new Error('reviewer_missing_async_snapshot');
|
|
57
|
+
if (supplementalAsync && (!isSupplementalAsync(supplementalAsync) || !captured.aggregation)) {
|
|
58
|
+
throw new Error('reviewer_missing_aggregation_snapshot');
|
|
59
|
+
}
|
|
60
|
+
const base = { version: 1, checkpoint_schema: 1, plan_sha256: proof.plan.digest,
|
|
61
|
+
checkpoint_sha256: proof.digest, captured_inputs_sha256: captured.digest,
|
|
62
|
+
policy: { version: 1, fraction: captured.policy.fraction },
|
|
63
|
+
...(captured.aggregation ? { aggregation_sha256: captured.aggregation.digest, supplemental_async_sha256: supplementalAsync.digest } : {}) };
|
|
64
|
+
const sourceBytes = proof.bindings.source, operationBytes = proof.bindings.operation;
|
|
65
|
+
if (sourceBytes === undefined && operationBytes === undefined)
|
|
66
|
+
return freeze({ ...base, kind: 'original',
|
|
67
|
+
...(launch ? { launch_sha256: sha256Hex(proof.bindings.launch) } : {}) });
|
|
68
|
+
if (sourceBytes === undefined || operationBytes === undefined)
|
|
69
|
+
throw new Error('reviewer_successor_missing_bindings');
|
|
70
|
+
const operation = decodeRecoveryOperation(operationBytes);
|
|
71
|
+
let source;
|
|
72
|
+
try {
|
|
73
|
+
source = reviewerEvidenceSourceSchema.parse(JSON.parse(sourceBytes));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new Error('reviewer_invalid_source_binding');
|
|
77
|
+
}
|
|
78
|
+
if (stableStringify(source) !== sourceBytes || operation.target !== proof.plan.target ||
|
|
79
|
+
operation.planDigest !== proof.plan.digest || operation.capturedInputsSha256 !== captured.digest ||
|
|
80
|
+
source.run_id !== operation.sourceRunId || source.report_sha256 !== operation.sourceReportSha256 ||
|
|
81
|
+
source.checkpoint_sha256 !== operation.sourceCheckpointSha256)
|
|
82
|
+
throw new Error('reviewer_source_operation_mismatch');
|
|
83
|
+
return freeze({ ...base, kind: 'supplemented', source, operation_id: operation.operationId });
|
|
84
|
+
}
|
|
85
|
+
/** Exact local source reference; persists in the successor's existing journal before paid work. */
|
|
86
|
+
export function reviewerSourceBinding(source) {
|
|
87
|
+
if (!inspected.has(source))
|
|
88
|
+
throw new Error('reviewer_report_not_inspected');
|
|
89
|
+
return stableStringify({ run_id: source.runId, report_sha256: source.reportSha256, checkpoint_sha256: source.proof.digest });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Inspect immutable artifact, capture and target bindings. This is deliberately
|
|
93
|
+
* not an approval/admission API: callers must additionally validate the complete
|
|
94
|
+
* ancestry, aggregation/contribution projections, server receipt, producer
|
|
95
|
+
* authority, successful-seat health and the current native launch claim.
|
|
96
|
+
*/
|
|
97
|
+
export function inspectReviewerEvidenceReport(reportBytes, expectedPlan, expectedPrTarget) {
|
|
98
|
+
bound(reportBytes);
|
|
99
|
+
const raw = decodeOriginalReport(reportBytes).value;
|
|
100
|
+
const report = originalRunReportSchema.safeParse(raw);
|
|
101
|
+
if (!report.success || !raw || typeof raw !== 'object')
|
|
102
|
+
throw new Error('reviewer_invalid_report');
|
|
103
|
+
const input = raw, rawRun = input.run;
|
|
104
|
+
const descriptor = reviewerEvidenceDescriptorSchema.safeParse(rawRun.reviewer_evidence);
|
|
105
|
+
const artifact = z.object({ checkpoint: z.string(), supplemental_async: z.string().optional() }).strict().safeParse(input.reviewerEvidence);
|
|
106
|
+
if (!descriptor.success || !artifact.success)
|
|
107
|
+
throw new Error('reviewer_report_missing_proof');
|
|
108
|
+
const proof = decodeCheckpointProof(artifact.data.checkpoint, expectedPlan);
|
|
109
|
+
const supplementalAsync = artifact.data.supplemental_async === undefined ? undefined : decodeSupplementalAsync(artifact.data.supplemental_async);
|
|
110
|
+
const actual = describeReviewerEvidence(proof, supplementalAsync);
|
|
111
|
+
if (stableStringify(actual) !== stableStringify(descriptor.data))
|
|
112
|
+
throw new Error('reviewer_descriptor_mismatch');
|
|
113
|
+
const captured = capturedProof(proof), run = report.data.run;
|
|
114
|
+
const target = assertReviewerRunBindings(run, proof, captured, expectedPrTarget);
|
|
115
|
+
const operation = actual.kind === 'supplemented' ? decodeRecoveryOperation(proof.bindings.operation) : undefined;
|
|
116
|
+
const launch = originalLaunch(proof, captured);
|
|
117
|
+
if (operation && operation.successorRunId !== run.id)
|
|
118
|
+
throw new Error('reviewer_report_successor_mismatch');
|
|
119
|
+
const result = freeze({ reportBytes, reportSha256: sha256Hex(reportBytes), runId: run.id, prTarget: target,
|
|
120
|
+
descriptor: actual, proof, captured, ...(operation ? { operation } : {}), ...(launch ? { launch } : {}),
|
|
121
|
+
...(supplementalAsync ? { supplementalAsync } : {}),
|
|
122
|
+
...(run.converge ? { nativeClaim: run.converge } : {}) });
|
|
123
|
+
inspected.add(result);
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/** Check the original target and prepared inputs before aggregation can dispatch verification. */
|
|
127
|
+
export function assertReviewerRunBindings(run, proof, captured, expectedPrTarget) {
|
|
128
|
+
if (!isCheckpointProof(proof) || proof.bindings['captured-inputs'] !== captured.bytes ||
|
|
129
|
+
captured.plan.digest !== proof.plan.digest)
|
|
130
|
+
throw new Error('reviewer_checkpoint_missing_capture');
|
|
131
|
+
const launch = originalLaunch(proof, captured);
|
|
132
|
+
if (launch && (run.id !== launch.runId || run.converge?.target !== launch.target ||
|
|
133
|
+
run.converge.attempt !== launch.originalNativeClaim.attempt || run.converge.round !== launch.originalNativeClaim.round)) {
|
|
134
|
+
throw new Error('reviewer_report_launch_mismatch');
|
|
135
|
+
}
|
|
136
|
+
const target = run.target.repo && run.target.pr_number ? `${run.target.repo.toLowerCase()}#${run.target.pr_number}` : undefined;
|
|
137
|
+
// Native convergence uses an opaque accounting key (for example rcl-105).
|
|
138
|
+
// Keep it distinct from the actual PR; neither key can replace the other.
|
|
139
|
+
const planPrTarget = /^[^/\s]+\/[^/#\s]+#[1-9]\d*$/.test(proof.plan.target)
|
|
140
|
+
? proof.plan.target.toLowerCase() : undefined;
|
|
141
|
+
if (!target || (planPrTarget !== undefined ? target !== planPrTarget : run.converge?.target !== proof.plan.target) ||
|
|
142
|
+
expectedPrTarget !== undefined && target !== expectedPrTarget.toLowerCase() || run.target.head_sha !== proof.plan.headSha ||
|
|
143
|
+
run.target.diff_sha256 !== proof.plan.patchSha256 || run.config_sha256 !== proof.plan.configSha256 ||
|
|
144
|
+
run.converge && run.converge.target !== proof.plan.target)
|
|
145
|
+
throw new Error('reviewer_report_target_mismatch');
|
|
146
|
+
// base_sha is an observed upstream tip, not the captured effective merge base.
|
|
147
|
+
// expectedPlan supplies the independently refreshed material-input comparison.
|
|
148
|
+
const roster = run.roster.filter(seat => seat.lane === 'blocking' || seat.lane === 'secondary')
|
|
149
|
+
.map(seat => ({ model: seat.model, role: seat.role, route: seat.provider,
|
|
150
|
+
...(proof.plan.version === 2 ? { lane: seat.lane } : {}) }));
|
|
151
|
+
if (stableStringify(roster) !== stableStringify(proof.plan.roster.map(({ model, role, route, lane }) => ({ model, role, route,
|
|
152
|
+
...(proof.plan.version === 2 ? { lane } : {}) })))) {
|
|
153
|
+
throw new Error('reviewer_report_roster_mismatch');
|
|
154
|
+
}
|
|
155
|
+
if (captured.async) {
|
|
156
|
+
const asyncRoster = run.roster.filter(row => row.lane === 'async');
|
|
157
|
+
const expected = proof.plan.chunks.flatMap(chunk => asyncRoster.map(row => ({ chunk: chunk.index, model: row.model, role: row.role, provider: row.provider }))).slice(0, 8);
|
|
158
|
+
const actual = captured.async.calls.map(({ ref }) => ({ chunk: ref.chunk, model: ref.model, role: ref.role, provider: ref.provider }));
|
|
159
|
+
if (stableStringify(actual) !== stableStringify(expected))
|
|
160
|
+
throw new Error('reviewer_report_async_roster_mismatch');
|
|
161
|
+
}
|
|
162
|
+
if ((run.spec?.sha256 ?? sha256Hex('')) !== proof.plan.specSha256)
|
|
163
|
+
throw new Error('reviewer_report_spec_mismatch');
|
|
164
|
+
const context = JSON.parse(captured.contextBytes);
|
|
165
|
+
if (stableStringify(run.context_files) !== stableStringify(context.map(doc => ({ path: doc.label, sha256: doc.sha256 })))) {
|
|
166
|
+
throw new Error('reviewer_report_context_mismatch');
|
|
167
|
+
}
|
|
168
|
+
return target;
|
|
169
|
+
}
|
|
170
|
+
/** Validates a report-shaped chain. The caller separately establishes how each pair was inspected. */
|
|
171
|
+
function validateChain(reports) {
|
|
172
|
+
if (reports.length === 0 || reports.length > MAX_REVIEWER_LINEAGE_DEPTH)
|
|
173
|
+
throw new Error('reviewer_lineage_depth');
|
|
174
|
+
const runIds = new Set(), operationIds = new Set();
|
|
175
|
+
let previous;
|
|
176
|
+
for (const report of reports) {
|
|
177
|
+
const id = report.runId.toLowerCase();
|
|
178
|
+
if (runIds.has(id))
|
|
179
|
+
throw new Error('reviewer_lineage_duplicate_run');
|
|
180
|
+
runIds.add(id);
|
|
181
|
+
if (!previous) {
|
|
182
|
+
if (report.descriptor.kind !== 'original')
|
|
183
|
+
throw new Error('reviewer_lineage_missing_origin');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
if (report.descriptor.kind !== 'supplemented' || !report.operation)
|
|
187
|
+
throw new Error('reviewer_lineage_missing_source');
|
|
188
|
+
if (report.asyncExecution?.bytes !== previous.asyncExecution?.bytes || report.asyncExecution?.digest !== previous.asyncExecution?.digest)
|
|
189
|
+
throw new Error('reviewer_lineage_async_execution_mismatch');
|
|
190
|
+
if (report.supplementalAsync?.digest !== previous.supplementalAsync?.digest)
|
|
191
|
+
throw new Error('reviewer_lineage_async_mismatch');
|
|
192
|
+
if (report.prTarget !== previous.prTarget)
|
|
193
|
+
throw new Error('reviewer_lineage_target_mismatch');
|
|
194
|
+
const source = report.descriptor.source, operation = report.operation;
|
|
195
|
+
if (source.run_id !== previous.runId || source.report_sha256 !== previous.reportSha256 || source.checkpoint_sha256 !== previous.proof.digest ||
|
|
196
|
+
report.proof.plan.digest !== previous.proof.plan.digest || report.captured.digest !== previous.captured.digest) {
|
|
197
|
+
throw new Error('reviewer_lineage_source_mismatch');
|
|
198
|
+
}
|
|
199
|
+
const root = reports[0];
|
|
200
|
+
if (operation.originalNativeClaim.attempt !== root.nativeClaim?.attempt ||
|
|
201
|
+
operation.originalNativeClaim.round !== root.nativeClaim?.round ||
|
|
202
|
+
!operation.successorNativeClaim ||
|
|
203
|
+
operation.successorNativeClaim.attempt !== report.nativeClaim?.attempt ||
|
|
204
|
+
operation.successorNativeClaim.round !== report.nativeClaim?.round)
|
|
205
|
+
throw new Error('reviewer_lineage_native_claim_mismatch');
|
|
206
|
+
if (operationIds.has(operation.operationId.toLowerCase()))
|
|
207
|
+
throw new Error('reviewer_lineage_duplicate_operation');
|
|
208
|
+
operationIds.add(operation.operationId.toLowerCase());
|
|
209
|
+
}
|
|
210
|
+
previous = report;
|
|
211
|
+
}
|
|
212
|
+
return Object.freeze([...reports]);
|
|
213
|
+
}
|
|
214
|
+
/** Runtime inline-inspection provenance only; never producer/server authority. */
|
|
215
|
+
export function isInspectedReviewerReport(value) {
|
|
216
|
+
return typeof value === 'object' && value !== null && inspected.has(value);
|
|
217
|
+
}
|
|
218
|
+
/** Validate oldest-to-newest immutable report evidence. */
|
|
219
|
+
export function validateReviewerReportChain(reports) {
|
|
220
|
+
for (const report of reports)
|
|
221
|
+
if (!inspected.has(report))
|
|
222
|
+
throw new Error('reviewer_report_not_inspected');
|
|
223
|
+
return validateChain(reports);
|
|
224
|
+
}
|
|
225
|
+
/** Validate separately retained private artifact pairs without fabricating inline evidence. */
|
|
226
|
+
export function validateInspectedReviewerArtifactChain(reports) {
|
|
227
|
+
return Object.freeze([...validateChain(reports)]);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=reviewer-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer-evidence.js","sourceRoot":"","sources":["../../src/report/reviewer-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ModelReview } from '../consensus/types.js';
|
|
2
|
+
import { type QuorumPolicy } from '../dispatch/quorum.js';
|
|
3
|
+
/** Structural view of every original synchronous assignment and its frozen lane. */
|
|
4
|
+
export interface ReviewerHealthPlan {
|
|
5
|
+
version: 1 | 2;
|
|
6
|
+
roster: Array<{
|
|
7
|
+
seat: string;
|
|
8
|
+
model: string;
|
|
9
|
+
role: string;
|
|
10
|
+
route: string;
|
|
11
|
+
lane?: 'blocking' | 'secondary';
|
|
12
|
+
}>;
|
|
13
|
+
chunks: Array<{
|
|
14
|
+
index: number;
|
|
15
|
+
total: number;
|
|
16
|
+
digest: string;
|
|
17
|
+
}>;
|
|
18
|
+
cells: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
seat: string;
|
|
21
|
+
chunk: number;
|
|
22
|
+
model: string;
|
|
23
|
+
role: string;
|
|
24
|
+
route: string;
|
|
25
|
+
chunkDigest: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
/** One selected, durably accepted outcome per original cell, retained or new. */
|
|
29
|
+
export interface SelectedReviewerResult {
|
|
30
|
+
cell: string;
|
|
31
|
+
review: ModelReview;
|
|
32
|
+
}
|
|
33
|
+
declare const validatedReviewerHealth: unique symbol;
|
|
34
|
+
/**
|
|
35
|
+
* An immutable local projection, not a substitute for persisted source proof.
|
|
36
|
+
* Readers of serialized reports must validate their proof and derive it again.
|
|
37
|
+
*/
|
|
38
|
+
export interface ReviewerHealth {
|
|
39
|
+
readonly [validatedReviewerHealth]: true;
|
|
40
|
+
readonly version: 1;
|
|
41
|
+
readonly policy: QuorumPolicy;
|
|
42
|
+
readonly successfulSeats: readonly string[];
|
|
43
|
+
readonly incompleteSeats: readonly string[];
|
|
44
|
+
readonly conclusive: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** Refuse caller-invented counts, thresholds, and deserialized projections. */
|
|
47
|
+
export declare function assertReviewerHealth(value: unknown): asserts value is ReviewerHealth;
|
|
48
|
+
/**
|
|
49
|
+
* Derive health from complete original seat/chunk identities, never result count.
|
|
50
|
+
* The caller first verifies checkpoint provenance, original plan identity and
|
|
51
|
+
* selected outcome bytes. This pure projection checks matrix completeness and
|
|
52
|
+
* outcome attribution; it cannot establish provider truth or source authority.
|
|
53
|
+
* Async/verifier rows remain outside this synchronous plan and must not be passed.
|
|
54
|
+
* Policy version/fraction are explicit; legacy waiting configuration is not used.
|
|
55
|
+
*/
|
|
56
|
+
export declare function deriveReviewerCoverage(plan: ReviewerHealthPlan, selectedResults: readonly SelectedReviewerResult[], policy: Pick<QuorumPolicy, 'version' | 'fraction'>): {
|
|
57
|
+
health: ReviewerHealth;
|
|
58
|
+
completeSeats: readonly string[];
|
|
59
|
+
};
|
|
60
|
+
/** Blocking quorum is separate from the complete synchronous contribution set. */
|
|
61
|
+
export declare function deriveReviewerHealth(plan: ReviewerHealthPlan, selectedResults: readonly SelectedReviewerResult[], policy: Pick<QuorumPolicy, 'version' | 'fraction'>): ReviewerHealth;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { hasSuccessfulQuorum, resolveQuorumPolicy } from '../dispatch/quorum.js';
|
|
2
|
+
const validated = new WeakSet();
|
|
3
|
+
const statuses = new Set(['success', 'timeout', 'error', 'parse_failed', 'canceled']);
|
|
4
|
+
function text(value) {
|
|
5
|
+
return typeof value === 'string' && value.trim().length > 0 && !/[\0\r\n]/.test(value);
|
|
6
|
+
}
|
|
7
|
+
/** Refuse caller-invented counts, thresholds, and deserialized projections. */
|
|
8
|
+
export function assertReviewerHealth(value) {
|
|
9
|
+
if (value === null || typeof value !== 'object' || !validated.has(value)) {
|
|
10
|
+
throw new Error('Reviewer health must be derived from a validated original matrix');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Derive health from complete original seat/chunk identities, never result count.
|
|
15
|
+
* The caller first verifies checkpoint provenance, original plan identity and
|
|
16
|
+
* selected outcome bytes. This pure projection checks matrix completeness and
|
|
17
|
+
* outcome attribution; it cannot establish provider truth or source authority.
|
|
18
|
+
* Async/verifier rows remain outside this synchronous plan and must not be passed.
|
|
19
|
+
* Policy version/fraction are explicit; legacy waiting configuration is not used.
|
|
20
|
+
*/
|
|
21
|
+
export function deriveReviewerCoverage(plan, selectedResults, policy) {
|
|
22
|
+
if (policy?.version !== 1 || typeof policy.fraction !== 'number') {
|
|
23
|
+
throw new Error('Invalid reviewer health policy version or fraction');
|
|
24
|
+
}
|
|
25
|
+
if ((plan?.version !== 1 && plan?.version !== 2) || !Array.isArray(plan.roster) || !Array.isArray(plan.chunks) ||
|
|
26
|
+
!Array.isArray(plan.cells) || !Array.isArray(selectedResults) || plan.chunks.length === 0) {
|
|
27
|
+
throw new Error('Invalid frozen reviewer matrix');
|
|
28
|
+
}
|
|
29
|
+
const roster = new Map();
|
|
30
|
+
for (const seat of plan.roster) {
|
|
31
|
+
if (!seat || !text(seat.seat) || !text(seat.model) || !text(seat.role) || !text(seat.route)) {
|
|
32
|
+
throw new Error('Invalid frozen reviewer seat');
|
|
33
|
+
}
|
|
34
|
+
if (plan.version === 2 ? seat.lane !== 'blocking' && seat.lane !== 'secondary' : seat.lane !== undefined) {
|
|
35
|
+
throw new Error('Invalid frozen reviewer lane binding');
|
|
36
|
+
}
|
|
37
|
+
if (roster.has(seat.seat))
|
|
38
|
+
throw new Error('Duplicate frozen reviewer seat');
|
|
39
|
+
roster.set(seat.seat, seat);
|
|
40
|
+
}
|
|
41
|
+
const blocking = [...roster.values()].filter(seat => plan.version === 1 || seat.lane === 'blocking');
|
|
42
|
+
const resolved = resolveQuorumPolicy(blocking.length, policy.fraction);
|
|
43
|
+
const chunks = new Map();
|
|
44
|
+
for (const chunk of plan.chunks) {
|
|
45
|
+
if (!chunk || !Number.isSafeInteger(chunk.index) || chunk.index < 0 || chunk.index >= plan.chunks.length ||
|
|
46
|
+
chunk.total !== plan.chunks.length || !/^[a-f0-9]{64}$/.test(chunk.digest) || chunks.has(chunk.index)) {
|
|
47
|
+
throw new Error('Invalid or duplicate frozen reviewer chunk');
|
|
48
|
+
}
|
|
49
|
+
chunks.set(chunk.index, chunk.digest);
|
|
50
|
+
}
|
|
51
|
+
const expectedCount = roster.size * chunks.size;
|
|
52
|
+
if (!Number.isSafeInteger(expectedCount) || plan.cells.length !== expectedCount) {
|
|
53
|
+
throw new Error('Incomplete frozen reviewer matrix');
|
|
54
|
+
}
|
|
55
|
+
const cells = new Map();
|
|
56
|
+
const pairs = new Set();
|
|
57
|
+
for (const cell of plan.cells) {
|
|
58
|
+
const seat = cell && roster.get(cell.seat);
|
|
59
|
+
if (!cell || !text(cell.id) || !seat || !chunks.has(cell.chunk) || cell.chunkDigest !== chunks.get(cell.chunk) ||
|
|
60
|
+
cell.model !== seat.model || cell.role !== seat.role || cell.route !== seat.route) {
|
|
61
|
+
throw new Error('Invalid frozen reviewer cell binding');
|
|
62
|
+
}
|
|
63
|
+
const pair = JSON.stringify([cell.seat, cell.chunk]);
|
|
64
|
+
if (cells.has(cell.id) || pairs.has(pair))
|
|
65
|
+
throw new Error('Duplicate frozen reviewer cell');
|
|
66
|
+
cells.set(cell.id, cell);
|
|
67
|
+
pairs.add(pair);
|
|
68
|
+
}
|
|
69
|
+
const selected = new Set();
|
|
70
|
+
const successes = new Map();
|
|
71
|
+
for (const result of selectedResults) {
|
|
72
|
+
const cell = result && cells.get(result.cell);
|
|
73
|
+
const review = result?.review;
|
|
74
|
+
if (!cell || !review || review.model !== cell.model || review.role !== cell.role || review.provider !== cell.route ||
|
|
75
|
+
review.async !== undefined && review.async !== false || !statuses.has(review.status) ||
|
|
76
|
+
!Array.isArray(review.findings) || !Number.isFinite(review.durationMs) || review.durationMs < 0) {
|
|
77
|
+
throw new Error('Invalid selected reviewer result binding, lane or outcome');
|
|
78
|
+
}
|
|
79
|
+
if (selected.has(result.cell))
|
|
80
|
+
throw new Error('Duplicate selected reviewer cell');
|
|
81
|
+
selected.add(result.cell);
|
|
82
|
+
if (review.status === 'success')
|
|
83
|
+
successes.set(cell.seat, (successes.get(cell.seat) ?? 0) + 1);
|
|
84
|
+
}
|
|
85
|
+
const successfulSeats = [];
|
|
86
|
+
const incompleteSeats = [];
|
|
87
|
+
const completeSeats = [...roster.keys()].filter(seat => successes.get(seat) === chunks.size);
|
|
88
|
+
for (const { seat } of blocking) {
|
|
89
|
+
(successes.get(seat) === chunks.size ? successfulSeats : incompleteSeats).push(seat);
|
|
90
|
+
}
|
|
91
|
+
const health = Object.freeze({
|
|
92
|
+
version: 1,
|
|
93
|
+
policy: Object.freeze(resolved),
|
|
94
|
+
successfulSeats: Object.freeze(successfulSeats),
|
|
95
|
+
incompleteSeats: Object.freeze(incompleteSeats),
|
|
96
|
+
conclusive: hasSuccessfulQuorum(resolved, successfulSeats.length),
|
|
97
|
+
});
|
|
98
|
+
validated.add(health);
|
|
99
|
+
return Object.freeze({ health, completeSeats: Object.freeze(completeSeats) });
|
|
100
|
+
}
|
|
101
|
+
/** Blocking quorum is separate from the complete synchronous contribution set. */
|
|
102
|
+
export function deriveReviewerHealth(plan, selectedResults, policy) {
|
|
103
|
+
return deriveReviewerCoverage(plan, selectedResults, policy).health;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=reviewer-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer-health.js","sourceRoot":"","sources":["../../src/report/reviewer-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import type { RecoverySource } from './recovery-source.js';
|
|
2
|
+
import type { Config } from '../config/schema.js';
|
|
3
|
+
import type { ResolvedGatingConfig } from '../consensus/gating.js';
|
|
4
|
+
import type { Diff, FileChange } from '../resolver/types.js';
|
|
5
|
+
import type { ReviewAssignment } from '../roles/types.js';
|
|
6
|
+
import type { ReviewerEvidenceDescriptor } from './reviewer-evidence.js';
|
|
7
|
+
/**
|
|
8
|
+
* The self-describing report header (evidence ledger, epic IO-12475
|
|
9
|
+
* section 5.1). Written INSIDE the report JSON as `ReviewResult.run`, so a
|
|
10
|
+
* report on disk says which commit it reviewed, with which roster and
|
|
11
|
+
* settings, without any network behavior. Field names are the wire contract
|
|
12
|
+
* Harness ingests, hence snake_case here while the rest of the report keeps
|
|
13
|
+
* its camelCase history.
|
|
14
|
+
*
|
|
15
|
+
* Every field is allow-listed by construction: the builder receives exactly
|
|
16
|
+
* the values it records and never sees `process.env` or a config object it
|
|
17
|
+
* would echo verbatim (the config becomes a digest; the GitHub token is
|
|
18
|
+
* excluded from even that).
|
|
19
|
+
*/
|
|
20
|
+
export type TargetKind = 'pr' | 'patch' | 'staged' | 'working_tree' | 'plan';
|
|
21
|
+
export type RosterLane = 'blocking' | 'secondary' | 'async' | 'verification';
|
|
22
|
+
export type RunnerKind = 'agent' | 'ci' | 'human';
|
|
23
|
+
export type SpecSource = 'flag' | 'repo_file' | `harness_issue:${string}`;
|
|
24
|
+
export interface RosterEntry {
|
|
25
|
+
model: string;
|
|
26
|
+
role: string;
|
|
27
|
+
provider: string;
|
|
28
|
+
lane: RosterLane;
|
|
29
|
+
}
|
|
30
|
+
export interface RunTarget {
|
|
31
|
+
kind: TargetKind;
|
|
32
|
+
repo?: string;
|
|
33
|
+
pr_number?: number;
|
|
34
|
+
url?: string;
|
|
35
|
+
head_sha?: string;
|
|
36
|
+
base_sha?: string;
|
|
37
|
+
head_ref?: string;
|
|
38
|
+
base_ref?: string;
|
|
39
|
+
/** SHA-256 over the canonical file/patch serialization (see diffDigest). */
|
|
40
|
+
diff_sha256: string;
|
|
41
|
+
files: number;
|
|
42
|
+
additions: number;
|
|
43
|
+
deletions: number;
|
|
44
|
+
}
|
|
45
|
+
export interface RunnerClaim {
|
|
46
|
+
kind: RunnerKind;
|
|
47
|
+
agent?: string;
|
|
48
|
+
ci_run_id?: string;
|
|
49
|
+
host?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface ConvergeContext {
|
|
52
|
+
/** Versioned local predecessor commitment, present only on recovered-v3 production.
|
|
53
|
+
* It cannot confer attestation; ordinary admission verifies it under target ownership. */
|
|
54
|
+
recovery_source?: RecoverySource;
|
|
55
|
+
target: string;
|
|
56
|
+
round?: number;
|
|
57
|
+
attempt?: number;
|
|
58
|
+
cycleId?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface RunHeader {
|
|
61
|
+
/** Client UUIDv7 — the idempotency key for delivery retries. */
|
|
62
|
+
id: string;
|
|
63
|
+
rcl_version: string;
|
|
64
|
+
command: 'review' | 'review-plan';
|
|
65
|
+
target: RunTarget;
|
|
66
|
+
roster: RosterEntry[];
|
|
67
|
+
config_sha256: string;
|
|
68
|
+
thresholds: {
|
|
69
|
+
min_consensus_score: number;
|
|
70
|
+
min_confidence: number;
|
|
71
|
+
dedupe_line_window: number;
|
|
72
|
+
jaccard_threshold: number;
|
|
73
|
+
};
|
|
74
|
+
gating: {
|
|
75
|
+
mode: ResolvedGatingConfig['mode'];
|
|
76
|
+
bound_classification_protocol?: 1;
|
|
77
|
+
min_models: number;
|
|
78
|
+
verification_model?: string;
|
|
79
|
+
verification_reasoning_effort?: ResolvedGatingConfig['verificationReasoningEffort'];
|
|
80
|
+
verification_timeout_ms: number;
|
|
81
|
+
verification_pass_timeout_ms?: number;
|
|
82
|
+
};
|
|
83
|
+
spec?: {
|
|
84
|
+
source: SpecSource;
|
|
85
|
+
sha256: string;
|
|
86
|
+
};
|
|
87
|
+
context_files: Array<{
|
|
88
|
+
path: string;
|
|
89
|
+
sha256: string;
|
|
90
|
+
}>;
|
|
91
|
+
/** review-plan only: the effective focus mode, which shapes the prompts. */
|
|
92
|
+
plan?: {
|
|
93
|
+
focus: string;
|
|
94
|
+
};
|
|
95
|
+
/** Best-effort environment claim; the credential's user is the authority. */
|
|
96
|
+
runner: RunnerClaim;
|
|
97
|
+
started_at: string;
|
|
98
|
+
finished_at: string;
|
|
99
|
+
duration_ms: number;
|
|
100
|
+
/** Computed even without --ci so the gate verdict is recorded uniformly. */
|
|
101
|
+
ci_exit_code: number;
|
|
102
|
+
converge?: Omit<ConvergeContext, 'cycleId'>;
|
|
103
|
+
cycle_id?: string;
|
|
104
|
+
/** `backfill` for recovered history (`rcl telemetry backfill`); absent means live. */
|
|
105
|
+
provenance?: 'live' | 'backfill';
|
|
106
|
+
/** Original immutable modern report, only on a non-gating historical import. */
|
|
107
|
+
historical_source?: {
|
|
108
|
+
original_run_id: string;
|
|
109
|
+
report_sha256: string;
|
|
110
|
+
};
|
|
111
|
+
/** Compact binding only; raw prompts and results stay in the private artifact. */
|
|
112
|
+
reviewer_evidence?: ReviewerEvidenceDescriptor;
|
|
113
|
+
}
|
|
114
|
+
export interface ResolvedThresholds {
|
|
115
|
+
minConsensusScore: number;
|
|
116
|
+
minConfidence: number;
|
|
117
|
+
dedupeLineWindow: number;
|
|
118
|
+
jaccardThreshold: number;
|
|
119
|
+
}
|
|
120
|
+
export interface RunHeaderInput {
|
|
121
|
+
cycleId?: string;
|
|
122
|
+
id?: string;
|
|
123
|
+
rclVersion: string;
|
|
124
|
+
command: RunHeader['command'];
|
|
125
|
+
target: {
|
|
126
|
+
kind: TargetKind;
|
|
127
|
+
repo?: string;
|
|
128
|
+
prNumber?: number;
|
|
129
|
+
url?: string;
|
|
130
|
+
headSha?: string;
|
|
131
|
+
baseSha?: string;
|
|
132
|
+
headRef?: string;
|
|
133
|
+
baseRef?: string;
|
|
134
|
+
};
|
|
135
|
+
diff: Diff;
|
|
136
|
+
roster: RosterEntry[];
|
|
137
|
+
config: Config;
|
|
138
|
+
thresholds: ResolvedThresholds;
|
|
139
|
+
gating: ResolvedGatingConfig;
|
|
140
|
+
spec?: {
|
|
141
|
+
source: SpecSource;
|
|
142
|
+
sha256: string;
|
|
143
|
+
};
|
|
144
|
+
contextFiles?: Array<{
|
|
145
|
+
path: string;
|
|
146
|
+
sha256: string;
|
|
147
|
+
}>;
|
|
148
|
+
plan?: {
|
|
149
|
+
focus: string;
|
|
150
|
+
};
|
|
151
|
+
runner: RunnerClaim;
|
|
152
|
+
startedAt: Date;
|
|
153
|
+
finishedAt: Date;
|
|
154
|
+
ciExitCode: number;
|
|
155
|
+
converge?: ConvergeContext;
|
|
156
|
+
}
|
|
157
|
+
export declare function sha256Hex(data: string | Buffer): string;
|
|
158
|
+
/**
|
|
159
|
+
* JSON with object keys sorted at every level, so digests ignore key order.
|
|
160
|
+
* Values JSON cannot express (undefined, functions, symbols) serialize as
|
|
161
|
+
* `null` — the same as `JSON.stringify` does for them inside arrays — so the
|
|
162
|
+
* result is always a string and never the bare `undefined` JSON.stringify
|
|
163
|
+
* returns for a top-level non-value.
|
|
164
|
+
*/
|
|
165
|
+
export declare function stableStringify(value: unknown): string;
|
|
166
|
+
export declare function guardedInputSha256(value: Record<string, unknown>): string;
|
|
167
|
+
/**
|
|
168
|
+
* Digest of what the council actually read: every file's name, status,
|
|
169
|
+
* previous name and patch, sorted by filename so the value is independent of
|
|
170
|
+
* listing order. The serialization is JSON — every field delimited and
|
|
171
|
+
* escaped — so two distinct diffs cannot collide by sharing a separator
|
|
172
|
+
* character in a filename or patch line. Uniform across PR, patch, git and
|
|
173
|
+
* plan modes (PR mode has no raw diff).
|
|
174
|
+
*/
|
|
175
|
+
export declare function diffDigest(files: readonly FileChange[]): string;
|
|
176
|
+
/** Config fields that are credentials: never part of any digest. */
|
|
177
|
+
export declare const EXCLUDED_CONFIG_FIELDS: readonly ["githubToken", "harness"];
|
|
178
|
+
/**
|
|
179
|
+
* The config fields the digest covers — an explicit allow-list. Every key of
|
|
180
|
+
* `ConfigSchema` must appear either here or in `EXCLUDED_CONFIG_FIELDS`: the
|
|
181
|
+
* exhaustiveness assertion below turns a new field into a compile error until
|
|
182
|
+
* someone decides which list it belongs to, so a new setting can neither be
|
|
183
|
+
* silently dropped from the digest nor a new credential silently hashed.
|
|
184
|
+
*/
|
|
185
|
+
export declare const DIGESTED_CONFIG_FIELDS: readonly ["models", "secondaryModels", "asyncModels", "roles", "reviewers", "customRoles", "thresholds", "gating", "output", "timeout", "asyncTimeout", "quorumFraction", "maxRetries", "concurrency", "providerConcurrency", "reasoningEffort", "context", "spec", "focus"];
|
|
186
|
+
/** Canonical allow-listed, resolved config fields (never a credential). */
|
|
187
|
+
export declare function configIdentity(config: Config): string;
|
|
188
|
+
/** Digest shared by report headers, launch identity and original-policy proof. */
|
|
189
|
+
export declare function configDigest(config: Config): string;
|
|
190
|
+
/** A dispatched seat's lane: the council's own models block, the others are secondary. */
|
|
191
|
+
export declare function assignmentLane(model: string, coreModels: readonly string[], explicit?: boolean): 'blocking' | 'secondary';
|
|
192
|
+
export declare function buildRoster(input: {
|
|
193
|
+
assignments: readonly ReviewAssignment[];
|
|
194
|
+
asyncAssignments: readonly ReviewAssignment[];
|
|
195
|
+
/** The blocking council's own models (`config.models`); others are secondary. */
|
|
196
|
+
coreModels: readonly string[];
|
|
197
|
+
/** Explicit --reviewer pairs are exact manual control: all blocking. */
|
|
198
|
+
explicit?: boolean;
|
|
199
|
+
gating: ResolvedGatingConfig;
|
|
200
|
+
}): RosterEntry[];
|
|
201
|
+
export declare function detectRunner(env: Readonly<Record<string, string | undefined>>, hostname: string): RunnerClaim;
|
|
202
|
+
export declare function parseSpecSource(value: string): SpecSource;
|
|
203
|
+
/** A full Git object id: SHA-1 (40 hex) or SHA-256 repositories (64 hex). */
|
|
204
|
+
export declare const FULL_OBJECT_ID: RegExp;
|
|
205
|
+
/** Exact-head binding needs the full object id; abbreviations are ambiguous. */
|
|
206
|
+
export declare function validateSha(value: string, flag: string): string;
|
|
207
|
+
/**
|
|
208
|
+
* The converge loop's context for this round. Flags win over the
|
|
209
|
+
* `RCL_CONVERGE_*` environment the rcl-converge skill exports; without a
|
|
210
|
+
* target there is no converge context at all.
|
|
211
|
+
*/
|
|
212
|
+
export declare function resolveConvergeContext(flags: {
|
|
213
|
+
convergeTarget?: string;
|
|
214
|
+
round?: string;
|
|
215
|
+
attempt?: string;
|
|
216
|
+
}, env: Readonly<Record<string, string | undefined>>): ConvergeContext | undefined;
|
|
217
|
+
/** One human-readable phrase for status lines and the Markdown header. */
|
|
218
|
+
export declare function describeRunTarget(target: RunTarget): string;
|
|
219
|
+
export declare function buildRunHeader(input: RunHeaderInput): RunHeader;
|