Skip to content

Fix scanner false negatives, skill plumbing, and Windows install; rebase pass 1 onto blader 2.9.1 - #1

Open
adevra wants to merge 5 commits into
NulightJens:mainfrom
adevra:pr/scanner-and-plumbing-fixes
Open

Fix scanner false negatives, skill plumbing, and Windows install; rebase pass 1 onto blader 2.9.1#1
adevra wants to merge 5 commits into
NulightJens:mainfrom
adevra:pr/scanner-and-plumbing-fixes

Conversation

@adevra

@adevra adevra commented Jul 25, 2026

Copy link
Copy Markdown

I installed this and hit a few things that stopped the skills from working as documented. Fixes are grouped so you can take or drop each one separately.

The scanner missed em dashes in most markdown prose

copy_scan.py inherited its suppression regex from devibe_scan.py, where the input was web source. That regex skips any line starting with #, >, *, or |, so em dashes in headings, blockquotes, * bullets, and table cells were never flagged. In a markdown draft that is a lot of user-facing copy going unchecked. * A star bullet—with dash reported clean.

Code still stays out of scope, but now on purpose: fenced blocks are tracked statefully, indented blocks count as code only when they open after a blank line (so a list continuation is still prose), and inline code spans are blanked before matching, which preserves match offsets.

Two smaller things in the same file. Both scanners had a break after the first matching pattern per rule per line, so Supercharge, unleash, and effortlessly counted once instead of three times. And the rule only looked for , while SKILL.md §14 bans en dashes too, so now matches as well.

structural_scan tidy_closer line numbers drift

The old code rebuilt the last two paragraphs as a string and back-computed an offset with len(lines) - len(tail.splitlines()). Any trailing blank line throws that off. A closer on line 6 got reported as line 8. Paragraphs are now grouped while keeping each line's real number, so the offset math is gone.

copy_scan.py was not installed with the skill that calls it

