Deterministic validation should be a script

Type: note · Status: seedling

Our /validate skill runs all checks through an LLM (Sonnet), including checks that are purely deterministic. Comparing with Thalo's 32 validation rules — all of which are deterministic scripts — reveals that we're spending LLM tokens on work a Python script could do in milliseconds.

The split follows the oracle strength spectrum:

Hard oracle (→ script): - Frontmatter valid (delimiters, YAML parse, no duplicate keys) - Description exists and non-empty - Type/traits/status match allowed enums - Link targets resolve to existing files - Areas-Topics footer sync (already have sync_topic_links.py) - Unknown frontmatter fields (flag typos like descrption:) - Required sections per type (spec → Design/Implementation, adr → Context/Decision/Consequences)

Soft oracle (→ stays in skill): - Description quality (discrimination, mechanism vs summary) - Composability (title works as inline prose)

A validation script could run as a pre-commit hook or in CI, giving instant feedback. The /validate skill would then only need to run the judgment-based checks, making it cheaper and faster.

Topics: