Releases: NetDevAutomate/StudyLoop
Release list
v0.5.0
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.
v0.4.0
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-vecsidecar index.session-maint embedfills the backlog,
session-maint embed-check [--fix]audits alignment,studyloop doctor
reportsembeddings_alignment, and the export hook keeps vectors current. - Every agent-facing search (
session_searchover MCP,session-query, the
retrieval half ofmemory_search) goes through oneretrieval.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 withsemantic_search.hybrid: true, or for one process withSTUDYLOOP_RETRIEVAL_MODE=hybrid.
Installation
- A committed
.python-version(3.12) drivesuv syncanduv run;
studyloop install toolspasses the same minor to everyuv tool install;
./scripts/install.shprints 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.shis 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 bystudyloop study --mode plan-architect(orstudyloop 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 bystudyloop install agents/doctor --fix, with the
session-queryCLI 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-mcpandsession-db-mcpare the commands. - Grok Build sessions export automatically at session end; doctor reports
session_export_hook_grok.
Doctor and configuration
- New checks
exporter_schemaandexport_freshness; export hooks are pinned to
the installed binary and logged. agent-session-toolshonours a top-levelsession_db:withstudyloop's
precedence, so both packages open the same database. Doctor no longer flags
the configuration sections the setup guide recommends;studyloop setupwrites
agents.priorityrather 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_templateis 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 documentssession-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-checkruns the release consistency check in--pre-tagmode;
just release-verifyruns the strict form after tagging; a release note that
is still theprepare-releaseskeleton 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 ownjust release-checkrun is the gate);
acceptance install from a fresh clone in a user-like environment
(Homebrew Python 3.14 only, noUV_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
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-targetroute (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 newnoopener,noreferrertab; Obsidian
hands the current tab to theobsidian://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.mdwhen that note
exists inside the vault, falling back to the vault root. - The assistant destination handoff.
studyloop brain destination set --provider xtiles --url URLretains a reviewed, connector-returned page URL
without changing provider consent;destination clearremoves it. The
validator accepts HTTPS on exactlyxtiles.app/app.xtiles.appwith 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, synced0600temporary sibling, atomic replace
preserving the destination's mode.brain enableand 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, installsstudyloop[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
frommain.js's import graph. - Session memory became an installer/doctor invariant across all five
harnesses, topic exercises moved behind an explicit--devpreview 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 skippedjust 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 exactlyxtiles.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
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
v0.2.0 (superseded by 0.2.1)
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,enableandtemplate.
publishwrites a projection of a plan, of today, and of your due review
cards;pullreads 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.mdfile 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, andstudyloop install agentsinstalls 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 initoffers 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 doctorVerification
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)
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 webservice 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 --fixThen 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
[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
[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
[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
[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)