aidd-lint: system map (umbrella) #109

Open
opened 2026-07-23 11:31:45 +00:00 by jared · 7 comments
Owner

What this is

The umbrella/mapping ticket for the aidd-lint system: linting AiDD files (SKILL.md, prompts, instructions, reference files) so they stay clean, clear, and flexible. Refer to THIS ticket to work on the system; the components below are its parts. Born from the mine-lints simplification (commit c6a4177, 2026-07-23), where three prose smells -- war stories, gate logic in prose, misplaced tool quirks -- were removed by hand and found to be mechanically detectable.

Architecture: three tiers (mirrors the code-lint split)

  • Tier 1 -- deterministic cops (markdown/regex/arithmetic, no model). Structural symptoms proxy for semantic smells: gate-logic-in-prose has no lexical signature but reliably makes steps long, so bulk limits catch it.
  • Tier 2 -- AI charter pass: closed catalog of smells with no structural signature; single-shot cheap-model judge. Also the anti-gaming backstop for Tier-1 proxies. Ship WITH Tier 1, not after.
  • Tier 3 -- human residue: "is this sentence essential sequencing or relocatable" stays a session-level human call, per the ADR-0048 pattern. Not automated; not ticketed beyond this line.

Principles

  • Thresholds are config (.aidd-lint.yml), not constants -- glanceability limits are malleable by design.
  • Audit existing tools before hand-rolling (mdformat/prettier for unwrapping, readability gems for grade scoring).
  • Fix pattern is relocate-don't-delete: detail moves to references/*.md, templates, or Ruby -- which is why the dead-pointer cop is load-bearing.
  • Ticket titles use the aidd-lint prefix, deliberately distinct from os-sdlc lint rule: so mine-lints novelty searches stay clean.

Components

Tier 1 (each follows lint-rule-ticket-template.md):

  • #100 workflow-war-story
  • #101 step-bulk (glanceability; tunable thresholds)
  • #102 dead-reference-pointer
  • #103 cross-section-duplication
  • #104 hard-wrap (autocorrecting; no-wrap policy for AiDD prose)
  • #105 sentence-complexity (words/sentence + FK grade advisory)
  • #106 skill-frontmatter-name (suggested tracer: smallest end-to-end cop)

System:

  • #107 Tier-2 prose-smell charter (AI pass)
  • #108 trigger architecture (PostToolUse hook, edit-size gate, home-plugin ADR)

Suggested order

T9's ADR (home decision) -> T7 as tracer through new infra -> T5 (autofix, immediate daily value) -> T1/T2/T3/T4/T6 -> T8 charter alongside T2.

## What this is The umbrella/mapping ticket for the **aidd-lint system**: linting AiDD files (SKILL.md, prompts, instructions, reference files) so they stay clean, clear, and flexible. Refer to THIS ticket to work on the system; the components below are its parts. Born from the mine-lints simplification (commit c6a4177, 2026-07-23), where three prose smells -- war stories, gate logic in prose, misplaced tool quirks -- were removed by hand and found to be mechanically detectable. ## Architecture: three tiers (mirrors the code-lint split) - **Tier 1 -- deterministic cops** (markdown/regex/arithmetic, no model). Structural symptoms proxy for semantic smells: gate-logic-in-prose has no lexical signature but reliably makes steps long, so bulk limits catch it. - **Tier 2 -- AI charter pass**: closed catalog of smells with no structural signature; single-shot cheap-model judge. Also the anti-gaming backstop for Tier-1 proxies. Ship WITH Tier 1, not after. - **Tier 3 -- human residue**: "is this sentence essential sequencing or relocatable" stays a session-level human call, per the ADR-0048 pattern. Not automated; not ticketed beyond this line. ## Principles - Thresholds are config (`.aidd-lint.yml`), not constants -- glanceability limits are malleable by design. - Audit existing tools before hand-rolling (mdformat/prettier for unwrapping, readability gems for grade scoring). - Fix pattern is relocate-don't-delete: detail moves to references/*.md, templates, or Ruby -- which is why the dead-pointer cop is load-bearing. - Ticket titles use the `aidd-lint` prefix, deliberately distinct from `os-sdlc lint rule:` so mine-lints novelty searches stay clean. ## Components Tier 1 (each follows lint-rule-ticket-template.md): - #100 workflow-war-story - #101 step-bulk (glanceability; tunable thresholds) - #102 dead-reference-pointer - #103 cross-section-duplication - #104 hard-wrap (autocorrecting; no-wrap policy for AiDD prose) - #105 sentence-complexity (words/sentence + FK grade advisory) - #106 skill-frontmatter-name (suggested tracer: smallest end-to-end cop) System: - #107 Tier-2 prose-smell charter (AI pass) - #108 trigger architecture (PostToolUse hook, edit-size gate, home-plugin ADR) ## Suggested order T9's ADR (home decision) -> T7 as tracer through new infra -> T5 (autofix, immediate daily value) -> T1/T2/T3/T4/T6 -> T8 charter alongside T2.
Author
Owner

