[0.8.36] - 2026-11-11
Added
- DSH is a supported host.
mcptoon sync --selfnow writes the skill pointer
into$DSH_HOME/AGENTS.md. The contract was already there — the shell-capability
table readsDSH_SHELL(verified set to1inside a real DSH session), and the
pointer block was written with it in mind ("Codex (and DSH) mount no MCP, so the
handshakeinstructionschannel never reaches them") — but there was no row in
sync._AGENT_SPECS, so a DSH user got no pointer, nosync --selfand no
takeover, and had to hand-write the catalog line into their own instruction file.
The path followsDSH_HOMErather than a vendor constant, because DSH is
relocatable and one machine can run several instances with different homes
(measured: port 18085 →E:\dsh-next\home, port 18090 → its own);~/.dshis the
fallback.mcptoon sync --drynow scans 13 hosts and names DSH. - CLI discovery is counted.
manifest,inspect,searchandselectnow
record a usage line under the reservedmcptoonserver, the way the gateway's
own tools already did. Nothing counted them before, so on a CLI machine — the leg
whose design leans entirely on the model asking for the catalog instead of
receiving it —mcptoon usage --jsonreportednative_calls: 0on a machine with
522 routed calls, and there was no way to tell "nobody asked" from "nobody
counted the asking".mcptoon activitynow showsmcptoon:manifestbeside the
routed calls.
Changed
- The per-turn footer describes the reader, not the machine. On a machine whose
gateway is wired into other hosts while their direct entries remain
(serve-alongside), a reader that can run a shell was told未接管·未省on every
turn — a statement about four other applications, printed at an agent that was
already on the cheapest route there is (no MCP mounted, zero resident). Measured
on the machine this was found on: 16 days installed, 527 routed CLI calls,
resident_avoidedstill 0, and the headline never named the reader's own cost. A
reader whose environment identifies it as shell-capable (DSH_SHELL,
CLAUDECODE,CODEX_HOME,CURSOR_TRACE_ID) now gets its own figures —
CLI 路线 · 0 常驻 · 省 655,518/轮 · 539 次— while an unidentified or GUI reader
keeps the machine-global verdict, which is the true one for it. Unknown is
deliberately not treated as "shell-capable": guessing would print a CLI credit to
a host whose real cost is a serve figure. The/轮suffix was added after the
bare省 655,518read as a running total; the cumulative figure is a different
caliber (mcptoon reportmeasures it as a lower bound on the serve caliber and
says so). - The not-saving nudge names the subject. It used to read
现在还没省:跑 mcptoon sync --takeover, which is read as a claim about whoever is reading it —
how a CLI-leg session got told it was saving nothing. It now says另有宿主仍直连 32 条,每次照旧直接加载, so the entries are attributed to the hosts that hold
them.
Fixed
- Nothing said what to do when nothing is being saved. The tools line reported
未省, which is a status; a status does not tell a reader what to type. When the
mode isdirectorserve-alongside, the footer now carries one pasteable
command (mcptoon sync --takeoverormcptoon quickstart), throttled to at most
once per 24 hours and five times in total so it reads as a nudge rather than
nagging.--jsonstays read-only and does not spend the allowance, so a script
polling the figures cannot burn a human's. - The test suite no longer writes into a developer's real DSH home. Adding the
DSH row madesyncwrite pointers through$DSH_HOME, andtests/conftest.py
isolatedHOME,%APPDATA%andXDG_CONFIG_HOMEbut not that variable — so a
suite run appended the skill-pointer block to the live
$DSH_HOME/AGENTS.md(measured 1628 → 2368 bytes), i.e. the agent instructions of
whoever ran pytest.conftest.pynow pointsDSH_HOMEat a temp path and clears
the agent marker variables (DSH_SHELL,CLAUDECODE,CODEX_HOME, ...) for the
session, so which agent launched pytest can no longer change what the suite
asserts. Verified: the file's SHA-1 is unchanged across a full run.