Skip to content

Releases: NetDevAutomate/StudyLoop

v0.5.0

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 21 Sep 09:15

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.

v0.4.0

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 20 Sep 08:21

v0.4.0

The semantic session-memory release: the session database gains an embedding
substrate and a hybrid retrieval mode behind one retrieval service, the source
install selects its Python deterministically and says so, the study-plan-architect
becomes a first-class mentor role in every harness, and OpenCode and Grok Build
join Claude Code, Kiro CLI and Codex in having both StudyLoop MCP servers
registered by the installer. A repository-wide documentation-versus-code review
(council-reviewed, test-first) made the docs, the installed prompts and the
configuration keys say what the code does.

StudyLoop 0.4.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

Semantic session search

  • Schema 48 adds message_embeddings (chunked, content-hashed) with a
    sqlite-vec sidecar index. session-maint embed fills the backlog,
    session-maint embed-check [--fix] audits alignment, studyloop doctor
    reports embeddings_alignment, and the export hook keeps vectors current.
  • Every agent-facing search (session_search over MCP, session-query, the
    retrieval half of memory_search) goes through one retrieval.search
    service; natural-language queries no longer crash on FTS5 syntax.
  • Hybrid mode fuses the lexical and embedding arms with unweighted Reciprocal
    Rank Fusion. It is off by default and enabled with semantic_search.hybrid: true, or for one process with STUDYLOOP_RETRIEVAL_MODE=hybrid.

Installation

  • A committed .python-version (3.12) drives uv sync and uv run;
    studyloop install tools passes the same minor to every uv tool install;
    ./scripts/install.sh prints the interpreter uv resolved, installs the pinned
    3.12 through uv when no matching interpreter exists, refuses anything outside
    3.12–3.14, and reports the interpreter each tool venv received. UV_PYTHON=3.13 ./scripts/install.sh is the documented override. The nightly install workflow
    runs the real installer and checks Python 3.14 as a signal; CI asserts each
    matrix job runs the Python it names.

Mentor harnesses

  • The study-plan-architect is a first-class role: one canonical persona,
    delivered by studyloop study --mode plan-architect (or studyloop plan architect) to Codex, pi and Grok Build, and installed as a native named agent
    for Claude Code, Kiro CLI and OpenCode.
  • OpenCode and Grok Build get both StudyLoop MCP servers (session-db,
    studyloop) registered by studyloop install agents / doctor --fix, with the
    session-query CLI fallback still documented for every harness. pi stays
    CLI-only because it has no MCP support by design. Server names are identical in
    every harness config; studyloop-mcp and session-db-mcp are the commands.
  • Grok Build sessions export automatically at session end; doctor reports
    session_export_hook_grok.

Doctor and configuration

  • New checks exporter_schema and export_freshness; export hooks are pinned to
    the installed binary and logged.
  • agent-session-tools honours a top-level session_db: with studyloop's
    precedence, so both packages open the same database. Doctor no longer flags
    the configuration sections the setup guide recommends; studyloop setup writes
    agents.priority rather than a dead key; the Obsidian export check verifies
    the memory directory is writable without creating it; the Kiro hook check reads
    both agent-file schemas; obsidian.filename_template is honoured.

Documentation and prompts made congruent with the code

  • Six harnesses stated the same way everywhere; session-memory docs describe
    schema 48 and the retrieval modes; the CLI reference documents session-maint embed/embed-check; installed prompts instruct only commands and tools that
    exist; architecture notes point at the real modules; SECURITY.md and
    CONTRIBUTING.md use version-independent wording. Doc-contract tests now pin
    each of these to code symbols.

Release tooling

  • just release-check runs the release consistency check in --pre-tag mode;
    just release-verify runs the strict form after tagging; a release note that
    is still the prepare-release skeleton fails the gate.

