project-tiny-context-harness 0.8.11 → 0.8.12
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 +490 -472
- package/assets/README.md +762 -749
- package/assets/README.zh-CN.md +446 -431
- package/assets/agents/.gitkeep +1 -1
- package/assets/agents/AGENTS_CORE.md +17 -23
- 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 +64 -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 +52 -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 +119 -119
- 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 +98 -94
- package/assets/skills/long-task-workflow/references/evidence-design.md +67 -63
- 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.js +9 -2
- package/dist/commands/enable.js +2 -0
- package/dist/commands/index.js +1 -1
- 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-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-activation-validation.js +2 -2
- package/dist/lib/long-task-authority-policy.d.ts +3 -0
- package/dist/lib/long-task-authority-policy.js +3 -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 +90 -0
- package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
- package/dist/lib/long-task-counterfactual-sandbox.js +7 -5
- 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.js +28 -0
- package/dist/lib/long-task-evidence-capability-runtime.js +271 -63
- package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
- package/dist/lib/long-task-evidence-v2.d.ts +1 -1
- package/dist/lib/long-task-evidence-v2.js +5 -5
- 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-playwright-capability-records.d.ts +2 -0
- package/dist/lib/long-task-playwright-capability-records.js +74 -2
- package/dist/lib/long-task-runner-freeze.d.ts +1 -1
- package/dist/lib/long-task-runner-freeze.js +4 -2
- package/dist/lib/long-task-semantic-contract-types.d.ts +1 -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 +15 -3
- 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 +5 -1
- package/dist/lib/long-task-semantic-fact-evidence.js +47 -4
- 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-item-parser.d.ts +2 -2
- package/dist/lib/long-task-source-item-parser.js +20 -11
- 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-v2.js +1 -1
- 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.js +11 -1
- package/dist/lib/migrations.js +58 -0
- package/dist/lib/profiles.js +0 -1
- 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 +390 -5
- package/migrations/README.md +15 -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 { validateSemanticFactOutcomeBindings } from "./long-task-semantic-fact-contract-facts.js";
|
|
2
2
|
import { validateSemanticFactProofBindings } from "./long-task-semantic-fact-contract-proofs.js";
|
|
3
3
|
import { assertSameSemanticFactClosureSet, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
|
|
4
|
-
export function validateSemanticFactContractProjection(contract, manifest, index) {
|
|
4
|
+
export function validateSemanticFactContractProjection(contract, manifest, index, factRevisions, obligationRevisions, sourceRequiresRevisions) {
|
|
5
5
|
const expectations = new Map();
|
|
6
6
|
const allFactBindings = [];
|
|
7
7
|
const allProofBindings = [];
|
|
@@ -10,15 +10,27 @@ export function validateSemanticFactContractProjection(contract, manifest, index
|
|
|
10
10
|
const facts = manifest.facts.filter((item) => item.outcome_ref === outcome.key);
|
|
11
11
|
const proofs = manifest.proof_obligations.filter((proof) => facts.some((fact) => fact.key === proof.fact_ref));
|
|
12
12
|
const bindings = outcome.semantic_fact_bindings;
|
|
13
|
+
const revisionsRequired = sourceRequiresRevisions ||
|
|
14
|
+
bindings.facts.some((item) => item.fact_revision_digest !== undefined) ||
|
|
15
|
+
bindings.proofs.some((item) => item.obligation_revision_digest !== undefined);
|
|
13
16
|
assertSameSemanticFactClosureSet(bindings.facts.map((item) => item.fact_ref), facts.map((item) => item.key), `contract_fact_set:${outcome.key}`);
|
|
17
|
+
if (revisionsRequired) {
|
|
18
|
+
assertSameSemanticFactClosureSet(bindings.facts.map((item) => revisionPair(item.fact_ref, item.fact_revision_digest, `contract_fact_revision:${outcome.key}`)), facts.map((item) => revisionPair(item.key, factRevisions.get(item.key), `source_fact_revision:${outcome.key}`)), `contract_fact_revision_set:${outcome.key}`);
|
|
19
|
+
assertSameSemanticFactClosureSet(bindings.proofs.map((item) => revisionPair(item.proof_ref, item.obligation_revision_digest, `contract_obligation_revision:${outcome.key}`)), proofs.map((item) => revisionPair(item.key, obligationRevisions.get(item.key), `source_obligation_revision:${outcome.key}`)), `contract_obligation_revision_set:${outcome.key}`);
|
|
20
|
+
}
|
|
14
21
|
assertSameSemanticFactClosureSet(bindings.proofs.map((item) => item.proof_ref), proofs.map((item) => item.key), `contract_proof_set:${outcome.key}`);
|
|
15
22
|
uniqueSemanticFactClosureValues(bindings.proofs.map((item) => item.authority === "machine"
|
|
16
23
|
? `${item.check_ref}\0${item.assertion_ref}`
|
|
17
24
|
: `external\0${item.confirmation_ref}`), `contract_proof_target:${outcome.key}`);
|
|
18
|
-
validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings);
|
|
19
|
-
validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings);
|
|
25
|
+
validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings, factRevisions, revisionsRequired);
|
|
26
|
+
validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings, factRevisions, obligationRevisions, revisionsRequired);
|
|
20
27
|
}
|
|
21
28
|
assertSameSemanticFactClosureSet(allFactBindings, manifest.facts.map((item) => item.key), "contract_all_fact_set");
|
|
22
29
|
assertSameSemanticFactClosureSet(allProofBindings, manifest.proof_obligations.map((item) => item.key), "contract_all_proof_set");
|
|
23
30
|
return expectations;
|
|
24
31
|
}
|
|
32
|
+
function revisionPair(key, digest, label) {
|
|
33
|
+
if (!digest)
|
|
34
|
+
throw new Error(`semantic_fact_closure_invalid:${label}:${key}:missing`);
|
|
35
|
+
return `${key}\0${digest}`;
|
|
36
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
|
|
2
2
|
import type { SemanticFactManifestIndexV1 } from "./semantic-fact-policy.js";
|
|
3
3
|
import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
|
|
4
|
-
export declare function validateSemanticFactOutcomeBindings(outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, allFactBindings: string[]): void;
|
|
4
|
+
export declare function validateSemanticFactOutcomeBindings(outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, allFactBindings: string[], factRevisions: Map<string, string>, revisionsRequired: boolean): void;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { semanticFactClosureInvalid, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
|
|
2
|
-
export function validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings) {
|
|
2
|
+
export function validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings, factRevisions, revisionsRequired) {
|
|
3
3
|
uniqueSemanticFactClosureValues(outcome.semantic_fact_bindings.facts.map((item) => item.claim_ref), `contract_fact_claim:${outcome.key}`);
|
|
4
4
|
const applicabilityRefs = new Set(outcome.applicability.map((item) => item.key));
|
|
5
5
|
for (const binding of outcome.semantic_fact_bindings.facts) {
|
|
6
6
|
const fact = index.fact_by_ref.get(binding.fact_ref);
|
|
7
7
|
const expectedClaim = `semantic_fact.${binding.fact_ref}`;
|
|
8
|
+
if (revisionsRequired &&
|
|
9
|
+
binding.fact_revision_digest !== factRevisions.get(binding.fact_ref))
|
|
10
|
+
semanticFactClosureInvalid("contract_fact_revision_mismatch", `${outcome.key}:${binding.fact_ref}:${binding.fact_revision_digest ?? "missing"}:${factRevisions.get(binding.fact_ref) ?? "missing"}`);
|
|
8
11
|
if (binding.claim_ref !== expectedClaim)
|
|
9
12
|
semanticFactClosureInvalid("contract_fact_claim_identity_mismatch", `${outcome.key}:${binding.fact_ref}:${binding.claim_ref}:${expectedClaim}`);
|
|
10
13
|
if (!applicabilityRefs.has(binding.applicability_ref))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { DeliveryContractV2, ExecutionTargetV2 } from "./long-task-delivery-types.js";
|
|
2
2
|
import type { SemanticFactManifestIndexV1 } from "./semantic-fact-policy.js";
|
|
3
3
|
import type { SemanticFactExpectationV2, SemanticFactManifestV1 } from "./semantic-fact-types.js";
|
|
4
|
-
export declare function validateSemanticFactProofBindings(contract: DeliveryContractV2, outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, targetByRef: Map<string, ExecutionTargetV2>, expectations: Map<string, SemanticFactExpectationV2[]>, allProofBindings: string[]): void;
|
|
4
|
+
export declare function validateSemanticFactProofBindings(contract: DeliveryContractV2, outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, targetByRef: Map<string, ExecutionTargetV2>, expectations: Map<string, SemanticFactExpectationV2[]>, allProofBindings: string[], factRevisions: Map<string, string>, obligationRevisions: Map<string, string>, revisionsRequired: boolean): void;
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { sameSemanticFactClosureSet, semanticFactClosureInvalid, } from "./long-task-semantic-fact-closure-primitives.js";
|
|
2
|
-
export function validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings) {
|
|
2
|
+
export function validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings, factRevisions, obligationRevisions, revisionsRequired) {
|
|
3
3
|
for (const binding of outcome.semantic_fact_bindings.proofs) {
|
|
4
4
|
const proof = index.proof_by_ref.get(binding.proof_ref);
|
|
5
5
|
const factBinding = outcome.semantic_fact_bindings.facts.find((item) => item.fact_ref === binding.fact_ref);
|
|
6
6
|
if (!factBinding)
|
|
7
7
|
semanticFactClosureInvalid("contract_proof_fact_binding_missing", `${outcome.key}:${binding.proof_ref}:${binding.fact_ref}`);
|
|
8
|
+
if (revisionsRequired &&
|
|
9
|
+
binding.obligation_revision_digest !==
|
|
10
|
+
obligationRevisions.get(binding.proof_ref))
|
|
11
|
+
semanticFactClosureInvalid("contract_obligation_revision_mismatch", `${outcome.key}:${binding.proof_ref}:${binding.obligation_revision_digest ?? "missing"}:${obligationRevisions.get(binding.proof_ref) ?? "missing"}`);
|
|
8
12
|
validateProofIdentity(outcome, proof, binding);
|
|
9
13
|
validateObserverTargets(proof, binding, targetByRef);
|
|
10
14
|
if (binding.authority === "external_confirmation")
|
|
11
15
|
validateExternalProofProjection(contract, outcome, binding, factBinding.claim_ref);
|
|
12
16
|
else
|
|
13
|
-
validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations);
|
|
17
|
+
validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations, factRevisions, obligationRevisions, revisionsRequired);
|
|
14
18
|
allProofBindings.push(binding.proof_ref);
|
|
15
19
|
}
|
|
16
20
|
}
|
|
@@ -37,7 +41,7 @@ function validateExternalProofProjection(contract, outcome, binding, claimRef) {
|
|
|
37
41
|
if (!confirmation.impact_claims.includes(fullClaim))
|
|
38
42
|
semanticFactClosureInvalid("semantic_fact_confirmation_lineage_missing", `${binding.confirmation_ref}:${fullClaim}`);
|
|
39
43
|
}
|
|
40
|
-
function validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations) {
|
|
44
|
+
function validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations, factRevisions, obligationRevisions, revisionsRequired) {
|
|
41
45
|
const check = outcome.acceptance.checks.find((item) => item.key === binding.check_ref);
|
|
42
46
|
if (!check)
|
|
43
47
|
semanticFactClosureInvalid("semantic_fact_check_unknown", `${outcome.key}:${binding.check_ref}`);
|
|
@@ -62,6 +66,11 @@ function validateMachineProofProjection(contract, outcome, manifest, index, bind
|
|
|
62
66
|
rows.push({
|
|
63
67
|
manifest_ref: manifest.key,
|
|
64
68
|
manifest_sha256: contract.semantic_fact_manifest.sha256,
|
|
69
|
+
fact_key: fact.key,
|
|
70
|
+
fact_revision_digest: factRevisions.get(fact.key),
|
|
71
|
+
obligation_key: proof.key,
|
|
72
|
+
obligation_revision_digest: obligationRevisions.get(proof.key),
|
|
73
|
+
revision_identity_required: revisionsRequired,
|
|
65
74
|
fact_ref: fact.key,
|
|
66
75
|
proof_ref: proof.key,
|
|
67
76
|
method: proof.method,
|
|
@@ -6,6 +6,10 @@ export declare function validateSemanticFactEvidence(check: CompiledCheckV2, rec
|
|
|
6
6
|
export declare function semanticFactComparisonResultIdentity(value: {
|
|
7
7
|
fact_ref: string;
|
|
8
8
|
proof_ref: string;
|
|
9
|
+
fact_key?: string;
|
|
10
|
+
fact_revision_digest?: string;
|
|
11
|
+
obligation_key?: string;
|
|
12
|
+
obligation_revision_digest?: string;
|
|
9
13
|
target_ref: string;
|
|
10
14
|
actual_value_sha256: string;
|
|
11
15
|
expected_value_sha256: string;
|
|
@@ -17,5 +21,5 @@ export declare function semanticFactComparisonResultIdentity(value: {
|
|
|
17
21
|
passed: boolean;
|
|
18
22
|
}): string;
|
|
19
23
|
export declare function validateDistinctSemanticFactEvidence(records: EvidenceCapabilityRecordV2[]): string | null;
|
|
20
|
-
export declare const typed_semantic_fact_runtime_evidence = "
|
|
24
|
+
export declare const typed_semantic_fact_runtime_evidence = "obligation_key+obligation_revision_digest->fact_key+fact_revision_digest+actual+comparison+verdict+oracle+environment";
|
|
21
25
|
export {};
|
|
@@ -38,6 +38,10 @@ function validateSemanticFactEvidenceAuthority(check, record, expected) {
|
|
|
38
38
|
semanticFactComparisonResultIdentity({
|
|
39
39
|
fact_ref: record.fact_ref,
|
|
40
40
|
proof_ref: record.proof_ref,
|
|
41
|
+
fact_key: record.fact_key,
|
|
42
|
+
fact_revision_digest: record.fact_revision_digest,
|
|
43
|
+
obligation_key: record.obligation_key,
|
|
44
|
+
obligation_revision_digest: record.obligation_revision_digest,
|
|
41
45
|
target_ref: record.target_ref,
|
|
42
46
|
actual_value_sha256: record.actual_observation.value_sha256,
|
|
43
47
|
expected_value_sha256: expected.expected.sha256,
|
|
@@ -67,7 +71,22 @@ function sameSemanticFactIdentity(record, expected) {
|
|
|
67
71
|
record.method === expected.method &&
|
|
68
72
|
record.subject_ref === expected.subject_ref &&
|
|
69
73
|
record.condition_ref === expected.condition_ref &&
|
|
70
|
-
record.property_ref === expected.property_ref
|
|
74
|
+
record.property_ref === expected.property_ref &&
|
|
75
|
+
sameSemanticFactRevisionIdentity(record, expected));
|
|
76
|
+
}
|
|
77
|
+
function sameSemanticFactRevisionIdentity(record, expected) {
|
|
78
|
+
const present = record.fact_key !== undefined ||
|
|
79
|
+
record.fact_revision_digest !== undefined ||
|
|
80
|
+
record.obligation_key !== undefined ||
|
|
81
|
+
record.obligation_revision_digest !== undefined;
|
|
82
|
+
if (!expected.revision_identity_required && !present)
|
|
83
|
+
return true;
|
|
84
|
+
return (record.fact_key === expected.fact_key &&
|
|
85
|
+
record.fact_key === record.fact_ref &&
|
|
86
|
+
record.fact_revision_digest === expected.fact_revision_digest &&
|
|
87
|
+
record.obligation_key === expected.obligation_key &&
|
|
88
|
+
record.obligation_key === record.proof_ref &&
|
|
89
|
+
record.obligation_revision_digest === expected.obligation_revision_digest);
|
|
71
90
|
}
|
|
72
91
|
function validSemanticFactRedaction(sensitivity, redaction) {
|
|
73
92
|
return ((sensitivity === "plain" && redaction === null) ||
|
|
@@ -118,6 +137,10 @@ function validateSemanticFactObservers(record, expected, artifactHashes) {
|
|
|
118
137
|
semanticFactComparisonResultIdentity({
|
|
119
138
|
fact_ref: record.fact_ref,
|
|
120
139
|
proof_ref: record.proof_ref,
|
|
140
|
+
fact_key: record.fact_key,
|
|
141
|
+
fact_revision_digest: record.fact_revision_digest,
|
|
142
|
+
obligation_key: record.obligation_key,
|
|
143
|
+
obligation_revision_digest: record.obligation_revision_digest,
|
|
121
144
|
target_ref: observer.target_ref,
|
|
122
145
|
actual_value_sha256: observer.value_sha256,
|
|
123
146
|
expected_value_sha256: expected.expected.sha256,
|
|
@@ -133,7 +156,25 @@ function validateSemanticFactObservers(record, expected, artifactHashes) {
|
|
|
133
156
|
return null;
|
|
134
157
|
}
|
|
135
158
|
export function semanticFactComparisonResultIdentity(value) {
|
|
136
|
-
|
|
159
|
+
const revisionIdentityPresent = value.fact_key !== undefined ||
|
|
160
|
+
value.fact_revision_digest !== undefined ||
|
|
161
|
+
value.obligation_key !== undefined ||
|
|
162
|
+
value.obligation_revision_digest !== undefined;
|
|
163
|
+
return sha256Hex(canonicalValueJson(revisionIdentityPresent
|
|
164
|
+
? value
|
|
165
|
+
: {
|
|
166
|
+
fact_ref: value.fact_ref,
|
|
167
|
+
proof_ref: value.proof_ref,
|
|
168
|
+
target_ref: value.target_ref,
|
|
169
|
+
actual_value_sha256: value.actual_value_sha256,
|
|
170
|
+
expected_value_sha256: value.expected_value_sha256,
|
|
171
|
+
comparator: value.comparator,
|
|
172
|
+
mode: value.mode,
|
|
173
|
+
parameters_sha256: value.parameters_sha256,
|
|
174
|
+
tolerance_sha256: value.tolerance_sha256,
|
|
175
|
+
mask_sha256: value.mask_sha256,
|
|
176
|
+
passed: value.passed,
|
|
177
|
+
}));
|
|
137
178
|
}
|
|
138
179
|
export function validateDistinctSemanticFactEvidence(records) {
|
|
139
180
|
const observations = new Set();
|
|
@@ -142,7 +183,9 @@ export function validateDistinctSemanticFactEvidence(records) {
|
|
|
142
183
|
for (const record of records) {
|
|
143
184
|
if (record.capability !== "semantic_fact")
|
|
144
185
|
continue;
|
|
145
|
-
const identity =
|
|
186
|
+
const identity = record.obligation_key
|
|
187
|
+
? `${record.obligation_key}\0${record.obligation_revision_digest}\0${record.fact_key}\0${record.fact_revision_digest}`
|
|
188
|
+
: `${record.fact_ref}\0${record.proof_ref}`;
|
|
146
189
|
if (identities.has(identity))
|
|
147
190
|
return "semantic_fact_result_duplicate";
|
|
148
191
|
identities.add(identity);
|
|
@@ -162,4 +205,4 @@ function sameSet(left, right) {
|
|
|
162
205
|
new Set(left).size === left.length &&
|
|
163
206
|
left.every((item) => right.includes(item)));
|
|
164
207
|
}
|
|
165
|
-
export const typed_semantic_fact_runtime_evidence = "
|
|
208
|
+
export const typed_semantic_fact_runtime_evidence = "obligation_key+obligation_revision_digest->fact_key+fact_revision_digest+actual+comparison+verdict+oracle+environment";
|
|
@@ -13,13 +13,14 @@ export function parseSemanticFactOutcomeBindings(value, label) {
|
|
|
13
13
|
manifest_ref: semanticRef(row.manifest_ref, `${label}.manifest_ref`),
|
|
14
14
|
facts: array(row.facts, `${label}.facts`).map((item, index) => {
|
|
15
15
|
const itemLabel = `${label}.facts[${index}]`;
|
|
16
|
-
const entry = object(item, itemLabel, [
|
|
17
|
-
"fact_ref",
|
|
18
|
-
"claim_ref",
|
|
19
|
-
"applicability_ref",
|
|
20
|
-
]);
|
|
16
|
+
const entry = object(item, itemLabel, ["fact_ref", "claim_ref", "applicability_ref"], ["fact_revision_digest"]);
|
|
21
17
|
return {
|
|
22
18
|
fact_ref: semanticRef(entry.fact_ref, `${itemLabel}.fact_ref`),
|
|
19
|
+
...(Object.hasOwn(entry, "fact_revision_digest")
|
|
20
|
+
? {
|
|
21
|
+
fact_revision_digest: sha256(entry.fact_revision_digest, `${itemLabel}.fact_revision_digest`),
|
|
22
|
+
}
|
|
23
|
+
: {}),
|
|
23
24
|
claim_ref: semanticRef(entry.claim_ref, `${itemLabel}.claim_ref`),
|
|
24
25
|
applicability_ref: semanticRef(entry.applicability_ref, `${itemLabel}.applicability_ref`),
|
|
25
26
|
};
|
|
@@ -33,7 +34,12 @@ export function parseSemanticFactOutcomeBindings(value, label) {
|
|
|
33
34
|
"proof_surface",
|
|
34
35
|
"evidence_capabilities",
|
|
35
36
|
"authority",
|
|
36
|
-
], [
|
|
37
|
+
], [
|
|
38
|
+
"obligation_revision_digest",
|
|
39
|
+
"check_ref",
|
|
40
|
+
"assertion_ref",
|
|
41
|
+
"confirmation_ref",
|
|
42
|
+
]);
|
|
37
43
|
const authority = literal(preliminary.authority, ["machine", "external_confirmation"], `${itemLabel}.authority`);
|
|
38
44
|
if (authority === "machine") {
|
|
39
45
|
requireOwned(preliminary, itemLabel, ["check_ref", "assertion_ref"]);
|
|
@@ -45,6 +51,11 @@ export function parseSemanticFactOutcomeBindings(value, label) {
|
|
|
45
51
|
}
|
|
46
52
|
const base = {
|
|
47
53
|
proof_ref: semanticRef(preliminary.proof_ref, `${itemLabel}.proof_ref`),
|
|
54
|
+
...(Object.hasOwn(preliminary, "obligation_revision_digest")
|
|
55
|
+
? {
|
|
56
|
+
obligation_revision_digest: sha256(preliminary.obligation_revision_digest, `${itemLabel}.obligation_revision_digest`),
|
|
57
|
+
}
|
|
58
|
+
: {}),
|
|
48
59
|
fact_ref: semanticRef(preliminary.fact_ref, `${itemLabel}.fact_ref`),
|
|
49
60
|
method: semanticRef(preliminary.method, `${itemLabel}.method`),
|
|
50
61
|
proof_surface: literal(preliminary.proof_surface, PROOF_SURFACES, `${itemLabel}.proof_surface`),
|
|
@@ -17,5 +17,5 @@ export declare function semanticRef(value: unknown, label: string): string;
|
|
|
17
17
|
export declare function nullable<T>(value: unknown, parser: (value: unknown) => T): T | null;
|
|
18
18
|
export declare const PROOF_SURFACES: readonly ["ui_browser", "runtime_behavior", "api_contract", "data_state", "security_boundary", "population_coverage", "implementation_structure"];
|
|
19
19
|
export declare const JOURNEY_ROLES: readonly ["success", "degradation", "recovery", "stage_gate", "conformance"];
|
|
20
|
-
export declare const EVIDENCE_CAPABILITIES: readonly ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "design_conformance", "design_method", "semantic_fact", "target_runtime", "input_variation"];
|
|
20
|
+
export declare const EVIDENCE_CAPABILITIES: readonly ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "design_conformance", "design_method", "design_symbolic_certificate", "semantic_fact", "target_runtime", "input_variation"];
|
|
21
21
|
export declare function fail(label: string, message: string): never;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { CompiledSourceItemV2 } from "./long-task-delivery-types.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { DesignResourceHandoffInput } from "./design-resource-handoff-input-types.js";
|
|
3
3
|
import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
|
|
4
4
|
export interface ParsedSourceDocument {
|
|
5
5
|
items: CompiledSourceItemV2[];
|
|
6
|
-
designResourceHandoff:
|
|
6
|
+
designResourceHandoff: DesignResourceHandoffInput | null;
|
|
7
7
|
semanticFactManifest: SemanticFactManifestV1 | null;
|
|
8
8
|
}
|
|
9
9
|
export declare function parseSourceItems(sourcePath: string, content: string): CompiledSourceItemV2[];
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { parseDesignResourceHandoffInputShape } from "./design-resource-handoff-shape.js";
|
|
2
|
+
import { parseDesignResourceSymbolicHandoffShape } from "./design-resource-symbolic-fact-shape.js";
|
|
3
|
+
import { parseSemanticFactCompactCarrierShape } from "./semantic-fact-compact-carrier.js";
|
|
2
4
|
import { parseSemanticFactManifestShape } from "./semantic-fact-manifest-shape.js";
|
|
3
5
|
import { assertNoOpenOwnedSection, assertOwnedSourceSectionsClosed, consumeBackgroundBoundary, consumeOwnedText, consumeSourceItemBoundary, } from "./long-task-source-owned-sections.js";
|
|
4
6
|
import { formalBlockBody, forEachSourceLine } from "./source-line-scanner.js";
|
|
5
7
|
import { parseStrictYaml } from "./strict-codec.js";
|
|
6
|
-
const DESIGN_RESOURCE_START = /^\s*```yaml[ \t]+design-resource-handoff-v1[ \t]*$/u;
|
|
7
|
-
const SEMANTIC_FACT_START = /^\s*```yaml[ \t]+semantic-fact-manifest-v1[ \t]*$/u;
|
|
8
|
+
const DESIGN_RESOURCE_START = /^\s*```yaml[ \t]+design-resource-handoff-(v1|v2)[ \t]*$/u;
|
|
9
|
+
const SEMANTIC_FACT_START = /^\s*```yaml[ \t]+(semantic-fact-manifest-v1|semantic-fact-compact-carrier-v1)[ \t]*$/u;
|
|
8
10
|
const FORMAL_BLOCK_END = /^\s*```[ \t]*$/u;
|
|
9
11
|
export function parseSourceItems(sourcePath, content) {
|
|
10
12
|
return parseSourceDocument(sourcePath, content).items;
|
|
@@ -52,9 +54,15 @@ function consumeOpenFormalBlock(state, line, startOffset) {
|
|
|
52
54
|
if (!FORMAL_BLOCK_END.test(line))
|
|
53
55
|
return true;
|
|
54
56
|
try {
|
|
55
|
-
const value = parseStrictYaml(formalBlockBody(state.content, state.formalBlock.bodyStartOffset, startOffset, state.formalBlock.owner
|
|
57
|
+
const value = parseStrictYaml(formalBlockBody(state.content, state.formalBlock.bodyStartOffset, startOffset, state.formalBlock.owner.startsWith("design-resource-handoff-")));
|
|
56
58
|
if (state.formalBlock.owner === "design-resource-handoff-v1")
|
|
57
59
|
state.designResourceHandoff = parseDesignResourceHandoffInputShape(value);
|
|
60
|
+
else if (state.formalBlock.owner === "design-resource-handoff-v2")
|
|
61
|
+
state.designResourceHandoff =
|
|
62
|
+
parseDesignResourceSymbolicHandoffShape(value);
|
|
63
|
+
else if (state.formalBlock.owner === "semantic-fact-compact-carrier-v1")
|
|
64
|
+
state.semanticFactManifest =
|
|
65
|
+
parseSemanticFactCompactCarrierShape(value).manifest;
|
|
58
66
|
else
|
|
59
67
|
state.semanticFactManifest = parseSemanticFactManifestShape(value);
|
|
60
68
|
}
|
|
@@ -66,23 +74,24 @@ function consumeOpenFormalBlock(state, line, startOffset) {
|
|
|
66
74
|
return true;
|
|
67
75
|
}
|
|
68
76
|
function startFormalBlock(state, line, lineNumber, nextOffset) {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
? "
|
|
73
|
-
:
|
|
77
|
+
const designMatch = DESIGN_RESOURCE_START.exec(line);
|
|
78
|
+
const owner = designMatch
|
|
79
|
+
? designMatch[1] === "v2"
|
|
80
|
+
? "design-resource-handoff-v2"
|
|
81
|
+
: "design-resource-handoff-v1"
|
|
82
|
+
: (SEMANTIC_FACT_START.exec(line)?.[1] ?? null);
|
|
74
83
|
if (!owner)
|
|
75
84
|
return false;
|
|
76
85
|
assertNoOpenOwnedSection(state, lineNumber);
|
|
77
|
-
if (owner
|
|
86
|
+
if (owner.startsWith("design-resource-handoff-")) {
|
|
78
87
|
state.designResourceBlocks += 1;
|
|
79
88
|
if (state.designResourceBlocks > 1)
|
|
80
|
-
throw new Error(`source_formal_block_duplicate:${state.sourcePath}:design-resource-handoff
|
|
89
|
+
throw new Error(`source_formal_block_duplicate:${state.sourcePath}:design-resource-handoff`);
|
|
81
90
|
}
|
|
82
91
|
else {
|
|
83
92
|
state.semanticFactBlocks += 1;
|
|
84
93
|
if (state.semanticFactBlocks > 1)
|
|
85
|
-
throw new Error(`source_formal_block_duplicate:${state.sourcePath}:semantic-fact-manifest
|
|
94
|
+
throw new Error(`source_formal_block_duplicate:${state.sourcePath}:semantic-fact-manifest`);
|
|
86
95
|
}
|
|
87
96
|
state.formalBlock = {
|
|
88
97
|
owner,
|
|
@@ -7,6 +7,7 @@ export function validateUiDesignBinding(context) {
|
|
|
7
7
|
function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carriers, designTargetKeys, designAssertionRefs, report, }) {
|
|
8
8
|
for (const target of binding.design_targets) {
|
|
9
9
|
const label = `${outcome.key}:${binding.key}:${target.key}`;
|
|
10
|
+
const symbolic = target.fact_model === "symbolic_rules_v2";
|
|
10
11
|
if (designTargetKeys.has(target.key))
|
|
11
12
|
issue(report, "ui_design_target_key_duplicate", label);
|
|
12
13
|
designTargetKeys.add(target.key);
|
|
@@ -14,10 +15,20 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
|
|
|
14
15
|
if (designAssertionRefs.has(assertionIdentity))
|
|
15
16
|
issue(report, "ui_design_target_assertion_duplicate", label);
|
|
16
17
|
designAssertionRefs.add(assertionIdentity);
|
|
17
|
-
unique(
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
unique((symbolic
|
|
19
|
+
? (target.symbolic_method_bindings ?? [])
|
|
20
|
+
: target.verification_method_bindings).map((item) => item.method), "ui_design_target_verification_method_duplicate", label, report);
|
|
21
|
+
unique((symbolic
|
|
22
|
+
? (target.symbolic_method_bindings ?? [])
|
|
23
|
+
: target.verification_method_bindings).map((item) => item.assertion_ref), "ui_design_target_verification_assertion_duplicate", label, report);
|
|
24
|
+
if (!(symbolic
|
|
25
|
+
? (target.symbolic_method_bindings ?? [])
|
|
26
|
+
: target.verification_method_bindings).length)
|
|
20
27
|
issue(report, "ui_design_target_verification_methods_required", label);
|
|
28
|
+
if (symbolic &&
|
|
29
|
+
(target.condition_keys.length ||
|
|
30
|
+
target.verification_method_bindings.length))
|
|
31
|
+
issue(report, "ui_design_symbolic_ground_fields_forbidden", label);
|
|
21
32
|
const methodArtifactPaths = new Set();
|
|
22
33
|
const methodFactObligations = new Set();
|
|
23
34
|
for (const [name, values] of [
|
|
@@ -26,7 +37,7 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
|
|
|
26
37
|
["claim_refs", target.claim_refs],
|
|
27
38
|
]) {
|
|
28
39
|
unique(values, `ui_design_target_${name}_duplicate`, label, report);
|
|
29
|
-
if (!values.length)
|
|
40
|
+
if (!values.length && !(symbolic && name === "condition_keys"))
|
|
30
41
|
issue(report, `ui_design_target_${name}_required`, label);
|
|
31
42
|
}
|
|
32
43
|
for (const claimRef of target.claim_refs) {
|
|
@@ -44,6 +55,11 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
|
|
|
44
55
|
validateRootJourney(binding, check, label, report);
|
|
45
56
|
validateCarrierInputs(check, carriers, label, report);
|
|
46
57
|
validateDesignAssertion(target, check, label, report);
|
|
58
|
+
if (symbolic) {
|
|
59
|
+
validateSymbolicDesignBindings(target, check, label, methodArtifactPaths, report);
|
|
60
|
+
validateDesignFiles(target, check, label, report);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
47
63
|
for (const methodBinding of target.verification_method_bindings) {
|
|
48
64
|
const identity = `${target.conformance_check_ref}\0${methodBinding.assertion_ref}`;
|
|
49
65
|
if (methodBinding.assertion_ref !== target.conformance_assertion_ref &&
|
|
@@ -86,6 +102,50 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
|
|
|
86
102
|
validateDesignFiles(target, check, label, report);
|
|
87
103
|
}
|
|
88
104
|
}
|
|
105
|
+
function validateSymbolicDesignBindings(target, check, label, artifactPaths, report) {
|
|
106
|
+
const obligationRefs = new Set();
|
|
107
|
+
for (const binding of target.symbolic_method_bindings ?? []) {
|
|
108
|
+
const assertion = check.positive_assertions.find((item) => item.key === binding.assertion_ref);
|
|
109
|
+
if (!assertion)
|
|
110
|
+
issue(report, "ui_design_symbolic_method_assertion_unknown", `${label}:${binding.method}:${binding.assertion_ref}`);
|
|
111
|
+
else if (!assertion.evidence_capabilities.includes("design_method"))
|
|
112
|
+
issue(report, "ui_design_symbolic_method_capability_required", `${label}:${binding.method}`);
|
|
113
|
+
if (!binding.rule_expectations.length)
|
|
114
|
+
issue(report, "ui_design_symbolic_rule_expectations_required", `${label}:${binding.method}`);
|
|
115
|
+
unique(binding.rule_expectations.map((item) => item.obligation_ref), "ui_design_symbolic_obligation_duplicate", `${label}:${binding.method}`, report);
|
|
116
|
+
for (const expectation of binding.rule_expectations) {
|
|
117
|
+
if (obligationRefs.has(expectation.obligation_ref))
|
|
118
|
+
issue(report, "ui_design_symbolic_obligation_reused", `${label}:${expectation.obligation_ref}`);
|
|
119
|
+
obligationRefs.add(expectation.obligation_ref);
|
|
120
|
+
}
|
|
121
|
+
for (const artifactPath of [
|
|
122
|
+
binding.artifact_path,
|
|
123
|
+
binding.observation_path,
|
|
124
|
+
])
|
|
125
|
+
validateSymbolicArtifactPath(artifactPath, target, check, label, artifactPaths, report);
|
|
126
|
+
}
|
|
127
|
+
const certificate = target.symbolic_certificate_binding;
|
|
128
|
+
if (!certificate) {
|
|
129
|
+
issue(report, "ui_design_symbolic_certificate_binding_required", label);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const assertion = check.positive_assertions.find((item) => item.key === certificate.assertion_ref);
|
|
133
|
+
if (!assertion)
|
|
134
|
+
issue(report, "ui_design_symbolic_certificate_assertion_unknown", `${label}:${certificate.assertion_ref}`);
|
|
135
|
+
else if (!assertion.evidence_capabilities.includes("design_symbolic_certificate"))
|
|
136
|
+
issue(report, "ui_design_symbolic_certificate_capability_required", label);
|
|
137
|
+
if (!certificate.expectations.length)
|
|
138
|
+
issue(report, "ui_design_symbolic_certificate_expectations_required", label);
|
|
139
|
+
unique(certificate.expectations.map((item) => item.certificate_ref), "ui_design_symbolic_certificate_duplicate", label, report);
|
|
140
|
+
validateSymbolicArtifactPath(certificate.artifact_path, target, check, label, artifactPaths, report);
|
|
141
|
+
}
|
|
142
|
+
function validateSymbolicArtifactPath(artifactPath, _target, check, label, artifactPaths, report) {
|
|
143
|
+
if (artifactPaths.has(artifactPath))
|
|
144
|
+
issue(report, "ui_design_symbolic_evidence_artifact_reused", `${label}:${artifactPath}`);
|
|
145
|
+
artifactPaths.add(artifactPath);
|
|
146
|
+
if (!check.artifact_globs.some((pattern) => matchesRepoPattern(artifactPath, pattern)))
|
|
147
|
+
issue(report, "ui_design_symbolic_evidence_artifact_glob_missing", `${label}:${artifactPath}`);
|
|
148
|
+
}
|
|
89
149
|
function sameSet(left, right) {
|
|
90
150
|
const leftSet = [...new Set(left)].sort();
|
|
91
151
|
const rightSet = [...new Set(right)].sort();
|