project-tiny-context-harness 0.8.11 → 0.8.13
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 -21
- package/README.md +514 -472
- package/assets/README.md +803 -749
- package/assets/README.zh-CN.md +468 -431
- package/assets/agents/.gitkeep +1 -1
- package/assets/agents/AGENTS_CORE.md +22 -24
- package/assets/agents/long-task-implementation.toml +15 -0
- package/assets/context_templates/architecture.md +18 -18
- package/assets/context_templates/area.md +30 -30
- package/assets/context_templates/context.toml +24 -24
- package/assets/context_templates/deployment.md +35 -35
- package/assets/context_templates/global.md +56 -56
- package/assets/context_templates/product-surface-contract.md +70 -70
- package/assets/context_templates/screen-contract.md +189 -189
- package/assets/context_templates/verification.md +25 -25
- package/assets/github/.gitkeep +1 -1
- package/assets/github/harness.yml +39 -39
- package/assets/make/.gitkeep +1 -1
- package/assets/make/ty-context.mk +48 -48
- package/assets/skills/context_development_engineer/SKILL.md +72 -185
- package/assets/skills/context_full_project_export/SKILL.md +28 -28
- package/assets/skills/context_harness_upgrade/SKILL.md +60 -60
- package/assets/skills/context_product_plan/SKILL.md +35 -101
- package/assets/skills/context_surface_contract/SKILL.md +194 -191
- package/assets/skills/context_uiux_design/SKILL.md +49 -172
- package/assets/skills/design-resource-authoring/SKILL.md +54 -88
- package/assets/skills/design-resource-authoring/references/downstream-handoff.md +51 -163
- package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +96 -0
- package/assets/skills/design-resource-authoring/references/open-design-provider.md +140 -120
- package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +199 -0
- package/assets/skills/design-resource-authoring/references/resource-selection.md +158 -181
- package/assets/skills/design-system-authoring/SKILL.md +57 -57
- package/assets/skills/design-system-authoring/agents/openai.yaml +6 -6
- package/assets/skills/design-system-authoring/references/authority-adoption.md +48 -48
- package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +110 -110
- package/assets/skills/long-task-workflow/SKILL.md +71 -106
- package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
- package/assets/skills/long-task-workflow/references/authority-lifecycle.md +71 -69
- package/assets/skills/long-task-workflow/references/contract-authoring.md +110 -101
- package/assets/skills/long-task-workflow/references/evidence-design.md +99 -78
- package/assets/skills/long-task-workflow/references/source-authoring.md +90 -90
- package/assets/tools/validate_context.py +442 -442
- package/dist/commands/design-resource-recovery.d.ts +1 -0
- package/dist/commands/design-resource-recovery.js +152 -0
- package/dist/commands/design-resource.js +29 -3
- package/dist/commands/enable.js +2 -0
- package/dist/commands/index.js +2 -2
- package/dist/commands/long-task-revision.js +8 -7
- package/dist/commands/sync.js +2 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -0
- package/dist/lib/compact-authoring-support.d.ts +22 -0
- package/dist/lib/compact-authoring-support.js +143 -0
- package/dist/lib/compact-shared-structure-authoring.d.ts +5 -0
- package/dist/lib/compact-shared-structure-authoring.js +9 -0
- package/dist/lib/compact-shared-structure-types.d.ts +61 -0
- package/dist/lib/compact-shared-structure-types.js +1 -0
- package/dist/lib/compact-shared-structure-validation.d.ts +2 -0
- package/dist/lib/compact-shared-structure-validation.js +159 -0
- package/dist/lib/compact-shared-structures.d.ts +3 -0
- package/dist/lib/compact-shared-structures.js +204 -0
- package/dist/lib/design-resource-fact-enums.d.ts +4 -0
- package/dist/lib/design-resource-fact-enums.js +12 -0
- package/dist/lib/design-resource-fact-manifest-shape-evidence.js +2 -2
- package/dist/lib/design-resource-fact-policy.d.ts +2 -2
- package/dist/lib/design-resource-fact-types.d.ts +2 -2
- package/dist/lib/design-resource-handoff-bundle-draft.js +4 -2
- package/dist/lib/design-resource-handoff-input-types.d.ts +3 -0
- package/dist/lib/design-resource-handoff-parser.d.ts +2 -2
- package/dist/lib/design-resource-handoff-parser.js +2 -2
- package/dist/lib/design-resource-handoff-shape.d.ts +2 -0
- package/dist/lib/design-resource-handoff-shape.js +10 -0
- package/dist/lib/design-resource-handoff-snapshot.js +4 -0
- package/dist/lib/design-resource-handoff-validation.d.ts +4 -1
- package/dist/lib/design-resource-handoff-validation.js +11 -0
- package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +4 -2
- package/dist/lib/design-resource-reconciliation-codec.d.ts +2 -0
- package/dist/lib/design-resource-reconciliation-codec.js +174 -0
- package/dist/lib/design-resource-reconciliation-types.d.ts +62 -0
- package/dist/lib/design-resource-reconciliation-types.js +1 -0
- package/dist/lib/design-resource-reconciliation.d.ts +3 -0
- package/dist/lib/design-resource-reconciliation.js +224 -0
- package/dist/lib/design-resource-recovery-authority-policy.d.ts +8 -0
- package/dist/lib/design-resource-recovery-authority-policy.js +123 -0
- package/dist/lib/design-resource-recovery-catalog-resources.d.ts +6 -0
- package/dist/lib/design-resource-recovery-catalog-resources.js +121 -0
- package/dist/lib/design-resource-recovery-catalog-shape.d.ts +3 -0
- package/dist/lib/design-resource-recovery-catalog-shape.js +104 -0
- package/dist/lib/design-resource-recovery-catalog.d.ts +9 -0
- package/dist/lib/design-resource-recovery-catalog.js +103 -0
- package/dist/lib/design-resource-recovery-cleanup.d.ts +2 -0
- package/dist/lib/design-resource-recovery-cleanup.js +11 -0
- package/dist/lib/design-resource-recovery-codec-primitives.d.ts +19 -0
- package/dist/lib/design-resource-recovery-codec-primitives.js +92 -0
- package/dist/lib/design-resource-recovery-codec.d.ts +4 -0
- package/dist/lib/design-resource-recovery-codec.js +93 -0
- package/dist/lib/design-resource-recovery-current.d.ts +9 -0
- package/dist/lib/design-resource-recovery-current.js +41 -0
- package/dist/lib/design-resource-recovery-delta-policy.d.ts +5 -0
- package/dist/lib/design-resource-recovery-delta-policy.js +108 -0
- package/dist/lib/design-resource-recovery-files.d.ts +37 -0
- package/dist/lib/design-resource-recovery-files.js +204 -0
- package/dist/lib/design-resource-recovery-final-disposition-shape.d.ts +2 -0
- package/dist/lib/design-resource-recovery-final-disposition-shape.js +47 -0
- package/dist/lib/design-resource-recovery-patch-types.d.ts +54 -0
- package/dist/lib/design-resource-recovery-patch-types.js +1 -0
- package/dist/lib/design-resource-recovery-replay.d.ts +7 -0
- package/dist/lib/design-resource-recovery-replay.js +112 -0
- package/dist/lib/design-resource-recovery-repository-bindings.d.ts +9 -0
- package/dist/lib/design-resource-recovery-repository-bindings.js +49 -0
- package/dist/lib/design-resource-recovery-schema.d.ts +5 -0
- package/dist/lib/design-resource-recovery-schema.js +5 -0
- package/dist/lib/design-resource-recovery-shape.d.ts +10 -0
- package/dist/lib/design-resource-recovery-shape.js +184 -0
- package/dist/lib/design-resource-recovery-source-authority.d.ts +5 -0
- package/dist/lib/design-resource-recovery-source-authority.js +219 -0
- package/dist/lib/design-resource-recovery-text.d.ts +17 -0
- package/dist/lib/design-resource-recovery-text.js +186 -0
- package/dist/lib/design-resource-recovery-types.d.ts +197 -0
- package/dist/lib/design-resource-recovery-types.js +1 -0
- package/dist/lib/design-resource-recovery-writeback-policy.d.ts +5 -0
- package/dist/lib/design-resource-recovery-writeback-policy.js +326 -0
- package/dist/lib/design-resource-recovery-writeback-shape.d.ts +6 -0
- package/dist/lib/design-resource-recovery-writeback-shape.js +155 -0
- package/dist/lib/design-resource-recovery.d.ts +44 -0
- package/dist/lib/design-resource-recovery.js +216 -0
- package/dist/lib/design-resource-symbolic-applicability-authority.d.ts +7 -0
- package/dist/lib/design-resource-symbolic-applicability-authority.js +19 -0
- package/dist/lib/design-resource-symbolic-applicability-policy.d.ts +12 -0
- package/dist/lib/design-resource-symbolic-applicability-policy.js +79 -0
- package/dist/lib/design-resource-symbolic-applicability-profiles.d.ts +8 -0
- package/dist/lib/design-resource-symbolic-applicability-profiles.js +55 -0
- package/dist/lib/design-resource-symbolic-applicability-shape.d.ts +2 -0
- package/dist/lib/design-resource-symbolic-applicability-shape.js +76 -0
- package/dist/lib/design-resource-symbolic-applicability-validation.d.ts +7 -0
- package/dist/lib/design-resource-symbolic-applicability-validation.js +128 -0
- package/dist/lib/design-resource-symbolic-compilation.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-compilation.js +13 -0
- package/dist/lib/design-resource-symbolic-denotation.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-denotation.js +167 -0
- package/dist/lib/design-resource-symbolic-disposition-validation.d.ts +4 -0
- package/dist/lib/design-resource-symbolic-disposition-validation.js +28 -0
- package/dist/lib/design-resource-symbolic-fact-policy.d.ts +12 -0
- package/dist/lib/design-resource-symbolic-fact-policy.js +12 -0
- package/dist/lib/design-resource-symbolic-fact-shape.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-fact-shape.js +138 -0
- package/dist/lib/design-resource-symbolic-fact-types.d.ts +213 -0
- package/dist/lib/design-resource-symbolic-fact-types.js +1 -0
- package/dist/lib/design-resource-symbolic-fact-validation.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-fact-validation.js +86 -0
- package/dist/lib/design-resource-symbolic-indexes.d.ts +23 -0
- package/dist/lib/design-resource-symbolic-indexes.js +54 -0
- package/dist/lib/design-resource-symbolic-manifest-shape.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-manifest-shape.js +155 -0
- package/dist/lib/design-resource-symbolic-manifest-validation.d.ts +6 -0
- package/dist/lib/design-resource-symbolic-manifest-validation.js +132 -0
- package/dist/lib/design-resource-symbolic-noninterference-artifact.d.ts +33 -0
- package/dist/lib/design-resource-symbolic-noninterference-artifact.js +110 -0
- package/dist/lib/design-resource-symbolic-noninterference-equivalence.d.ts +3 -0
- package/dist/lib/design-resource-symbolic-noninterference-equivalence.js +77 -0
- package/dist/lib/design-resource-symbolic-noninterference-recompute.d.ts +4 -0
- package/dist/lib/design-resource-symbolic-noninterference-recompute.js +146 -0
- package/dist/lib/design-resource-symbolic-noninterference-scope.d.ts +7 -0
- package/dist/lib/design-resource-symbolic-noninterference-scope.js +49 -0
- package/dist/lib/design-resource-symbolic-noninterference-shape.d.ts +2 -0
- package/dist/lib/design-resource-symbolic-noninterference-shape.js +152 -0
- package/dist/lib/design-resource-symbolic-noninterference-types.d.ts +103 -0
- package/dist/lib/design-resource-symbolic-noninterference-types.js +1 -0
- package/dist/lib/design-resource-symbolic-noninterference-validation.d.ts +5 -0
- package/dist/lib/design-resource-symbolic-noninterference-validation.js +62 -0
- package/dist/lib/design-resource-symbolic-oracle-fingerprint.d.ts +1 -0
- package/dist/lib/design-resource-symbolic-oracle-fingerprint.js +47 -0
- package/dist/lib/design-resource-symbolic-predicate-shape.d.ts +6 -0
- package/dist/lib/design-resource-symbolic-predicate-shape.js +123 -0
- package/dist/lib/design-resource-symbolic-production-closure.d.ts +4 -0
- package/dist/lib/design-resource-symbolic-production-closure.js +144 -0
- package/dist/lib/design-resource-symbolic-proof-authority-validation.d.ts +10 -0
- package/dist/lib/design-resource-symbolic-proof-authority-validation.js +68 -0
- package/dist/lib/design-resource-symbolic-proof-validation.d.ts +10 -0
- package/dist/lib/design-resource-symbolic-proof-validation.js +89 -0
- package/dist/lib/design-resource-symbolic-region-validation.d.ts +19 -0
- package/dist/lib/design-resource-symbolic-region-validation.js +146 -0
- package/dist/lib/design-resource-symbolic-resource-validation.d.ts +5 -0
- package/dist/lib/design-resource-symbolic-resource-validation.js +90 -0
- package/dist/lib/design-resource-symbolic-rule-shape.d.ts +27 -0
- package/dist/lib/design-resource-symbolic-rule-shape.js +158 -0
- package/dist/lib/design-resource-symbolic-safety-validation.d.ts +6 -0
- package/dist/lib/design-resource-symbolic-safety-validation.js +29 -0
- package/dist/lib/design-resource-symbolic-source-ir-evaluation.d.ts +19 -0
- package/dist/lib/design-resource-symbolic-source-ir-evaluation.js +74 -0
- package/dist/lib/design-resource-symbolic-source-ir-evidence.d.ts +44 -0
- package/dist/lib/design-resource-symbolic-source-ir-evidence.js +88 -0
- package/dist/lib/design-resource-symbolic-source-ir-oracle.d.ts +13 -0
- package/dist/lib/design-resource-symbolic-source-ir-oracle.js +96 -0
- package/dist/lib/design-resource-symbolic-source-ir-proof.d.ts +14 -0
- package/dist/lib/design-resource-symbolic-source-ir-proof.js +98 -0
- package/dist/lib/design-resource-symbolic-source-ir-shape.d.ts +2 -0
- package/dist/lib/design-resource-symbolic-source-ir-shape.js +38 -0
- package/dist/lib/design-resource-symbolic-source-ir-types.d.ts +17 -0
- package/dist/lib/design-resource-symbolic-source-ir-types.js +2 -0
- package/dist/lib/design-resource-symbolic-static-dependency-validation.d.ts +2 -0
- package/dist/lib/design-resource-symbolic-static-dependency-validation.js +83 -0
- package/dist/lib/design-resource-symbolic-structural-closure-validation.d.ts +6 -0
- package/dist/lib/design-resource-symbolic-structural-closure-validation.js +79 -0
- package/dist/lib/design-resource-symbolic-validation-support.d.ts +29 -0
- package/dist/lib/design-resource-symbolic-validation-support.js +111 -0
- package/dist/lib/design-resource-v1-capacity-header.d.ts +8 -0
- package/dist/lib/design-resource-v1-capacity-header.js +231 -0
- package/dist/lib/design-resource-v1-capacity.d.ts +5 -0
- package/dist/lib/design-resource-v1-capacity.js +45 -0
- package/dist/lib/init.js +1 -0
- package/dist/lib/long-task-acceptance-shape.js +8 -2
- package/dist/lib/long-task-activation-validation.js +13 -3
- package/dist/lib/long-task-admitted-observation-records.d.ts +25 -0
- package/dist/lib/long-task-admitted-observation-records.js +40 -0
- package/dist/lib/long-task-admitted-observation.d.ts +93 -0
- package/dist/lib/long-task-admitted-observation.js +201 -0
- package/dist/lib/long-task-artifacts.d.ts +1 -0
- package/dist/lib/long-task-artifacts.js +1 -0
- package/dist/lib/long-task-authority-material-diff.js +1 -0
- package/dist/lib/long-task-authority-policy.d.ts +5 -0
- package/dist/lib/long-task-authority-policy.js +5 -0
- package/dist/lib/long-task-authority-revision-details.js +3 -1
- package/dist/lib/long-task-authority.js +2 -1
- package/dist/lib/long-task-check-execution-policy.js +5 -0
- package/dist/lib/long-task-check-runner.d.ts +2 -2
- package/dist/lib/long-task-check-runner.js +440 -23
- package/dist/lib/long-task-claims.d.ts +18 -0
- package/dist/lib/long-task-claims.js +35 -0
- package/dist/lib/long-task-codex-agent-profile.d.ts +42 -0
- package/dist/lib/long-task-codex-agent-profile.js +276 -0
- package/dist/lib/long-task-compact-authoring-projections.d.ts +12 -0
- package/dist/lib/long-task-compact-authoring-projections.js +67 -0
- package/dist/lib/long-task-compact-authoring.d.ts +3 -0
- package/dist/lib/long-task-compact-authoring.js +173 -0
- package/dist/lib/long-task-compact-carrier.d.ts +7 -0
- package/dist/lib/long-task-compact-carrier.js +132 -0
- package/dist/lib/long-task-compact-parser.d.ts +14 -0
- package/dist/lib/long-task-compact-parser.js +123 -0
- package/dist/lib/long-task-compact-primitives.d.ts +22 -0
- package/dist/lib/long-task-compact-primitives.js +132 -0
- package/dist/lib/long-task-compact-projections.d.ts +4 -0
- package/dist/lib/long-task-compact-projections.js +153 -0
- package/dist/lib/long-task-compact-structure-targets.d.ts +2 -0
- package/dist/lib/long-task-compact-structure-targets.js +91 -0
- package/dist/lib/long-task-conformance-policy.js +3 -1
- package/dist/lib/long-task-counterfactual-claim-policy.d.ts +3 -4
- package/dist/lib/long-task-counterfactual-claim-policy.js +11 -3
- package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
- package/dist/lib/long-task-counterfactual-sandbox.js +8 -5
- package/dist/lib/long-task-counterfactual-types.d.ts +2 -0
- package/dist/lib/long-task-delivery-compiler.js +2 -0
- package/dist/lib/long-task-delivery-parser.d.ts +1 -0
- package/dist/lib/long-task-delivery-parser.js +38 -6
- package/dist/lib/long-task-design-resource-handoff.d.ts +2 -1
- package/dist/lib/long-task-design-resource-handoff.js +71 -11
- package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -1
- package/dist/lib/long-task-design-resource-method-binding.js +150 -0
- package/dist/lib/long-task-evidence-capability-codec.js +256 -34
- package/dist/lib/long-task-evidence-capability-policy.d.ts +3 -2
- package/dist/lib/long-task-evidence-capability-policy.js +142 -8
- package/dist/lib/long-task-evidence-capability-runtime.d.ts +5 -2
- package/dist/lib/long-task-evidence-capability-runtime.js +420 -68
- package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
- package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +9 -0
- package/dist/lib/long-task-evidence-sensitivity-policy.js +31 -1
- package/dist/lib/long-task-evidence-v2.d.ts +4 -4
- package/dist/lib/long-task-evidence-v2.js +322 -44
- package/dist/lib/long-task-exact-comparison.d.ts +16 -0
- package/dist/lib/long-task-exact-comparison.js +28 -0
- package/dist/lib/long-task-execution-observation.d.ts +24 -0
- package/dist/lib/long-task-execution-observation.js +332 -0
- package/dist/lib/long-task-explain-acceptance-link.d.ts +4 -0
- package/dist/lib/long-task-explain-acceptance-link.js +4 -0
- package/dist/lib/long-task-explain-claim-links.d.ts +2 -0
- package/dist/lib/long-task-explain-claim-links.js +2 -0
- package/dist/lib/long-task-explain-source-links.d.ts +6 -0
- package/dist/lib/long-task-final-v2.js +7 -4
- package/dist/lib/long-task-hook-install.d.ts +19 -2
- package/dist/lib/long-task-hook-install.js +288 -91
- package/dist/lib/long-task-json-pointer-observation.d.ts +59 -0
- package/dist/lib/long-task-json-pointer-observation.js +184 -0
- package/dist/lib/long-task-observation-artifact.d.ts +8 -0
- package/dist/lib/long-task-observation-artifact.js +58 -0
- package/dist/lib/long-task-observation-authority.d.ts +17 -0
- package/dist/lib/long-task-observation-authority.js +348 -0
- package/dist/lib/long-task-paths.js +1 -1
- package/dist/lib/long-task-playwright-capability-records.d.ts +2 -0
- package/dist/lib/long-task-playwright-capability-records.js +74 -2
- package/dist/lib/long-task-process-observation.d.ts +6 -0
- package/dist/lib/long-task-process-observation.js +117 -0
- package/dist/lib/long-task-process-runtime-closure.d.ts +13 -0
- package/dist/lib/long-task-process-runtime-closure.js +175 -0
- package/dist/lib/long-task-progress.js +2 -0
- package/dist/lib/long-task-protected-files.d.ts +1 -1
- package/dist/lib/long-task-protected-files.js +1 -30
- package/dist/lib/long-task-risk.js +8 -3
- package/dist/lib/long-task-root-shape.js +10 -1
- package/dist/lib/long-task-runner-environment.d.ts +1 -1
- package/dist/lib/long-task-runner-environment.js +4 -4
- package/dist/lib/long-task-runner-freeze.d.ts +4 -2
- package/dist/lib/long-task-runner-freeze.js +130 -28
- package/dist/lib/long-task-runtime-types.d.ts +111 -0
- package/dist/lib/long-task-scoped-binding.d.ts +13 -0
- package/dist/lib/long-task-scoped-binding.js +11 -0
- package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
- package/dist/lib/long-task-semantic-fact-binding-types.d.ts +8 -0
- package/dist/lib/long-task-semantic-fact-closure.js +4 -1
- package/dist/lib/long-task-semantic-fact-contract-closure.d.ts +1 -1
- package/dist/lib/long-task-semantic-fact-contract-closure.js +18 -6
- package/dist/lib/long-task-semantic-fact-contract-facts.d.ts +1 -1
- package/dist/lib/long-task-semantic-fact-contract-facts.js +4 -1
- package/dist/lib/long-task-semantic-fact-contract-proofs.d.ts +1 -1
- package/dist/lib/long-task-semantic-fact-contract-proofs.js +12 -3
- package/dist/lib/long-task-semantic-fact-evidence.d.ts +8 -4
- package/dist/lib/long-task-semantic-fact-evidence.js +103 -43
- package/dist/lib/long-task-semantic-fact-shape.js +17 -6
- package/dist/lib/long-task-shape-primitives.d.ts +1 -1
- package/dist/lib/long-task-shape-primitives.js +1 -0
- package/dist/lib/long-task-source-claim-validation.js +4 -1
- package/dist/lib/long-task-source-item-parser.d.ts +2 -2
- package/dist/lib/long-task-source-item-parser.js +20 -11
- package/dist/lib/long-task-source-target-continuity.d.ts +2 -2
- package/dist/lib/long-task-source-target-continuity.js +35 -2
- package/dist/lib/long-task-source-target-index.d.ts +3 -0
- package/dist/lib/long-task-source-target-index.js +19 -0
- package/dist/lib/long-task-stage-policy.js +10 -4
- package/dist/lib/long-task-static-observation-freeze.d.ts +83 -0
- package/dist/lib/long-task-static-observation-freeze.js +428 -0
- package/dist/lib/long-task-status-projection.js +5 -1
- package/dist/lib/long-task-target-policy.d.ts +1 -1
- package/dist/lib/long-task-target-policy.js +3 -0
- package/dist/lib/long-task-ui-design-policy.js +64 -4
- package/dist/lib/long-task-ui-surface-shape.js +195 -0
- package/dist/lib/long-task-ui-surface-types.d.ts +53 -0
- package/dist/lib/long-task-verifier-dependency-closure.js +7 -3
- package/dist/lib/long-task-verifier-v2.js +70 -9
- package/dist/lib/long-task-worker-selection.d.ts +2 -0
- package/dist/lib/long-task-worker-selection.js +7 -0
- package/dist/lib/long-task-workspace-scope.js +3 -1
- package/dist/lib/long-task-workspace.d.ts +1 -1
- package/dist/lib/long-task-workspace.js +12 -13
- package/dist/lib/migrations.js +58 -0
- package/dist/lib/profiles.js +0 -1
- package/dist/lib/repository-path-safety.d.ts +14 -0
- package/dist/lib/repository-path-safety.js +126 -0
- package/dist/lib/semantic-fact-compact-authoring.d.ts +2 -0
- package/dist/lib/semantic-fact-compact-authoring.js +160 -0
- package/dist/lib/semantic-fact-compact-capacity.d.ts +9 -0
- package/dist/lib/semantic-fact-compact-capacity.js +40 -0
- package/dist/lib/semantic-fact-compact-carrier.d.ts +16 -0
- package/dist/lib/semantic-fact-compact-carrier.js +146 -0
- package/dist/lib/semantic-fact-compact-parser.d.ts +17 -0
- package/dist/lib/semantic-fact-compact-parser.js +168 -0
- package/dist/lib/semantic-fact-compact-revision.d.ts +11 -0
- package/dist/lib/semantic-fact-compact-revision.js +64 -0
- package/dist/lib/semantic-fact-compact-support.d.ts +23 -0
- package/dist/lib/semantic-fact-compact-support.js +159 -0
- package/dist/lib/semantic-fact-policy-census.d.ts +1 -0
- package/dist/lib/semantic-fact-policy-census.js +43 -0
- package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
- package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
- package/dist/lib/semantic-fact-source-parser.d.ts +5 -0
- package/dist/lib/semantic-fact-source-parser.js +47 -6
- package/dist/lib/structural-closure-cost.d.ts +79 -0
- package/dist/lib/structural-closure-cost.js +91 -0
- package/dist/lib/symbolic-denotation-dag-builder.d.ts +25 -0
- package/dist/lib/symbolic-denotation-dag-builder.js +176 -0
- package/dist/lib/symbolic-denotation-domain-validation.d.ts +3 -0
- package/dist/lib/symbolic-denotation-domain-validation.js +56 -0
- package/dist/lib/symbolic-denotation-engine.d.ts +32 -0
- package/dist/lib/symbolic-denotation-engine.js +140 -0
- package/dist/lib/symbolic-denotation-public.d.ts +11 -0
- package/dist/lib/symbolic-denotation-public.js +12 -0
- package/dist/lib/symbolic-denotation-runtime.d.ts +20 -0
- package/dist/lib/symbolic-denotation-runtime.js +90 -0
- package/dist/lib/symbolic-denotation-support.d.ts +11 -0
- package/dist/lib/symbolic-denotation-support.js +49 -0
- package/dist/lib/symbolic-denotation-types.d.ts +133 -0
- package/dist/lib/symbolic-denotation-types.js +18 -0
- package/dist/lib/symbolic-denotation-validation.d.ts +6 -0
- package/dist/lib/symbolic-denotation-validation.js +126 -0
- package/dist/lib/sync-engine.d.ts +1 -0
- package/dist/lib/sync-engine.js +4 -1
- package/dist/lib/upgrade.js +1 -0
- package/dist/long-task-hook.js +40 -1
- package/dist/public-types.d.ts +8 -0
- package/dist/public-types.js +1 -0
- package/dist/schemas/design-resource-symbolic-noninterference-artifact-v2.schema.json +289 -0
- package/dist/schemas/design-resource-symbolic-source-ir-v1.schema.json +130 -0
- package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +435 -5
- package/migrations/README.md +92 -15
- package/package.json +2 -2
- package/source-mappings.yaml +28 -25
- package/assets/skills/source-plan-authoring/SKILL.md +0 -14
|
@@ -6,6 +6,37 @@ const NON_RESULT_SENSITIVITY_PREFIXES = [
|
|
|
6
6
|
"non_completing.",
|
|
7
7
|
"forbidden_shortcut.",
|
|
8
8
|
];
|
|
9
|
+
export function validateCounterfactualObservationImpact(input) {
|
|
10
|
+
if (input.carrier_role === "evidence")
|
|
11
|
+
return "counterfactual_mutates_generated_evidence";
|
|
12
|
+
if (!input.target_live)
|
|
13
|
+
return "counterfactual_target_not_live";
|
|
14
|
+
const expected = new Set(input.expected_affected_fact_refs);
|
|
15
|
+
const preserved = new Set(input.preserved_fact_refs);
|
|
16
|
+
const allowedFanout = new Set(input.allowed_fanout_fact_refs ?? []);
|
|
17
|
+
for (const factRef of expected) {
|
|
18
|
+
if (!Object.hasOwn(input.baseline_by_fact, factRef) ||
|
|
19
|
+
!Object.hasOwn(input.mutated_by_fact, factRef))
|
|
20
|
+
return "counterfactual_expected_fact_observation_missing";
|
|
21
|
+
if (input.baseline_by_fact[factRef] === input.mutated_by_fact[factRef])
|
|
22
|
+
return "counterfactual_expected_fact_unchanged";
|
|
23
|
+
}
|
|
24
|
+
for (const factRef of new Set([
|
|
25
|
+
...Object.keys(input.baseline_by_fact),
|
|
26
|
+
...Object.keys(input.mutated_by_fact),
|
|
27
|
+
])) {
|
|
28
|
+
if (expected.has(factRef) || allowedFanout.has(factRef))
|
|
29
|
+
continue;
|
|
30
|
+
const baseline = input.baseline_by_fact[factRef];
|
|
31
|
+
const mutated = input.mutated_by_fact[factRef];
|
|
32
|
+
if (preserved.has(factRef) &&
|
|
33
|
+
(baseline === undefined || mutated === undefined || baseline !== mutated))
|
|
34
|
+
return "counterfactual_unexpected_fact_impact";
|
|
35
|
+
if (!preserved.has(factRef) && baseline !== mutated)
|
|
36
|
+
return "counterfactual_unexpected_fact_impact";
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
9
40
|
export function validateClaimEvidenceSensitivity(contract, globalChecks, outcomes, report) {
|
|
10
41
|
validateGlobalStructuredSensitivity(contract, globalChecks, report);
|
|
11
42
|
validateGlobalSemanticWitnesses(contract, globalChecks, report);
|
|
@@ -62,7 +93,6 @@ function isNarrowSemanticMutation(type) {
|
|
|
62
93
|
}
|
|
63
94
|
function isBehavioralAssertion(check, assertion) {
|
|
64
95
|
return !(check.proof_surface === "implementation_structure" &&
|
|
65
|
-
assertion.operator === "exists" &&
|
|
66
96
|
assertion.evidence_capabilities.every((capability) => capability === "presence"));
|
|
67
97
|
}
|
|
68
98
|
function isLivenessAssertion(check, reference) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CheckExecutionResultV2, CompiledCheckV2, CompiledDeliveryContractV2, CompiledOutcomeV2, LongTaskFindingV2, RawCommandExecutionV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
|
|
2
|
-
export declare function evaluateCheckEvidence(check: CompiledCheckV2, raw: RawCommandExecutionV2, snapshotRoot: string, outcome?: CompiledOutcomeV2): Promise<CheckExecutionResultV2>;
|
|
3
|
-
export declare function evaluateOutcomeCounterfactuals(outcome: CompiledOutcomeV2, snapshotRoot: string, manifest?: WorkspaceManifestV2): Promise<LongTaskFindingV2[]>;
|
|
4
|
-
export declare function evaluateGlobalCounterfactuals(compiled: CompiledDeliveryContractV2, snapshotRoot: string, selectedCheckKeys?: ReadonlySet<string>, manifest?: WorkspaceManifestV2): Promise<LongTaskFindingV2[]>;
|
|
5
|
-
export declare function isValidCounterfactualCheckResult(result: CheckExecutionResultV2, expectedAssertionFailures: string[]): boolean;
|
|
2
|
+
export declare function evaluateCheckEvidence(check: CompiledCheckV2, raw: RawCommandExecutionV2, snapshotRoot: string, outcome?: CompiledOutcomeV2, observationAuthorityPaths?: readonly string[]): Promise<CheckExecutionResultV2>;
|
|
3
|
+
export declare function evaluateOutcomeCounterfactuals(outcome: CompiledOutcomeV2, snapshotRoot: string, manifest?: WorkspaceManifestV2, protectedAuthorityPaths?: readonly string[], baselineResults?: readonly CheckExecutionResultV2[], baselineExecutions?: ReadonlyMap<string, RawCommandExecutionV2>, executionUniverse?: readonly CompiledCheckV2[]): Promise<LongTaskFindingV2[]>;
|
|
4
|
+
export declare function evaluateGlobalCounterfactuals(compiled: CompiledDeliveryContractV2, snapshotRoot: string, selectedCheckKeys?: ReadonlySet<string>, manifest?: WorkspaceManifestV2, baselineResults?: readonly CheckExecutionResultV2[], baselineExecutions?: ReadonlyMap<string, RawCommandExecutionV2>, executionUniverse?: readonly CompiledCheckV2[]): Promise<LongTaskFindingV2[]>;
|
|
5
|
+
export declare function isValidCounterfactualCheckResult(result: CheckExecutionResultV2, expectedAssertionFailures: string[], allowedFanoutAssertions?: string[]): boolean;
|
|
@@ -1,22 +1,41 @@
|
|
|
1
1
|
import { copyFile, rm, stat } from "node:fs/promises";
|
|
2
2
|
import { evaluatePopulation } from "./long-task-assertions-v2.js";
|
|
3
|
-
import { collectCheckArtifacts } from "./long-task-artifacts.js";
|
|
3
|
+
import { collectCheckArtifacts, prepareAdmittedObservations, } from "./long-task-artifacts.js";
|
|
4
4
|
import { executeCheckRunner } from "./long-task-check-runner.js";
|
|
5
|
+
import { prepareExecutionObservationGroup } from "./long-task-execution-observation.js";
|
|
5
6
|
import { createCounterfactualSandbox } from "./long-task-counterfactual-sandbox.js";
|
|
6
7
|
import { assertionFinding, checkFinding, classifyCheckStatus, evaluateAssertionResults, } from "./long-task-evidence-findings.js";
|
|
7
8
|
import { classifyPlaywrightCounterfactual } from "./long-task-playwright-counterfactual-policy.js";
|
|
9
|
+
import { admittedObservationAuthorityKey, classifyMachineObservationCarrierRoleConflict, } from "./long-task-admitted-observation.js";
|
|
8
10
|
import { applyNarrowSemanticMutation } from "./long-task-semantic-mutation.js";
|
|
9
11
|
import { evaluateEvidenceCapabilities } from "./long-task-evidence-capability-policy.js";
|
|
12
|
+
import { validateCounterfactualObservationImpact } from "./long-task-evidence-sensitivity-policy.js";
|
|
13
|
+
import { matchesRepoPattern, normalizeRepositoryFile, } from "./long-task-paths.js";
|
|
10
14
|
import { resolveInsideRepository } from "./long-task-workspace.js";
|
|
11
|
-
|
|
15
|
+
import { canonicalValueJson } from "./strict-codec.js";
|
|
16
|
+
export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome, observationAuthorityPaths = []) {
|
|
12
17
|
const artifacts = await collectCheckArtifacts(check, snapshotRoot);
|
|
13
|
-
const
|
|
18
|
+
const admittedObservations = await prepareAdmittedObservations({
|
|
19
|
+
check,
|
|
20
|
+
records: raw.evidence_records ?? [],
|
|
21
|
+
snapshot_root: snapshotRoot,
|
|
22
|
+
authority_paths: observationAuthorityPaths,
|
|
23
|
+
package_observations: (raw.package_observations ?? []).filter((candidate) => (check.observation_authorities ?? []).some((authority) => authority.authority === candidate.authority &&
|
|
24
|
+
authority.observation_identity === candidate.observation_identity &&
|
|
25
|
+
authority.assertion_ref === candidate.assertion_ref &&
|
|
26
|
+
authority.obligation_ref === candidate.obligation_ref &&
|
|
27
|
+
authority.method === candidate.method)),
|
|
28
|
+
});
|
|
29
|
+
const derived = packageDerivedAssertionObservations(check, raw.observations, admittedObservations);
|
|
30
|
+
const authoritativeRaw = { ...raw, observations: derived.observations };
|
|
31
|
+
const assertionResults = evaluateAssertionResults(check, authoritativeRaw.observations);
|
|
14
32
|
const executionCompleted = raw.execution_status === "completed";
|
|
15
|
-
const findings = collectExecutionFindings(check,
|
|
33
|
+
const findings = collectExecutionFindings(check, authoritativeRaw, outcome, artifacts, assertionResults, admittedObservations);
|
|
34
|
+
findings.push(...derived.findings);
|
|
16
35
|
const population = outcome?.acceptance.population;
|
|
17
36
|
let populationPassed = true;
|
|
18
37
|
if (executionCompleted && population?.check_key === check.key) {
|
|
19
|
-
const result = evaluatePopulation(population,
|
|
38
|
+
const result = evaluatePopulation(population, authoritativeRaw.observations);
|
|
20
39
|
populationPassed = result.passed;
|
|
21
40
|
if (!result.passed)
|
|
22
41
|
findings.push({
|
|
@@ -57,7 +76,7 @@ export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome) {
|
|
|
57
76
|
evidence_adapter: check.evidence_adapter,
|
|
58
77
|
execution_identity: raw.raw_execution_identity,
|
|
59
78
|
assertion_results: assertionResults,
|
|
60
|
-
observations:
|
|
79
|
+
observations: authoritativeRaw.observations,
|
|
61
80
|
evidence_records: raw.evidence_records ?? [],
|
|
62
81
|
artifact_hashes: artifacts.hashes,
|
|
63
82
|
claim_proofs: claimProofs,
|
|
@@ -66,7 +85,40 @@ export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome) {
|
|
|
66
85
|
duration_ms: raw.duration_ms,
|
|
67
86
|
};
|
|
68
87
|
}
|
|
69
|
-
function
|
|
88
|
+
function packageDerivedAssertionObservations(check, submitted, admitted) {
|
|
89
|
+
const observations = { ...submitted };
|
|
90
|
+
const findings = [];
|
|
91
|
+
for (const assertion of [
|
|
92
|
+
...check.positive_assertions,
|
|
93
|
+
...check.negative_assertions,
|
|
94
|
+
]) {
|
|
95
|
+
const authorities = (check.observation_authorities ?? []).filter((authority) => authority.assertion_ref === assertion.key);
|
|
96
|
+
if (!authorities.length)
|
|
97
|
+
continue;
|
|
98
|
+
const entries = authorities.map((authority) => admitted.by_authority_key.get(admittedObservationAuthorityKey(authority)));
|
|
99
|
+
if (entries.some((entry) => !entry || entry.reason || !entry.observation || !entry.comparison))
|
|
100
|
+
continue;
|
|
101
|
+
const factBound = authorities.some((authority) => authority.fact_ref !== null);
|
|
102
|
+
const derivedValue = factBound
|
|
103
|
+
? entries.every((entry) => entry.comparison.passed)
|
|
104
|
+
: entries.length === 1
|
|
105
|
+
? entries[0].raw_value
|
|
106
|
+
: entries.every((entry) => entry.comparison.passed);
|
|
107
|
+
if (Object.hasOwn(submitted, assertion.observation) &&
|
|
108
|
+
canonicalValueJson(submitted[assertion.observation]) !==
|
|
109
|
+
canonicalValueJson(derivedValue))
|
|
110
|
+
findings.push({
|
|
111
|
+
...checkFinding(check, "project_submitted_verdict_disagrees_with_harness", `Project-submitted observation ${assertion.observation} disagrees with the package-derived current Actual.`, "Remove the compatibility copy or make it agree with the Harness-derived observation; it cannot act as Authority."),
|
|
112
|
+
assertion_key: assertion.key,
|
|
113
|
+
claim_keys: assertion.claims,
|
|
114
|
+
expected: derivedValue,
|
|
115
|
+
actual: submitted[assertion.observation],
|
|
116
|
+
});
|
|
117
|
+
observations[assertion.observation] = derivedValue;
|
|
118
|
+
}
|
|
119
|
+
return { observations, findings };
|
|
120
|
+
}
|
|
121
|
+
function collectExecutionFindings(check, raw, outcome, artifacts, assertionResults, admittedObservations) {
|
|
70
122
|
const findings = [];
|
|
71
123
|
if (raw.execution_status !== "completed") {
|
|
72
124
|
findings.push(checkFinding(check, raw.execution_status, raw.error ?? raw.execution_status, raw.execution_status === "blocked_external"
|
|
@@ -83,17 +135,24 @@ function collectExecutionFindings(check, raw, outcome, artifacts, assertionResul
|
|
|
83
135
|
for (const result of assertionResults)
|
|
84
136
|
if (!result.passed)
|
|
85
137
|
findings.push(assertionFinding(check, result, raw.observations, outcome));
|
|
86
|
-
const capabilityEvaluation = evaluateEvidenceCapabilities(check, raw.evidence_records, artifacts.hashes);
|
|
138
|
+
const capabilityEvaluation = evaluateEvidenceCapabilities(check, raw.evidence_records, artifacts.hashes, admittedObservations, raw);
|
|
87
139
|
const passedAssertions = new Set(assertionResults
|
|
88
140
|
.filter((result) => result.passed)
|
|
89
141
|
.map((result) => result.key));
|
|
90
|
-
findings.push(...capabilityEvaluation.findings.filter((finding) => !finding.assertion_key ||
|
|
142
|
+
findings.push(...capabilityEvaluation.findings.filter((finding) => !finding.assertion_key ||
|
|
143
|
+
passedAssertions.has(finding.assertion_key) ||
|
|
144
|
+
isObservationAuthorityFailureFinding(finding)));
|
|
91
145
|
for (const result of assertionResults)
|
|
92
146
|
result.evidence_complete =
|
|
93
147
|
result.passed && capabilityEvaluation.complete[result.key] === true;
|
|
94
148
|
return findings;
|
|
95
149
|
}
|
|
96
|
-
|
|
150
|
+
function isObservationAuthorityFailureFinding(finding) {
|
|
151
|
+
if (typeof finding.actual !== "string")
|
|
152
|
+
return false;
|
|
153
|
+
return /^(?:admitted_observation_|counterfactual_admitted_observation_|host_attestation_|machine_observer_|observation_|process_observation_|process_observer_|project_submitted_|static_observation_|unsupported_observer_)/u.test(finding.actual);
|
|
154
|
+
}
|
|
155
|
+
export async function evaluateOutcomeCounterfactuals(outcome, snapshotRoot, manifest, protectedAuthorityPaths = [], baselineResults = [], baselineExecutions = new Map(), executionUniverse = outcome.acceptance.checks) {
|
|
97
156
|
return evaluateCounterfactualSet(outcome.acceptance.counterfactual_controls.map((control) => ({
|
|
98
157
|
control,
|
|
99
158
|
check: outcome.acceptance.checks.find((item) => item.key === control.check_key),
|
|
@@ -101,9 +160,12 @@ export async function evaluateOutcomeCounterfactuals(outcome, snapshotRoot, mani
|
|
|
101
160
|
findingOutcomeKey: outcome.key,
|
|
102
161
|
owningOutcome: outcome,
|
|
103
162
|
bindingRef: `${outcome.key}.${control.binding_key}`,
|
|
104
|
-
})), snapshotRoot, manifest);
|
|
163
|
+
})), snapshotRoot, manifest, protectedAuthorityPaths, baselineResults, baselineExecutions, executionUniverse);
|
|
105
164
|
}
|
|
106
|
-
export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, selectedCheckKeys, manifest)
|
|
165
|
+
export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, selectedCheckKeys, manifest, baselineResults = [], baselineExecutions = new Map(), executionUniverse = [
|
|
166
|
+
...compiled.global.acceptance.checks,
|
|
167
|
+
...compiled.outcomes.flatMap((outcome) => outcome.acceptance.checks),
|
|
168
|
+
]) {
|
|
107
169
|
return evaluateCounterfactualSet((compiled.global.acceptance.counterfactual_controls ?? [])
|
|
108
170
|
.filter((control) => !selectedCheckKeys || selectedCheckKeys.has(control.check_key))
|
|
109
171
|
.map((control) => {
|
|
@@ -115,23 +177,18 @@ export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, sele
|
|
|
115
177
|
owningOutcome: compiled.outcomes.find((outcome) => outcome.key === outcomeKey),
|
|
116
178
|
bindingRef: control.binding_ref,
|
|
117
179
|
};
|
|
118
|
-
}), snapshotRoot, manifest);
|
|
180
|
+
}), snapshotRoot, manifest, compiledAuthorityPaths(compiled), baselineResults, baselineExecutions, executionUniverse);
|
|
119
181
|
}
|
|
120
|
-
async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
|
|
182
|
+
async function evaluateCounterfactualSet(entries, snapshotRoot, manifest, protectedAuthorityPaths = [], baselineResults = [], baselineExecutions = new Map(), executionUniverse = []) {
|
|
121
183
|
const findings = [];
|
|
122
184
|
for (const entry of entries) {
|
|
123
185
|
const { control, check } = entry;
|
|
124
186
|
const owningBinding = entry.owningOutcome.technical.bindings.find((binding) => `${entry.owningOutcome.key}.${binding.key}` === entry.bindingRef);
|
|
125
|
-
const sandbox = await createCounterfactualSandbox(snapshotRoot, check, control, owningBinding?.carrier_paths ?? [], manifest);
|
|
187
|
+
const sandbox = await createCounterfactualSandbox(snapshotRoot, check, control, owningBinding?.carrier_paths ?? [], manifest, protectedAuthorityPaths);
|
|
126
188
|
const root = sandbox.root;
|
|
127
189
|
try {
|
|
128
|
-
const mutationTargets = control
|
|
129
|
-
|
|
130
|
-
: [control.mutation.path];
|
|
131
|
-
const missingTargets = [];
|
|
132
|
-
for (const target of mutationTargets)
|
|
133
|
-
if (!(await stat(resolveInsideRepository(root, target, "counterfactual.target")).catch(() => null)))
|
|
134
|
-
missingTargets.push(target);
|
|
190
|
+
const mutationTargets = counterfactualMutationTargets(control);
|
|
191
|
+
const missingTargets = await missingCounterfactualMutationTargets(root, mutationTargets);
|
|
135
192
|
if (missingTargets.length) {
|
|
136
193
|
findings.push(counterfactualIntegrityFinding(entry, {
|
|
137
194
|
execution_status: "not_run",
|
|
@@ -140,18 +197,10 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
|
|
|
140
197
|
}));
|
|
141
198
|
continue;
|
|
142
199
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
else if (control.mutation.type === "replace_file") {
|
|
148
|
-
await copyFile(resolveInsideRepository(root, control.mutation.fixture_path, "counterfactual.fixture"), resolveInsideRepository(root, control.mutation.path, "counterfactual.path"));
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
await applyNarrowSemanticMutation(root, control.mutation);
|
|
152
|
-
}
|
|
153
|
-
const raw = await executeCheckRunner(check, root);
|
|
154
|
-
const result = await evaluateCheckEvidence(check, raw, root, entry.evidenceOutcome);
|
|
200
|
+
await applyCounterfactualMutation(root, control);
|
|
201
|
+
const raw = await executeCounterfactualCheck(check, root, manifest, protectedAuthorityPaths, executionUniverse);
|
|
202
|
+
const result = await evaluateCheckEvidence(check, raw, root, entry.evidenceOutcome, protectedAuthorityPaths);
|
|
203
|
+
const observationImpactIssue = await counterfactualObservationImpactIssue(entry, baselineResults, baselineExecutions.get(check.raw_execution_identity), result, raw, snapshotRoot, root, mutationTargets, owningBinding?.carrier_paths ?? [], protectedAuthorityPaths, executionUniverse);
|
|
155
204
|
const playwrightClassification = result.evidence_adapter === "playwright_json_v1"
|
|
156
205
|
? classifyPlaywrightCounterfactual(raw, result, control)
|
|
157
206
|
: null;
|
|
@@ -161,21 +210,27 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
|
|
|
161
210
|
.map((assertion) => assertion.key)
|
|
162
211
|
.sort();
|
|
163
212
|
const expected = [...control.expected_assertion_failures].sort();
|
|
213
|
+
const allowedFanout = [
|
|
214
|
+
...(control.allowed_fanout_assertions ?? []),
|
|
215
|
+
].sort();
|
|
164
216
|
const acceptedExit = playwrightClassification
|
|
165
217
|
? playwrightClassification.accepted_test_failure_exit
|
|
166
218
|
: raw.exit_code === 0;
|
|
167
219
|
const valid = raw.execution_status === "completed" &&
|
|
168
220
|
acceptedExit &&
|
|
169
|
-
|
|
221
|
+
observationImpactIssue === null &&
|
|
222
|
+
isValidCounterfactualCheckResult(sensitivityResult, expected, allowedFanout);
|
|
170
223
|
if (!valid)
|
|
171
224
|
findings.push(counterfactualIntegrityFinding(entry, playwrightClassification
|
|
172
225
|
? playwrightCounterfactualDiagnostic(raw, result, expected, playwrightClassification.rejection_reasons)
|
|
173
226
|
: {
|
|
174
227
|
execution_status: raw.execution_status,
|
|
175
228
|
exit_code: raw.exit_code,
|
|
229
|
+
execution_error: raw.error,
|
|
176
230
|
result_status: result.status,
|
|
177
231
|
failed_assertions: failedAssertions,
|
|
178
232
|
finding_codes: result.findings.map((finding) => finding.code),
|
|
233
|
+
observation_impact_issue: observationImpactIssue,
|
|
179
234
|
}));
|
|
180
235
|
}
|
|
181
236
|
finally {
|
|
@@ -184,6 +239,232 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
|
|
|
184
239
|
}
|
|
185
240
|
return findings;
|
|
186
241
|
}
|
|
242
|
+
async function executeCounterfactualCheck(check, root, manifest, protectedAuthorityPaths, executionUniverse) {
|
|
243
|
+
const packageAuthorities = (check.observation_authorities ?? []).filter((authority) => authority.authority !== "external_confirmation");
|
|
244
|
+
if (!packageAuthorities.length)
|
|
245
|
+
return executeCheckRunner(check, root);
|
|
246
|
+
if (!manifest)
|
|
247
|
+
return {
|
|
248
|
+
raw_execution_identity: check.raw_execution_identity,
|
|
249
|
+
execution_identity: check.raw_execution_identity,
|
|
250
|
+
execution_status: "invalid_evidence",
|
|
251
|
+
exit_code: -1,
|
|
252
|
+
observations: {},
|
|
253
|
+
evidence_records: [],
|
|
254
|
+
stdout_sha256: "",
|
|
255
|
+
stderr_sha256: "",
|
|
256
|
+
attempts: 0,
|
|
257
|
+
duration_ms: 0,
|
|
258
|
+
error: "counterfactual_admitted_observation_required",
|
|
259
|
+
package_observations: [],
|
|
260
|
+
host_execution_attestation: null,
|
|
261
|
+
};
|
|
262
|
+
const group = executionUniverse.filter((candidate) => candidate.raw_execution_identity === check.raw_execution_identity);
|
|
263
|
+
const prepared = await prepareExecutionObservationGroup({
|
|
264
|
+
checks: group.length ? group : [check],
|
|
265
|
+
snapshot_root: root,
|
|
266
|
+
workspace_manifest: manifest,
|
|
267
|
+
protected_authority_paths: protectedAuthorityPaths,
|
|
268
|
+
});
|
|
269
|
+
try {
|
|
270
|
+
return await prepared.finalize(await executeCheckRunner(check, prepared.execution_root, prepared.runner_context));
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
await prepared.dispose();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function counterfactualMutationTargets(control) {
|
|
277
|
+
return control.mutation.type === "remove_paths"
|
|
278
|
+
? control.mutation.paths
|
|
279
|
+
: [control.mutation.path];
|
|
280
|
+
}
|
|
281
|
+
async function missingCounterfactualMutationTargets(root, targets) {
|
|
282
|
+
const missing = [];
|
|
283
|
+
for (const target of targets)
|
|
284
|
+
if (!(await stat(resolveInsideRepository(root, target, "counterfactual.target")).catch(() => null)))
|
|
285
|
+
missing.push(target);
|
|
286
|
+
return missing;
|
|
287
|
+
}
|
|
288
|
+
async function applyCounterfactualMutation(root, control) {
|
|
289
|
+
if (control.mutation.type === "remove_paths") {
|
|
290
|
+
for (const target of control.mutation.paths)
|
|
291
|
+
await rm(resolveInsideRepository(root, target, "counterfactual.remove_paths"), { recursive: true, force: true });
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (control.mutation.type === "replace_file") {
|
|
295
|
+
await copyFile(resolveInsideRepository(root, control.mutation.fixture_path, "counterfactual.fixture"), resolveInsideRepository(root, control.mutation.path, "counterfactual.path"));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
await applyNarrowSemanticMutation(root, control.mutation);
|
|
299
|
+
}
|
|
300
|
+
async function counterfactualObservationImpactIssue(entry, baselineResults, baselineRaw, mutatedResult, mutatedRaw, baselineRoot, mutatedRoot, mutationTargets, bindingCarrierPaths, protectedAuthorityPaths, executionUniverse) {
|
|
301
|
+
const baselineResult = baselineResults.find((candidate) => candidate.internal_id === entry.check.internal_id);
|
|
302
|
+
const machineClosing = [
|
|
303
|
+
...entry.check.positive_assertions,
|
|
304
|
+
...entry.check.negative_assertions,
|
|
305
|
+
].some((assertion) => assertion.claims.length > 0);
|
|
306
|
+
if (!baselineResult || !baselineRaw)
|
|
307
|
+
return machineClosing
|
|
308
|
+
? "counterfactual_admitted_observation_required"
|
|
309
|
+
: null;
|
|
310
|
+
const processObserved = (entry.check.observation_authorities ?? []).some((authority) => authority.authority === "package_process_json_exact");
|
|
311
|
+
const processClosure = processObserved
|
|
312
|
+
? entry.check.process_runtime_closure
|
|
313
|
+
: null;
|
|
314
|
+
if (processObserved) {
|
|
315
|
+
if (!processClosure)
|
|
316
|
+
return "process_runtime_closure_identity_mismatch";
|
|
317
|
+
const normalizedMutationTargets = mutationTargets.map((target, index) => normalizeRepositoryFile(target, `counterfactual.mutation_targets[${index}]`));
|
|
318
|
+
if (normalizedMutationTargets.some((target) => !processClosure.production_carrier_files.includes(target)))
|
|
319
|
+
return "counterfactual_runtime_reachability_unproven";
|
|
320
|
+
}
|
|
321
|
+
const observationChecks = counterfactualObservationChecks(entry.check, executionUniverse, processObserved);
|
|
322
|
+
const observationSets = await Promise.all(observationChecks.map(async (check) => {
|
|
323
|
+
const baselineCheckResult = baselineResults.find((candidate) => candidate.internal_id === check.internal_id);
|
|
324
|
+
const [baseline, mutated] = await Promise.all([
|
|
325
|
+
prepareAdmittedObservations({
|
|
326
|
+
check,
|
|
327
|
+
records: baselineCheckResult?.evidence_records ?? [],
|
|
328
|
+
snapshot_root: baselineRoot,
|
|
329
|
+
authority_paths: protectedAuthorityPaths,
|
|
330
|
+
package_observations: packageObservationsForCheck(check, baselineRaw.package_observations ?? []),
|
|
331
|
+
}),
|
|
332
|
+
prepareAdmittedObservations({
|
|
333
|
+
check,
|
|
334
|
+
records: check.internal_id === entry.check.internal_id
|
|
335
|
+
? mutatedResult.evidence_records
|
|
336
|
+
: [],
|
|
337
|
+
snapshot_root: mutatedRoot,
|
|
338
|
+
authority_paths: protectedAuthorityPaths,
|
|
339
|
+
package_observations: packageObservationsForCheck(check, mutatedRaw.package_observations ?? []),
|
|
340
|
+
}),
|
|
341
|
+
]);
|
|
342
|
+
return { check, baseline, mutated };
|
|
343
|
+
}));
|
|
344
|
+
const baselineEntries = observationSets.flatMap(({ check, baseline }) => baseline.entries.map((candidate) => ({
|
|
345
|
+
candidate,
|
|
346
|
+
check,
|
|
347
|
+
identity: scopedObservationImpactIdentity(check, candidate),
|
|
348
|
+
})));
|
|
349
|
+
const mutatedEntries = observationSets.flatMap(({ check, mutated }) => mutated.entries.map((candidate) => ({
|
|
350
|
+
candidate,
|
|
351
|
+
check,
|
|
352
|
+
identity: scopedObservationImpactIdentity(check, candidate),
|
|
353
|
+
})));
|
|
354
|
+
if (!baselineEntries.length || !mutatedEntries.length)
|
|
355
|
+
return machineClosing
|
|
356
|
+
? "counterfactual_admitted_observation_required"
|
|
357
|
+
: null;
|
|
358
|
+
const baselineIssue = baselineEntries.find(({ candidate }) => candidate.reason || !candidate.observation);
|
|
359
|
+
if (baselineIssue)
|
|
360
|
+
return `counterfactual_baseline_observation_invalid:${baselineIssue.candidate.reason ?? "missing"}`;
|
|
361
|
+
const mutatedIssue = mutatedEntries.find(({ candidate }) => candidate.reason || !candidate.observation);
|
|
362
|
+
if (mutatedIssue)
|
|
363
|
+
return `counterfactual_mutated_observation_invalid:${mutatedIssue.candidate.reason ?? "missing"}`;
|
|
364
|
+
if (processClosure) {
|
|
365
|
+
const baselineClosureIdentity = baselineRaw.host_execution_attestation
|
|
366
|
+
?.process_runtime_closure_identity ?? null;
|
|
367
|
+
const mutatedClosureIdentity = mutatedRaw.host_execution_attestation?.process_runtime_closure_identity ??
|
|
368
|
+
null;
|
|
369
|
+
if (baselineClosureIdentity !== processClosure.closure_identity ||
|
|
370
|
+
mutatedClosureIdentity !== processClosure.closure_identity ||
|
|
371
|
+
baselineClosureIdentity !== mutatedClosureIdentity)
|
|
372
|
+
return "process_runtime_closure_identity_mismatch";
|
|
373
|
+
}
|
|
374
|
+
const baselineKeys = baselineEntries.map(({ identity }) => identity).sort();
|
|
375
|
+
const mutatedKeys = mutatedEntries.map(({ identity }) => identity).sort();
|
|
376
|
+
if (canonicalValueJson(baselineKeys) !== canonicalValueJson(mutatedKeys))
|
|
377
|
+
return "counterfactual_obligation_universe_changed";
|
|
378
|
+
const baselineByFact = Object.fromEntries(baselineEntries.map(({ candidate, identity }) => [
|
|
379
|
+
identity,
|
|
380
|
+
candidate.observation.value_sha256,
|
|
381
|
+
]));
|
|
382
|
+
const mutatedByFact = Object.fromEntries(mutatedEntries.map(({ candidate, identity }) => [
|
|
383
|
+
identity,
|
|
384
|
+
candidate.observation.value_sha256,
|
|
385
|
+
]));
|
|
386
|
+
const expectedAssertions = new Set(entry.control.expected_assertion_failures);
|
|
387
|
+
const preservedAssertions = new Set(entry.control.preserved_assertions);
|
|
388
|
+
const allowedFanoutAssertions = new Set(entry.control.allowed_fanout_assertions ?? []);
|
|
389
|
+
const expectedFactRefs = baselineEntries
|
|
390
|
+
.filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
|
|
391
|
+
expectedAssertions.has(candidate.assertion_key))
|
|
392
|
+
.map(({ identity }) => identity);
|
|
393
|
+
if (!expectedFactRefs.length)
|
|
394
|
+
return "counterfactual_expected_fact_observation_missing";
|
|
395
|
+
const preservedFactRefs = baselineEntries
|
|
396
|
+
.filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
|
|
397
|
+
preservedAssertions.has(candidate.assertion_key))
|
|
398
|
+
.map(({ identity }) => identity);
|
|
399
|
+
const allowedFanoutFactRefs = baselineEntries
|
|
400
|
+
.filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
|
|
401
|
+
allowedFanoutAssertions.has(candidate.assertion_key))
|
|
402
|
+
.map(({ identity }) => identity);
|
|
403
|
+
const targetLive = entry.control.preserved_assertions.every((key) => mutatedResult.assertion_results.some((assertion) => assertion.key === key && assertion.passed));
|
|
404
|
+
let carrierRole = "product";
|
|
405
|
+
if (!processObserved) {
|
|
406
|
+
const carrierRoleConflict = mutationTargets
|
|
407
|
+
.map((target) => classifyMachineObservationCarrierRoleConflict({
|
|
408
|
+
carrier_pattern: target,
|
|
409
|
+
expected_authority_patterns: [
|
|
410
|
+
...entry.check.verification_inputs,
|
|
411
|
+
...protectedAuthorityPaths,
|
|
412
|
+
],
|
|
413
|
+
evidence_role_patterns: [
|
|
414
|
+
...entry.check.expected_output_paths,
|
|
415
|
+
...entry.check.artifact_globs,
|
|
416
|
+
],
|
|
417
|
+
}))
|
|
418
|
+
.find((candidate) => candidate !== null);
|
|
419
|
+
if (carrierRoleConflict)
|
|
420
|
+
return `counterfactual_static_carrier_${carrierRoleConflict}_forbidden`;
|
|
421
|
+
carrierRole = mutationTargets.every((target) => bindingCarrierPaths.some((pattern) => matchesRepoPattern(target, pattern)) &&
|
|
422
|
+
entry.check.input_paths.some((pattern) => matchesRepoPattern(target, pattern)))
|
|
423
|
+
? "product"
|
|
424
|
+
: "evidence";
|
|
425
|
+
}
|
|
426
|
+
return validateCounterfactualObservationImpact({
|
|
427
|
+
baseline_by_fact: baselineByFact,
|
|
428
|
+
mutated_by_fact: mutatedByFact,
|
|
429
|
+
expected_affected_fact_refs: expectedFactRefs,
|
|
430
|
+
preserved_fact_refs: preservedFactRefs,
|
|
431
|
+
allowed_fanout_fact_refs: allowedFanoutFactRefs,
|
|
432
|
+
target_live: targetLive,
|
|
433
|
+
carrier_role: carrierRole,
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
function counterfactualObservationChecks(check, executionUniverse, processObserved) {
|
|
437
|
+
if (!processObserved)
|
|
438
|
+
return [check];
|
|
439
|
+
const checks = new Map([[check.internal_id, check]]);
|
|
440
|
+
for (const candidate of executionUniverse)
|
|
441
|
+
if (candidate.raw_execution_identity === check.raw_execution_identity &&
|
|
442
|
+
(candidate.observation_authorities ?? []).some((authority) => authority.authority !== "external_confirmation"))
|
|
443
|
+
checks.set(candidate.internal_id, candidate);
|
|
444
|
+
return [...checks.values()].sort((left, right) => left.internal_id.localeCompare(right.internal_id));
|
|
445
|
+
}
|
|
446
|
+
function packageObservationsForCheck(check, observations) {
|
|
447
|
+
return observations.filter((candidate) => (check.observation_authorities ?? []).some((authority) => authority.authority === candidate.authority &&
|
|
448
|
+
authority.observation_identity === candidate.observation_identity &&
|
|
449
|
+
authority.assertion_ref === candidate.assertion_ref &&
|
|
450
|
+
authority.obligation_ref === candidate.obligation_ref &&
|
|
451
|
+
authority.method === candidate.method));
|
|
452
|
+
}
|
|
453
|
+
function observationImpactIdentity(candidate) {
|
|
454
|
+
return (candidate.authority_key ??
|
|
455
|
+
`${candidate.assertion_key}\0${candidate.obligation_ref ?? candidate.identity_ref}\0${candidate.method}`);
|
|
456
|
+
}
|
|
457
|
+
function scopedObservationImpactIdentity(check, candidate) {
|
|
458
|
+
return `${check.internal_id}\0${observationImpactIdentity(candidate)}`;
|
|
459
|
+
}
|
|
460
|
+
function compiledAuthorityPaths(compiled) {
|
|
461
|
+
return [
|
|
462
|
+
compiled.contract_file,
|
|
463
|
+
...Object.keys(compiled.contract_files),
|
|
464
|
+
...Object.keys(compiled.source_hashes),
|
|
465
|
+
...compiled.context_snapshot.files,
|
|
466
|
+
];
|
|
467
|
+
}
|
|
187
468
|
function playwrightCounterfactualDiagnostic(raw, result, expectedAssertions, rejectionReasons) {
|
|
188
469
|
const caseIds = result.assertion_results
|
|
189
470
|
.map((assertion) => /^playwright\.case\.([a-z0-9][a-z0-9-]*)\.passed$/u.exec(assertion.observation)?.[1])
|
|
@@ -225,23 +506,20 @@ function counterfactualIntegrityFinding(entry, actual) {
|
|
|
225
506
|
next_action: "Repair the referenced implementation carrier or proof so only the designated Assertion value mismatches demonstrate sensitivity.",
|
|
226
507
|
};
|
|
227
508
|
}
|
|
228
|
-
export function isValidCounterfactualCheckResult(result, expectedAssertionFailures) {
|
|
509
|
+
export function isValidCounterfactualCheckResult(result, expectedAssertionFailures, allowedFanoutAssertions = []) {
|
|
229
510
|
const expected = [...expectedAssertionFailures].sort();
|
|
511
|
+
const allowed = new Set([...expected, ...allowedFanoutAssertions]);
|
|
230
512
|
const failedAssertions = result.assertion_results
|
|
231
513
|
.filter((assertion) => !assertion.passed)
|
|
232
514
|
.map((assertion) => assertion.key)
|
|
233
515
|
.sort();
|
|
234
516
|
return (result.status === "assertion_failed" &&
|
|
235
|
-
result.findings.length ===
|
|
236
|
-
result.findings.
|
|
237
|
-
expected.length &&
|
|
238
|
-
result.findings
|
|
239
|
-
.filter((finding) => finding.assertion_key)
|
|
240
|
-
.every((finding) => expected.some((key) => finding.assertion_key === key)) &&
|
|
517
|
+
result.findings.length === failedAssertions.length &&
|
|
518
|
+
result.findings.every((finding) => Boolean(finding.assertion_key) && allowed.has(finding.assertion_key)) &&
|
|
241
519
|
result.findings.every((finding) => finding.code === "assertion_value_mismatch") &&
|
|
242
520
|
result.assertion_results
|
|
243
521
|
.filter((assertion) => !assertion.passed)
|
|
244
522
|
.every((assertion) => assertion.status === "assertion_value_mismatch") &&
|
|
245
|
-
|
|
246
|
-
failedAssertions.every((item
|
|
523
|
+
expected.every((item) => failedAssertions.includes(item)) &&
|
|
524
|
+
failedAssertions.every((item) => allowed.has(item)));
|
|
247
525
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ExactDigestComparisonInput {
|
|
2
|
+
identity: Readonly<Record<string, unknown>>;
|
|
3
|
+
actual_value_sha256: string;
|
|
4
|
+
expected_value_sha256: string;
|
|
5
|
+
comparator: string;
|
|
6
|
+
mode: "exact" | "tolerance";
|
|
7
|
+
parameters_sha256: string;
|
|
8
|
+
tolerance_sha256: string | null;
|
|
9
|
+
mask_sha256: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface ExactDigestComparisonResult {
|
|
12
|
+
passed: boolean;
|
|
13
|
+
result_sha256: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function evaluateExactDigestComparison(input: ExactDigestComparisonInput): ExactDigestComparisonResult;
|
|
16
|
+
export declare function exactComparisonResultIdentity(material: Readonly<Record<string, unknown>>): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
|
|
2
|
+
export function evaluateExactDigestComparison(input) {
|
|
3
|
+
if (input.comparator !== "exact_value" ||
|
|
4
|
+
input.mode !== "exact" ||
|
|
5
|
+
input.tolerance_sha256 !== null ||
|
|
6
|
+
input.mask_sha256 !== null)
|
|
7
|
+
throw new Error("exact_digest_comparison_authority_invalid");
|
|
8
|
+
const { actual_value_sha256, expected_value_sha256 } = input;
|
|
9
|
+
const passed = actual_value_sha256 === expected_value_sha256;
|
|
10
|
+
const material = {
|
|
11
|
+
identity: input.identity,
|
|
12
|
+
actual_value_sha256: input.actual_value_sha256,
|
|
13
|
+
expected_value_sha256: input.expected_value_sha256,
|
|
14
|
+
comparator: input.comparator,
|
|
15
|
+
mode: input.mode,
|
|
16
|
+
parameters_sha256: input.parameters_sha256,
|
|
17
|
+
tolerance_sha256: input.tolerance_sha256,
|
|
18
|
+
mask_sha256: input.mask_sha256,
|
|
19
|
+
passed,
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
passed,
|
|
23
|
+
result_sha256: exactComparisonResultIdentity(material),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function exactComparisonResultIdentity(material) {
|
|
27
|
+
return sha256Hex(canonicalValueJson(material));
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CheckRunnerExecutionContextV2, CompiledCheckV2, RawCommandExecutionV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
|
|
2
|
+
export interface PreparedExecutionObservationGroupV2 {
|
|
3
|
+
readonly execution_root: string;
|
|
4
|
+
readonly runner_context: CheckRunnerExecutionContextV2;
|
|
5
|
+
finalize(raw: RawCommandExecutionV2): Promise<RawCommandExecutionV2>;
|
|
6
|
+
dispose(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Freezes every selected Raw Execution group's observation inputs before the
|
|
10
|
+
* caller is allowed to start any runner. Keeping this as one owner prevents a
|
|
11
|
+
* prior execution from priming a later group's supposedly pre-run carrier.
|
|
12
|
+
*/
|
|
13
|
+
export declare function prepareExecutionObservationUniverse(input: {
|
|
14
|
+
groups: readonly (readonly CompiledCheckV2[])[];
|
|
15
|
+
snapshot_root: string;
|
|
16
|
+
workspace_manifest: WorkspaceManifestV2;
|
|
17
|
+
protected_authority_paths?: readonly string[];
|
|
18
|
+
}): Promise<PreparedExecutionObservationGroupV2[]>;
|
|
19
|
+
export declare function prepareExecutionObservationGroup(input: {
|
|
20
|
+
checks: readonly CompiledCheckV2[];
|
|
21
|
+
snapshot_root: string;
|
|
22
|
+
workspace_manifest: WorkspaceManifestV2;
|
|
23
|
+
protected_authority_paths?: readonly string[];
|
|
24
|
+
}): Promise<PreparedExecutionObservationGroupV2>;
|