@@ -6,7 +6,89 @@ The format is based on [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.
66
77## [ Unreleased]
88
9- Forward-looking (post-v0.5.4): see [ ` ROADMAP.md ` ] ( ./ROADMAP.md ) .
9+ Forward-looking (post-v0.5.5): see [ ` ROADMAP.md ` ] ( ./ROADMAP.md ) .
10+
11+ ## [ 0.5.5] — 2026-05-18
12+
13+ Wave AE Critical Tier (8 sections) — Stephen's deepest "what are you
14+ holding back?" audit: 6 parallel sub-agents (code-explorer, two
15+ silent-failure-hunters, pr-test-analyzer, gemini-agent, general-purpose)
16+ across 6 project sections returned 62 findings. Critical Tier shipped
17+ 8 of them as atomic commits in this release.
18+
19+ ### Fixed — CRITICAL (judge-facing UX destroyers)
20+
21+ - ** Wiki path mismatch** — ` ActionBar.tsx ` , ` EmptyState.tsx ` , +3 demo
22+ video docs pointed mods at ` /wiki/contextmod ` (upstream FoxxMD path).
23+ Devvit port uses ` /wiki/botconfig/contextmod ` . Any judge installing
24+ fresh + clicking the Wiki button got a 404 on their first attempt.
25+ v0.5.2 closed the README side; v0.5.5 closes the remaining 5 surfaces.
26+ - ** Light mode broken** — Z4 light-mode MVP (v0.5.0) added overrides for
27+ body / text / borders / bg / pre but missed ` .glass ` . Cards, modals,
28+ KeyboardOverlay all rendered invisible white-on-white when mode flipped
29+ to ` #fafaf9 ` . Frontend agent flagged as #1 destroyer. Added dark-on-
30+ light glass overrides.
31+ - ** Hard-mute claim was FALSE since v0.3.0** — dashboard mute button
32+ wrote to ` cm:muted-rules:{sub} ` but ` runCheck ` never read it. README/
33+ CHANGELOG/writeup all promised "dashboard mute stops the bot" — wrong
34+ for 30+ days. Wired ` isRuleMuted(sub, runName, checkName) ` into
35+ ` runCheck.ts ` with new ` runName? ` 5th param threaded from ` runRun.ts ` .
36+ Mute button finally works as documented.
37+
38+ ### Fixed — CRITICAL (correctness / silent failures)
39+
40+ - ** AuthorHistory 429-swallow → mass false-positive moderation** —
41+ ` getPostsByUser ` / ` getCommentsByUser ` caught Reddit errors broadly +
42+ returned empty arrays. ` commentCountLt: 5 ` then fired TRUE on EVERY
43+ user during a Reddit rate-limit outage. The single worst silent
44+ failure in the codebase. Added ` degraded: boolean ` flag — true on
45+ fetch throw, NOT cached (preserves retry semantics), consulted by all
46+ three Phase 4 rules to skip evaluation on degraded reads.
47+ - ** configStore.publish() unwrapped** — Redis blip mid-INCR/SET leaked
48+ an allocated rev with no payload → ` getCurrentRev ` threw "cfg payload
49+ missing" forever, moderation permanently broken until manual Redis
50+ intervention. Wrapped each phase with new ` PublishError ` class
51+ (4-state discriminator: allocate-rev / write-payload / read-pointer /
52+ advance-pointer) so callers can show "publish failed, retry" instead
53+ of a 500.
54+ - ** dryRun idempotency marker not written** — runAction short-circuited
55+ BEFORE reserveAction in dry-run mode (despite the docstring promising
56+ otherwise). Toggling ` dryRun: false ` after testing could re-fire
57+ every action a Devvit retry re-delivered. Fixed: dry-run now reserves
58+ + commits the done marker, skips ONLY the side-effect. Added
59+ ` bypassIdempotency ` ActionContext flag for the mod-menu dryRunActivity
60+ sibling (read-only, repeatable, no retry concern).
61+
62+ ### Added — test gap close
63+
64+ - ** ` /api/health/deep ` regression suite** (NEW, 6 tests) — the v0.5.3
65+ requireModerator gate had ZERO coverage. Pins non-mod 403, rate-limit
66+ 60/min cap, Redis throw envelope, Reddit throw envelope, success
67+ shape, and Redis-set-OK-but-get-mismatch failover edge case.
68+ - ** ` runCheck-mute ` regression suite** (NEW, 4 tests) — pins the
69+ hard-mute contract so a future refactor that drops the mute check
70+ fails CI loudly. Verifies fail-open behavior + dry-run sibling safety.
71+ - ** PublishError suite** (+4 in ` configStore.test.ts ` ) — pins all 4
72+ failure phases + ` cause ` preservation.
73+ - ** AuthorHistory degraded suite** (+3 in ` authorHistory.test.ts ` ) +
74+ history-rule degraded skip (+2 in ` history.test.ts ` ) — pins both the
75+ cache-write semantics (degraded NOT cached) and the rule-side skip
76+ semantics (Lt threshold never false-positives on degraded read).
77+ - ** dryRun marker suite** (+4 in ` runAction.test.ts ` ) — pins reserve +
78+ commit on dry-run, skipped-locked behavior, commitAction failure
79+ harmlessness, bypassIdempotency semantics, safety-violation refusal.
80+
81+ ### Changed — CI
82+
83+ - ** ` .github/workflows/ci.yml ` concurrency** — switched from per-ref +
84+ cancel-in-progress=true (intermediate commits showed red ❌
85+ "cancelled" on rapid push) to per-SHA + cancel-in-progress=false
86+ (every commit runs full CI to completion). Zero compute cost on
87+ public repos.
88+
89+ ### Tests
90+
91+ 516 → 538 passing (+22 across Critical Tier).
1092
1193## [ 0.5.4] — 2026-05-18
1294
0 commit comments