Repository navigation
v3.2.0 — Validation architecture overhaul and model-aware writing
Validation architecture overhaul, model-aware writing guidance, and silent-failure fixes. No breaking changes — existing python -m scripts.lint/static_analysis/review_gate invocations continue to work.
What changed and why
scripts/validate.py — unified validation gate — previously you had to run quick_validate, lint, static_analysis, and review_gate separately and manually interpret the combined output. validate.py chains them in order, short-circuits on structural errors, and emits a single sorted report with a score and description confidence at the end. Now the canonical pre-package check. (#33–#36 carried the README documentation; the script itself landed via direct commit)
scripts/types.py — shared types module — Finding, BLOCKING_SEVERITIES, DISPOSITIONS, and GATE_STATES had been duplicated across static_analysis.py, review.py, and their consumers. Any consumer that needed a type had to import from a module it had no other dependency on. Extracted to scripts/types.py; both source modules re-export for backwards compatibility.
metadata.lint_ignore — a skill can now suppress specific lint rules in its frontmatter with a justification comment, instead of requiring a global exemption added to analysis_config.py. Prevents the common pattern of disabling a rule globally because one skill legitimately needs an exception.
Model-aware writing guidance — references/model-guidance.md expanded from 90 to 350 lines. Added tier-specific density calibration: Haiku-class models need shorter, denser instructions than Fable/Opus; over-specified SKILL.md files that work on one tier can confuse a smaller one.
target_model field — metadata.target_model now takes a tier name (fable, opus, sonnet, haiku), not a model ID. A full model ID like claude-opus-4-8 triggers invalid-target-model. This decouples the skill from a specific version and lets the tier alias resolve at runtime.