Lane: work (review-deferral exemption — finding surfaced against already-merged code, PR #872)
Triggering example: While comparing an independent parallel implementation (#880, closed as duplicate) against the merged plugins/typos-format/ from #872, found the hook only runs when the consuming repo already has a typos.toml/_typos.toml/.typos.toml/Cargo.toml ([*.metadata.typos])/pyproject.toml ([tool.typos]) file present. Without one, typos-format.sh exits silently via emit_skipped and never invokes typos at all — confirmed by reading the merged hook script and its own test suite (Case 1: opt-in gate OFF (no typos config) -> file left untouched).
Observed: The hook mirrors the ruff-format/biome-format opt-in-gate pattern (only activate if the consumer has already adopted a config for that tool). That pattern is correct for Ruff/Biome, which require project-specific configuration to be useful. typos is shaped differently:
typos ships a built-in spelling dictionary and runs standalone with zero configuration — its own documentation frames it as something to run unconditionally, not something a repo must first opt into via a config file.
- Verified empirically against a real
typos-cli 1.44.0 binary: typos <file> catches and fixes real typos (e.g. recieve → receive) in a directory tree with no _typos.toml anywhere above it. A _typos.toml only widens the allowlist (extend-words/extend-identifiers/extend-ignore-re) and excludes ([files] extend-exclude) — it is not an activation switch.
- The originating brief (
docs/topics/lint-static-analysis-gaps/PLAN.md, item 1) frames this plugin's purpose as typos -w on the edited file — an unconditional auto-fix, matching markdown-format's existing pattern (which does not gate on a config file existing either).
Net effect: for any repo that hasn't already hand-authored a typos config — which is most repos on day one, i.e. exactly the audience this plugin is meant to help — the hook is a complete, silent no-op. This defeats the "auto-fix on edit, zero-config" goal the epic (#830) and its PLAN.md brief set out to close.
Expected: Drop the opt-in config-gate; run typos -w unconditionally on the edited file (matching markdown-format's existing unconditional pattern). typos's own file-anchored config discovery still applies automatically when a config IS present, for allowlist/exclude purposes — no functionality is lost by removing the gate, only the false negative on zero-config repos.
Category: behavioral (silently-wrong output on the plugin's primary use case)
Related: #872 (merged PR shipping the gap), #830 (epic), #880 (closed duplicate whose review surfaced this)
Lane: work (review-deferral exemption — finding surfaced against already-merged code, PR #872)
Triggering example: While comparing an independent parallel implementation (#880, closed as duplicate) against the merged
plugins/typos-format/from #872, found the hook only runs when the consuming repo already has atypos.toml/_typos.toml/.typos.toml/Cargo.toml([*.metadata.typos])/pyproject.toml([tool.typos]) file present. Without one,typos-format.shexits silently viaemit_skippedand never invokestyposat all — confirmed by reading the merged hook script and its own test suite (Case 1: opt-in gate OFF (no typos config) -> file left untouched).Observed: The hook mirrors the
ruff-format/biome-formatopt-in-gate pattern (only activate if the consumer has already adopted a config for that tool). That pattern is correct for Ruff/Biome, which require project-specific configuration to be useful.typosis shaped differently:typosships a built-in spelling dictionary and runs standalone with zero configuration — its own documentation frames it as something to run unconditionally, not something a repo must first opt into via a config file.typos-cli 1.44.0binary:typos <file>catches and fixes real typos (e.g.recieve→receive) in a directory tree with no_typos.tomlanywhere above it. A_typos.tomlonly widens the allowlist (extend-words/extend-identifiers/extend-ignore-re) and excludes ([files] extend-exclude) — it is not an activation switch.docs/topics/lint-static-analysis-gaps/PLAN.md, item 1) frames this plugin's purpose astypos -won the edited file — an unconditional auto-fix, matchingmarkdown-format's existing pattern (which does not gate on a config file existing either).Net effect: for any repo that hasn't already hand-authored a typos config — which is most repos on day one, i.e. exactly the audience this plugin is meant to help — the hook is a complete, silent no-op. This defeats the "auto-fix on edit, zero-config" goal the epic (#830) and its PLAN.md brief set out to close.
Expected: Drop the opt-in config-gate; run
typos -wunconditionally on the edited file (matchingmarkdown-format's existing unconditional pattern).typos's own file-anchored config discovery still applies automatically when a config IS present, for allowlist/exclude purposes — no functionality is lost by removing the gate, only the false negative on zero-config repos.Category: behavioral (silently-wrong output on the plugin's primary use case)
Related: #872 (merged PR shipping the gap), #830 (epic), #880 (closed duplicate whose review surfaced this)