Skip to content

feat(openontology): Phase 2 + 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer - #101

Merged
ralyodio merged 1 commit into
masterfrom
feat/openontology-phase2-3
Jul 28, 2026
Merged

feat(openontology): Phase 2 + 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer#101
ralyodio merged 1 commit into
masterfrom
feat/openontology-phase2-3

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Everything the two shipped PRD phases deferred, minus what's called out at the bottom. 53 files, ~6.9k lines, 76 new tests.

Storage — Turso/libSQL

createLibsqlStore hydrates the read model at open, serves reads synchronously (a query evaluator that awaits per triple pattern is unusable), and buffers mutations as SQL that flush() writes in one transaction. Versioned idempotent migrations; indexes over subject, predicate, entity-valued object, status, both time axes, aliases, external ids; FTS5 for label/alias search.

The append-only status log is replayed on open, so retractions, supersessions, and merge redirects survive a reopen — tested by closing and reopening a real database file.

REST + SSE + OpenAPI

16 paths under /api/ontologies, described at /api/ontologies/openapi, referencing the published JSON Schemas rather than restating them.

  • No token → read-only. Curator token → can apply. Agent token → can propose, cannot apply.
  • Idempotency-Key on mutations, revision ETags, 409 on a stale base revision
  • SSE stream emitting the same event objects as the JSON endpoint

MCP

OpenOntology and OpenPRD on the standards server: 4 + 2 resources, 11 + 6 tools, 5 + 2 prompts. Read-only by default; OPENONTOLOGY_MCP_WRITABLE=1 buys proposals and never applies — the denial is the shared policy layer, not a second rule that could drift.

Interoperability

RDF/Turtle export and import of the reified profile, plus the plain triple for asserted relationships so a consumer wanting only the accepted graph gets one.

SHACL for 5 of 7 constraint kinds. unique and query are reported as unmapped in both the return value and the generated Turtle — a shape that quietly means something narrower is worse than no shape.

Source adapters

CSV, JSON, YAML, NDJSON, Markdown, generic JSON HTTP, GitHub. All produce proposed operations with source, evidence selector, run id, and confidence attached; fetch is injected so ingestion is offline and testable. Each declares its capabilities — so "nothing was deleted upstream" is never confused with "this adapter cannot see deletions." None of the seven can.

TUI + explorer

Keyboard-first panels as plain strings that survive SSH and 60 columns; status is a glyph and a word, never colour alone; the key bar wraps rather than truncating. Wired as logicsrc ontology tui.

Read-only web explorer at /openontology/explore with entity and claim views showing status, both clocks, confidence, sources, evidence, and append-only history. Plus an /openprd page for the companion standard.

Two real bugs the tests caught

  1. The API built a new engine per request, so explain could never find a resultId from a prior request — every explain was a 404. Engines are now cached per role over the shared store.
  2. The TUI status bar called engine.validateOntologyPackage(), appending a package.validated event on every repaint. A read-only view must not write to the audit log; it now uses the pure validator.

Verification

  • 76 new tests; 527 total across the monorepo, all passing; full build green
  • libSQL exercised against real database files, the API through its route handlers, MCP over an in-memory transport

Not included

PWA review/approval write flows (they need an auth story this deployment doesn't have), OWL/RDFS mappings, SPARQL/Cypher/Datalog query adapters, and Phase 4 governed actions. The compatibility matrix marks those "planned", not "supported".

🤖 Generated with Claude Code

…HACL, adapters, TUI, explorer

Everything the two shipped PRD phases deferred, minus what is called out below.

Storage (Phase 2)
  @logicsrc/openontology gains a SQLite/Turso adapter. It hydrates the read
  model at open, serves reads synchronously — a query evaluator that awaits per
  triple pattern is unusable — and buffers mutations as SQL that flush() writes
  in one transaction. Versioned idempotent migrations; indexes over subject,
  predicate, entity-valued object, status, both time axes, aliases, and external
  ids; FTS5 for label/alias search. The append-only status log is replayed on
  open, so retractions, supersessions, and merge redirects survive a reopen.

REST + SSE + OpenAPI (Phase 2)
  16 paths under /api/ontologies in logicsrc-web, described at
  /api/ontologies/openapi and referencing the published JSON Schemas rather
  than restating them. No token is read-only; a curator token can apply; an
  agent token can propose and cannot apply. Idempotency-Key on mutations,
  revision ETags, 409 on a stale base revision, and an SSE stream that emits
  the same event objects as the JSON endpoint.

MCP (Phase 2)
  OpenOntology and OpenPRD surfaces on the standards server: spec/manifest/
  schema/queries and PRD spec/index as resources, 11 ontology tools and 6 PRD
  tools, 7 prompts. Read-only by default; OPENONTOLOGY_MCP_WRITABLE=1 buys
  proposals, never applies — the denial is the shared policy layer, not a
  second rule that could drift.

Interoperability (Phase 3)
  RDF/Turtle export and import of the reified profile, plus the plain triple
  for asserted relationships so a consumer wanting only the accepted graph gets
  one. SHACL for 5 of 7 constraint kinds; `unique` and `query` are reported as
  unmapped in both the return value and the generated Turtle, because a shape
  that quietly means something narrower is worse than no shape.

Source adapters (Phase 3)
  CSV, JSON, YAML, NDJSON, Markdown, generic JSON HTTP, and GitHub. All produce
  PROPOSED change-set operations with source, evidence selector, run id, and
  confidence attached; fetch is injected so ingestion is offline and testable.
  Each declares its capabilities, so "nothing was deleted upstream" is never
  confused with "this adapter cannot see deletions" — none of the seven can.

TUI + explorer
  Keyboard-first panels (types, entities, claims, sources, queries, change
  sets, validation, audit) as plain strings that survive SSH and 60 columns;
  status is a glyph and a word, never colour alone; the key bar wraps rather
  than truncating. Wired as `logicsrc ontology tui`. A read-only web explorer
  at /openontology/explore with entity and claim views showing status, both
  clocks, confidence, sources, evidence, and append-only history — plus an
  /openprd page for the companion standard.

Bugs found and fixed while testing
  - the API built a new engine per request, so `explain` could never find a
    resultId from a prior request; engines are now cached per role
  - the TUI status bar called engine.validateOntologyPackage(), appending a
    package.validated event on every repaint; it now uses the pure validator

Verification: 76 new tests (527 total across the monorepo, all passing); full
build green; the libSQL adapter is exercised against real files, the API
through its route handlers, and MCP over an in-memory transport.

Not included: PWA review/approval write flows (they need an auth story this
deployment does not have), OWL/RDFS mappings, SPARQL/Cypher/Datalog query
adapters, and Phase 4 governed actions. The compatibility matrix marks those
"planned", not "supported".

Refs: prd/0001-add-logicsrc-openontology-spec.md

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit da5f6f8 into master Jul 28, 2026
5 checks passed
@ralyodio
ralyodio deleted the feat/openontology-phase2-3 branch July 28, 2026 12:10
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

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