[mine-blindspots hyperthrive corpus] TrailingProhibition misses subject-pronoun clause (STRONG_PROHIBITION anchor) #158

Closed
opened 2026-07-27 15:07:02 +00:00 by jared · 1 comment
Owner

Context

Cross-project filing from a mine-blindspots run against the hyperthrive-websites repo as external corpus. Bucket (a): "rule exists, logic gap" — tier-1 cop bug, not new rule.

Problem

hyperthrive-websites/CLAUDE.md:54:

- The AI only adds/updates variable NAMES and HAVE/NEED annotations in `.env.example` and `.env`; it never fills in values.

This trailing prohibition ("it never fills in values") is missed by TrailingProhibition, while the adjacent line 53 —

- To check whether a credential exists, use `.env.example` (HAVE/NEED annotations) or `credvault list` — never open `.env`.

— is correctly caught (its trailing clause leads with "never" after an em-dash).

Detection

plugins/os-aidd-lint/lib/aidd_lint/cops/trailing_prohibition.rb:18:

STRONG_PROHIBITION = /\A(never|don't|do\s+not|only)\b/i

This anchors \A to the start of the clause. The clause after ; it never fills in values. starts with it, not never/don't/do not/only, so it never matches STRONG_PROHIBITION even though the semantic prohibition ("it never...") is exactly the pattern the cop exists to catch. Line 53's clause starts directly with never, so it passes.

Correction

- STRONG_PROHIBITION = /\A(never|don't|do\s+not|only)\b/i
+ STRONG_PROHIBITION = /\A((it|this|that)\s+)?(never|don't|do\s+not|only)\b/i

(Fix direction as filed; exact regex left to implementer — the essential change is admitting an optional subject pronoun before the prohibition word.)

Pass/fail examples

  • Must fail (flag): ...in .env.exampleand.env; it never fills in values.
  • Must pass (no flag, already covered): ...or credvault list— never open.env.

Provenance

/os-aidd-lint:mine-blindspots run, external corpus hyperthrive-websites, bucket (a), cop citation trailing_prohibition.rb:18 (STRONG_PROHIBITION), evidence hyperthrive-websites/CLAUDE.md:54. Verified independently by a second agent pass against the live cop source and the live corpus file. 2026-07-27.

Fix direction

Extend STRONG_PROHIBITION (or add a parallel pattern feeding the same clause-check path) to also match /\A(it|this|that)\s+(never|don't|do\s+not|only)\b/i so a subject-pronoun lead-in to a strong prohibition word is caught, not just a bare prohibition word at clause start.


Discoverer: hyperthrive-websites, session id unavailable, 2026-07-27. Filed from a mine-blindspots run against this repo as external corpus.

## Context Cross-project filing from a `mine-blindspots` run against the `hyperthrive-websites` repo as external corpus. Bucket (a): "rule exists, logic gap" — tier-1 cop bug, not new rule. ### Problem `hyperthrive-websites/CLAUDE.md:54`: ``` - The AI only adds/updates variable NAMES and HAVE/NEED annotations in `.env.example` and `.env`; it never fills in values. ``` This trailing prohibition ("it never fills in values") is missed by `TrailingProhibition`, while the adjacent line 53 — ``` - To check whether a credential exists, use `.env.example` (HAVE/NEED annotations) or `credvault list` — never open `.env`. ``` — is correctly caught (its trailing clause leads with "never" after an em-dash). ### Detection `plugins/os-aidd-lint/lib/aidd_lint/cops/trailing_prohibition.rb:18`: ```ruby STRONG_PROHIBITION = /\A(never|don't|do\s+not|only)\b/i ``` This anchors `\A` to the start of the clause. The clause after `; it never fills in values.` starts with `it`, not `never/don't/do not/only`, so it never matches `STRONG_PROHIBITION` even though the semantic prohibition ("it never...") is exactly the pattern the cop exists to catch. Line 53's clause starts directly with `never`, so it passes. ### Correction ```diff - STRONG_PROHIBITION = /\A(never|don't|do\s+not|only)\b/i + STRONG_PROHIBITION = /\A((it|this|that)\s+)?(never|don't|do\s+not|only)\b/i ``` (Fix direction as filed; exact regex left to implementer — the essential change is admitting an optional subject pronoun before the prohibition word.) ### Pass/fail examples - **Must fail (flag):** `...in `.env.example` and `.env`; it never fills in values.` - **Must pass (no flag, already covered):** `...or `credvault list` — never open `.env`.` ### Provenance `/os-aidd-lint:mine-blindspots` run, external corpus `hyperthrive-websites`, bucket (a), cop citation `trailing_prohibition.rb:18` (`STRONG_PROHIBITION`), evidence `hyperthrive-websites/CLAUDE.md:54`. Verified independently by a second agent pass against the live cop source and the live corpus file. 2026-07-27. ### Fix direction Extend `STRONG_PROHIBITION` (or add a parallel pattern feeding the same clause-check path) to also match `/\A(it|this|that)\s+(never|don't|do\s+not|only)\b/i` so a subject-pronoun lead-in to a strong prohibition word is caught, not just a bare prohibition word at clause start. -------- **Discoverer:** hyperthrive-websites, session id unavailable, 2026-07-27. Filed from a mine-blindspots run against this repo as external corpus.
Author
Owner

Classified OBVIOUS. Implemented on branch aidd-lint-trailing-prohibition-gaps (commit 9136cce), TDD.

Change — added a sibling regex rather than widening STRONG_PROHIBITION in place:

PRONOUN_PROHIBITION = /\A(it|this|that)\s+(never|don't|do\s+not)\b/i

One deviation from the filed fix direction: only is excluded from the pronoun form. The ticket's proposed regex admitted a pronoun before all four words, but ; it only takes a second / ; this only applies to X are ordinary prose, not prohibitions — that arm would have been a false-positive generator. never | don't | do not carry the prohibition unambiguously even with a subject.

Tests (tests/cops/trailing_prohibition_test.rb):

  • test_flags_a_trailing_prohibition_led_by_a_subject_pronoun — the ticket's must-fail case.
  • test_ignores_a_pronoun_clause_led_by_only — pins the exclusion above.

Suite: 290 runs, 699 assertions, 0 failures, 0 errors, 0 skips.

Corpus check: ran the cop over the repo's own 99 linted files before/after. Exactly one new offense attributable to this change — plugins/os-doc-hygiene/skills/check/SKILL.md:371 It never authors \expected_sha256`` — a genuine hit. Zero regressions.

Awaiting human sign-off; not closing.

Classified **OBVIOUS**. Implemented on branch `aidd-lint-trailing-prohibition-gaps` (commit 9136cce), TDD. **Change** — added a sibling regex rather than widening STRONG_PROHIBITION in place: PRONOUN_PROHIBITION = /\A(it|this|that)\s+(never|don't|do\s+not)\b/i **One deviation from the filed fix direction:** `only` is excluded from the pronoun form. The ticket's proposed regex admitted a pronoun before all four words, but `; it only takes a second` / `; this only applies to X` are ordinary prose, not prohibitions — that arm would have been a false-positive generator. `never | don't | do not` carry the prohibition unambiguously even with a subject. **Tests** (tests/cops/trailing_prohibition_test.rb): - `test_flags_a_trailing_prohibition_led_by_a_subject_pronoun` — the ticket's must-fail case. - `test_ignores_a_pronoun_clause_led_by_only` — pins the exclusion above. **Suite:** 290 runs, 699 assertions, 0 failures, 0 errors, 0 skips. **Corpus check:** ran the cop over the repo's own 99 linted files before/after. Exactly one new offense attributable to this change — plugins/os-doc-hygiene/skills/check/SKILL.md:371 `It never authors \`expected_sha256\`` — a genuine hit. Zero regressions. Awaiting human sign-off; not closing.
jared closed this issue 2026-07-27 17:05:49 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#158
No description provided.