Verification

  • just release-check (pre-tag) on the release commit; just release-verify
    after the tag.
  • Full unit suite green on the release branch before the cut (6,145 passed, 15
    skipped; the release commit's own just release-check run is the gate);
    acceptance install from a fresh clone in a user-like environment
    (Homebrew Python 3.14 only, no UV_PYTHON) → exit 0, workspace and tool venvs
    on 3.12.
  • Council records and evidence: reviews/2026-09-14-congruence-review/
    (git-ignored).

v0.3.0

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 20 Sep 08:21

v0.3.0

The provider-aware second-brain launcher: the web app's Today panel can now
take you to your second brain — one honest action, one explicit click,
nothing automatic. Under it sits one launch-policy owner, one atomic
configuration-mutation owner, and release evidence that exercises the launcher
from the installed wheel rather than the source checkout.

StudyLoop 0.3.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

  • Today launches your second brain. A read-only
    GET /api/second-brain/launch-target route (never cached) reports the
    selected provider's honest launch state; the Today panel renders at most one
    launcher action from prefetched state and navigates only inside the click
    handler. xTiles opens once in a new noopener,noreferrer tab; Obsidian
    hands the current tab to the obsidian:// link without leaving an empty tab
    behind. Nothing navigates during page load, refresh, publication or
    wind-down, and no server module launches, redirects, or contacts a provider.
  • Obsidian is same-device honest. The action is enabled only when the
    browser runs on the device running StudyLoop, decided from the direct
    request peer — behind a reverse proxy it stays safely disabled with the
    reason. An enabled click opens <vault>/<folder>/Today.md when that note
    exists inside the vault, falling back to the vault root.
  • The assistant destination handoff. studyloop brain destination set --provider xtiles --url URL retains a reviewed, connector-returned page URL
    without changing provider consent; destination clear removes it. The
    validator accepts HTTPS on exactly xtiles.app/app.xtiles.app with a real
    page path and nothing else — no userinfo, port, query, or fragment, Unicode
    and IDNA lookalikes rejected — and a rejected value is reported by reason
    only, never echoed. Only the host is ever shown; Settings never displays the
    full retained URL.
  • One atomic configuration writer. mutate_raw_config() is now the only
    read-modify-write seam: exclusive sibling lock, reread after locking,
    whole-config validation, synced 0600 temporary sibling, atomic replace
    preserving the destination's mode. brain enable and both destination
    commands share it, so concurrent StudyLoop writers cannot silently lose each
    other's update.
  • Settings explains, never launches. One card per provider — active for
    the selected provider, muted otherwise — carrying the launch API's own
    reason as guidance, or the CLI command that would select a muted provider.
    No web form writes configuration.
  • Installed-wheel launcher evidence. just smoke-web (wired into
    just release-check) builds the wheel, installs studyloop[web] into an
    isolated environment outside the checkout, asserts the installed package
    does not import from the checkout, starts the installed application,
    requests the launch-target route, and loads every launcher asset reachable
    from main.js's import graph.
  • Session memory became an installer/doctor invariant across all five
    harnesses, topic exercises moved behind an explicit --dev preview flag,
    and release validation now runs without the three warning classes found
    during the 0.3.0 readiness pass (see CHANGELOG for detail).

Verification

  • just preflight — 4882 passed, 4 skipped (ruff clean, Pyright 0 errors,
    JS 105/105, docs build strict, release consistency and spec validation pass)
  • just e2e — 515 passed, 20 skipped
  • just smoke-web — 3 passed (installed-wheel launcher smoke: isolated venv
    outside the checkout, launch-target route, full launcher asset graph)
  • just smoke-installed, just smoke-extras (9 passed), just shellcheck,
    just audit, just audit-full — all pass

Connector-shape evidence (redacted)

A live page URL returned by the authenticated xTiles MCP connector on
2026-09-05 was checked against the strict destination validator. The URL
itself is deliberately not recorded here — only its shape:

  • scheme https, host exactly xtiles.app, default port
  • no userinfo, no query, no fragment, ASCII-only, well under 2,048 characters
  • path is a single opaque page-id segment (non-home)

resolve_second_brain() accepted that exact value unchanged (provider
selection untouched), and rejected the same value with a query appended
and with a fragment appended, each with a reason-only error that does not echo
the value — confirming the strict validator matches what the connector really
returns, with no contract revision needed.

Tag status

v0.3.0 is cut at the release commit 34f06d70 (2026-09-06, the commit that bumped the
version and added this note). The tag was created on 2026-09-14 during the congruence
review, once the release gate had learned to run before a tag exists; the CHANGELOG heading
carries the tag's commit date.

v0.2.1

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 05 Sep 11:21

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
    needs provider: xtiles plus an xtiles connector 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 the record_plan_learning MCP tool) appends a learning
    record through the plan renderer — idempotent, numbered max+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 agents no longer double-links the skill for
    OpenCode.
  • Obsidian writer hardening: no directory can be created outside the
    vault; --dry-run previews 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) and studyloop plan evaluate no 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 main are root-caused
    and fixed; six wait_for_function async 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 skipped
  • just e2e — 503 passed, 20 skipped
  • just 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

