ε.κ.0 δ2 — A-21 G-SHACL-OPEN-FLAG-ENFORCED gate spec + A-162 candidate

Outcome: outcome-VALIDATED Closed: 2026-05-04T19:55 BST

Key empirical findings

  1. gen-shacl —non-closed is the default-closed fix — LinkML 1.10.0 defaults sh:closed true; --non-closed produces sh:closed false in generated SHACL. Smoke-test confirmed:

    • Closed shapes (default): Conforms: FalseClosedConstraintComponent rejects partner extension property
    • Open shapes (--non-closed): Conforms: True
  2. 2 NON-COMPLIANT patches applied (from δ1 remediation list):

    • code-inherit-v2/.github/workflows/linkml-generator-matrix.yml line 66 → gen-shacl --non-closed linkml/inherit-v2.linkml.yaml
    • code-inherit-v2/Makefile line 41 → gen-shacl --non-closed $(SCHEMA)
    • Commit be43647 pushed to code-inherit-v2 main
  3. Lint script: docs-strategy/scripts/lint-gen-shacl-invocations.sh v1.0 authored and committed (56d9a76). Scans .github/workflows/ for non-compliant gen-shacl invocations. Run against patched repo: PASS.

  4. A-162 amendment candidate: G-SHACL-OPEN-FLAG-ENFORCED — pending Rich approval. Text in closure-bundle + T-file §6.

  5. richard-task #229 reactivation condition MET: ELK OWL API spike can proceed once A-162 approved; reactivation threshold remains T-box ~2K complex DL classes.

Pre-existing arch-state discrepancy (documented, not resolved)

Shape X angle (vii) says “21-gate CI” but §13 entries say “22 per A-130”. Pre-existing inconsistency; δ2 treats §13 as authoritative. Should be resolved at next arch-state minor bump.

Commits

RepoCommitDescription
off-githube72101fT-file
code-inherit-v2be43647CI patches
docs-strategy56d9a76Lint script

Why: A-162 enforces that INHERIT v2 partner extensions (properties beyond the base schema) are not silently rejected by SHACL CI gates. Without —non-closed, all partner extension validation passes locally but fails in CI with no error message about the real cause.

How to apply: When authoring new A-21 CI gates that invoke gen-shacl, always include --non-closed. Run bash docs-strategy/scripts/lint-gen-shacl-invocations.sh <repo-root> to verify. A-162 wiring into pre-commit hook is a Phase-1 Sprint S1 follow-on (~½ day).