An audit checked 204 documented claims against the code. Roughly a third of the docs tree described something that does not exist. This corrects every claim that would break a reader following it, and rewrites the two pages that were fabricated outright.
[!NOTE] Stacked on #1399 — review that first. The base will retarget to
mainonce it merges.
Commands and flags that were never registered
buddy init, buddy help and buddy workflow <name> do not exist. install.md told a new user to run buddy init as the final verification step of installation.
Around fifteen documented flags do not exist either — buddy update --assignee/--reviewers/--labels/--auto-merge, buddy scan --dry-run, buddy schedule --cron, buddy open-settings --type and more. clapp hard-errors on an unknown option, so these examples crashed rather than degraded. usage.md shipped three copy-pasteable shell scripts built entirely from flags that do not exist.
Where a flag was invented for something Buddy genuinely does, the example now shows the configuration that actually does it.
Packages and downloads
- The dependency parser is
ts-pantry, notts-pkgx— which appeared in eight files, including abunx ts-pkgx resolveinvocation that cannot work.grep -rn ts-pkgx src binreturns zero. - The npm package is
@buddysh/buddy. The bun and yarn tabs installed a barebuddybelonging to someone else; the npm and pnpm tabs were already correct, which looks like a partial find-and-replace. - Binary downloads pointed at unzipped assets pinned to a
v0.9.1tag. Releases only ever containbuddy-<platform>.zip, so every documented curl URL 404s. Now fetches from/releases/latest/download/and unzips.
Workflows and gates
- Setup writes
buddy.ymlandbuddy-security.yml— not the three files the docs listed. It actively deletes those three names as stale (src/setup.ts:2028). - Rebase detection is event-driven on
pull_request: [edited], not an every-minute cron. - The published check run is
buddy/gates, plural. Branch protection requiringbuddy/gatematches nothing, so the gate silently blocked nothing.
Two pages rewritten
labeling-assignment.md and api/configuration.md were fabricated outright — a static/dynamic label DSL and some forty non-existent interfaces respectively. Both rewritten against the real types.
Footguns now stated plainly
packages.ignoreis exact string equality, not globs —@types/*there silently ignores nothing. The adjacentignorePathsdoes take globs.- A catch-all matcher is
matchPackages: ['**']. Package names match as paths, so['*']stops at the slash in a scoped name and misses every@scope/…package. Verified againstBun.Glob. security-onlyauto-merge reads a label Buddy never applies on its own.
Verification
- 1885 pass / 0 fail, lint clean, typecheck clean
- Docs site builds: 73 pages
- All twelve audit patterns now grep clean across
README.md,CLAUDE.md,docs/,src/,bin/and.github/workflows/
Part 2 of 3.
🤖 Generated with Claude Code