Skip to content

fix: demote six of eight commands out of the slash picker (#1389) - #1411

Open
fdaviddpt wants to merge 4 commits into
mainfrom
fix/1389
Open

fix: demote six of eight commands out of the slash picker (#1389)#1411
fdaviddpt wants to merge 4 commits into
mainfrom
fix/1389

Conversation

@fdaviddpt

Copy link
Copy Markdown
Contributor

What this does

Part of #1389 ("One entry point: /oss:run asks what this repo needs now"). PR #1404 built /oss:run as the mechanism but left the picker showing all nine commands/*.md files. This closes the picker-visibility half for six of the eight absorbed commands:

  • setup.md, scaffold.md, triage.md, curate.md, changelog.md, install-audit.md move from commands/*.md to commands/run/*.md.
  • The mechanism, verified against the harness's own docs, not assumed: the Claude Code plugin harness discovers slash commands by scanning commands/ non-recursively -- confirmed via two claude-code-guide research agents against the plugins-reference doc (subdirectories not scanned) and the frontmatter reference (no user-invocable/disable-model-invocation equivalent hides a command from the picker the way it hides a skill -- that key exists only for skills). A subdirectory move genuinely removes the file from the picker while it stays reachable prose; there is no non-destructive alternative for a command file.
  • Each demoted command is still reachable via /oss:run <step> (the existing forcing override) or a direct file read -- never again as a bare /oss:setup-style invocation.

What stays, deliberately

commands/tick.md and commands/release.md stay top-level. Each is named by literal path in dozens of test files and several scripts -- spawn wiring, board-read caps, release-gate plugin-root checks, chain-of-handoff assertions that read the file's own content, not just its path -- coupling deep enough that migrating either is its own, separately-reviewable change. /oss:tick is also the command a maintainer's fingers already know, so keeping it live and unchanged during this transition is a deliberate choice, stated in CLAUDE.md and docs/overview.md, not an oversight. The picker is now four commands (run, doctor, tick, release), down from nine.

Coupling counts that drove the split (measured, not estimated)

tick.md ~38 test files, release.md ~35; the six demoted commands 0-7 each (curate.md: zero). Full table in the session note.

Tests

New tests/test_picker_demotion_1389.py: 5 tests, including a must-fire and a must-not-fire control pinning the non-recursive-glob mechanism itself. Verified red against origin/main's tree (copied via git show) before the move, green after. ~20 existing test files' Path(...) constants and a few glob-based coverage lists (COMMANDS, EXECUTABLE_PROSE, the shipped_op_spellings loop) updated so nothing silently stopped being checked. 827 passed, 1 pre-existing unrelated skip, across the full targeted + guard battery (lane_setup.py's own guard derivation plus every file with a functional path reference to a moved command). python3 scripts/assemble_changelog.py --check: ok, 16 fragments.

Self-review

Both spawns (Explore, oss:auditor) ran twice: once against the full lane diff, once more against the fix-for-findings commit alone (fix_commit_scope.py returned needs-second-pass, 5 files touched). Round 1: 3 + 2 findings, all misreports (non-blocking) -- a handful of bare /oss:setup//oss:scaffold invocation strings left stale by the demotion, in files both inside and outside this lane's touched set. Fixed the in-scope ones (commands/run/install-audit.md, commands/run/triage.md); logged the much larger out-of-scope sweep (8 scripts, commands/doctor.md, commands/tick.md, and scripts/oss_rules.py's own generated per-repo rule text) to trap.d/1389.stale-remedy-strings-picker-demotion.md rather than fixing it here -- it crosses into another concurrently-dispatched lane's territory (fix/1405 touches scripts/statusline.py) and scripts/oss_rules.py's fix is not a simple substitution. Round 2: 0 + 2 findings, the second round's two findings being that the trap.d fragment's own line citations implied exhaustive counts when they were spot checks -- fixed in a third, 1-file commit (fix_commit_scope.py: within-scope, no further round needed).

below-bar note: docs/autonomy.md's stale /oss:scaffold example-list mention and two paragraphs of pre-#1404 launcher-decision staleness in docs/open-the-workspace.md and docs/install.md were found adjacent to this diff. The autonomy.md one-liner was fixed in place (cheap, same subsystem). The other two are logged to trap.d/1389.stale-launcher-docs-from-1404.md as below-bar: a real, pre-existing staleness from PR #1404's own launcher rewrite, not reachable as a one-sentence fix (they need a line-by-line re-verification against current bin/oss-workspace behaviour), and not this diff's own regression.

Changelog

changelog.d/1389.changed.md (a second fragment for #1389, alongside PR #1404's existing 1389.added.md).

Part of #1389.

🤖 Generated with Claude Code

https://claude.ai/code/session_012UYdzDHX3k3C2Eh7B5hRVH

[AI-generated]

fdaviddpt and others added 4 commits September 10, 2026 08:17
…1389)

commands/run.md is #1389's mechanism but still listed all nine commands in
the picker. Move setup, scaffold, triage, curate, changelog and
install-audit to commands/run/*.md -- the plugin harness discovers slash
commands from top-level commands/*.md only, never recursively, and there is
no frontmatter equivalent of a skill's user-invocable: false for a command
file, so a subdirectory is the only mechanism that demotes one without
deleting it. Each stays reachable via /oss:run's own procedure or its
forcing override (/oss:run setup, and so on).

commands/tick.md and commands/release.md stay top-level, deliberately:
each is named by dozens of test files and several scripts by literal path
(spawn wiring, board-read caps, release-gate plugin-root checks), and
/oss:tick is the command a maintainer's fingers already know. Migrating
either is its own, separately-reviewable change -- see CLAUDE.md and
docs/overview.md for the full argument and what is left.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012UYdzDHX3k3C2Eh7B5hRVH
)

Two bare, now-dead invocation instructions fixed in files already part of
this diff's own set: commands/run/install-audit.md and
commands/run/triage.md still said `/oss:setup`/`/oss:scaffold` where only
`/oss:run setup`/`/oss:run scaffold` resolve after the demotion. Also
finished the docs/autonomy.md edit that was left uncommitted, and its
tracking trap.d fragment.

Both reviewers independently found a much larger version of the same class
across scripts/oss_config.py, scripts/doctor.py, scripts/oss_rules.py (whose
generated per-repo rule text is affected too, not just this plugin's own
prose), scripts/trap_curate.py, scripts/workspace_routes.py,
scripts/select_issues.py, scripts/statusline.py, scripts/scaffold.py, plus
commands/doctor.md and commands/tick.md -- files outside this lane's own
touched set, one of them (statusline.py) plausibly live territory for a
concurrently-dispatched lane. Ranked misreports (non-blocking) and logged to
trap.d/1389.stale-remedy-strings-picker-demotion.md for a follow-up sweep
rather than fixed here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012UYdzDHX3k3C2Eh7B5hRVH
A third self-review round (two spawns against the prior fix commit alone,
required by fix_commit_scope.py's needs-second-pass verdict on a 5-file
diff) found the trap.d fragment's per-bullet line citations implied
exhaustive counts for commands/run/install-audit.md and commands/doctor.md
when they were spot checks. Reworded to say so explicitly and to name the
extra instances the reviewer found, so a future curator does not
under-scope the deferred sweep from the bullets alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012UYdzDHX3k3C2Eh7B5hRVH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant