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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { copyFile, cp, lstat, mkdir, mkdtemp, readlink, realpath, rm, symlink, } from "node:fs/promises";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { matchesRepoPattern } from "./long-task-paths.js";
|
|
4
|
+
import { matchesRepoPattern, normalizeRepositoryFile, } from "./long-task-paths.js";
|
|
5
5
|
const TRANSIENT_REMOVE_CODES = new Set([
|
|
6
6
|
"EBUSY",
|
|
7
7
|
"EMFILE",
|
|
@@ -11,7 +11,7 @@ const TRANSIENT_REMOVE_CODES = new Set([
|
|
|
11
11
|
]);
|
|
12
12
|
const REMOVE_RETRY_LIMIT = process.platform === "win32" ? 6 : 2;
|
|
13
13
|
const REMOVE_RETRY_DELAY_MS = 100;
|
|
14
|
-
export async function createCounterfactualSandbox(snapshotRoot, check, control, bindingCarrierPaths, manifest) {
|
|
14
|
+
export async function createCounterfactualSandbox(snapshotRoot, check, control, bindingCarrierPaths, manifest, protectedAuthorityPaths = []) {
|
|
15
15
|
const root = await mkdtemp(path.join(os.tmpdir(), "ty-context-counterfactual-"));
|
|
16
16
|
if (!manifest) {
|
|
17
17
|
await cp(snapshotRoot, root, {
|
|
@@ -24,6 +24,7 @@ export async function createCounterfactualSandbox(snapshotRoot, check, control,
|
|
|
24
24
|
const exactPaths = new Set([
|
|
25
25
|
...Object.keys(check.runner.frozen_files),
|
|
26
26
|
...Object.keys(check.verification_input_hashes),
|
|
27
|
+
...(check.process_runtime_closure?.allowed_runtime_files ?? []),
|
|
27
28
|
check.runner.resolved_target,
|
|
28
29
|
...(control.mutation.type === "replace_file"
|
|
29
30
|
? [control.mutation.fixture_path]
|
|
@@ -44,9 +45,11 @@ export async function createCounterfactualSandbox(snapshotRoot, check, control,
|
|
|
44
45
|
if (requirement.kind === "directory")
|
|
45
46
|
patterns.push(`${requirement.target}/**`);
|
|
46
47
|
}
|
|
47
|
-
const
|
|
48
|
-
.map((file) => file.path)
|
|
49
|
-
.
|
|
48
|
+
const candidates = new Set([
|
|
49
|
+
...manifest.files.map((file) => file.path),
|
|
50
|
+
...protectedAuthorityPaths.map((file, index) => normalizeRepositoryFile(file, `counterfactual.protected_authority_paths[${index}]`)),
|
|
51
|
+
]);
|
|
52
|
+
const selected = [...candidates].filter((relative) => exactPaths.has(relative) ||
|
|
50
53
|
patterns.some((pattern) => matchesRepoPattern(relative, pattern)));
|
|
51
54
|
await copyInBatches(snapshotRoot, root, selected);
|
|
52
55
|
await mkdir(path.join(root, check.runner.resolved_cwd), { recursive: true });
|
|
@@ -24,6 +24,7 @@ export interface CounterfactualControlV2 {
|
|
|
24
24
|
mutation: CounterfactualMutationV2;
|
|
25
25
|
expected_assertion_failures: string[];
|
|
26
26
|
preserved_assertions: string[];
|
|
27
|
+
allowed_fanout_assertions: string[];
|
|
27
28
|
}
|
|
28
29
|
export interface GlobalCounterfactualControlV2 {
|
|
29
30
|
key: string;
|
|
@@ -33,4 +34,5 @@ export interface GlobalCounterfactualControlV2 {
|
|
|
33
34
|
mutation: CounterfactualMutationV2;
|
|
34
35
|
expected_assertion_failures: string[];
|
|
35
36
|
preserved_assertions: string[];
|
|
37
|
+
allowed_fanout_assertions: string[];
|
|
36
38
|
}
|
|
@@ -86,6 +86,8 @@ export async function compileDeliveryContract(workdirInput, projectRootInput = p
|
|
|
86
86
|
verification_inputs: check.verification_input_hashes,
|
|
87
87
|
raw_execution_identity: check.raw_execution_identity,
|
|
88
88
|
evidence_adapter: check.evidence_adapter,
|
|
89
|
+
observation_authorities: check.observation_authorities,
|
|
90
|
+
process_runtime_closure: check.process_runtime_closure,
|
|
89
91
|
})),
|
|
90
92
|
}));
|
|
91
93
|
let authorityRevision = options.authority_revision ?? previous?.authority_revision ?? 1;
|
|
@@ -11,3 +11,4 @@ export interface ParseDeliveryContractOptions {
|
|
|
11
11
|
export declare function parseDeliveryContract(workdir: string): Promise<DeliveryContractV2>;
|
|
12
12
|
export declare function parseDeliveryContractBundle(workdirInput: string, repositoryInput?: string, options?: ParseDeliveryContractOptions): Promise<ParsedDeliveryContractV2>;
|
|
13
13
|
export declare function parseDeliveryContractText(raw: string): DeliveryContractV2;
|
|
14
|
+
export declare function parseDeliveryContractTextForMigration(raw: string): DeliveryContractV2;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { materializeLongTaskCompactCarrier, materializeLongTaskCompactCarrierForMigration, } from "./long-task-compact-carrier.js";
|
|
3
4
|
import { parseStrictYaml, sha256Hex } from "./strict-codec.js";
|
|
4
5
|
import { validateDeliveryContractStructure } from "./long-task-delivery-validation.js";
|
|
5
6
|
import { parseOutcome, parseOutcomeFragment, safeFragmentPath, } from "./long-task-outcome-parser.js";
|
|
@@ -20,7 +21,11 @@ export async function parseDeliveryContractBundle(workdirInput, repositoryInput,
|
|
|
20
21
|
? path.resolve(repositoryInput)
|
|
21
22
|
: await repositoryRoot(workdir);
|
|
22
23
|
const raw = await readFile(await assertProtectedRepositoryFile(repository, file, "delivery_contract"), "utf8");
|
|
23
|
-
|
|
24
|
+
let root = parseRoot(raw, true);
|
|
25
|
+
if (Object.hasOwn(root, "compact_semantic_carrier")) {
|
|
26
|
+
root = materializeLongTaskCompactCarrier(root).root;
|
|
27
|
+
assertNoSemanticDriftMigration(semanticDriftMigrationFields(root));
|
|
28
|
+
}
|
|
24
29
|
const hasInline = Object.hasOwn(root, "outcomes");
|
|
25
30
|
const hasFiles = Object.hasOwn(root, "outcome_files");
|
|
26
31
|
if (hasInline === hasFiles)
|
|
@@ -64,7 +69,19 @@ export async function parseDeliveryContractBundle(workdirInput, repositoryInput,
|
|
|
64
69
|
};
|
|
65
70
|
}
|
|
66
71
|
export function parseDeliveryContractText(raw) {
|
|
67
|
-
|
|
72
|
+
return parseDeliveryContractTextInternal(raw, false);
|
|
73
|
+
}
|
|
74
|
+
export function parseDeliveryContractTextForMigration(raw) {
|
|
75
|
+
return parseDeliveryContractTextInternal(raw, true);
|
|
76
|
+
}
|
|
77
|
+
function parseDeliveryContractTextInternal(raw, allowLegacyCarrier) {
|
|
78
|
+
let root = parseRoot(raw, false);
|
|
79
|
+
if (Object.hasOwn(root, "compact_semantic_carrier")) {
|
|
80
|
+
root = (allowLegacyCarrier
|
|
81
|
+
? materializeLongTaskCompactCarrierForMigration(root)
|
|
82
|
+
: materializeLongTaskCompactCarrier(root)).root;
|
|
83
|
+
assertNoSemanticDriftMigration(semanticDriftMigrationFields(root));
|
|
84
|
+
}
|
|
68
85
|
const contract = parseContractRoot(root, array(root.outcomes, "outcomes").map((item, index) => parseOutcome(item, `outcomes[${index}]`)));
|
|
69
86
|
validateDeliveryContractStructure(contract);
|
|
70
87
|
return contract;
|
|
@@ -77,16 +94,31 @@ function parseRoot(raw, bundle) {
|
|
|
77
94
|
decoded.schema_version ===
|
|
78
95
|
"long-task-delivery-v1")
|
|
79
96
|
throw new Error("long_task_delivery_v1_retired_use_v2");
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
if (!decoded ||
|
|
98
|
+
typeof decoded !== "object" ||
|
|
99
|
+
Array.isArray(decoded) ||
|
|
100
|
+
!Object.hasOwn(decoded, "compact_semantic_carrier"))
|
|
101
|
+
assertNoSemanticDriftMigration(semanticDriftMigrationFields(decoded));
|
|
102
|
+
const root = object(decoded, "$", [
|
|
82
103
|
"schema_version",
|
|
83
104
|
"semantic_fact_manifest",
|
|
84
105
|
"task",
|
|
85
|
-
"source_claims",
|
|
86
106
|
"stages",
|
|
87
107
|
"risk",
|
|
88
108
|
"global",
|
|
89
|
-
], bundle
|
|
109
|
+
], bundle
|
|
110
|
+
? [
|
|
111
|
+
"source_claims",
|
|
112
|
+
"compact_semantic_carrier",
|
|
113
|
+
"outcomes",
|
|
114
|
+
"outcome_files",
|
|
115
|
+
]
|
|
116
|
+
: ["source_claims", "compact_semantic_carrier", "outcomes"]);
|
|
117
|
+
const hasExpanded = Object.hasOwn(root, "source_claims");
|
|
118
|
+
const hasCompact = Object.hasOwn(root, "compact_semantic_carrier");
|
|
119
|
+
if (hasExpanded === hasCompact)
|
|
120
|
+
throw new Error("delivery_contract_invalid:$:exactly one of source_claims or compact_semantic_carrier is required");
|
|
121
|
+
return root;
|
|
90
122
|
}
|
|
91
123
|
function parseContractRoot(root, outcomes) {
|
|
92
124
|
literal(root.schema_version, ["long-task-delivery-v2"], "schema_version");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DesignResourceHandoffPreflightV1, DesignResourceHandoffTargetV1 } from "./design-resource-handoff-types.js";
|
|
2
|
+
import type { DesignResourceHandoffPreflightV2 } from "./design-resource-symbolic-fact-types.js";
|
|
2
3
|
import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
|
|
3
4
|
export interface ContractDesignTarget {
|
|
4
5
|
outcome_key: string;
|
|
@@ -10,7 +11,7 @@ export interface IndexedHandoffTarget {
|
|
|
10
11
|
target: DesignResourceHandoffTargetV1;
|
|
11
12
|
}
|
|
12
13
|
export interface LongTaskDesignHandoffConsumer {
|
|
13
|
-
consume(preflight: DesignResourceHandoffPreflightV1): void;
|
|
14
|
+
consume(preflight: DesignResourceHandoffPreflightV1 | DesignResourceHandoffPreflightV2): void;
|
|
14
15
|
finish(): void;
|
|
15
16
|
}
|
|
16
17
|
export declare function validateLongTaskDesignResourceHandoffs(contract: DeliveryContractV2, repository: string): Promise<void>;
|
|
@@ -2,8 +2,8 @@ import { readFile } from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { containsDesignResourceHandoff, parseDesignResourceHandoffMarkdown, } from "./design-resource-handoff-parser.js";
|
|
4
4
|
import { createDesignResourceHandoffSetIntegrity } from "./design-resource-handoff-set-integrity.js";
|
|
5
|
-
import {
|
|
6
|
-
import { assertSameSet, designSourceItemClaims, invalid, validateTargetIdentity, validateVerificationMethodBindings, } from "./long-task-design-resource-method-binding.js";
|
|
5
|
+
import { preflightParsedDesignResourceHandoffAny } from "./design-resource-handoff-validation.js";
|
|
6
|
+
import { assertSameSet, designSourceItemClaims, invalid, validateTargetIdentity, validateSymbolicTargetIdentity, validateSymbolicVerificationMethodBindings, validateVerificationMethodBindings, } from "./long-task-design-resource-method-binding.js";
|
|
7
7
|
import { validateLongTaskDesignTargetCapabilities } from "./long-task-design-target-capabilities.js";
|
|
8
8
|
import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
|
|
9
9
|
export async function validateLongTaskDesignResourceHandoffs(contract, repository) {
|
|
@@ -15,7 +15,7 @@ export async function validateLongTaskDesignResourceHandoffs(contract, repositor
|
|
|
15
15
|
const content = await readFile(file, "utf8");
|
|
16
16
|
if (!containsDesignResourceHandoff(content))
|
|
17
17
|
continue;
|
|
18
|
-
consumer.consume(await
|
|
18
|
+
consumer.consume(await preflightParsedDesignResourceHandoffAny(repository, parseDesignResourceHandoffMarkdown(sourcePath, content)));
|
|
19
19
|
}
|
|
20
20
|
consumer.finish();
|
|
21
21
|
}
|
|
@@ -32,9 +32,30 @@ export function createLongTaskDesignHandoffConsumer(contract) {
|
|
|
32
32
|
let duplicate = null;
|
|
33
33
|
const unbound = [];
|
|
34
34
|
const handoffSetIntegrity = createDesignResourceHandoffSetIntegrity(invalid);
|
|
35
|
+
const allSourceItems = new Set();
|
|
36
|
+
const resourcePaths = new Map();
|
|
37
|
+
let crossVersionIssue = null;
|
|
38
|
+
const recordCrossVersionIssue = (code, detail) => {
|
|
39
|
+
crossVersionIssue ??= { code, detail };
|
|
40
|
+
};
|
|
35
41
|
return {
|
|
36
42
|
consume(preflight) {
|
|
37
|
-
|
|
43
|
+
for (const sourceItem of preflight.source_item_keys) {
|
|
44
|
+
if (allSourceItems.has(sourceItem))
|
|
45
|
+
recordCrossVersionIssue("handoff_set_source_item_duplicate", sourceItem);
|
|
46
|
+
else
|
|
47
|
+
allSourceItems.add(sourceItem);
|
|
48
|
+
}
|
|
49
|
+
for (const resource of preflight.handoff.resources) {
|
|
50
|
+
const identity = JSON.stringify(resource);
|
|
51
|
+
const previous = resourcePaths.get(resource.path);
|
|
52
|
+
if (previous && previous !== identity)
|
|
53
|
+
recordCrossVersionIssue("handoff_set_resource_path_conflict", resource.path);
|
|
54
|
+
else
|
|
55
|
+
resourcePaths.set(resource.path, identity);
|
|
56
|
+
}
|
|
57
|
+
if (!("preflight_schema_version" in preflight))
|
|
58
|
+
handoffSetIntegrity.consume(preflight);
|
|
38
59
|
for (const target of preflight.handoff.targets) {
|
|
39
60
|
if (indexedTargetKeys.has(target.key)) {
|
|
40
61
|
duplicate ??= target.key;
|
|
@@ -46,13 +67,27 @@ export function createLongTaskDesignHandoffConsumer(contract) {
|
|
|
46
67
|
unbound.push(target.key);
|
|
47
68
|
continue;
|
|
48
69
|
}
|
|
49
|
-
const indexedTarget = { preflight, target };
|
|
50
70
|
consumed.add(target.key);
|
|
51
71
|
try {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
72
|
+
if ("preflight_schema_version" in preflight) {
|
|
73
|
+
const indexedTarget = {
|
|
74
|
+
preflight,
|
|
75
|
+
target,
|
|
76
|
+
};
|
|
77
|
+
validateSymbolicTargetIdentity(contractTarget, indexedTarget);
|
|
78
|
+
validateSymbolicCoverageClaims(contract, contractTarget, indexedTarget);
|
|
79
|
+
validateBlockerBindings(contract, contractTarget, indexedTarget);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const indexedTarget = {
|
|
83
|
+
preflight,
|
|
84
|
+
target: target,
|
|
85
|
+
};
|
|
86
|
+
validateTargetIdentity(contractTarget, indexedTarget);
|
|
87
|
+
validateLongTaskDesignTargetCapabilities(contract, contractTarget, indexedTarget);
|
|
88
|
+
validateCoverageClaims(contract, contractTarget, indexedTarget);
|
|
89
|
+
validateBlockerBindings(contract, contractTarget, indexedTarget);
|
|
90
|
+
}
|
|
56
91
|
}
|
|
57
92
|
catch (error) {
|
|
58
93
|
validationErrors.set(target.key, error);
|
|
@@ -63,6 +98,8 @@ export function createLongTaskDesignHandoffConsumer(contract) {
|
|
|
63
98
|
if (duplicate)
|
|
64
99
|
invalid("handoff_target_duplicate", duplicate);
|
|
65
100
|
handoffSetIntegrity.finish();
|
|
101
|
+
if (crossVersionIssue)
|
|
102
|
+
invalid(crossVersionIssue.code, crossVersionIssue.detail);
|
|
66
103
|
for (const contractTarget of contractTargets) {
|
|
67
104
|
if (!consumed.has(contractTarget.target.key))
|
|
68
105
|
invalid("target_handoff_missing", contractTarget.target.key);
|
|
@@ -74,6 +111,23 @@ export function createLongTaskDesignHandoffConsumer(contract) {
|
|
|
74
111
|
},
|
|
75
112
|
};
|
|
76
113
|
}
|
|
114
|
+
function validateSymbolicCoverageClaims(contract, contractTarget, indexed) {
|
|
115
|
+
const claims = new Map(contract.source_claims.map((item) => [item.key, item]));
|
|
116
|
+
const rows = indexed.preflight.handoff.coverage.filter((row) => row.target_ref === contractTarget.target.key);
|
|
117
|
+
if (!rows.length)
|
|
118
|
+
invalid("v2_target_covered_claims_required", contractTarget.target.key);
|
|
119
|
+
const sourceItemRefs = [
|
|
120
|
+
...new Set([
|
|
121
|
+
...rows.flatMap((row) => row.source_item_refs),
|
|
122
|
+
...indexed.preflight.manifest.fact_rules.flatMap((rule) => rule.source_item_refs),
|
|
123
|
+
...indexed.preflight.manifest.disposition_regions.flatMap((region) => region.source_item_refs),
|
|
124
|
+
]),
|
|
125
|
+
];
|
|
126
|
+
const claimsBySourceItem = new Map();
|
|
127
|
+
for (const sourceItemRef of sourceItemRefs)
|
|
128
|
+
claimsBySourceItem.set(sourceItemRef, designSourceItemClaims(contract, contractTarget, indexed, sourceItemRef, claims));
|
|
129
|
+
validateSymbolicVerificationMethodBindings(contract, contractTarget, indexed, claimsBySourceItem);
|
|
130
|
+
}
|
|
77
131
|
function validateCoverageClaims(contract, contractTarget, indexed) {
|
|
78
132
|
const target = contractTarget.target;
|
|
79
133
|
const check = contract.outcomes
|
|
@@ -103,8 +157,14 @@ function validateBlockerBindings(contract, contractTarget, indexed) {
|
|
|
103
157
|
item.key,
|
|
104
158
|
item,
|
|
105
159
|
]));
|
|
106
|
-
const availableMethods = new Set(
|
|
107
|
-
|
|
160
|
+
const availableMethods = new Set([
|
|
161
|
+
...contractTarget.target.verification_method_bindings,
|
|
162
|
+
...(contractTarget.target.symbolic_method_bindings ?? []),
|
|
163
|
+
].map((item) => item.method));
|
|
164
|
+
const blockers = "preflight_schema_version" in indexed.preflight
|
|
165
|
+
? indexed.preflight.manifest.acceptance_blockers
|
|
166
|
+
: indexed.preflight.handoff.acceptance_blockers;
|
|
167
|
+
for (const blocker of blockers) {
|
|
108
168
|
if (!blocker.target_refs.includes(contractTarget.target.key))
|
|
109
169
|
continue;
|
|
110
170
|
const contractBlocker = bound.get(blocker.key);
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { DesignResourceHandoffPreflightV1 } from "./design-resource-handoff-types.js";
|
|
2
|
+
import type { DesignResourceHandoffPreflightV2, DesignResourceSymbolicHandoffTargetV2 } from "./design-resource-symbolic-fact-types.js";
|
|
2
3
|
import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
|
|
3
4
|
import type { ContractDesignTarget, IndexedHandoffTarget } from "./long-task-design-resource-handoff.js";
|
|
4
5
|
export declare function validateTargetIdentity(contractTarget: ContractDesignTarget, indexed: IndexedHandoffTarget): void;
|
|
5
|
-
export
|
|
6
|
+
export interface IndexedSymbolicHandoffTarget {
|
|
7
|
+
preflight: DesignResourceHandoffPreflightV2;
|
|
8
|
+
target: DesignResourceSymbolicHandoffTargetV2;
|
|
9
|
+
}
|
|
10
|
+
export declare function validateSymbolicTargetIdentity(contractTarget: ContractDesignTarget, indexed: IndexedSymbolicHandoffTarget): void;
|
|
11
|
+
export declare function validateSymbolicVerificationMethodBindings(contract: DeliveryContractV2, contractTarget: ContractDesignTarget, indexed: IndexedSymbolicHandoffTarget, claimsBySourceItem: Map<string, string[]>): void;
|
|
12
|
+
export declare function designSourceItemClaims(contract: DeliveryContractV2, contractTarget: ContractDesignTarget, indexed: IndexedHandoffTarget | IndexedSymbolicHandoffTarget, sourceItemRef: string, claims?: Map<string, import("./long-task-contract-types.js").SourceClaimV2>): string[];
|
|
6
13
|
export declare function validateVerificationMethodBindings(target: ContractDesignTarget["target"], check: DeliveryContractV2["outcomes"][number]["acceptance"]["checks"][number], facts: DesignResourceHandoffPreflightV1["handoff"]["facts"], proofs: DesignResourceHandoffPreflightV1["handoff"]["proof_obligations"], indexed: IndexedHandoffTarget, claimsBySourceItem: Map<string, string[]>): void;
|
|
7
14
|
export declare function assertSameSet(actual: string[], expected: string[], code: string, detail: string): void;
|
|
8
15
|
export declare function invalid(code: string, detail: string): never;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { designResourceSymbolicNoninterferenceProofDigest } from "./design-resource-symbolic-validation-support.js";
|
|
2
|
+
import { matchesRepoPattern } from "./long-task-paths.js";
|
|
1
3
|
export function validateTargetIdentity(contractTarget, indexed) {
|
|
2
4
|
const { target } = contractTarget;
|
|
5
|
+
if (target.fact_model !== undefined)
|
|
6
|
+
invalid("v1_target_fact_model_must_be_absent", target.key);
|
|
3
7
|
const handoffTarget = indexed.target;
|
|
4
8
|
if (target.interpretation !== handoffTarget.interpretation)
|
|
5
9
|
invalid("target_interpretation_mismatch", `${target.key}:${target.interpretation}:${handoffTarget.interpretation}`);
|
|
@@ -8,6 +12,110 @@ export function validateTargetIdentity(contractTarget, indexed) {
|
|
|
8
12
|
.path);
|
|
9
13
|
assertSameSet(target.source_paths, [indexed.preflight.handoff_path, ...resourcePaths], "target_source_paths_mismatch", target.key);
|
|
10
14
|
}
|
|
15
|
+
export function validateSymbolicTargetIdentity(contractTarget, indexed) {
|
|
16
|
+
const { target } = contractTarget;
|
|
17
|
+
const handoffTarget = indexed.target;
|
|
18
|
+
if (target.fact_model !== "symbolic_rules_v2")
|
|
19
|
+
invalid("v2_target_fact_model_required", target.key);
|
|
20
|
+
if (target.interpretation !== handoffTarget.interpretation)
|
|
21
|
+
invalid("target_interpretation_mismatch", `${target.key}:${target.interpretation}:${handoffTarget.interpretation}`);
|
|
22
|
+
if (target.condition_keys.length)
|
|
23
|
+
invalid("v2_ground_condition_keys_forbidden", target.key);
|
|
24
|
+
if (target.verification_method_bindings.length)
|
|
25
|
+
invalid("v2_ground_method_bindings_forbidden", target.key);
|
|
26
|
+
const resourcePaths = handoffTarget.resource_refs.map((ref) => indexed.preflight.handoff.resources.find((item) => item.key === ref)
|
|
27
|
+
.path);
|
|
28
|
+
assertSameSet(target.source_paths, [indexed.preflight.handoff_path, ...resourcePaths], "target_source_paths_mismatch", target.key);
|
|
29
|
+
}
|
|
30
|
+
export function validateSymbolicVerificationMethodBindings(contract, contractTarget, indexed, claimsBySourceItem) {
|
|
31
|
+
const target = contractTarget.target;
|
|
32
|
+
const preflight = indexed.preflight;
|
|
33
|
+
const check = contract.outcomes
|
|
34
|
+
.find((item) => item.key === contractTarget.outcome_key)
|
|
35
|
+
.acceptance.checks.find((item) => item.key === target.conformance_check_ref);
|
|
36
|
+
const bindings = target.symbolic_method_bindings ?? [];
|
|
37
|
+
const expectedMethods = [
|
|
38
|
+
...new Set(preflight.manifest.semantic_proof_obligations.map((item) => item.method)),
|
|
39
|
+
];
|
|
40
|
+
assertSameSet(bindings.map((item) => item.method), expectedMethods, "v2_verification_methods_mismatch", target.key);
|
|
41
|
+
const assertionRefs = bindings.map((item) => item.assertion_ref);
|
|
42
|
+
if (new Set(assertionRefs).size !== assertionRefs.length)
|
|
43
|
+
invalid("v2_verification_method_assertion_duplicate", target.key);
|
|
44
|
+
if (assertionRefs.includes(target.conformance_assertion_ref))
|
|
45
|
+
invalid("v2_verification_method_assertion_must_be_independent", target.key);
|
|
46
|
+
const boundObligationRefs = [];
|
|
47
|
+
const artifactPaths = new Set();
|
|
48
|
+
for (const binding of bindings) {
|
|
49
|
+
const assertion = check.positive_assertions.find((item) => item.key === binding.assertion_ref);
|
|
50
|
+
if (!assertion)
|
|
51
|
+
invalid("v2_verification_method_assertion_unknown", `${target.key}:${binding.method}:${binding.assertion_ref}`);
|
|
52
|
+
for (const capability of requiredCapabilities(binding.method))
|
|
53
|
+
if (!assertion.evidence_capabilities.includes(capability))
|
|
54
|
+
invalid("v2_verification_method_capability_required", `${target.key}:${binding.method}:${capability}`);
|
|
55
|
+
const expected = preflight.manifest.semantic_proof_obligations
|
|
56
|
+
.filter((obligation) => obligation.method === binding.method)
|
|
57
|
+
.map((obligation) => symbolicRuleExpectation(preflight, obligation.key));
|
|
58
|
+
assertCanonicalRowsByKey(binding.rule_expectations, expected, "obligation_ref", "v2_rule_expectations_mismatch", `${target.key}:${binding.method}`);
|
|
59
|
+
for (const expectation of expected) {
|
|
60
|
+
const rule = preflight.manifest.fact_rules.find((item) => item.key === expectation.fact_rule_ref);
|
|
61
|
+
for (const sourceItemRef of rule.source_item_refs)
|
|
62
|
+
for (const claimRef of claimsBySourceItem.get(sourceItemRef) ?? [])
|
|
63
|
+
if (!assertion.claims.includes(claimRef))
|
|
64
|
+
invalid("v2_verification_method_claim_not_asserted", `${target.key}:${binding.method}:${sourceItemRef}:${claimRef}`);
|
|
65
|
+
boundObligationRefs.push(expectation.obligation_ref);
|
|
66
|
+
}
|
|
67
|
+
for (const artifactPath of [
|
|
68
|
+
binding.artifact_path,
|
|
69
|
+
binding.observation_path,
|
|
70
|
+
]) {
|
|
71
|
+
if (artifactPaths.has(artifactPath))
|
|
72
|
+
invalid("v2_evidence_artifact_reused", `${target.key}:${artifactPath}`);
|
|
73
|
+
artifactPaths.add(artifactPath);
|
|
74
|
+
if (!check.artifact_globs.some((pattern) => matchesRepoPattern(artifactPath, pattern)))
|
|
75
|
+
invalid("v2_evidence_artifact_glob_missing", artifactPath);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
assertSameSet(boundObligationRefs, preflight.manifest.semantic_proof_obligations.map((item) => item.key), "v2_semantic_obligation_binding_mismatch", target.key);
|
|
79
|
+
validateSymbolicCertificateBinding(target, preflight, check, assertionRefs, artifactPaths);
|
|
80
|
+
}
|
|
81
|
+
function validateSymbolicCertificateBinding(target, preflight, check, assertionRefs, artifactPaths) {
|
|
82
|
+
const certificateBinding = target.symbolic_certificate_binding;
|
|
83
|
+
if (!certificateBinding)
|
|
84
|
+
invalid("v2_certificate_binding_required", target.key);
|
|
85
|
+
const certificateAssertion = check.positive_assertions.find((item) => item.key === certificateBinding.assertion_ref);
|
|
86
|
+
if (!certificateAssertion)
|
|
87
|
+
invalid("v2_certificate_assertion_unknown", `${target.key}:${certificateBinding.assertion_ref}`);
|
|
88
|
+
if (certificateBinding.assertion_ref === target.conformance_assertion_ref ||
|
|
89
|
+
assertionRefs.includes(certificateBinding.assertion_ref))
|
|
90
|
+
invalid("v2_certificate_assertion_must_be_independent", target.key);
|
|
91
|
+
if (!certificateAssertion.evidence_capabilities.includes("design_symbolic_certificate"))
|
|
92
|
+
invalid("v2_certificate_capability_required", `${target.key}:${certificateBinding.assertion_ref}`);
|
|
93
|
+
const expectedCertificates = preflight.manifest.noninterference_certificates.map((certificate) => {
|
|
94
|
+
const sourceProofDigest = designResourceSymbolicNoninterferenceProofDigest(certificate.source_noninterference_proof);
|
|
95
|
+
const productionProofDigest = designResourceSymbolicNoninterferenceProofDigest(certificate.production_noninterference_proof);
|
|
96
|
+
return {
|
|
97
|
+
certificate_ref: certificate.key,
|
|
98
|
+
fact_rule_refs: [...certificate.fact_rule_refs],
|
|
99
|
+
omitted_axis_refs: [...certificate.omitted_axis_refs],
|
|
100
|
+
dependency_edge_refs: [...certificate.dependency_edge_refs],
|
|
101
|
+
canonical_rule_dag_sha256: certificate.canonical_rule_dag_sha256,
|
|
102
|
+
...(sourceProofDigest
|
|
103
|
+
? { source_noninterference_proof_sha256: sourceProofDigest }
|
|
104
|
+
: {}),
|
|
105
|
+
...(productionProofDigest
|
|
106
|
+
? { production_noninterference_proof_sha256: productionProofDigest }
|
|
107
|
+
: {}),
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
assertCanonicalRowsByKey(certificateBinding.expectations, expectedCertificates, "certificate_ref", "v2_certificate_expectations_mismatch", target.key);
|
|
111
|
+
if (canonicalJson(certificateBinding.metrics) !==
|
|
112
|
+
canonicalJson(preflight.metrics))
|
|
113
|
+
invalid("v2_certificate_metrics_mismatch", target.key);
|
|
114
|
+
if (!check.artifact_globs.some((pattern) => matchesRepoPattern(certificateBinding.artifact_path, pattern)))
|
|
115
|
+
invalid("v2_certificate_artifact_glob_missing", certificateBinding.artifact_path);
|
|
116
|
+
if (artifactPaths.has(certificateBinding.artifact_path))
|
|
117
|
+
invalid("v2_certificate_artifact_reused", `${target.key}:${certificateBinding.artifact_path}`);
|
|
118
|
+
}
|
|
11
119
|
export function designSourceItemClaims(contract, contractTarget, indexed, sourceItemRef, claims = new Map(contract.source_claims.map((item) => [item.key, item]))) {
|
|
12
120
|
const claim = claims.get(sourceItemRef);
|
|
13
121
|
if (!claim)
|
|
@@ -93,6 +201,40 @@ function designFactExpectation(indexed, factRef, proofRef) {
|
|
|
93
201
|
},
|
|
94
202
|
};
|
|
95
203
|
}
|
|
204
|
+
function symbolicRuleExpectation(preflight, obligationRef) {
|
|
205
|
+
const obligation = preflight.manifest.semantic_proof_obligations.find((item) => item.key === obligationRef);
|
|
206
|
+
const rule = preflight.manifest.fact_rules.find((item) => item.key === obligation.fact_rule_ref);
|
|
207
|
+
const oracle = preflight.manifest.oracles.find((item) => item.key === obligation.oracle_ref);
|
|
208
|
+
const environment = preflight.manifest.environments.find((item) => item.key === obligation.environment_ref);
|
|
209
|
+
return {
|
|
210
|
+
obligation_ref: obligation.key,
|
|
211
|
+
fact_rule_ref: rule.key,
|
|
212
|
+
region_sha256: obligation.region_sha256,
|
|
213
|
+
subject_or_relation_ref: rule.subject_or_relation_ref,
|
|
214
|
+
property_ref: rule.property_ref,
|
|
215
|
+
population_ref: rule.population_ref,
|
|
216
|
+
quantifier: structuredClone(rule.quantifier),
|
|
217
|
+
observation_sensitivity: rule.observation_sensitivity,
|
|
218
|
+
expected: structuredClone(rule.expected),
|
|
219
|
+
proof_surface: obligation.proof_surface,
|
|
220
|
+
observation_boundary: obligation.observation_boundary,
|
|
221
|
+
comparison: structuredClone(obligation.comparison),
|
|
222
|
+
oracle: {
|
|
223
|
+
key: oracle.key,
|
|
224
|
+
trust: oracle.trust,
|
|
225
|
+
identity: oracle.identity,
|
|
226
|
+
version: oracle.version,
|
|
227
|
+
sha256: oracle.sha256,
|
|
228
|
+
},
|
|
229
|
+
environment: {
|
|
230
|
+
key: environment.key,
|
|
231
|
+
identity: environment.identity,
|
|
232
|
+
definition: structuredClone(environment.definition),
|
|
233
|
+
},
|
|
234
|
+
protected_value_policy: obligation.protected_value_policy,
|
|
235
|
+
completion_effect: obligation.completion_effect,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
96
238
|
function assertCanonicalRows(actual, expected, code, detail) {
|
|
97
239
|
const left = new Map(actual.map((item) => [item.fact_ref, canonicalJson(item)]));
|
|
98
240
|
const right = new Map(expected.map((item) => [item.fact_ref, canonicalJson(item)]));
|
|
@@ -101,6 +243,14 @@ function assertCanonicalRows(actual, expected, code, detail) {
|
|
|
101
243
|
if (left.get(key) !== value)
|
|
102
244
|
invalid(code, `${detail}:${key}`);
|
|
103
245
|
}
|
|
246
|
+
function assertCanonicalRowsByKey(actual, expected, keyName, code, detail) {
|
|
247
|
+
const left = new Map(actual.map((item) => [String(item[keyName]), canonicalJson(item)]));
|
|
248
|
+
const right = new Map(expected.map((item) => [String(item[keyName]), canonicalJson(item)]));
|
|
249
|
+
assertSameSet([...left.keys()], [...right.keys()], code, detail);
|
|
250
|
+
for (const [key, value] of right)
|
|
251
|
+
if (left.get(key) !== value)
|
|
252
|
+
invalid(code, `${detail}:${key}`);
|
|
253
|
+
}
|
|
104
254
|
function canonicalJson(value) {
|
|
105
255
|
if (Array.isArray(value))
|
|
106
256
|
return `[${value.map((item) => canonicalJson(item)).join(",")}]`;
|