Repository navigation
v0.4.2 — auto-merge on Done, board-viewer integration, StreamReader fix
Builtin auto-merge on Done, board-viewer launcher integration, and a
StreamReader limit fix that unblocks long agent turns. Drop-in over
0.4.1; auto-merge is ON by default but safe-by-default (dirty host or
missing branch skips silently).
Added
agent.auto_merge_on_done(default true) — when a ticket reaches
Done, fold thesymphony/<ID>branch into the host repo's
development branch as one selective-apply commit. Paths in
agent.auto_merge_exclude_paths(default
kanban/llm-wiki/prompt/docs) are stripped first so the workspace
symlinks thathooks.after_createinstalls never reach the host
repo.agent.auto_merge_target_branchdefaults to""= the host
repo's currently-checked-out branch.tui-open.shnow auto-startstools/board-viewer/server.pyin the
background athttp://127.0.0.1:8765/when the workflow ships one.
Skipped silently if the port is held or the file is absent.src/symphony/auto_merge.py— new module owning the selective-apply
flow with five outcome events:auto_merge_completed,
auto_merge_skipped_dirty,auto_merge_skipped_missing_branch,
auto_merge_nothing_to_apply,auto_merge_failed.- Learn-stage wiki entries now open with a beginner explainer block
(## 감 잡기in Korean,## Getting the Feelin English) ahead of
the existing Summary / Invariants / Files / Decision-log technical
reference. Same file, two layered audiences — PMs and 기획자 land on
the beginner block, engineers scroll past it. The prompt enforces the
tutor shape: 3-5 step core flow, exactly five plain-language terms,
one realistic scenario, one-sentence takeaway, and a "ready to go
deeper" pointer. Branch is{% if language == 'ko' %}keyed on the
same{{ language }}env that drives the chrome/doc directive, so
switching the TUI language (orSYMPHONY_LANG) flips both halves of
the wiki entry in lockstep. Bothdocs/symphony-prompts/file/stages/learn.md
anddocs/symphony-prompts/linear/stages/learn.mdupdated.
Fixed
claude_code,pi,geminibackends now spawn their subprocess with
limit=10 MiBon the asyncioStreamReader, matchingcodex. The
asyncio default of 64 KiB was raisingLimitOverrunErroron
stream-json events whoseresult/tool-use payload exceeded that on a
single line, dropping the rest of the turn intostalled_session
recovery. Caught on a live IB-002 turn before the fix landed._on_worker_exit(reason="normal")at Done now fires
auto_merge_on_done,after_doneuser hook, andworkspace.remove
inline. Previously those only ran on the reconcile-driven termination
path; a worker that finished cleanly at Done was popped from
_runningbefore the next reconcile cycle, so the entire
terminal-state post-processing was silently skipped — the host repo
never saw the auto-merge commit and the workspace lingered.
_reconcile_runningremains the safety net for stale workers.
Tests
tests/test_auto_merge.py— five scenarios: happy path,
dirty host, missing branch, implicit current-branch target,
all-paths-excluded. Full suite: 353 passed, 6 skipped.