v0.34.0
The pending queue, cleared by the tool's own expert mode. All seven triaged issues on the
board (#413–#419) were worked in one day by autonomous /board expert auto sessions — one
isolated worktree and one persona-briefed agent per issue, launched in dependency-safe waves,
each finishing at a reviewed PR with recorded evidence and the merge held for the supervising
session. The batch fixes the fleet's two operational leaks (teardown handles, watch re-polling),
hardens /board plan with a prior-art gate, keeps large prose off the command line, and pivots
documentation from generated wiki pages to DeepWiki routing plus its MCP integration.
Fixed
-Sessions -Watchno longer re-polls every registered session on every 30-second cycle (#414).
Three related defects: (1) sessions already reportedLISTOin a prior cycle were re-polled on
every subsequent cycle — 31 zombie entries from 2026-07-13 drove ~33 API calls per cycle,
exhausting the 5 000/hr GraphQL quota within four watch runs. Fix: a$doneSettracks issues
already known to be done; at the start of each cycleReadSessionsoutput is filtered through
it, so a done session is never polled again. (2) zombie sessions (dead PID +workPathgone from
disk) were never pruned and kept accumulating insessions.json. Fix: injectable$IsStale
scriptblock detects these; when stale, the session is removed from the registry via
Remove-SessionRegistryEntry -Outcome stale-prune— zero API calls, noGetStatusprobe at all.
(3) whenghfailed due to a rate-limit error,Get-SessionLiveStatussilently fell back to
process-liveness and printedLISTO: proceso terminado— indistinguishable in the output from a
verifiedLISTO: PR merged. Fix:Get-SessionLiveStatuscaptures stderr with2>&1, checks
$LASTEXITCODE, and returns{ done=$false; reason='UNKNOWN (rate limit)'; rateLimited=$true }
on any rate-limit hit — never degrading to a PID signal that looks verified. The watch loop
prints rate-limited sessions inDarkYellowso the degraded state is visible. Four new Pester
tests cover: no re-poll after LISTO, stale-prune skips GetStatus, stale-prune writes
stale-pruneoutcome, rate-limited session never reported done.- Large inline text payloads no longer abort Board-Plan / Board-Handoff (#419). The tool-layer
path guard pattern-matches the full command string: prose containing slash-commands (/board,
/scan,/knowledge,/expert) passed as inline parameters was misread as a filesystem path
and caused the whole command to abort before the script ran — accounting for 65 field failures
across 945 sessions (Board-Plan.ps1 at 30.3% failure rate, Board-Handoff.ps1 at 22%). The fix
is to keep large payloads off the command line entirely.Board-Plan.ps1now accepts
-DescriptionFile,-ResearchFile, and-PriorArtFile(each a path to a plain-text file);
Board-Handoff.ps1now accepts-BodyFile(path to a JSON file withNextStep,Done,
OpenThreads,Traps,KeyFileskeys). Inline parameters remain supported unchanged for short
text. The newResolve-TextParamandRead-HandoffBodyFilepure helpers are covered by 14 new
Pester tests (file reads content, slashes treated as data, destructive text never executed,
missing-file and directory-path throw, file wins over inline — a field present in the JSON
overrides even when explicitly empty, while an absent field falls back to the inline default). -AutoCleanteardown now kills the Windows Terminal tab shell and deletes the worktree folder (#413).Board-Work.ps1 -Sessions -Watch -AutoCleanpreviously left thepwsh -NoExittab shell alive (its handle blockedgit worktree removefrom deleting the directory) and printed a manual-cleanup note. The fix: before runninggit worktree remove, teardown finds the tab's shell by its launch-script command line (launch-<n>.ps1— exact match on the issue number, so sibling sessions are never touched), kills it viaStop-ProcessTree, waits 500 ms for the OS to release the handle, then runsRemove-Itemaftergitde-registers the worktree. When no shell is found (session already closed, or non-wtlaunch), teardown falls back to the same attempt. Two helper additions:Find-WtTabShellCore(pure, testable) +Find-WtTabShell(thin CIM wrapper, mockable) inBoardWork.Processes.ps1; 6 new Pester tests including the "do not kill a different issue's shell" guard.Publish-DocsWiki.ps1no longer generatesDocs-Command-*wiki pages (#418).
commands/*.mdfiles are agent instruction files (system prompts addressed to an AI),
not documentation. Publishing them verbatim produced a 31 KBDocs-Command-Boardpage
full of internal recipes, script paths and conditional branches — instructions readable
only by the agent that would execute them. The_Sidebarno longer links to command
pages.Docs-Homeis now purely the README with HTML stripped. StaleDocs-Command-*
pages left in the wiki are automatically removed on the next publish (the clone-write-
git add -Acycle stages their deletion). The CI freshness step is annotated to explain
why "it generates" was never evidence that "it reads" — a check that cannot ask that
question will report green on garbage forever. For code and architecture reference, route
to DeepWiki instead of generating. 15 Pester tests updated; theDocs-Command-<X>
describe block (7 tests) was removed; 2 new tests (does NOT generate any Docs-Command-* pages,does NOT link to any Docs-Command-* page) enforce the invariant.
Added
/docsis now a router, not a generator (#417).commands/docs.mddocuments the split
between what is generated and what is routed:/docs wikigenerates pages from repo content
(README + knowledge registry) and pushes them to the GitHub Wiki;/docs deepwikiresolves the
repo, checks visibility, and reports (or navigates to) the AI-authored wiki on DeepWiki without
generating anything.commands/*.mdagent instruction files are explicitly excluded from
generation — publishing them verbatim produces AI system prompts dressed as documentation.
Three new Pester tests enforce the contract:commands/docs.mdmust not reference
Docs-Command-*pages (regression guard for #418), must document both subcommands, and must
declare the public-repos-only limit for DeepWiki at the point of use.- DeepWiki MCP integration (#416). Three connected pieces: (1)
mcp.jsontoolkit catalog
entry registers the DeepWiki MCP server (cognitionai/deepwiki, three tools:
read_wiki_structure/read_wiki_contents/ask_question) so/toolscan install it via
claude mcp addlike any other referenced tool. (2)/docs deepwikiverb — runs
Get-DeepWikiStatus.ps1to resolve the current repo fromorigin, check GitHub visibility,
probedeepwiki.com, and reportindexed,not-indexed,private, orunknown. The
public-repos-only limit (private repos require paid Devin) is documented at the point of use,
never buried. (3)tools-catalogskill'sresearch <id>action now callsask_questionas
the first probe when the MCP is configured, before any clone. Machinery: newmcptoolkit
kind (next toskill-cloneandplugin), detected viaclaude mcp listthrough new
Get-InstalledMcpServers.ps1;Get-ToolsCatalogandInstall-ToolFromCatalogextended to
handle the new kind; 17 new Pester tests across Get-DeepWikiStatus, Get-ToolsCatalog (mcp
kind), and Install-ToolFromCatalog (mcp kind). /board planprior-art gate (#415).Board-Plan.ps1now refuses to create an epic
unless the caller provides either-PriorArt "<block>"(queries run, candidates found with
stars/license/adoption, and the explicit build-vs-reference-vs-extend decision) or-NoPriorArt
(for genuinely novel work). In both cases the outcome lands in a## Prior-art gatesection of
the epic body, making the decision auditable later. A silent skip — the failure mode that cost
five PRs on the wiki epic (#401) — is no longer possible: the script throws before creating
anything. Same enforcement shape as the-Rationalerequirement in/board triage. Verified by
9 new Pester tests covering both paths (gate and skip).