mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-08-14 23:07:29 +00:00
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>
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
import type { ReactNode } from "react";
|
|
|
|
// Mirrors the rail/nav from page-markup.ts so standalone routes (e.g. /blog)
|
|
// share the site chrome. Anchor links point at the homepage sections.
|
|
const NAV: Array<{ href: string; label: string; external?: boolean }> = [
|
|
{ href: "/#overview", label: "Overview" },
|
|
{ href: "/#schemas", label: "Schemas" },
|
|
{ href: "/agent-swarm", label: "Soon" },
|
|
{ href: "/agentbyte", label: "AgentByte" },
|
|
{ href: "/credential-sharing", label: "Credentials" },
|
|
{ href: "/openontology", label: "OpenOntology" },
|
|
{ href: "/openprd", label: "OpenPRD" },
|
|
{ href: "/#cli", label: "CLI" },
|
|
{ href: "/docs", label: "Docs" },
|
|
{ href: "/blog", label: "Blog" },
|
|
{ href: "/openspec", label: "OpenSpec" },
|
|
{ href: "/pricing", label: "Pricing" },
|
|
{ href: "/hire-us", label: "Hire Us" },
|
|
{ href: "/about", label: "About" },
|
|
{ href: "https://github.com/profullstack/logicsrc", label: "GitHub ↗", external: true },
|
|
{ href: "/terms", label: "Terms" },
|
|
{ href: "/privacy", label: "Privacy" },
|
|
{ href: "/#reference", label: "Reference" },
|
|
];
|
|
|
|
export function SiteShell({
|
|
children,
|
|
active,
|
|
}: {
|
|
children: ReactNode;
|
|
active?: string;
|
|
}): ReactNode {
|
|
return (
|
|
<main className="shell">
|
|
<aside className="rail">
|
|
<a className="brand" href="/" style={{ textDecoration: "none", color: "inherit" }}>
|
|
<span className="mark">LS</span>
|
|
<div>
|
|
<strong>LogicSRC</strong>
|
|
<small>Open coordination standards</small>
|
|
</div>
|
|
</a>
|
|
<nav aria-label="LogicSRC sections">
|
|
{NAV.map((item) => (
|
|
<a
|
|
key={item.href}
|
|
href={item.href}
|
|
className={item.label === active ? "active" : undefined}
|
|
aria-current={item.label === active ? "page" : undefined}
|
|
target={item.external ? "_blank" : undefined}
|
|
rel={item.external ? "noreferrer" : undefined}
|
|
>
|
|
{item.label}
|
|
</a>
|
|
))}
|
|
</nav>
|
|
</aside>
|
|
<section className="workspace">
|
|
{children}
|
|
<footer
|
|
style={{
|
|
maxWidth: "72rem",
|
|
margin: "2rem auto 0",
|
|
padding: "1.25rem 0",
|
|
borderTop: "1px solid #d9ded4",
|
|
display: "flex",
|
|
flexWrap: "wrap",
|
|
gap: "0.75rem",
|
|
justifyContent: "space-between",
|
|
fontSize: "0.85rem",
|
|
color: "#5b6b7a",
|
|
}}
|
|
>
|
|
<span>© {new Date().getFullYear()} Profullstack, Inc. · LogicSRC</span>
|
|
<span style={{ display: "flex", gap: "0.75rem" }}>
|
|
<a href="/docs" style={{ color: "inherit" }}>Docs</a>
|
|
<a href="/blog/rss.xml" style={{ color: "inherit" }}>RSS</a>
|
|
<a href="/terms" style={{ color: "inherit" }}>Terms</a>
|
|
<a href="/privacy" style={{ color: "inherit" }}>Privacy</a>
|
|
</span>
|
|
</footer>
|
|
</section>
|
|
</main>
|
|
);
|
|
}
|