v0.2.0 (superseded by 0.2.1)

Pre-release

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 05 Sep 11:21

v0.2.0 Release Notes

Adds an optional second brain: StudyLoop can publish your study plans, today's
next action and your due reviews into a place you already read.

Nothing about this release changes what StudyLoop does if you do not configure
it. There is no second_brain: section in a fresh config, and without one no
provider module is imported, no file is written, and the wind-down protocol says
nothing about it.

What is new

  • studyloop brain — status, publish, pull, enable and template.
    publish writes a projection of a plan, of today, and of your due review
    cards; pull reads one note of yours back when you ask it to.
  • Obsidian, by writing plain files. Notes land in the folder you name inside
    the vault you name. StudyLoop overwrites only files carrying its own
    studyloop: frontmatter marker, never follows a symbolic link out of the
    vault, and republishing an unchanged plan writes nothing at all.
  • Your plan document stays the only source of truth. No backend, command or
    agent path writes back to it. Your own notes for a plan live in a sibling
    .notes.md file that StudyLoop only ever reads.
  • An Obsidian template (studyloop brain template --install) mirroring the
    plan document's sections, so a plan you write by hand and one StudyLoop
    published look the same. Templates carry no ownership marker: a note you make
    from one is yours.
  • xTiles, stage 1. Your assistant moves today's study and your whole plan
    into xTiles over its MCP connector. The Second Brain guide ships the three
    prompts, and studyloop install agents installs an opt-in wind-down skill.
    There is no programmatic xTiles client yet, and StudyLoop stores no xTiles
    credential.
  • One skill, installed once. The wind-down skill lives in
    ~/.agents/skills/ and is symlinked into each harness that documents a skills
    directory, so there is one file to read and one file to update.
  • studyloop config init offers to enable it after you accept a vault. It
    defaults to no, and declining writes nothing.

Honest limitations

  • Obsidian is the only provider with a programmatic backend. xTiles goes through
    your assistant, so what reaches xTiles is whatever your assistant sends.
  • A projection you hand-edit is replaced on the next publish, with a warning
    naming the file. Personal notes belong in the sibling .notes.md.
  • The vault boundary is enforced on every write, but a component of the path
    above the vault folder could in principle be replaced between the check and
    the write by someone who already has write access to your vault. This is a
    documented limitation, not a fixed one — see ADR-0010.
  • The wind-down offer's pacing is a property of a language model, not of code.
    Static guards prove the offer is present and conditional; a recorded
    transcript is what shows it is offered once.
  • The 0.1.0 limitations still stand: install is from a source checkout, and the
    Web UI is a laptop and tablet layout.

Withdrawn before release

An adapter for the official Obsidian CLI was built during development and
removed after a three-model review. It resolved its target by vault name, so a
second vault with the same name could receive the note, and it passed note text
as a command-line argument where another user on the machine could read it.
Writing the file directly is all this feature ever needed.

The keys use_cli, vault_name, template and daily_note now raise a
configuration error rather than being ignored. daily_note used to append a
line to your own daily note, and anyone who set it should be told it stopped.

Upgrade

Nothing to do. If you want the layer:

studyloop brain enable obsidian --vault ~/Obsidian/YourVault
studyloop brain publish
studyloop doctor

Verification

Run just release-check for the current automated release gate, just e2e for
the browser suite, and just docs for the strict public-documentation build.
The release decision cites the generated evidence from those runs, and the
multi-model review record under reviews/2026-09-03-second-brain/, never a test
total copied into this note.

StudyLoop 0.1.0 (pre-release)

Choose a tag to compare

@NetDevAutomate NetDevAutomate released this 03 Sep 08:18

v0.1.0 Release Notes

First public pre-release.

What StudyLoop is

StudyLoop is a local-first, AuDHD-aware study companion. It combines live
Socratic mentoring, Body Double sessions, study plans, spaced review, and a
searchable record of real learning sessions.

Version 0.1.0 is intentionally pre-1.0: the learner experience is usable, but
installation and public interfaces may still change as real users try it.

Mentor harnesses

The core pre-release contract is:

  • Kiro CLI, which is also used for the public demo;
  • Codex;
  • Claude Code.

OpenCode and pi are included as preview integrations. Their install, launch,
resume, export, doctor, automated-test, and live-turn results are tracked in
release evidence rather than asserted from static prose.

Each harness writes its own real conversation into the shared session database.
StudyLoop does not create generated-looking placeholder conversations or
progress rows when a harness, exporter, or extraction model fails.

