Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
240 commits
Select commit Hold shift + click to select a range
5e10d4d
fix(acpproc): widen set_model retry schedule for large-context model …
inercia Jul 5, 2026
af11824
fix(agents): correct mcp-list.sh config paths for claude-code, codex,…
inercia Jul 5, 2026
3b48ef1
fix(acpproc): recycle degraded shared ACP process via GC health-tier …
inercia Jul 5, 2026
3328edd
feat(config): make model-capability tags always-available and runtime…
inercia Jul 5, 2026
81507fc
fix(web): hide overflow shortcut buttons on narrow screens
inercia Jul 5, 2026
e07e5f6
fix(acp): recognize agent heap-OOM and stop surfacing misleading set-…
inercia Jul 6, 2026
e62f64f
fix(beads): fall back to stdout when bd exits non-zero with empty std…
inercia Jul 6, 2026
4c81048
feat(web): auto-unarchive loop conversations after ACP failure recovers
inercia Jul 6, 2026
eb01619
fix(web): keep error toasts visible until manually dismissed
inercia Jul 6, 2026
a6c0125
docs: note Auggie MCP git-root workspace divergence
inercia Jul 6, 2026
699614e
feat(prompts): per-channel Slack support knowledge files, need-info f…
inercia Jul 6, 2026
14cfacc
fix(acpproc): recycle confirmed-degraded shared ACP process even whil…
inercia Jul 6, 2026
9faa686
fix(beads): surface schema-version skew as actionable HTTP 409 instea…
inercia Jul 6, 2026
d684122
fix(web): fold all prompt-source mtimes into workspace-prompts Last-M…
inercia Jul 6, 2026
46b10c4
fix(acpproc): extend session/new budget for cold MCP-init on Auggie (…
inercia Jul 6, 2026
c9782ec
fix(config): surface prompt file load errors instead of silent drop (…
inercia Jul 6, 2026
1973684
fix(acpproc): rate/rolling-window saturation trigger for intermittent…
inercia Jul 6, 2026
a9ccbc9
feat(agents): config-driven per-agent stderr crash/ignore patterns in…
inercia Jul 6, 2026
dc3f1e3
feat(acpproc): wire degraded stderr pattern into rolling-window satur…
inercia Jul 6, 2026
067bbb3
feat(acpproc): adaptive ACP/MCP pre-warming — warm, probe health, pin…
inercia Jul 7, 2026
bcbc0d0
fix(acpproc): re-arm MCP-init progress on every handshake episode (mi…
inercia Jul 7, 2026
7d250de
fix(conversation): add watchdog to deferred session/new handshake (mi…
inercia Jul 7, 2026
fd3a451
feat(web): toast for prewarm-pin-alert WebSocket message (mitto-yns)
inercia Jul 7, 2026
eea071d
fix(web): bound concurrent interactive session resumes on cold start …
inercia Jul 7, 2026
9cbf025
test(mcpserver): guard warm-up fast-path against cold-start starvatio…
inercia Jul 7, 2026
1bb48dd
docs: mark cold-start inbound /mcp starvation gap as fixed (mitto-54k)
inercia Jul 7, 2026
9a4c969
fix(prompts): persist Slack support drafts to the bead before review
inercia Jul 7, 2026
2752212
feat(prompts): add "Support: housekeeping" sweep prompt
inercia Jul 7, 2026
5cb0041
fix(conversation,acpproc): don't block first interactive prompt on co…
inercia Jul 7, 2026
ca51477
fix(web): isolate MITTO_DIR in TestHandleWorkspacePrompts_FileDeleted…
inercia Jul 8, 2026
5943826
fix(beads): recover valid JSON from non-zero bd exit; retry reads on …
inercia Jul 8, 2026
949ab93
feat(coldstart): unified phase tracer + host-contention sampler + sem…
inercia Jul 8, 2026
a88d5a5
docs: refresh cold-start MCP wedge notes in CLAUDE.md
inercia Jul 8, 2026
11d63e9
feat(config): add BeadsCount/HasBeads CEL + template functions
inercia Jul 8, 2026
6bfd3c9
feat(prompts): gate support-housekeeping on HasBeads + add priority step
inercia Jul 8, 2026
8244727
fix(prompts): scope reproduce-bug/submit-changes out of conversation …
inercia Jul 8, 2026
e9466bf
refactor(web): convert BeadsView list-level prompts dropdown to group…
inercia Jul 8, 2026
45070b8
refactor(web): rename "Make loop" conversation menu action to "Loop"
inercia Jul 8, 2026
49cc318
fix(mitto-753): fix data race in TestStartStderrMonitor_MCPInit* tests
inercia Jul 8, 2026
f08fde9
fix(mitto-54k.6): treat cold-start MCP-init timeout as transient duri…
inercia Jul 8, 2026
b9e5ec1
fix(mitto-clc): inactivate proactive keep-warm; keep reactive unhealt…
inercia Jul 8, 2026
1520dae
fix(mitto-z70): stop amplifying cold wedges (aux-bail + load-not-foun…
inercia Jul 8, 2026
72a0a9a
docs: refine cold-start MCP wedge root-cause diagnosis
inercia Jul 8, 2026
d597f6b
feat(mcpserver): add inbound MCP request logging middleware
inercia Jul 8, 2026
ccade4b
fix(beadsLinkify): support hyphenated-prefix project IDs (mitto-rix)
inercia Jul 8, 2026
5ea488a
feat(chat-input): pre-select last sent prompt when converting to loop…
inercia Jul 8, 2026
882a35c
feat(workspaces): add per-workspace Restart ACP button in MCP tab
inercia Jul 8, 2026
8118ea7
chore(prompts): rename 'Iterate fixing bug(s)/implementing feature(s)…
inercia Jul 8, 2026
5a59beb
feat(prompts): improve support workflow closure detection and bead ID…
inercia Jul 8, 2026
9a66bb4
perf(coldstart): spread aux-session prewarm + rush-on-demand for fork…
inercia Jul 8, 2026
8fd150f
fix(mcpserver): serve /mcp POST responses inline via JSONResponse to …
inercia Jul 8, 2026
d6124e7
chore(lint): fix QF1001 De Morgan + remove unused coldTraceID (mitto-…
inercia Jul 9, 2026
9e810c6
feat(cli): add 'mitto prompt' single-shot debugging harness (mitto-r8j)
inercia Jul 9, 2026
3792c87
chore(prompts): refine loop-until to onCompletion self-driving flow +…
inercia Jul 9, 2026
eaee248
test(cli): add unit tests for 'mitto prompt' command (mitto-r8j)
inercia Jul 9, 2026
dd82516
fix(conversation): bound cold-start resume handshake to one budget (m…
inercia Jul 9, 2026
8561aed
chore(acp): bump ACP SDK to v0.13.5 + migrate model selection to conf…
inercia Jul 9, 2026
db0b13d
test(acp): migrate mock ACP server + integration tests to v0.13.5 con…
inercia Jul 9, 2026
4d1215f
fix(conversation): release shared handshake budget for session/new af…
inercia Jul 9, 2026
b0b72ea
chore(prompts): forbid personal/user-specific content in generated Au…
inercia Jul 9, 2026
3539305
fix(web): dismiss standalone beads issue overlay after starting a con…
inercia Jul 9, 2026
65965e0
mitto-02u: detect and warn on multiple workspace UUIDs sharing one wo…
inercia Jul 9, 2026
b61d9b6
feat(coldstart): resume-storm detection (mitto-7o2)
inercia Jul 9, 2026
af2df94
BeadsView: add Close (X) button next to fullscreen toggle in issue de…
inercia Jul 9, 2026
cd5b7f8
fix(conversation): clear stale persisted acp_session_id on session/lo…
inercia Jul 9, 2026
8bec26c
fix(acpproc): treat auggie -32603 'context deadline exceeded' as retr…
inercia Jul 9, 2026
1fcdbad
fix(web): dedupe ACP started/stopped broadcasts within a 2s window
inercia Jul 9, 2026
c6afbab
feat(coldstart): add per-workspace rollup to mitto_coldstart_recent
inercia Jul 9, 2026
59328a1
feat(config): initial model preference for new conversations
inercia Jul 9, 2026
cbf4f2e
docs(rules): clear stale acp_session_id on load failure (mitto-y1g)
inercia Jul 9, 2026
08eee8b
test(config): unit tests for OpenTarget/OpenInConfig defaults and leg…
inercia Jul 9, 2026
a4d19a7
feat(web): action=open target_id in /api/badge-click (mitto-bbi.2)
inercia Jul 9, 2026
f19e36d
feat(settings): Open In targets section in UI tab (mitto-bbi.3)
inercia Jul 9, 2026
066ab12
Revert 59328a1a: move initial-model preference to workspace level (ke…
inercia Jul 9, 2026
78c0f5e
feat(sessionlist): collapse folder context menu into Open submenu (mi…
inercia Jul 9, 2026
25c58c0
feat(config): per-workspace initial-model preference for new conversa…
inercia Jul 9, 2026
85cc546
docs+test: document Open In config and add Playwright context-menu sp…
inercia Jul 9, 2026
88e611c
fix(sessionlist): gate 'Open ▸' folder submenu on native macOS app on…
inercia Jul 9, 2026
a5c0388
ui(sessionlist): reorder folder context menu — submenus first (New, O…
inercia Jul 9, 2026
06652bf
refactor(open-in): remove legacy BadgeClickAction/TerminalAction, rou…
inercia Jul 9, 2026
1c2f90d
docs(rules): document isNativeApp() helper and Playwright stubbing fo…
inercia Jul 9, 2026
ade510c
fix(websocket): remove stale-session age gate that killed live reconn…
inercia Jul 9, 2026
06b4799
chore(prompts/support): simplify priority rule — customer-court state…
inercia Jul 9, 2026
04b47a7
feat(prompts): register 'prompts' parameter type (mitto-85y.1)
inercia Jul 10, 2026
50c85fa
Frontend: prompts picker in PromptParameterDialog (mitto-85y.2)
inercia Jul 10, 2026
c2b85ab
fix(beads): map silent bd non-zero exits to 404 + log exit code (mitt…
inercia Jul 10, 2026
9409e23
feat(prompts): add PromptText(name) template function (mitto-85y.3)
inercia Jul 10, 2026
381c7ac
feat(prompts): add 'Loop prompt until ...' builtin (mitto-85y.4)
inercia Jul 10, 2026
052a158
feat(settings): guided ACP-server delete with per-folder reassign (mi…
inercia Jul 10, 2026
8701425
feat(processors): model-tag gating for delegate-* + CEL drift-guards …
inercia Jul 10, 2026
eb158bd
support prompts: expand to conversation/prompts menus + channel playbook
inercia Jul 10, 2026
55f3d42
feat(settings): add up/down reorder buttons to Models tab (mitto-ex7.3)
inercia Jul 10, 2026
e4edb3a
docs(models): document 'list order = priority' + regression test (mit…
inercia Jul 10, 2026
374b26b
feat(config): split default 'Claude Sonnet' into Sonnet 5 + Sonnet 4 …
inercia Jul 10, 2026
2526eef
docs(models): sync docs + rules with Sonnet 5/4 split (mitto-ex7.5)
inercia Jul 10, 2026
efa6bd3
feat(models): audit initial + aux model selection for profile-order p…
inercia Jul 10, 2026
33aef3a
feat(processors): conversationClosed trigger + extract-memories-on-cl…
inercia Jul 10, 2026
84d8180
fix(processors): broaden delegate-to-coder gate + canonical tag vocab…
inercia Jul 11, 2026
a5ac5d4
feat(config): ACPServerSettings.ModelTag for tag-based profile resolu…
inercia Jul 11, 2026
8d2a9ce
ui(settings): cap Models tab tags at 4 visible + "+N" overflow badge
inercia Jul 11, 2026
89933c3
feat(processors): fire close-phase processors on delete + pin workspa…
inercia Jul 11, 2026
ed714f4
fix(workspace-lint): downgrade mixed-ACP duplicate-dir to INFO (expec…
inercia Jul 11, 2026
4c3f753
fix(beads): wrap long tokens in comments on narrow viewports
inercia Jul 11, 2026
81fe75a
test(config): compile-check enabledWhen on all builtin prompts
inercia Jul 11, 2026
ab4a519
support-reply-to-user: record verbatim posted reply (with user edits)…
inercia Jul 11, 2026
77b02fe
feat(models): finish mitto-ex7.4 — ACPServerSettings.ModelTag audit +…
inercia Jul 11, 2026
33e97bc
feat(web): broadcast session_beads_issue_updated on link change
inercia Jul 11, 2026
2c8992b
fix(loop): split iteration cap logging + clarify safeguard docs
inercia Jul 11, 2026
b0edb43
feat(ui): ⌘⇧L keyboard shortcut to loop / unloop conversation
inercia Jul 11, 2026
6f7fb93
feat(processors): add curate-memories-on-close builtin (mitto-9li)
inercia Jul 11, 2026
04f5330
fix(beads): layer timeouts so read-heavy bd calls survive busy dolt D…
inercia Jul 12, 2026
8ba5d0c
fix(loop): per-workspace loop-dispatch concurrency guard (mitto-61z)
inercia Jul 12, 2026
7cb67d5
feat(config): add folder-native `pinned` flag to folders.json (mitto-…
inercia Jul 12, 2026
0cebcfb
feat(web): add /api/folders/pin endpoint to toggle folder sidebar vis…
inercia Jul 12, 2026
a72c04e
feat(sidebar): render pinned empty folders in the unified sidebar tre…
inercia Jul 12, 2026
c4e9f33
feat(sidebar): 'Remove from sidebar' context-menu action to unpin an …
inercia Jul 12, 2026
ef35bfd
feat(sidebar): empty-state hint inside expanded empty folder (mitto-8…
inercia Jul 12, 2026
e3be471
feat(sidebar): "Add folder" dialog + toolbar entry point (mitto-8nv.4)
inercia Jul 12, 2026
7d5a40f
docs(sidebar): pinned folders / empty-folder feature (mitto-8nv.8)
inercia Jul 12, 2026
a2b523b
docs(sidebar): correct handler filename (folder_pin.go, singular)
inercia Jul 12, 2026
a722f37
test(config,web): folder-pin persistence + handler tests (mitto-8nv.7…
inercia Jul 12, 2026
7ea34cb
test(sessionGrouping): pinned empty folders in unified tree (mitto-8n…
inercia Jul 12, 2026
cd651ea
test(playwright): pinned empty folders in sidebar (mitto-8nv.7 Playwr…
inercia Jul 12, 2026
da98a2f
fix(web): re-project folder-native fields in SyncConfigWorkspaces (mi…
inercia Jul 12, 2026
bce742c
fix(web): re-project folder-native fields in handleGetWorkspaces + en…
inercia Jul 12, 2026
5aeb40e
fix(mcp): auto-complete overrides stale-task reports so children_task…
inercia Jul 12, 2026
68c475c
fix(processors): gracefully skip on-close batch when workspace ACP pr…
inercia Jul 12, 2026
22d8527
feat(config): per-ACP-server initial-model preference (mitto-fqj)
inercia Jul 12, 2026
197074a
feat(dashboard): aggregate /api/dashboard endpoint (mitto-aqo.1)
inercia Jul 12, 2026
2ac9547
feat(dashboard): add 'dashboard' mainView + placeholder component (mi…
inercia Jul 12, 2026
0f3f9d6
feat(dashboard): add Dashboard entry to sidebar tree (mitto-aqo.2)
inercia Jul 12, 2026
d200656
feat(dashboard): stats-header component with 15s polling (mitto-aqo.4)
inercia Jul 12, 2026
8e839d4
feat(dashboard): carousel with 4 lists (mitto-aqo.5)
inercia Jul 12, 2026
f9a0d3f
feat(dashboard): click handlers for list items (mitto-aqo.6)
inercia Jul 12, 2026
8d6eff8
test(dashboard): unit + Playwright coverage (mitto-aqo.7)
inercia Jul 12, 2026
4e33842
Route to Dashboard on active-conversation removal and cold start (mit…
inercia Jul 12, 2026
08dc509
Dashboard: paged 2-column grid + Home icon in sidebar (mitto-3sb)
inercia Jul 12, 2026
3d8f969
Dashboard: fix prompting count/list (isStreaming, not is_prompting) (…
inercia Jul 12, 2026
cc10ea2
Dashboard: strip page indicator + dots, move arrows to edges
inercia Jul 12, 2026
d584adb
Conversation lists: show name/description, not session_id
inercia Jul 12, 2026
b2c96d3
Dashboard: sort Ready + Epics by priority before capping at 5
inercia Jul 12, 2026
e59ee38
Dashboard: pad every list panel to MAX_LIST_ITEMS rows for stable height
inercia Jul 12, 2026
6e72478
Dashboard: add horizontal padding around pagination arrows
inercia Jul 12, 2026
a9029ee
Dashboard: pad panels only to align siblings on the SAME page
inercia Jul 12, 2026
d27ab6b
Dashboard: always pad panels to MAX_LIST_ITEMS (fixed height, all vie…
inercia Jul 12, 2026
b4c4864
Dashboard: drop carousel, render all four lists in responsive grid
inercia Jul 12, 2026
08660f2
Dashboard: widen column breakpoints so iPad shows one column
inercia Jul 12, 2026
56d13f2
feat(dashboard): add new icons and adjust SessionList
inercia Jul 12, 2026
36fb65f
test(dashboard): update dashboard and sidebar-toolbar specs
inercia Jul 12, 2026
63207e6
docs(mitto-qcm): frontend bundler spike — recommend C (no Vite)
inercia Jul 12, 2026
ce01c50
Dashboard: replace daisyUI stats with plain grid — .stats-horizontal …
inercia Jul 13, 2026
1bc1eec
Dashboard: sort in_progress by priority-first, not recency
inercia Jul 13, 2026
82944b5
test(conversation): cover workspace/ACP-server resolution paths in re…
inercia Jul 13, 2026
f9e63e8
refactor(conversation): extract resolveResumeTargetLocked from resume…
inercia Jul 13, 2026
845dd99
refactor(mcpserver): extract UI prompter handlers into tools_ui.go (m…
inercia Jul 13, 2026
9d2cfd3
Dashboard: replace "Epic tasks" panel with "Recently modified"
inercia Jul 13, 2026
86e01a3
refactor(mcpserver): extract conversation history handler into tools_…
inercia Jul 13, 2026
18e3136
refactor(mcpserver): extract children tasks coordination into tools_c…
inercia Jul 13, 2026
f55d700
refactor(mcpserver): extract conversation wait + heartbeat helper int…
inercia Jul 13, 2026
49b78a8
refactor(mcpserver): extract run_loop_now handler into tools_loop.go …
inercia Jul 13, 2026
077ea39
support prompts: need-info means we ACTUALLY posted the clarifying qu…
inercia Jul 13, 2026
ad5f4d0
refactor(mcpserver): extract global tools (workspace/config/runtime/c…
inercia Jul 13, 2026
9548441
refactor(mcpserver): extract send_prompt_to_conversation handler into…
inercia Jul 13, 2026
5550e58
refactor(mcpserver): extract conversation-new cluster into tools_conv…
inercia Jul 13, 2026
e1de775
refactor(mcpserver): extract conversation CRUD handlers into tools_co…
inercia Jul 13, 2026
2df4bae
refactor(mcpserver): extract tool registration wiring into tool_regis…
inercia Jul 13, 2026
f0e3334
refactor(web): extract WorkspaceEditor.js from WorkspacesDialog.js (m…
inercia Jul 13, 2026
b155f4f
refactor(web): extract WorkspaceFolderEditor.js from WorkspacesDialog…
inercia Jul 13, 2026
05f0d05
refactor(web): extract Beads/Prompts tabs from WorkspaceFolderEditor.…
inercia Jul 13, 2026
0a064dd
refactor(web): extract useBeadsFolderConfig hook from WorkspacesDialo…
inercia Jul 13, 2026
7f3be88
fix(acpproc): use mitto CLI binary (not mitto-app) for stdio MCP proxy
inercia Jul 13, 2026
b51e51b
refactor(web): extract useFolderPromptsConfig hook from WorkspacesDia…
inercia Jul 13, 2026
0645ec7
refactor(web): extract useFolderProcessorsConfig hook from Workspaces…
inercia Jul 13, 2026
5ecd038
refactor(web): extract useFolderShortcutsConfig hook from WorkspacesD…
inercia Jul 13, 2026
49cefdf
refactor(web): extract useFolderMetadataConfig hook from WorkspacesDi…
inercia Jul 13, 2026
f3caee3
refactor(web): extract WorkspacesLeftPanel from WorkspacesDialog.js (…
inercia Jul 13, 2026
6938050
refactor(web): extract useFolderGeneralEdits hook from WorkspacesDial…
inercia Jul 13, 2026
13c1ab9
refactor(web): extract useWorkspacesSaveCoordinator hook from Workspa…
inercia Jul 13, 2026
2774a77
refactor(web): extract useWorkspaceMcpTools hook from WorkspacesDialo…
inercia Jul 13, 2026
b68478a
refactor(web): extract useWorkspaceEdits hook from WorkspacesDialog.j…
inercia Jul 13, 2026
1ca5c01
refactor(web): extract useWorkspaceMcpActions hook from WorkspacesDia…
inercia Jul 13, 2026
72150a0
refactor(web): extract useWorkspaceMutations hook from WorkspacesDial…
inercia Jul 13, 2026
5adea89
refactor(web): extract McpInstallDialog component from WorkspacesDial…
inercia Jul 13, 2026
0c6a79a
refactor(web): extract useWorkspacesData hook from WorkspacesDialog.j…
inercia Jul 13, 2026
dda6cc1
refactor(web): extract checkAuth helpers to utils/websocket.js (mitto…
inercia Jul 13, 2026
9d1479d
refactor(web): extract keepalive/stagger constants to utils/websocket…
inercia Jul 13, 2026
4ddcc78
refactor(web): extract useWSSeqSync sub-hook from useWebSocket.js (mi…
inercia Jul 13, 2026
dd548db
refactor(web): extract useWSWorkspaces sub-hook from useWebSocket.js …
inercia Jul 13, 2026
7da3f43
refactor(web): extract useWSQueue sub-hook from useWebSocket.js (mitt…
inercia Jul 13, 2026
60fb5c5
refactor(web): extract useWSNotifications sub-hook from useWebSocket.…
inercia Jul 13, 2026
3a9d0b0
refactor(web): fold backgroundCompletion into useWSNotifications sub-…
inercia Jul 13, 2026
738e4d8
refactor(web): extract useWSConfigOptions sub-hook from useWebSocket.…
inercia Jul 13, 2026
8776751
refactor(web): extract useWSSessionSelectors sub-hook from useWebSock…
inercia Jul 13, 2026
93721ab
refactor(web): extract useWSActionButtons sub-hook from useWebSocket.…
inercia Jul 13, 2026
f40e69b
refactor(web): extract pure helpers (readBeadsResponse, matchesSearch…
inercia Jul 13, 2026
e401403
test(web): retarget BeadsView tests to utils/beads.js + add error-env…
inercia Jul 13, 2026
bc963c1
refactor(web): move pure-data constants from BeadsView.js to utils/be…
inercia Jul 13, 2026
e5914c3
refactor(web): extract badges from BeadsView.js to components/beads/B…
inercia Jul 13, 2026
c0e2493
refactor(web): extract CommentBody from BeadsView.js to components/be…
inercia Jul 13, 2026
4b51e86
refactor(web): extract labelValue helper from BeadsView.js to compone…
inercia Jul 13, 2026
545af28
refactor(web): extract leaf Field sub-components from BeadsDetailPane…
inercia Jul 13, 2026
5410958
refactor(web): extract AssigneeField+NotesField from BeadsDetailPanel…
inercia Jul 13, 2026
09ecf7b
refactor(web): extract DescriptionField from BeadsDetailPanel to comp…
inercia Jul 13, 2026
6d110bd
refactor(web): extract DependenciesCreateField+DependenciesViewField …
inercia Jul 13, 2026
0d5066a
refactor(web): extract CommentsSection from BeadsDetailPanel to compo…
inercia Jul 13, 2026
3e7d8d4
refactor(web): extract SubtasksList+DetailActionBar from BeadsDetailP…
inercia Jul 13, 2026
f8e82ee
refactor(web): extract BeadsDetailPanelBody from BeadsDetailPanel to …
inercia Jul 13, 2026
17eea94
refactor(web): extract useBeadsDetailPanel hook from BeadsDetailPanel…
inercia Jul 13, 2026
78a1037
refactor(web): extract useIssueLabels sub-hook from useBeadsDetailPan…
inercia Jul 13, 2026
3d4271a
refactor(web): extract useIssueComments sub-hook from useBeadsDetailP…
inercia Jul 13, 2026
326b695
refactor(web): extract useCreateMode sub-hook from useBeadsDetailPane…
inercia Jul 13, 2026
cf9290c
refactor(web): extract usePanelChrome sub-hook from useBeadsDetailPan…
inercia Jul 13, 2026
65406f2
refactor(web): extract useViewEdit sub-hook from useBeadsDetailPanel …
inercia Jul 13, 2026
8daa59a
refactor(web): extract DependenciesCluster from useBeadsDetailPanel t…
inercia Jul 13, 2026
10f4fda
refactor(web): extract useWSMobileResilience sub-hook (mitto-90f.6.1)
inercia Jul 13, 2026
d77fbdd
refactor(web): extract useWSConnection sub-hook (C1) from useWebSocke…
inercia Jul 13, 2026
6861548
refactor(web): extract useWSDeliveryVerification sub-hook (C2) from u…
inercia Jul 13, 2026
2864ffa
fix(web): correct secureFetch import path in beads detail hooks
inercia Jul 13, 2026
025fdfa
refactor(web): move prevSelectedWorkspaceKeyRef ownership to Workspac…
inercia Jul 13, 2026
d17449a
feat(web): compact two-line Dashboard rows with folder-icon workspace…
inercia Jul 13, 2026
a52df62
feat(prompts): add state:out-of-scope and closed-bead protection to s…
inercia Jul 13, 2026
28a04ce
feat(prompts): reconcile support threads per-ticket (read-then-reconc…
inercia Jul 13, 2026
31ef98b
fix(web): dashboard subscribes to beads_changed WS event (mitto-523)
inercia Jul 13, 2026
9bda62b
beads: add CachingClient decorator with in-memory read cache (mitto-i…
inercia Jul 13, 2026
7b951d7
web: wire beads CachingClient behind --beads-cache flag (mitto-is2.2)
inercia Jul 13, 2026
03c3035
web: subscribe beads CachingClient to BeadsWatcher for external inval…
inercia Jul 13, 2026
66ca157
web/handlers: add integration test for CachingClient writer-side inva…
inercia Jul 13, 2026
d95866d
feat(beads): mitto-is2.5 CachingClient metrics + mitto_beads_cache_me…
inercia Jul 13, 2026
ce9d2e8
refactor(session): consolidate buildMigrationContext into MigrationCo…
inercia Jul 14, 2026
770ac3b
fix(loop): auto-pause loop after 3 consecutive context-window (413) f…
inercia Jul 14, 2026
5ecaca0
feat(beads): mitto-is2.5 flip --beads-cache default to true
inercia Jul 14, 2026
e9e80b0
fix(beads): mitto-is2.5 apply --beads-cache default in macOS app path
inercia Jul 14, 2026
d427340
feat(beads): mitto-y21 cache Show() per (dir,id) — fix ticket re-open UX
inercia Jul 14, 2026
afe1793
feat(acpproc): log RSS parent/descendant breakdown in GC recycle logs…
inercia Jul 14, 2026
1708d65
fix(acpproc): widen auxSessionCreateBudget 30s→60s to fund NewSession…
inercia Jul 14, 2026
3218b16
feat(agents): raise Node/V8 old-space heap cap to 12 GB for builtin A…
inercia Jul 14, 2026
d0bfd24
fix(handshake): tighten stale-load probe timeout 45s→25s (mitto-54k.9)
inercia Jul 14, 2026
a350f89
fix(mcp): reject placeholder-shaped loop-driver seed in mitto_convers…
inercia Jul 14, 2026
24cfbf0
fix(prompts): switch beads-issue-loop drivers to prompt_name spawns +…
inercia Jul 14, 2026
7de44ad
fix(prompts): render "What's next" cell as Slack thread link in suppo…
inercia Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .augment/rules/01-go-conventions.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ for attempt := 1; attempt <= maxAttempts; attempt++ {

**Key principle**: Only *tighten* deadlines, never extend. `shouldFailFastCreateAttempt` bails when remaining budget < per-attempt timeout.

### Cross-Package Mirrored Constants Drift

When a package can't import another (e.g. `internal/conversation` can't import `internal/acpproc`), it may hardcode a **local mirror** of a schedule/budget constant, flagged with a comment like `// Mirror of shared_acp_process.go set_model constants` (see `internal/conversation/constraints_test.go`'s `scheduleSum`). Changing the source constant does **not** auto-update the mirror.

**Rule**: When changing a retry schedule/timeout constant, `grep` for comments referencing it (e.g. the old sum/values) across the whole module — not just the owning package — and update every mirror + stale doc comment describing the old math in the same change.

## Explicit Lock Management in Retry Loops

`defer mu.Unlock()` does **not** compose safely with manual unlock + retry. If the locked variable is reassigned during retry, defer fires on the wrong object → double-unlock panic.
Expand Down
2 changes: 2 additions & 0 deletions .augment/rules/02-session.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ Stored in `loop.json`. Only top-level sessions may have loop prompts (child →

**Critical**: Changing `LoopStore.Update()` signature requires updating BOTH `session_loop_api.go` (PATCH handler) AND `mcpserver/server.go` (MCP tool) — both call `Update()`.

**Un-loop/re-loop persistence symmetry**: `Detach()` saves settings to a slot and clears the active config (un-loop); `GetSaved()`/restore reads it back. A fresh loop `Set()` (not a restore) must be followed by `ClearSaved()` so a stale saved slot doesn't leak in later — required in both `session_loop_write.go` (`handleSetLoop`) and `mcpserver/server.go` (MCP create-loop path).

## Auxiliary Package

The `internal/auxiliary` package provides a hidden ACP session for utility tasks. Lazy init, auto-approve permissions, file writes denied, thread-safe.
Expand Down
1 change: 1 addition & 0 deletions .augment/rules/03-cli-acp.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,4 @@ Located in `config/agents/builtin/<agent>/` (shipped) or `MITTO_DIR/agents/custo
**MCP scopes**: `user` (global), `project` (per-repo), `local` (uncommitted).
**Agent defaults** (seeded at discovery): Pre-fill ACP server settings. Request-wins: user values take precedence.
**Commands**: `mcp-list.sh`, `mcp-install.sh`, `mcp-remove.sh` (scope must match metadata).
**stderrPatterns** (mitto-k6h): Optional per-agent regex patterns applied by the ACP stderr monitor. `crash` (union with hardcoded baseline → `onCrashDetected` bypasses SDK 60s timeout), `ignore` (suppress from debug log; buffer capture unaffected), `degraded` (plumbed only, behaviour deferred). Compiled once at process start; invalid regex is skipped with a warn (never fatal). CI guard: `make check-stderr-patterns`. Compile happens in `internal/web` (only layer with both `agents.Manager` and ACP-server mapping); `*conversation.CompiledStderrPatterns` is injected into `SharedACPProcessConfig`/`BackgroundSessionConfig` via a per-server-name resolver. See [docs/devel/acp.md § Stderr Pattern Detection](../../docs/devel/acp.md).
6 changes: 4 additions & 2 deletions .augment/rules/07-prompts.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,9 @@ Updates replicate the 5-layer REST API merge. Name slugification via `config.Slu

## enabledWhen Filtering & Preferred Models

Server-side via `filterPromptsByEnabled()` / `buildPromptEnabledContext()`. Use `enabledWhen` (CEL) exclusively. Full CEL context: see `05-msghooks.md`. Useful functions: `FileExists(".git/config")`, `CommandExists("gh")`, `Tools.HasPattern("github_*")`.
Server-side via `filterPromptsByEnabled()` / `buildPromptEnabledContext()`. Use `enabledWhen` (CEL) exclusively. Full CEL context: see `05-msghooks.md`. Useful functions: `FileExists(".git/config")`, `CommandExists("gh")`, `Tools.HasPattern("github_*")`, `BeadsCount("label", "open,in_progress")` / `HasBeads("label", "open,in_progress")`.

**Beads gating (`BeadsCount` / `HasBeads`)**: query the workspace's `bd` (beads) DB from CEL AND Go templates. Both accept two comma-separated string args — `labels` (ALL match) and `statuses` (ANY match) — and run `bd list -l <labels> --status <statuses> --all --json` in `Workspace.Folder` (5s timeout, 5s in-memory cache). **Fail-open**: missing `bd`, non-zero exit, unparseable JSON, or timeout returns a positive sentinel (count=1 / true) so gated prompts are never wrongly hidden; a legitimate `[]` returns 0/false. Always short-circuit with cheap gates first so `bd` isn't exec'd when there's no DB: `CommandExists("bd") && DirExists(".beads") && HasBeads("support-question", "open,in_progress")`. Shared pure-Go helper (`beadsCount` in `internal/config/templatefuncs.go`) is the single source of truth for both surfaces — the CEL macros (`beadsCountMacro`, `hasBeadsMacro`) auto-inject `Workspace.Folder`.

**Per-conversation user data (`UserData`)**: exposed as a `map[string]string` in both the template context (`{{ UserData "NAME" }}` / `{{ index .UserData "NAME" }}`) and CEL (`UserData["NAME"]` / `"NAME" in UserData`), built from the same conversation attributes that back `Session.UserDataJSON`. Wired exactly like `Args` (struct field + `cel.Variable` + `buildActivation` normalization + template func), but populated at **both** menu time (`buildPromptEnabledContext`) and send time (`buildProcessorInput`) — the parity invariant — so menu gating and body rendering agree. Use it for set-if-unset, else-do-Y flows; the opaque `UserDataJSON` blob cannot drive a per-field conditional.

Expand All @@ -175,7 +177,7 @@ Prompts may declare preferred model(s) for auto-selection at prompt-dispatch tim

```yaml
preferredModels:
- modelName: Claude Sonnet # matches a profile by its `name` (case-insensitive)
- modelName: Claude Sonnet 4 # matches a profile by its `name` (case-insensitive)
- modelTag: Coding # selects any profile carrying this tag (case-insensitive)
```

Expand Down
8 changes: 5 additions & 3 deletions .augment/rules/08-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ Per-workspace config via RC files (`{workspace}/.mittorc` or `.mitto/mittorc[.ya

## Workspace Persistence

Workspaces persisted in `workspaces.json` (except CLI `--dir`). `folders.json` (crash-safe) holds folder-level settings; metadata stays in `.mittorc` (version-controllable).
Workspaces persisted in `workspaces.json` (except CLI `--dir`). `folders.json` (crash-safe) holds folder-level settings; metadata stays in `.mittorc` (version-controllable). Folder-level settings include a `pinned` bool (defaults `false`) that, when `true`, keeps the folder visible in the sidebar even without conversations; toggled via `GET/PUT /api/folders/pin` (`internal/web/handlers/folder_pin.go`) and projected onto workspace records by `ApplyFolderDefaults`.

## Global Settings REST API

Expand All @@ -101,15 +101,17 @@ Note: `/mitto/api/settings` manages global `settings.json`. For per-session feat
models:
- name: Claude Opus # UI label (read-only)
criteria: { matchMode: contains, pattern: Opus } # Case-insensitive pattern matching
tags: [Smartest, Reasoning, Expensive] # Interface-only semantic tags
tags: [Smartest, Reasoning, Expensive] # Capability tags, consumed at runtime
```

**Tag union matching** (additive): If a model name matches multiple profiles (e.g., `Claude Opus 4.5`):
- First: Matches `Claude` profile → `[Anthropic]`
- Then: Matches `Opus` profile → Adds `[Smartest, Reasoning, Expensive]`
- Result: `[Anthropic, Smartest, Reasoning, Expensive]` (union)

Use `matchMode: contains` for robust cross-version matching. Tags are interface-only; runtime consumption is tracked separately (see `mitto-2cc`). Shipped defaults include: Claude, Opus, Sonnet, Haiku, GPT-5, GPT-4, Gemini. Test: `TestParse_EmbeddedDefaultModelProfiles()` in `internal/config/config_test.go`.
Use `matchMode: contains` for robust cross-version matching. Shipped defaults include: Claude, Opus, Sonnet, Haiku, GPT-5, GPT-4, Gemini. Test: `TestParse_EmbeddedDefaultModelProfiles()` in `internal/config/config_test.go`.

**Canonical Go defaults (always available, not just first-run seed)**: `config.DefaultModelProfiles()` hardcodes the same 7 profiles in Go — the single source of truth, kept in sync with `config.default.yaml`'s `models:` block by `make check-model-tags`. `(*Config).EffectiveModelProfiles()` returns `settings.json`'s `Models` unioned with these defaults (user profile wins on name collision, defaults fill gaps; nil-safe). All tag/name resolution — `ModelProfileByName`, `ModelProfilesByTag`, `ResolveModelTags` — routes through `EffectiveModelProfiles()`, so a prompt's `preferredModels: {modelTag: Coding}` resolves even when `settings.json` predates or omits `models:` (previously it silently no-opped to the baseline model — this was the root cause of `preferredModels` "not working" for users with pre-existing settings). `config.CanonicalModelTags()` returns the sorted, de-duped tag set; `make check-model-tags` rejects any builtin prompt's `modelTag` that isn't in this set.

## ACP Server Constraints

Expand Down
5 changes: 4 additions & 1 deletion .augment/rules/09-macos-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@ touch Mitto.app && killall Finder && killall Dock

## Environment Detection

Prefer the shared `isNativeApp()` from `web/static/utils/native.js` (re-exported by `utils/index.js`) over redefining the predicate inline. Implementation: `typeof window.mittoPickFolder === "function"` — `mittoPickFolder` is the sentinel bound only by the WKWebView host. Use it to gate any UI whose action requires a bound `window.mitto*` function (e.g. the folder-header "Open ▸" submenu in `SessionList.js`).

```javascript
const isMacApp = typeof window.mittoPickFolder === "function";
import { isNativeApp } from "../utils/index.js";
if (!isNativeApp()) return []; // hide native-only UI in browser context
```

### Bound Native Functions
Expand Down
19 changes: 18 additions & 1 deletion .augment/rules/15-web-backend-session-lifecycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,23 @@ The GC suspends idle loop sessions whose next prompt is far away, saving ACP res
| `inactivity` | `ArchiveReasonInactivity` | Auto-archive after configured inactive period|
| `acp_start_failures`| `ArchiveReasonACPFailures` | `ACPStartFailureCount` ≥ threshold (3) |

Broadcast in `session_archived` WebSocket message as `archive_reason` field.
Broadcast in `session_archived` WebSocket message as `archive_reason` field. `acp_start_failures` on a loop conversation is the only reason eligible for Auto-Unarchive Recovery (below).

## Auto-Archive

Config: `session.auto_archive_inactive_after: "1w"` (in `checkAutoArchive()`). Excluded: already-archived, child sessions, sessions with loop prompts (enabled or paused).

## Auto-Unarchive Recovery

Loop conversations auto-archived due to broken ACP (`ArchiveReasonACPFailures`) are retried automatically by `LoopRunner.checkAutoUnarchiveRecovery()`, called from `RunOnce()` right after `checkAutoArchive()`.

- **Eligibility**: `meta.Archived && meta.ArchiveReason == ArchiveReasonACPFailures` + loop config exists. Excludes `Manual`/`Inactivity` and non-loop ACP-failure archives.
- **Retry cadence**: 1h per conversation (`DefaultAutoUnarchiveRetryInterval`), anchored on `Metadata.AutoUnarchiveLastAttemptAt` else `ArchivedAt`. Retries indefinitely — the resume-failure path re-archives on continued outage, restarting cadence from the new `ArchivedAt`.
- **Anti-storm stagger**: 10m global minimum gap (`DefaultAutoUnarchiveStaggerInterval`), tracked in-memory (`LoopRunner.lastAutoUnarchiveAttempt`, `r.mu`); each poll attempts only the most-overdue eligible session. **Never `time.Sleep`** in this path — it stalls loop delivery.
- **On-by-default**: `autoUnarchiveEnabled=true`; `SetAutoUnarchiveRecovery(enabled, retryInterval, stagger)` — duration `<= 0` keeps current value (lets tests override one).
- **Callback** (`onAutoUnarchive`, wired in `server.go`): mirrors manual unarchive — clear archive fields → `ResumeSession()` → broadcast → `handlers.RestoreLoopOnUnarchive()`.
- **Cadence persistence**: `attemptAutoUnarchive()` persists `AutoUnarchiveLastAttemptAt` (outside `r.mu`) *before* the callback so it survives a crash; cleared only on `nil` return. Also cleared on any successful manual unarchive (`session_update.go`).

## ACP Process Crash Recovery

`classifyACPError()` → **Permanent** (command not found, syntax error) = stop + guidance. **Transient** (network, crash) = retry with backoff.
Expand All @@ -89,6 +100,12 @@ Death detection (three layers): OS polling (~2s), `conn.Done()` EOF (~seconds),

When ACP handshake times out transiently, `BackgroundSession.InitializeWithACP()` defers retry up to 3 attempts with exponential backoff. The error event is persisted in the session event log (viewable in UI). Retries happen deferred in a separate goroutine to avoid blocking session creation or WebSocket initialization. After 3 attempts, the session enters error state with guidance.

## Shared Handshake Budget: Stale vs. Cold-Timeout (anti-regression)

`internal/conversation/shared_session_handshaker.go` bounds concurrent `session/load` + `session/new` handshakes with **one shared deadline** to prevent stacking (`mitto-1ut`). The budget cap MUST be **released** for the `session/new` fallback when the `session/load` probe **timed out** (process genuinely cold) — otherwise `session/new` inherits only `budget − probeTimeout` (e.g. `240s − 45s = 195s`), less than a single `MCPInitTimeout` attempt (240s), guaranteeing starvation. Only cap the fallback when the probe **fast-failed** (JSON-RPC `-32602` stale). Track this via `probeTimedOut`. Test seam: `loadBlocksUntilCtxDone` in `fakeSharedProcess` (`TestHandshaker_ResumeSharedACPSession_ColdProbeTimeout_NoNewDeadline`). Pre-attempt cancellations in `acpproc/shared_acp_process.go` emit a self-diagnosing error (elapsed vs. per-attempt budget) instead of a raw deadline.

**Clear persisted `acp_session_id` on load failure (`mitto-y1g`)**: In `resumeSharedACPSession`, both load-failure branches (`-32602 Session not found` **and** probe timeout) must call `hsClearPersistedACPSessionID()` before falling back to `session/new`. Otherwise the stale ID stays on disk and every subsequent cold-start / process recycle re-triggers the same doomed `session/load` — catastrophic when an always-active loop session is one of the offenders (each recycle burns the probe cap before the `session/new` fallback). Mirror `hsPersistACPSessionID`; assert both branches clear in the regression test.

## MCP Server Lifecycle

| Event | MCP Server Action |
Expand Down
5 changes: 5 additions & 0 deletions .augment/rules/20-web-frontend-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ App
└── Dialogs (Settings, Workspace, Rename, Delete, etc.)
```

### Sidebar Tree Sources

`SessionList` synthesizes its folder groups from **two sources**: (a) the working directories of active + stored conversations, and (b) any configured workspace whose `folders.json` entry has `pinned: true`. This lets users keep folders visible in the sidebar even when they hold no conversations — pinned via the sidebar toolbar's `AddFolderDialog`, unpinned via the folder context menu's "Remove from sidebar" entry (both call `PUT /api/folders/pin`).

## File Structure

| File | Purpose |
Expand All @@ -58,6 +62,7 @@ App
| `components/Icons.js` | SVG icon components |
| `components/SessionPanel.js` | Unified side panel (Properties + User Data tabs) |
| `components/SettingsDialog.js` | Settings modal |
| `components/AddFolderDialog.js` | "Add folder to sidebar" dialog: pin existing hidden workspace or delegate to WorkspacesDialog for a new one |
| `hooks/useWebSocket.js` | WebSocket connection management |
| `hooks/useResizeHandle.js` | Drag-to-resize with mouse and touch |
| `hooks/useSwipeNavigation.js` | Mobile swipe gestures |
Expand Down
2 changes: 1 addition & 1 deletion .augment/rules/25-web-frontend-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ const { showToast, dismissToast, toasts } = useToast();
showToast({ message: "Saved", style: "success" }); // auto-dismiss 5s
```

Durations: info/success=5s, warning/error=10s. Max 5 simultaneous. Render via `<ToastContainer />`. Use `error` (red) for actual errors only.
Durations: info/success=5s, warning=10s. `error` toasts NEVER auto-dismiss — they persist until the user closes them (dismiss button), so critical errors can't be missed. Max 5 simultaneous. Render via `<ToastContainer />`. Use `error` (red) for actual errors only.

## useResizeHandle / useSwipeNavigation

Expand Down
17 changes: 17 additions & 0 deletions .augment/rules/32-testing-playwright.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,23 @@ In Docker, ACP connections take ~1.1s. After clicking new-session, **wait for `m
await page.waitForFunction(() => !!localStorage.getItem("mitto_last_session_id"));
```

## Testing Native-App-Gated UI

For features gated on `isNativeApp()` (`web/static/utils/native.js`), stub the sentinel `window.mittoPickFolder` **before navigation** with `page.addInitScript` — Playwright runs in a plain browser, so `isNativeApp()` returns `false` by default.

```typescript
async function stubNativeApp(page) {
await page.addInitScript(() => {
Object.defineProperty(window, "mittoPickFolder",
{ configurable: true, get: () => () => {}, set: () => {} });
});
}
```

**Apply per-test, NOT in `beforeEach`** — move `helpers.navigateAndWait(page)` into each test so a negative test can navigate un-stubbed to assert the gated UI is absent. Cover both positive (stubbed → visible) and negative (un-stubbed → hidden) paths in the same spec. Reference: `tests/ui/specs/open-in-context-menu.spec.ts`.

Same rule applies when patching backend config the frontend reads once via `fetchConfig()` on mount (e.g. `ui.mac.open_in` targets): PATCH it in `beforeEach` **before** the first `navigateAndWait`, otherwise the mount reads stale defaults.

## Browser-Specific Issues

| Issue | Browser | Cause |
Expand Down
Loading
Loading