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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface StructuralClosureCostBaseline {
|
|
2
|
+
schema_version: "structural-closure-cost-baseline-v1";
|
|
3
|
+
workload: string;
|
|
4
|
+
exact: {
|
|
5
|
+
K_fact: number;
|
|
6
|
+
K_rule: number;
|
|
7
|
+
M_value: number;
|
|
8
|
+
M_total: number;
|
|
9
|
+
};
|
|
10
|
+
maximum: {
|
|
11
|
+
N_dag: number;
|
|
12
|
+
source_bytes: number;
|
|
13
|
+
contract_bytes: number;
|
|
14
|
+
evidence_bytes: number;
|
|
15
|
+
default_context_bytes: number;
|
|
16
|
+
revision_changed_files: number;
|
|
17
|
+
revision_changed_lines: number;
|
|
18
|
+
revision_changed_bytes: number;
|
|
19
|
+
};
|
|
20
|
+
minimum: {
|
|
21
|
+
source_duplicate_saved_bytes: number;
|
|
22
|
+
contract_duplicate_saved_bytes: number;
|
|
23
|
+
};
|
|
24
|
+
profiles: Record<string, {
|
|
25
|
+
compile_ms: number;
|
|
26
|
+
preflight_ms: number;
|
|
27
|
+
final_gate_ms: number;
|
|
28
|
+
peak_rss_bytes: number;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export interface StructuralClosureCostObservation {
|
|
32
|
+
cardinality: {
|
|
33
|
+
K_fact: number;
|
|
34
|
+
K_rule: number;
|
|
35
|
+
M_value: number;
|
|
36
|
+
M_total: number;
|
|
37
|
+
N_dag: number;
|
|
38
|
+
};
|
|
39
|
+
bytes: {
|
|
40
|
+
source: number;
|
|
41
|
+
contract: number;
|
|
42
|
+
evidence: number;
|
|
43
|
+
default_context: number;
|
|
44
|
+
};
|
|
45
|
+
phases_ms: {
|
|
46
|
+
compile: number;
|
|
47
|
+
preflight: number;
|
|
48
|
+
final_gate: number;
|
|
49
|
+
};
|
|
50
|
+
peak_rss_bytes: number;
|
|
51
|
+
duplicate_blocks: {
|
|
52
|
+
source: {
|
|
53
|
+
saved_bytes: number;
|
|
54
|
+
remaining_beneficial_candidates: number;
|
|
55
|
+
};
|
|
56
|
+
contract: {
|
|
57
|
+
saved_bytes: number;
|
|
58
|
+
remaining_beneficial_candidates: number;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
revision_blast_radius: {
|
|
62
|
+
changed_files: number;
|
|
63
|
+
changed_lines: number;
|
|
64
|
+
changed_bytes: number;
|
|
65
|
+
changed_fact_revision_keys: string[];
|
|
66
|
+
expected_changed_fact_revision_keys: string[];
|
|
67
|
+
changed_obligation_revision_keys: string[];
|
|
68
|
+
expected_changed_obligation_revision_keys: string[];
|
|
69
|
+
unrelated_fact_revision_identities_unchanged: boolean;
|
|
70
|
+
unrelated_obligation_revision_identities_unchanged: boolean;
|
|
71
|
+
shared_structure_catalog_unchanged: boolean;
|
|
72
|
+
};
|
|
73
|
+
unrelated_axis: {
|
|
74
|
+
K_fact_growth: number;
|
|
75
|
+
M_value_growth: number;
|
|
76
|
+
persisted_shared_metadata_growth_bytes: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export declare function evaluateStructuralClosureCost(observation: StructuralClosureCostObservation, baseline: StructuralClosureCostBaseline, profile: string): string[];
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export function evaluateStructuralClosureCost(observation, baseline, profile) {
|
|
2
|
+
const findings = [];
|
|
3
|
+
if (baseline.schema_version !== "structural-closure-cost-baseline-v1")
|
|
4
|
+
findings.push("baseline_schema_version_invalid");
|
|
5
|
+
for (const field of ["K_fact", "K_rule", "M_value", "M_total"])
|
|
6
|
+
if (observation.cardinality[field] !== baseline.exact[field])
|
|
7
|
+
findings.push(`cardinality_${field}_mismatch:${observation.cardinality[field]}:${baseline.exact[field]}`);
|
|
8
|
+
compareMaximum(findings, "N_dag", observation.cardinality.N_dag, baseline.maximum.N_dag);
|
|
9
|
+
for (const [field, value] of [
|
|
10
|
+
["source_bytes", observation.bytes.source],
|
|
11
|
+
["contract_bytes", observation.bytes.contract],
|
|
12
|
+
["evidence_bytes", observation.bytes.evidence],
|
|
13
|
+
["default_context_bytes", observation.bytes.default_context],
|
|
14
|
+
])
|
|
15
|
+
compareMaximum(findings, field, value, baseline.maximum[field]);
|
|
16
|
+
const phaseBudget = baseline.profiles[profile];
|
|
17
|
+
if (!phaseBudget)
|
|
18
|
+
findings.push(`baseline_profile_missing:${profile}`);
|
|
19
|
+
else {
|
|
20
|
+
compareMaximum(findings, "compile_ms", observation.phases_ms.compile, phaseBudget.compile_ms);
|
|
21
|
+
compareMaximum(findings, "preflight_ms", observation.phases_ms.preflight, phaseBudget.preflight_ms);
|
|
22
|
+
compareMaximum(findings, "final_gate_ms", observation.phases_ms.final_gate, phaseBudget.final_gate_ms);
|
|
23
|
+
compareMaximum(findings, "peak_rss_bytes", observation.peak_rss_bytes, phaseBudget.peak_rss_bytes);
|
|
24
|
+
}
|
|
25
|
+
compareMinimum(findings, "source_duplicate_saved_bytes", observation.duplicate_blocks.source.saved_bytes, baseline.minimum.source_duplicate_saved_bytes);
|
|
26
|
+
compareMinimum(findings, "contract_duplicate_saved_bytes", observation.duplicate_blocks.contract.saved_bytes, baseline.minimum.contract_duplicate_saved_bytes);
|
|
27
|
+
for (const [side, value] of [
|
|
28
|
+
[
|
|
29
|
+
"source",
|
|
30
|
+
observation.duplicate_blocks.source.remaining_beneficial_candidates,
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
"contract",
|
|
34
|
+
observation.duplicate_blocks.contract.remaining_beneficial_candidates,
|
|
35
|
+
],
|
|
36
|
+
])
|
|
37
|
+
if (value !== 0)
|
|
38
|
+
findings.push(`remaining_beneficial_candidates:${side}:${value}`);
|
|
39
|
+
compareMaximum(findings, "revision_changed_files", observation.revision_blast_radius.changed_files, baseline.maximum.revision_changed_files);
|
|
40
|
+
compareMaximum(findings, "revision_changed_lines", observation.revision_blast_radius.changed_lines, baseline.maximum.revision_changed_lines);
|
|
41
|
+
compareMaximum(findings, "revision_changed_bytes", observation.revision_blast_radius.changed_bytes, baseline.maximum.revision_changed_bytes);
|
|
42
|
+
for (const [field, value] of [
|
|
43
|
+
[
|
|
44
|
+
"fact_revision_key_set",
|
|
45
|
+
sameStrings(observation.revision_blast_radius.changed_fact_revision_keys, observation.revision_blast_radius.expected_changed_fact_revision_keys),
|
|
46
|
+
],
|
|
47
|
+
[
|
|
48
|
+
"obligation_revision_key_set",
|
|
49
|
+
sameStrings(observation.revision_blast_radius.changed_obligation_revision_keys, observation.revision_blast_radius
|
|
50
|
+
.expected_changed_obligation_revision_keys),
|
|
51
|
+
],
|
|
52
|
+
[
|
|
53
|
+
"unrelated_fact_revision_identities",
|
|
54
|
+
observation.revision_blast_radius
|
|
55
|
+
.unrelated_fact_revision_identities_unchanged,
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"unrelated_obligation_revision_identities",
|
|
59
|
+
observation.revision_blast_radius
|
|
60
|
+
.unrelated_obligation_revision_identities_unchanged,
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
"shared_structure_catalog",
|
|
64
|
+
observation.revision_blast_radius.shared_structure_catalog_unchanged,
|
|
65
|
+
],
|
|
66
|
+
])
|
|
67
|
+
if (!value)
|
|
68
|
+
findings.push(`revision_locality_failed:${field}`);
|
|
69
|
+
for (const [field, value] of [
|
|
70
|
+
["K_fact_growth", observation.unrelated_axis.K_fact_growth],
|
|
71
|
+
["M_value_growth", observation.unrelated_axis.M_value_growth],
|
|
72
|
+
[
|
|
73
|
+
"persisted_shared_metadata_growth_bytes",
|
|
74
|
+
observation.unrelated_axis.persisted_shared_metadata_growth_bytes,
|
|
75
|
+
],
|
|
76
|
+
])
|
|
77
|
+
if (value !== 0)
|
|
78
|
+
findings.push(`unrelated_axis_growth:${field}:${value}`);
|
|
79
|
+
return findings.sort();
|
|
80
|
+
}
|
|
81
|
+
function compareMaximum(findings, field, value, maximum) {
|
|
82
|
+
if (!Number.isFinite(value) || value > maximum)
|
|
83
|
+
findings.push(`maximum_exceeded:${field}:${value}:${maximum}`);
|
|
84
|
+
}
|
|
85
|
+
function compareMinimum(findings, field, value, minimum) {
|
|
86
|
+
if (!Number.isFinite(value) || value < minimum)
|
|
87
|
+
findings.push(`minimum_not_met:${field}:${value}:${minimum}`);
|
|
88
|
+
}
|
|
89
|
+
function sameStrings(left, right) {
|
|
90
|
+
return JSON.stringify([...left].sort()) === JSON.stringify([...right].sort());
|
|
91
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SymbolicDenotationCanonicalDagV1, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
|
|
2
|
+
import type { SymbolicRuntimeAxis } from "./symbolic-denotation-runtime.js";
|
|
3
|
+
export declare class SymbolicDecisionDagBuilder {
|
|
4
|
+
private readonly axes;
|
|
5
|
+
private readonly limits;
|
|
6
|
+
private readonly nodes;
|
|
7
|
+
private readonly unique;
|
|
8
|
+
private readonly predicateMemo;
|
|
9
|
+
private readonly applyMemo;
|
|
10
|
+
private readonly notMemo;
|
|
11
|
+
private constructedEdges;
|
|
12
|
+
constructor(axes: SymbolicRuntimeAxis[], limits: SymbolicDenotationComplexityLimits);
|
|
13
|
+
predicate(predicate: SymbolicDenotationPredicate, domainIndex: ReadonlyMap<string, number>): number;
|
|
14
|
+
private compilePredicate;
|
|
15
|
+
private inPredicate;
|
|
16
|
+
private rangePredicate;
|
|
17
|
+
private groupPredicate;
|
|
18
|
+
canonicalize(rootId: number): SymbolicDenotationCanonicalDagV1;
|
|
19
|
+
private checkCanonicalLimits;
|
|
20
|
+
private atom;
|
|
21
|
+
private negate;
|
|
22
|
+
private apply;
|
|
23
|
+
private reduceApply;
|
|
24
|
+
private node;
|
|
25
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { canonicalSymbolicEdges, symbolicSegmentMatches, } from "./symbolic-denotation-runtime.js";
|
|
2
|
+
import { compareText, invalid, neverValue, scalarEqual, sha256, stableJson, } from "./symbolic-denotation-support.js";
|
|
3
|
+
export class SymbolicDecisionDagBuilder {
|
|
4
|
+
axes;
|
|
5
|
+
limits;
|
|
6
|
+
nodes = [
|
|
7
|
+
{ axis_index: -1, child_ids: [] },
|
|
8
|
+
{ axis_index: -1, child_ids: [] },
|
|
9
|
+
];
|
|
10
|
+
unique = new Map();
|
|
11
|
+
predicateMemo = new Map();
|
|
12
|
+
applyMemo = new Map();
|
|
13
|
+
notMemo = new Map();
|
|
14
|
+
constructedEdges = 0;
|
|
15
|
+
constructor(axes, limits) {
|
|
16
|
+
this.axes = axes;
|
|
17
|
+
this.limits = limits;
|
|
18
|
+
}
|
|
19
|
+
predicate(predicate, domainIndex) {
|
|
20
|
+
const memoKey = stableJson(predicate);
|
|
21
|
+
const cached = this.predicateMemo.get(memoKey);
|
|
22
|
+
if (cached !== undefined)
|
|
23
|
+
return cached;
|
|
24
|
+
const result = this.compilePredicate(predicate, domainIndex);
|
|
25
|
+
this.predicateMemo.set(memoKey, result);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
compilePredicate(predicate, domainIndex) {
|
|
29
|
+
switch (predicate.op) {
|
|
30
|
+
case "eq":
|
|
31
|
+
return this.atom(predicate.axis_ref, domainIndex, (value) => scalarEqual(value, predicate.value));
|
|
32
|
+
case "in":
|
|
33
|
+
return this.inPredicate(predicate, domainIndex);
|
|
34
|
+
case "range":
|
|
35
|
+
return this.rangePredicate(predicate, domainIndex);
|
|
36
|
+
case "not":
|
|
37
|
+
return this.negate(this.predicate(predicate.predicate, domainIndex));
|
|
38
|
+
case "all":
|
|
39
|
+
return this.groupPredicate("and", predicate.predicates, domainIndex);
|
|
40
|
+
case "any":
|
|
41
|
+
return this.groupPredicate("or", predicate.predicates, domainIndex);
|
|
42
|
+
default:
|
|
43
|
+
return invalid("predicate_operator_unknown", neverValue(predicate));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
inPredicate(predicate, domainIndex) {
|
|
47
|
+
return this.atom(predicate.axis_ref, domainIndex, (value) => predicate.values.some((candidate) => scalarEqual(value, candidate)));
|
|
48
|
+
}
|
|
49
|
+
rangePredicate(predicate, domainIndex) {
|
|
50
|
+
const minimum = predicate.minimum + (predicate.minimum_inclusive ? 0 : 1);
|
|
51
|
+
const maximum = predicate.maximum - (predicate.maximum_inclusive ? 0 : 1);
|
|
52
|
+
return this.atom(predicate.axis_ref, domainIndex, (value) => typeof value === "number" && value >= minimum && value <= maximum);
|
|
53
|
+
}
|
|
54
|
+
groupPredicate(operation, predicates, domainIndex) {
|
|
55
|
+
let result = operation === "and" ? 1 : 0;
|
|
56
|
+
for (const child of predicates)
|
|
57
|
+
result = this.apply(operation, result, this.predicate(child, domainIndex));
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
canonicalize(rootId) {
|
|
61
|
+
const output = new Map();
|
|
62
|
+
const memo = new Map([
|
|
63
|
+
[0, "terminal.false"],
|
|
64
|
+
[1, "terminal.true"],
|
|
65
|
+
]);
|
|
66
|
+
const visit = (id) => {
|
|
67
|
+
const cached = memo.get(id);
|
|
68
|
+
if (cached)
|
|
69
|
+
return cached;
|
|
70
|
+
const node = this.nodes[id];
|
|
71
|
+
const axis = this.axes[node.axis_index];
|
|
72
|
+
const childRefs = node.child_ids.map(visit);
|
|
73
|
+
const edges = canonicalSymbolicEdges(axis, childRefs);
|
|
74
|
+
const body = { axis_ref: axis.domain.key, edges };
|
|
75
|
+
const key = `node.${sha256(stableJson(body))}`;
|
|
76
|
+
const existing = output.get(key);
|
|
77
|
+
if (existing && stableJson(existing.edges) !== stableJson(edges))
|
|
78
|
+
invalid("canonical_node_hash_collision", key);
|
|
79
|
+
output.set(key, { key, ...body });
|
|
80
|
+
memo.set(id, key);
|
|
81
|
+
return key;
|
|
82
|
+
};
|
|
83
|
+
const rootRef = visit(rootId);
|
|
84
|
+
const nodes = [...output.values()].sort((left, right) => compareText(left.key, right.key));
|
|
85
|
+
this.checkCanonicalLimits(nodes);
|
|
86
|
+
return {
|
|
87
|
+
schema_version: "symbolic-denotation-canonical-dag-v1",
|
|
88
|
+
root_ref: rootRef,
|
|
89
|
+
nodes,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
checkCanonicalLimits(nodes) {
|
|
93
|
+
const partitionEdges = nodes.reduce((total, node) => total + node.edges.length, 0);
|
|
94
|
+
if (nodes.length > this.limits.max_canonical_dag_nodes)
|
|
95
|
+
invalid("canonical_dag_node_limit_exceeded", `actual=${nodes.length}:limit=${this.limits.max_canonical_dag_nodes}`);
|
|
96
|
+
if (partitionEdges > this.limits.max_partition_edges)
|
|
97
|
+
invalid("canonical_partition_edge_limit_exceeded", `actual=${partitionEdges}:limit=${this.limits.max_partition_edges}`);
|
|
98
|
+
}
|
|
99
|
+
atom(axisRef, domainIndex, matches) {
|
|
100
|
+
const axisIndex = domainIndex.get(axisRef);
|
|
101
|
+
if (axisIndex === undefined)
|
|
102
|
+
invalid("predicate_axis_unknown", axisRef);
|
|
103
|
+
const axis = this.axes[axisIndex];
|
|
104
|
+
return this.node(axisIndex, axis.segments.map((segment) => symbolicSegmentMatches(segment, matches) ? 1 : 0));
|
|
105
|
+
}
|
|
106
|
+
negate(id) {
|
|
107
|
+
if (id === 0)
|
|
108
|
+
return 1;
|
|
109
|
+
if (id === 1)
|
|
110
|
+
return 0;
|
|
111
|
+
const cached = this.notMemo.get(id);
|
|
112
|
+
if (cached !== undefined)
|
|
113
|
+
return cached;
|
|
114
|
+
const node = this.nodes[id];
|
|
115
|
+
const result = this.node(node.axis_index, node.child_ids.map((child) => this.negate(child)));
|
|
116
|
+
this.notMemo.set(id, result);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
apply(operation, left, right) {
|
|
120
|
+
const reduced = this.reduceApply(operation, left, right);
|
|
121
|
+
if (reduced !== null)
|
|
122
|
+
return reduced;
|
|
123
|
+
const first = Math.min(left, right);
|
|
124
|
+
const second = Math.max(left, right);
|
|
125
|
+
const memoKey = `${operation}:${first}:${second}`;
|
|
126
|
+
const cached = this.applyMemo.get(memoKey);
|
|
127
|
+
if (cached !== undefined)
|
|
128
|
+
return cached;
|
|
129
|
+
const leftNode = this.nodes[left];
|
|
130
|
+
const rightNode = this.nodes[right];
|
|
131
|
+
const axisIndex = Math.min(leftNode.axis_index, rightNode.axis_index);
|
|
132
|
+
const segmentCount = this.axes[axisIndex].segments.length;
|
|
133
|
+
const children = Array.from({ length: segmentCount }, (_, index) => this.apply(operation, leftNode.axis_index === axisIndex ? leftNode.child_ids[index] : left, rightNode.axis_index === axisIndex ? rightNode.child_ids[index] : right));
|
|
134
|
+
const result = this.node(axisIndex, children);
|
|
135
|
+
this.applyMemo.set(memoKey, result);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
reduceApply(operation, left, right) {
|
|
139
|
+
if (left === right)
|
|
140
|
+
return left;
|
|
141
|
+
if (operation === "and") {
|
|
142
|
+
if (left === 0 || right === 0)
|
|
143
|
+
return 0;
|
|
144
|
+
if (left === 1)
|
|
145
|
+
return right;
|
|
146
|
+
if (right === 1)
|
|
147
|
+
return left;
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (left === 1 || right === 1)
|
|
151
|
+
return 1;
|
|
152
|
+
if (left === 0)
|
|
153
|
+
return right;
|
|
154
|
+
if (right === 0)
|
|
155
|
+
return left;
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
node(axisIndex, childIds) {
|
|
159
|
+
if (childIds.every((child) => child === childIds[0]))
|
|
160
|
+
return childIds[0];
|
|
161
|
+
const key = `${axisIndex}:${childIds.join(",")}`;
|
|
162
|
+
const cached = this.unique.get(key);
|
|
163
|
+
if (cached !== undefined)
|
|
164
|
+
return cached;
|
|
165
|
+
const nextNodeCount = this.nodes.length - 1;
|
|
166
|
+
if (nextNodeCount > this.limits.max_canonical_dag_nodes)
|
|
167
|
+
invalid("constructed_dag_node_limit_exceeded", `actual=${nextNodeCount}:limit=${this.limits.max_canonical_dag_nodes}`);
|
|
168
|
+
this.constructedEdges += childIds.length;
|
|
169
|
+
if (this.constructedEdges > this.limits.max_partition_edges)
|
|
170
|
+
invalid("constructed_partition_edge_limit_exceeded", `actual=${this.constructedEdges}:limit=${this.limits.max_partition_edges}`);
|
|
171
|
+
const id = this.nodes.length;
|
|
172
|
+
this.nodes.push({ axis_index: axisIndex, child_ids: childIds });
|
|
173
|
+
this.unique.set(key, id);
|
|
174
|
+
return id;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { SymbolicDenotationAxisDomain, SymbolicDenotationComplexityLimits } from "./symbolic-denotation-types.js";
|
|
2
|
+
export declare function validateSymbolicLimits(limits: SymbolicDenotationComplexityLimits): SymbolicDenotationComplexityLimits;
|
|
3
|
+
export declare function validateSymbolicDomains(domainsInput: SymbolicDenotationAxisDomain[]): SymbolicDenotationAxisDomain[];
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { compareText, exactKeys, invalid, stableKey, } from "./symbolic-denotation-support.js";
|
|
2
|
+
export function validateSymbolicLimits(limits) {
|
|
3
|
+
exactKeys(limits, [
|
|
4
|
+
"max_predicate_depth",
|
|
5
|
+
"max_input_predicate_nodes",
|
|
6
|
+
"max_canonical_dag_nodes",
|
|
7
|
+
"max_partition_edges",
|
|
8
|
+
"max_canonical_bytes",
|
|
9
|
+
], "complexity_limits");
|
|
10
|
+
for (const [key, value] of Object.entries(limits))
|
|
11
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
12
|
+
invalid("complexity_limit_invalid", `${key}:${value}`);
|
|
13
|
+
return { ...limits };
|
|
14
|
+
}
|
|
15
|
+
export function validateSymbolicDomains(domainsInput) {
|
|
16
|
+
if (!Array.isArray(domainsInput) || !domainsInput.length)
|
|
17
|
+
invalid("axis_domains_required", "");
|
|
18
|
+
const domains = domainsInput.map(validateDomain);
|
|
19
|
+
domains.sort((left, right) => compareText(left.key, right.key));
|
|
20
|
+
if (new Set(domains.map((domain) => domain.key)).size !== domains.length)
|
|
21
|
+
invalid("axis_domain_key_duplicate", "");
|
|
22
|
+
return domains;
|
|
23
|
+
}
|
|
24
|
+
function validateDomain(input, index) {
|
|
25
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
26
|
+
invalid("axis_domain_invalid", String(index));
|
|
27
|
+
stableKey(input.key, `axis_domain:${index}`);
|
|
28
|
+
if (input.kind === "enum")
|
|
29
|
+
return validateEnumDomain(input);
|
|
30
|
+
if (input.kind === "bounded_number")
|
|
31
|
+
return validateNumberDomain(input);
|
|
32
|
+
return invalid("axis_domain_kind_unknown", String(input.kind));
|
|
33
|
+
}
|
|
34
|
+
function validateEnumDomain(input) {
|
|
35
|
+
exactKeys(input, ["key", "kind", "values"], `axis_domain:${input.key}`);
|
|
36
|
+
if (!Array.isArray(input.values) || !input.values.length)
|
|
37
|
+
invalid("enum_domain_values_required", input.key);
|
|
38
|
+
const values = input.values.map((value) => {
|
|
39
|
+
if (typeof value !== "string" || !value)
|
|
40
|
+
invalid("enum_domain_value_invalid", input.key);
|
|
41
|
+
return value;
|
|
42
|
+
});
|
|
43
|
+
if (new Set(values).size !== values.length)
|
|
44
|
+
invalid("enum_domain_value_duplicate", input.key);
|
|
45
|
+
return { ...input, values: [...values].sort(compareText) };
|
|
46
|
+
}
|
|
47
|
+
function validateNumberDomain(input) {
|
|
48
|
+
exactKeys(input, ["key", "kind", "minimum", "maximum", "integer"], `axis_domain:${input.key}`);
|
|
49
|
+
if (input.integer !== true ||
|
|
50
|
+
!Number.isSafeInteger(input.minimum) ||
|
|
51
|
+
!Number.isSafeInteger(input.maximum) ||
|
|
52
|
+
input.minimum > input.maximum ||
|
|
53
|
+
input.maximum >= Number.MAX_SAFE_INTEGER)
|
|
54
|
+
invalid("bounded_number_domain_invalid", input.key);
|
|
55
|
+
return { ...input };
|
|
56
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CompiledSymbolicDenotationV1, SymbolicDenotationAxisDomain, SymbolicDenotationCanonicalDagV1, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
|
|
2
|
+
export declare const DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS: {
|
|
3
|
+
readonly max_predicate_depth: 32;
|
|
4
|
+
readonly max_input_predicate_nodes: 4096;
|
|
5
|
+
readonly max_canonical_dag_nodes: 8192;
|
|
6
|
+
readonly max_partition_edges: 65536;
|
|
7
|
+
readonly max_canonical_bytes: 4194304;
|
|
8
|
+
};
|
|
9
|
+
export declare function compileSymbolicDenotation(domainsInput: SymbolicDenotationAxisDomain[], predicateInput: SymbolicDenotationPredicate, limits?: SymbolicDenotationComplexityLimits): CompiledSymbolicDenotationV1;
|
|
10
|
+
export interface SymbolicDenotationCompilationStatisticsV1 {
|
|
11
|
+
axis_partition_builds: 1;
|
|
12
|
+
compile_requests: number;
|
|
13
|
+
compile_cache_hits: number;
|
|
14
|
+
unique_compiled_predicates: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class SymbolicDenotationCompilationSession {
|
|
17
|
+
private readonly limits;
|
|
18
|
+
private readonly domains;
|
|
19
|
+
private readonly domainIndex;
|
|
20
|
+
private readonly numberCuts;
|
|
21
|
+
private readonly builder;
|
|
22
|
+
private readonly compiled;
|
|
23
|
+
private readonly theoreticalGroundCardinality;
|
|
24
|
+
private compileRequests;
|
|
25
|
+
private compileCacheHits;
|
|
26
|
+
constructor(domainsInput: SymbolicDenotationAxisDomain[], seedPredicates: readonly SymbolicDenotationPredicate[], limits?: SymbolicDenotationComplexityLimits);
|
|
27
|
+
compile(predicateInput: SymbolicDenotationPredicate): CompiledSymbolicDenotationV1;
|
|
28
|
+
statistics(): SymbolicDenotationCompilationStatisticsV1;
|
|
29
|
+
private inspect;
|
|
30
|
+
}
|
|
31
|
+
export declare function createSymbolicDenotationCompilationSession(domains: SymbolicDenotationAxisDomain[], seedPredicates: readonly SymbolicDenotationPredicate[], limits?: SymbolicDenotationComplexityLimits): SymbolicDenotationCompilationSession;
|
|
32
|
+
export declare function evaluateCanonicalSymbolicDenotation(dag: SymbolicDenotationCanonicalDagV1, assignment: Record<string, SymbolicDenotationScalar>): boolean;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { DESIGN_RESOURCE_SYMBOLIC_FACT_POLICY } from "./design-resource-symbolic-fact-policy.js";
|
|
2
|
+
import { SymbolicDecisionDagBuilder } from "./symbolic-denotation-dag-builder.js";
|
|
3
|
+
import { validateSymbolicDomains, validateSymbolicLimits, } from "./symbolic-denotation-domain-validation.js";
|
|
4
|
+
import { buildSymbolicRuntimeAxes, symbolicEdgeMatches, } from "./symbolic-denotation-runtime.js";
|
|
5
|
+
import { compareText, domainCardinality, invalid, sha256, stableJson, } from "./symbolic-denotation-support.js";
|
|
6
|
+
import { validateSymbolicPredicate, } from "./symbolic-denotation-validation.js";
|
|
7
|
+
export const DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS = {
|
|
8
|
+
max_predicate_depth: 32,
|
|
9
|
+
max_input_predicate_nodes: 4_096,
|
|
10
|
+
max_canonical_dag_nodes: 8_192,
|
|
11
|
+
max_partition_edges: 65_536,
|
|
12
|
+
max_canonical_bytes: 4_194_304,
|
|
13
|
+
};
|
|
14
|
+
export function compileSymbolicDenotation(domainsInput, predicateInput, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
|
|
15
|
+
return createSymbolicDenotationCompilationSession(domainsInput, [predicateInput], limits).compile(predicateInput);
|
|
16
|
+
}
|
|
17
|
+
export class SymbolicDenotationCompilationSession {
|
|
18
|
+
limits;
|
|
19
|
+
domains;
|
|
20
|
+
domainIndex;
|
|
21
|
+
numberCuts = new Map();
|
|
22
|
+
builder;
|
|
23
|
+
compiled = new Map();
|
|
24
|
+
theoreticalGroundCardinality;
|
|
25
|
+
compileRequests = 0;
|
|
26
|
+
compileCacheHits = 0;
|
|
27
|
+
constructor(domainsInput, seedPredicates, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
|
|
28
|
+
if (!seedPredicates.length)
|
|
29
|
+
invalid("compilation_session_seeds_required", "");
|
|
30
|
+
this.limits = validateSymbolicLimits(limits);
|
|
31
|
+
this.domains = validateSymbolicDomains(domainsInput);
|
|
32
|
+
this.domainIndex = new Map(this.domains.map((domain, index) => [domain.key, index]));
|
|
33
|
+
const uniqueSeeds = new Map(seedPredicates.map((predicate) => [stableJson(predicate), predicate]));
|
|
34
|
+
for (const predicate of uniqueSeeds.values())
|
|
35
|
+
mergeNumberCuts(this.numberCuts, this.inspect(predicate).number_cuts);
|
|
36
|
+
const axes = buildSymbolicRuntimeAxes(this.domains, this.numberCuts);
|
|
37
|
+
this.builder = new SymbolicDecisionDagBuilder(axes, this.limits);
|
|
38
|
+
this.theoreticalGroundCardinality = this.domains
|
|
39
|
+
.reduce((total, domain) => total * domainCardinality(domain), 1n)
|
|
40
|
+
.toString();
|
|
41
|
+
}
|
|
42
|
+
compile(predicateInput) {
|
|
43
|
+
this.compileRequests += 1;
|
|
44
|
+
const inspection = this.inspect(predicateInput);
|
|
45
|
+
assertKnownNumberCuts(this.numberCuts, inspection.number_cuts);
|
|
46
|
+
const predicate = validateSymbolicPredicate(predicateInput, this.domains, this.domainIndex, { input_nodes: 0, number_cuts: new Map() }, 1, this.limits);
|
|
47
|
+
const memoKey = stableJson(predicate);
|
|
48
|
+
const cached = this.compiled.get(memoKey);
|
|
49
|
+
if (cached) {
|
|
50
|
+
this.compileCacheHits += 1;
|
|
51
|
+
return cached;
|
|
52
|
+
}
|
|
53
|
+
const rootId = this.builder.predicate(predicate, this.domainIndex);
|
|
54
|
+
const canonicalDag = this.builder.canonicalize(rootId);
|
|
55
|
+
const canonicalJson = stableJson(canonicalDag);
|
|
56
|
+
const canonicalBytes = Buffer.byteLength(canonicalJson, "utf8");
|
|
57
|
+
checkCanonicalBytes(canonicalBytes, this.limits.max_canonical_bytes);
|
|
58
|
+
const partitionEdges = canonicalDag.nodes.reduce((total, node) => total + node.edges.length, 0);
|
|
59
|
+
const referencedAxisRefs = [
|
|
60
|
+
...new Set(canonicalDag.nodes.map((node) => node.axis_ref)),
|
|
61
|
+
].sort(compareText);
|
|
62
|
+
const referenced = new Set(referencedAxisRefs);
|
|
63
|
+
const result = {
|
|
64
|
+
canonical_dag: canonicalDag,
|
|
65
|
+
canonical_sha256: sha256(canonicalJson),
|
|
66
|
+
canonical_bytes: canonicalBytes,
|
|
67
|
+
referenced_axis_refs: referencedAxisRefs,
|
|
68
|
+
omitted_axis_refs: this.domains
|
|
69
|
+
.map((domain) => domain.key)
|
|
70
|
+
.filter((axisRef) => !referenced.has(axisRef)),
|
|
71
|
+
theoretical_ground_cardinality: this.theoreticalGroundCardinality,
|
|
72
|
+
metrics: {
|
|
73
|
+
input_predicate_nodes: inspection.input_nodes,
|
|
74
|
+
canonical_dag_nodes: canonicalDag.nodes.length,
|
|
75
|
+
partition_edges: partitionEdges,
|
|
76
|
+
canonical_bytes: canonicalBytes,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
this.compiled.set(memoKey, result);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
statistics() {
|
|
83
|
+
return {
|
|
84
|
+
axis_partition_builds: 1,
|
|
85
|
+
compile_requests: this.compileRequests,
|
|
86
|
+
compile_cache_hits: this.compileCacheHits,
|
|
87
|
+
unique_compiled_predicates: this.compiled.size,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
inspect(predicate) {
|
|
91
|
+
const inspection = {
|
|
92
|
+
input_nodes: 0,
|
|
93
|
+
number_cuts: new Map(),
|
|
94
|
+
};
|
|
95
|
+
validateSymbolicPredicate(predicate, this.domains, this.domainIndex, inspection, 1, this.limits);
|
|
96
|
+
return inspection;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function createSymbolicDenotationCompilationSession(domains, seedPredicates, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
|
|
100
|
+
return new SymbolicDenotationCompilationSession(domains, seedPredicates, limits);
|
|
101
|
+
}
|
|
102
|
+
function mergeNumberCuts(target, source) {
|
|
103
|
+
for (const [axisRef, cuts] of source) {
|
|
104
|
+
const values = target.get(axisRef) ?? new Set();
|
|
105
|
+
cuts.forEach((cut) => values.add(cut));
|
|
106
|
+
target.set(axisRef, values);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function assertKnownNumberCuts(known, actual) {
|
|
110
|
+
for (const [axisRef, cuts] of actual)
|
|
111
|
+
for (const cut of cuts)
|
|
112
|
+
if (!known.get(axisRef)?.has(cut))
|
|
113
|
+
invalid("compilation_session_axis_partition_stale", `${axisRef}:${cut}`);
|
|
114
|
+
}
|
|
115
|
+
function checkCanonicalBytes(actual, limit) {
|
|
116
|
+
if (actual > limit)
|
|
117
|
+
invalid("canonical_byte_limit_exceeded", `actual=${actual}:limit=${limit}`);
|
|
118
|
+
}
|
|
119
|
+
export function evaluateCanonicalSymbolicDenotation(dag, assignment) {
|
|
120
|
+
const nodes = new Map(dag.nodes.map((node) => [node.key, node]));
|
|
121
|
+
let current = dag.root_ref;
|
|
122
|
+
const visited = new Set();
|
|
123
|
+
while (current !== "terminal.true" && current !== "terminal.false") {
|
|
124
|
+
if (visited.has(current))
|
|
125
|
+
invalid("canonical_dag_cycle", current);
|
|
126
|
+
visited.add(current);
|
|
127
|
+
const node = nodes.get(current);
|
|
128
|
+
if (!node)
|
|
129
|
+
invalid("canonical_dag_node_unknown", current);
|
|
130
|
+
const value = assignment[node.axis_ref];
|
|
131
|
+
if (value === undefined)
|
|
132
|
+
invalid("canonical_dag_assignment_missing", node.axis_ref);
|
|
133
|
+
const matches = node.edges.filter((edge) => symbolicEdgeMatches(edge, value));
|
|
134
|
+
if (matches.length !== 1)
|
|
135
|
+
invalid("canonical_dag_assignment_partition_invalid", `${node.axis_ref}:matches=${matches.length}`);
|
|
136
|
+
current = matches[0].child_ref;
|
|
137
|
+
}
|
|
138
|
+
return current === "terminal.true";
|
|
139
|
+
}
|
|
140
|
+
void DESIGN_RESOURCE_SYMBOLIC_FACT_POLICY.symbolic_denotation_efficiency_delivery;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { denoteDesignResourceSymbolicPoint } from "./design-resource-symbolic-denotation.js";
|
|
2
|
+
import { compileSymbolicDenotation, evaluateCanonicalSymbolicDenotation } from "./symbolic-denotation-engine.js";
|
|
3
|
+
export declare const symbolicDenotation: Readonly<{
|
|
4
|
+
compile: typeof compileSymbolicDenotation;
|
|
5
|
+
evaluate: typeof evaluateCanonicalSymbolicDenotation;
|
|
6
|
+
denoteDesignPoint: typeof denoteDesignResourceSymbolicPoint;
|
|
7
|
+
sourceIr: Readonly<{
|
|
8
|
+
mediaType: "application/vnd.ty-context.symbolic-source-ir+json";
|
|
9
|
+
schemaVersion: "design-resource-symbolic-source-ir-v1";
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { denoteDesignResourceSymbolicPoint } from "./design-resource-symbolic-denotation.js";
|
|
2
|
+
import { compileSymbolicDenotation, evaluateCanonicalSymbolicDenotation, } from "./symbolic-denotation-engine.js";
|
|
3
|
+
import { DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE, DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION, } from "./design-resource-symbolic-source-ir-types.js";
|
|
4
|
+
export const symbolicDenotation = Object.freeze({
|
|
5
|
+
compile: compileSymbolicDenotation,
|
|
6
|
+
evaluate: evaluateCanonicalSymbolicDenotation,
|
|
7
|
+
denoteDesignPoint: denoteDesignResourceSymbolicPoint,
|
|
8
|
+
sourceIr: Object.freeze({
|
|
9
|
+
mediaType: DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE,
|
|
10
|
+
schemaVersion: DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION,
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SymbolicDenotationAxisDomain, SymbolicDenotationCanonicalEdgeV1, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
|
|
2
|
+
interface EnumSegment {
|
|
3
|
+
kind: "enum";
|
|
4
|
+
values: string[];
|
|
5
|
+
}
|
|
6
|
+
interface NumberSegment {
|
|
7
|
+
kind: "number";
|
|
8
|
+
minimum: number;
|
|
9
|
+
maximum: number;
|
|
10
|
+
}
|
|
11
|
+
export type SymbolicAxisSegment = EnumSegment | NumberSegment;
|
|
12
|
+
export interface SymbolicRuntimeAxis {
|
|
13
|
+
domain: SymbolicDenotationAxisDomain;
|
|
14
|
+
segments: SymbolicAxisSegment[];
|
|
15
|
+
}
|
|
16
|
+
export declare function buildSymbolicRuntimeAxes(domains: SymbolicDenotationAxisDomain[], numberCuts: ReadonlyMap<string, Set<number>>): SymbolicRuntimeAxis[];
|
|
17
|
+
export declare function canonicalSymbolicEdges(axis: SymbolicRuntimeAxis, childRefs: string[]): SymbolicDenotationCanonicalEdgeV1[];
|
|
18
|
+
export declare function symbolicEdgeMatches(edge: SymbolicDenotationCanonicalEdgeV1, value: SymbolicDenotationScalar): boolean;
|
|
19
|
+
export declare function symbolicSegmentMatches(segment: SymbolicAxisSegment, matches: (value: SymbolicDenotationScalar) => boolean): boolean;
|
|
20
|
+
export {};
|