What works

  • Study Session: an energy-aware Socratic mentor in the browser or terminal.
  • Body Double: one visible goal, a timer, and a quiet agent workspace.
  • Review: flashcards, quizzes, teach-backs, weak-link views, and spaced
    repetition.
  • Study plans: local plan documents, milestones, evidence, and checkpoints.
  • Session memory: exports from the five admitted harnesses into SQLite, with
    optional Obsidian mirroring.
  • Content generation: validated flashcard, quiz, and practice artefacts from
    live local or cloud model providers.

Honest limitations

  • Installation is from a source checkout; there is no PyPI or Homebrew release.
  • The Web UI requires the local studyloop web service and is built for laptop
    and tablet layouts. Phone widths get a usable bottom tab bar rather than a
    broken one, but a phone is not a supported layout and no journey is tested at
    that size.
  • Practice-task generation and verification are currently CLI workflows.
  • An agent-led planning interview is not integrated into the Web UI yet.
  • Two headline journeys have no automated end-to-end coverage, because both need
    a live agent or model provider that CI does not have: the Socratic study
    conversation itself, and generate-then-review for flashcards and quizzes. Each
    is exercised by hand. Everything else in the browser workspace runs on every
    change; the current pass count is in the release-gate evidence (just release-check), not copied here, so this note can never go stale on that
    number.
  • Live struggle extraction requires an explicitly selected Bedrock model and
    fails closed when the model or credentials are unavailable.
  • Automated verification and manual learner-journey acceptance are recorded as
    separate release evidence.

Install

git clone https://github.com/NetDevAutomate/StudyLoop studyloop
cd studyloop
./scripts/install.sh
studyloop setup
studyloop doctor --fix

Then run studyloop web and follow docs/first-week.md.

Verification

Run just release-check for the current automated release gate and just docs
for the strict public-documentation build. The release decision should cite the
generated evidence from the run, never a test total copied into this note.

v2.5.0

Choose a tag to compare

@github-actions github-actions released this 13 Apr 13:18

[2.5.0] - 2026-04-13

Bug Fixes

  • ci: Scope pyright to src/, upgrade 4 vulnerable deps
  • ci: Fix formula update sed to only replace main package SHA
  • Handle empty arrays under set -u in install/uninstall links
  • Make parked topic priority migration idempotent

Documentation

  • Compound solution record for v2.4.0 codebase remediation
  • Refresh architecture and release docs
  • Add just workflow to readme

Features

  • Add codex cli support and harden study sessions
  • Finish remediation backlog and install flow

v2.4.0

Choose a tag to compare

@github-actions github-actions released this 08 Apr 20:01

[2.4.0] - 2026-04-08

Bug Fixes

  • Path traversal, dead tests, install.sh version check
  • exporters: Protocol consistency, archive schema, incremental import
  • types: Resolve 73 pyright errors across test files
  • web: Restore missing Alpine stores, remove dead split.js ref

CI/CD

  • Add bandit SAST, pin action SHAs, add uv audit

Documentation

  • Document split-pane resize bug and layout redesign solution
  • Cleanup obsolete docs and add codebase review

Features

  • adapters: Extract agent logic into plugin architecture

Refactoring

  • Fix layer violations, UTC timestamps, dead code
  • settings: Data-driven load_settings, complexity 19→9
  • session: Extract _handle_start to session/start.py
  • session: Decompose end_session_common, complexity 19→4
  • query: Split query_logic.py into 3 focused modules

Testing

  • Add coverage for embeddings.py and semantic_search.py

v2.3.0

Choose a tag to compare

@github-actions github-actions released this 08 Apr 08:04

[2.3.0] - 2026-04-08

Bug Fixes

  • test: Update SW test to accept self-destruct mode

Features

  • web: Redesign study session layout — sidebar feed + full terminal + status bar

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Apr 18:47

[2.2.0] - 2026-04-06

