Fix link-post source citations that Kramdown currently folds into <blockquote><cite>...</cite></blockquote> by accident, and bulk-normalize the archive to a markdown-only source-link shape that stays portable and renders consistently.
Issue #115 documents two live failures:
https://gurupanguji.com/blog/2026/02/21/f0-9f-94-97-openais-first-hardware-device-is-a-siri-competitor/https://gurupanguji.com/blog/2026/03/13/f0-9f-94-97-the-bertone-redux-looks-so-good/Both posts use this authored shape:
> quoted excerpt
Source: [Link title](https://example.com)
Kramdown treats the trailing Source: line as attribution for the preceding blockquote and emits a <cite> inside the quote block. That behavior is parser-driven, not intentional site markup, so the rendered result is brittle and visually inconsistent.
The issue is broader than two posts. A repo scan found roughly 205 posts where Source: appears near quoted content with the same general pattern.
The canonical archive shape should remain plain markdown.
Canonical output:
> Quoted text.
[Source: Publication or story title](https://example.com)
This keeps the files portable and simple while avoiding Kramdown’s quote-attribution behavior.
This should be a content rewrite, not a render-time transform.
Reason:
Add a script, likely scripts/normalize_source_citations.py, that:
_posts/Source: [title](url) line--write to modify filesThe converter should be mechanical and narrow.
It should preserve:
It should not:
Safe candidates should include:
Source: [title](url) lineSkip cases should include:
Source: lines attached to one quote runWhen the shape is ambiguous, the script should skip and report the reason rather than guess.
Extend scripts/validate_posts.py to reject the risky authored pattern for posts at or after the policy date for this fix.
The validator should flag:
Source: [..](..) in raw markdowngp-quote HTML markup introduced during remediationThe safe allowed shape is the standalone markdown link:
[Source: Example Story](https://example.com/story)
This keeps future posts from reintroducing the bug after the archive cleanup while preserving markdown portability.
docs/superpowers/specs/2026-03-27-source-citation-rendering-design.mdscripts/normalize_source_citations.pydocs/superpowers/plans/2026-03-27-source-citation-rendering-implementation-plan.mdscripts/validate_posts.pytests/test_validate_posts.py_posts/Add test coverage for:
Source: conversion--writeSpot-check:
Confirm that quotes remain markdown-only, the source link renders separately, and no surrounding prose drifted.
The archive likely contains close cousins of the target pattern. The script should stay narrow and skip anything it cannot rewrite safely.
This cleanup can touch many posts. The rewrite must stay mechanical so the diff remains reviewable.
The new guardrail should only flag the precise risky raw markdown pattern. It should not reject intentional HTML quote markup or historical posts that predate the enforcement window.
<cite> generation.blockquote plus Source: patterns that would regress this bug.gp-quote HTML markup so the repository stays markdown-first.