Repository navigation
v0.5.0
The plan-integration release: a Study Plan is no longer a document that sits
beside the product. Activating one changes what studyloop now, the Web Today
card, the recap and MCP get_next_action recommend; the Study Plan Architect
can be launched from the Web UI through the ordinary session machinery; MCP
clients get lifecycle parity over the same application seam the CLI and Web
use; and a low-energy day is handled honestly — repair work the day cannot
carry is deferred with a reason, and when nothing plan-related fits, the
recommendation is to sit with the plan rather than take the least-bad task.
Every change in this release was built test-first, reviewed by a three-seat
model council against the diff, and — where it changes what a learner is told
to do — scored by the owner on a human rubric before it shipped.
StudyLoop 0.5.0 follows the documented source-checkout installation flow. CI
builds and installs wheel/sdist artifacts as validation evidence; this release
does not advertise GitHub or PyPI binary distribution.
Changes
One application seam for Study Plans
studyloop.planning.application(PlanApplication) carries every plan use
case — browse, inspect, prepare planning, active guidance, apply a change,
assess — behind immutable views and transport-neutral domain errors. The
CLI, the Web routes and the MCP tools are thin adapters over it; an AST
guard keeps them that way.- Two bugs closed by construction: activation readiness is judged once, on
the resulting document, for every entry path (the create-with-status and
whole-document-replacement doors used to bypass it); a checkpoint whose
database write failed is reported as partial, never as a clean record. - Markdown stays the source of truth and SQLite stays derived; plan identity
and creation time survive revision and document replacement.
Plan-aware now
- An active plan biases the recommendation and never filters it: matching due
work and a synthesised next milestone carry explicitplan_refs; urgent
reviews and fresh struggles can still outrank new milestone work; several
active plans are considered deterministically; a milestone beyond today's
energy is deferred with a reason. With no active plan the JSON is
byte-identical to the pinned golden. - Repair has an energy demand of its own: a live struggle asks for 6/10, an
older one or a weak teach-back for 4/10, a concept stilllearningfor
none. Below the day's capability a repair is deferred like new work
(energy_deferred_repairs); due recall and teach-back reviews are never
deferred. When nothing plan-related fits and an active, ready plan exists,
one low-scoring proposal is synthesised — sit with the plan in a body-double
session — that leads with the progress the plan records and names what is
deferred. - A concept still
learningis offered as the one-sentence micro
teach-back and described as the gentle review it is; the teach-back
protocol gains a low-energy fallback (a short guided explanation and one
phrase back when the sentence will not come, instead of the four-round
stuck ladder; the blank is not scored). - A fully-checked active plan yields a completion action, not more study
work:studyloop plan close <id>reviews the plan against its evidence and
proposes extend or close; status never changes by itself, and a partial
review never proposes a clean close.
The architect on every surface
- Web UI: Plans → Plan with architect launches the Study Plan Architect
through the existing session start, one-session authority, reconnect flow
and console, with aplanningpurpose; starting a conversation creates no
draft. The manual form is retained. Leaving the page before a launch lands
leaves a session like any other. - CLI:
studyloop plan repair <id>opens the architect on an active plan
the readiness gate refuses to write;plan close <id>as above. Both
contain learner-authored text through the seam. - MCP:
list_study_plans,get_study_plan,get_planning_interview,
create_study_plan,update_study_plan(mission included),
set_study_plan_status,set_study_plan_milestone,evaluate_study_plan
anddelete_study_plan(confirmation required) join the existing
record_plan_learning, all thin adapters over the seam.
get_next_actiongainsinterleaveparity with the CLI and Web. - Nothing in the planning flow is specific to one harness: one canonical
persona is delivered to Kiro CLI, Claude Code, Codex, pi, OpenCode and Grok
Build through each harness's own door.
Safety and correctness
- Every command
studyloop nowoffers quotes learner-authored values as one
shell word; a plan title carrying$(…)no longer executes when pasted. - A legacy
study_progressrow with nolast_seenno longer crashes the
struggle collector. - The due-review reader emits every
strugglingrow as a hands-on "guided
repair" too — the same repair the struggle collector defers, collected a
second time. That copy now carries the repair's demand and defers with it
(named once), so a low-energy day no longer shows the repair the learner
was just spared as the primary with its own deferral printed beneath it.
Found by emitting the owner's rubric readings through both readers; the
earlier fixture had silenced one. - The Study Session timer's
init()ran twice per page load, each run
reading the live-session state; the slower read could adopt a session
started in another tab into a tab that was sitting on the picker. It now
runs once, so a second tab's Start is refused with the reattach offer it
was designed to get. anyio4.15.1 (two published advisories); both dependency audits clean.
Release tooling
- The release gate reads a folded
deferred: >-reason in an openspec
change's metadata as its text and refuses an empty block. - Seam tests seed their per-test
sessions.dbfrom one migrated template per
process (241 production bootstraps → 1 on the same test set), removing the
step a slow CI disk had stalled in. - The nightly install check plants a harness marker before running the
installer in its isolated HOME; the job had been red every night since it
was added.
Verification
- Every PR in this release was merged as a local fast-forward of
mainafter
CI green on the PR's own head (#20, #22, #23, #24, #27, #28) — 15/15 jobs
including the 3.12/3.13 matrix, e2e and install-smoke; the nightly install
check dispatched against the installer fix: 7/7 green (run 35498047718). - Full unit suite on each item's final tree against a clean-
maincontrol
worktree: zero regressions each time (the 44 sandbox-environmental ids are
identical on both sides and recorded by name in
docs/architecture/plan-integration/receipts/). - Council records:
docs/architecture/plan-integration/council/(reviews 1–7
and the rubric-3b decision brief); owner rubric:
docs/architecture/plan-integration/receipts/now-rubric-2026-09-16.md—
every row scored by the owner, row 3b (six readings) on 2026-09-20 with each
reading re-emitted through both real readers before its verdict was read as
a verdict on shipped behaviour. just release-check(pre-tag) on the release commit;just release-verify
after the tag.