Bug Fixes

  • Rename merged workflow to publish.yml for PyPI trusted publisher
  • Auto-migrate parked_topics table + add timer pause/reset controls
  • Security hardening + SSE optimization + parking dedup + docs update
  • Tmux pane creation — auto-switch, sidebar launch, bundled config
  • Tmux split sizing — switch client before split, drop hardcoded dimensions
  • Textual import — work decorator moved to textual namespace in 8.x
  • Clean panes + respect user's tmux config
  • Don't auto-load bundled tmux config — preserves user's theme
  • PERSONA_DIR path traversal — was 4 parents, needs 5
  • Web background launch uses studyctl entry point, not uv run
  • Resume blocked by stale session state after cleanup
  • Resume reuses session dir + saves session context to DB
  • Check Claude projects dir for resume detection, not .claude/ in cwd
  • Sidebar Q sends C-c to agent before cleanup
  • Reduce study session latency — CLAUDE.md + concise persona
  • Sidebar Q sends /exit not C-c, studyctl wrapper + PATH for agent
  • Add cli/main.py + wrapper integration tests
  • Sidebar Q test passes + resume -r flag verification
  • Resolve CI failures, Copilot review comments, and study session bugs
  • Exclude integration tests from pre-push pytest hook
  • Kill orphaned sidebar/agent processes after test suite
  • Doctor Kiro binary name (kiro → kiro-cli) + agent smoke tests
  • Sidebar Pilot test race — add await pilot.pause() before widget query
  • Wire adapter mcp_setup() call in session start
  • Doctor exit code aborts CI before filter runs + simplify .gitignore
  • Auto-create sessions DB on first use + atomic state file writes
  • Stale mock targets in test_mcp_tools + update roadmap
  • Obfuscate test Slack token to pass GitHub push protection
  • Multi-agent cleanup — crash recovery, MCP paths, schema drift
  • Claude trust bypass, browser polling, LAN URL display
  • Browser open survives os.execvp + draggable split-pane layout
  • Terminal panel visibility + browser open via os.fork
  • Session dashboard fills viewport when split-container is active
  • Add 'Return to inline' button on pop-out placeholder
  • Tmux dotted lines + iframe survives pop-out round-trip
  • Tmux window-size largest + iframe always loaded behind placeholder
  • Replace broken return-to-inline with clear instructions
  • Security and reliability — path traversal, format injection, file locking, PID cleanup
  • Content CLI signatures, code dedup, and 226 new tests
  • SSE duplicate div, flashcard_count API key, E2E demo test
  • 2 pre-existing bugs in query_logic.py
  • Always read lan_username from config, not just when password is empty
  • Always read lan_username from config, not just when password is empty
  • eval: Persona target starts sessions headlessly via internal API
  • eval: Increase LLM timeout to 120s, surface error details in judge
  • eval: Capture agent pane by ID, add debug logging to capture.py
  • eval: Two-phase capture + trust specific session dirs
  • eval: Auto-accept Claude Code trust dialog during eval sessions
  • eval: Compare pane content by value, not length (TUI agents)
  • eval: Correct Bedrock model ID to us.anthropic.claude-sonnet-4-6
  • eval: Clear pane ID on teardown to prevent stale pane reuse
  • eval: Increase capture timeouts for Claude Code response times
  • ci: Resolve nightly-install, CI test, and UAT failures
  • ci: Apply base schema before migrations on fresh DB
  • ci: Add --agent to double-start test, skip nested tmux on CI
  • ci: Pass -m integration to per-file UAT steps
  • doctor: Remove dead eval check left behind when eval moved to dev/
  • Propagate STUDYCTL_* env vars to tmux cleanup subprocess
  • test: Use .first for duplicate terminal panel locators in E2E tests

CI/CD

  • Add nightly UAT workflow for tmux integration tests

Documentation

  • Fix version refs, Python 3.12+ requirement, and doc consistency
  • Update roadmap, TODO, and CLI reference for v2.1.0
  • Update all user-facing docs for core-only compaction
  • Add live session dashboard brainstorm
  • Add unified session architecture brainstorm
  • Compound learnings — parallel research catches plan assumptions
  • Update README, CLI reference, and roadmap for studyctl study command
  • Update CLI reference, README, roadmap for session lifecycle
  • Add system overview — full component map with Mermaid diagrams
  • Update TODO.md with v2.2 live session dashboard progress
  • Add solution doc for tmux session management and CI fixes
  • Update TODO.md with v2.2.1 completed items and next steps
  • Update roadmap with v2.2.1 completed, clean next phases
  • Comprehensive TODO with study backlog, testing mandate, estimates
  • Add session handoff for 2026-04-02
  • Add session handoff for 2026-04-03
  • Comprehensive system architecture with PlantUML diagrams
  • Update architecture, roadmap, and test counts for v2.2 completion
  • Fix stale references — query_sessions split, config unification, FCIS paths
  • Add v2.2 release handoff — remaining refactors plan
  • Compound solution doc — SQLite schema drift + CI mock targeting
  • Update all documentation for current architecture
  • Add Phase 6 complete handoff for next session
  • Compound learning — multi-agent adapter mcp_setup() gap
  • Update artefact links
  • Update artefact links
  • Update roadmap — multi-agent complete, v2.2.0 scope defined
  • Update all documentation for ttyd + multi-agent cleanup
  • Update roadmap, CLI reference, and .gitignore for v2.2.0 local LLMs
  • Add content pipeline, TUI, and web UI user guides
  • Persona optimisation Tier 2 design spec
  • Persona eval implementation plan — 13 tasks across 4 chunks
  • Persona optimizer loop plan + session handoff
  • Add autoresearch persona optimizer runbook
  • Add CI workflow failures solution (7 root causes)
  • Add C4 architecture diagrams (context, container, component)

