Issue #115 remained broken after the first citation cleanup.
The current markdown-safe source shape:
[Source: Story Title | Publication](https://example.com/story)
is not actually safe in this repository’s markdown pipeline. On live pages, Kramdown is treating the | inside the link label as a table separator and rendering the line as a two-cell table instead of a link.
This affects at least the two reported posts and a wider set of archive entries that use the same [Source: ... | Publication](...) pattern.
Example:
[Source: Story Title \| Publication](https://example.com/story)
Pros:
Cons:
Example:
[Source: Story Title](https://example.com/story)
Pros:
Cons:
Example:
*Source:* [Story Title](https://example.com/story)
Pros:
Source: quote-attribution bug and the new pipe-as-table bug.Cons:
Title | Publication.Use approach 3.
Canonical source line after a quote:
*Source:* [Story Title](https://example.com/story)
If the old source label used Title | Publication, split it during normalization:
TitleThis is the blunt option, but it is legible, parser-safe, and portable.
Update scripts/normalize_source_citations.py so it converts both of these risky shapes:
Source: [Story Title](https://example.com/story)
[Source: Story Title | Publication](https://example.com/story)
into:
*Source:* [Story Title](https://example.com/story)
The normalizer should also convert existing safe bracketed source lines without pipes into the same canonical emphasis form so the archive does not end up with mixed patterns.
Update scripts/validate_posts.py to reject:
Source: [..](..) immediately after a blockquote[Source: ...](...) lines that still include |gp-quote HTML if any remainsThe validator should allow:
*Source:* [Story Title](https://example.com/story)
Bulk-update the affected archive set identified by the normalizer. The first pass already touched the posts most likely to contain these source lines, but the new scan should be run against the whole archive because some risky lines exist outside the first enforcement window.
|.python3 scripts/validate_posts.py --today 2026-03-27.| in the source label.