It lived in scripts/ at the repo root, but install.sh only installs skills/*. After installation, the humanizer skill tells the model to run python3 scripts/copy_scan.py and that path does not exist. I moved it to skills/humanizer/scripts/copy_scan.py, next to how structural_scan.py already ships, and both skills now reference their scanner relative to their own SKILL.md. Docs and install.sh follow.

While in there: Bash was missing from the humanizer skill's allowed-tools, so the skill instructed running a Python script with no permission to run anything.

install.sh silently stopped tracking git pull on Windows

Git Bash turns ln -s into a deep copy unless MSYS is configured for native symlinks, and it reports success either way. The install claims to be linked, git pull then updates nothing, and there is no sign of it. I verified this on my own machine: appending a line to a source file did not show up through the installed path. mklink /J needs no elevation and behaves like the symlink the installer intends, so Windows now gets a junction, with a copy as the fallback and a message saying so.

Pass 1 rebased onto blader 2.9.1

This is the opinionated commit. Drop it if you would rather sync upstream yourself, since the rest does not depend on it.

The bundled skill was a fork of blader 2.1.1. Upstream is at 2.9.1 and the gap includes two guardrails that change output quality more than any pattern in the list:

  • Never invent facts, as a task rule plus a fabrication check in the output loop. This one matters here because the 2.1.1 examples demonstrate the opposite. The vague-attribution rewrite invents a 2019 Chinese Academy of Sciences survey, the notability rewrite invents a 2024 New York Times interview, and the "Challenges" rewrite invents a 2022 drainage project. Upstream has since rewritten those examples to stay inside the source.
  • Voice calibration from a user-supplied writing sample, which outranks the style rules including the em-dash ban.

Also in the gap: nine more patterns (aphorism formulas, manufactured punchlines, persuasive authority tropes, signposting, fragmented headers, hyphenated pairs, passive voice, diff-anchored writing, conversational openers), a false-positive section, a list of human-writing signals to preserve, and three invocation modes.

The stack's own additions are re-applied on top: the pass-1-of-2 scope note, the plain-emotion paragraph in PERSONALITY AND SOUL, the public-facing-copy section, and the pipeline handoff. The frontmatter now records which upstream version it tracks, so the next sync is a diff instead of an archaeology exercise.

Documentation

I checked the research claims against the paper before touching anything, and the numbers all hold: 93.2%, 84.8%, 91.1%, 85.8%, 68.4%, the LAMP delta, and the full feature table in storyscope-findings.md. Two places where the framing outruns the source:

  • The README implies style is a weak signal. In the paper, style-only features score 85.8% macro-F1 and the text-based baselines reach 99.8 to 99.9%. The finding is that structure survives a rewrite, not that style is weak, and that argument is stronger stated precisely. The LAMP result now carries its scope (278 Gemini stories, Gemini as its own rewriter) and both numbers, 95.5% to 93.9%.
  • copy-tells.md calls the em dash "the highest-signal writing tell in the entire dataset." The upstream synthesis kept it at number one but recorded that one of its five auditors argued the count is inflated by incidental punctuation rather than actual complaints. That caveat now travels with the number.

PIPELINE.md said both scanners exit 1 on any hit under --strict. The structural one exits 1 only at its 2-hit threshold, which is the better behavior, so I documented it rather than changing it.

ATTRIBUTION.md states that the MIT obligation is to keep the copyright notice, but no upstream notice appeared anywhere in the repo. The notices for Siqi Chen and Carter Johnson are now reproduced there, and copy_scan.py carries its upstream notice in its docstring.

tests/run_tests.sh

16 fixture assertions, no dependencies beyond Python and bash. They cover every behavior above: markdown prose is scanned, code is not, multi-hit lines, en dashes, copy-ignore, exact closer line numbers, tail scoping, and both --strict contracts. Run it after editing any rule and you find out immediately whether the rule still matches the docs.

$ bash tests/run_tests.sh
16 passed, 0 failed

Both scanners also report clean on the repo's own docs.

Left alone deliberately

The hype vocabulary matches unlock your potential but not unlock their potential. Widening the word lists is a different judgment call from fixing defects, so it is not in here.

Description written with the humanizer skill from this repo, then scanned with both passes.

adevra added 5 commits July 25, 2026 10:12
- copy_scan.py: stop exempting headings, blockquotes, * bullets, and table
  cells from the em-dash rule (the suppression regex was inherited from a
  web-source scanner). Code stays out of scope via stateful fence tracking,
  blank-line-anchored indented blocks, and inline-code blanking.
- copy_scan.py: report all non-overlapping matches per line instead of
  breaking after the first, and flag en dashes alongside em dashes.
- structural_scan.py: group paragraphs with real line numbers so tidy_closer
  hits are not offset by trailing blank lines.
- add tests/run_tests.sh (16 fixture assertions) and .gitattributes.
The bundled pass-1 skill was a fork of upstream 2.1.1. Upstream 2.9.1 adds the
never-invent-facts rule (with a fabrication check in the output loop), voice
calibration from a writing sample, nine more patterns, false-positive guidance,
and invocation modes. The old copy's worked examples rewrote vague claims into
invented specifics, teaching what that rule forbids; upstream has since fixed
them. Frontmatter now records the upstream version it tracks.

Re-applied on top: the pass-1-of-2 scope note, the plain-emotion paragraph, the
public-facing-copy section, and the pipeline handoff.

Plumbing: copy_scan.py now lives inside the humanizer skill, so the path the
skill tells the model to run resolves after install.sh (it previously pointed at
a file install.sh never copied). Bash added to allowed-tools, since the skill
runs a Python scanner. install.sh falls back to copying when ln -s is refused.
- README: style is not weak in StoryScope (85.8% style-only, 99.8-99.9% for
  text baselines); the finding is durability under rewriting. LAMP result now
  carries its scope (278 Gemini stories, Gemini as rewriter) and both numbers.
- copy-tells.md: record the upstream auditor dissent on the em-dash 7.1% rank.
- PIPELINE: the two --strict contracts differ; document each.
- ATTRIBUTION/LICENSE: reproduce the MIT notices the file itself requires, and
  credit the structural skill to upstream rather than to this repo.
- CHANGES.md: what this fork changed and why.
Git Bash turns 'ln -s' into a deep copy unless MSYS is set up for native
symlinks, and reports success either way, so an install that claims to be
linked silently stops tracking 'git pull'. mklink /J needs no elevation and
behaves like the symlink the installer intends.
Removes CHANGES.md (its content is the PR description), the fork notes in
README/ATTRIBUTION, the extra LICENSE copyright line, and restores the
NulightJens clone URL.
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.

1 participant