Skip to content

spec 02: webchat UX — notifications, resilience, file editor - #47

Merged
forkwright merged 1 commit into
mainfrom
spec-02-webchat-ux
Feb 20, 2026
Merged

spec 02: webchat UX — notifications, resilience, file editor#47
forkwright merged 1 commit into
mainfrom
spec-02-webchat-ux

Conversation

@forkwright

Copy link
Copy Markdown
Owner

Summary

Implements spec 02 — four webchat UX problems resolved:

  • Cross-agent notifications: SSE endpoint (GET /api/events) bridges eventBus to clients. Unread badges on agent cards, toast popups with click-to-switch, auto-dismiss after 5s
  • Refresh resilience: Streaming turns survive page refresh — server no longer aborts on client disconnect. Poll fallback (30s) when SSE drops, immediate history reload on reconnect
  • Tool output fix: Removed needsTextSeparator that was inserting \n\n between tool_result and next text_delta, breaking mid-word output
  • File editor: Split pane layout with resizable divider. CodeMirror 6 editor with syntax highlighting (TS/JS/Python/JSON/YAML/CSS/HTML/Markdown), Cmd+S save, dirty indicator, unsaved changes guard, markdown preview toggle

Server changes

  • GET /api/events — persistent SSE, init snapshot, keepalive ping, cleanup on disconnect
  • PUT /api/workspace/file — save with path traversal protection
  • Streaming: removed abort-on-disconnect, graceful client disconnect handling
  • turn:after event enriched with text preview for notifications

Client changes (14 files, 4 new)

  • Notification store + toast store + Toast component
  • AgentCard unread badge, Sidebar markRead wiring
  • ChatView: notification triggers for non-active agents, poll fallback
  • Layout: split pane with resize handle, file panel toggle
  • FileEditor: CodeMirror 6, tree browser, save, preview

Test plan

  • Runtime typecheck clean (npx tsc --noEmit)
  • build-messages.test.ts — 4 tests pass
  • UI builds clean (npm run build)
  • Manual: verify SSE connects (network tab /api/events)
  • Manual: send Signal message to agent A while viewing B → badge + toast
  • Manual: start long tool loop, refresh → turn continues, result appears
  • Manual: multi-tool turn → no split lines after tool calls
  • Manual: toggle file panel → side-by-side with chat, edit + Cmd+S save

🤖 Generated with Claude Code

Server:
- GET /api/events SSE endpoint bridges eventBus to clients (init,
  turn:before/after, tool:called/failed, session events, 15s keepalive)
- PUT /api/workspace/file for saving edited files with path traversal
  protection
- Streaming endpoint no longer aborts turns on client disconnect —
  turns survive page refresh, explicit abort via POST still works
- turn:after event now includes text preview for notifications

Client:
- Cross-agent notification system with unread badges on AgentCard and
  toast popups (bottom-right, 5s auto-dismiss, click to switch agent)
- Poll fallback (30s interval) when SSE disconnects, immediate reload
  on reconnect
- Removed needsTextSeparator that was splitting tool output mid-word
- Split pane layout: Files button toggles side panel with resizable
  divider (drag handle, persisted width) instead of replacing chat
- FileEditor with CodeMirror 6: syntax highlighting for TS/JS/Python/
  JSON/YAML/CSS/HTML/Markdown, Cmd+S save, dirty indicator, unsaved
  changes guard, markdown preview toggle, collapsible file tree

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot

See analysis details on SonarQube Cloud

@forkwright
forkwright merged commit 069b3d2 into main Feb 20, 2026
11 of 13 checks passed
@forkwright
forkwright deleted the spec-02-webchat-ux branch February 20, 2026 17:37
forkwright pushed a commit that referenced this pull request Feb 20, 2026
…ity to phase 1-4

