feat(openontology): Phase 2 + 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer - #101
Merged
Merged
Conversation
…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>
vu1nz Security Review0 finding(s) in PR #? No security issues found. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
createLibsqlStorehydrates the read model at open, serves reads synchronously (a query evaluator that awaits per triple pattern is unusable), and buffers mutations as SQL thatflush()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.Idempotency-Keyon mutations, revision ETags, 409 on a stale base revisionMCP
OpenOntology and OpenPRD on the standards server: 4 + 2 resources, 11 + 6 tools, 5 + 2 prompts. Read-only by default;
OPENONTOLOGY_MCP_WRITABLE=1buys 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.
uniqueandqueryare 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/explorewith entity and claim views showing status, both clocks, confidence, sources, evidence, and append-only history. Plus an/openprdpage for the companion standard.Two real bugs the tests caught
explaincould never find aresultIdfrom a prior request — every explain was a 404. Engines are now cached per role over the shared store.engine.validateOntologyPackage(), appending apackage.validatedevent on every repaint. A read-only view must not write to the audit log; it now uses the pure validator.Verification
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