<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>eslint-plugin-typedoc Blog</title>
        <link>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/</link>
        <description>Updates, architecture notes, and practical guidance for eslint-plugin-typedoc users.</description>
        <lastBuildDate>Wed, 11 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>© 2026 Nick2bad4u</copyright>
        <item>
            <title><![CDATA[Keeping Rule Docs and Presets in Sync]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How eslint-plugin-typefest keeps docs tables, preset matrices, and rule metadata aligned through canonical generators.]]></description>
            <content:encoded><![CDATA[<p>Documentation drift is one of the easiest ways to lose trust in a lint plugin.</p>
<!-- -->
<p>This repository treats metadata-to-doc synchronization as a first-class quality gate, not a best-effort cleanup task.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-core-principle">The core principle<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#The-core-principle" class="hash-link" aria-label="Direct link to The core principle" title="Direct link to The core principle" translate="no">​</a></h2>
<p>Human-written explanation should stay human.</p>
<p>Mechanically derivable data should be generated and tested.</p>
<p>For us, that includes:</p>
<ul>
<li class="">README rules matrix</li>
<li class="">presets rules matrix</li>
<li class="">rule metadata snapshots and integrity contracts</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-this-prevents">What this prevents<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#What-this-prevents" class="hash-link" aria-label="Direct link to What this prevents" title="Direct link to What this prevents" translate="no">​</a></h2>
<p>Without canonical generation, drift appears quickly:</p>
<ul>
<li class="">rule added to a preset but matrix unchanged</li>
<li class="">fix/suggestion capability changes but docs lag</li>
<li class="">links and IDs diverge between source and docs</li>
</ul>
<p>That leads to wrong migration guidance and unnecessary issue churn.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="How-we-enforce-it">How we enforce it<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#How-we-enforce-it" class="hash-link" aria-label="Direct link to How we enforce it" title="Direct link to How we enforce it" translate="no">​</a></h2>
<ul>
<li class="">sync scripts produce canonical matrix sections</li>
<li class="">CI checks fail when docs and generated sections diverge</li>
<li class="">docs integrity tests enforce stable heading/catalog conventions</li>
</ul>
<p>The result is less manual bookkeeping and fewer review-time surprises.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-maintenance-advice">Practical maintenance advice<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#Practical-maintenance-advice" class="hash-link" aria-label="Direct link to Practical maintenance advice" title="Direct link to Practical maintenance advice" translate="no">​</a></h2>
<p>When changing rules or preset composition:</p>
<ol>
<li class="">update rule source and metadata</li>
<li class="">run matrix sync scripts</li>
<li class="">run docs integrity and snapshot suites</li>
<li class="">only then review prose-level docs edits</li>
</ol>
<p>This ordering keeps intent and generated truth aligned.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/rule-catalog-and-doc-sync" target="_blank" rel="noopener noreferrer" class="">Rule catalog and docs synchronization chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/preset-composition-and-rule-matrix" target="_blank" rel="noopener noreferrer" class="">Preset composition and rule matrix chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/presets" target="_blank" rel="noopener noreferrer" class="">Presets page</a></li>
</ul>]]></content:encoded>
            <category>eslint</category>
            <category>documentation</category>
            <category>automation</category>
            <category>adr</category>
            <category>quality</category>
        </item>
        <item>
            <title><![CDATA[Type-Aware Linting Without Surprises]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Practical adoption strategy for typed ESLint rules using guard-first execution and predictable fallbacks.]]></description>
            <content:encoded><![CDATA[<p>Type-aware rules are powerful, but they become noisy fast when parser-service assumptions are unclear.</p>
<!-- -->
<p>The goal is not “run typed rules everywhere immediately.” The goal is predictable behavior under real project conditions.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-contract-we-want">The contract we want<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#The-contract-we-want" class="hash-link" aria-label="Direct link to The contract we want" title="Direct link to The contract we want" translate="no">​</a></h2>
<p>A healthy typed-rule setup has three explicit outcomes:</p>
<ol>
<li class=""><strong>Typed path available</strong>: semantic checks run with parser services + checker.</li>
<li class=""><strong>Optional typed path unavailable</strong>: semantic branch is skipped safely.</li>
<li class=""><strong>Required typed path unavailable</strong>: fail fast with a clear configuration signal.</li>
</ol>
<p>That split keeps failures actionable and prevents silent drift.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-guard-first-design-matters">Why guard-first design matters<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Why-guard-first-design-matters" class="hash-link" aria-label="Direct link to Why guard-first design matters" title="Direct link to Why guard-first design matters" translate="no">​</a></h2>
<p>In large codebases, parser-service availability is not uniform:</p>
<ul>
<li class="">different <code>tsconfig</code> scopes</li>
<li class="">mixed package boundaries</li>
<li class="">generated or excluded files</li>
</ul>
<p>Guard-first execution avoids brittle behavior by making typed entry conditions explicit.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Rollout-pattern-that-works">Rollout pattern that works<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Rollout-pattern-that-works" class="hash-link" aria-label="Direct link to Rollout pattern that works" title="Direct link to Rollout pattern that works" translate="no">​</a></h2>
<ul>
<li class="">Start in one folder/package.</li>
<li class="">Measure with <code>--stats</code> before and after enabling typed checks.</li>
<li class="">Promote from <code>warn</code> to <code>error</code> once baseline noise is gone.</li>
<li class="">Expand scope only when performance and diagnostics stay stable.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-to-track">What to track<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#What-to-track" class="hash-link" aria-label="Direct link to What to track" title="Direct link to What to track" translate="no">​</a></h2>
<ul>
<li class="">typed-rule error rate tied to config gaps</li>
<li class="">lint runtime deltas after enabling typed presets</li>
<li class="">rule-level hotspots that call checker APIs most often</li>
</ul>
<p>If those stay stable, typed linting remains a quality upgrade instead of a workflow tax.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/typed-paths" target="_blank" rel="noopener noreferrer" class="">Typed service path inventory</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/typed-rule-semantic-analysis-flow" target="_blank" rel="noopener noreferrer" class="">Typed rule semantic analysis flow</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/guides/type-aware-linting-readiness" target="_blank" rel="noopener noreferrer" class="">Type-aware linting readiness guide</a></li>
</ul>]]></content:encoded>
            <category>eslint</category>
            <category>typescript</category>
            <category>parser-services</category>
            <category>architecture</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[Designing Safe Autofixes for eslint-plugin-typefest]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How eslint-plugin-typefest decides between automatic fixes and suggestions to protect runtime behavior.]]></description>
            <content:encoded><![CDATA[<p>Autofix is one of the biggest quality-of-life features in ESLint, but it is also one of the fastest ways to damage trust if a rule gets it wrong.</p>
<!-- -->
<p>In this plugin, a fix is not accepted just because it is convenient. A fix must be safe.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-safety-bar">The safety bar<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#The-safety-bar" class="hash-link" aria-label="Direct link to The safety bar" title="Direct link to The safety bar" translate="no">​</a></h2>
<p>Before a fixer is enabled, the rule needs confidence in three areas:</p>
<ol>
<li class=""><strong>Semantic stability:</strong> The rewritten code must keep the same runtime meaning.</li>
<li class=""><strong>Syntactic stability:</strong> The output must stay valid TypeScript in real files.</li>
<li class=""><strong>Formatting stability:</strong> The change should cooperate with normal formatter and linter workflows.</li>
</ol>
<p>If any of those checks are uncertain, we downgrade to a suggestion.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Fix-versus-suggestion">Fix versus suggestion<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Fix-versus-suggestion" class="hash-link" aria-label="Direct link to Fix versus suggestion" title="Direct link to Fix versus suggestion" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-fix-when">Use <code>fix</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Use-fix-when" class="hash-link" aria-label="Direct link to Use-fix-when" title="Direct link to Use-fix-when" translate="no">​</a></h3>
<ul>
<li class="">the transformation is deterministic,</li>
<li class="">there are no ambiguous symbols or scope collisions,</li>
<li class="">and the replacement can be generated from source text without structural guesswork.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-suggest-when">Use <code>suggest</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Use-suggest-when" class="hash-link" aria-label="Direct link to Use-suggest-when" title="Direct link to Use-suggest-when" translate="no">​</a></h3>
<ul>
<li class="">there is a meaningful chance of behavior change,</li>
<li class="">user intent cannot be derived from syntax alone,</li>
<li class="">or code style constraints vary across teams.</li>
</ul>
<p>This keeps automation helpful without becoming risky.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-this-matters-in-TypeScript-heavy-codebases">Why this matters in TypeScript-heavy codebases<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Why-this-matters-in-TypeScript-heavy-codebases" class="hash-link" aria-label="Direct link to Why this matters in TypeScript-heavy codebases" title="Direct link to Why this matters in TypeScript-heavy codebases" translate="no">​</a></h2>
<p>TypeScript projects frequently rely on utility types, narrowings, and overloaded APIs. Small rewrites can accidentally change constraints or type inference behavior.</p>
<p>A conservative strategy means developers still get guidance and one-click migrations, but only in places where the rule can prove safety.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-rollout-advice">Practical rollout advice<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Practical-rollout-advice" class="hash-link" aria-label="Direct link to Practical rollout advice" title="Direct link to Practical rollout advice" translate="no">​</a></h2>
<p>If your team is adopting this plugin:</p>
<ol>
<li class="">Start with a baseline preset.</li>
<li class="">Enable autofix in CI only after reviewing suggestion quality.</li>
<li class="">Move stricter rules from suggestion-first to fix-first once confidence is high.</li>
</ol>
<p>That progression gives teams predictable upgrades instead of disruptive churn.</p>]]></content:encoded>
            <category>eslint</category>
            <category>autofix</category>
            <category>typescript</category>
            <category>static-analysis</category>
            <category>developer-experience</category>
        </item>
    </channel>
</rss>