v0.2.1
The honesty-and-hardening release for the second-brain layer, closing out the
2026-09-04 independent review. No new provider; the layer's claims now match
its evidence, the wind-down decision is data instead of protocol prose, and a
learning record finally has a writer.
Changes
- The wind-down decision becomes a command.
studyloop brain wind-down --json [--connector NAME]answers the one question the end-of-session
protocol needs — which second-brain offer to make, if any — as
{channel, offer, sentence, reason}. Two rules, not one conjunction: the
publish offer needs a configured, publish-capable provider; the xTiles offer
needsprovider: xtilesplus anxtilesconnector the session can actually
see. The offer sentences are pinned byte-identical across the CLI, the
protocol, the skill and the guide. - Learning records have a writer.
studyloop plan record <plan-id> --title … [--body …](and therecord_plan_learningMCP tool) appends a learning
record through the plan renderer — idempotent, numberedmax+1, refusing
bodies that would corrupt the document. The xTiles wind-down records into
the plan first, so a second-brain page is a projection of a record the plan
already has, never the only copy. ADR-0010 clause 1 amended to the rule the
code obeys. - xTiles guidance says what was actually proven (first hand-run of the
prompts, Kiro CLI 2.21.0): the planner prompt creates a tile and returns a
URL; the project prompt stops promising board views or collection-page
refreshes; the wind-down prompt skips the Review task when nothing is due;
data sent is your whole study state, not one plan's; cleanup boundaries are
stated.studyloop install agentsno longer double-links the skill for
OpenCode. - Obsidian writer hardening: no directory can be created outside the
vault;--dry-runpreviews the "would replace your edits" warning; a note
whose permissions cannot be read is refused rather than rewritten with
defaults. - Fixed:
get_study_history(MCP) andstudyloop plan evaluateno longer
fail on the session-history search (ambiguous column + multiple FTS MATCH
constraints); multi-word topics now match as phrases. - Test honesty: the three tests that were red on
mainare root-caused
and fixed; sixwait_for_functionasync predicates that never awaited are
replaced with a real polling helper; an acceptance suite (truth table, CLI
contract, sentence pins, stub xTiles MCP server, live transcript gate
checks) covers what previously needed a human; the release gate now fails on
shipped-but-unarchived OpenSpec changes and stale ADR statuses, with an
early-warning hook for three harnesses.
Verification
just preflight— 4790 passed, 4 skippedjust e2e— 503 passed, 20 skippedjust gate-checks— all three wind-down gate checks pass on captured
transcripts (offer-once/decline/silence at 3/3, zero flakes)- GitHub CI green on the merged PR (#16), all 16 checks