Skip to content

fix(docs-hygiene): narrow audit-noise's negation shape to imperatives (0.21.1) - #3202

Merged
kyle-sexton merged 4 commits into
mainfrom
claude/work-items-integration-o22y7w
Aug 23, 2026
Merged

fix(docs-hygiene): narrow audit-noise's negation shape to imperatives (0.21.1)#3202
kyle-sexton merged 4 commits into
mainfrom
claude/work-items-integration-o22y7w

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Closes #3201

Summary

The negation shape shipped in 0.21.0 (#3194) selects far too broadly to be usable. This adopts the two scope gates from #3180, which had already established and corpus-calibrated them while open against the same issue.

Fix

The measurement, on an 85-file sample of this repo's own tracked markdown (plugins/docs-hygiene + plugins/source-control, minus evals/fixtures and CHANGELOG.md):

Shape Before After
negation 1053 31
ghost-ref 3 3
ticket-pr-residue 2 2
citation 2 2
scope-meta 1 1
plan-reference 1 1
enum-list 1 1

12.4 negation findings per file, 99% of everything the skill produced — the eight older shapes produced 10 between them. Every other shape's count is byte-identical before and after, so the entire delta is this shape.

Two gates, both load-bearing:

  1. Imperative only — the cue must open the line, after list, blockquote and emphasis markers. write-for-agents "Prompt the positive" is a rule about instructions, so descriptive prose (Older versions do not support this flag.) was never in its scope. A mid-sentence cue is excluded by construction and that is the right result: a correctly paired sentence puts the cue after its positive (Prefer X; never Y), so the test declines exactly what is already compliant.
  2. The line must close its own sentence — this repo hard-wraps prose and the pairing rule is per sentence, so a continuation line cannot be shown to lack a positive sitting on the next line. The same test excludes a table row, which ends in |.

Accepted cost, stated rather than hidden: a subject-led instruction (The agent must not emit a bare summary.) no longer selects. Pinned by an assertion so a future widening cannot pass silently.

Verification

Gate Result
detect.test.sh All 129 checks passed (was 125)
emit-findings.test.sh All 32 checks passed
all docs-hygiene suites pass
corpus re-measure, same 85 files negation 1053 → 31; all other shapes unchanged
check-skill.sh (source checkout) PASS — 0 errors; all base-ref trigger phrases preserved
check-detector-findings-crosswalk.sh PASS
check-changelog-parity.sh (--check, --check-bump, --check-order) PASS
typos / shellcheck / shfmt / markdownlint PASS
cheat-sheet sync in sync

New regression tests cover both gates in both directions: descriptive prose, an already-paired mid-sentence cue and a table row do not select; plain, list, bolded and blockquoted imperatives all still do; a hard-wrapped continuation does not select on its own. The abbreviation fixture from #3194 was rebuilt so it exercises the splitter inside the new scope rather than passing on a line the gates now decline.

Related

Why the collision happened

#3194 was produced in a session where the work-items seam claim was unavailable (gh 2.45 against a required ≥ 2.94, plus an invalid token), so no assignee/lease was acquired. The in-flight-PR check also used a keyword search rather than the closing-keyword linkage the skill specifies, which is what would have surfaced #3180. Both are recorded in #3201.


Generated by Claude Code

… (0.21.1)

The shape shipped in 0.21.0 fired 1053 times on an 85-file sample of this
repo's own tracked markdown — 12.4 per file, 99% of every finding the skill
produced. The eight older shapes produced 10 between them. At that rate it
swamps the human report on every run and would flood the apply relay under
--persist-findings.

Two scope gates bring it to 31 on the same files, with every other shape's
count byte-identical (3/2/2/1/1/1 before and after), so the whole delta is
this shape:

- imperative only: the cue must open the line, after list, blockquote and
  emphasis markers. "Prompt the positive" is a rule about instructions, so
  descriptive prose was never in scope, and a mid-sentence cue is already the
  paired form ("Prefer X; never Y")
- the line must close its own sentence: this repo hard-wraps prose and the
  pairing rule is per sentence, so a continuation cannot be shown to lack a
  positive on the next line; the same test excludes a table row

Both narrowings are #3180's, established there against a 1140-file corpus
sweep while that PR was open against the same issue. This adopts the
calibration rather than discarding it.

Accepted cost, pinned by an assertion so a future widening cannot pass
silently: a subject-led instruction no longer selects.

Closes #3201
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 50s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Review changed files for correctness/maintainability
  • Post findings

Scope: plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh (the two new scope-gate functions + their wiring into audit_noise_line_has_negation_without_positive), detect.test.sh (new fixtures/assertions), and the doc/changelog/version updates.

No blocking findings. I traced both new gates against the fixtures and the existing call site rather than trusting the author's stated numbers:

  • audit_noise_line_opens_with_prohibition / audit_noise_line_ends_sentence (noise-shapes.sh:516–545) are wired in ahead of the existing sentence-split loop (noise-shapes.sh:558–559), so they cheaply gate out non-imperative and non-sentence-final lines before the more expensive per-sentence work runs — sound ordering.
  • Traced audit_noise_strip_line_lead against nested markers (> - **Never... style) and single/double/triple-asterisk and underscore emphasis by hand: correct in every case I checked, including the interesting-but-harmless quirk that a leading */**/*** run gets consumed one character at a time by the list-marker loop ([-*+]) rather than the dedicated emphasis loop below it — functionally correct, the emphasis loop only does real work for _/__/___. Not a bug, just worth knowing if this code is touched again.
  • The new detect.test.sh fixtures (scope gate, imperative forms, hard-wrap) match the PR's stated check-count delta: 4 new assertions ⇒ 125 → 129, consistent with the claimed total.
  • plugin.json (0.21.0 → 0.21.1), CHANGELOG.md, SKILL.md, and the detector-findings crosswalk README.md are all mutually consistent — same numbers (1053 → 31, 12.4/file, 99%) repeated in each without drift, and I found no other file (e.g. .claude-plugin/marketplace.json) that needed a matching update.

One non-blocking observation, not filed inline since it's speculative rather than a concrete gap: audit_noise_strip_line_lead's list-marker stripping doesn't account for a markdown task-list checkbox (- [ ] Never do X.) — the leftover [ ] prefix means such a line won't open with the prohibition cue and so won't select. This is a narrowing in the same direction the PR already accepts deliberately (subject-led sentences), so it's plausibly fine as-is; flagging only in case it wasn't a considered case.

Verification note: this review lane's Bash access is scoped to gh pr diff/view/comment/review plus Read/Glob/Grep — I could not execute detect.test.sh or the other test suites myself. The PR's reported gate results (129/129, 32/32, corpus re-measure, linters) are author-claimed and unverified by me; my confidence above comes from static trace of the regex/loop logic against the new fixtures, not from running them.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 4s —— View job


Security review — no issues found

  • Gather context (PR diff, changed files)
  • Apply skip gate (open PR? security-relevant surface?)
  • Review changed files for security issues
  • Post findings

Skip gate result: stopping early — this PR has no security-relevant surface.

All six changed files are documentation and a local, offline bash text classifier:

  • plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh — adds two pure string-matching gate functions (audit_noise_strip_line_lead, audit_noise_line_opens_with_prohibition, audit_noise_line_ends_sentence) that narrow when the negation shape fires. Only [[ ... ]] regex/glob matching and parameter expansion on function-argument strings — no eval, no command substitution of untrusted data, no filesystem/network calls introduced. (noise-shapes.sh#L494-L546)
  • plugins/docs-hygiene/skills/audit-noise/scripts/detect.test.sh — new/updated test fixtures, all static heredocs written to $TEST_TMPDIR and read back by the same script; no external input.
  • plugins/docs-hygiene/skills/audit-noise/SKILL.md, docs/conventions/detector-findings/README.md, plugins/docs-hygiene/CHANGELOG.md, plugins/docs-hygiene/.claude-plugin/plugin.json — prose/doc and version-bump only.

This tool runs locally against a repo's own tracked markdown (developer-supplied input, not attacker-controlled/untrusted external input), performs no code execution of matched content, and touches no auth, secrets handling, network I/O, or GitHub Actions workflow config. No CRITICAL/IMPORTANT/SUGGESTION security findings to report.

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

Last security-reviewed head: 626dd5c33d76e8e6007ec35dd219e1ceab19b61a. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6c99cd1a93

ℹ️ 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".

Comment thread plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh Outdated
Comment thread plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh Outdated
A naive gsub double-escaped a pipe the source had already escaped: `a \| b`
became `a \\| b`, which GFM reads as a literal backslash followed by a LIVE
delimiter, splitting the row so the fix action misreads it. This repo writes
literal `\|` in its own tables, so the case is real rather than theoretical.

Already-escaped pipes are parked on a sentinel and restored single-escaped.

Also identified in #3180, which notes the sibling producers carry the same
latent defect in their own copies of esc() — out of scope here.

Refs #3201
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 4 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 47s —— View job


Security review — no issues found

  • Gather context (PR diff since last security-reviewed head, new commit d4f0088)
  • Apply skip gate (open PR? security-relevant surface in the new commit?)
  • Review changed files for security issues
  • Post findings

Skip gate result: stopping early — the commit added since the last review has no security-relevant surface.

Per the bot's tracking comment, the last security-reviewed head was 6c99cd1. This push adds one commit, d4f0088 ("make emit-findings cell escaping idempotent"), touching 3 files:

  • emit-findings.sh — reworks the local esc() awk function used when rendering the findings table. It now parks already-escaped \| sequences on a \001 sentinel before re-escaping bare |, so a source pipe that was already escaped isn't double-escaped. Pure string transformation on markdown table-cell text already read from local files by this offline tool; no eval, no command substitution of untrusted input, no new I/O.
  • emit-findings.test.sh — new static heredoc fixture + assertions exercising the idempotent-escaping fix; no external input.
  • CHANGELOG.md — prose only.

This is a bug fix to a local text-formatting routine (correctness of markdown table escaping), not a change to any auth, secrets, network, or Actions-workflow surface. No CRITICAL/IMPORTANT/SUGGESTION security findings to report for this commit or the PR overall.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 3m 35s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Apply skip gate — PR is open, non-draft, substantial review surface; proceeded
  • Review changed files for correctness/maintainability
  • Post findings

Findings

Posted 2 inline comments on plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh:

  1. Line 558 — the imperative-open scope gate is applied once per line, but the finding loop that follows evaluates each sentence independently. Traced a concrete false positive: Do not use markdown; instead use HTML. Older versions do not support SVG. passes both line-level gates, the first (paired) sentence is correctly skipped, but the second — a purely descriptive negation — still fires. That's exactly the case this PR's own "Scope narrowings" comment and SKILL.md text claim is "excluded by construction." None of the new fixtures (NEG_SCOPE, NEG_FORMS, NEG_WRAP) cover a multi-sentence line, so this ships untested. I independently verified this by tracing the code (not just restating Codex's automated comment on the same line, which flags the same defect).
  2. Line 520 — minor: the list-marker stripper only recognizes the N. ordered-list form, not N), so an imperative after a parenthesized list marker (1) Do not use markdown.) silently fails the gate and never reaches the check. Low severity (false negative only), and neither numbered-list form is covered by the new NEG_FORMS fixture.

Everything else in the diff (the emit-findings.sh idempotent-escaping fix, SKILL.md/CHANGELOG.md/README.md/plugin.json updates, and the rest of detect.test.sh / emit-findings.test.sh) reads correctly and consistently — I traced the esc() sentinel logic by hand and it round-trips correctly, including the double-escaped edge case. The corpus measurements, test-run results, and lint/typo/shellcheck results quoted in the PR description are author-claimed; I did not independently re-run them (this lane's Bash access is scoped to gh only, per the invoked skill's allowed-tools), so I traced the logic statically instead.

Comment thread plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh Outdated
Comment thread plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh Outdated
…e lint

Three review findings on #3202, each reproduced before being fixed:

- shell-portability-lint FAILED on `\>` — a GNU word-boundary operator
  elsewhere in the toolchain. The lead pattern now lives in a variable with
  `>` unescaped, which also stops the unquoted `>` confusing the [[ ]] parser
- the imperative gate was per LINE, so a line opening imperatively carried a
  later DESCRIPTIVE sentence into a finding — exactly the prose the gate
  exists to exclude, re-entering behind a compliant opener. Now per sentence
- the lead stripper missed `1)` ordered items and task-list checkboxes, both
  ordinary ways this repo writes a directive; missing them withheld silently

The per-sentence gate moves the measured count on the 85-file sample from 31
to 69, because 38 genuine imperative prohibitions sit as a LATER sentence on
their line and were being withheld. Sampling those additions found real
findings plus a residual false-positive class: a positive supplied as a bare
imperative after a separator ("Never confirm X — delegate to Y") is not
recognised, because pairing matches a fixed marker list. #3180 solves that
with a closed function-word stoplist; filed as #3204 rather than guessed at
here.

Refs #3204

Copy link
Copy Markdown
Contributor Author

Review round addressed — e58cf308

All three reproduced before being fixed. One of them changed the headline number, so I want that stated plainly rather than buried.

Finding Disposition
shell-portability-lint failed on \> — a GNU word-boundary operator elsewhere in the toolchain Fixed. The lead pattern now lives in a variable with > unescaped, which also stops the unquoted > reading as a redirection to the [[ ]] parser
Codex: the imperative gate was per LINE, not per sentence Fixed, and it was the important one. Do not use markdown; instead use HTML. Older versions do not support SVG. opens imperatively, passes a line-level gate, and the loop then reports the second sentence — exactly the descriptive prose the gate exists to exclude, re-entering behind a compliant opener
Codex: 1) ordered items not recognised Fixed, and task-list checkboxes (- [ ] …, - [x] …) with it — the reviewer flagged that as a speculative aside and it was real. Both are ordinary ways this repo writes a directive, so missing them withheld silently

