Nothing grades that a plugin subcommand is documented — plugin update shipped with ZERO operator documentation and every gate green #256
Labels
No labels
code-review
correctness
dos
performance
security
severity/high
severity/low
severity/medium
tech-debt
Kind/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
h-dv/code-index#256
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The measurement
At
ee39fd1, withplugin update(#237) fully shipped and printing its own name to operators, these were the counts across every.mdand text file in the tree (search_textwithcategory="text", each negative carryingempty_population.basis: "filtered"naming the filter, and each spelling measured separately viaseparator_scan):auto_applyauto_update[update]/[update."plugin updateupdate_checkupdate_publisher_changedPositive control:
installover the samepath_globreturns all 10 guides, 67 hits in the recovery guide alone. The zeros are measurements, not vacuous queries.Meanwhile
crates/cli/src/plugin_doctor.rs:1113prints, to operators, a string naming a command no shipped document contained:and
:1123:An operator told to run a command could not look it up.
_prdoc/guides/80-operator-recovery.md§10 — the section whose whole job is "the rest of the command surface, so a reader does not go looking" — enumerated every otherpluginsubcommand and omittedupdate, while §9 stated "There is noplugin upgrade, and this is a real gap" next to a shippedcmd_update.Why no gate saw it
Two gates could have and neither is scoped to it:
crates/mcp-server/tests/shipped_binary_registry.rs::the_readme_cli_reference_names_every_shipped_verb(:463-490) —readme_cli_verbs(:333-342) takes only "the word aftercode-indexat the start of a line", i.e. top-level verbs.pluginis present on both sides, so the entire subcommand family is invisible to it.plugin update,plugin gc,plugin doctor,plugin trust removeare all equally invisible.crates/cli/tests/plugin_command_registry.rs(1088 lines, 6 tests) — enumerates everyPluginCommandvariant and asserts set-equality with its ownREGISTRY, then grades disclosure (the four required payload fields, theabi_stabilityline, the mutating/read-only split).Updateis row:166. Its module doc lists what it cannot catch, and documentation was never in scope. Its one doc-touching test (the_abi_is_marked_experimental_on_every_static_surface,:1005-1023) checks 4 tokens on 3 surfaces, none of them README or the guides.So the registry that already knows the complete, authoritative list of subcommands does not ask whether any of them is documented. A
pluginsubcommand can ship, print its own name to an operator, and appear in no document — which is what happened.Suggested shape (generic, not a fix per case)
plugin_command_registry.rsalready holds the ground truth and already asserts set-equality against the enum, with anti-vacuity (declared.len() >= 20). Extend that one registry with a documentation axis rather than adding a per-command doc test:code-index plugin <verb>) appears in at least one operator-facing document —README.mdplus_prdoc/guides/*.mdis the set thedoc_citation_gatealready walks;plugin upgradeclaim would have been caught);The honest limit to write into the test: matching a string is not "documented well." It cannot see a wrong explanation, only a missing one. That is still the difference between this finding and no finding.
Related, same root
_prdoc/guides/80-documentation-index.mdexists so #80's Documentation checklist "can be checked mechanically rather than from memory" (:3-4), but is scoped to #80's ten items and nothing adds itself. #237 had no row, no owed-item note, and no "not covered here" mention, so the index read green while the feature was undocumented. (Lane C added a "Documentation this table is NOT scoped to" section and a #237 row; the structural point stands — nothing in CI grades that table either.)What Lane C already fixed, so this issue is about the gate only
README.md—plugin updatein the command synopsis plus an Updating a package section (the[update]block, the six reason codes, and the fact that nothing schedules it)._prdoc/guides/80-operator-recovery.md§9 — rewritten: §9.1plugin update, §9.2plugin add, §9.3 the four commands; the false "there is no upgrade path, it takes four commands" claim removed; §10's table row added._prdoc/guides/80-documentation-index.md— the out-of-scope section above.None of that is enforced. Without the gate the next subcommand repeats it.