--- name: find-simplifications description: Use for a periodic repo-wide sweep of qwen-code for accumulated excess surface — dead components and files, orphaned locale keys, exports nothing consumes, added-then-removed scaffolding — filing candidates on a tracking issue and landing only what a maintainer has said yes to. Repo-wide and evidence-first; every consumer is named before anything is deleted. Not for tidying a diff you just wrote (that is bundled `/simplify`) and not for defects (that is `/review`). --- # Finding qwen-code Simplifications `AGENTS.md` § Simplicity First — "Minimum code that solves the problem. Nothing speculative." This skill hunts what that principle already rejected but that shipped anyway. It owns **correct code nobody needs**, repo-wide, with no diff to anchor on. Every candidate names the surface, names **every** consumer, and says what breaks when it goes. A candidate whose consumers cannot all be named is dropped — not downgraded, dropped. Read this file, then the one document for your phase. Do not survey or land from this file alone; if the phase document cannot be read, stop and say so. | Phase | Document | | ------------------------------------------- | ---------------------- | | Survey (default): find and file | `references/survey.md` | | Land: turn ONE approved candidate into a PR | `references/land.md` | ## Issue First, PR Second A run's deliverable is a comment on the tracking issue, **not** a PR. ``` Survey → file candidates on the tracking issue → maintainer says yes to one → land that one → one PR, one candidate. ``` This is not ceremony. `AGENTS.md` § Core Infrastructure ends "When in doubt, escalate. Better to wrongly escalate than to wrongly approve," and an unrequested batch of deletions is the shape that gets closed. It also makes the ledger free: the issue that carries the proposals is the same object the next run reads to avoid re-proposing them. A maintainer asking for a PR in this session counts as assent — record it on the ledger before opening the PR. ## Boundaries | Skill | Owns | Why not this one | | --------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | bundled `/simplify` | The diff you just wrote; stops when there is no diff | Cannot see surface accumulated across releases | | `/repo-hygiene` | **Wrong** code — a defect provable by evidence; bans "cleaner / more modern / more consistent" edits | Its six angles are all defect classes | | bundled `/review` | Judging a change that exists | Your change does not exist yet | | `/create-issue` | Filing an issue well | Use it to create the ledger issue when missing — it cannot comment; post run comments with `gh issue comment` | | `/prepare-pr` | `pr-title.txt` / `pr-body.md` from the repo template | Call it in the land phase; do not reinvent PR rules | | `/verify-pr` | Behavioral A/B evidence for a PR | A deletion has no behavior to demo | | `/bugfix`, `/feat-dev`, `/deflake`, `/docs-*` | A defect, a feature, a flaky test, prose | None of them remove surface | ## Territory The split is not taste. `packages/core/package.json` exports `"./src/*"` and `"./dist/*"`, and `packages/core/src/index.ts` carries ~179 `export * from` lines, so **every file under `packages/core/src` is reachable from outside this repo**. The release workflow npm-publishes `@qwen-code/audio-capture` and the eight `@qwen-code/channel-*` packages with `--access public`, so a symbol re-exported by their package entry is reachable the same way. No grep inside this repo can prove such a symbol has no consumer. The same is true of two surfaces whose consumers are not imports at all: `packages/core/vendor/**` and `packages/web-shell` ship inside the published `@qwen-code/qwen-code` tarball — `packages/core/package.json` lists `vendor` in `files`, and `scripts/copy_bundle_assets.js` copies both `vendor/` and `web-shell/dist` into the bundle, where `qwen serve` hands the latter to browsers. Their consumers are registry-, tarball-, or browser-side, so an in-repo grep for them returns zero hits and the consumer proof passes vacuously — `getBuiltinRipgrep()` even assembles the vendor path from segments, so no literal path exists to grep for. Import reachability is the floor, not the definition: consumption also happens through runtime reads, loaders, manifests, and tool configs that never appear as imports. The consumer proof must name the mechanism that consumes the surface; a grep blind to that mechanism proves nothing, and the rows below mark every such path this repo ships or loads. A path named by more than one row takes the most restrictive outcome: Never-a-target beats Report-only, which beats Landable. | Territory | Outcome | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `packages/cli/src` — the whole package (`generated/` stays under the Never-a-target row below; `**/*.sb` stays under the Report-only row below; `i18n/locales/**` and `commands/extensions/examples/**` stay under the Report-only row below; `**/*.test.ts(x)`, `**/*.spec.ts(x)`, `**/__snapshots__/**` are never targets, always searched as consumers) | Landable | | `scripts/`, `esbuild.config.js`, `eslint.legacy-filenames.mjs`, root manifests | Landable | | Whole files or directories nothing consumes by any mechanism named above — no import and no runtime read, loader, manifest, or tool config — anywhere outside `packages/core/src`, `packages/audio-capture`, `packages/channels`, `packages/sdk-*`, `packages/acp-bridge`, `packages/vscode-ide-companion`, `packages/chrome-extension`, `packages/zed-extension`, `packages/web-shell`, `packages/core/vendor`, `.github`, and the Never-a-target row below | Landable | | `docs/users/**`, `docs/developers/**`, `docs/index.md`, `docs/_meta.ts`, `packages/cli/src/i18n/locales/**`, `packages/cli/src/commands/extensions/examples/**` — as whole files or directories | **Report-only** — copied into the published tarball (`scripts/prepare-package.js` copies the locales and extension examples; `scripts/copy_bundle_assets.js` copies `docs/users/` for qc-helper) and consumed by the published docs site (`docs-site/scripts/link-public-docs.mjs` symlinks `docs/users/` and `docs/developers/` into the Nextra build per `PUBLIC_DOC_ROOTS` and copies `docs/index.md` and `docs/_meta.ts`; the site discovers pages by walking that tree); consumers are runtime reads — qc-helper's doc paths, the i18n loader's segment-assembled `import()`, `/extensions new` scaffolds — never imports. Individual orphan locale keys stay class-4 candidates: their proof greps the literal key, naming its mechanism | | `docs-site/` | **Report-only** — standalone published-site app, not a workspace member; route files are consumed by Next.js filesystem routing and an out-of-repo deploy, never imports, and no in-repo CI builds it | | Tracked `.qwen/skills/**`, `.qwen/agents/**`, `.qwen/e2e-tests/**`, `docs/design/**`, `docs/plans/**` | **Report-only** — consumed by the skill loader, agent definitions, and process readers (including `AGENTS.md` itself), never imports | | `AGENTS.md`, `CLAUDE.md`, `SECURITY.md`, `CONTRIBUTING.md`, `.prettierrc.json`, `.prettierignore`, `.editorconfig`, `.nvmrc`, `.npmrc`, `.yamllint.yml` | **Report-only** — consumed by external tooling through filename convention (agent harnesses, GitHub's security-policy UI, prettier and yamllint config auto-discovery, nvm, editors); never imports, and an in-repo grep for them measures only prose | | Anything under `packages/core/src` | **Report-only** — published | | `packages/audio-capture`, `packages/channels` | **Report-only** — npm-published (`--access public`) | | `packages/core/vendor/**`, `packages/web-shell` | **Report-only** — shipped inside the published `@qwen-code/qwen-code` tarball / served to browsers by `qwen serve`; consumers are bundled or browser-side, never imports | | `packages/cli/src/utils/**/*.sb` | **Report-only** — copied into the published bundle by extension glob (`scripts/copy_bundle_assets.js` copies `packages/**/*.sb`, `scripts/prepare-package.js` lists `'*.sb'`) and read at runtime through a segment-assembled path (`resolveSeatbeltProfileFile()` builds `sandbox-macos-${profile}.sb`); consumers are never imports, and a basename grep measures zero | | Any key in `packages/cli/src/config/settingsSchema.ts` | **Report-only** — see below | | `packages/sdk-*`, `packages/acp-bridge`, protocol/wire shapes | **Report-only** — out-of-repo consumers | | `packages/vscode-ide-companion`, `packages/chrome-extension`, `packages/zed-extension` | **Report-only** — shipped as store manifests; the store is the consumer | | `.github/` — workflows, actions, CODEOWNERS | **Report-only** — consumed GitHub-side: triggers, required checks, cross-repo `uses:` | | `package.json` dependencies | **Report-only** — bundlers and postinstall hide consumers | | Comments, JSDoc, commented-out code | **Out of scope** — `AGENTS.md` says do not delete existing comments as cleanup | | `packages/desktop`, `packages/cua-driver`, `packages/mobile-mcp`, `**/generated/**`, `**/*.test.ts(x)`, `**/*.spec.ts(x)`, `**/__snapshots__/**` | Never a target; always searched as consumers — vitest discovers tests by filename glob, nothing imports them, so an import-based orphan detector matches every live test vacuously | A settings key with zero read sites is still not cleanup. The key is likely documented under `docs/users/` and completed from the generated schema; removing it withdraws a documented, user-settable option and turns an accepted setting into a silently ignored one — warned nowhere, since the unknown-key check compares top-level keys only and its output is a session-gated debug-log append, never the terminal. That is a deprecation decision. File it; never land it. Report-only does not mean worthless — a named, proven, un-landable finding is exactly what a maintainer needs to make the call. It means the run stops at the issue comment. ## Decision Table | Situation | Do | | ---------------------------------------------------------------- | ---------------------------------------------------------- | | Landable territory, every consumer named, maintainer said yes | Land it. One candidate, one PR | | Landable territory, no assent yet | File on the tracking issue and stop | | Several strong candidates in one run | File them all; land at most one | | Report-only territory | File with evidence, marked report-only. Never a PR | | Path or symbol younger than ~90 days | Drop **silently** — unwired new feature, not rot | | A never-called migrator, validator, guard, or dropped wire-up | Not cleanup. It may be a defect → `/bugfix` or `/review` | | Any consumer cannot be named | Drop | | Correct but tiny (one dead import, a typo) | Reject on the ledger: below both skills' intake bar | | Branch would remove 500+ production logic lines under core paths | Stop. `docs/design/yyyy-mm-dd-topic.md`, then a maintainer | `AGENTS.md` § Core Infrastructure Is Maintainer-Only governs `packages/core/src/**`, `packages/*/src/` under `auth`, `providers`, `models`, `config`, `tools`, `services`, and any cross-package change: 500+ production logic lines of `refactor` there is a hard block for non-maintainer PRs (excluding `*.test.ts(x)`, `*.spec.ts(x)`, `__tests__/**`, `*.schema.{ts,json}`, `*.generated.ts`, `**/generated/**`), and anything smaller "must be 100% confident … name every downstream consumer; if it cannot, escalate." Breadth alone is not size: a sweep touching many files with a line or two each is judged on confidence, not file count. ## Recurring-Run Design ### Rotation Survey one slice per run, picked by the calendar, plus at most one other if the first comes up empty. Rotation is what stops the third run from re-searching the same hot directories. ```bash git fetch origin || exit 1 # Fetch only updates the ref, but every grep below reads the working tree — # survey fresh code from a throwaway worktree at origin/main. Never switch # the user's checkout: the survey is read-only and must leave the checkout # exactly as it found it. SURVEY_PARENT="${TMPDIR:-/tmp}/find-simplifications-survey" SURVEY="$SURVEY_PARENT/main" # Clear any leftover from a failed or interrupted earlier run first. The # fixed path (not mktemp) lets every call re-derive the worktree with no # shared state, so at most one leftover can ever exist. There is no EXIT # trap: the consuming harness spawns a fresh shell per command, so a trap # fires when THIS call ends — before any survey command runs — and its # variables do not survive to the call that would need to clear it. # Delete the directory, never `git worktree remove --force` on the fixed # path: remove resolves symlinks, so a planted link to another registered # worktree of this repo would force-delete that foreign tree, uncommitted # work included. rm -rf unlinks a symlink without following it; prune # then clears the stale registration. Fail closed on removal errors: a # leftover that cannot be deleted is owned by someone else, and the # checkout must never go into a parent this user does not control. rm -rf "$SURVEY_PARENT" || exit 1 # Close the create side too: `git worktree add` accepts a planted EMPTY # directory (exit 0, the planter keeps ownership and mode) and a symlink to # an empty directory (exit 0, the checkout written through the link), so # recreate the parent as a fresh 0700 dir owned by the running user — no # other local user can then plant the worktree path. mkdir, not install -d: # install -d exits 0 adopting an existing directory and following a planted # symlink, so no exit-status check could tell creation from adoption; mkdir # fails when anything is still at the path, aborting the block instead. mkdir -m 0700 "$SURVEY_PARENT" || exit 1 git worktree prune git worktree add --detach "$SURVEY" origin/main || exit 1 # Slice from the month, not the ISO week: a monthly run advances ISO weeks # by ~4, so week % 4 repeated the same slice for 3–6 monthly runs at a # time. POSIX slice computation: the `10#` radix prefix is bash/ksh-only # and is a hard syntax error under /bin/sh (dash), hence the leading-zero # strip. M=$(date -u +%m); SLICE=$(( ${M#0} % 4 )) echo "SURVEY=$SURVEY SLICE=$SLICE" ``` Each fenced block in this skill is ONE command: the consuming harness spawns a fresh shell per command, so environment variables, cwd, and traps set here do not survive to later calls. Every later call that needs the worktree re-derives the same fixed path (`${TMPDIR:-/tmp}/find-simplifications-survey/main`) and runs its commands from there (`cd "$SURVEY" && …`, or by setting the call's working directory). | Slice | Territory | | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 0 | `packages/cli/src/ui/components`, `ui/hooks`, `ui/contexts` | | 1 | `packages/cli/src/ui/commands`, `packages/cli/src/commands` | | 2 | `packages/cli/src/utils`, `packages/cli/src/i18n`, `packages/cli/src/services` | | 3 | `scripts/`, `esbuild.config.js`, `eslint.legacy-filenames.mjs`, root manifests, everything else under `packages/cli/src`, plus whole-file orphans anywhere in landable territory | Skip a slice the ledger shows was surveyed in the last three runs; the fallback is the lowest-numbered slice NOT surveyed in those runs — a skip with no fallback surveys nothing, and three empty runs in a row trip the stop-loss below without any sweep having happened. Survey a report-only territory only when a human asks for it by name. Check churn per candidate rather than trusting a static list — it moves: ```bash git log --since='3 months ago' --name-only --pretty=format: --