The number moved: 31 → 69, and why that is the right direction

The per-sentence gate raises the measured count on the same 85-file sample. That is not a regression — 38 genuine imperative prohibitions sit as a later sentence on their line and the line-level gate was withholding them. Headline is still 1053 → 69 against 0.21.0, with every other shape's count byte-identical.

I sampled those 38 additions and read the source lines rather than trusting the total. They are mixed:

  • SKILL.md:126 — "…and stop. Never auto-file, never auto-edit." → genuine
  • SKILL.md:145 — "Do not carry one surface's verdict to the other." → genuine
  • SKILL.md:142 — "Never confirm a load-bearing deletion — delegate to a fresh subagent" → false positive. The positive alternative is present; pairing is matched against a fixed marker list (instead, rather than, prefer…) which does not recognise a bare imperative after a separator.

That residual class is #3204, to be fixed with #3180's closed function-word stoplist — testing what a clause is not generalises where a marker list only covers the phrasings its author thought of. It existed at 31 too; the per-sentence gate exposes more of it. I filed it rather than guessing at the stoplist here, having already misjudged this heuristic's breadth once in #3194.

On the verification note

Both review lanes flagged that they could not execute the suites. Worth recording that the static traces were accurate: the code-review lane's read of the gate ordering, the strip_line_lead marker consumption, and the doc/version consistency all match what running them shows. Its task-list-checkbox aside — offered as speculative — was a real gap and is fixed here.

