ADR review → monitoring drift blog post (KR+EN)
SummaryCross-checked 174 sprint ADRs against the 11 existing blog posts to surface unwritten topic clusters (monitoring drift, CS quiz, over-engineering retrospective, the zstd experiment, etc.) and presented them by narrative strength. By user choice (#1), wrote the Sprint 231~236 monitoring saga as a blog post: outage-that-never-happened.mdx KR+EN (category platform, relatedAdrs sprint-231~236+ADR-029). It frames as 'problem→experiment→result→reflection' the six-sprint journey of declaring a runtime defect from a static manifest (a non-deployed mirror), correcting it with an ERRATA, then finding the real causes live (missing cAdvisor scrape, promtail label mismatch, Loki OOM) and applying an alert channel split. On user request, the voice was quantitatively checked: the draft's formal register (습니다97/어요11) clashed with the confessional-journey genre → harmonized to a warm colloquial register (습니다47/어요61), matching the closest analog sliding-window-agent-context (45/64), plus 2 blockquotes for the pivotal realizations. Verification: cross-check --strict 0 violations, blog SSG build EXIT=0, Critic (Codex gpt-5.5) R1 [P2 logical contradiction in principle (iii): reintroducing a retracted misjudgment] → corrected → R2 CLEAN. PR #424 squash merge.
Goal
- Review recent ADR/sprint records to surface candidate topics not yet written as blog posts, and present them.
- Write a technical blog post (KR+EN) on the user-chosen topic, confirm voice alignment with existing posts, and merge.
Background
- Started with the
/startargument "check the ADRs and tell me if there's new blog material." - The blog has 11 posts as
blog/content/posts/(KR) +posts-en/(EN) pairs, covering up to the latest postmarkdown-for-agents-html-for-humans(2026-05-22, written in Sprint 198). Sprints 199~236 (~38 sprints) are an unwritten window. - Blog consistency is enforced by a CI hard gate (
check-blog-crosscheck.mjs --strict): KR↔EN slug pairing + structural fields (date/category/order/tags/series) fully matching + category enum of 7 (ai-agent/cicd/architecture/backend/platform/frontend/retrospective) + internal link integrity.
Topic discovery (174 ADRs ↔ 11 blog posts)
Unwritten topics presented by narrative strength:
- The great monitoring drift incident (S231~236) — a complete arc of static-analysis misjudgment → ERRATA → live diagnosis & resolution, with [[feedback-source-vs-live-drift]] as its spine. Top recommendation.
- CS quiz minigame (S215~229) — a new feature from zero (core → question bank → record integration → a11y → bundle optimization).
- Things built then deleted (S185~189·S193·S201) — built then removed the blog graph/search; an over-engineering retrospective.
- (lower priority) zstd compression experiment rollback (S165
171) · GitOps SSOT consolidation (ADR-029) · GA4/SEO (S210213) · harness polymorphism (S202·S214).
→ User chose #1.
Work summary (start 73b4a11, 4 commits → squash 95c9f92, PR #424)
48ba138docs(blog): newoutage-that-never-happened.mdxKR+EN. categoryplatform, relatedAdrs sprint-231~236+ADR-029. Narrative: static-manifest misjudgment (S231) → ERRATA·mirror demotion·Loki OOM (S232) → live-first diagnosis (cAdvisor/promtail/S234) → alert gap closure (CB unification·DLQ placeholder swap/S235) → channel split live (S236). Four reflection principles.7a315eestyle(blog): harmonized the KR voice to the journey register (습니다 97/어요 11 → 47/61), blockquotes 1→2. Aligned with sliding-window (45/64).fix(blog): corrected the logical contradiction in principle (iii) (Critic R1 P2) — reframed the null receiver as the "that's why I was fooled (non-deployed mirror)" concept, and the actually-deployed case as the DLQ (unemitted metric). KR+EN simultaneously.
Key decisions
- Topic priority = narrative completeness: recommended the monitoring drift as #1, being the most recent and with a complete failure→correction→resolution arc. Best fit for the retrospective tone (problem→experiment→result→reflection).
- Verify voice quantitatively: in response to "check if the voice matches existing posts," measured the sentence-ending distribution. Confirmed the blog splits into two registers — formal (ci-refactoring 147/0·markdown-for-agents 64/2) and warm colloquial (sliding-window 45/64·toward-model-agnostic 27/34) → this confessional/journey-genre post fits the latter → harmonized KR to 47/61.
- Critic as the merge gate: blog content goes through Codex cross-review too. Critic caught a logical contradiction in the principles section (an assertion at odds with the article's core correction) → corrected, then R2 CLEAN.
- EN keeps its English voice: the English edition has no sentence-ending issue and is not a harmonization target; it follows the first-person retrospective tone of the existing EN posts.
Verification
- cross-check
check-blog-crosscheck.mjs --strict: KR 12 / EN 12, 0 violations (all 3 axes: parity·schema·link). - blog SSG build
npm run build: EXIT=0,/posts/outage-that-never-happened+/en/posts/...statically prerendered. - voice quantitative (after harmonization): 습니다 47 / 어요-family 61 / blockquotes 2 — aligned with sliding-window (45/64/2).
- Critic (Codex gpt-5.5,
codex review --base 73b4a11): R1 [P2] principle (iii) asserted "the null receiver swallowed alerts (first incident)," contradicting the article's core correction (non-deployed mirror·live healthy) and reintroducing the retracted misjudgment for readers who skim only the principles → corrected → R2 CLEAN ("no actionable correctness issues were found in the diff"). (Default models gpt-5.3/5.5-codex are unsupported on a ChatGPT account → ran with-c model=gpt-5.5.) - CI PR #424:
Quality — docs(blog cross-check)·Secret & Env Scanand all checks green, auto-merge SQUASH.