docs(philosophy): disposition every uncited doc page and settle two deferred gate calls - #2186
Conversation
…eferred gate calls The docs index now lists 135 core /docs/en/ pages, not the 112 recorded when the uncited set was last looked at; this repo cites 78, leaving 57 unevaluated rather than the ~33 previously assumed. PR #2177 showed the eyeball method has a real miss rate — six pages dismissed as irrelevant all proved load-bearing enough to warrant a verdict — so all 57 are dispositioned here against one stated relevance test, with the audit trail in the PR body. The finding that mattered: the cross-platform contract reads only one axis, the operating system, and names feature-availability as its canonical input. That page carries provider and plan axes and scopes itself to what runs locally, so the host surface a consumer runs in was never read at all. It has to be, because a host can withhold the plugin system itself rather than one capability — and where no plugin loads, there is no portable path for one to owe. platforms is adopted as that axis's canonical index, cited and not restated. Also settles two judgment calls that were deferred rather than made, each at its own site so neither is re-litigated from a false premise: - check-skill.sh check 5 keeps backtick-form extraction. Narrowing to link targets would drop 122 unique refs across 39 skills that have no link form anywhere in the same SKILL.md, all 122 of which resolve today. The recorded premise was also wrong: the check never matched bare prose paths. - check 12's standing 4-skill warning floor is intentional. Upstream states a dmi-true skill's description is not in context at all, so trigger phrasing there cannot route anything, and none of the four strands a phrase. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Claude finished @kyle-sexton's task in 1m 14s —— View job Security review complete
No security issues found. Scope of this PR's diff (
No GitHub Actions workflow files, hook scripts, MCP server configs, or permission-bearing manifests are touched by this PR, so there's nothing here that falls into the injection/secrets/permission-widening/supply-chain categories this review targets. |
|
Claude finished @kyle-sexton's task in 4m 4s —— View job Review complete
SummaryThis is a docs/comments-only PR (
One finding, left as an inline comment on
Everything else — the doctrine addition, the citation index updates, the Not independently verified (author-claimed only, outside what I can check with available tools): the live 200/404 URL-fetch results, the byte-count/truncation claims, the shellcheck/shfmt/markdownlint/gate-script run outputs, and the 196-skill-corpus backtick/link-ref measurement (122 refs / 39 skills) cited in the check-5 comment and changelog. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 74991f2893
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude has reviewed this PR 2 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
- The GHES row's premise was overstated and its trigger fired on arrival. Re-derived from the tree: 54 of 65 plugin READMEs carry the literal github.com shorthand, 9 carry no install block, dometrain points at another github.com marketplace, and github/README.md uses a marketplace-agnostic `<marketplace-owner>/<marketplace-repo>` placeholder. All are the same owner/repo shorthand, so the trigger now names the form that actually signals a non-github.com host — a full git URL — rather than any deviation from the literal string. The one place the finding bites is recorded rather than dropped: a consumer redistributing the github plugin from a GHES marketplace would follow that README and silently resolve to github.com. - "platform" was doing two jobs. feature-availability's own sense is the PROVIDER platform (Bedrock, Vertex, Foundry), not the host surface, and the existing row plus OFFICIAL-DOCS both said "platform, provider, and plan" — which would let a future audit read the host axis as already covered, the exact premise this change rests on. Both now name the two axes and say which sense of platform they mean. - The platforms row claimed four evidence pages but quoted three. vs-code carries a real host-axis fact and it is now in the row: the extension has only a "Subset" of the CLI's "Commands and skills", so a skill this fleet ships may not be reachable there. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
|
Claude finished @kyle-sexton's task in 4m 20s —— View job Code review complete
SummaryThe follow-up commit (
One finding (unchanged context line, not part of this diff's hunks — flagged here rather than as an inline comment)
claude-code-plugins/docs/PLUGIN-PHILOSOPHY.md Line 493 in b924291
This sentence predates the PR and wasn't touched, but the new paragraph inserted five lines below it (PLUGIN-PHILOSOPHY.md:498) now says the opposite: Everything else — the 57-page disposition doctrine, the Not independently re-verified (author-claimed, outside what this review checked): the live 84/85 URL-fetch results, byte-count/truncation claims, the 196-skill backtick/link-ref corpus measurement (122 refs / 39 skills), and the shellcheck/shfmt/markdownlint/gate-script CI run outputs. |
|
Claude finished @kyle-sexton's task in 55s —— View job Security review complete
No security issues found. Scope of this PR's diff (
Nothing in this diff touches GitHub Actions workflow files, hook scripts, MCP server configuration, or any permission-bearing manifest field, so there's no dangerous-trigger, script-injection-via- |
No linked issue
Summary
Three deferred judgment calls, all made here.
The uncited doc pages were never dispositioned, and the set is larger than recorded. PR #2177
worked from an index of 112 core
/docs/en/pages with ~33 uncited. Re-derived today, the indexlists 135 core pages and this repo cites 78, leaving 57 unevaluated. #2177 also
demonstrated the miss rate of dismissing by eye: it took six pages that had been written off as
irrelevant and found every one load-bearing enough to warrant a verdict. So all 57 get a recorded
disposition here rather than a second eyeball pass.
The finding that mattered is in the cross-platform contract. It reads one axis — the operating
system — and names
feature-availabilityas its canonical input. That page carries two axes,model provider and subscription plan, and scopes itself to what runs locally: "The Claude Code CLI
and everything that runs locally work on every provider." The host surface a consumer runs in
was therefore never read at all, by either the contract or its input. It has to be, because a host
can withhold the plugin system itself rather than one capability, and where no plugin loads there is
no portable path for one to owe.
check-skill.shcheck 5 and check 12's 4-skill warning floor were both left open as "aseparate call". Both are decided, at their own sites, with the reasoning recorded so neither is
re-litigated from a false premise.
Fix
1. Uncited-page disposition (57 pages)
One stated relevance test, applied to all 57 so the dismissals are auditable rather than tacit:
Split: 1 adopt / 0 defer / 3 decline / 4 relevant-as-evidence / 49 not relevant.
Verdicts land in
docs/PLUGIN-PHILOSOPHY.mdunder Native-first → Recorded gate runs, in theupstream-drift
four-part shape (claim, basis, as-of date, recheck trigger), following #2177's form.
platformsfeature-availabilitydoes not carry. Lands doctrine.github-enterprise-serverultrareviewchromeclaude-in-chromeskill; nothing to declare. Recorded because it only looked cited — see the dead-link note below.desktop,vs-code,mobile,desktop-wslplatformsrow; no separate verdict, because they are one finding seen from four pages rather than four surfaces. Quoted verbatim in that row.jetbrainsplugin-keyword density and is the one page where that signal is pure noise.desktop-quickstart,desktop-linux,desktop-ios-simulator,web-quickstart,troubleshoot-installslack,claude-tagplatforms, which is the adopted citation;slackis additionally being retired for Team/Enterprise.devcontainermarketplacehit is a VS Code extension link.gitlab-ci-cd,github-actions-cloud-providersgitlab-ci-cd: 0 keyword hits).amazon-bedrock,google-vertex-ai,microsoft-foundry,claude-platform-on-awsfeature-availability.gateways,llm-gateway,llm-gateway-connect,llm-gateway-protocol,llm-gateway-rolloutclaude-apps-gateway,claude-apps-gateway-config,claude-apps-gateway-deploy,claude-apps-gateway-on-aws,claude-apps-gateway-on-gcp,claude-apps-gateway-spend-limitsgateway.yaml, Kubernetes, spend caps.self-hosted-environments,self-hosted-environments-quickstart,self-hosted-environments-configuration,self-hosted-environments-deploy,self-hosted-environments-identity,self-hosted-environments-reference,self-hosted-environments-testingadmin-setup,authentication,legal-and-compliance,third-party-integrationsanalytics/usagedialog, not an authoring input.)network-configdownloads.claude.aifor "Plugin executable downloads";storage.googleapis.comfor "plugin metadata shown in/plugin").corporate-launcherCLAUDE_CODE_PROCESS_WRAPPERwraps "every process Claude Code launches from its own binary — the background service, every session it hosts in agent view, and Claude Code's relaunches after an update". A plugin's${CLAUDE_PLUGIN_ROOT}/bin/invocation is a Bash-tool subprocess, not a Claude Code self-spawn, so thebin/stance is unaffected and owes no change.champion-kit,communications-kitaccessibility,keybindings,terminal-config,voice-dictation,fullscreen,fast-modeprompt-libraryDoctrine added — one paragraph, plus four table rows. The cross-platform contract gains the host
axis, citing
platformsand restating none of its facts. The three verbatim host facts (Desktop-in-WSLsessions lack "connectors and plugins";
/plugin"[doesn't] work from the app" on mobile; Desktop'sCowork tab sources plugins "not from the CLI's
~/.claudedirectory") live in the gate-run row, wherethey carry a recheck trigger — not in the contract, which states only the rule they establish.
A dead citation, deliberately not fixed. Every doc URL this repo cites was checked live — all 81
slugs plus the 4 subpath citations (
agent-sdk/overview,agent-sdk/agent-loop,agent-sdk/plugins,whats-new/2026-w32). 84 of 85 return 200. One does not:code.claude.com/docs/en/browsernow 404s (chromeis the live page). Its sole occurrenceis
plugins/playbooks/skills/boris/vendor/SKILL.md:938— a verbatim upstream baseline kept fordrift detection, which the plugin README says to treat as untrusted and which
/playbooks:updateowns. Hand-editing it would corrupt the vendor SHA it exists to compare. Recorded in the
chromerowwith that path as its recheck trigger instead.
2.
check-skill.shcheck 5 — KEEP the extractor as-is (decided, recorded at the site)Two premises are usually offered for narrowing to markdown-link targets. Both are false, and the
comment now says so, because the premise is what keeps the question alive:
"It matches bare paths in prose." It does not, and never did. Both generators are delimited —
backtick-wrapped, or a
](…)link target — and both are scoped to theINTERNAL_DIRSallowlist.Naked prose cannot match. (fix(skill-quality): name the sibling skill when a cross-skill citation misses #2179's own summary and CHANGELOG entry describe it as extracting
"prose and inline-code refs"; the in-script wording is corrected here to match what the greps do.)
"The backtick branch is redundant." Measured over the 196-skill corpus rather than argued:
Narrowing would drop 122 real, currently-resolving supporting-file references across 39 skills.
The link branch being the larger share is not the question; the overlap is, and 122 refs sit
outside it.
The false-positive risk that motivated the proposal is real but latent, not observed — zero on
the current corpus. It is handled by message wording (every failure carries
hand-verify the line before fixing, may be an illustrative example) rather than by deleting coverage of 39 skills.Reopen only if a false positive is actually observed.
3. Check 12's 4-skill warning floor — INTENTIONAL, no dmi carve-out (all 4 confirmed)
#2181's reasoning holds, and upstream states the premise more strongly than #2181 did. The skills
doc's frontmatter-behavior table gives, for
disable-model-invocation: true:"Description not in context, full skill loads when you invoke" — so trigger phrasing on such a
skill cannot route anything, at all.
user-invocabledefaults totrue(confirmed on the same page,not assumed), so
github:setupomitting it is slash-command-only, exactly its declared contract.The load-bearing half of #2181's argument is the stranded-phrase test, which is an empirical claim
about the current tree, so each was re-checked against the tree rather than against #2181's prose:
discipline:wait-whatfirecrawl:updatefirecrawl:firecrawlverified to carry the consumer phrases ('scrape this page','crawl this site','WebFetch is blocked', …). Nothing stranded.playbooks:updateplaybooks:borisverified to carry'how does Boris use Claude Code','Claude Code workflow tips','optimize my CLAUDE.md', … Nothing stranded.github:setupgithub:adviseandgithub:auditcarry the plugin's consumer-facing routing, including'help me set up Y'.setupcovers plugin prerequisites (gh auth, writing.claude/github/), which is a deliberate slash command, not a routing target.No carve-out is added, and that is the recorded call. Exempting dmi-true from check 12 would
suppress a warning that is doing no harm while hiding the
kindle-dedrmfailure mode #2181 itselfsurfaced — a phrase reachable only from a skill the model can never match. The floor stays; the
exemptions stay documented at the check-12 site.
Verification
Method. Every page was fetched with
curl -sL …/<slug>.md— the raw markdown, not WebFetch.That removes the summarizer and the truncation window from the loop entirely, so the METHOD RULE
holds trivially: every upstream sentence quoted in this PR and in the doctrine is verbatim from a
complete page, and a genuine "the page never states X" is a checkable claim rather than a routine
false negative. Byte counts confirm no truncation (e.g.
desktop.md96,288 bytes,vs-code.md49,764). No page was asked to confirm a sentence from this repo.
The uncited set was re-derived, not inherited. The grep was also re-run with no
--includefilters to be sure no citation lives in a file type the filter misses — identical result, 81
slugs, so 57 uncited is the real number.
Every cited URL was checked live: 84 of 85 (81 slugs + 4 subpath citations) return 200; the
single 404 is the vendored
browserlink described above.The gate-1 check that decided the headline adopt was run against the page rather than assumed:
feature-availability's section headings are Availability by model provider, Availability bysubscription plan, and Model availability — no host-surface axis — and its only feature table
header row is
| Feature | Pro | Max | Team | Enterprise |. Had it carried a host axis,platformswould have been a redundant second index and this would be a decline instead.
Gates run the CI way, against the committed tree, base-ref form:
bash scripts/check-contract-slice-prune.sh --check-diff origin/maindocs/topics/bash scripts/check-changelog-parity.sh --check-bump origin/mainbash scripts/check-changed-skills.sh origin/mainbash scripts/check-skill-portability.sh origin/mainbash scripts/check-shell-portability.sh origin/mainnpx --yes markdownlint-cli2over all 3 changed.mdshellcheck+shfmt -i 2 -doncheck-skill.shbash -n check-skill.shi/lf w/lfBecause the change to
check-skill.shis comments only,check-changed-skills.shexercisesnothing — so the script was run directly to prove it still parses and behaves:
check-skill.sh measure→PASS — 0 errors, 0 warning(s),all 10 base-ref trigger phrase(s) preserved.check-skill.sh wait-what→PASS — 0 errors, 2 warning(s), one of which is verbatimdescription has no 'Use when:' trigger phrasing— confirming the documented floor still fires asdescribed rather than being silently suppressed.
check-skill.test.shruns to completion in CI (plugin-gate); locally on Windows/Git Bash it isimpractically slow, per the coverage note fix(skill-quality): name the sibling skill when a cross-skill citation misses #2179 recorded. Nothing here is behavioral.
plugins/skill-quality→ 0.15.2 with a matching## [0.15.2]entry. Thedocs/changes aredocs-only and owe no plugin bump; the
upstream-driftAdopters registry already carries a rowfor the gate-run table (added in #2177), and these rows join that table rather than create a new
adopter, so that convention needs no version change.
docs/OFFICIAL-DOCS.mdgains the four newly load-bearing pages, per the rule its own warning statesand the precedent #2177's review set: a needed page that is not listed must be added.
No
docs/topics/<slug>/directory was created — the durable outcome is doctrine text, as theContract-tier prune rule requires.
Review rounds
Three threads, all real, all answered and resolved. Each found a defect in the basis of a row
rather than in its verdict, which is the failure mode a decision record most needs caught: a verdict
outlives the reasoning nobody re-reads.
chatgpt-codex-connector).It claimed "every plugin README ships the github.com shorthand". Re-derived from the tree: 54 of 65
carry the literal string, 9 carry no install block,
dometrainpoints at another github.commarketplace, and
plugins/github/README.md— deliberately marketplace-agnostic — uses the<marketplace-owner>/<marketplace-repo>placeholder. All are stillowner/reposhorthand, so thetrigger now names the form that actually signals a non-github.com host, a full git URL, of
which the tree has none. The verdict stays Decline, but the review surfaced a real finding that had
been waved through and is now recorded in the row: a consumer redistributing the
githubpluginfrom a GHES-hosted marketplace would follow that README and have the shorthand silently resolve to
github.com instead of their own instance.
chatgpt-codex-connector). The existingfeature-availabilityrow and
docs/OFFICIAL-DOCS.mdboth described that page as covering "platform, provider, and plan",while this change rests on the host axis being absent from it. Both senses of the word in one table
would let a future audit read the host axis as already covered and retire the new row as redundant.
The page's own sense is the provider platform — its axis headings are Availability by model
provider and Availability by subscription plan — and both sites now say so explicitly.
platformsrow claimed four evidence pages and quoted three (claude). Correctlydiagnosed as a missing fact rather than an overstated page:
vs-codedoes carry a host-axis fact,and the most directly plugin-relevant of the four — its CLI-vs-extension table gives
Commands and skillsasAllfor the CLI againstSubset (type / to see available)for theextension, so a skill this fleet ships may not be reachable there. It is now quoted in the row.
All gates and
markdownlint-cli2re-run clean over the changed files after these edits. CI is green,including
plugin-gate— which runscheck-skill.test.sh, the only executable proof that thecheck-5 comment insertions changed no behavior.
Related
and corrects its page census (112 → 135 core pages, ~33 → 57 uncited)
Use when:phrasing and left 4 with stated reasoning; all 4 re-reviewedand confirmed here