aidd-lint execution plan (2026-07-23)

Home decision: new plugin os-aidd-lint — ADR-0058. Branch: aidd-lint/tier-1.

This round (Tier 1)

  • ADR-0058: home = os-aidd-lint (prerequisite from #108)
  • Batch 0 — infra tracer: MarkdownCop base, registry, .aidd-lint.yml loader, test helper + #106 skill-frontmatter-name (autocorrect)
  • Batch 1 — structural cops: #100 workflow-war-story, #101 step-bulk, #103 cross-section-duplication
  • Batch 2 — text metrics (audit-defaults-first): #104 hard-wrap (autocorrect via mdformat/prettier), #105 sentence-complexity
  • Batch 3 — filesystem: #102 dead-reference-pointer (advisory only, no autocorrect)
  • Verify pass: report-only scan over AiDD corpus, false-positive review

Future sessions

  • Tier 2: #107 closed-catalog AI charter judge (judgment-tier; backstops #101 gaming risk)
  • #108 trigger architecture: PostToolUse hook wiring, ~20-changed-word gate, report-only (ADR prerequisite now met)
  • Plan Tier 3 residue handling; create tickets when scoped
  • Session-start/plugin registration + bin/refresh-plugins once hooks exist
## aidd-lint execution plan (2026-07-23) Home decision: new plugin `os-aidd-lint` — ADR-0058. Branch: `aidd-lint/tier-1`. ### This round (Tier 1) - [x] ADR-0058: home = os-aidd-lint (prerequisite from #108) - [x] Batch 0 — infra tracer: MarkdownCop base, registry, .aidd-lint.yml loader, test helper + #106 skill-frontmatter-name (autocorrect) - [x] Batch 1 — structural cops: #100 workflow-war-story, #101 step-bulk, #103 cross-section-duplication - [x] Batch 2 — text metrics (audit-defaults-first): #104 hard-wrap (autocorrect via mdformat/prettier), #105 sentence-complexity - [x] Batch 3 — filesystem: #102 dead-reference-pointer (advisory only, no autocorrect) - [x] Verify pass: report-only scan over AiDD corpus, false-positive review ### Future sessions - [ ] Tier 2: #107 closed-catalog AI charter judge (judgment-tier; backstops #101 gaming risk) - [ ] #108 trigger architecture: PostToolUse hook wiring, ~20-changed-word gate, report-only (ADR prerequisite now met) - [ ] Plan Tier 3 residue handling; create tickets when scoped - [ ] Session-start/plugin registration + bin/refresh-plugins once hooks exist
Author
Owner

Tier 1 complete on branch aidd-lint/tier-1 (uncommitted, pending review). Open judgment items for human: #103 threshold miscalibration (ticket's own example scores Jaccard 0.19 vs 0.8 threshold); #104 hand-rolled join chosen over prettier (Node dep); #102 resolution scope gaps (CLAUDE_PLUGIN_ROOT paths, runtime artifacts → 51 mostly-false-positive hits); severity calls on #102/#104 (:offense) were implementer judgment, tickets silent; odyssey gem is an optional dependency for #105 grade-level advisory (no Gemfile yet).

Tier 1 complete on branch aidd-lint/tier-1 (uncommitted, pending review). Open judgment items for human: #103 threshold miscalibration (ticket's own example scores Jaccard 0.19 vs 0.8 threshold); #104 hand-rolled join chosen over prettier (Node dep); #102 resolution scope gaps (CLAUDE_PLUGIN_ROOT paths, runtime artifacts → 51 mostly-false-positive hits); severity calls on #102/#104 (:offense) were implementer judgment, tickets silent; odyssey gem is an optional dependency for #105 grade-level advisory (no Gemfile yet).
Author
Owner

Decisions recorded: #103 stays at 0.8, near-verbatim only, paraphrase detection deferred to #107 Tier 2. #104 hand-rolled join accepted. #102 demoted to :advisory pending resolution-widening ticket #110. odyssey confirmed installed globally, no Bundler.

Decisions recorded: #103 stays at 0.8, near-verbatim only, paraphrase detection deferred to #107 Tier 2. #104 hand-rolled join accepted. #102 demoted to `:advisory` pending resolution-widening ticket #110. odyssey confirmed installed globally, no Bundler.
Author
Owner

Tier-2 round complete on branch aidd-lint/tier-2, uncommitted pending review. #107 + #108 both implemented (see their comments), ADR-0059 + ADR-0060, full plugin suite 151 runs / 316 assertions green, opus diff review passed after 3 small fixes.

Notable for the system map: the extra catalog-validation mining pass (3 unrelated files, blind-then-reconcile) confirmed only duplicated-authority as a recurring Tier-2 smell; the other two charter entries are provisional pending real-world instances. Novel duplication variants surfaced for future consideration (not added to the closed catalog): frontmatter-vs-body restatement; multi-level "rule ladder" paraphrase chains that dodge the Jaccard cop.

Remaining after merge: queue-drain wiring ticket, Tier-3 residue planning, refresh-plugins + sandbox hook verification, worktree cleanup.

Tier-2 round complete on branch aidd-lint/tier-2, uncommitted pending review. #107 + #108 both implemented (see their comments), ADR-0059 + ADR-0060, full plugin suite 151 runs / 316 assertions green, opus diff review passed after 3 small fixes. Notable for the system map: the extra catalog-validation mining pass (3 unrelated files, blind-then-reconcile) confirmed only duplicated-authority as a recurring Tier-2 smell; the other two charter entries are provisional pending real-world instances. Novel duplication variants surfaced for future consideration (not added to the closed catalog): frontmatter-vs-body restatement; multi-level "rule ladder" paraphrase chains that dodge the Jaccard cop. Remaining after merge: queue-drain wiring ticket, Tier-3 residue planning, refresh-plugins + sandbox hook verification, worktree cleanup.
Author
Owner

Registration + live sandbox hook verification complete (2026-07-23): small-edit gate skip, large-edit Tier-1 fire, SessionEnd finalize, and post-registration plugin-path firing all confirmed. Hooks are now live.

Registration + live sandbox hook verification complete (2026-07-23): small-edit gate skip, large-edit Tier-1 fire, SessionEnd finalize, and post-registration plugin-path firing all confirmed. Hooks are now live.
Author
Owner

Still accurate: os-aidd-lint.md confirms hooks registered in marketplace.json but 'not yet live' -- registration/sandbox verification tracked as open item on this ticket, matches ticket's own remaining checklist. Leaving open.

Still accurate: os-aidd-lint.md confirms hooks registered in marketplace.json but 'not yet live' -- registration/sandbox verification tracked as open item on this ticket, matches ticket's own remaining checklist. Leaving open.
Author
Owner

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.
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#109
No description provided.