Gates now: detect.test.sh 133, emit-findings.test.sh 35, all docs-hygiene suites, portability, typos/shellcheck/shfmt/markdownlint, crosswalk, changelog parity, check-skill 0 errors.


Generated by Claude Code

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 53s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md)
  • Apply skip gate — PR open, non-draft, this head (e58cf30) has a substantive new commit not yet reviewed by this lane; proceeded
  • Review changed files for correctness/maintainability
  • Post findings

Scope: this pass focused on the new commit e58cf30 ("apply the imperative gate per sentence, and fix the lint"), which was written specifically to fix the two findings a prior pass on this PR left on noise-shapes.sh (line-level vs. per-sentence imperative gate; missing 1)/task-checkbox list markers) plus a shell-portability-lint failure on \>. I traced all three fixes against the code rather than restating the commit message's claims.

Fixes verified correct by trace:

  • audit_noise_sentence_opens_with_prohibition (noise-shapes.sh:549) is now called per-sentence inside the loop (noise-shapes.sh:580) instead of once per line. Traced the exact repro from the prior review, Do not use markdown; instead use HTML. Older versions do not support SVG.: sentence 1 is gated out by pairing (instead), sentence 2 fails the per-sentence imperative-open test (older versions... doesn't open with a cue) and is skipped by continue — no longer fires. Matches the new NEG_SENTGATE fixture in detect.test.sh.
  • audit_noise_strip_line_lead's lead_re (noise-shapes.sh:527) now accepts [0-9]+[.)] (both 1. and 1)) and a task-checkbox \[[[:space:]xX]\], and I hand-traced the strip loop against all four NEG_MARKERS fixture lines (1., 2), - [ ], - [x]) — each correctly reaches the cue test.
  • The \> → variable-held $lead_re change (noise-shapes.sh:522-529) removes the GNU word-boundary-operator ambiguity the portability lint flagged; storing the pattern in a variable and expanding it unquoted inside [[ =~ ]] is the standard bash idiom for this, and avoids the unquoted->-as-redirection trap the added comment describes.
  • The 31 → 69 count and the #3204 follow-up issue are consistently stated across SKILL.md, CHANGELOG.md, and the docs/conventions/detector-findings/README.md crosswalk — no drift between them.

One finding, posted inline on SKILL.md:131-133:

  • The SKILL.md edit inserted a new line ahead of the old wrapped line instead of replacing it, so the sentence now states the marker list twice — once with task-list-checkbox, once without: "...must open the sentence, after list, blockquote, task-list-checkbox and emphasis markers, after list, blockquote and emphasis markers — ...". The equivalent CHANGELOG.md bullet (lines 14-15) made the same edit correctly as a clean replacement. I posted a suggestion fix inline, then a follow-up correcting my own first draft of that suggestion (it initially dropped a clause line 134 depends on) — the second inline comment on that range has the accurate fix.

Everything else in the commit (detect.test.sh's three new fixtures, the CHANGELOG.md/README.md prose) reads correctly and I did not re-flag the two issues from the prior review pass since both are fixed. I could not execute detect.test.sh myself in this lane (Bash access here is scoped to gh pr diff/view/comment/review, Read, Glob, Grep); the commit message's "reproduced before being fixed" and count claims are author-stated and unverified by me beyond the static trace above.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 48s —— View job


Security review — no issues found

  • Gather context (PR diff since last security-reviewed head d4f0088, new commit e58cf30)
  • Apply skip gate (open PR? security-relevant surface in the new commit?)
  • Review changed files for security issues
  • Post findings

Skip gate result: stopping early — the commit added since the last security review has no security-relevant surface.

Per the bot's tracking comment, the last security-reviewed head was d4f0088. This push adds one commit, e58cf30 ("apply the imperative gate per sentence, and fix the lint"), touching 5 files:

  • noise-shapes.sh — the substantive change. Fixes the two review findings raised on this PR (Codex + inline Claude review): the imperative-open gate now runs per sentence (audit_noise_sentence_opens_with_prohibition, moved inside the for s in "${sentences[@]}" loop) instead of once per line, closing the false-positive where a compliant opener let a later descriptive sentence slip through; and the list-marker lead-stripper now accepts [0-9]+[.)] (both ordered-list delimiters) plus a task-list checkbox (\[[[:space:]xX]\]). Still pure [[ ... ]] regex matching and parameter expansion over function-argument strings — no eval, no command substitution of untrusted data, no new I/O. The regex is bounded (no nested quantifiers), so no ReDoS concern even though the tool now runs per-sentence rather than per-line.
  • detect.test.sh — three new fixtures/assertions (multi-sentence gate, two-imperative case, ordered/checkbox marker forms), all static heredocs written to $TEST_TMPDIR and read back by the same script; no external input.
  • SKILL.md, CHANGELOG.md, docs/conventions/detector-findings/README.md — prose/doc updates reflecting the new corpus count (31 → 69) and the narrowed gate description; no executable content.

This remains a local, offline bash text classifier operating on a repo's own tracked markdown (developer-supplied input, not attacker-controlled), performing no code execution of matched content, and touching no auth, secrets handling, network I/O, or GitHub Actions workflow config. No CRITICAL/IMPORTANT/SUGGESTION security findings to report for this commit or the PR overall.

Comment thread plugins/docs-hygiene/skills/audit-noise/SKILL.md Outdated
Comment thread plugins/docs-hygiene/skills/audit-noise/SKILL.md Outdated
…pe rule

An earlier edit inserted the corrected clause ahead of the old wrapped line
rather than replacing it, so the marker list read twice — once with
task-list-checkbox and once without. The CHANGELOG bullet was edited as a
clean replacement and already reads correctly; this matches it.
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 14s —— View job


Code review complete

  • Gather context (PR diff, changed files, CLAUDE.md, REVIEW.md)
  • Apply skip gate — PR open, non-draft; new head 626dd5c since last review pass on e58cf30
  • Review changed files for correctness/maintainability
  • Post findings

Scope: the only commit added since this lane's last review (e58cf30) is 626dd5c, a single 2-insertion/2-deletion change to plugins/docs-hygiene/skills/audit-noise/SKILL.md.

No findings. This commit fixes exactly the duplication a prior pass on this PR flagged inline on SKILL.md:131-133 — the marker list ("after list, blockquote, task-list-checkbox and emphasis markers") was stated twice due to an insert-instead-of-replace edit. I re-read the current text at SKILL.md:129-138 and confirmed the marker list now appears once, reads grammatically correctly, and matches this lane's own follow-up-corrected suggestion verbatim (the version that kept the *instructions* clause line 134 depends on). The equivalent CHANGELOG.md bullet was already correct and is unaffected by this commit.

I did not re-review the rest of the PR's diff (noise-shapes.sh gate logic, detect.test.sh/emit-findings.test.sh fixtures, emit-findings.sh escaping fix) since those were already reviewed by this lane on prior heads (6c99cd1, d4f0088, e58cf30) with all findings from those passes since fixed and verified by trace — no changes to that code landed in this commit. The corpus/test-count claims restated in the author's own follow-up comments remain author-stated and unverified by me beyond the static trace already recorded on earlier passes.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 39s —— View job


Security review — no issues found

  • Gather context (PR diff since last security-reviewed head e58cf30, new commit 626dd5c)
  • Apply skip gate (open PR? security-relevant surface in the new commit?)
  • Review changed files for security issues
  • Post findings

Skip gate result: stopping early — the commit added since the last security review has no security-relevant surface.

Per the bot's tracking comment, the last security-reviewed head was e58cf30. This push adds one commit, 626dd5c ("drop a duplicated marker list in the negation scope rule"), touching a single file:

  • SKILL.md — 2 insertions / 2 deletions. Fixes the duplicated-marker-list wording flagged in a prior code-review pass on this PR (the "Prompt the positive" clause had been inserted ahead of the old wrapped line instead of replacing it, so the sentence stated the marker list twice). This commit removes the stray duplicate line and restores a single, correctly-wrapped sentence — pure prose, no executable content, no logic change.

No other files changed in this commit. This remains a local, offline bash text classifier operating on a repo's own tracked markdown; nothing in this push touches auth, secrets handling, network I/O, or GitHub Actions workflow config. No CRITICAL/IMPORTANT/SUGGESTION security findings to report for this commit or the PR overall.

cursor Bot pushed a commit that referenced this pull request Aug 23, 2026
…resolve repo-root spellings (0.3.6, 0.39.3)

Both sibling emit-findings.sh copies still carried the two defects #3202
fixed only in docs-hygiene. A naive gsub double-escapes a pipe the source
already escaped, which GFM reads as a live delimiter. esc() now parks
already-escaped pipes on a sentinel first.

git rev-parse --show-toplevel can spell the same directory differently
than the caller pwd (Git Bash). ai-slop failed open (Location stayed
absolute, nothing reported it). claude-config failed closed (in-repo
hits were declined as outside-repo-root). Root resolution now prefers
the caller pwd minus git --show-prefix, with git's two spellings as
fallbacks. Shared code was considered and declined: plugins are
portable and there is no existing cross-plugin emit-findings library.

Closes #3203

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
cursor Bot pushed a commit that referenced this pull request Aug 23, 2026
…resolve repo-root spellings (0.3.6, 0.39.3)

Both sibling emit-findings.sh copies still carried the two defects #3202
fixed only in docs-hygiene. A naive gsub double-escapes a pipe the source
already escaped, which GFM reads as a live delimiter. esc() now parks
already-escaped pipes on a sentinel first.

git rev-parse --show-toplevel can spell the same directory differently
than the caller pwd (Git Bash). ai-slop failed open (Location stayed
absolute, nothing reported it). claude-config failed closed (in-repo
hits were declined as outside-repo-root). Root resolution now prefers
the caller pwd minus git --show-prefix, with git's two spellings as
fallbacks. Shared code was considered and declined: plugins are
portable and there is no existing cross-plugin emit-findings library.

Closes #3203

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
kyle-sexton added a commit that referenced this pull request Aug 23, 2026
…resolve repo-root spellings (0.3.6, 0.39.4) (#3242)

## Summary

#3202 fixed two latent defects in `docs-hygiene:audit-noise`
`emit-findings.sh` only. Each producer carries its own copy, so the same
defects were still live in `ai-slop` and
`claude-config:audit-instructions`.

**Defect 1 — `esc()` is not idempotent.** A naive `gsub(/\|/, "\\|")`
turns `a \| b` into `a \\| b`. GFM reads that as a literal backslash
followed by a live delimiter, so the row splits and the fix action
misreads it. This repo writes literal `\|` in its own tables.

**Defect 2 — repo-root spelling mismatch.** `git rev-parse
--show-toplevel` can answer `C:/Users/…` while the caller is at `/tmp/…`
(Git Bash). Consequences differed per producer and were confirmed
individually:

- `ai-slop` **failed open** — Location stayed absolute and nothing
reported it, because an absolute path is still a well-formed cell.
- `claude-config` **failed closed** — a path it could not prove was
under the root was declined as `outside-repo-root`, so an in-repo
finding was silently missed.

## Fix

`esc()` now parks an already-escaped pipe on a sentinel first, matching
#3202. Root resolution prefers the caller `pwd` minus git
`--show-prefix`, with git's two spellings as fallbacks, matching the
#3180 form that #3202 did not actually land.

Shared code was considered and declined: plugins are portable and there
is no existing cross-plugin emit-findings library. The three copies now
agree on the same two helpers instead.

ai-slop 0.3.6 (0.3.5 is #3179), claude-config 0.39.3.

**docs-hygiene residual (not fixed here):** #3202 shipped the idempotent
`esc()` but not the three-spelling root. That producer still resolves
root via `git rev-parse --show-toplevel` only.

## Verification

- `plugins/ai-slop/skills/audit/scripts/detect.test.sh` — 98/98
(idempotent esc + symlink spelling mismatch)
-
`plugins/claude-config/skills/audit-instructions/scripts/emit-findings.test.sh`
— 81/81 (same two cases; fail-closed fence still declines a true
out-of-repo path)
- `scripts/check-changelog-parity.sh --check-bump origin/main` — pass
- markdownlint on both changelogs — 0 issues

## Related

Closes #3203

Refs #3180, #3202

---------

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(docs-hygiene): audit-noise's negation shape is unusably broad as shipped in 0.21.0

1 participant