diff --git a/README.md b/README.md
index 07ceb10..c175748 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@

-๐ข **v1.0.0** โ released. Four parsers (`iptables-save`, `ip6tables-save`, `nft list ruleset`, `ufw status verbose`) with auto-detect. Structural graph with chain tooltips (action distribution + comments) and PNG / SVG export. **Diff** view (added / removed / reordered / policy-change). **Linter** with 34 smells (permissive-accept, exposed-admin-port, wide-open-port-range, overbroad-source-trust, missing-input-drop, shadowed-rule, fallthrough-accept, rule-after-policy-drop, loopback-not-allowed, exposed-via-dnat, forward-no-default-deny, missing-established-accept, masquerade-any-source, drop-without-log, missing-invalid-drop, icmpv6-blocked, icmp-pmtud-blocked, unused-chain, unlimited-log, duplicate-rule, unlimited-icmp-echo, unrestricted-egress, mac-based-trust, admin-port-no-rate-limit, log-tcp-sequence, missing-loopback-spoof-drop, ipv6-unfiltered, dnat-forward-blocked, bogon-source-accept, log-without-prefix, dnat-unscoped, dnat-no-hairpin, rate-limit-not-per-source, rate-limit-drop-inverted) and JSON / Markdown export. **Trace a packet** across the full pipeline: `INPUT` / `FORWARD` / `OUTPUT` directions, interface matches (`-i` / `-o` / `iifname` / `oifname`) modeled, and the complete **NAT model** โ `nat/PREROUTING` and `nat/OUTPUT` DNAT / REDIRECT rewrite the packet *before* filter, `nat/POSTROUTING` SNAT / MASQUERADE runs *after* filter accepts. The verdict line surfaces every rewrite, the trace log shows step-by-step matches, and the Graph view highlights visited chains live.
+๐ข **v1.0.0** โ released. Four parsers (`iptables-save`, `ip6tables-save`, `nft list ruleset`, `ufw status verbose`) with auto-detect. Structural graph with chain tooltips (action distribution + comments) and PNG / SVG export. **Diff** view (added / removed / reordered / policy-change). **Linter** with 35 smells (permissive-accept, exposed-admin-port, wide-open-port-range, overbroad-source-trust, missing-input-drop, shadowed-rule, fallthrough-accept, rule-after-policy-drop, loopback-not-allowed, exposed-via-dnat, forward-no-default-deny, missing-established-accept, masquerade-any-source, drop-without-log, missing-invalid-drop, icmpv6-blocked, icmp-pmtud-blocked, unused-chain, unlimited-log, duplicate-rule, unlimited-icmp-echo, unrestricted-egress, mac-based-trust, admin-port-no-rate-limit, log-tcp-sequence, missing-loopback-spoof-drop, ipv6-unfiltered, dnat-forward-blocked, bogon-source-accept, log-without-prefix, dnat-unscoped, dnat-no-hairpin, rate-limit-not-per-source, rate-limit-drop-inverted, rate-limit-accept-inverted) and JSON / Markdown export. **Trace a packet** across the full pipeline: `INPUT` / `FORWARD` / `OUTPUT` directions, interface matches (`-i` / `-o` / `iifname` / `oifname`) modeled, and the complete **NAT model** โ `nat/PREROUTING` and `nat/OUTPUT` DNAT / REDIRECT rewrite the packet *before* filter, `nat/POSTROUTING` SNAT / MASQUERADE runs *after* filter accepts. The verdict line surfaces every rewrite, the trace log shows step-by-step matches, and the Graph view highlights visited chains live.
---
@@ -146,6 +146,7 @@ FirewallScope's direction: cover the common firewall surfaces and gradually add
- [x] **v1.23.0** โ New linter smell **`rate-limit-not-per-source`** (warning): the follow-up question to `admin-port-no-rate-limit` โ that one asks whether a throttle *exists*, this one whether it is *keyed right*. Plain `-m limit`, `-m hashlimit` without a `srcip` mode, and a bare nft `limit rate` all keep **one token bucket that every client drains together**: an attacker holding the bucket empty with a trickle of SYNs makes the rule drop everyone *else's* connections too, so the "brute-force throttle" doubles as a **remote off-switch for the service** โ the classic flaw of the tutorial SYN-flood recipe. The fix is a per-client bucket: `-m hashlimit --hashlimit-mode srcip`, `-m recent`, `-m connlimit` (nft: a `meter` / dynamic set keyed on `ip saddr`, or `ct count`). Scoped to **TCP accepts on purpose**: global caps are the right tool where *total* volume is the concern โ ICMP echo (what `unlimited-icmp-echo` prescribes) and UDP amplification ceilings stay unflagged. Mutually exclusive with `admin-port-no-rate-limit` by construction (no throttle โ that one; shared throttle โ this one; pinned by a test). The sloppy router's second 8443 accept "throttles brute force" with plain `-m limit` and trips it. Linter goes from 31 to 32 smells.
- [x] **v1.24.0** โ New linter smell **`rate-limit-drop-inverted`** (warning): the DROP side of the rate-limit story โ the bucket points the **wrong way**. `-m limit` (always), `-m hashlimit` without `--hashlimit-above`, and nft `limit rate` without `over` all match traffic while it is *under* the rate: the right direction for an ACCEPT ("let this much through"), exactly backwards on a DROP โ the rule discards the first N packets of every interval (calm, legitimate traffic) and once the bucket runs dry **the flood sails past it** to the rules below. The tutorial SYN-flood recipe with `-j DROP` on the limit line degrades the service on a quiet day and protects nothing under attack. Judged for **every protocol** (dropping calm pings is as backwards as dropping calm SYNs) and per-source keying does not save it (a `meter { ip saddr limit rate 3/minute } drop` just inverts per client). **REJECT is exempt on purpose**: an under-limit REJECT is the classic reflector-avoidance recipe โ cap how many polite rejections leave per second, let the excess fall through to a silent drop. Alongside it, **`rate-limit-not-per-source` now judges drop-the-excess rules too**: `limit rate over` / `--hashlimit-above` with one global bucket lets an attacker push everyone into the excess, so the flood protection drops legitimate packets alongside the flood โ same off-switch, DROP form (still TCP-only; mutually exclusive with the inverted smell by construction: under-limit direction lands there, over-limit sharing lands here). The sloppy router gains the tutorial SYN-flood pair on port 80 and trips it. Linter goes from 32 to 33 smells.
- [x] **v1.25.0** โ New linter smell **`icmp-pmtud-blocked`** (warning): the IPv4 sibling of `icmpv6-blocked`, scoped to the one message IPv4 genuinely cannot live without โ ICMP **type 3** (destination-unreachable, whose code 4 is *fragmentation-needed*). TCP sends every segment with DF set and relies on routers answering "too big" with that message; a firewall that swallows it turns any smaller-MTU path (VPN, PPPoE, tunnels) into a **black hole**: the handshake's small packets pass, the payload's full-size ones vanish, connections just hang. Two triggers, one id: **rule-level** โ the classic `-p icmp -j DROP` "block ping" rule with no covering accept above it (the order matters: the same drop *below* the conntrack accept is fine); **chain-level** โ a deny-posture INPUT / FORWARD that accepts real traffic but never ICMP. Quiet when ICMP is accepted broadly or type 3 explicitly, or when a **RELATED**-state accept lets conntrack pass the errors for tracked connections โ ESTABLISHED alone is not enough, ICMP errors about a connection are RELATED. Also quiet for an **empty deny-posture FORWARD** (a non-forwarding host's correct config passes no traffic whose PMTUD could break), for ufw (before.rules accepts dest-unreach invisibly) and ip6tables (the twin's job). New **iptables (ICMP blocked โ no PMTUD)** sample trips both variants. Linter goes from 33 to 34 smells.
+- [x] **v1.26.0** โ New linter smell **`rate-limit-accept-inverted`** (warning): the **fourth quadrant** of the rate-limit matrix, and the only one still unjudged. Under-limit ACCEPT = a correct throttle (judged only for bucket sharing); under-limit DROP = `rate-limit-drop-inverted`; over-limit DROP = the correct drop-the-excess recipe (judged for sharing); **over-limit ACCEPT = this**: `-m hashlimit --hashlimit-above โฆ -j ACCEPT` / nft `limit rate over โฆ accept` admits **only the traffic above the rate** โ calm, legitimate traffic never matches and falls through to the default deny, so the service is dead on a quiet day and springs to life only under flood. Typically a half-fix: someone flips the tutorial recipe's matcher to `over` but forgets to flip the verdict. Like its DROP sibling it judges **every protocol** and **per-source keying does not save it** (a meter `{ ip saddr limit rate over 3/minute } accept` just inverts per client โ pinned by test). **Mutually exclusive with `rate-limit-not-per-source` by construction**: that detector now waves over-limit ACCEPTs through (prescribing `srcip` keying would "fix" a rule whose real problem is the verdict). The sloppy router gains an SMTP "guard" pasted backwards โ per-source, even โ and trips it. Linter goes from 34 to 35 smells.
## Stack
diff --git a/index.html b/index.html
index 6284038..dca94f8 100644
--- a/index.html
+++ b/index.html
@@ -175,7 +175,7 @@