You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
knowledge: video-digest reads its dependency directory only from an environment variable the Bash tool never carries, so its pipeline and preflight fail before any digest work #5982
Severity: high (auditor-suggested, uncalibrated)
Component: knowledge:video-digest (source at worktree HEAD 0c5fd28; version 0.15.2). The worktree moved to f9cc202 (0.15.3) during review; that diff changes none of the cited code or text, but SKILL.md lines after 124 sit 3 to 6 lines lower there.
Readiness: mixed: E1, E3, I3 agent-ready (recommendations); E2, I1, I2, Q1, Q2, S2 needs-decision
Duplicates: none found; Related: #5835 (open): its A2 prerequisites contract plans a /<plugin>:check per plugin and a shared checker, which would cover I3 and the E3 script; #5803 (closed): earlier video-digest pipeline fixes, different defects; #5846 (closed): rendered-views routing for video-digest; #5802 (closed): parent of #5803.
Summary
An unattended subagent ran /knowledge:video-digest on an X video post in an auto-mode,
worktree-isolated session. The skill's ! preflight was refused by the worktree command-shape
check, the node pipeline never ran, and the agent hand-ran yt-dlp, ffmpeg and ImageMagick, so none
of the skill's contract outputs exist. The skill's own defects: every pipeline script and the
preflight probe read the data directory from process.env.CLAUDE_PLUGIN_DATA, which the Bash tool
never carries, so the pipeline cannot install or load its dependencies from any session (E1); the
preflight is a compound block with no allowed-tools entry and no fallback (E3); and every ${user_config.*} option sits in spoke files that arrive unsubstituted (E2). A separate cause is
the operator's brief, which forbade home-folder writes; it explains why the agent never tried setup-deps.mjs, and the skill offered no other install location and no stop for that case (I1,
I2). Fixing E1 and E3 makes every documented action runnable from the Bash tool and gives a
truthful readiness report.
Findings
E1. The pipeline cannot find its own data directory from the Bash tool
What happened: not observed in the evidence run (the preflight never ran and setup-deps was not attempted); reproduced instead. printenv CLAUDE_PLUGIN_DATA CLAUDE_PLUGIN_ROOT CLAUDE_PROJECT_DIR CLAUDE_SKILL_DIR in the Bash tool exits 1 with all four unset, in the audit session and again in this review's subagent on 2.1.288 (sources/seam-reproduction-2026-10-02.txt). The preflight's own node probe prints MISSING with the variable unset and installed when the same probe is given CLAUDE_PLUGIN_DATA pointing at a fixture holding the package (audit-notes.md E1). The data dir exists and is empty (raw/plugin-data-listing.txt).
Why: extraction/setup-deps.mjs:25-32 exits 1 with "CLAUDE_PLUGIN_DATA is not set" before writing anything; extraction/resolve-hook.mjs:16-18 sets dataModules = null, so bare @melodic/* imports fail even after an install; SKILL.md:14 probes process.env.CLAUDE_PLUGIN_DATA; extraction/run.mjs:67-71 passes process.env to the child and lib/run-args.js has no data-dir flag. SKILL.md substitutes ${CLAUDE_PLUGIN_ROOT} into script paths but never passes ${CLAUDE_PLUGIN_DATA}. No node_modules exists anywhere in the checkout to satisfy the imports otherwise.
Options, cheapest first: 1. Add a data-dir flag to setup-deps.mjs and run.mjs (run.mjs forwards it to the child as CLAUDE_PLUGIN_DATA, so resolve-hook.mjs keeps working), named as rung 1 of the on-demand-dependencies convention's "Finding the plugin data directory" (--deps-dir in its inventory example, --data-dir in its Python section), and pass "${CLAUDE_PLUGIN_DATA}" on every SKILL.md invocation, where Claude Code substitutes it at load. 2. Replace the preflight's environment read with the same substituted path (E3 option 1). 3. Implement the convention's full resolution order (S2).
Scope check: needs to exist, since no documented action (transcript, queue, watch, resume) can load its dependencies. Option 1 is the smallest change; option 3 can follow.
E2. Every knowledge userConfig option is a silent no-op for video-digest
Severity: high (review suggests medium) Status: needs-decision
What happened: the evidence agent's Read of reference/sources/x.md returned the literal text "Supply ${user_config.yt_dlp_cookies_file}" (raw/transcript-user-config-token.md, transcript line 57).
Why: SKILL.md contains no ${user_config.*} reference. All 15 lines that carry one are in spokes the model opens with the Read tool (context/output-contract.md:17-24 and :44-46, reference/sources/youtube.md:52-69, reference/sources/x.md:190), which return file bytes. output-contract.md:44-46 treats a token that is "still an unexpanded token" as the default, so a configured library_dir is ignored without a warning and artifacts land at the repo root; the cookie, js-runtime and concurrency options never reach run.mjs. Claude Code documents ${user_config.KEY} substitution in skill content, "Anywhere in the Markdown body" (manifest-reference lines 494 and 574). The sibling skills docpage-digest and map-corpus render library_dir in their SKILL.md body. Confound: that option's default is the empty string, and nothing in the packet shows how an empty option renders even in a SKILL.md body, so the observation alone does not separate the two causes; the source-level defect stands either way.
Options, cheapest first: 1. Add a short block to the SKILL.md body that renders each option once (library_dir: ${user_config.library_dir} and the four yt-dlp and concurrency options), and have the spokes refer to the rendered value instead of the token. 2. Remove the "unexpanded token means default" rule at output-contract.md:44-46, so an unexpanded token is reported as a bug. 3. An eval case that sets library_dir and asserts --work-root reaches run.mjs.
Scope check: needs to exist for any user who sets an option; defaults are unaffected. Option 1 is the smallest change.
E3. The ! preflight cannot run as written in an auto-mode worktree session, and names no fallback
What happened: the harness did not run the block at render; it rendered "[run this first, exactly as written, and use its output:]" (raw/transcript-deps-preflight.md line 14, transcript line 17). Claude's Bash call with the exact text was refused: "this command is too complex to verify that it stays inside the worktree. Refusing to run it" (line 31, transcript line 27). No prerequisite report printed, and the agent probed tools one at a time.
Why: SKILL.md:13-18 is four brace groups with command -v, pipes and || chains; the frontmatter has no allowed-tools; the skill says nothing about a refused preflight. Even when it runs, its node line is always MISSING (E1). Outside auto mode, an injected command no rule allows aborts the whole invocation (skills.md line 729, and independently #97476 on 2.1.281); that branch was not reproduced here.
Options, cheapest first: 1. Replace the block with one plain command that runs a script by path and takes the data dir as an argument, for example node "${CLAUDE_SKILL_DIR}/extraction/check-prereqs.mjs" --data-dir "${CLAUDE_PLUGIN_DATA}"; the script probes the node deps, yt-dlp, ffmpeg, ImageMagick and the faster-whisper import and always exits 0. Whether that shape passes the worktree command-shape check is untested; check it before relying on it. 2. Pre-approve exactly that command in frontmatter allowed-tools, where the same variables are substituted, so it runs at render in default mode. 3. One line under Prerequisites: if the pre-computed context did not run, run that command yourself before Bootstrap.
Scope check: needs to exist. Option 1 also fixes E1's probe; options 2 and 3 are one line each.
I1. No stop or degraded path at the Bootstrap gate when the node pipeline cannot run
Severity: medium Status: needs-decision
What happened: the agent did not stop. It hand-ran the tools and produced none of run-state/watch.json, the README stub, research/claim-inventory.md, the research stage or recommendations/ (raw/handback-video.md problem 1; raw/slice-listing.txt). The hand path skipped captions+repair (x.md:122-123) and lost the captionRung and transcriptStrategy provenance run-transcript.js:104-112 emits; the handback reports "Cloud Code" for "Claude Code" throughout (whether repair would have fixed it is unverified).
Why: the Bootstrap gate (SKILL.md:119-120) STOPs only on MISSING yt-dlp, ffmpeg or ImageMagick, and its node step is "Run setup-deps.mjs" with no failure branch. SKILL.md:216 does say "If any prerequisite fails, stop and inform the user", so the two instructions disagree on node deps, and nothing says a hand-run of the tools is not this skill's output. Separate cause: the operator's brief forbade the home-folder write setup-deps needs and asked the agent to report missing tools; continuing by hand was the agent's choice.
Options, cheapest first: 1. Add node deps to the Bootstrap STOP list, printing setup-deps' failure text, and state that a hand-run of yt-dlp is not this skill's output. 2. Define a degraded mode in context/watch-pipeline.md: README from templates/readme-journey.md with pipeline: not-run, a transcript header naming the caption class (platform-asr) and repair: not-applied, slice status: partial.
Scope check: option 1 needs to exist and is one line; option 2 is optional.
I2. No operator override for where the node dependencies install
Severity: medium Status: needs-decision
What happened: under the operator's no-home-folder rule the only install target, ~/.claude/plugins/data/knowledge-melodic-software/, was off-limits and stayed empty (raw/plugin-data-listing.txt; raw/handback-video.md problem 1).
Why: setup-deps.mjs:25,34,78-81 and resolve-hook.mjs:16 take the base only from the environment; there is no flag or option. The convention's .work/ rung for a marketplace checkout would have satisfied this session, because the plugin ran from the main checkout.
Options, cheapest first: 1. The E1 flag doubles as the override; document it under Prerequisites with one line on when to use it. 2. Implement the convention's full order and print which rule chose the base.
Scope check: covered by E1 option 1 plus one documentation line.
I3. The read-only prerequisite check exists but the model cannot reach it, and the skill never routes to it
What happened: the evidence session got no readiness report and found its prerequisites by hand (raw/handback-video.md). /knowledge:setup check probes the same tools read-only, but a subagent cannot invoke it: this review's Skill-tool call to knowledge:setup from a subagent was refused with "cannot be used with Skill tool due to disable-model-invocation" (sources/seam-reproduction-2026-10-02.txt).
Why: skills/setup/SKILL.md:5 sets disable-model-invocation: true; there is no plugins/knowledge/skills/check/ (25 plugins in this repo ship one); video-digest's failure text (SKILL.md:216-217) routes only to setup-deps.mjs. docs/plugin-philosophy.md:595-600 requires a separate check skill when a hook or probe names a read-only check; video-digest's probe names none, so this is a gap, not a violation.
Options, cheapest first: 1. Route video-digest's Prerequisites failure line to the E3 script. 2. Add plugins/knowledge/skills/check/SKILL.md in the context7 shape (reads setup, follows only its check section, disable-model-invocation: false). 3. Add faster-whisper detection to setup's check as an INFO row.
Q1. The skill installs into the home data directory without first saying what and where
Severity: low-medium Status: needs-decision
What happened: the agent had to read setup-deps.mjs to learn the install target and contents (raw/transcript-deps-preflight.md lines 40-99, transcript lines 45-48).
Why: the Bootstrap gate runs the install unconditionally (SKILL.md:119), and skills/setup/SKILL.md:45 says "each ingest skill self-provisions on first run"; nothing names the target (~/.claude/plugins/data/<id>/node_modules) or that it pulls the vendored packages and their registry dependencies.
Options, cheapest first: 1. Have the E3 script print the resolved install path and "will install on first watch/transcript run; pass the data-dir flag to relocate". 2. State the same in Prerequisites item 1.
Scope check: one printed line; no separate change needed beyond E3.
Q2. setup-deps' failure message points the user the wrong way
Severity: low Status: needs-decision
What happened: with the variable unset, as reproduced under E1, setup-deps.mjs prints "Run this inside Claude Code with the knowledge plugin installed." to a user who is already inside Claude Code with the plugin installed.
Why: extraction/setup-deps.mjs:29.
Options, cheapest first: 1. Name the cause and the fix, for example "no data directory: pass the data-dir flag (the skill body passes ${CLAUDE_PLUGIN_DATA})".
Scope check: one string.
S2. Data-directory resolution reads only the environment (on-demand-dependencies convention)
Severity: standards Status: needs-decision
What happened: the consequence is E1 (reproduced there).
Why: docs/conventions/on-demand-dependencies/README.md:59 orders an explicit flag, then $CLAUDE_PLUGIN_DATA accepted only when its last path segment names the plugin, then the marketplace checkout's .work/, then <config dir>/plugins/data/<plugin>-<marketplace>/. setup-deps.mjs:25 and resolve-hook.mjs:16 implement only the environment rung, without the plugin-name check. Without that check, a session environment that holds another plugin's data dir (a hook can persist it, anthropics/claude-code #60057; the convention records the same observation) would send the install there.
Options, cheapest first: 1. As E1 option 1 plus I2. 2. The full order (E1 option 3).
Scope check: covered by E1.
Open questions for maintainers
E2 fix and severity. Decide how the options reach the pipeline: render them once in the SKILL.md body (suggested default) or another route; and whether E2 is high (auditor) or medium (review: defaults are unaffected). A one-step check closes the confound: set a non-default library_dir and confirm the spoke still shows the token in a skill run. Unblocks: configured library_dir, cookies, js-runtime and concurrency taking effect.
I1 shape. Options: a STOP line only (suggested default) or a defined degraded mode with status: partial. Unblocks: predictable output when the pipeline cannot run.
I2 and S2 scope. Options: the E1 data-dir flag only (suggested default) or the convention's full resolution order now. Unblocks: operators who cannot write under ~/.claude, and the wrong-plugin case.
Q1 and Q2 wording. Options: fold both into the E3 script's output and setup-deps' message (suggested default) or document them under Prerequisites. Unblocks: a user learning where the install goes and how to relocate it.
Research bar for E1, E3 and I3. They are recommendations under the audit's rule (primary plus two independent corroborators). The research skill's verifier graded all researched claims MEDIUM, because its bar counts only corroborators measured on the exact version and 2.1.288 shipped on the fetch date, so every third-party report is from an earlier 2.1 build. Options: accept them as recommendations (suggested default; the vendor page fetched that day and this review's own 2.1.288 runs agree) or hold them at needs-decision until a 2.1.288 third-party report exists. Unblocks: agent pickup of E1, E3, I3.
Not counted: the auditor's two corroborators, this repository's on-demand-dependencies and permission-rule-hygiene conventions, restate the primary page and are not independent; they were replaced.
E3:
Tier 1, primary: https://code.claude.com/docs/en/skills.md, line 731 (auto mode hands the command to Claude), line 729 (abort outside auto mode; pre-approve with allowed-tools). Supports.
Tier 0: the evidence transcript, lines 17, 26-27 (raw/transcript-deps-preflight.md). Supports.
I3:
Tier 1, primary: https://code.claude.com/docs/en/skills.md, line 842: set disable-model-invocation: true to keep Claude from invoking the skill through the Skill tool. Supports.
Tier 0: this review's Skill-tool call to knowledge:setup from a subagent on 2.1.288, refused. Supports.
E2 was researched and not tiered: the vendor page states the mechanism, not the supporting-file case, and the one independent source (anthropics/claude-code#75208, 2.1.202) predates 2.1.288.
Research-skill verdict for all of the above: verification: fail rows 4 (research-verifier, 2026-10-02), all claims MEDIUM (see open question 5).
Review seams
skill-quality:check: run by the audit session; PASS, 0 errors, 3 warnings (raw/skill-quality-check.txt).
Research (discovery:research): used once, inline because the caller is a subagent; sibling verifier dispatched for rows 4, 7, 12.
Breadth review: fell back; review:fanout and review:quality-gate review diffs, not a findings ledger. Structured self-review in seam-review.md.
Adversarial: fell back; no dedicated skill; each finding re-derived from its artifact and the source.
Upstream conformance: fell back; grep -F of every quoted harness span against the saved page, a re-check of the auditor's reads, not an independent conformance skill. All spans found at the cited lines.
Adaptation chapter: used (Opus 5.5); no suggested change conflicts with it.
Scope challenge: fell back; one line per change, recorded in each finding's scope check.
Adversarial disagreements (severities stand as uncalibrated):
E2: high is overstated; every option value in the evidence session was a default, so the defect is latent until a user configures one. Suggest medium.
I1: "no defined stop" overstates it; SKILL.md:216 already says stop on any failed prerequisite. The gap is the Bootstrap gate's narrower STOP list and the missing "a hand-run is not this skill's output" line.
E3: its three vendor pages share one publisher and document different legs, so they do not corroborate each other; the session transcript and #97476 are the independent support.
E1: the setup-deps exit needs no live run (the branch is unconditional when the variable is unset); the import failure is still read from source, not observed.
Environment: Claude Code 2.1.288, WSL2, zsh; auto mode; worktree-isolated session; skill loaded from the main checkout.
Operator constraint: the dispatching brief forbade home-folder writes and system-wide installs (raw/spawn-brief-video.md); findings above are limited to what the skill controls.
Blindspot (not a finding): course-digest appears to share E1 (its preflight and setup-deps read only the environment); not audited here.
Candidates without a session artifact are kept in the packet's contract.md and are not part of this item.
Produced by an unattended audit; nothing in it was confirmed by a human.
Severity: high (auditor-suggested, uncalibrated)
Component: knowledge:video-digest (source at worktree HEAD 0c5fd28; version 0.15.2). The worktree moved to f9cc202 (0.15.3) during review; that diff changes none of the cited code or text, but SKILL.md lines after 124 sit 3 to 6 lines lower there.
Readiness: mixed: E1, E3, I3 agent-ready (recommendations); E2, I1, I2, Q1, Q2, S2 needs-decision
Duplicates: none found; Related: #5835 (open): its A2 prerequisites contract plans a
/<plugin>:checkper plugin and a shared checker, which would cover I3 and the E3 script; #5803 (closed): earlier video-digest pipeline fixes, different defects; #5846 (closed): rendered-views routing for video-digest; #5802 (closed): parent of #5803.Summary
An unattended subagent ran
/knowledge:video-digeston an X video post in an auto-mode,worktree-isolated session. The skill's
!preflight was refused by the worktree command-shapecheck, the node pipeline never ran, and the agent hand-ran yt-dlp, ffmpeg and ImageMagick, so none
of the skill's contract outputs exist. The skill's own defects: every pipeline script and the
preflight probe read the data directory from
process.env.CLAUDE_PLUGIN_DATA, which the Bash toolnever carries, so the pipeline cannot install or load its dependencies from any session (E1); the
preflight is a compound block with no
allowed-toolsentry and no fallback (E3); and every${user_config.*}option sits in spoke files that arrive unsubstituted (E2). A separate cause isthe operator's brief, which forbade home-folder writes; it explains why the agent never tried
setup-deps.mjs, and the skill offered no other install location and no stop for that case (I1,I2). Fixing E1 and E3 makes every documented action runnable from the Bash tool and gives a
truthful readiness report.
Findings
E1. The pipeline cannot find its own data directory from the Bash tool
printenv CLAUDE_PLUGIN_DATA CLAUDE_PLUGIN_ROOT CLAUDE_PROJECT_DIR CLAUDE_SKILL_DIRin the Bash tool exits 1 with all four unset, in the audit session and again in this review's subagent on 2.1.288 (sources/seam-reproduction-2026-10-02.txt). The preflight's own node probe prints MISSING with the variable unset andinstalledwhen the same probe is givenCLAUDE_PLUGIN_DATApointing at a fixture holding the package (audit-notes.mdE1). The data dir exists and is empty (raw/plugin-data-listing.txt).extraction/setup-deps.mjs:25-32exits 1 with "CLAUDE_PLUGIN_DATA is not set" before writing anything;extraction/resolve-hook.mjs:16-18setsdataModules = null, so bare@melodic/*imports fail even after an install;SKILL.md:14probesprocess.env.CLAUDE_PLUGIN_DATA;extraction/run.mjs:67-71passesprocess.envto the child andlib/run-args.jshas no data-dir flag. SKILL.md substitutes${CLAUDE_PLUGIN_ROOT}into script paths but never passes${CLAUDE_PLUGIN_DATA}. Nonode_modulesexists anywhere in the checkout to satisfy the imports otherwise.setup-deps.mjsandrun.mjs(run.mjs forwards it to the child asCLAUDE_PLUGIN_DATA, so resolve-hook.mjs keeps working), named as rung 1 of the on-demand-dependencies convention's "Finding the plugin data directory" (--deps-dirin its inventory example,--data-dirin its Python section), and pass"${CLAUDE_PLUGIN_DATA}"on every SKILL.md invocation, where Claude Code substitutes it at load. 2. Replace the preflight's environment read with the same substituted path (E3 option 1). 3. Implement the convention's full resolution order (S2).transcript,queue,watch,resume) can load its dependencies. Option 1 is the smallest change; option 3 can follow.E2. Every knowledge userConfig option is a silent no-op for video-digest
reference/sources/x.mdreturned the literal text "Supply${user_config.yt_dlp_cookies_file}" (raw/transcript-user-config-token.md, transcript line 57).SKILL.mdcontains no${user_config.*}reference. All 15 lines that carry one are in spokes the model opens with the Read tool (context/output-contract.md:17-24and:44-46,reference/sources/youtube.md:52-69,reference/sources/x.md:190), which return file bytes.output-contract.md:44-46treats a token that is "still an unexpanded token" as the default, so a configuredlibrary_diris ignored without a warning and artifacts land at the repo root; the cookie, js-runtime and concurrency options never reachrun.mjs. Claude Code documents${user_config.KEY}substitution in skill content, "Anywhere in the Markdown body" (manifest-reference lines 494 and 574). The sibling skills docpage-digest and map-corpus renderlibrary_dirin their SKILL.md body. Confound: that option's default is the empty string, and nothing in the packet shows how an empty option renders even in a SKILL.md body, so the observation alone does not separate the two causes; the source-level defect stands either way.library_dir: ${user_config.library_dir}and the four yt-dlp and concurrency options), and have the spokes refer to the rendered value instead of the token. 2. Remove the "unexpanded token means default" rule atoutput-contract.md:44-46, so an unexpanded token is reported as a bug. 3. An eval case that setslibrary_dirand asserts--work-rootreachesrun.mjs.E3. The
!preflight cannot run as written in an auto-mode worktree session, and names no fallbackraw/transcript-deps-preflight.mdline 14, transcript line 17). Claude's Bash call with the exact text was refused: "this command is too complex to verify that it stays inside the worktree. Refusing to run it" (line 31, transcript line 27). No prerequisite report printed, and the agent probed tools one at a time.SKILL.md:13-18is four brace groups withcommand -v, pipes and||chains; the frontmatter has noallowed-tools; the skill says nothing about a refused preflight. Even when it runs, its node line is always MISSING (E1). Outside auto mode, an injected command no rule allows aborts the whole invocation (skills.md line 729, and independently #97476 on 2.1.281); that branch was not reproduced here.node "${CLAUDE_SKILL_DIR}/extraction/check-prereqs.mjs" --data-dir "${CLAUDE_PLUGIN_DATA}"; the script probes the node deps, yt-dlp, ffmpeg, ImageMagick and the faster-whisper import and always exits 0. Whether that shape passes the worktree command-shape check is untested; check it before relying on it. 2. Pre-approve exactly that command in frontmatterallowed-tools, where the same variables are substituted, so it runs at render in default mode. 3. One line under Prerequisites: if the pre-computed context did not run, run that command yourself before Bootstrap.I1. No stop or degraded path at the Bootstrap gate when the node pipeline cannot run
run-state/watch.json, the README stub,research/claim-inventory.md, the research stage orrecommendations/(raw/handback-video.mdproblem 1;raw/slice-listing.txt). The hand path skippedcaptions+repair(x.md:122-123) and lost thecaptionRungandtranscriptStrategyprovenancerun-transcript.js:104-112emits; the handback reports "Cloud Code" for "Claude Code" throughout (whether repair would have fixed it is unverified).SKILL.md:119-120) STOPs only on MISSING yt-dlp, ffmpeg or ImageMagick, and its node step is "Runsetup-deps.mjs" with no failure branch.SKILL.md:216does say "If any prerequisite fails, stop and inform the user", so the two instructions disagree on node deps, and nothing says a hand-run of the tools is not this skill's output. Separate cause: the operator's brief forbade the home-folder write setup-deps needs and asked the agent to report missing tools; continuing by hand was the agent's choice.context/watch-pipeline.md: README fromtemplates/readme-journey.mdwithpipeline: not-run, a transcript header naming the caption class (platform-asr) andrepair: not-applied, slicestatus: partial.I2. No operator override for where the node dependencies install
~/.claude/plugins/data/knowledge-melodic-software/, was off-limits and stayed empty (raw/plugin-data-listing.txt;raw/handback-video.mdproblem 1).setup-deps.mjs:25,34,78-81andresolve-hook.mjs:16take the base only from the environment; there is no flag or option. The convention's.work/rung for a marketplace checkout would have satisfied this session, because the plugin ran from the main checkout.I3. The read-only prerequisite check exists but the model cannot reach it, and the skill never routes to it
raw/handback-video.md)./knowledge:setup checkprobes the same tools read-only, but a subagent cannot invoke it: this review's Skill-tool call toknowledge:setupfrom a subagent was refused with "cannot be used with Skill tool due to disable-model-invocation" (sources/seam-reproduction-2026-10-02.txt).skills/setup/SKILL.md:5setsdisable-model-invocation: true; there is noplugins/knowledge/skills/check/(25 plugins in this repo ship one); video-digest's failure text (SKILL.md:216-217) routes only tosetup-deps.mjs.docs/plugin-philosophy.md:595-600requires a separate check skill when a hook or probe names a read-only check; video-digest's probe names none, so this is a gap, not a violation.plugins/knowledge/skills/check/SKILL.mdin the context7 shape (reads setup, follows only itschecksection,disable-model-invocation: false). 3. Add faster-whisper detection to setup's check as an INFO row.Q1. The skill installs into the home data directory without first saying what and where
setup-deps.mjsto learn the install target and contents (raw/transcript-deps-preflight.mdlines 40-99, transcript lines 45-48).SKILL.md:119), andskills/setup/SKILL.md:45says "each ingest skill self-provisions on first run"; nothing names the target (~/.claude/plugins/data/<id>/node_modules) or that it pulls the vendored packages and their registry dependencies.Q2. setup-deps' failure message points the user the wrong way
setup-deps.mjsprints "Run this inside Claude Code with the knowledge plugin installed." to a user who is already inside Claude Code with the plugin installed.extraction/setup-deps.mjs:29.${CLAUDE_PLUGIN_DATA})".S2. Data-directory resolution reads only the environment (on-demand-dependencies convention)
docs/conventions/on-demand-dependencies/README.md:59orders an explicit flag, then$CLAUDE_PLUGIN_DATAaccepted only when its last path segment names the plugin, then the marketplace checkout's.work/, then<config dir>/plugins/data/<plugin>-<marketplace>/.setup-deps.mjs:25andresolve-hook.mjs:16implement only the environment rung, without the plugin-name check. Without that check, a session environment that holds another plugin's data dir (a hook can persist it, anthropics/claude-code #60057; the convention records the same observation) would send the install there.Open questions for maintainers
library_dirand confirm the spoke still shows the token in a skill run. Unblocks: configuredlibrary_dir, cookies, js-runtime and concurrency taking effect.status: partial. Unblocks: predictable output when the pipeline cannot run.~/.claude, and the wrong-plugin case.knowledge:checknow. Unblocks: a model-reachable readiness check.Research
All fetches 2026-10-02 (rung-1
curlof the.mdfor vendor pages; GitHub REST API JSON for issues; saved undersources/).E1:
${...}inline. Supports.CLAUDE_PLUGIN_ROOTand noCLAUDE_PLUGIN_DATAin the agent Bash tool, main session and a plugin-defined subagent. Supports.echo "$CLAUDE_PLUGIN_ROOT"empty in a command's Bash env. Supports.printenvin a subagent's Bash tool on 2.1.288, exit 1. Supports.CLAUDE_PLUGIN_ROOTpresent in the agent Bash env; CLAUDE_PLUGIN_DATA is unnamespaced — plugins persisting it via CLAUDE_ENV_FILE pollute other plugins and skills anthropics/claude-code#60057 shows a hook can persist the variable throughCLAUDE_ENV_FILE, which explains it. Historical.E3:
allowed-tools). Supports.${CLAUDE_PLUGIN_VERSION}anthropics/claude-code#97476 (third party, 2.1.281): an injected command without anallowed-toolsentry aborts the invocation outside auto mode. Supports.raw/transcript-deps-preflight.md). Supports.I3:
disable-model-invocation: trueto keep Claude from invoking the skill through the Skill tool. Supports.knowledge:setupfrom a subagent on 2.1.288, refused. Supports.E2 was researched and not tiered: the vendor page states the mechanism, not the supporting-file case, and the one independent source (anthropics/claude-code#75208, 2.1.202) predates 2.1.288.
Research-skill verdict for all of the above:
verification: fail rows 4 (research-verifier, 2026-10-02), all claims MEDIUM (see open question 5).Review seams
raw/skill-quality-check.txt).discovery:research): used once, inline because the caller is a subagent; sibling verifier dispatched for rows 4, 7, 12.review:fanoutandreview:quality-gatereview diffs, not a findings ledger. Structured self-review inseam-review.md.grep -Fof every quoted harness span against the saved page, a re-check of the auditor's reads, not an independent conformance skill. All spans found at the cited lines.Adversarial disagreements (severities stand as uncalibrated):
SKILL.md:216already says stop on any failed prerequisite. The gap is the Bootstrap gate's narrower STOP list and the missing "a hand-run is not this skill's output" line.Evidence
/home/kyle/worktrees/melodic-software-claude-code-plugins-feat-5778-mod-conventions/.work/plugin-quality/evidence/f5c77f0d-9bcd-492e-a773-1fa651e926a0/knowledge-video-digest/20261002T233255Z/(audit-notes.md,audit-notes-2.md,seam-review.md,contract.md,evidence.md).raw/transcript-deps-preflight.md,raw/transcript-user-config-token.md,raw/handback-video.md,raw/slice-listing.txt,raw/plugin-data-listing.txt,raw/spawn-brief-video.md,raw/skill-quality-check.txt;sources/seam-reproduction-2026-10-02.txt./home/kyle/.claude/projects/-home-kyle-worktrees-melodic-software-claude-code-plugins-feat-5778-mod-conventions/f5c77f0d-9bcd-492e-a773-1fa651e926a0/subagents/agent-af930ae4d4082e19a.jsonl.raw/spawn-brief-video.md); findings above are limited to what the skill controls.contract.mdand are not part of this item.