feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance#773
Conversation
…ring guidance Two coordinated changes for the `!` dynamic-context-injection concern. skill-quality: add check 18 (precompute opportunity) to check-skill.sh — an advisory WARN, never a FAIL. It flags a SKILL.md that gathers deterministic, read-only context by telling Claude to run shell commands at invocation, when that output could instead be inlined at load time via `!`command`` / ```! injection (one preprocessing pass, no per-invocation tool round-trip). Heuristic: scans fenced shell blocks whose command lines are all read-only context-gatherers (a write-token denylist disqualifies mutating blocks and redirections), and stays silent when the skill already uses any `!` injection. A static scan cannot tell an instruction-to-run block from an illustrative example, so the WARN is a candidate to hand-verify; it reads fenced blocks only and under-reports by design (documented in the check skill Gotchas). The WARN points at the official #inject-dynamic-context docs, not another plugin, so it stays valid in any consumer repo. Four fixture cases added; eighteen-check rename applied across script header, plugin.json, README, and the check SKILL.md; one eval case added. playbooks: codify precompute authoring guidance in skill-authoring as a locally-owned reference/precompute-context.md spoke (kept out of the upstream- distilled body; vendor/SKILL.md untouched) plus a hub pointer. Covers when to precompute vs not, and the conventions we pin: a mandatory `|| echo "<fallback>"` defensive form and shell:/Windows-host awareness. Both are pinned-by-us because the skills docs do not yet document `!` failure/timeout/stderr semantics (verified absent 2026-07-20) — recheck trigger: upstream documents those semantics. Syntax detail points at the official docs rather than restating it. Both plugins bumped a minor version; root catalog regenerated. Verified: check-skill test suite (22 assertions), shellcheck clean (repo rcfile), markdownlint clean, both skills pass the full /skill-quality:check gate, changelog parity, catalog sync. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 4m 26s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
SummaryThis PR is well-implemented and follows the repo's design principles. The new check 18 is correctly advisory-only (WARN never FAIL), the write-token denylist/allowlist architecture is defensively conservative, all existing tests should continue to pass, and the playbooks spoke is clean. Four minor issues below, all non-blocking. Findings1.
Reference bundled scripts with `${CLAUDE_SKILL_DIR}` (or `${CLAUDE_PLUGIN_ROOT}` for a plugin's own tree)
2. if grep -qE '(^|[[:space:]])(commit|push|...|run)([[:space:]]|$)' <<<"$line"; then
This is under-reporting (missed opportunity), which is the stated conservative design. Low impact. Worth noting in the check's documented limitations if not already there, or narrowing to 3. Test gap: non-shell fenced block should not trigger the check The four new test cases (18a–18d) cover: read-only candidate, already-injecting, side-effecting, and git-write. There's no test verifying that a Suggested test case: # 18e. A non-shell fenced block is not flagged.
make_skill precompute-notshellfence '---
name: precompute-notshellfence
description: "Returns JSON. Use when: '"'"'needing json'"'"'."
---
## Steps
```json
{"key": "value"}GotchasNone known. This is a whole-file byte scan — it would match This is an edge case (skills describing Positive notes
|
|
Claude finished @kyle-sexton's task in 2m 46s —— View job Security Review — PR #773
No security vulnerabilities found. Findings below, most-severe first. FindingsSUGGESTION — confidence: HIGHWrite-token denylist is per-line, not per-subcommand: This is a heuristic correctness note, not a security defect. The What I checked
No new egress, secrets handling, code execution, or permission changes in this PR. The PR description's self-assessment ("read-only static scan + documentation only; no new execution, egress, secrets, or MCP servers") is accurate. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a23efaf1ee
ℹ️ 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".
…ck 18 Addresses converging Codex (P2) and Claude review feedback on PR #773: check 18 allowed `git`/`gh` wholesale and leaned on a write-token denylist, so a mutating subcommand not in the denylist (`git clean`, `git stash`, `git branch -D`) was classified as a read-only precompute candidate — advice that, if followed, would auto-run the mutation on every invocation. The denylist token `run` also wrongly disqualified read-only `gh run view/list`. Replace the wholesale+denylist approach with a read-only SUBCOMMAND allowlist for git and gh (pure readers keep a narrow embedded-mutation screen). An unlisted git subcommand or a gh write verb is now never read-only — the miss lands on the safe side (a missed opportunity, never a suggestion to auto-run a mutation), and `gh pr diff` / `gh run list` are correctly recognized. Three fixtures added (git stash/clean silent, non-shell json fence silent, gh read-only fires); 25 assertions pass, shellcheck + markdownlint clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 18s —— View job Security Review — PR #773
No exploitable security vulnerabilities found. One SUGGESTION below. FindingsSUGGESTION — confidence: HIGH
The pure-reader commands ( Impact is bounded: this is an advisory WARN only; no code is executed and no mutation happens unless the skill author manually acts on the advice. This is a false-positive quality issue rather than a direct security exploit. Applying the embedded-mutation grep screen to the What I checked
|
|
Claude finished @kyle-sexton's task in 2m 59s —— View job PR Review — refactor(skill-quality): git/gh read-only subcommand allowlist in check 18
SummaryThe latest commit ( One prior review finding is resolved (confirmed false alarm). Three new fixtures cover the three gaps originally noted. Two minor edge cases remain, both non-blocking. Findings1. The previous Claude review flagged 2. The subcommand extraction: local sub="${line#git}"
sub="${sub#"${sub%%[![:space:]]*}"}"
sub="${sub%%[[:space:]]*}"For 3. For a line like 4. Three new fixtures — all correct
Assertion message for 18d also correctly updated from "write-token denylist" to "subcommand allowlist" to reflect the new mechanism. Positive notes
VerdictThe refactor is sound and complete for its stated scope. The two remaining edge cases (#2, #3 above) are both safe-miss direction and well within the documented "advisory heuristic, not a defect" contract for check 18. No blocking issues. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4330015c7e
ℹ️ 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".
Addresses a current Codex P2 on PR #773: the read-only classifier inspected only the head of a command line, so a read-only command piped into a mutating sink — `git status --short | tee snapshot.txt`, `... | xargs rm` — passed the git/gh subcommand allowlist and was flagged as a precompute candidate, advising the user to auto-run the mutation on every invocation. A line is now disqualified when it contains a pipe. The logical `||` operator (our recommended `|| echo "<fallback>"` defensive form) is stripped before the test, so a read-only command carrying a fallback is still recognized as a candidate — the one behavior the pipe rule must not break. Two fixtures added (piped sink silent, `|| echo` fallback still fires); 27 assertions pass, shellcheck clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 30s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
SummaryThis is a clean, well-structured three-commit PR. The check 18 implementation is correct, its heuristic bias is in the right direction (safe miss, never false-safe), and all prior reviewer P2/blocking issues have been resolved. No blocking issues remain. Two minor non-blocking observations below. Latest commit (
|
| Finding | Source | Status |
|---|---|---|
| Mutating git subcommands not on a denylist | Codex P2 (commit a23efaf) |
✅ Resolved by 4330015 (allowlist replaces denylist) |
run blocks gh run view/list |
Claude review #2 | ✅ Resolved by 4330015 (allowlist admits list) |
| Test gap: non-shell fenced block | Claude review #3 | ✅ Resolved by 4330015 (fixture 18f) |
| Mutating pipeline after read-only head | Codex P2 (commit 4330015) |
✅ Resolved by b012f7e |
Whole-file ! gate triggered by prose |
Claude review #4 | ✅ Documented in SKILL.md Gotchas |
${CLAUDE_SKILL_DIR} validity |
Claude review #1 | ✅ Confirmed valid — used in docs-hygiene, code-tidying, firecrawl |
Observation 1 — git -C /path log safely misses (non-blocking)
The subcommand extractor strips git and leading whitespace, then takes the first token:
local sub="${line#git}"
sub="${sub#"${sub%%[![:space:]]*}"}"
sub="${sub%%[[:space:]]*}"For git -C /repo log, sub resolves to -C, which is not in the allowlist → return 1. This is a safe-miss (missed precompute opportunity, never advice to run a mutation). git -C prefixed invocations are uncommon in SKILL.md bodies. Not blocking.
Observation 2 — gh command containing "comment" as a bare word in a value safely misses (non-blocking)
For gh issue list --search "fix comment styling", the pattern *" comment "* matches comment in the search value → return 1. This disqualifies a valid candidate. Impact is low — search arguments with bare comment in a SKILL.md are rare and the existing Gotchas already covers under-reporting. Safe-miss direction. Not blocking.
Positive notes
||-strip logic: Correctly differentiates||(logical OR fallback) from|(pipe sink). The strip is applied to the whole line before the pipe check, so the fallback form the guidance mandates is never accidentally disqualified.- Allowlist architecture (commits
4330015): The conservative default (unlisted subcommand →return 1) ensures new git or gh subcommands introduced after this PR is merged land on the safe side without requiring a code update. - 9 test fixtures (18a–18i): Cover all primary branches: read-only candidate, already-injecting gate, side-effecting command, git write subcommand, unlisted git subcommand, non-shell fence, gh read verbs, pipe-sink disqualification, and
||fallback preservation. Assertion messages are specific and diagnostic. - Gotchas section in check SKILL.md: Accurately characterizes check 18 as heuristic-advisory, explains the under-reporting-by-design behavior, and flags the
!whole-file gate edge case. precompute-context.md: Clean, locally-owned spoke. "Recheck trigger" convention is good practice. Mandatory defensive fallback +shell:awareness conventions are correctly scoped as Melodic pinning on top of undocumented upstream semantics.- Repo-agnostic WARN text: Points at
https://code.claude.com/docs/en/skills#inject-dynamic-contextrather than another plugin. Valid in any consumer repo.
Verdict
Ready to merge. The three commits form a coherent, well-reviewed progression. All P2/blocking findings from prior reviews are resolved. The two remaining observations both land in the safe-miss direction, are consistent with the documented "advisory heuristic, not a defect" contract, and are non-blocking.
|
Claude finished @kyle-sexton's task in 3m 17s —— View job Security Review — PR #773 (commit b012f7e)
No exploitable security vulnerabilities found. One SUGGESTION below. FindingsSUGGESTION — confidence: HIGH
The b012f7e fix correctly rejects single-pipe mutations (
A WARN is issued advising the author to convert the block to The pure-reader branch (e.g., Practical impact is bounded: the check is advisory only (WARN, never FAIL), the author must manually convert, and the documented recommended form ( Narrowest fix: after resolving the git)
...
case "$sub" in
status | log | ...)
grep -qE '(^|[[:space:]])(rm|mv|cp|tee|sed|mkdir|touch|delete|-delete)([[:space:]]|$)' <<<"$line" && return 1
return 0 ;;
*) return 1 ;;
esacOr document the gap explicitly in the check 18 Gotchas: " What I checkedShell injection via SKILL.md content — SKILL.md lines enter the loop via
PRECOMPUTE_INJECTS gate — Fence scanner CommonMark correctness — inner
No GitHub Actions workflow changes in this PR. No new |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b012f7ecf2
ℹ️ 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".
Forward-merge to clear conflicts from #770/#774 and a playbooks 0.2.1 patch that landed on main. Resolved: playbooks plugin.json version 0.3.0 (my minor feature bump supersedes main's 0.2.1 patch); playbooks CHANGELOG keeps both entries (0.3.0 then 0.2.1). Catalog regenerated (in sync); no skill-quality conflicts.
|
Claude finished @kyle-sexton's task in 4m 41s —— View job Security Review — PR #773 (commit 9e23619)
No GitHub Actions workflow changes. No new permissions, MCP servers, egress declarations, or execution surfaces. SKILL.md content is never executed — the scanner consumes lines only via FindingsIMPORTANT — confidence: HIGH
After the pipe guard (line 428–431) passes, the Tracing
The same gap exists for the Narrowest fix: before the git)
...
case "$sub" in
status | log | ...)
case "$line" in *'&&'* | *';'*) return 1 ;; esac
return 0 ;;
*) return 1 ;;
esacOr apply the same embedded-mutation grep used in the pure-reader branch against the full SUGGESTION — confidence: HIGH
The intent is to allow the recommended defensive form This was raised as a SUGGESTION in the security review of commit Narrowest fix: scope the strip to only local no_or="${line}"
no_or="${no_or//||\ echo*/}"
no_or="${no_or//||\ printf*/}"Or screen for a restricted set of post- What I checkedShell injection — SKILL.md content enters only via
GitHub Actions — no workflow files changed. Safe. |
|
Claude finished @kyle-sexton's task in 5m 36s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
SummaryThe two remaining open Codex P2 findings on Codex P2 findings — verified and fixedFinding 1:
|
| Case | Input | Expected | Rationale |
|---|---|---|---|
| 18j | git status --short && touch marker |
No WARN | && after ` |
| 18k | find . -exec rm {} + |
No WARN | -exec in mutation token list → return 1 |
| 18l | env bash ./scripts/deploy.sh |
No WARN | env removed from allowlist → *) return 1 |
Total assertions: 30 (up from 27).
Changes made locally (commit 5d987e1, push blocked)
plugins/skill-quality/CHANGELOG.md | 6 +-
plugins/skill-quality/scripts/check-skill.sh | 15 ++---
plugins/skill-quality/scripts/check-skill.test.sh | 75 ++++++++++++
The push to feat/precompute-check-and-guidance was denied (github-actions[bot] lacks write access to this repo). Please cherry-pick or apply the three changes above — they're minimal and each corresponds directly to one P2 finding. The rest of the PR is ready to merge once these three gaps are closed.
Prior findings status (all resolved)
| Finding | Source | Status |
|---|---|---|
| Mutating git subcommands (clean, stash, etc.) | Codex P2 (a23efaf) |
✅ 4330015 |
run blocks gh run view/list |
Claude review | ✅ 4330015 |
| Non-shell fenced block test gap | Claude review | ✅ 4330015 |
| Mutating pipeline after read-only head | Codex P2 (4330015) |
✅ b012f7e |
&&/; continuations not gated |
Codex P2 (b012f7e) |
✅ 5d987e1 (local) |
env CMD classified read-only |
Codex P2 (b012f7e) |
✅ 5d987e1 (local) |
find -exec classified read-only |
Codex P2 (b012f7e) |
✅ 5d987e1 (local) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9e23619d5e
ℹ️ 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".
Addresses four more Codex P2s on PR #773, all the same class: a line that passes the head-command allowlist while hiding a mutation the token check never saw. `env FOO=bar bash x` / `find -exec ./x {} +` (command launchers), `git status && touch marker` / `ls; bash x` (continuations), `git status "$(touch marker)"` (command substitution), and `git diff --output=f` (file-writing option) were all classified read-only, so converting them to `!` injection would auto-run the mutation at load. Rather than enumerate more safe forms, the classifier now fails closed: any redirection, command/process substitution (`$(...)`, backtick), backgrounding or chaining (`&`, `&&`, `;`), or bare pipe disqualifies the line (`|| echo` stripped first so the fallback form survives), and a side-effecting option on an allowlisted reader (`find -exec`/`-delete`/`-fprint*`, `git diff --output`) is screened. `env` dropped from the reader allowlist (it launches commands). Four fixtures added; 31 assertions pass, shellcheck + gate clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 24s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
SummaryThe latest commit ( Prior findings status — all clear
Observation 1 —
|
|
Claude finished @kyle-sexton's task in 4m 7s —— View job Security Review — PR #773 (commit 0da65d5)
One finding below. All prior P2 findings from earlier review passes are resolved. No injection, path-traversal, secrets, or GitHub Actions issues in the new code. FindingsIMPORTANT — confidence: HIGH
The Tracing
WARN is issued; the skill is flagged as a precompute candidate. If an author follows the advisory and converts to: … The Impact: Advisory WARN only; the author must manually act. But a careful author trusting check 18 on a line like Narrowest fix — extend the mutation grep at line 443 to include shell interpreters and common network/execution tools: grep -qE '(^|[[:space:]])(-exec|-execdir|-ok|-okdir|-delete|-fprintf|-fprint|-fls|--output|rm|mv|cp|tee|sed|mkdir|touch|bash|sh|python[23]?|node|ruby|perl|curl|wget|nc|ssh|xargs)([[:space:]=]|$)' <<<"$line" && return 1Or, stricter — validate what follows # reject any || <other-than-echo/printf> form
case "$line" in
*'||'*)
local after_or="${line#*||}"
after_or="${after_or#"${after_or%%[![:space:]]*}"}" # ltrim
case "$after_or" in echo\ * | printf\ * | echo | printf) ;; *) return 1 ;; esac
;;
esacWhat is confirmed fixed since prior reviews
What I checkedShell injection via SKILL.md content — Lines enter the loop via
GitHub Actions — no workflow files changed. Safe. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0da65d5035
ℹ️ 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".
Addresses a further Codex P2 on PR #773: `git diff --ext-diff` runs a repo-configured diff.external helper (and --textconv runs a textconv filter), so an allowlisted git reader carrying that flag could execute a program at load. Both flags are now screened alongside --output. A code comment records the inherent limit a static line scan cannot close: repo config can attach programs to a plain `git diff` (default diff.external / textconv on configured paths). One fixture added; 32 assertions pass, shellcheck + gate clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 53s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
Summary
One prior IMPORTANT security finding from the Prior findings status
Open finding — non-blocking
The mutation grep screens for write-side tokens ( git status || bash ./deploy.shtraces through
An author who follows the advisory and converts to Bounding factors (why non-blocking):
Recommended closure (pick one):
Positive notes
VerdictNear-ready to merge. The five-commit progression is a well-documented, defensively-correct implementation of an advisory heuristic. All Codex P2 findings are resolved. The one remaining open finding ( |
|
Claude finished @kyle-sexton's task in 2m 41s —— View job Security Review — PR #773 (commit d727bc1)
One finding below. The FindingsIMPORTANT — confidence: HIGH
This finding was raised in the security review of Tracing
The Narrowest fix — validate what follows # Inside precompute_readonly_line(), before the existing `local no_or` block:
case "$line" in
*'||'*)
local after_or="${line#*||}"
after_or="${after_or#"${after_or%%[![:space:]]*}"}" # ltrim
case "$after_or" in echo\ * | printf\ * | echo | printf) ;; *) return 1 ;; esac
;;
esacThis directly enforces the documented convention ( What the latest commit (
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d727bc1922
ℹ️ 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".
Two more Codex P2s on PR #773. (1) The `||` handling stripped any `|| <cmd>`, so `git status --short || bash ./recover.sh` passed as read-only — the sanctioned continuation is `|| echo` specifically. Now only `|| echo <fallback>` is removed before the residual-pipe test; a `||` into any other command leaves a pipe char and fails closed (the `|| echo` candidate form is preserved). (2) find's null-separated `-fprint0` file-output primary slipped past the `-fprint` screen (word-boundary mismatch); added explicitly alongside -fprint/-fprintf/-fls. Two fixtures added; 34 assertions pass, shellcheck + gate clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @kyle-sexton's task in 3m 35s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
Summary
Prior findings status — all clear
Latest commit (
|
|
Claude finished @kyle-sexton's task in 4m 37s —— View job Security Review — PR #773 (commit 1ffc20c)
|
| Finding | Source | Status |
|---|---|---|
Mutating git subcommands (git stash, git clean) |
Codex P2 (a23efaf) |
✅ 4330015 |
run blocked gh run view/list |
Claude review | ✅ 4330015 |
| Non-shell fenced block test gap | Claude review | ✅ 4330015 |
Mutating pipeline after read-only head (| tee) |
Codex P2 (4330015) |
✅ b012f7e |
&&/; continuations not gated |
Codex P2 (b012f7e) |
✅ 0da65d5 — *'&'* / *';'* |
$() command substitution not screened |
Codex P2 (9e23619) |
✅ 0da65d5 — *'$('* |
env CMD classified read-only |
Codex P2 (b012f7e) |
✅ 0da65d5 — env dropped from allowlist |
find -exec/-delete/-fprint/-fls classified read-only |
Codex P2 (b012f7e) |
✅ 0da65d5 |
git diff --output=file classified read-only |
Codex P2 (9e23619) |
✅ 0da65d5 |
git diff --ext-diff/--textconv runs helper |
Codex P2 (0da65d5) |
✅ d727bc1 |
|| bash ./deploy.sh classified read-only |
Security IMPORTANT (d727bc1) |
✅ 1ffc20c — only || echo is stripped |
find -fprint0 word-boundary miss |
Codex P2 (d727bc1) |
✅ 1ffc20c — -fprint0 added explicitly |
Whole-file ! gate triggered by prose |
Claude review | ✅ Documented in SKILL.md Gotchas |
${CLAUDE_SKILL_DIR} validity |
Claude review | ✅ Confirmed — used in docs-hygiene, code-tidying, firecrawl, playbooks/update |
No open security findings remain. 34 assertions, shellcheck clean, gate passes.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @kyle-sexton's task in 3m 7s —— View job Security Review — PR #773 (HEAD fe9c363)
No security vulnerabilities found. The HEAD commit ( What I checked
|
| Finding | Source | Status |
|---|---|---|
Mutating git subcommands (git stash, git clean) |
Codex P2 (a23efaf) |
✅ 4330015 |
run blocked gh run view/list |
Claude review | ✅ 4330015 |
| Non-shell fenced block test gap | Claude review | ✅ 4330015 (fixture 18f) |
Mutating pipeline after read-only head (| tee) |
Codex P2 (4330015) |
✅ b012f7e |
&&/; continuations not gated |
Codex P2 (b012f7e) |
✅ 0da65d5 |
$() command substitution not screened |
Codex P2 (9e23619) |
✅ 0da65d5 |
env CMD classified read-only |
Codex P2 (b012f7e) |
✅ 0da65d5 |
find -exec/-delete/-fprint classified read-only |
Codex P2 (b012f7e) |
✅ 0da65d5 |
git diff --output=file classified read-only |
Codex P2 (9e23619) |
✅ 0da65d5 |
git diff --ext-diff/--textconv runs external helper |
Codex P2 (0da65d5) |
✅ d727bc1 |
|| bash ./deploy.sh classified read-only |
Security IMPORTANT (d727bc1) |
✅ 1ffc20c — only || echo is stripped |
find -fprint0 word-boundary miss |
Codex P2 (d727bc1) |
✅ 1ffc20c — -fprint0 added explicitly |
Whole-file ! gate triggered by prose |
Claude review | ✅ Documented in SKILL.md Gotchas |
${CLAUDE_SKILL_DIR} validity |
Claude review | ✅ Confirmed — used in multiple plugins |
No open security findings.
|
Claude finished @kyle-sexton's task in 2m 6s —— View job PR Review — feat(skill-quality,playbooks): precompute-opportunity check and authoring guidance
Post-merge verificationThe trigger is the merge commit The catalog ( Prior findings — all clearAll P2/IMPORTANT findings raised across six prior review passes are resolved. Summary table:
Two minor observations (non-blocking, unchanged from last review)1. The subcommand extractor ( 2. The write-verb pattern Both observations land in the documented safe-miss direction, consistent with the advisory-only contract. Positive notes
VerdictReady to merge. The six-commit progression addresses every raised P2/IMPORTANT finding across five prior review passes. The merge is clean. The two remaining minor observations are both in the safe-miss direction and within the documented "advisory heuristic, not a defect" contract. |
…#793) ## Summary M2 `!` precompute sweep across all plugins' skills. The mandate was to convert deterministic, read-only, render-time-valid context-gathering shell blocks to `!` dynamic-context injection (per `plugins/playbooks/skills/skill-authoring/reference/precompute-context.md`), under-converting and skipping ambiguous cases. **Outcome: exactly one sound conversion repo-wide — `claude-ops/changelog`.** The sweep was deliberately conservative; every other fenced shell block was disqualified. ### What changed - **`claude-ops/changelog` — version probe converted.** The version-awareness step ran `claude --version` as a body instruction (a per-invocation tool round-trip on every `apply`/`diff`). It now injects at load time: `` !`claude --version || echo "(CC version unavailable)"` `` Deterministic, read-only, needed up front, judgement-independent, cheap + stable output. Carries the mandated `|| echo` fallback (Q14). The bash-only `2>/dev/null` redirect was dropped so the command and fallback stay valid on both the bash default and the Windows PowerShell fallback host (no `shell:` frontmatter needed once portable). - `claude-ops` bumped `0.15.3 → 0.15.4` + CHANGELOG entry (rebased above #791's 0.15.3, merged forward from `origin/main` mid-review). Description unchanged → no root-catalog regen. ### Why the list is so short The check-18 precompute detector (skill-quality) emits **zero** WARNs repo-wide. By construction it fail-closes on `bash script.sh` (unknown head command) and on `2>/dev/null` (its `>` guard), so a clean `git status`/`git diff` preamble — the shape it *would* flag — simply does not exist in these skills. Every remaining fenced block is in the judgement-call tail the UNDER-CONVERT mandate targets, and the manual pass rejected all of them. ### Skipped-candidate ledger Every non-vendor, non-setup skill with a fenced shell block was manually reviewed. Disqualification reasons: | Skill(s) | Reason skipped | |---|---| | `kindle-dedrm/manage` | **Reverted a prior-session conversion.** `status.sh` spawns 3 `powershell.exe` subprocesses + a full Calibre Library `find` (not cheap/bounded, under undocumented `!` timeout) and emits a `captured_at` timestamp + changing book counts (unstable output → CC re-appends full rendered skill each invocation, v2.1.202+). | | `claude-ops/lanes`, `session-flow/handoff` | Mutating (spawns/kills sessions). | | `claude-ops/morning-brief`, `claude-ops/plugins`, `repo-fleet-hygiene/audit`, `skill-quality/check`, `ai-briefing/generate` | The skill's core **action/deliverable**, not a context preamble; also argument-dependent. | | `claude-ops/observability` | Conditional on `$1`; `exec`/delegate logic. | | `claude-config/audit-permission-grants` | Core action (produces the report), requires `jq`, not a preamble. | | `claude-config/audit-automation-gaps`, `testing/plan`, `context7/lookup`, `firecrawl/firecrawl` | Illustrative templates / Claude-derived args (`<tool-command>`, `HEAD~N`, `<name>`/`<question>`, URLs). | | `code-tidying/batch-simplify` | Conditional mode branch; Claude-derived `NORMALIZED_TIME_WINDOW`. | | `code-tidying/tidy`, `docs-hygiene/compress`, `work-items/decompose`, `source-control/commit` | Mutating (`gh pr comment`, `mktemp`/`cp`, `create-item`, `git commit`). | | `planning/draft-goal-condition`, `work-items/work` | Argument-dependent (`<LIMIT>`, `<path>`, `<id>`). | | `repo-hygiene/clean`, `session-flow/retro`, `toolchain/check`, `toolchain/lint`, `source-control/pull-request`, `work-items/scan-todos`, `knowledge/course-digest` | Procedural `VAR=$(...)` assignments consumed by later body steps (single-pass injection can't feed a later step) and/or Claude-derived-argument extraction. | | `knowledge/youtube-digest` | **Already precomputes** — carries `!` injection for its toolchain deps (video-digestion/yt-dlp/ffmpeg/ImageMagick) with `|| echo` fallbacks. Its 13 fenced blocks are all Claude-derived-argument `node run.mjs <script.js> <url>/<slice-dir>` action invocations (many mutating), not context preambles. Pre-existing observation, not touched here: those injections use bash-only `2>/dev/null | head -1` without a `shell:` declaration — a portability inconsistency for a future pass. | | `playwright/playwright` (top-level, non-vendor) | Illustrative quick-start; `playwright-cli` commands are Claude-derived-argument (`<flow>`, `<url>`, element refs like `e42` read from a prior snapshot) and `kill-all` is mutating. | | `*/vendor/*` (`playbooks/boris`, `playwright/vendor`, `context7/lookup`) | Upstream-synced materializations — hard-excluded (check 8 byte-identity + CLAUDE.md managed-file rule). | | `*/setup` skills | One-time provisioning, not every-invocation context. | ### Verification - `skill-quality:check changelog` → **PASS, 0 errors**. Check 18 is silent on the converted skill (it now injects with `!`). The one WARN ("no Gotchas surface") is pre-existing and unrelated to this change — out of scope for this precompute-only sweep. - `origin/main` merged forward before work (was 2 behind; fast-forward, no force-push). - `kindle-dedrm` files restored byte-identical to HEAD. ## Related No linked issue. Part of the Skill M program (better precomputed context — `!` executions in skill `.md`). Companion to the M1 authoring-guidance + detector work already shipped in #773 (skill-quality 0.7.0). This PR is item 1 (the one-time sweep over own plugins' skills). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

What
Two coordinated changes for the
!dynamic-context-injection concern (one concern, one PR).No linked issue — this implements ledger "Skill M" items 2–3 (authoring guidance + repeatable check), which have no standalone GitHub issue.
skill-quality — check 18 (precompute opportunity)
Adds an advisory WARN (never a FAIL) to
check-skill.shand its skill. It flags aSKILL.mdthat gathers deterministic, read-only context by telling Claude to run shell commands at invocation, when that output could instead be inlined at load time via!command`` /```!injection (one preprocessing pass, no per-invocation tool round-trip).git/gh(so an unlisted mutation likegit stashorgh pr mergeis never read-only), redirections excluded; stays silent when the skill already uses any!injection.#inject-dynamic-contextdocs, not another plugin, so it stays valid in any consumer repo.seventeen→eighteenrename applied across the script header,plugin.json, README, and the checkSKILL.md; one eval case added.playbooks — precompute authoring guidance in skill-authoring
Codified as a locally-owned
reference/precompute-context.mdspoke (kept out of the upstream-distilled body;vendor/SKILL.mduntouched) plus a hub pointer.disableSkillShellExecutionkill switch,shell:awareness, substitution variables — all pointing at the official docs rather than restating syntax.|| echo "<fallback>"defensive form andshell:/Windows-host awareness. Rationale: the skills docs do not document!failure/timeout/stderr semantics (verified absent 2026-07-20). Recheck trigger: upstream documents those semantics.Verification
check-skill.test.sh: 22 assertions pass (4 new).shellcheckclean (repo.shellcheckrc);markdownlint-cli2clean on all changed markdown./skill-quality:checkgate.Related
!precompute sweep across all plugins — is a separate follow-up lane (M2), not part of this PR. This PR delivers the repeatable check and the authoring guidance that sweep will lean on.Notes for the merge orchestrator
origin/main@4b4b67d; main has since advanced. Expect a possible conflict on theseventeen/eighteenlines and the generated catalog block — regenerate the catalog (node scripts/generate-catalog.mjs) after any concurrent description change lands.🤖 Generated with Claude Code