Repository navigation
Covers everything after v0.1.12 (2026-08-11) up to and including v0.1.14 (2026-09-24).
v0.1.13(9803cb8, 2026-09-24): Glia, theAUDITsignal, the repair loop, and the removal ofTHOUGHT_DELTA.v0.1.14(3627eb2, 2026-09-24):cosmo initscaffolds a Glia card.- Size of the range: 56 files, 10,616 insertions, 514 deletions, 12 commits.
Summary
The release adds Glia, a two-way policy gate that an Axon, an Effector or an Engram can carry. Glia comes with a new AUDIT signal, a bounded correction loop in the Axon, and trace-wide limits on the Dendrite. Genesis and Prism both show which components carry a card. cosmo init now scaffolds one. One signal type, THOUGHT_DELTA, is removed, which is a breaking change.
A card defaults to mode off, so an existing brain behaves as before until a deployment turns it on. The one change that can break existing code is the THOUGHT_DELTA removal.
Breaking changes
THOUGHT_DELTA is removed. This covers the signal type, thought_delta_signal, Dendrite.emit_thought_delta, @dendrite.on_thought_delta, and the event: delta SSE frame on ChatReceptor. Nothing in the SDK produced it. AUDIT takes its slot in SYNAPSE_TYPES.
Migration:
- Replace
@dendrite.on_thought_deltawith@dendrite.on_auditwhere you observed repair progress. - Replace
emit_thought_deltawith your own signal type, or withemit_audit. - A chat page that read
event: deltashould read the record offevent: signal, or off the reply'smeta.glia. The generated chat page no longer has a delta branch. @pw.on(SignalType.THOUGHT_DELTA)on a Pathway no longer exists. UseSignalType.AUDIT.
Compatibility, as stated in the changelog: a peer on an older SDK that receives an AUDIT logs one warning and drops it. Nothing crashes and no subscription dies. In a mixed-version namespace an audit record can go missing, which is why the verdict also rides the terminal reply's meta.glia.
Added
Glia, a policy gate on each component (v0.1.13)
- An Axon, an Effector or an Engram may carry one card (
cosmonapse.glia). The card reads every signal entering and leaving the component and refuses, rewrites or escalates it. - Each policy has a
direction(inbound, outbound or both, default both),types(signal types, default all), a verdict, and aretryofreask,resendornone(default). - Decorators are
@card.on_signal(direction=..., types=...). Handlers receive a read-onlySignalViewand return aVerdict, orNoneto fall through. - Policies can also live in a file:
Glia.load("x.card"). Both are evaluated, the file first. - Mode is
off,auditorenforce, defaultoff. Inaudita violation emits anAUDITrecord markedwould_blockand nothing is refused. - A card is mounted at construction (
Axon(..., glia=CARD),Effector.serve(..., glia=CARD),Engram.serve(..., glia=CARD)) or at attach time (node.attach_axon(hello.AXON, glia=CARD)). - The Effector and Engram gates run in
Effector.handleandEngram.handle. The Axon gates its ownrecall,imprintandcall_toolthrough the clients. A Receptor takes no card. - A card also carries the repair budgets, trace limits, journal and audit rate. The wire field is
meta.glia. Seedesign/GLIA_DESIGN.md(new, 1,124 lines). - New package files:
glia/base.py,glia/artifact.py,glia/journal.py,glia/__init__.py. - New top-level exports:
Glia,Verdict,Decision,Direction,Retry,SignalView,Mode,PolicyOutcome,PolicyRefusal,PolicyError,PolicyArtifact,PolicyRule,RepairPolicy,AuditKind,AuditOutcome,TraceLimits,Journal,InvalidOutput,TraceLimitExceeded,audit_signal.
The correction repair loop in the Axon (v0.1.13)
- One loop serves three callers: an output nothing claimed (opt-in
strict_output, raisingInvalidOutput), tool arguments that failed their schema, and a policy refusal whose policy asks toreask. - It is bounded by the lower of the policy's
max_attemptsandrepair.max_attempts, and optionally byrepair.deadline_s. A next attempt whose input would be identical is not made. - Transient retry for Effector and Engram is a separate knob. A policy refusal never feeds it.
Trace-wide limits on the Dendrite (v0.1.13)
componentmode: exact for what this Dendrite emitted, needs no subscription, and is the default.tracemode: approximate, needs the broadcast subscription.- An
AUDITcounts as nothing against a trace limit, so a limit cannot suppress its own audit trail.
The AUDIT signal (v0.1.13)
- One record per policy or repair event, on its own subject, so a compliance consumer can subscribe to
cosmonapse.<ns>.AUDITand nothing else. - Seven kinds, each rolling up to a domain:
GUARD_RETRYandGUARDED(security),EVAL_RETRY(eval),TOOL_RETRY(tool),TRANSIENT_RETRYandDEADLINE_ABANDONED(reliability),LIMIT_REFUSED(governance). - Outcomes:
re_asked,resent,recovered,exhausted,uncorrectable,refused,redacted,escalated,would_block. - Records carry hashes of matched content, never the content itself.
- Emitted at the event, one per event, so no
AUDITon a trace means nothing fired. - API:
Dendrite.emit_audit,@dendrite.on_audit.ENVELOPE_SPEC.mddocuments the payload fields and compatibility note. - An Axon's repair loop triggers an
AUDIT, but the hosting Dendrite publishes it, the same way it publishesREGISTER.
cosmo init scaffolds a card (v0.1.14)
- New
glia/folder with__init__.pyandpolicies.py.policies.pydefines one card,card_id="policies",mode="off", with an example inbound policybounded_namethat denies aTASKwhosenameis longer than 64 characters. brain.pyimportsfrom glia import policiesand mounts it withnode.attach_axon(hello.AXON, glia=policies.CARD).COSMONAPSE_POLICY_MODE=audit python brain.pyrecords violations without blocking.COSMONAPSE_POLICY_MODE=enforce python brain.pyapplies verdicts. The environment value wins over the mode in code.- The generated README lists
glia/and has a new "Policy?" entry explaining the audit then enforce path. - The generated terminal Receptor now checks for an
errorkey first and printsrefused: <error>, because a refusedTASKanswers with{"error": ..., "refused_by": "policy"}in place of the Neuron's output. - New tests in
tests/test_cli_init.pycheck the files are written, the card is attached inbrain.py, and the card ships in modeoff.
Genesis
- Glia layer on the canvas. A gold layer is drawn on any Neuron, Engram or Effector that has a card mounted. Genesis reads this from the source with
ast, soglia=None, adef f(glia=None)signature and a comment mentioning glia do not count. It checks both the component module and theattach_*calls inbrain.py, includingfrom neurons import hello as haliases. Receptors never carry the layer. The legend shows a "Glia · policy card" entry once a card exists. - Every project file is editable in the Code tab. Previously
brain.py,config.py, the README and the other wiring files were read-only. A newFileEditorcomponent edits any project file, including each package's__init__.py. Saving goes throughPOST /api/file. The editor's own documentation states the endpoint is confined to the project and refuses a.pyfile that does not parse. Hand edits tobrain.pyare kept, and the next add or remove works from whatever is on disk. - Form and Source views for a component. A component module opens in a Form view (the existing config form) or a Source view (the whole module, including what the form does not model). The choice persists as you move down the sidebar. Messages that used to say "read-only here, edit in your editor" now point to the Source view.
- Package
__init__.pyfiles appear in the sidebar. They are editable and cannot be removed as components. - The protocol catalogue gained a "Policy and audit" group with
on_audit, and droppedon_thought_delta. - Start screen and header copy refreshed. The header comment now describes Canvas, Code and Test as three lenses on one project.
Prism
- Glia layer on the canvas. The same gold layer, geometrically identical to Genesis's. It is drawn only when a card's mode is not
off, because anoffcard reads nothing. - Prism learns about a card from
meta.gliaon the participant'sREGISTER. If Prism joined after theREGISTER, it infers a card from anAUDITcarryingcard_idand marks it as inferred. A laterREGISTERwithoutmeta.gliaremoves the layer. AUDITis drawn as a gold particle from the component to the synapse. It is not paired with the next reply on the trace, because anAUDITanswers nothing.- An
AUDITis counted on the node, but it does not change the node's last signal type or colour, and it is not used to infer a trace's worker in the constellation view. - Tooltip shows
glia(card id, mode, policy version, or "seen via AUDIT") and anauditscount. Clear resets the audit count and leaves identity alone. AUDIThas its own colour in both themes. A newgliacolour token exists in the dark and light palettes.
CLI
- Grouped root help.
cosmo --helprenders a banner and commands grouped as build, run, observe and shell, with a quick-start line. It falls back to click's default whenrichis not available. - Genesis and Prism are imported defensively. If either is absent,
cosmostill starts, every other command works, and the missing one fails as a plain "No such command". The comment inmain.pysays this is so a cloud image can install its own build in place of the bundled one. AUDITis shown in yellow in CLI output whereTHOUGHT_DELTAwas dim white.- The
genesis.pydocstring now mentions the Test tab and the helper modules_genesis_run.pyand_genesis_synapse.py.
Docs and repository
CODE_OF_CONDUCT.mdadded (Contributor Covenant).- Root
README.md: the "names are borrowed from biology" lexicon table moved below the product section, and the text referring to it was updated. ENVELOPE_SPEC.md,SDK_DESIGN.md,DECISIONS.mdand the python-sdk README updated to replaceTHOUGHT_DELTAwithAUDIT.packages/genesis-ui/README.mdnotes that Canvas lays the project out, Code edits it and Test runs it.CHANGELOG.mdgained 210 lines, all under[Unreleased].
Known limitations
- Glia does not authenticate signals.
directed.idis a claim, so a policy on it stops mistakes and misrouted traffic, not an attacker on a shared broker. Treat a shared broker as a trusted zone until signing ships. - An audit record can go missing in a mixed-version namespace. The verdict on the reply's
meta.gliais the authoritative copy. - Prism and Genesis show whether a card is mounted. A card's policies never ride the wire, so neither tool displays them.
- Genesis detects a mounted card from source. Whether the card's mode is
offlives in the card file, so Genesis answers "is a card mounted", and Prism, which sees theREGISTER, is where the mode shows.
Upgrade notes
- Search your code for
THOUGHT_DELTA,thought_delta_signal,emit_thought_delta,on_thought_deltaandevent: delta. Each needs replacing as described under Breaking changes. - No other existing API changed in this range. Nothing is gated until you mount a card and set its mode.
- Existing projects are not modified by
cosmo init. To get theglia/folder, scaffold a new project or copy the files from a fresh one. - Versions come from git tags (hatch-vcs), so builds of the tags above produce
0.1.13and0.1.14.
Maintainer notes
CHANGELOG.mdhas no[0.1.13]or[0.1.14]section and the scaffold change is not described anywhere in it. This document can be used to cut both.- The commits "fixes", "Removed git", "junk delete" and "Fix ruff" show no net user-facing change against
v0.1.12that I could attribute to them from the diff. Genesis's git features were built and removed inside this range. - The Glia sections are taken from
CHANGELOG.mdand checked against the diffs for exports, the envelope spec, Genesis, Prism and the scaffold. I did not read the 2,259-lineglia/base.pyor the Glia tests line by line, and I did not run the test suite.