@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,208 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { decodeRecoveryOriginal as decodeOriginalReport } from './recovery-json.js';
|
|
4
|
+
import { claimDescriptorSchema } from './claims.js';
|
|
5
|
+
import { instant, object, uuidSchema } from './primitives.js';
|
|
6
|
+
import { isEventReceiptScope, isStoredEventReceipt } from './receipts.js';
|
|
7
|
+
import { validSightingBinding } from './sighting.js';
|
|
8
|
+
export const hash = (raw) => createHash('sha256').update(raw).digest('hex');
|
|
9
|
+
export const key = (v) => typeof v === 'string' && /^[a-f0-9]{16}$/.test(v);
|
|
10
|
+
export const counter = (v) => typeof v === 'number' && Number.isSafeInteger(v) && v >= 0;
|
|
11
|
+
const positive = (v) => counter(v) && v > 0 && v <= 2_147_483_647;
|
|
12
|
+
export function requireSource(valid) { if (!valid)
|
|
13
|
+
throw new Error('occurrence_source_conflict'); }
|
|
14
|
+
export function requireReason(value) {
|
|
15
|
+
requireSource(typeof value === 'string' && value.length <= 4000 && value.trim().length > 0 && [...value].length <= 2000 &&
|
|
16
|
+
!/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/.test(value) && !/[\uD800-\uDFFF]/u.test(value));
|
|
17
|
+
}
|
|
18
|
+
/** Selected receipt content, not authentication or proof of inventory completeness. */
|
|
19
|
+
export function receiptFor(receipt, source) {
|
|
20
|
+
requireSource(isStoredEventReceipt(receipt, source.input.scope) && receipt.converge_target === source.target &&
|
|
21
|
+
receipt.round === source.round);
|
|
22
|
+
const converge = source.input.storedRun.converge;
|
|
23
|
+
if (receipt.attempt !== null)
|
|
24
|
+
requireSource(receipt.attempt === converge.attempt);
|
|
25
|
+
}
|
|
26
|
+
/** Sequence is per run; timestamps retain microseconds and never use client occurred_at for acceptance order. */
|
|
27
|
+
export function before(first, last) {
|
|
28
|
+
requireSource(first.run_id === last.run_id && first.sequence < last.sequence &&
|
|
29
|
+
BigInt(instant(first.received_at)) <= BigInt(instant(last.received_at)));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Bind supplied original bytes to every stored positional finding and selected
|
|
33
|
+
* classification. Unsupported headerless/reversed-range sources refuse; this
|
|
34
|
+
* helper neither normalizes their history nor claims to fetch/authenticate it.
|
|
35
|
+
*/
|
|
36
|
+
export function validateOccurrenceSource(input) {
|
|
37
|
+
requireSource(isEventReceiptScope(input.scope) && input.scope.repo.length <= 200 && positive(input.scope.pr_number) &&
|
|
38
|
+
typeof input.reportJson === 'string' && Buffer.byteLength(input.reportJson) <= 64 * 1024 * 1024);
|
|
39
|
+
const decoded = decodeOriginalReport(input.reportJson, { exactNumbers: true, originalProse: 'control-code-units-v1' });
|
|
40
|
+
requireSource(object(decoded.value));
|
|
41
|
+
const report = decoded.value;
|
|
42
|
+
const run = report.run;
|
|
43
|
+
const stored = input.storedRun;
|
|
44
|
+
requireSource(object(run) && object(stored) && run.id === input.scope.run_id && stored.id === run.id &&
|
|
45
|
+
object(run.target) && object(stored.target) && object(run.converge) && object(stored.converge));
|
|
46
|
+
const target = run.target;
|
|
47
|
+
const storedTarget = stored.target;
|
|
48
|
+
const converge = run.converge;
|
|
49
|
+
const storedConverge = stored.converge;
|
|
50
|
+
requireSource(['pr', 'patch'].includes(run.target.kind) && run.target.repo === input.scope.repo &&
|
|
51
|
+
run.target.pr_number === input.scope.pr_number && typeof run.target.head_sha === 'string' &&
|
|
52
|
+
/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/.test(run.target.head_sha) && !/^0+$/.test(run.target.head_sha) &&
|
|
53
|
+
['kind', 'repo', 'pr_number', 'head_sha', 'base_sha', 'diff_sha256'].every(field => isDeepStrictEqual(target[field] ?? null, storedTarget[field] ?? null)) &&
|
|
54
|
+
['rcl_version', 'command'].every(field => typeof run[field] === 'string' && run[field] === stored[field]));
|
|
55
|
+
requireSource(typeof run.converge.target === 'string' && run.converge.target.trim() === run.converge.target &&
|
|
56
|
+
run.converge.target.length > 0 && run.converge.target.length <= 500 && positive(run.converge.round) &&
|
|
57
|
+
['target', 'round', 'attempt'].every(field => isDeepStrictEqual(converge[field] ?? null, storedConverge[field] ?? null)));
|
|
58
|
+
const digest = hash(input.reportJson);
|
|
59
|
+
requireSource(Array.isArray(stored.artifacts));
|
|
60
|
+
const originals = stored.artifacts.filter(a => object(a) && a.kind === 'report_json');
|
|
61
|
+
requireSource(originals.length === 1 && originals[0].declared_sha256 === digest && originals[0].stored === true &&
|
|
62
|
+
originals[0].declared_bytes === Buffer.byteLength(input.reportJson));
|
|
63
|
+
requireSource(Array.isArray(report.findings) && (report.belowThresholdFindings === undefined || Array.isArray(report.belowThresholdFindings)));
|
|
64
|
+
const kept = report.findings;
|
|
65
|
+
const below = report.belowThresholdFindings ?? [];
|
|
66
|
+
requireSource(kept.length + below.length <= 2000);
|
|
67
|
+
const all = [...kept, ...below];
|
|
68
|
+
requireSource(Array.isArray(stored.findings) && stored.findings.length === all.length);
|
|
69
|
+
const storedMembers = new Map();
|
|
70
|
+
for (const member of stored.findings) {
|
|
71
|
+
requireSource(object(member) && typeof member.ref === 'string' && !storedMembers.has(member.ref));
|
|
72
|
+
storedMembers.set(member.ref, member);
|
|
73
|
+
}
|
|
74
|
+
const out = { input, digest, head: run.target.head_sha,
|
|
75
|
+
target: run.converge.target, round: run.converge.round, members: [] };
|
|
76
|
+
receiptFor(input.classification, out);
|
|
77
|
+
requireSource(input.classification.kind === 'round_processed' && Array.isArray(input.classification.payload.identities));
|
|
78
|
+
const payload = input.classification.payload;
|
|
79
|
+
const rows = payload.identities;
|
|
80
|
+
requireSource(rows.length <= 2000);
|
|
81
|
+
const declared = Object.hasOwn(payload, 'classification_version') || Object.hasOwn(payload, 'legacy_pending_identities');
|
|
82
|
+
if (Object.hasOwn(payload, 'report_json_sha256'))
|
|
83
|
+
requireSource(payload.report_json_sha256 === digest);
|
|
84
|
+
if (declared)
|
|
85
|
+
requireSource(payload.classification_version === 1 && payload.report_json_sha256 === digest && rows.length === all.length);
|
|
86
|
+
if (Object.hasOwn(payload, 'legacy_pending_identities')) {
|
|
87
|
+
const ids = payload.legacy_pending_identities;
|
|
88
|
+
requireSource(Array.isArray(ids) && ids.length > 0 && ids.length <= 2000 && ids.every(key) &&
|
|
89
|
+
isDeepStrictEqual(ids, [...new Set(ids)].sort()));
|
|
90
|
+
}
|
|
91
|
+
const occurrenceCounts = new Map();
|
|
92
|
+
for (const raw of all) {
|
|
93
|
+
requireSource(object(raw) && typeof raw.identity === 'string');
|
|
94
|
+
occurrenceCounts.set(raw.identity, (occurrenceCounts.get(raw.identity) ?? 0) + 1);
|
|
95
|
+
}
|
|
96
|
+
const boundMappings = new Map();
|
|
97
|
+
const unboundMappings = new Map();
|
|
98
|
+
for (const [order, row] of rows.entries()) {
|
|
99
|
+
requireSource(object(row) && typeof row.identity_key === 'string' && key(row.matched_identity) &&
|
|
100
|
+
['new', 'repeat', 'suppressed', 'regating'].includes(row.status) &&
|
|
101
|
+
occurrenceCounts.has(row.identity_key));
|
|
102
|
+
const bound = declared || ['version', 'finding_ref', 'report_json_sha256'].some(field => Object.hasOwn(row, field));
|
|
103
|
+
if (bound) {
|
|
104
|
+
requireSource(validSightingBinding(row) && Object.hasOwn(row, 'pending_round') &&
|
|
105
|
+
(row.pending_round === null || positive(row.pending_round) && row.pending_round <= out.round));
|
|
106
|
+
const ref = row.finding_ref;
|
|
107
|
+
const index = Number(ref.slice(1)) - 1;
|
|
108
|
+
requireSource(Number.isSafeInteger(index) && ref === `f${String(index + 1).padStart(3, '0')}` && !boundMappings.has(ref) &&
|
|
109
|
+
object(all[index]) && row.identity_key === all[index].identity && row.report_json_sha256 === digest &&
|
|
110
|
+
isDeepStrictEqual(row.claim_descriptor, all[index].claimDescriptor));
|
|
111
|
+
boundMappings.set(ref, { row, order });
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const group = unboundMappings.get(row.identity_key);
|
|
115
|
+
if (group) {
|
|
116
|
+
if (group.identity !== row.matched_identity)
|
|
117
|
+
group.identity = undefined;
|
|
118
|
+
group.hasDescriptor ||= row.claim_descriptor !== undefined;
|
|
119
|
+
group.descriptorsAgree &&= isDeepStrictEqual(group.row.claim_descriptor, row.claim_descriptor);
|
|
120
|
+
group.statusesAgree &&= group.row.status === row.status;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
unboundMappings.set(row.identity_key, { row, order, identity: row.matched_identity,
|
|
124
|
+
hasDescriptor: row.claim_descriptor !== undefined, descriptorsAgree: true, statusesAgree: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const [index, raw] of all.entries()) {
|
|
129
|
+
const ref = `f${String(index + 1).padStart(3, '0')}`;
|
|
130
|
+
const member = storedMembers.get(ref);
|
|
131
|
+
requireSource(object(raw) && member && typeof raw.identity === 'string' && raw.identity.length > 0 && raw.identity.length <= 64 &&
|
|
132
|
+
typeof raw.file === 'string' && typeof raw.category === 'string' && counter(raw.startLine) && counter(raw.endLine) && raw.startLine <= raw.endLine &&
|
|
133
|
+
['critical', 'important', 'minor', 'nitpick'].includes(raw.severity) &&
|
|
134
|
+
(raw.gating === undefined || object(raw.gating) && typeof raw.gating.reason === 'string'));
|
|
135
|
+
const gating = object(raw.gating) ? raw.gating : {};
|
|
136
|
+
requireSource(member.identity_key === raw.identity && member.file === raw.file && member.category === raw.category &&
|
|
137
|
+
member.start_line === raw.startLine && member.end_line === raw.endLine && member.severity === raw.severity &&
|
|
138
|
+
member.below_threshold === (index >= kept.length) && member.gating_reason === (gating.reason ?? 'none') &&
|
|
139
|
+
member.verification_verdict === (object(gating.verification) ? gating.verification.verdict ?? null : null) &&
|
|
140
|
+
Object.hasOwn(member, 'claim_descriptor') && isDeepStrictEqual(member.claim_descriptor, raw.claimDescriptor ?? null));
|
|
141
|
+
if (raw.claimDescriptor !== undefined)
|
|
142
|
+
requireSource(claimDescriptorSchema.safeParse(raw.claimDescriptor).success);
|
|
143
|
+
const bound = boundMappings.get(ref);
|
|
144
|
+
const unbound = unboundMappings.get(raw.identity);
|
|
145
|
+
// Preserve the first receipt row while summarizing duplicate unbound rows
|
|
146
|
+
// once, so shared report identities do not require repeated receipt scans.
|
|
147
|
+
const mapping = !bound ? unbound?.row : !unbound || bound.order < unbound.order ? bound.row : unbound.row;
|
|
148
|
+
const ambiguous = unbound && (occurrenceCounts.get(raw.identity) > 1 || unbound.identity === undefined ||
|
|
149
|
+
bound && bound.row.matched_identity !== unbound.identity);
|
|
150
|
+
// A single association cannot inherit whichever contradictory status was
|
|
151
|
+
// listed first. An identity-only correction cannot settle that conflict.
|
|
152
|
+
if (unbound && !ambiguous)
|
|
153
|
+
requireSource(unbound.statusesAgree &&
|
|
154
|
+
(!bound || bound.row.status === unbound.row.status));
|
|
155
|
+
const unresolvedReason = mapping === undefined ? 'classification-unavailable' :
|
|
156
|
+
ambiguous ? 'classification-ambiguous' : undefined;
|
|
157
|
+
// Released unmarked classifications may cover kept findings only. Preserve
|
|
158
|
+
// every original appendix member without inventing its native association.
|
|
159
|
+
// Declared snapshots, in contrast, promise complete positional membership.
|
|
160
|
+
requireSource(!declared || unresolvedReason === undefined);
|
|
161
|
+
if (unbound?.hasDescriptor || bound?.row.claim_descriptor !== undefined)
|
|
162
|
+
requireSource((!unbound || unbound.descriptorsAgree && isDeepStrictEqual(unbound.row.claim_descriptor, raw.claimDescriptor)) &&
|
|
163
|
+
(!bound || isDeepStrictEqual(bound.row.claim_descriptor, raw.claimDescriptor)));
|
|
164
|
+
const statusesAgree = !unbound || unbound.statusesAgree && (!bound || bound.row.status === unbound.row.status);
|
|
165
|
+
const classificationStanding = statusesAgree && !ambiguous && mapping ?
|
|
166
|
+
{ kind: 'known', status: mapping.status } :
|
|
167
|
+
statusesAgree && unbound ? { kind: 'known', status: unbound.row.status } :
|
|
168
|
+
{ kind: 'unknown' };
|
|
169
|
+
out.members.push({ ref, raw, stored: member, classificationStanding,
|
|
170
|
+
...(unresolvedReason ? { unresolvedReason } : { mapping: mapping, identity: mapping.matched_identity }),
|
|
171
|
+
severity: raw.severity, gating: index >= kept.length ? 'none' : (gating.reason ??
|
|
172
|
+
(['critical', 'important'].includes(raw.severity) ? 'legacy-blocking' : 'none')) });
|
|
173
|
+
}
|
|
174
|
+
requireSource(Array.isArray(input.corrections) && input.corrections.length <= all.length);
|
|
175
|
+
const corrected = new Set();
|
|
176
|
+
const ids = new Set([input.classification.id]);
|
|
177
|
+
for (const receipt of input.corrections) {
|
|
178
|
+
receiptFor(receipt, out);
|
|
179
|
+
before(input.classification, receipt);
|
|
180
|
+
const p = receipt.payload;
|
|
181
|
+
const member = out.members.find(m => m.ref === p.finding_ref);
|
|
182
|
+
requireSource(receipt.kind === 'finding_identity_corrected' && uuidSchema.safeParse(receipt.actor_user_id).success &&
|
|
183
|
+
!ids.has(receipt.id) && member && !corrected.has(member.ref) && p.report_json_sha256 === digest &&
|
|
184
|
+
p.identity_key === member.raw.identity && key(p.matched_identity));
|
|
185
|
+
for (const [field, expected] of Object.entries({ org_id: input.scope.org_id, repo: input.scope.repo,
|
|
186
|
+
pr_number: input.scope.pr_number, head_sha: out.head })) {
|
|
187
|
+
requireSource(p[field] === expected);
|
|
188
|
+
}
|
|
189
|
+
member.identity = p.matched_identity;
|
|
190
|
+
member.correction = receipt;
|
|
191
|
+
delete member.unresolvedReason;
|
|
192
|
+
corrected.add(member.ref);
|
|
193
|
+
ids.add(receipt.id);
|
|
194
|
+
}
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
export function contextFor(context, source, actor) {
|
|
198
|
+
requireSource(isDeepStrictEqual(context.scope, source.input.scope) && context.target === source.target && context.round === source.round &&
|
|
199
|
+
context.headSha === source.head && context.reportSha256 === source.digest && counter(context.eventSequence) &&
|
|
200
|
+
uuidSchema.safeParse(actor).success && context.actorUserId === actor);
|
|
201
|
+
for (const receipt of [source.input.classification, ...source.input.corrections])
|
|
202
|
+
requireSource(receipt.sequence <= context.eventSequence);
|
|
203
|
+
}
|
|
204
|
+
export function sameTarget(a, b) {
|
|
205
|
+
requireSource(a.input.scope.base_url === b.input.scope.base_url && a.input.scope.org_id === b.input.scope.org_id &&
|
|
206
|
+
a.input.scope.repo.toLowerCase() === b.input.scope.repo.toLowerCase() && a.input.scope.pr_number === b.input.scope.pr_number && a.target === b.target);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=occurrence-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"occurrence-source.js","sourceRoot":"","sources":["../../../../src/evidence/claim-recovery/validation/occurrence-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ClaimSplitInput } from './claim-split.js';
|
|
2
|
+
import type { RetainedNativeEvidence } from './native-state.js';
|
|
3
|
+
import type { EventReceiptScope, StoredEventReceipt } from './receipts.js';
|
|
4
|
+
/** Supplied read results; content validation does not authenticate their transport. */
|
|
5
|
+
export interface OccurrenceSource {
|
|
6
|
+
scope: EventReceiptScope;
|
|
7
|
+
reportJson: string;
|
|
8
|
+
storedRun: Record<string, unknown>;
|
|
9
|
+
classification: StoredEventReceipt;
|
|
10
|
+
corrections: StoredEventReceipt[];
|
|
11
|
+
}
|
|
12
|
+
/** Pin the selection alongside the result of a fresh current-actor/context read. */
|
|
13
|
+
export interface OccurrenceContext {
|
|
14
|
+
scope: EventReceiptScope;
|
|
15
|
+
target: string;
|
|
16
|
+
round: number;
|
|
17
|
+
headSha: string;
|
|
18
|
+
reportSha256: string;
|
|
19
|
+
actorUserId: string;
|
|
20
|
+
eventSequence: number;
|
|
21
|
+
}
|
|
22
|
+
export interface AcceptedSplitEvidence {
|
|
23
|
+
selection: ClaimSplitInput;
|
|
24
|
+
receipt: StoredEventReceipt;
|
|
25
|
+
actorUserId: string;
|
|
26
|
+
native: RetainedNativeEvidence;
|
|
27
|
+
source: OccurrenceSource;
|
|
28
|
+
}
|
|
29
|
+
interface Preparation {
|
|
30
|
+
eventId: string;
|
|
31
|
+
occurredAt: string;
|
|
32
|
+
/** Pinned current operator, distinct from historical classification/split actors. */
|
|
33
|
+
actorUserId: string;
|
|
34
|
+
split: AcceptedSplitEvidence;
|
|
35
|
+
sourceContext: OccurrenceContext;
|
|
36
|
+
}
|
|
37
|
+
export interface ObligationTransferInput extends Preparation {
|
|
38
|
+
carrier: OccurrenceSource;
|
|
39
|
+
carrierContext: OccurrenceContext;
|
|
40
|
+
carrierKind: 'classified_group' | 'legacy_pending';
|
|
41
|
+
carrierIdentity: string;
|
|
42
|
+
reason: string;
|
|
43
|
+
}
|
|
44
|
+
export type ClaimSeverity = 'critical' | 'important' | 'minor' | 'nitpick';
|
|
45
|
+
export interface ClaimDispositionInput extends Preparation {
|
|
46
|
+
mode: 'fresh' | 'preserved';
|
|
47
|
+
verdict: 'fixed' | 'dismissed';
|
|
48
|
+
severity: ClaimSeverity;
|
|
49
|
+
reason: string;
|
|
50
|
+
/** A server CAS precondition; this supplied view cannot prove no newer decision exists. */
|
|
51
|
+
previousDispositionEventId: string | null;
|
|
52
|
+
previousDisposition?: StoredEventReceipt;
|
|
53
|
+
/** Exact later classified batches; never an asserted effective severity alone.
|
|
54
|
+
* The authoritative backend still checks history not present in this selection. */
|
|
55
|
+
laterSources?: OccurrenceSource[];
|
|
56
|
+
originalVerdict?: StoredEventReceipt;
|
|
57
|
+
originalVerdictActorUserId?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface RecoveryOccurrenceEvent {
|
|
60
|
+
id: string;
|
|
61
|
+
kind: 'finding_obligation_transferred' | 'finding_claim_disposition';
|
|
62
|
+
run_id: string;
|
|
63
|
+
converge_target: string;
|
|
64
|
+
round: number;
|
|
65
|
+
occurred_at: string;
|
|
66
|
+
payload: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export interface ReceiptAttribution {
|
|
69
|
+
eventId: string;
|
|
70
|
+
actorUserId: string | null;
|
|
71
|
+
occurredAt: string;
|
|
72
|
+
receivedAt: string;
|
|
73
|
+
sequence: number;
|
|
74
|
+
}
|
|
75
|
+
export interface PreparedOccurrenceEvent {
|
|
76
|
+
event: RecoveryOccurrenceEvent;
|
|
77
|
+
qualification: 'content-only';
|
|
78
|
+
assertingActorUserId: string;
|
|
79
|
+
splitAttribution: ReceiptAttribution;
|
|
80
|
+
originalVerdictAttribution?: ReceiptAttribution;
|
|
81
|
+
/** Fresh assertion time cannot exist until the server accepts the event. */
|
|
82
|
+
assertionReceipt: {
|
|
83
|
+
kind: 'pending-server-receipt';
|
|
84
|
+
} | {
|
|
85
|
+
kind: 'preserved';
|
|
86
|
+
receipt: ReceiptAttribution;
|
|
87
|
+
};
|
|
88
|
+
/** Only the selected occurrence is transferred; this is never key retirement. */
|
|
89
|
+
coverage: 'one-occurrence';
|
|
90
|
+
/** Unknown mappings stay explicit. Unselected known members are also untouched;
|
|
91
|
+
* this is not a complete carrier residual inventory or a closure assertion. */
|
|
92
|
+
unresolvedMembers: Array<{
|
|
93
|
+
runId: string;
|
|
94
|
+
target: string;
|
|
95
|
+
reportSha256: string;
|
|
96
|
+
findingRef: string;
|
|
97
|
+
reportKey: string;
|
|
98
|
+
reason: 'classification-unavailable' | 'classification-ambiguous';
|
|
99
|
+
}>;
|
|
100
|
+
}
|
|
101
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"occurrence-types.js","sourceRoot":"","sources":["../../../../src/evidence/claim-recovery/validation/occurrence-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type StoredEventReceipt } from './receipts.js';
|
|
2
|
+
import { type OccurrenceMember, type ValidatedOccurrenceSource } from './occurrence-source.js';
|
|
3
|
+
import type { ClaimDispositionInput, ObligationTransferInput, PreparedOccurrenceEvent } from './occurrence-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Prepare one immutable occurrence transfer. Selected read authenticity, fresh
|
|
6
|
+
* context, source inventory completeness, server CAS/selector uniqueness and
|
|
7
|
+
* physical filesystem qualification remain outer obligations. No prefix
|
|
8
|
+
* closure, key retirement, gate standing or delivery is asserted here.
|
|
9
|
+
*/
|
|
10
|
+
export declare function prepareObligationTransfer(input: ObligationTransferInput): PreparedOccurrenceEvent;
|
|
11
|
+
/**
|
|
12
|
+
* Prepare an attributed decision without fabricating its future server receipt.
|
|
13
|
+
* Preserved mode additionally proves exact descriptor equality for the entire
|
|
14
|
+
* original co-key family; bare keys and fuzzy paraphrases are insufficient.
|
|
15
|
+
* This does not confirm a fixed claim or project any native/server obligation.
|
|
16
|
+
*/
|
|
17
|
+
export declare function prepareClaimDisposition(input: ClaimDispositionInput): PreparedOccurrenceEvent;
|
|
18
|
+
/** Prove the retained original decision's full subject before any recovery POST.
|
|
19
|
+
* This does not fabricate or predict a split receipt or authorize delivery. */
|
|
20
|
+
export declare function validatePreservedDispositionSubject(input: {
|
|
21
|
+
source: ValidatedOccurrenceSource;
|
|
22
|
+
member: OccurrenceMember;
|
|
23
|
+
descriptor: unknown;
|
|
24
|
+
eventId: string;
|
|
25
|
+
verdict: string;
|
|
26
|
+
severity: string;
|
|
27
|
+
reason: string;
|
|
28
|
+
originalVerdict?: StoredEventReceipt;
|
|
29
|
+
originalVerdictActorUserId?: string;
|
|
30
|
+
}): void;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { prepareClaimSplit } from './claim-split.js';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { matchesPreparedEventReceipt } from './receipts.js';
|
|
4
|
+
import { claimDescriptorSchema } from './claims.js';
|
|
5
|
+
import { validateRetainedNativeEvidence } from './native-state.js';
|
|
6
|
+
import { instant, object, uuidSchema } from './primitives.js';
|
|
7
|
+
import { scrubDeep } from '../../../telemetry/scrub.js';
|
|
8
|
+
import { before, contextFor, counter, key, receiptFor, requireReason, requireSource, sameTarget, validateOccurrenceSource } from './occurrence-source.js';
|
|
9
|
+
function attribution(receipt) {
|
|
10
|
+
return { eventId: receipt.id, actorUserId: receipt.actor_user_id, occurredAt: receipt.occurred_at,
|
|
11
|
+
receivedAt: receipt.received_at, sequence: receipt.sequence };
|
|
12
|
+
}
|
|
13
|
+
function split(input) {
|
|
14
|
+
requireSource(uuidSchema.safeParse(input.eventId).success && uuidSchema.safeParse(input.actorUserId).success);
|
|
15
|
+
instant(input.occurredAt);
|
|
16
|
+
requireReason(input.reason);
|
|
17
|
+
const source = validateOccurrenceSource(input.split.source);
|
|
18
|
+
contextFor(input.sourceContext, source, input.actorUserId);
|
|
19
|
+
const selection = input.split.selection;
|
|
20
|
+
requireSource(isDeepStrictEqual(source.input.scope, selection.scope) && source.input.reportJson === selection.reportJson &&
|
|
21
|
+
selection.target === source.target && selection.classificationId === source.input.classification.id &&
|
|
22
|
+
input.split.native.sourceJson === selection.nativeJson && input.split.native.target === selection.target &&
|
|
23
|
+
isDeepStrictEqual(input.split.native.nativeSourceJsons ?? [], selection.nativeSourceJsons ?? []) &&
|
|
24
|
+
isDeepStrictEqual(input.split.native.recoveryMaterials ?? [], selection.recoveryMaterials ?? []));
|
|
25
|
+
validateRetainedNativeEvidence(input.split.native);
|
|
26
|
+
const prepared = prepareClaimSplit(input.split.selection);
|
|
27
|
+
const member = source.members.find(m => m.ref === selection.findingRef);
|
|
28
|
+
requireSource(member && !member.unresolvedReason && member.identity === selection.previousIdentity &&
|
|
29
|
+
(member.correction?.id ?? null) === (selection.correctionId ?? null));
|
|
30
|
+
const receipts = [source.input.classification, ...(member.correction ? [member.correction] : [])];
|
|
31
|
+
requireSource(isDeepStrictEqual(selection.sourceReceipts, receipts));
|
|
32
|
+
receiptFor(input.split.receipt, source);
|
|
33
|
+
requireSource(matchesPreparedEventReceipt(input.split.receipt, JSON.stringify(prepared.event), selection.scope, input.split.actorUserId) && input.split.receipt.sequence > selection.expectedEventSequence &&
|
|
34
|
+
input.split.receipt.sequence <= input.sourceContext.eventSequence);
|
|
35
|
+
for (const receipt of receipts) {
|
|
36
|
+
requireSource(receipt.sequence <= selection.expectedEventSequence);
|
|
37
|
+
before(receipt, input.split.receipt);
|
|
38
|
+
}
|
|
39
|
+
requireSource(![...source.input.corrections, source.input.classification, input.split.receipt].some(r => r.id === input.eventId));
|
|
40
|
+
return { prepared, source, member };
|
|
41
|
+
}
|
|
42
|
+
function result(input, event, sources) {
|
|
43
|
+
requireSource(isDeepStrictEqual(scrubDeep(event), event));
|
|
44
|
+
const unknown = sources.flatMap(source => source.members.flatMap(member => {
|
|
45
|
+
const reason = member.unresolvedReason ??
|
|
46
|
+
(member.classificationStanding.kind === 'unknown' ? 'classification-ambiguous' : undefined);
|
|
47
|
+
return reason ? [{
|
|
48
|
+
runId: source.input.scope.run_id, target: source.target, reportSha256: source.digest, findingRef: member.ref,
|
|
49
|
+
reportKey: member.raw.identity, reason,
|
|
50
|
+
}] : [];
|
|
51
|
+
}));
|
|
52
|
+
return structuredClone({ event, qualification: 'content-only', coverage: 'one-occurrence', assertingActorUserId: input.actorUserId,
|
|
53
|
+
splitAttribution: attribution(input.split.receipt), assertionReceipt: { kind: 'pending-server-receipt' },
|
|
54
|
+
unresolvedMembers: [...new Map(unknown.map(member => [JSON.stringify(member), member])).values()] });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Prepare one immutable occurrence transfer. Selected read authenticity, fresh
|
|
58
|
+
* context, source inventory completeness, server CAS/selector uniqueness and
|
|
59
|
+
* physical filesystem qualification remain outer obligations. No prefix
|
|
60
|
+
* closure, key retirement, gate standing or delivery is asserted here.
|
|
61
|
+
*/
|
|
62
|
+
export function prepareObligationTransfer(input) {
|
|
63
|
+
try {
|
|
64
|
+
return transfer(input);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new Error('occurrence_transfer_source_conflict');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function transfer(input) {
|
|
71
|
+
const { prepared, source: original } = split(input);
|
|
72
|
+
const source = prepared.source;
|
|
73
|
+
const scope = input.carrierContext.scope;
|
|
74
|
+
const carrier = validateOccurrenceSource(input.carrier);
|
|
75
|
+
contextFor(input.carrierContext, carrier, input.actorUserId);
|
|
76
|
+
sameTarget(carrier, original);
|
|
77
|
+
requireSource(key(input.carrierIdentity) && input.carrierIdentity === source.previousIdentity &&
|
|
78
|
+
input.eventId !== carrier.input.classification.id && !carrier.input.corrections.some(r => r.id === input.eventId));
|
|
79
|
+
if (scope.run_id === original.input.scope.run_id) {
|
|
80
|
+
requireSource(isDeepStrictEqual(input.carrierContext, input.sourceContext) && isDeepStrictEqual(input.carrier, input.split.source));
|
|
81
|
+
}
|
|
82
|
+
if (input.carrierKind === 'classified_group') {
|
|
83
|
+
requireSource(scope.run_id === source.runId && carrier.digest === source.reportSha256 &&
|
|
84
|
+
carrier.input.classification.id === input.split.selection.classificationId &&
|
|
85
|
+
carrier.members.some(m => m.ref === source.findingRef && m.identity === input.carrierIdentity));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
requireSource(input.carrierKind === 'legacy_pending' && carrier.round >= original.round &&
|
|
89
|
+
carrier.input.classification.payload.classification_version === 1 &&
|
|
90
|
+
Array.isArray(carrier.input.classification.payload.legacy_pending_identities) &&
|
|
91
|
+
carrier.input.classification.payload.legacy_pending_identities.includes(input.carrierIdentity));
|
|
92
|
+
}
|
|
93
|
+
const payload = { version: 1, org_id: scope.org_id, repo: scope.repo, pr_number: scope.pr_number,
|
|
94
|
+
head_sha: input.carrierContext.headSha, report_json_sha256: input.carrierContext.reportSha256,
|
|
95
|
+
expected_event_sequence: input.carrierContext.eventSequence,
|
|
96
|
+
carrier: { kind: input.carrierKind, classification_event_id: input.carrier.classification.id, identity_key: input.carrierIdentity },
|
|
97
|
+
source: { run_id: source.runId, round: source.round, head_sha: input.sourceContext.headSha,
|
|
98
|
+
report_json_sha256: source.reportSha256, classification_event_id: input.split.selection.classificationId,
|
|
99
|
+
correction_event_id: input.split.selection.correctionId ?? null, finding_ref: source.findingRef,
|
|
100
|
+
identity_key: source.reportKey, previous_identity: source.previousIdentity },
|
|
101
|
+
split_event_id: input.split.receipt.id, claim_identity: input.split.selection.identity,
|
|
102
|
+
expected_source_event_sequence: input.sourceContext.eventSequence,
|
|
103
|
+
native_evidence: prepared.event.payload.native_evidence, reason: input.reason };
|
|
104
|
+
return result(input, { id: input.eventId, kind: 'finding_obligation_transferred', run_id: scope.run_id,
|
|
105
|
+
converge_target: input.carrierContext.target, round: input.carrierContext.round, occurred_at: input.occurredAt, payload }, [original, carrier]);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Prepare an attributed decision without fabricating its future server receipt.
|
|
109
|
+
* Preserved mode additionally proves exact descriptor equality for the entire
|
|
110
|
+
* original co-key family; bare keys and fuzzy paraphrases are insufficient.
|
|
111
|
+
* This does not confirm a fixed claim or project any native/server obligation.
|
|
112
|
+
*/
|
|
113
|
+
export function prepareClaimDisposition(input) {
|
|
114
|
+
try {
|
|
115
|
+
return disposition(input);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new Error('occurrence_disposition_source_conflict');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function disposition(input) {
|
|
122
|
+
const { prepared, source: original, member } = split(input);
|
|
123
|
+
const source = prepared.source;
|
|
124
|
+
const scope = input.sourceContext.scope;
|
|
125
|
+
requireSource(['fresh', 'preserved'].includes(input.mode) && ['fixed', 'dismissed'].includes(input.verdict) &&
|
|
126
|
+
['critical', 'important', 'minor', 'nitpick'].includes(input.severity));
|
|
127
|
+
const effectiveSeverity = severity(input, original, member);
|
|
128
|
+
requireSource(effectiveSeverity !== 'critical' || input.severity === 'critical');
|
|
129
|
+
previousDisposition(input, original);
|
|
130
|
+
if (input.mode === 'preserved')
|
|
131
|
+
preservedVerdict(input, original, member);
|
|
132
|
+
else
|
|
133
|
+
requireSource(input.originalVerdict === undefined && input.originalVerdictActorUserId === undefined);
|
|
134
|
+
const payload = { version: 1, org_id: scope.org_id, repo: scope.repo, pr_number: scope.pr_number,
|
|
135
|
+
head_sha: input.sourceContext.headSha, report_json_sha256: source.reportSha256, expected_event_sequence: input.sourceContext.eventSequence,
|
|
136
|
+
finding_ref: source.findingRef, identity_key: source.reportKey, split_event_id: input.split.receipt.id,
|
|
137
|
+
claim_identity: input.split.selection.identity, previous_disposition_event_id: input.previousDispositionEventId,
|
|
138
|
+
mode: input.mode, verdict: input.verdict, severity: input.severity, reason: input.reason,
|
|
139
|
+
...(input.mode === 'preserved' ? { original_verdict: { run_id: source.runId, event_id: input.originalVerdict.id,
|
|
140
|
+
identity_key: source.previousIdentity, classification_event_id: input.split.selection.classificationId,
|
|
141
|
+
report_json_sha256: source.reportSha256, finding_ref: source.findingRef } } : {}) };
|
|
142
|
+
const out = result(input, { id: input.eventId, kind: 'finding_claim_disposition', run_id: scope.run_id,
|
|
143
|
+
converge_target: source.target, round: source.round, occurred_at: input.occurredAt, payload }, [original]);
|
|
144
|
+
if (input.mode === 'preserved') {
|
|
145
|
+
out.originalVerdictAttribution = attribution(input.originalVerdict);
|
|
146
|
+
out.assertionReceipt = { kind: 'preserved', receipt: out.originalVerdictAttribution };
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
function severity(input, source, member) {
|
|
151
|
+
let effective = member.severity;
|
|
152
|
+
const batches = (input.laterSources ?? []).map(validateOccurrenceSource).sort((a, b) => a.round - b.round);
|
|
153
|
+
const rounds = new Set();
|
|
154
|
+
for (const batch of batches) {
|
|
155
|
+
sameTarget(source, batch);
|
|
156
|
+
requireSource(batch.round > source.round && !rounds.has(batch.round) &&
|
|
157
|
+
batch.input.scope.run_id !== source.input.scope.run_id && batch.input.classification.payload.classification_version === 1 &&
|
|
158
|
+
BigInt(instant(batch.input.classification.received_at)) >= BigInt(instant(input.split.receipt.received_at)));
|
|
159
|
+
rounds.add(batch.round);
|
|
160
|
+
const sightings = batch.members.filter(m => m.identity === input.split.selection.identity);
|
|
161
|
+
requireSource(sightings.length > 0 && sightings.every(m => isDeepStrictEqual(m.raw.claimDescriptor, input.split.selection.descriptor)));
|
|
162
|
+
const gated = sightings.filter(m => m.gating !== 'none');
|
|
163
|
+
if (gated.length)
|
|
164
|
+
effective = ['critical', 'important', 'minor', 'nitpick'].find(s => gated.some(m => m.severity === s));
|
|
165
|
+
}
|
|
166
|
+
return effective;
|
|
167
|
+
}
|
|
168
|
+
function previousDisposition(input, source) {
|
|
169
|
+
if (input.previousDispositionEventId === null) {
|
|
170
|
+
requireSource(input.previousDisposition === undefined);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const receipt = input.previousDisposition;
|
|
174
|
+
requireSource(uuidSchema.safeParse(input.previousDispositionEventId).success && receipt &&
|
|
175
|
+
receipt.id === input.previousDispositionEventId && receipt.id !== input.eventId && uuidSchema.safeParse(receipt.actor_user_id).success);
|
|
176
|
+
receiptFor(receipt, source);
|
|
177
|
+
before(input.split.receipt, receipt);
|
|
178
|
+
const p = receipt.payload;
|
|
179
|
+
requireSource(receipt.sequence <= input.sourceContext.eventSequence && receipt.kind === 'finding_claim_disposition' &&
|
|
180
|
+
p.version === 1 && p.org_id === source.input.scope.org_id && p.repo === source.input.scope.repo &&
|
|
181
|
+
p.pr_number === source.input.scope.pr_number && p.head_sha === source.head && p.report_json_sha256 === source.digest &&
|
|
182
|
+
p.finding_ref === input.split.selection.findingRef && p.identity_key === input.split.receipt.payload.identity_key &&
|
|
183
|
+
p.split_event_id === input.split.receipt.id && p.claim_identity === input.split.selection.identity &&
|
|
184
|
+
['fresh', 'preserved'].includes(p.mode) && ['fixed', 'dismissed'].includes(p.verdict) &&
|
|
185
|
+
['critical', 'important', 'minor', 'nitpick'].includes(p.severity) && counter(p.expected_event_sequence) &&
|
|
186
|
+
p.expected_event_sequence < receipt.sequence);
|
|
187
|
+
requireReason(p.reason);
|
|
188
|
+
}
|
|
189
|
+
function preservedVerdict(input, source, member) {
|
|
190
|
+
requireSource(input.originalVerdict);
|
|
191
|
+
before(input.originalVerdict, input.split.receipt);
|
|
192
|
+
validatePreservedDispositionSubject({ source, member, descriptor: input.split.selection.descriptor, eventId: input.eventId,
|
|
193
|
+
verdict: input.verdict, severity: input.severity, reason: input.reason, originalVerdict: input.originalVerdict,
|
|
194
|
+
originalVerdictActorUserId: input.originalVerdictActorUserId });
|
|
195
|
+
}
|
|
196
|
+
/** Prove the retained original decision's full subject before any recovery POST.
|
|
197
|
+
* This does not fabricate or predict a split receipt or authorize delivery. */
|
|
198
|
+
export function validatePreservedDispositionSubject(input) {
|
|
199
|
+
const { source, member } = input;
|
|
200
|
+
const receipt = input.originalVerdict;
|
|
201
|
+
requireSource(receipt && uuidSchema.safeParse(input.originalVerdictActorUserId).success &&
|
|
202
|
+
receipt.actor_user_id === input.originalVerdictActorUserId && receipt.id !== input.eventId);
|
|
203
|
+
receiptFor(receipt, source);
|
|
204
|
+
before(source.input.classification, receipt);
|
|
205
|
+
// A correction after the decision cannot retroactively establish its subject.
|
|
206
|
+
// Include every original co-key member even if a supplied later correction
|
|
207
|
+
// moved a sibling away. A narrowed current map cannot erase verdict history.
|
|
208
|
+
requireSource(source.members.every(m => !m.unresolvedReason));
|
|
209
|
+
const family = source.members.filter(m => m.identity === member.identity || m.mapping?.matched_identity === member.identity);
|
|
210
|
+
requireSource(family.length > 0);
|
|
211
|
+
for (const sibling of family) {
|
|
212
|
+
if (sibling.correction)
|
|
213
|
+
before(sibling.correction, receipt);
|
|
214
|
+
requireSource(claimDescriptorSchema.safeParse(sibling.raw.claimDescriptor).success &&
|
|
215
|
+
isDeepStrictEqual(sibling.raw.claimDescriptor, sibling.stored.claim_descriptor) &&
|
|
216
|
+
(!sibling.mapping || isDeepStrictEqual(sibling.raw.claimDescriptor, sibling.mapping.claim_descriptor)) &&
|
|
217
|
+
isDeepStrictEqual(sibling.raw.claimDescriptor, input.descriptor));
|
|
218
|
+
}
|
|
219
|
+
requireSource(receipt.kind === 'verdicts_recorded' && Array.isArray(receipt.payload.verdicts));
|
|
220
|
+
const entries = receipt.payload.verdicts;
|
|
221
|
+
requireSource(entries.every(e => object(e) && key(e.identity_key)) &&
|
|
222
|
+
new Set(entries.map(e => e.identity_key)).size === entries.length);
|
|
223
|
+
const verdicts = entries.filter(v => v.identity_key === member.identity);
|
|
224
|
+
requireSource(verdicts.length === 1 && verdicts[0].verdict === input.verdict && verdicts[0].severity === input.severity &&
|
|
225
|
+
verdicts[0].reason === input.reason && (family.every(m => m.gating === 'none' || m.severity !== 'critical') || input.severity === 'critical'));
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=occurrence.js.map
|