v0.155.0
v0.155.0 lands the ADR 0108 context architecture end to end — per-turn context is now composed, bounded and recorded rather than accumulated in state — together with a memory write lifecycle, a console that shows what the model was actually given, and the fixes that testing the arc turned up.
Upgrade action: knowledge.top_k now defaults to the documented 5 (it was 10). Installs that never set the key will see 5 hits per turn instead of 10 — set knowledge.top_k: 10 to keep the old volume.
Context Architecture (ADR 0108)
- Per-turn context is delivered as part of the turn, not stored in agent state — the legacy
context/context_sectionsstate channel is gone, so stale context can no longer accumulate in a checkpoint. - Projected context now enforces a character budget (
context.budget_pct, default 8%) that sheds lower-priority sections — RAG hits, then the prior-session digest, then skill descriptions — to fit the model window. Working state and always-on memory are never shed. The budget follows the model a chat tab is actually using, not the configured default. context.prior_sessionstakes a policy:newest(default),relevant(query-matched via session-search FTS), oroff. A session's own summary is never injected as a "prior" session, and under budget pressure the digest sheds entry by entry rather than all at once.- One projection now serves every runtime — the native agent and external runtimes compose context through the same seam instead of two drifting copies.
- The four prompt contracts are documented and size-gated, so a prompt section cannot quietly grow past its budget.
Memory & Knowledge
- Every memory has a write lifecycle: provenance, confirmation, expiry and supersession.
memory_ingeststamps the session a memory came from and acceptsexpires_in_daysfor time-bound facts;memory_recallcan include superseded history. - Memory rows record when they enter the prompt — a
delivery_policyofalways,retrieved, oron_demand. - Operators can confirm, reject, or re-open agent-written memories from the console (
POST /api/memory/chunks/{id}/review). Rejected rows are never deleted, and superseded rows keep an audit chain. - A configured commons no longer breaks memory listing, fact dedup, or snapshot export —
LayeredKnowledgeStore.list_chunksreturns tier-tagged rows of the shape its callers expect. - A negative
knowledge.top_kused to remove the injection cap rather than tighten it (it reached SQLite asLIMIT -1, meaning no limit); non-positive values now clamp, and0remains a deliberate off.
What the model is told
- The system prompt describes only the tools the agent actually has — capability-derived, with the duplication between sections removed.
- The subagent roster lists only the subagents the lead can actually pick; workflow-only subagents no longer appear as choices it cannot make.
- The external (ACP) runtime builds its stable prefix and persona from the tool set its bus really serves, instead of claiming capabilities it does not expose.
- The cache warmer and the ACP runtime warm the prompt the agent will actually send, so the cached prefix matches the live one on capability-stripped deployments.
Console
- The prompt inspector shows the delivery budget, how much of it the turn used, and exactly which sections the budget shed.
- The fleet roster can be reordered — by dragging a row's handle, or with per-row move controls for keyboard and screen-reader users.
- Prompt snapshots capture the context the model was actually given, so what you read in the inspector is what the turn carried.
Fixes
- Prompt snapshots record the turn's projected context again — it was being composed and delivered normally but dropped before it was stored, leaving every snapshot's context empty.
context.prior_sessions: offnow actually turns the prior-session digest off. YAML parses a bareoffas the boolean false, which the config read as "unset" and resolved to the default — so an operator who switched the digest off was still shown ten sessions of it every turn.- The
self_improvementpolicy knobs (soul_md,skills,distillation) accept a bareon/offin YAML for the same reason. - Pressing ↑ with a message queued mid-turn now pulls that message out of the turn to edit, instead of recalling a copy and leaving the original queued.
- The console unit suite runs on Node 25 and 26 again — both pre-define the Web Storage globals, which shadowed jsdom's and failed 127 tests on a clean checkout.
Desktop, CI and docs
- The desktop app ships the board's
brCLI, pinned, soproject_boarduses the distributed binary instead of fetching one at runtime. - A
uv.lockdowngrade can no longer slip through behind a one-package PR title, and CI actions are bumped only where a PR actually exercises them. - New coverage for the queued message the agent already read — the race where a steer is drained before the operator can take it back.
- A public tapped-dispatch seam on the coding-agent plugin, ADR 0109 (one board, one store, N repos), and guidance on finishing dependency-bump PRs.
What's Changed
- chore(deps): bump websockets from 15.0.1 to 17.0.1 by @dependabot[bot] in #3218
- chore(deps): bump the ai-stack group across 1 directory with 4 updates by @dependabot[bot] in #3222
- chore(deps): bump the python-routine group across 1 directory with 12 updates by @dependabot[bot] in #3223
- feat(ci): fail a PR whose uv.lock silently downgrades a dependency by @mabry1985 in #3224
- chore(ci): bump only the actions a PR actually exercises by @mabry1985 in #3225
- feat(context): ephemeral context projection (ADR 0108 D2) by @mabry1985 in #3226
- feat(observability): capture projected context in prompt snapshots by @mabry1985 in #3228
- feat(prompts): capability-derived operating model by @mabry1985 in #3229
- feat: Implement drag-and-drop and accessible fleet roster reordering by @mabry1985 in #3227
- test(e2e): cover the steer the agent already read by @mabry1985 in #3231
- feat(prompts): exclude workflow-only subagents from lead prompt roster by @mabry1985 in #3232
- fix(prompts): thread bound_tool_names through cache warmer and ACP runtime by @mabry1985 in #3233
- fix(console): run the unit suite on Node 25+ again by @mabry1985 in #3230
- feat(context): remove legacy context/context_sections state channel by @mabry1985 in #3234
- feat: C3: ADR superseding ADR 0055 single-board sub-decision (#3237) by @mabry1985 in #3239
- feat: C1: public tapped-dispatch seam on coding_agent (#3235) by @mabry1985 in #3240
- feat: C2: bundle pinned br desktop sidecar (#3236) by @mabry1985 in #3241
- feat(knowledge): delivery_policy column + typed-memory backfill (ADR 0108 D4) by @mabry1985 in #3242
- feat(context): shared compose_projected_context for native + external runtimes (ADR 0108 D8) by @mabry1985 in #3243
- docs+test(prompts): document the four prompt contracts and gate their size (ADR 0108) by @mabry1985 in #3244
- fix(knowledge): LayeredKnowledgeStore.list_chunks returns tier-tagged Chunk rows by @mabry1985 in #3245
- feat(knowledge): memory write lifecycle — provenance stamps, confirm/reject, supersession chain, expiry (ADR 0108 D7) by @mabry1985 in #3246
- fix(observability): capture projected context across the task boundary by @mabry1985 in #3251
- fix(acp): honest stable prefix for the external runtime by @mabry1985 in #3248
- feat(context): bounded, policy-driven delivery — budget, priority order, always-on by delivery_policy (ADR 0108 D6) by @mabry1985 in #3247
- feat(console): confirm / reject memory verdicts in the inspector (ADR 0108 D7) by @mabry1985 in #3249
- feat(context): evaluated prior-session digest — active-session exclusion, newest|relevant|off, per-entry budget shed (ADR 0108 D9) by @mabry1985 in #3252
- fix(config): honor
prior_sessions: off— YAML parses it as a boolean by @mabry1985 in #3254 - fix(config): self_improvement knobs accept bare on/off instead of landing right by luck by @mabry1985 in #3255
- feat(knowledge): memory_ingest stamps its source session (ADR 0108 D7) by @mabry1985 in #3258
- fix(context): the delivery budget follows the turn's model, not the configured default by @mabry1985 in #3256
- chore(changelog): give every unreleased fragment a linked marketing title by @mabry1985 in #3261
- feat(console): show the delivery budget and shed sections in the prompt inspector (ADR 0108 D6) by @mabry1985 in #3257
- fix(knowledge): clamp non-positive top_k and align its default to the documented 5 by @mabry1985 in #3260
New Contributors
- @dependabot[bot] made their first contribution in #3218
Full Changelog: v0.154.0...v0.155.0