Skip to content

Release: gds-owl v0.1.0 + Paper Defs 2.5/2.7 bridge#132

Merged
rororowyourboat merged 13 commits intomainfrom
dev
Mar 28, 2026
Merged

Release: gds-owl v0.1.0 + Paper Defs 2.5/2.7 bridge#132
rororowyourboat merged 13 commits intomainfrom
dev

Conversation

@rororowyourboat
Copy link
Copy Markdown
Collaborator

Summary

Merge dev → main for the gds-owl v0.1.0 release and Paper bridge Steps 1-2.

  • gds-owl v0.1.0: OWL/Turtle ontology, SHACL shapes, SPARQL queries, RDF round-trip (157 tests). Formal representability analysis. Docs + mkdocs integration.
  • AdmissibleInputConstraint + TransitionSignature (Paper Defs 2.5/2.7): Structural annotations in gds-framework (SC-008/SC-009). StockFlow + Control compilers emit TransitionSignature. Insurance + thermostat examples demonstrate AdmissibleInputConstraint.
  • Documentation: gds-owl docs site, verification guide updated for SC-008/SC-009, paper-implementation-gap analysis.

Test results

Package Tests
gds-framework 477 passed
gds-stockflow 216 passed
gds-control 119 passed
gds-owl 157 passed
gds-examples 836 passed

Lint and format clean. mkdocs build --strict passes.

Tag

gds-owl/v0.1.0 tagged on dev for PyPI publish.

rororowyourboat and others added 11 commits March 27, 2026 18:50
New package providing bidirectional round-trip between GDS Pydantic models
and RDF/OWL representations. 155 tests, 95% coverage.

Modules:
- ontology.py: OWL TBox (class hierarchy, properties) for GDS core
- export.py: GDSSpec/SystemIR/CanonicalGDS/VerificationReport -> RDF
- import_.py: RDF -> Pydantic (proves lossless round-trip)
- shacl.py: SHACL shapes mirroring GDS verification checks
- sparql.py: 7 pre-built query templates with runner
- serialize.py: to_turtle/to_jsonld/to_ntriples convenience functions

Documentation:
- representation-gap.md: informal analysis of what each representation captures
- formal-representability.md: formal representability classification (R1/R2/R3)
  proving the canonical form h = f . g is the exact boundary between what
  ontological formalisms can and cannot express
9 revisions from audit:
- Replace linear expressiveness hierarchy with SHACL-core/SPARQL/Turing
  three-tier ordering that reflects OWA vs CWA distinction
- Reclassify G-004 back to R2: WiringIR source/target are datatype
  properties (string literals), not object property references — requires
  SPARQL negation-as-failure, not SHACL sh:class
- Explain SC-004 R2: Wire.space is also a string literal
- Justify SC-006/SC-007 as R1 via SHACL sh:qualifiedMinCount
- Narrow SPARQL capability claim: CONSTRUCT can't generate unbounded
  nodes from a single string value
- Qualify category theory claim: "inspired by" not "is"
- Remove fragile test count, reference test class names instead
- Demote Corollary 6.5 to Remark with practical consequence (sourceLabel)
- Add explicit bridge from Remark 1.10 to Definition 2.2

Final counts: R1=4, R2=6, R3=2, Mixed=1
Adds a front-matter overview summarizing the key insights before the
formal definitions: the h = f ∘ g boundary, the data/computation duality
table, the validation stack (OWL → SHACL-core → SPARQL → Python), and
four architectural consequences for the GDS ecosystem.
…fs 2.5, 2.7)

Bridge the two most important gaps between Zargham & Shorish (2022) and the
software implementation:

- AdmissibleInputConstraint (U_x): declares state-dependent input constraints
  on BoundaryAction blocks. Keyed by name to allow multiple constraints per
  boundary block.

- TransitionSignature (f|_x): declares mechanism read dependencies (which
  state variables a mechanism reads). Complements Mechanism.updates (writes).

Both follow the existing f_struct / f_behav split: dependency graphs are
structural (R1, exported to OWL), actual constraint/transition functions
are behavioral (R3, lossy in serialization).

gds-framework changes:
- New gds/constraints.py with frozen Pydantic models
- GDSSpec: two new registries, registration methods, validation
- SC-008 (check_admissibility_references), SC-009 (check_transition_reads)
- CanonicalGDS: admissibility_map and read_map fields
- SpecQuery: 3 new dependency analysis methods
- spec_to_dict: serialization for both registries
- 41 new tests (477 total)

gds-owl changes:
- OWL classes/properties for both concepts with BNode-based tuple reification
- Export/import with documented R3 loss on constraint callable
- SHACL structural + semantic shapes
- 2 new round-trip tests (157 total)

docs:
- Paper-implementation gap analysis (docs/guides/paper-implementation-gap.md)
- Updated formal-representability.md: 8-tuple GDSSpec, Properties 4.5/4.6,
  SC-008/SC-009, updated counts (15 checks, 6 R1)
- paper-implementation-gap.md: mark Steps 1-2 as DONE with actual API
  examples, move U_x/f|_x from "Not Implemented" to "Structurally
  Implemented", update dependency graph and package placement table
- formal-representability.md: already updated in prior commit
- CLAUDE.md: SC-001..SC-007 -> SC-001..SC-009
feat: gds-owl package + AdmissibleInputConstraint/TransitionSignature
…ibleInputConstraint in examples

StockFlow and Control compilers now emit TransitionSignature for each
mechanism during compile_model(), capturing read dependencies that were
previously implicit in wiring logic. Insurance and thermostat examples
demonstrate AdmissibleInputConstraint as first-class declarations.

- StockFlow: stock mechanisms declare reads=[(stock, "level")] with
  connected flows as depends_on_blocks
- Control: state mechanisms declare reads=[(state, "value")] with
  driving controllers as depends_on_blocks
- Insurance example: solvency constraint (claims capped by reserve)
- Thermostat example: sensor state dependency (reading depends on temp)
- Verification guide and CLAUDE.md updated for SC-008/SC-009
feat: gds-owl package + Paper Defs 2.5/2.7 bridge (Steps 1-2)
- docs/owl/ with index, getting-started, representability guide,
  formal representability analysis, and API reference pages
- mkdocs.yml: OWL section in nav and llmstxt plugin
- mkdocs build --strict passes
def test_custom_base_uri(self, thermostat_spec: GDSSpec) -> None:
g = spec_to_graph(thermostat_spec, base_uri="https://example.com/")
ttl = g.serialize(format="turtle")
assert "example.com" in ttl

Check failure

Code scanning / CodeQL

Incomplete URL substring sanitization High test

The string
example.com
may be at an arbitrary position in the sanitized URL.

Copilot Autofix

AI 2 days ago

Copilot could not generate an autofix suggestion

Copilot could not generate an autofix suggestion for this alert. Try pushing a new commit or if the problem persists contact support.

rohan added 2 commits March 28, 2026 06:17
pygments 2.19.2 is the latest version. Transitive dependency from
pytest, mkdocs-material, marimo, rich. Will remove suppression when
a patched pygments release is available.
@rororowyourboat rororowyourboat merged commit 294dc01 into main Mar 28, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant