Skip to content

v0.5.0

Latest

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 21 Sep 09:15
· 96 commits to main since this release

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 explicit plan_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 still learning for
    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 learning is 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 a planning purpose; 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
    and delete_study_plan (confirmation required) join the existing
    record_plan_learning, all thin adapters over the seam.
    get_next_action gains interleave parity 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 now offers quotes learner-authored values as one
    shell word; a plan title carrying $(…) no longer executes when pasted.
  • A legacy study_progress row with no last_seen no longer crashes the
    struggle collector.
  • The due-review reader emits every struggling row 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.
  • anyio 4.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.db from 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 main after
    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-main control
    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.