Retrospective Issue Mapping — mdproctor/mdproctor.github.io
Generated: 2026-04-09 Covers: 2026-02-06 → 2026-04-06 (110 commits)
Epic 1: Build KIE blog archive mirror — #1
Label: epic, enhancement
Date range: 2026-04-01 → 2026-04-02
Overview
Archive the full KIE blog (blog.kie.org) as a self-contained static HTML mirror, extracting content, images, YouTube thumbnails, and Gist embeds for 577+ posts. Image recovery via Wayback Machine CDX and multiple mirror strategies preserves post fidelity after the original CDN was shut down.
Child Issues
#2 — Build KIE archive extraction pipeline
Label: enhancement
Date range: 2026-04-01
Key commits:
006ebf1Add KIE blog archive design specc45bedfAdd KIE blog archive implementation plan33a63c3chore: scaffold KIE archive scripts and gitignore58acf33chore: document lxml 5.x version rationale (Python 3.13 compat)5589df6feat: author slug and post slug normalisation14dd4ecfeat: resumable state file load/savec7058a2feat: metadata extraction from WordPress HTML3b15863fix: move BS4 import to top, handle corrupt state JSON8b3efdbfeat: image download with SHA-256 deduplication1b0ef19feat: YouTube iframe extraction and thumbnail replacement663947efeat: GitHub Gist detection, API fetch, and inline code replacementf77c9e3fix: HTML-escape YouTube/Gist values in generated HTML3a1befcfeat: article content cleaning, attribute stripping887c50cfeat: standalone HTML shell wrapper with archive metadatae27113cfix: HTML-escape date and archived_date in make_html_shell8636bf9feat: main extraction orchestrator (images, YouTube, Gists, HTML shell)8186afefix: remove unused state param, add post-navigation CSS skip, add logging confige398148feat: validation pass for images, links, and unreplaced gists871972bfeat: index generator — browsable HTML index grouped by author86fbe31fix: author selector for real KIE blog markup, add REST API mirror script68482ebfix: strip URL fragments in check_local_links, guard against IsADirectoryErrord7bf8f7fix: strip trailing slashes in url_to_mirror_pathedc618afix: filter directories from discover_posts894645afix: skip .html directories in process_post
What: Build all extraction scripts: metadata parsing, image deduplication, YouTube thumbnail replacement, Gist inlining, content cleaning, HTML shell generation, validation, and a browsable index.
#3 — Recover broken images via Wayback Machine and mirroring
Label: enhancement
Date range: 2026-04-01
Key commits:
b8a2169feat: add Wayback Machine image recovery and Playwright iframe recovery scriptsc1fd464feat: lazy image recovery — wire 4,632 already-cached images to placeholders47404e9fix: add Wayback fallback to lazy image recoveryafda37afeat: comprehensive 5-approach image recovery (data-src mirror, Wayback CDX, archive.today, cross-posts)d657cebfeat: comprehensive image recovery — Wayback CDX date-targeted, ederign.me URL remapping, optaplanner.io mirrors, YouTube/Vimeo iframe fixes, tracking pixel cleanup
What: Recover post images that were broken after CDN shutdown — lazy image recovery (wiring cached copies), Wayback Machine CDX API with date targeting, ederign.me/optaplanner.io mirror remapping, and a five-approach orchestrator.
Standalones — April 2–3
#4 — Attempt bulk MD conversion from KIE HTML (reverted in favour of manual review)
Label: enhancement
Date range: 2026-04-02
Key commits:
53917a6feat: convert all 578 Mark Proctor posts to Jekyll Markdowne3833bdchore: remove auto-converted mark-proctor posts — starting over with manual review process
What: Generated MD for all 578 posts automatically, then reverted — the bulk output was insufficiently accurate, so the approach was replaced with a tool-assisted manual review process.
#5 — Build blog review tool (App 1 HTML reviewer + App 2 MD conversion reviewer)
Label: enhancement
Date range: 2026-04-03
Key commits:
6f99863feat: complete App 1 (HTML archive reviewer) + App 2 (MD conversion reviewer)8992315feat: complete blog migration review tool
What: Two browser-based review UIs — App 1 for inspecting raw HTML archive posts, App 2 for reviewing auto-generated Markdown with side-by-side comparison.
Epic 2: Build Sparge blog migration app — #6
Label: epic, enhancement
Date range: 2026-04-04 → 2026-04-06
Overview
Sparge (originally “blog-migrator”) is a local web app for reviewing, enriching, and publishing migrated KIE blog posts. It evolved from a single-project script into a multi-project architecture with CodeMirror editors, a full edit mode, and an HTML enrichment pipeline.
Child Issues
#7 — Build blog-migrator multi-project app with ingestion, review, and bulk operations
Label: enhancement
Date range: 2026-04-04
Key commits:
3996256feat(blog-migrator): asset scanning and issue highlightingec5e2d7feat(blog-migrator): validate scope, bulk staged ops, manual MD editing1960370feat(blog-migrator): ingestion pipeline + bulk ops + manual MD editing3c0fee5feat(blog-migrator): multi-project architecture with projects landing page9f6bd6afeat(blog-migrator): test suite + security fixes + navigation bug fix5db43edfix(blog-migrator): clean up project dirs created by API tests6a54038fix(blog-migrator): merge Scan HTML + Scan Assets into single Scan action7f8db8brand: rename Blog Migrator → Sparge
What: Full rewrite of the review tool as a multi-project server app: ingestion pipeline, asset scanning, issue highlighting, bulk staged operations, manual MD editing, a projects landing page, and initial test suite. Renamed to Sparge at end of this phase.
#8 — Add ~/.sparge config, project storage migration, and author filter
Label: enhancement
Date range: 2026-04-05
Key commits:
ef8f8b7feat(sparge-home): read ~/.sparge/config.json for projects_dir71b9491feat(sparge-home): auto-migrate projects from blog-migrator/projects/ on first rune387e11feat(server): use PROJECTS_DIR from ~/.sparge/config.json; auto-migrate on startup7fd655dfeat(server): GET /api/posts?author=X filters by author; falls back to config0b47d85feat(ui): author filter dropdown — pre-selected from config, re-fetches on change27671122fix(ui): avoid double fetch on startup — use pre-loaded cfg for initial author filteraba527echore: remove one-off migration code from sparge_home and server8db3c84test(config): verify github_token round-trips through _resolve
What: Move project storage to ~/.sparge/config.json with automatic migration from the old blog-migrator/projects/ path. Add author filter endpoint and UI dropdown.
#9 — Add HTML enrichment pipeline (YouTube, Gist, brush normalisation, live-embed)
Label: enhancement
Date range: 2026-04-05
Key commits:
5f3feffdocs: pipeline spec and content-fidelity implementation planb6b96d2docs(pipeline): fix Stage 2a fix table and mark implemented items as Done6ff65e2docs: add ADRs 0001-0004 for pipeline, storage, author filter, and enrichment stage3a40d27feat(enrich): YouTube iframe → thumbnail figure replacement2dd0991feat(enrich): Gist script tag → inlined code figure8a9db9efeat(enrich): brush:X class normalisation + language detection heuristics75cd4abfeat(enrich): unknown iframe/object/embed → live-embed fallback figure45db233feat(enrich): enrich_post() orchestrator — full pipeline518b571feat(state): add mark_enriched() for enrichment stats trackingcad3494feat(server): enriched HTML pipeline — scan enriches first, generate-md prefers enriched274d471fix(server): validate-md cross-checks also prefer enriched HTMLce99926fix(enrich): fix orchestrator test mock + remove stale brush tokens after normalisation
What: Per-post enrichment pipeline: YouTube iframes → thumbnail figures, Gist script tags → inlined code, brush:X class normalisation, and a live-embed fallback for unknown embeds. Server routes updated to prefer enriched HTML copies.
#10 — Add CodeMirror editors for HTML and Markdown editing
Label: enhancement
Date range: 2026-04-05
Key commits:
7765b09docs: CodeMirror editors design spec6fac4d1docs: CodeMirror editors implementation plan9d40c58feat(ui): load CodeMirror 5 from CDN with markdown and htmlmixed modesfe94522feat(ui): upgrade MD editor from textarea to CodeMirror markdown mode7d02a19feat(ui): add CodeMirror HTML editor for enriched HTML copy377a27dfeat(server): POST /api/posts/{slug}/save-html writes to enriched copy1b59655feat(server): GET /api/posts/{slug}/html returns raw HTML sourcebc2c19dfix(tests): cleanup project dirs from ~/sparge-projects/ not old repo path
What: Replace textarea editors with CodeMirror 5 for both Markdown (markdown mode) and HTML (htmlmixed mode). Add server endpoints for HTML source retrieval and save.
#11 — Build edit mode — three-partition layout, live preview, scroll sync, exit flows
Label: enhancement
Date range: 2026-04-05
Key commits:
1d1c5a6docs: edit mode redesign spec — three-partition layout with live preview5f03563docs: edit mode redesign implementation planf142e27feat(ui): refactor editState/editDirty + pure scroll helpers + JS unit tests7d6f8dcfeat(ui): add marked.js CDN and #md-preview div for live MD previewbc0883afix(ui): remove duplicate marked.min.js CDN tag89b8029feat(ui): add #edit-sidebar HTML and CSS120319afeat(ui): unified enterEditMode(mode) — nav→sidebar, middle→editor, right→previewda60adffeat(ui): debounced live preview — HTML iframe srcdoc + MD marked.parse91d6220feat(ui): edit mode scroll sync — editor↔preview with loop guarde80c37afeat(ui): exitEditMode, saveEditContent, discardEdit — complete exit flows8f0080cfeat(ui): styled unsaved-changes modal + selectPost navigation guarddf37ad2test(edit-flow): integration tests for HTML/MD save/retrieve cycle707b127fix(ui): address code review — double-slash URL, duplicate marked.js, scroll accumulation, async toggles, modal consistencyf5847dctest(edit-mode): comprehensive unit + integration tests — cancel/save flows, panel visibility, 20-post mock blog, cross-author isolation
What: Full edit mode rework: three-partition layout (nav sidebar → editor → preview), debounced live preview for both HTML and Markdown, scroll sync with loop guard, unsaved-changes modal, and navigation guard. All save/cancel flows implemented and tested.
#12 — Add HTML pretty-print to editor view (with lxml encoding fix)
Label: enhancement
Date range: 2026-04-05
Key commits:
39a81cffeat(server): pretty-print HTML in editor view — cosmetic only, original untouchedb5a8cd6fix(server): use html.parser not lxml for prettify — lxml double-encodes non-ASCII via meta charset1f237b6test(prettify): 19 tests — unit, happy path on real posts, integration via /html endpointa5c7728test(prettify): regression guard for parser choice + runtime garbling detection in server
What: BeautifulSoup prettify() for the HTML editor view (cosmetic only — source unchanged). Fixed an lxml double-encoding bug that garbled em dashes and curly quotes across all 577 posts; switched to html.parser.
Standalones — April 6
#13 — Write Sparge blog series (5 retrospective entries with screenshots)
Label: documentation
Date range: 2026-04-06
Key commits:
b27b169docs: Sparge blog entries 1-2 + two-panel reviewer screenshotae313f6docs: Sparge blog series — all 5 entries with screenshots7e52492fix(blog): style guide compliance — register heading, two long sentences
What: Five retrospective blog entries written to docs/blog/, covering Sparge’s evolution from extraction scripts through the review UI, enrichment pipeline, and CodeMirror edit mode. Playwright-generated UI screenshots included.
#14 — Consolidate Sparge — integrate asset_store, remove blog-migrator/
Label: refactor
Date range: 2026-04-06
Key commits:
00f9890feat(sparge): integrate asset_store + consolidate from original sparge — Option A additive integrationd7a6ca3chore: remove Sparge project docs now living in ~/claude/sparge5888263chore: remove blog-migrator/ — Sparge now lives at ~/claude/sparge
What: Merged asset_store.py and consolidate.py from the original Sparge proof-of-concept into the main codebase. Deleted blog-migrator/ from the Jekyll repo — all Sparge code now lives at ~/claude/sparge.
Excluded Commits (trivial — no ticket)
| Hash | Date | Subject | Reason |
|---|---|---|---|
6e9f5f3 |
2026-02-06 | Initial commit | Initial scaffold |
2e93aa7 |
2026-02-06 | sample blog | Initial scaffold |
bc43b73 |
2026-02-06 | sample blog | Initial scaffold |
c1e5ff5 |
2026-04-01 | chore: gitignore pycache and wget log | Gitignore only |
8582753 |
2026-04-01 | chore: remove pycache from git tracking | Gitignore only |
38dd178 |
2026-04-05 | chore: ignore .worktrees/ directory | Gitignore only |
73e08f4 |
2026-04-05 | chore: ignore .superpowers/ brainstorm directory | Gitignore only |
b87378a |
2026-04-04 | chore(blog-migrator): remove test project artifacts | Test cleanup |
b79e150 |
2026-04-05 | docs: add design snapshot 2026-04-05 | Session artifact |
a9f0437 |
2026-04-05 | docs: session handover 2026-04-05 | Session artifact |
57470f5 |
2026-04-06 | docs: add design snapshot 2026-04-06 | Session artifact |
137283e |
2026-04-06 | docs: session handover 2026-04-06 | Session artifact |