Summary
conceptkernel.org describes cklib as a notation-ready dispatch client, and Concept Kernel Notation — the nine strands χ · ρ · σ · α · γ · π · δ · φ ⟫ε — is published there as the canonical way to say what a kernel is and what to lay down in it. This proposes an additive module (working name ckn) that takes a CKN expression and assembles a construct on a live kernel by compiling it to the verbs that already ship in ck.js. Notation in, sealed construct out — no new transport, no new authority.
Motivation
Today an app or agent builds a multi-step construct by hand: a threaded sequence of create / link / transition / verify calls. A notation expression captures that same intent declaratively, in one form. A thin compiler closes the gap between the two without changing the surface beneath it — and gives every client (browser and Node) the same "one expression → one construct" surface.
Design sketch — grounded in the shipped surface
The module sits above ConceptKernel and composes only what ck.js already exposes:
| Strand |
Compiles to (existing method) |
| χ / ρ — instances + properties |
k.create(type, body) |
| edges |
k.link(source, predicate, target) |
| τ — transitions |
k.transition(id, toState) (sealed-map gated server-side) |
| π — attestation |
k.verify(id) / k.provenance(id) |
| genome-plane declaration (new χ/ρ/σ/α/γ) |
k.propose(op, detail) ▸ k.vote(iri, value) ▸ k.apply(iri) |
Declaring a new capability is a consented, multi-party act (propose ▸ vote ▸ apply), never a direct write — so the genome plane compiles to governance, and degrades honestly to gov_plane_unavailable where that plane isn't reachable, exactly like the existing _gov path.
The compiler's output is an ordered dispatch plan — a list of {verb, typed-payload} steps — not a graph. This preserves the invariant ck.js states in its own header: there is no RDF, quad store, or query engine on the client. The module adds notation sugar; it emits no query language and holds no authority of its own (pgCK remains the only authorization boundary — the handle is not).
Scope for a first slice
- Instance plane first — buildable entirely on today's shipped verbs.
- Genome plane gated — compiles to propose/vote/apply; honest degrade until reachable.
- No client RDF — the AST is a dispatch plan, so the L1 store-not-graph invariant holds.
What I'm asking
- Does a notation compiler belong in cklib as an additive module — e.g. a
notation subpath export beside the current . / ./client exports — keeping ck.js unchanged?
- Preferred module boundary and naming.
- Grammar scope for the first instance-plane slice.
I have a working reference implementation of this pipeline (parse → plan → assemble) validated end-to-end against a live kernel — an instance sealed with a real proof digest, sealed-map transitions, and re-verification — and I'm glad to contribute it or adapt it to whatever boundary the maintainers prefer.
Summary
conceptkernel.org describes cklib as a notation-ready dispatch client, and Concept Kernel Notation — the nine strands
χ · ρ · σ · α · γ · π · δ · φ ⟫ε— is published there as the canonical way to say what a kernel is and what to lay down in it. This proposes an additive module (working nameckn) that takes a CKN expression and assembles a construct on a live kernel by compiling it to the verbs that already ship inck.js. Notation in, sealed construct out — no new transport, no new authority.Motivation
Today an app or agent builds a multi-step construct by hand: a threaded sequence of
create/link/transition/verifycalls. A notation expression captures that same intent declaratively, in one form. A thin compiler closes the gap between the two without changing the surface beneath it — and gives every client (browser and Node) the same "one expression → one construct" surface.Design sketch — grounded in the shipped surface
The module sits above
ConceptKerneland composes only whatck.jsalready exposes:k.create(type, body)k.link(source, predicate, target)k.transition(id, toState)(sealed-map gated server-side)k.verify(id)/k.provenance(id)k.propose(op, detail)▸k.vote(iri, value)▸k.apply(iri)Declaring a new capability is a consented, multi-party act (propose ▸ vote ▸ apply), never a direct write — so the genome plane compiles to governance, and degrades honestly to
gov_plane_unavailablewhere that plane isn't reachable, exactly like the existing_govpath.The compiler's output is an ordered dispatch plan — a list of
{verb, typed-payload}steps — not a graph. This preserves the invariantck.jsstates in its own header: there is no RDF, quad store, or query engine on the client. The module adds notation sugar; it emits no query language and holds no authority of its own (pgCK remains the only authorization boundary — the handle is not).Scope for a first slice
What I'm asking
notationsubpath export beside the current././clientexports — keepingck.jsunchanged?I have a working reference implementation of this pipeline (parse → plan → assemble) validated end-to-end against a live kernel — an instance sealed with a real proof digest, sealed-map transitions, and re-verification — and I'm glad to contribute it or adapt it to whatever boundary the maintainers prefer.