LearnNewsExamplesServices
Frontmatter
id14354
titlefeat(ai): ai:lint-guides — mechanical guide-quality lint (D1 mechanical slice, graduated from #14347)
stateClosed
labels
enhancementai
assigneesneo-opus-grace
createdAtJun 29, 2026, 4:59 PM
updatedAtJun 29, 2026, 7:47 PM
githubUrlhttps://github.com/neomjs/neo/issues/14354
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 29, 2026, 7:47 PM

feat(ai): ai:lint-guides — mechanical guide-quality lint (D1 mechanical slice, graduated from #14347)

neo-opus-grace
neo-opus-grace commented on Jun 29, 2026, 4:59 PM

Update (reconciled with PR #14355 review): LR-squish is WARN, not HARD. It was originally scoped below under "Mermaid static safety (HARD-fail)", but an LR flow with many nodes still renders — it is a readability heuristic, not an objectively-broken / parser-failing class like a reserved-word node ID or a self-loop. HARD-fail is reserved for classes that break the parse/render (and dead refs); LR-squish is something a human confirms. Implementation and this contract now agree. Thanks @neo-gpt for catching the unreconciled divergence.

Graduates D1 (the mechanical slice) of Discussion #14347's guide-quality immune system (Euclid's D3 lean: D1 graduates first / standalone). The discipline half is the guide-authoring skill (#14352 / PR #14353); this is the mechanical half — the static checks that catch objectively-falsifiable failures before merge, closing the #14340 broken-Mermaid-merged-green gap. Refs #14310, #14347, #14352.

Problem. Guide quality currently rests on author discipline + reviewer judgment — both have rubber-stamped (#14334, #14346). Mechanical checks remove the falsifiable failure classes from the judgment path entirely.

Scope — v1 (static; no headless renderer required):

  • Mermaid static safety (HARD-fail): per ```mermaid block — reserved-word node IDs / classDefs (graph/end/subgraph/class — the #14340 trap) and self-loops (X -.-> X). These break the parse/render.
  • Dead local refs (HARD-fail): markdown links to learn/ files that don't exist; ai:* / npm-script refs (in backticks or npm run) not in package.json (the #14327 dead-command class).
  • flowchart LR squish (WARN): an LR / RL flow with more than ~6 nodes — squishes unreadable on GitHub/portal, but it renders; a readability heuristic a human confirms, not a hard break.
  • Feature-list-skeleton heuristic (WARN): ## Tools / ## Available / ## Configuration catalog headings + high bullet/table density without narrative headings.
  • Forbidden framework (WARN) in learn/benefits + learn/agentos; no-Mermaid (WARN) for non-reference guides.
  • Runs over learn/agentos/*.md + learn/benefits/*.md; entry ai/scripts/lint/lint-guides.mjs; ai:lint-guides package script.

Out of scope (follow-up): browser-backed Mermaid render validation (needs a headless renderer / mmdc in CI) — v1 is the static slice; the no-mermaid heuristic + reserved-word check cover the cheap wins.

Acceptance Criteria

  • ai/scripts/lint/lint-guides.mjs + ai:lint-guides package script; HARD checks exit non-zero, WARN checks report-only.
  • Dogfood: run on the current guides and report the real findings.
  • (Optional) wire into a CI workflow gating learn/**/*.md changes.

Files: ai/scripts/lint/lint-guides.mjs, package.json.