History
One entry per session, appended, never rewritten.
2026-09-15 — Diátaxis documentation bootstrap (agent "riker")
- Asked:
/diataxis-doc— start documenting the project, excluding./kitsand./tmp. Ran in parallel with another agent adding/new. - Changed: created
docs/(language selector) with full four-quadrant trees indocs/en/anddocs/fr/, identical file names: 1 tutorial, 4 how-to guides, 6 reference pages, 3 explanations per language, plus both indexes. Linked the/newhow-to page anddocs/diagrams/packages.drawiowritten by the other agent. No Go code touched. - Decisions: language "Both" taken from the methodical-dev convention (user unavailable, skill's mandatory question skipped and recorded here). Shipped skill layout defect documented in how-to/reference rather than fixed.
- Verified:
go buildOK; banner output for both YAML files captured verbatim;go test ./...fails onmm/internal/skills(test points at../../../demo/skills). All relative links indocs/resolve. - Docs: everything under
docs/. Created.memory/skeleton.
2026-09-15 — /new slash command (terminal + ACP), quality gate set-up, first .memory/
- Goal: add
/newto themmagent to clear the history and start a fresh session, in the terminal REPL and over ACP; exclude./kitsand./tmpfrom the quality measurement. Run by agent "bob" viamethodical-dev, autonomously (the user was not available for the skill's approval gates), while agent "riker" wrote the rest ofdocs/in parallel. - Changes: new package
internal/session(NewCommand,NewCommandName,IsNewCommand,Fresh,Forgotten) + tests;detector.Reset()+ first tests forinternal/detector;internal/agent/agent.go(/newhandling,startNewSession, banner,if/else→switchfor staticcheck QF1003, both front ends now start fromsession.Fresh);internal/acp/acp.go(availableCommands,available_commands_updateinNewSession,/newinterception inPrompt,startNewSession,resetSession) + tests;main.gopackage list comment;.qlty/qlty.toml(created);.quality/(2 runs); docs (below);.memory/created. - Decisions:
/newresets history + engine token count + loop detector (REPL); ACP keeps session id / cwd / allow-always; only/newadvertised over ACP; notification sent insideNewSessionbefore the response; thesessionimport is aliasedhistoryinsideinternal/acpbecause that package already has asessiontype. Rejected: reusingcompactHistory's "keep the detector" rule for/new(different situation: the task changes); creating a git worktree (all files untracked); fixing the pre-existingdemo/skillstest path (layout decision for the user). - Tests:
go test ./...— all packages pass except the pre-existinginternal/skillsfailure (TestShippedSkillsHaveDescriptions, path../../../demo/skills)./newsmoke-tested end to end: piped REPL prints🆕 new session: 0 message(s) forgotten; scripted JSON-RPC client seesavailable_commands_updatethen thesession/newresponse, and/newanswered by anagent_message_chunk+end_turn. - Quality: gate FAIL, 2 iterations: warnings 69 → 67, smells 18 → 18, complexity 620 → 618. Fixed:
ineffassignin the new test, staticcheck QF1003 inagent.go. Remaining findings are all pre-existing (osv ongo.mod, errcheck, complexity ofagent.Runetc.) and out of this change's scope. Nothing was excluded beyondkits/**andtmp/**; no threshold changed. - Docs:
docs/{en,fr}/how-to/start-a-new-session.md(new);/newrows and ACP paragraphs indocs/{en,fr}/reference/slash-commands.mdandacp.md(riker's pages, edited in place); links in bothREADME.mdindexes;docs/diagrams/packages.drawio(new, fromgo list) referenced from bothexplanation/architecture.md.
2026-09-15 — Zed config fix in the editor how-to (orchestrator)
- Asked: the user reported that the Zed
agent_serverssnippet in the docs is insufficient — Zed requires"type": "custom"in the entry. - Changes: added
"type": "custom"to the JSON block indocs/en/how-to/use-from-an-editor.mdanddocs/fr/how-to/use-from-an-editor.md; recorded the requirement under "Decisions in force" insummary.md. - Tests / quality: docs-only change, none run.
2026-09-15 — ACP: /new was invisible in Zed's slash menu (orchestrator)
- Asked: the user reported that Zed lists commands for other ACP agents (docker agent) but shows "Available commands for mini-me: none" and rejects
/newas unknown. - Cause:
available_commands_updatewas sent insideNewSession, i.e. before the SDK wrote thesession/newresponse. Zed keys sessions on the id in that response and drops updates for an unknown session id. - Changes:
internal/acp/acp.go—Runnow builds the front vianewFront(e, system, tools, w, r); the SDK writes to aresponseWriterthat runs a per-session hook once the response line carrying that session id has been written;NewSessionregisters the hook (context.WithoutCancel(ctx), the request context dies with the method) instead of callingSessionUpdatedirectly.acp_test.go—TestResponseSessionIDMatchesOnlySessionResponses,TestAvailableCommandsAreSentAfterTheSessionNewResponse(drives the real SDK over pipes, reads the raw lines back). Docs:available_commands_updaterow indocs/{en,fr}/reference/acp.md;summary.mddecision updated, the "Zed slash menu" unknown removed. - Rejected: a goroutine with a
time.SleepafterNewSessionreturns (a race, just an unlikely one); sending the list on the firstsession/prompt(too late for the menu before the first message). - Tests:
go test -race ./internal/acp -count=5ok;go buildok; real binary over stdin shows the response line before the notification line. - Not verified: the menu in a real Zed (no Zed in the sandbox) — the user should retry.
2026-09-15 — ACP: /compact and /abort alongside /new (orchestrator)
- Asked: the user confirmed
/newnow shows in Zed and asked for the same for/compactand/abort. - Changes:
internal/acp/acp.go—compactCommand/abortCommandconstants,isCommand, three advertised commands,/abortintercepted inPromptbeforeturnMu(abortTurn→ sharedcancelTurn, also used byCancel),/compactafterturnMu(compactSession→compactHistory(ctx, s, cfg, summarize, explain) (line, compressed), engine-free and testable).internal/compact/compact.go—Result.Report()pluskilo/secondsmoved here frominternal/agent/agent.go, which now printsres.Report(). Tests:TestAvailableCommandsMatchWhatPromptIntercepts,TestIsCommandTrimsAndRequiresExactMatch,TestCompactHistoryOutcomes(3 sub-tests),TestCancelTurnFiresOnlyWhenATurnIsInFlight; the wire-order test now compares againstavailableCommands(). Docs EN+FR:reference/slash-commands.md(ACP section became a table),reference/acp.md(session/newrow, threesession/promptrows, commands table),how-to/use-from-an-editor.md(cancel + compress/restart bullets),how-to/manage-the-context-window.md. - Decisions:
/quitstays terminal-only;/compactover ACP is always forced (no automatic compaction exists in the ACP front end, unchanged);/abortanswers⚠️ No generation in progress.when idle rather than erroring. Rejected: handling/abortunderturnMu(it could never reach a running turn). - Tests:
go test -raceon acp/compact ok; fullgo test ./...still fails only on the pre-existinginternal/skillspath test. Real binary driven by a small JSON-RPC client: commands listnew, compact, abort;/abortidle →⚠️ No generation in progress.;/compact\non an empty history →🗜️ nothing to compact: 1 message(s), no turn older than the last 3; bothend_turn. - Not verified:
/abortagainst a real running generation (no model server in the sandbox) and the two new entries in Zed's menu.
2026-09-15 — mm killed on the user's Mac (orchestrator, diagnosis only)
- Asked: running
mmon the Mac prints[1] 55918 killed mm. - Findings: the repo's
./mmis a Mach-O (magicCF FA ED FE), so the user rebuilt natively after the sandbox builds (the sandbox produced linux/arm64 ELF binaries at the same path in between —mmis gitignored, fine). SIGKILL of a freshly built Go binary on macOS is the invalid-signature kill; most likely cause isinstall.shoverwriting/usr/local/bin/mmIN PLACE withcp(the kernel keeps the old inode's signature cached →Killed: 9), possibly compounded by the repo living in a kDrive-synced folder. Not verifiable from the sandbox. - Proposed, not applied:
sudo rm /usr/local/bin/mm && ./install.sh; makeinstall.shremove the target (or useinstall) before copying;codesign -vv /usr/local/bin/mmto confirm.
2026-09-15 — "the agent does not see the skills" (orchestrator, diagnosis only)
- Cause confirmed in code:
skills.Listglobs<skillsDir>/*.mdandskills.Readopens<skillsDir>/<name>.md, while the shipped skills live inskills/<name>/SKILL.md— soskills: 0andread_skillis never declared. Two aggravating factors: in terminal mode a relativeskillsDirresolves against the current directory, andagent.yamlhas been renamedagent.dmr.yamlby the user (no./agent.yaml→ built-in defaults; a ZedAGENT_CONFIGstill pointing toagent.yamlnames a missing file, whichconfig.Loadtreats as an error). - Proposed, not applied: make
List/Readaccept both layouts (*.mdand*/SKILL.md, name = directory), fix the test path../../../demo/skills→../../skills.
2026-09-15 — Skills layout fix, skillsDir resolution, /abort removed from ACP (orchestrator)
- Asked: fix the skills loader; make an installed
mm(/usr/local/bin) load the skills of the directory it is started from; drop/abortfrom ACP because Escape already cancels in Zed. - Changes:
internal/skills/skills.go—Listglobs both<dir>/*.mdand<dir>/*/SKILL.md,defaultNameuses the directory name for aSKILL.md,Readtries<name>.mdthen<name>/SKILL.md(flat wins); testsTestListAcceptsFlatAndNestedLayouts,TestReadAcceptsFlatAndNestedLayouts, shipped-skills test path →../../skills.main.go—resolveSkillsDir(dir, configPath, acpMode)makes a relativeskillsDirabsolute from the current directory (terminal, or ACP without config) or next to the config file (ACP with one); a[warning: no skills found in <abs path> (expected <name>.md or <name>/SKILL.md there)]line when the count is 0.internal/acp/acp.go—/aborthandling,abortTurn,cancelTurnremoved;Cancelback to its inline form;availableCommands()=new,compact; tests adjusted. Docs EN+FR:how-to/add-a-skill.md,reference/skill-format.md,reference/tools.md,reference/configuration.md,reference/cli.md,how-to/use-from-an-editor.md,reference/slash-commands.md,reference/acp.md.summary.md: known defects closed, skills decision added, ACP commands decision updated. - Decisions: both layouts accepted rather than moving the shipped files (the
<name>/SKILL.mdform is the Agent Skills convention); flat file wins when both exist; the warning is printed whenever 0 skills are found, with the resolved absolute path, because "skills: 0" alone was the user's whole problem. - Tests:
go test -race ./...all green (first timeinternal/skillspasses). Linux build to/tmp/mm-linux(NOT./mm, which is the user's Mach-O): from the repo root the banner listsread_skill; from/tmpit warnsno skills found in /tmp/skills. - Not verified: the Mac binary — the user must rebuild natively (
sudo rm /usr/local/bin/mm && ./install.sh).
2026-09-15 — @path notation in questions (orchestrator)
- Asked: mini-me must understand
@path/filein a question, without a picker. - Changes: new
internal/mention(Expand(input, cwd) (string, []Attachment),Attachment.Line()): mentions start the input or follow a space/bracket/quote, end at a space, lose trailing punctuation; resolved against cwd, absolute, or~/; only existing paths attach, once each, as[attached file: …]/[attached directory: …]lines appended to the text (same shape as ACPresource_link). Wired ininternal/agent/agent.go(cwd captured once inRun;📎 <abs>dim line per attachment) andinternal/acp/acp.go(afterflatten, againsts.cwd;[acp] session <id>: attached <path>on stderr). Tests: 4 inmention_test.go. Docs EN+FR: newhow-to/attach-a-file.md, README indexes,reference/slash-commands.md(new@pathsection),reference/acp.md(prompt content row),how-to/use-from-an-editor.md,explanation/architecture.mdpackage table,docs/diagrams/packages.drawio(node + edges from agent and acp). - Decisions: keep the sentence as typed and append the marker lines rather than rewriting the
@token (mirrors what Zed sends: text + resource_link); no inlining of content (bash-first agent reads it); paths with spaces unsupported (documented); non-existing paths silently left alone rather than warned (a@handlein a sentence is normal text). - Tests:
go test -race ./...all green. Linux build in/tmp: typingexplain @main.go and @internal, not @nothing.goprints two📎lines and none for the missing path.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|