- Spec 02 (Webchat UX): implemented in PR #47, moved to archive
- Spec 06 (Code Quality): updated status to phase 1-4 done (PRs #37, #45)
- README index updated to reflect current state
forkwright added a commit that referenced this pull request Feb 28, 2026
Server:
- GET /api/events SSE endpoint bridges eventBus to clients (init,
  turn:before/after, tool:called/failed, session events, 15s keepalive)
- PUT /api/workspace/file for saving edited files with path traversal
  protection
- Streaming endpoint no longer aborts turns on client disconnect —
  turns survive page refresh, explicit abort via POST still works
- turn:after event now includes text preview for notifications

Client:
- Cross-agent notification system with unread badges on AgentCard and
  toast popups (bottom-right, 5s auto-dismiss, click to switch agent)
- Poll fallback (30s interval) when SSE disconnects, immediate reload
  on reconnect
- Removed needsTextSeparator that was splitting tool output mid-word
- Split pane layout: Files button toggles side panel with resizable
  divider (drag handle, persisted width) instead of replacing chat
- FileEditor with CodeMirror 6: syntax highlighting for TS/JS/Python/
  JSON/YAML/CSS/HTML/Markdown, Cmd+S save, dirty indicator, unsaved
  changes guard, markdown preview toggle, collapsible file tree
forkwright added a commit that referenced this pull request Feb 28, 2026
…ity to phase 1-4

- Spec 02 (Webchat UX): implemented in PR #47, moved to archive
- Spec 06 (Code Quality): updated status to phase 1-4 done (PRs #37, #45)
- README index updated to reflect current state
forkwright pushed a commit that referenced this pull request May 6, 2026
Manually merged via local validation (bypass of kanon CI gate). All
gates verified locally: fmt + check + clippy + kanon lint (PR-scoped).

Admin-Bypass: R722 PR4 recall controls; rebased after PR5; local PR-scoped gates pass including reranker feature; workspace clippy baseline large-future fixed mechanically in aletheia server startup; forge CI fmt stage baseline unhealthy
forkwright pushed a commit that referenced this pull request May 8, 2026
…config delete + daemonBehavior wire-in (closes #15 #47 #54) (#109)

Manually merged via local validation (bypass of kanon CI gate). All
gates verified locally: fmt + check + clippy + kanon lint (PR-scoped).

Admin-Bypass: operator-blessed bypass during CI hygiene work (2026-05-08)
forkwright pushed a commit that referenced this pull request May 21, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.22.0](v0.21.1...v0.22.0)
(2026-05-09)


### Features

* **_llm:** add T0 corpus per
[#667](#667) /
[#673](#673) fleet rollout
([#137](#137))
([1d96566](1d96566))
* **aletheia-classify:** scaffold author-classifier inference crate
([#3797](#3797))
([f3fa126](f3fa126))
* **aletheia-lexica:** centralize scattered pattern lists
([#3799](#3799))
([6d1c5eb](6d1c5eb)),
closes [#3785](#3785)
* **aletheia-memory-mcp:** write tools behind per-process capability
token ([#3813](#3813))
([69e6386](69e6386)),
closes [#3688](#3688)
* **aletheia-sessions-migrate:** one-shot SQLite → fjall sessions
importer for legacy 0.15 instances
([#32](#32))
([9482dbf](9482dbf))
* **aletheia:** seed_psyche_facts bin — import v2.2 identity facts into
psyche cohort ([#61](#61))
([d893e54](d893e54))
* **basanos:** API-consistency lint for interface uniformity
([#3821](#3821))
([372fadd](372fadd))
* **basanos:** audit component subcommand with 8-check report
([#3828](#3828))
([c303580](c303580))
* **basanos:** derive-vs-declare detector for announced properties
([#3820](#3820))
([fc989a2](fc989a2))
* **basanos:** hub-words discipline rule + registry
([#3816](#3816))
([bb6e394](bb6e394)),
closes [#3486](#3486)
* **basanos:** purpose-language + citation-compression writing rules
([#3810](#3810))
([b8757b1](b8757b1)),
closes [#3490](#3490)
* **daemon:** prosoche self-audit framework with 5 check types
([#3818](#3818))
([3c8ea6c](3c8ea6c)),
closes [#3245](#3245)
* **eidos,episteme:** BookkeepingProvider trait surface
([#50](#50))
([f539b7c](f539b7c))
* **eidos:** add visibility and reflected epistemic tier
([#43](#43))
([09a9846](09a9846))
* **eidos:** architecture-fact layer + MCP tool + basanos rule
([#3800](#3800))
([0f689f3](0f689f3)),
closes [#3789](#3789)
* **eidos:** extend ArtefactMeta for mnemosyne interop
([#3803](#3803))
([12db8a1](12db8a1)),
closes [#3796](#3796)
* **eidos:** promote EvalFinding to eidos::knowledge::finding
([#3791](#3791))
([b5b2f2c](b5b2f2c)),
closes [#3779](#3779)
* **eidos:** provenance + multi-agent verification types
([#55](#55))
([4939792](4939792))
* **eidos:** Stamped trait + ArtefactMeta for uniform provenance
([#3801](#3801))
([6b70e1a](6b70e1a)),
closes [#3787](#3787)
* **energeia:** friction capture — observations parser + PR template
([#3788](#3788))
([57416c0](57416c0)),
closes [#3465](#3465)
* **energeia:** frontier computation — parallel group derivation from
DAG ([#3777](#3777))
([889f422](889f422)),
closes [#3463](#3463)
* **energeia:** phronesis recovery + persona routing + expertise
affinity ([#3835](#3835))
([4dfb78b](4dfb78b))
* **energeia:** predictive budget allocation
([#3778](#3778))
([fbc6ddf](fbc6ddf)),
closes [#3457](#3457)
* **episteme,nous,taxis:** wire extraction provider config
([#54](#54))
([8829fc4](8829fc4))
* **episteme,nous:** schema v11 — propagate Visibility + MemoryScope
through Datalog facts
([#208](#208))
([#63](#63))
([577ad58](577ad58))
* **episteme:** add GLiNER ONNX extraction adapter
([#52](#52))
([f9ec65b](f9ec65b))
* **episteme:** add HTTP reranker and extraction profile knobs
([#44](#44))
([a8b91e8](a8b91e8))
* **episteme:** add OpenAI-compatible embedding provider
([#3806](#3806))
([7349728](7349728))
* **episteme:** add visibility to scored recall results
([#45](#45))
([cefd2b9](cefd2b9))
* **episteme:** cohort-respecting detect_conflict in extraction (W8
follow-up) ([#59](#59))
([8fd6a98](8fd6a98))
* **episteme:** optional reranker stage in recall pipeline
([#3798](#3798))
([1eb997a](1eb997a)),
closes [#3744](#3744)
* **episteme:** verification protocol module + schema v9-&gt;v10
([#56](#56))
([b064ca6](b064ca6))
* **eval:** typed-tag namespace over RunReport — sliceable training data
([#77](#77))
([60ef285](60ef285))
* **gnosis:** code-graph index + MCP query tool
([#3833](#3833))
([4831373](4831373))
* **hermeneus,nous:** agent-loop detector extension (closes
[#203](#203))
([#91](#91))
([be985a7](be985a7))
* **hermeneus:** doom-loop detector with (args, result) signature ring
([#72](#72))
([7b9d463](7b9d463))
* **krites:** hot-reload rule files from disk via notify
([#3809](#3809))
([e694a70](e694a70))
* **krites:** tokio-native async surface over blocking core
([#3804](#3804))
([6438ce1](6438ce1)),
closes [#3795](#3795)
* **nous,koina:** spawn-class isolation guard + consecutive-mistake
brake (closes [#186](#186),
[#187](#187))
([#75](#75))
([276bbe8](276bbe8))
* **nous,organon:** per-turn agent-curated working-memory injection
(closes [#196](#196))
([#96](#96))
([37e6d29](37e6d29))
* **nous,organon:** tool-group gating per role (closes
[#185](#185))
([#71](#71))
([cf9c3d7](cf9c3d7))
* **nous/bootstrap:** pre-injection scan — invisible-Unicode +
threat-pattern (closes
[#184](#184))
([#79](#79))
([c5158b9](c5158b9))
* **nous/bootstrap:** SOUL persona slot — typed BootstrapSlot enum
(closes [#194](#194))
([#67](#67))
([758e28b](758e28b))
* **nous/compact:** two-prompt split — COMPACT_PROMPT vs RESTORE_PROMPT
(closes [#189](#189))
([#64](#64))
([ba362b6](ba362b6))
* **nous/memory:** structured Step model + CompactionStrategy enum
(closes [#210](#210),
unblocks [#193](#193))
([#88](#88))
([2c5ed8b](2c5ed8b))
* **nous/skills,organon:** always-vs-lazy skill gating with YAML
frontmatter (closes
[#195](#195))
([#89](#89))
([f42eaab](f42eaab))
* **nous:** add cross-nous address masks
([#49](#49))
([c9b7f38](c9b7f38))
* **nous:** add optional reflection pipeline stage
([#46](#46))
([73aaf68](73aaf68))
* **nous:** add recall profile wiring
([#48](#48))
([976f260](976f260))
* **nous:** cached microcompact — cache_control on distilled summary
([#3793](#3793))
([8859c59](8859c59))
* **nous:** cross-nous verification messages
([#58](#58))
([83c79ea](83c79ea))
* **nous:** expand hook taxonomy to after-tool, session-start,
before/after-compact
([#3792](#3792))
([aa7a5e9](aa7a5e9))
* **nous:** extend recall configuration controls
([#47](#47))
([12b87fc](12b87fc))
* **nous:** pre-LLM triage stage (intent + sensitivity + tier)
([#3805](#3805))
([a306099](a306099))
* **organon,nous:** tool receipts HMAC-SHA256 with active hallucination
detection (closes
[#202](#202))
([#83](#83))
([572e58b](572e58b))
* **organon:** add ToolTag enum and definitions_for_tags registry method
([#74](#74))
([cca2699](cca2699))
* **organon:** add z3 SMT solver tool behind `z3` feature
([#3772](#3772))
([dea0da4](dea0da4))
* **organon:** deferred tool schemas via tool_schema meta-tool
([#3807](#3807))
([05e8a2d](05e8a2d))
* **organon:** file-ref interpolation `{{file:path:start:end}}` (closes
[#197](#197))
([#65](#65))
([3067e67](3067e67))
* **poiesis-doc:** DOCX render + inspect backend
([#3827](#3827))
([95ecd75](95ecd75)),
closes [#3701](#3701)
* **poiesis-intake:** parse Slack-style request text into structured
scaffold ([#3823](#3823))
([76ed88d](76ed88d))
* **poiesis-scaffold:** project-template scaffolder
([#3824](#3824))
([ffd454f](ffd454f)),
closes [#3703](#3703)
* **poiesis-sheet:** JSON-first render_xlsx + inspect_xlsx
([#3830](#3830))
([d66369b](d66369b)),
closes [#3700](#3700)
* **poiesis-slides:** JSON-first render_pptx + inspect_pptx
([#3829](#3829))
([2eb2cd4](2eb2cd4)),
closes [#3702](#3702)
* **poiesis:** diff + inspect crates for output review
([#3831](#3831))
([9a06a74](9a06a74)),
closes [#3705](#3705)
* **poiesis:** wire eval + graph-audit into render_typst_report (Wave 7
closure) ([#10](#10))
([bc6dbf5](bc6dbf5))
* **proskenion:** restore canonical dye palette from ardent-site
([#18](#18))
([6cc8738](6cc8738))
* **pylon,proskenion:** meta-insights endpoints (agent perf + quality +
journal) — closes
[#209](#209)
([#86](#86))
([025a933](025a933))
* **pylon:** Deprecation + Sunset headers per RFC 8594
([#3812](#3812))
([2f86c1a](2f86c1a)),
closes [#3280](#3280)
* **pylon:** ETag + conditional request middleware
([#3817](#3817))
([2c613dc](2c613dc))
* **pylon:** filtered SSE event subscription endpoint
([#3822](#3822))
([56312b5](56312b5))
* **r722:** add per-nous episteme keyspace
([#53](#53))
([90955a1](90955a1))
* **routing:** unify empirical router across dispatch + interactive
paths ([#3815](#3815))
([bedcd36](bedcd36))
* **taxis,nous,diaporeia,pylon:** private workspace flag
([#51](#51))
([7b19bc3](7b19bc3))
* **thesauros,aletheia,nous:** full AgentOverlay
(model/agency/system-prompt) + spawn_blocking + actual duration_ms
(closes [#179](#179),
[#180](#180),
[#181](#181))
([#80](#80))
([0dc5e44](0dc5e44))
* tier-aware model resolution
([#3737](#3737),
[#3739](#3739),
[#3740](#3740))
([#3775](#3775))
([f48622c](f48622c))
* **training:** author classifier for training capture decontamination
([#3786](#3786))
([#14](#14))
([544c0d5](544c0d5))


### Bug Fixes

* **agora:** truth cluster — capability honesty + error propagation +
dead-code (closes
[#153](#153)
[#154](#154)
[#155](#155)
[#156](#156)
[#157](#157)
[#158](#158))
([#101](#101))
([3faa46c](3faa46c))
* **aletheia-classify:** replace map_or with is_some_and (clippy)
([#35](#35))
([bf92937](bf92937))
* **aletheia-lexica,poiesis:** coherence cluster (closes
[#135](#135)
[#136](#136)
[#137](#137)
[#139](#139))
([#94](#94))
([d4e08d7](d4e08d7))
* **aletheia-memory-mcp:** coherence cluster — namespace + boundary +
drift (closes [#159](#159)
[#160](#160)
[#161](#161)
[#162](#162)
[#163](#163)
[#164](#164)
[#165](#165))
([#100](#100))
([f3c9f19](f3c9f19))
* **aletheia-routing,daemon:** cluster - routing honesty and maintenance
([#133](#133))
([44356e0](44356e0))
* **aletheia:** clear Wave 7 clippy debt (poiesis-scaffold/diff,
partial) ([#16](#16))
([fded55d](fded55d))
* **aletheia:** drift-claim cluster — guard doc + seed path + audit
heuristics + violation spans + ARCHITECTURE config (closes
[#75](#75)
[#105](#105)
[#109](#109)
[#110](#110)
[#111](#111))
([#122](#122))
([dd5e3b9](dd5e3b9))
* **aletheia:** HIGH violations cluster — hot-reload + planning +
readiness + workspace + cancellation + delegation (closes
[#38](#38)
[#40](#40)
[#87](#87)
[#88](#88)
[#89](#89)
[#90](#90))
([#140](#140))
([43be8c7](43be8c7))
* **aletheia:** stub/scaffold CLI cluster — export-agent + seed-skills
persistence + consolidate wire + dry-run guard (closes
[#128](#128)
[#132](#132)
[#133](#133)
[#134](#134))
([#126](#126))
([fe6f36e](fe6f36e))
* **aletheia:** wire-or-delete cluster — substrate wire-ins + provenance
unification + dead-code (closes
[#95](#95)
[#98](#98)
[#99](#99)
[#100](#100)
[#101](#101)
[#102](#102)
[#103](#103))
([#125](#125))
([86ac027](86ac027))
* **basanos:** dedup duplicate linter and clean koina lint baseline
([#135](#135))
([ae9360d](ae9360d))
* **daemon,aletheia:** observability cluster — backup staleness +
prosoche self-audit + task-state persistence (closes
[#9](#9)
[#14](#14)
[#18](#18))
([#145](#145))
([50bee14](50bee14))
* **daemon,maintenance:** cluster — sqlite_recovery delete +
fact-extraction persistence + maintenance wire-in (closes
[#20](#20)
[#50](#50)
[#72](#72))
([#108](#108))
([786aede](786aede))
* **diaporeia,organon:** MCP cluster — stdio transport + external tool
plane bridge (closes
[#17](#17)
[#41](#41))
([#114](#114))
([b4068d9](b4068d9))
* **diaporeia:** tools cluster — knowledge_search + depth + CLAUDE.md +
McpClaims + RBAC (closes
[#113](#113)
[#114](#114)
[#115](#115)
[#116](#116)
[#118](#118))
([#117](#117))
([cec5dfe](cec5dfe))
* **docs,taxis,aletheia:** config/doc drift cluster — sqlite→fjall +
Phase 05d ownership + taxis registry (closes
[#21](#21)
[#27](#27)
[#23](#23)
[#24](#24)
[#25](#25)
[#84](#84)
[#85](#85))
([#131](#131))
([3f893cf](3f893cf))
* **dokimion,krites:** eval truth cluster — fake-recall +
question_timeout + descriptions + now_iso8601 + TriggerConfig (closes
[#117](#117)
[#119](#119)
[#120](#120)
[#121](#121)
[#122](#122))
([#118](#118))
([b291a4a](b291a4a))
* **energeia,hermeneus:** engine cluster — sdk doc + budget + session
abort + post-processing + observability (closes
[#79](#79)
[#80](#80)
[#81](#81)
[#82](#82)
[#83](#83))
([#153](#153))
([6a5a859](6a5a859))
* **episteme:** observability + recall cluster — wire-in + threshold +
silent-failure (closes
[#10](#10)
[#11](#11)
[#12](#12)
[#63](#63)
[#64](#64))
([#105](#105))
([2aa723a](2aa723a))
* **episteme:** tier-arm coverage for Reflected + Training in recall
scoring ([#60](#60))
([ffc8ed8](ffc8ed8))
* **gnosis:** drift cluster — SHA-256 + orphan cleanup + module_path +
rdeps coverage ([#95](#95))
([3457f18](3457f18))
* **graphe:** drift cluster — TTL overflow + error propagation + cleanup
wire-in + bench doc-comments
([#98](#98))
([7ca3905](7ca3905))
* **hermeneus,nous,aletheia:** drift cluster — fallback chain + token
redact + max_tokens forward (closes
[#48](#48)
[#68](#68)
[#69](#69))
([#106](#106))
([0b3b3f7](0b3b3f7))
* **hermeneus:** propagate deployment_target to OpenAI-compat provider
(sovereignty)
([#3773](#3773))
([d679332](d679332))
* **koilon/graph_analysis:** replace hardcoded staleness reference date
with live clock (closes
[#178](#178))
([#68](#68))
([cdde47c](cdde47c))
* **koilon:** gate planning checkpoints and memory search on missing
pylon endpoints (closes
[#170](#170),
[#175](#175))
([#69](#69))
([866e140](866e140))
* **koina, hermeneus:** accept legacy ses_&lt;24hex&gt; session IDs and
CC 2.x assistant-event shape
([#33](#33))
([2db21ca](2db21ca))
* **koina:** hygiene cluster — jiff timestamps + dead code +
tracing/cleanup/events wire-in (closes
[#106](#106)
[#107](#107)
[#123](#123)
[#124](#124)
[#125](#125)
[#126](#126)
[#127](#127))
([#128](#128))
([d602ebf](d602ebf))
* **mneme:** drift cluster — facade boundary + suppressions + wildcard
re-exports (closes
[#22](#22)
[#61](#61)
[#62](#62))
([#111](#111))
([0da2404](0da2404))
* **nous,aletheia-lexica:** triage regexes rebuild from lexica constants
(closes [#138](#138))
([#66](#66))
([7d10cb4](7d10cb4))
* **nous,daemon:** wire-in cluster — knowledge maintenance + bootstrap
tool summary + per-stage timeouts (closes
[#5](#5)
[#6](#6)
[#8](#8))
([#129](#129))
([7542645](7542645))
* **nous:** wire organon deferred-schemas into execute tool block
([#3811](#3811))
([b346139](b346139)),
closes [#3808](#3808)
* **organon,aletheia,taxis:** security-hardening cluster — path
validation + config defaults + organon drift (closes
[#221](#221)
[#222](#222)
[#76](https://github.com/forkwright/aletheia/issues/76)
[#77](#77)
[#78](https://github.com/forkwright/aletheia/issues/78)
[#91](#91)
[#130](https://github.com/forkwright/aletheia/issues/130))
([#152](https://github.com/forkwright/aletheia/issues/152))
([eafa661](eafa661))
* **poiesis-inspect:** clippy under -D warnings — unblock aletheia main
CI ([#9](#9))
([1929dfa](1929dfa))
* **poiesis-slides:** replace if-let-guard with body if-let to compile
on stable 1.94
([#138](#138))
([63d4a76](63d4a76))
* **poiesis:** truth cluster — content-drop + XLSX/ODT/PDF drift + lint
+ intake doc (closes
[#45](#45)
[#65](#65)
[#66](#66)
[#67](#67))
([#107](#107))
([0843d63](0843d63))
* **proskenion:** converge on canonical design tokens (theatron-lint
clean) ([#22](#22))
([b389fac](b389fac))
* **proskenion:** gate meta agent perf + quality charts + system journal
on capability discovery (closes
[#171](https://github.com/forkwright/aletheia/issues/171),
[#172](https://github.com/forkwright/aletheia/issues/172),
[#173](https://github.com/forkwright/aletheia/issues/173))
([#70](https://github.com/forkwright/aletheia/issues/70))
([125970b](125970b))
* **proskenion:** post-extraction cleanup batch (QA swarm follow-ups)
([#24](#24))
([9a3fbbb](9a3fbbb))
* **pylon,aletheia-memory-mcp,dianoia:** mcp-api-drift cluster — error
canonical + planning 501 + memory tools docs (closes
[#7](https://github.com/forkwright/aletheia/issues/7)
[#16](#16)
[#44](#44))
([#146](https://github.com/forkwright/aletheia/issues/146))
([bd1a9c9](bd1a9c9))
* **pylon:** coherence cluster — auth + OpenAPI + SSE/handler/docs drift
(closes [#42](https://github.com/forkwright/aletheia/issues/42)
[#55](#55)
[#56](#56)
[#57](https://github.com/forkwright/aletheia/issues/57)
[#58](#58)
[#59](#59)
[#60](#60))
([#102](#102))
([d35c982](d35c982))
* **rand:** migrate 0.9 → 0.10 API (RngExt, SysRng, TryRng renames)
([#3770](https://github.com/forkwright/aletheia/issues/3770))
([098b133](098b133)),
closes [#3767](https://github.com/forkwright/aletheia/issues/3767)
* **runtime:** close NousGenerationConfig main breakage from
[#3775](#3775)
([#3776](https://github.com/forkwright/aletheia/issues/3776))
([c765c65](c765c65))
* **symbolon,pylon:** auth cluster — remove terminal UX from library +
wire admin auth facade (closes
[#19](https://github.com/forkwright/aletheia/issues/19)
[#43](#43))
([#115](#115))
([083b7f3](083b7f3))
* **taxis,aletheia:** misc-config-claim cluster — provider/deployment
enums + provider verify + self-prompting (closes
[#1](https://github.com/forkwright/aletheia/issues/1)
[#2](https://github.com/forkwright/aletheia/issues/2)
[#4](https://github.com/forkwright/aletheia/issues/4))
([#147](https://github.com/forkwright/aletheia/issues/147))
([4ea5d2d](4ea5d2d))
* **taxis,pylon,daemon:** coherence cluster — schema preflight + dead
config delete + daemonBehavior wire-in (closes
[#15](https://github.com/forkwright/aletheia/issues/15)
[#47](#47)
[#54](#54))
([#109](#109))
([319241c](319241c))


### Documentation

* add CLAUDE.md precedence preamble
(forge[#153](#153))
([#11](#11))
([f27a4d4](f27a4d4))
* **aletheia,_llm:** refresh after substrate push
([#134](#134))
([2c64b14](2c64b14))
* **aletheia:** refresh agent-docs + cross-references + stale-link
cleanup ([#132](#132))
([194e9cb](194e9cb))
* **aletheia:** replace standards copy with kanon pointer
([#41](#41))
([fc8a4ae](fc8a4ae))
* **aletheia:** retire stale duplicate planning tree (B-026)
([#36](https://github.com/forkwright/aletheia/issues/36))
([5c01ee6](5c01ee6))
* **storage:** rebase runbooks + recovery on fjall-backed store
([#3840](https://github.com/forkwright/aletheia/issues/3840))
([#12](#12))
([45a53e0](45a53e0))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
forkwright pushed a commit that referenced this pull request May 22, 2026
Manually merged via local validation (bypass of kanon CI gate). All
gates verified locally: fmt + check + clippy + kanon lint (PR-scoped).

Admin-Bypass: R722 PR4 recall controls; rebased after PR5; local PR-scoped gates pass including reranker feature; workspace clippy baseline large-future fixed mechanically in aletheia server startup; forge CI fmt stage baseline unhealthy
forkwright pushed a commit that referenced this pull request May 22, 2026
…config delete + daemonBehavior wire-in (closes #15 #47 #54) (#109)

Manually merged via local validation (bypass of kanon CI gate). All
gates verified locally: fmt + check + clippy + kanon lint (PR-scoped).

Admin-Bypass: operator-blessed bypass during CI hygiene work (2026-05-08)
forkwright pushed a commit that referenced this pull request May 22, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.22.0](v0.21.1...v0.22.0)
(2026-05-09)


### Features

* **_llm:** add T0 corpus per
[#667](#667) /
[#673](#673) fleet rollout
([#137](#137))
([bdf0cd6](bdf0cd6))
* **aletheia-classify:** scaffold author-classifier inference crate
([#3797](#3797))
([565a15f](565a15f))
* **aletheia-lexica:** centralize scattered pattern lists
([#3799](#3799))
([71d6b89](71d6b89)),
closes [#3785](#3785)
* **aletheia-memory-mcp:** write tools behind per-process capability
token ([#3813](#3813))
([8e13491](8e13491)),
closes [#3688](#3688)
* **aletheia-sessions-migrate:** one-shot SQLite → fjall sessions
importer for legacy 0.15 instances
([#32](#32))
([ca566bf](ca566bf))
* **aletheia:** seed_psyche_facts bin — import v2.2 identity facts into
psyche cohort ([#61](#61))
([03f1694](03f1694))
* **basanos:** API-consistency lint for interface uniformity
([#3821](#3821))
([37bbacd](37bbacd))
* **basanos:** audit component subcommand with 8-check report
([#3828](#3828))
([ded0c99](ded0c99))
* **basanos:** derive-vs-declare detector for announced properties
([#3820](#3820))
([fa0119e](fa0119e))
* **basanos:** hub-words discipline rule + registry
([#3816](#3816))
([ef9dd59](ef9dd59)),
closes [#3486](#3486)
* **basanos:** purpose-language + citation-compression writing rules
([#3810](#3810))
([8920766](8920766)),
closes [#3490](#3490)
* **daemon:** prosoche self-audit framework with 5 check types
([#3818](#3818))
([9cae103](9cae103)),
closes [#3245](#3245)
* **eidos,episteme:** BookkeepingProvider trait surface
([#50](#50))
([ee87c6d](ee87c6d))
* **eidos:** add visibility and reflected epistemic tier
([#43](#43))
([0c08391](0c08391))
* **eidos:** architecture-fact layer + MCP tool + basanos rule
([#3800](#3800))
([e405d1d](e405d1d)),
closes [#3789](#3789)
* **eidos:** extend ArtefactMeta for mnemosyne interop
([#3803](#3803))
([3559e83](3559e83)),
closes [#3796](#3796)
* **eidos:** promote EvalFinding to eidos::knowledge::finding
([#3791](#3791))
([3d19df7](3d19df7)),
closes [#3779](#3779)
* **eidos:** provenance + multi-agent verification types
([#55](#55))
([b1745dd](b1745dd))
* **eidos:** Stamped trait + ArtefactMeta for uniform provenance
([#3801](#3801))
([7a5899e](7a5899e)),
closes [#3787](#3787)
* **energeia:** friction capture — observations parser + PR template
([#3788](#3788))
([93f8d12](93f8d12)),
closes [#3465](#3465)
* **energeia:** frontier computation — parallel group derivation from
DAG ([#3777](#3777))
([05e9db3](05e9db3)),
closes [#3463](#3463)
* **energeia:** phronesis recovery + persona routing + expertise
affinity ([#3835](#3835))
([e70fcba](e70fcba))
* **energeia:** predictive budget allocation
([#3778](#3778))
([3301137](3301137)),
closes [#3457](#3457)
* **episteme,nous,taxis:** wire extraction provider config
([#54](#54))
([01ecc61](01ecc61))
* **episteme,nous:** schema v11 — propagate Visibility + MemoryScope
through Datalog facts
([#208](#208))
([#63](#63))
([7a65599](7a65599))
* **episteme:** add GLiNER ONNX extraction adapter
([#52](#52))
([356c3a5](356c3a5))
* **episteme:** add HTTP reranker and extraction profile knobs
([#44](#44))
([29886ec](29886ec))
* **episteme:** add OpenAI-compatible embedding provider
([#3806](#3806))
([b5f3c2e](b5f3c2e))
* **episteme:** add visibility to scored recall results
([#45](#45))
([8b2a5ca](8b2a5ca))
* **episteme:** cohort-respecting detect_conflict in extraction (W8
follow-up) ([#59](#59))
([2afa74f](2afa74f))
* **episteme:** optional reranker stage in recall pipeline
([#3798](#3798))
([f8e3652](f8e3652)),
closes [#3744](#3744)
* **episteme:** verification protocol module + schema v9-&gt;v10
([#56](#56))
([fc0c834](fc0c834))
* **eval:** typed-tag namespace over RunReport — sliceable training data
([#77](#77))
([67f9270](67f9270))
* **gnosis:** code-graph index + MCP query tool
([#3833](#3833))
([ba5d6cb](ba5d6cb))
* **hermeneus,nous:** agent-loop detector extension (closes
[#203](#203))
([#91](#91))
([b0c2699](b0c2699))
* **hermeneus:** doom-loop detector with (args, result) signature ring
([#72](#72))
([b29f212](b29f212))
* **krites:** hot-reload rule files from disk via notify
([#3809](#3809))
([4f8872d](4f8872d))
* **krites:** tokio-native async surface over blocking core
([#3804](#3804))
([2208494](2208494)),
closes [#3795](#3795)
* **nous,koina:** spawn-class isolation guard + consecutive-mistake
brake (closes [#186](#186),
[#187](#187))
([#75](#75))
([9b894dc](9b894dc))
* **nous,organon:** per-turn agent-curated working-memory injection
(closes [#196](#196))
([#96](#96))
([e4b006c](e4b006c))
* **nous,organon:** tool-group gating per role (closes
[#185](#185))
([#71](#71))
([69bd386](69bd386))
* **nous/bootstrap:** pre-injection scan — invisible-Unicode +
threat-pattern (closes
[#184](#184))
([#79](#79))
([9edb292](9edb292))
* **nous/bootstrap:** SOUL persona slot — typed BootstrapSlot enum
(closes [#194](#194))
([#67](#67))
([e2edc5e](e2edc5e))
* **nous/compact:** two-prompt split — COMPACT_PROMPT vs RESTORE_PROMPT
(closes [#189](#189))
([#64](#64))
([f43963a](f43963a))
* **nous/memory:** structured Step model + CompactionStrategy enum
(closes [#210](#210),
unblocks [#193](#193))
([#88](#88))
([2721801](2721801))
* **nous/skills,organon:** always-vs-lazy skill gating with YAML
frontmatter (closes
[#195](#195))
([#89](#89))
([4a7e9ca](4a7e9ca))
* **nous:** add cross-nous address masks
([#49](#49))
([6df2a63](6df2a63))
* **nous:** add optional reflection pipeline stage
([#46](#46))
([d83741b](d83741b))
* **nous:** add recall profile wiring
([#48](#48))
([49a1b99](49a1b99))
* **nous:** cached microcompact — cache_control on distilled summary
([#3793](#3793))
([672081b](672081b))
* **nous:** cross-nous verification messages
([#58](#58))
([34fa6ed](34fa6ed))
* **nous:** expand hook taxonomy to after-tool, session-start,
before/after-compact
([#3792](#3792))
([cf5465f](cf5465f))
* **nous:** extend recall configuration controls
([#47](#47))
([42dc08f](42dc08f))
* **nous:** pre-LLM triage stage (intent + sensitivity + tier)
([#3805](#3805))
([61170f4](61170f4))
* **organon,nous:** tool receipts HMAC-SHA256 with active hallucination
detection (closes
[#202](#202))
([#83](#83))
([79a124b](79a124b))
* **organon:** add ToolTag enum and definitions_for_tags registry method
([#74](#74))
([443aead](443aead))
* **organon:** add z3 SMT solver tool behind `z3` feature
([#3772](#3772))
([8632803](8632803))
* **organon:** deferred tool schemas via tool_schema meta-tool
([#3807](#3807))
([a24e21c](a24e21c))
* **organon:** file-ref interpolation `{{file:path:start:end}}` (closes
[#197](#197))
([#65](#65))
([b1b859a](b1b859a))
* **poiesis-doc:** DOCX render + inspect backend
([#3827](#3827))
([e814b28](e814b28)),
closes [#3701](#3701)
* **poiesis-intake:** parse Slack-style request text into structured
scaffold ([#3823](#3823))
([bd23176](bd23176))
* **poiesis-scaffold:** project-template scaffolder
([#3824](#3824))
([e3abc1d](e3abc1d)),
closes [#3703](#3703)
* **poiesis-sheet:** JSON-first render_xlsx + inspect_xlsx
([#3830](#3830))
([9803a67](9803a67)),
closes [#3700](#3700)
* **poiesis-slides:** JSON-first render_pptx + inspect_pptx
([#3829](#3829))
([c86bbb2](c86bbb2)),
closes [#3702](#3702)
* **poiesis:** diff + inspect crates for output review
([#3831](#3831))
([8b8f60a](8b8f60a)),
closes [#3705](#3705)
* **poiesis:** wire eval + graph-audit into render_typst_report (Wave 7
closure) ([#10](#10))
([3d3cec1](3d3cec1))
* **proskenion:** restore canonical dye palette from ardent-site
([#18](#18))
([90c26c1](90c26c1))
* **pylon,proskenion:** meta-insights endpoints (agent perf + quality +
journal) — closes
[#209](#209)
([#86](#86))
([b7b68e7](b7b68e7))
* **pylon:** Deprecation + Sunset headers per RFC 8594
([#3812](#3812))
([2d34856](2d34856)),
closes [#3280](#3280)
* **pylon:** ETag + conditional request middleware
([#3817](#3817))
([13c95cc](13c95cc))
* **pylon:** filtered SSE event subscription endpoint
([#3822](#3822))
([e2ac393](e2ac393))
* **r722:** add per-nous episteme keyspace
([#53](#53))
([2771b43](2771b43))
* **routing:** unify empirical router across dispatch + interactive
paths ([#3815](#3815))
([33aedf5](33aedf5))
* **taxis,nous,diaporeia,pylon:** private workspace flag
([#51](#51))
([a597181](a597181))
* **thesauros,aletheia,nous:** full AgentOverlay
(model/agency/system-prompt) + spawn_blocking + actual duration_ms
(closes [#179](#179),
[#180](#180),
[#181](#181))
([#80](#80))
([c9b97ff](c9b97ff))
* tier-aware model resolution
([#3737](#3737),
[#3739](#3739),
[#3740](#3740))
([#3775](#3775))
([c8faf9a](c8faf9a))
* **training:** author classifier for training capture decontamination
([#3786](#3786))
([#14](#14))
([ba8fc3b](ba8fc3b))


### Bug Fixes

* **agora:** truth cluster — capability honesty + error propagation +
dead-code (closes
[#153](#153)
[#154](#154)
[#155](#155)
[#156](#156)
[#157](#157)
[#158](#158))
([#101](#101))
([cf29be3](cf29be3))
* **aletheia-classify:** replace map_or with is_some_and (clippy)
([#35](#35))
([8aac8b2](8aac8b2))
* **aletheia-lexica,poiesis:** coherence cluster (closes
[#135](#135)
[#136](#136)
[#137](#137)
[#139](#139))
([#94](#94))
([532b2c9](532b2c9))
* **aletheia-memory-mcp:** coherence cluster — namespace + boundary +
drift (closes [#159](#159)
[#160](#160)
[#161](#161)
[#162](#162)
[#163](#163)
[#164](#164)
[#165](#165))
([#100](#100))
([8ea4c15](8ea4c15))
* **aletheia-routing,daemon:** cluster - routing honesty and maintenance
([#133](#133))
([04ee64a](04ee64a))
* **aletheia:** clear Wave 7 clippy debt (poiesis-scaffold/diff,
partial) ([#16](#16))
([df59390](df59390))
* **aletheia:** drift-claim cluster — guard doc + seed path + audit
heuristics + violation spans + ARCHITECTURE config (closes
[#75](#75)
[#105](#105)
[#109](#109)
[#110](#110)
[#111](#111))
([#122](#122))
([790f1a1](790f1a1))
* **aletheia:** HIGH violations cluster — hot-reload + planning +
readiness + workspace + cancellation + delegation (closes
[#38](#38)
[#40](#40)
[#87](#87)
[#88](#88)
[#89](#89)
[#90](#90))
([#140](#140))
([366a96e](366a96e))
* **aletheia:** stub/scaffold CLI cluster — export-agent + seed-skills
persistence + consolidate wire + dry-run guard (closes
[#128](#128)
[#132](#132)
[#133](#133)
[#134](#134))
([#126](#126))
([c8c5f5e](c8c5f5e))
* **aletheia:** wire-or-delete cluster — substrate wire-ins + provenance
unification + dead-code (closes
[#95](#95)
[#98](#98)
[#99](#99)
[#100](#100)
[#101](#101)
[#102](#102)
[#103](#103))
([#125](#125))
([350ad0d](350ad0d))
* **basanos:** dedup duplicate linter and clean koina lint baseline
([#135](#135))
([814edc6](814edc6))
* **daemon,aletheia:** observability cluster — backup staleness +
prosoche self-audit + task-state persistence (closes
[#9](#9)
[#14](#14)
[#18](#18))
([#145](#145))
([3091af1](3091af1))
* **daemon,maintenance:** cluster — sqlite_recovery delete +
fact-extraction persistence + maintenance wire-in (closes
[#20](#20)
[#50](#50)
[#72](#72))
([#108](#108))
([d3a090a](d3a090a))
* **diaporeia,organon:** MCP cluster — stdio transport + external tool
plane bridge (closes
[#17](#17)
[#41](#41))
([#114](#114))
([e0f5fc4](e0f5fc4))
* **diaporeia:** tools cluster — knowledge_search + depth + CLAUDE.md +
McpClaims + RBAC (closes
[#113](#113)
[#114](#114)
[#115](#115)
[#116](#116)
[#118](#118))
([#117](#117))
([404d0e9](404d0e9))
* **docs,taxis,aletheia:** config/doc drift cluster — sqlite→fjall +
Phase 05d ownership + taxis registry (closes
[#21](#21)
[#27](#27)
[#23](#23)
[#24](#24)
[#25](#25)
[#84](#84)
[#85](#85))
([#131](#131))
([ca1a054](ca1a054))
* **dokimion,krites:** eval truth cluster — fake-recall +
question_timeout + descriptions + now_iso8601 + TriggerConfig (closes
[#117](#117)
[#119](#119)
[#120](#120)
[#121](#121)
[#122](#122))
([#118](#118))
([79b0513](79b0513))
* **energeia,hermeneus:** engine cluster — sdk doc + budget + session
abort + post-processing + observability (closes
[#79](#79)
[#80](#80)
[#81](#81)
[#82](#82)
[#83](#83))
([#153](#153))
([e8436b6](e8436b6))
* **episteme:** observability + recall cluster — wire-in + threshold +
silent-failure (closes
[#10](#10)
[#11](#11)
[#12](#12)
[#63](#63)
[#64](#64))
([#105](#105))
([a0b88e3](a0b88e3))
* **episteme:** tier-arm coverage for Reflected + Training in recall
scoring ([#60](#60))
([b4883a2](b4883a2))
* **gnosis:** drift cluster — SHA-256 + orphan cleanup + module_path +
rdeps coverage ([#95](#95))
([79814c2](79814c2))
* **graphe:** drift cluster — TTL overflow + error propagation + cleanup
wire-in + bench doc-comments
([#98](#98))
([72c2e45](72c2e45))
* **hermeneus,nous,aletheia:** drift cluster — fallback chain + token
redact + max_tokens forward (closes
[#48](#48)
[#68](#68)
[#69](#69))
([#106](#106))
([5550eeb](5550eeb))
* **hermeneus:** propagate deployment_target to OpenAI-compat provider
(sovereignty)
([#3773](#3773))
([4f0f708](4f0f708))
* **koilon/graph_analysis:** replace hardcoded staleness reference date
with live clock (closes
[#178](#178))
([#68](#68))
([e9ef02c](e9ef02c))
* **koilon:** gate planning checkpoints and memory search on missing
pylon endpoints (closes
[#170](#170),
[#175](#175))
([#69](#69))
([806f670](806f670))
* **koina, hermeneus:** accept legacy ses_&lt;24hex&gt; session IDs and
CC 2.x assistant-event shape
([#33](#33))
([974920e](974920e))
* **koina:** hygiene cluster — jiff timestamps + dead code +
tracing/cleanup/events wire-in (closes
[#106](#106)
[#107](#107)
[#123](#123)
[#124](#124)
[#125](#125)
[#126](#126)
[#127](#127))
([#128](#128))
([2cb0a09](2cb0a09))
* **mneme:** drift cluster — facade boundary + suppressions + wildcard
re-exports (closes
[#22](#22)
[#61](#61)
[#62](#62))
([#111](#111))
([a145463](a145463))
* **nous,aletheia-lexica:** triage regexes rebuild from lexica constants
(closes [#138](#138))
([#66](#66))
([e0a600d](e0a600d))
* **nous,daemon:** wire-in cluster — knowledge maintenance + bootstrap
tool summary + per-stage timeouts (closes
[#5](#5)
[#6](#6)
[#8](#8))
([#129](#129))
([18c4775](18c4775))
* **nous:** wire organon deferred-schemas into execute tool block
([#3811](#3811))
([58fcf50](58fcf50)),
closes [#3808](#3808)
* **organon,aletheia,taxis:** security-hardening cluster — path
validation + config defaults + organon drift (closes
[#221](#221)
[#222](#222)
[#76](https://github.com/forkwright/aletheia/issues/76)
[#77](#77)
[#78](https://github.com/forkwright/aletheia/issues/78)
[#91](#91)
[#130](https://github.com/forkwright/aletheia/issues/130))
([#152](https://github.com/forkwright/aletheia/issues/152))
([2685be8](2685be8))
* **poiesis-inspect:** clippy under -D warnings — unblock aletheia main
CI ([#9](#9))
([d61985f](d61985f))
* **poiesis-slides:** replace if-let-guard with body if-let to compile
on stable 1.94
([#138](#138))
([9330e0a](9330e0a))
* **poiesis:** truth cluster — content-drop + XLSX/ODT/PDF drift + lint
+ intake doc (closes
[#45](#45)
[#65](#65)
[#66](#66)
[#67](#67))
([#107](#107))
([b69f8ae](b69f8ae))
* **proskenion:** converge on canonical design tokens (theatron-lint
clean) ([#22](#22))
([1a61e8a](1a61e8a))
* **proskenion:** gate meta agent perf + quality charts + system journal
on capability discovery (closes
[#171](https://github.com/forkwright/aletheia/issues/171),
[#172](https://github.com/forkwright/aletheia/issues/172),
[#173](https://github.com/forkwright/aletheia/issues/173))
([#70](https://github.com/forkwright/aletheia/issues/70))
([8257529](8257529))
* **proskenion:** post-extraction cleanup batch (QA swarm follow-ups)
([#24](#24))
([b2d8173](b2d8173))
* **pylon,aletheia-memory-mcp,dianoia:** mcp-api-drift cluster — error
canonical + planning 501 + memory tools docs (closes
[#7](https://github.com/forkwright/aletheia/issues/7)
[#16](#16)
[#44](#44))
([#146](https://github.com/forkwright/aletheia/issues/146))
([d371663](d371663))
* **pylon:** coherence cluster — auth + OpenAPI + SSE/handler/docs drift
(closes [#42](https://github.com/forkwright/aletheia/issues/42)
[#55](#55)
[#56](#56)
[#57](https://github.com/forkwright/aletheia/issues/57)
[#58](#58)
[#59](#59)
[#60](#60))
([#102](#102))
([639f725](639f725))
* **rand:** migrate 0.9 → 0.10 API (RngExt, SysRng, TryRng renames)
([#3770](https://github.com/forkwright/aletheia/issues/3770))
([246d46d](246d46d)),
closes [#3767](https://github.com/forkwright/aletheia/issues/3767)
* **runtime:** close NousGenerationConfig main breakage from
[#3775](#3775)
([#3776](https://github.com/forkwright/aletheia/issues/3776))
([80d7d2b](80d7d2b))
* **symbolon,pylon:** auth cluster — remove terminal UX from library +
wire admin auth facade (closes
[#19](https://github.com/forkwright/aletheia/issues/19)
[#43](#43))
([#115](#115))
([85d8931](85d8931))
* **taxis,aletheia:** misc-config-claim cluster — provider/deployment
enums + provider verify + self-prompting (closes
[#1](https://github.com/forkwright/aletheia/issues/1)
[#2](https://github.com/forkwright/aletheia/issues/2)
[#4](https://github.com/forkwright/aletheia/issues/4))
([#147](https://github.com/forkwright/aletheia/issues/147))
([18b59bf](18b59bf))
* **taxis,pylon,daemon:** coherence cluster — schema preflight + dead
config delete + daemonBehavior wire-in (closes
[#15](https://github.com/forkwright/aletheia/issues/15)
[#47](#47)
[#54](#54))
([#109](#109))
([a2fa31d](a2fa31d))


### Documentation

* add CLAUDE.md precedence preamble
(forge[#153](#153))
([#11](#11))
([145f4a0](145f4a0))
* **aletheia,_llm:** refresh after substrate push
([#134](#134))
([df5b2df](df5b2df))
* **aletheia:** refresh agent-docs + cross-references + stale-link
cleanup ([#132](#132))
([5ce1b90](5ce1b90))
* **aletheia:** replace standards copy with kanon pointer
([#41](#41))
([12b31ad](12b31ad))
* **aletheia:** retire stale duplicate planning tree (B-026)
([#36](https://github.com/forkwright/aletheia/issues/36))
([5c95d96](5c95d96))
* **storage:** rebase runbooks + recovery on fjall-backed store
([#3840](https://github.com/forkwright/aletheia/issues/3840))
([#12](#12))
([01ed0b0](01ed0b0))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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