Skip to content

v0.155.0

Choose a tag to compare

@github-actions github-actions released this 28 Aug 23:25
· 169 commits to main since this release
84e0e12

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_sections state 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_sessions takes a policy: newest (default), relevant (query-matched via session-search FTS), or off. 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_ingest stamps the session a memory came from and accepts expires_in_days for time-bound facts; memory_recall can include superseded history.
  • Memory rows record when they enter the prompt — a delivery_policy of always, retrieved, or on_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_chunks returns tier-tagged rows of the shape its callers expect.
  • A negative knowledge.top_k used to remove the injection cap rather than tighten it (it reached SQLite as LIMIT -1, meaning no limit); non-positive values now clamp, and 0 remains 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: off now actually turns the prior-session digest off. YAML parses a bare off as 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_improvement policy knobs (soul_md, skills, distillation) accept a bare on/off in 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 br CLI, pinned, so project_board uses the distributed binary instead of fetching one at runtime.
  • A uv.lock downgrade 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

Full Changelog: v0.154.0...v0.155.0