Features

  • Add live session foundation — parking lot persistence, session CLI, IPC protocol
  • Add cmux native dashboard — Phase 1.5 agent protocol + MCP config
  • Add web PWA live session dashboard — Phase 2
  • Add studyctl study command — Phase 1 unified session architecture
  • Auto-cleanup when agent exits + sidebar end-session binding
  • Persistent session directories for AI conversation history
  • Pomodoro countdown timer in Textual sidebar
  • Studyctl topic command + persona CLI instructions + resume context
  • Integration tests with mock agent — 7 pass, real tmux sessions
  • Comprehensive integration tests — 22 pass, full lifecycle
  • Add bridge CLI command + 4 E2E experience verification tests
  • Add studyctl clean command with FCIS architecture
  • Tmux-resurrect compatibility — auto-clean, docs, doctor check
  • Study backlog phase 1 — topics CRUD, auto-persist, agent surfacing
  • Study backlog phase 2 — AI prioritization, MCP tools, session-db integration
  • Vendor HTMX, Alpine.js, SSE extension, OpenDyslexic for offline PWA
  • V2.2 Phase A — break suggestions, energy streaks, MCP registration, vendor Inter
  • V2.2 Phase B — nested tmux UAT and --end from outside tests
  • Phase 6 CI/CD — nightly install, pre-release gate, backup/restore
  • Phase 2 multi-agent support — wire Gemini, Kiro, OpenCode adapters
  • Migrate session-db-mcp server from extract_session_to_db
  • Ttyd integration — web terminal, --lan flag, browser auto-open
  • Same-origin ttyd proxy + LAN password protection + pop-out fix
  • Local LLM support — Ollama and LM Studio adapters
  • Study briefing — cohesive loop connecting content, review, and sessions
  • Autoresearch iterate runner + persona effectiveness tracking
  • web: Unified sidebar navigation with 4 content views
  • web: Rewrite flashcard/quiz engine as Alpine.js components
  • web: Alpine Pomodoro store, delete app.js + session.html
  • Topic_slug in session DB + LAN username/password config
  • Web session start/end, tmux safety guard, LAN auth tests, content CLI tests
  • eval: Autonomous persona evaluation harness — 13 tasks, 130 tests
  • Autoresearch Phase 3 — reporting, regression detection, CI workflow
  • eval: Add AWS Bedrock provider for LLM judge
  • eval: Add judge feedback for persona prompt optimisation
  • eval: Log agent response, judge scores, dimensions, and feedback
  • persona: Autoresearch-optimised study mentor persona
  • persona: Autoresearch-optimised co-study companion persona

Refactoring

  • Consolidate test infrastructure and document conventions (#1)
  • Move clean_logic to package level + wire service layer
  • Create logic/ subpackage + fix parking table schema drift
  • Clean up config loader, split query_sessions monolith, fix CI failures
  • 3 quick fixes from comprehensive code review
  • Split god modules — history/, session/, topics.py + SM-2 fix
  • Code quality sweep — circular deps, deduplication, agent config consistency
  • eval: Replace tmux capture with claude -p print mode
  • Remove eval harness module (moved to dev/)
  • Remove dead EvalConfig from settings (eval moved to dev/)

Testing

  • Add sidebar Q cleanup test (xfail — tmux send-keys vs Textual)
  • Add harness matrix agent and test_harness_matrix.py
  • web: Add 13 Playwright sidebar E2E tests, update terminal tests
  • content: Add integration tests for generate, download, list, delete CLI
  • Fill coverage gaps found during v2.2.0 audit
  • Add web CLI command tests (7 tests)

Compact

  • Strip to 4 core features, prune CLI to 13 commands, fix doctor tests

Merge

  • Resolve conflicts with main (local LLMs + PID safety)