Skip to content

sdc-sdapp-pdf-reports — closing log

WeasyPrint chosen over ReportLab for sd-api’s PDF reports (HTML+CSS template, native SVG chart embed, same-stack fit). All 3 strategies (interest_only, term_loan, RRSP Catch-Up) × projection/historical × EN/FR, gated on domain facts (pdfplumber text-extraction vs. golden fixtures, plus visual PNG render-and-inspect — this is how a real non-deterministic WeasyPrint font bug was caught and fixed). Carved out into standalone packages/pdf-reports/ (round 1, prior session) so other SDC apps can reuse it without depending on all of sd-api. 110 sd-api + 5 pdf-reports tests, all green.

Round 1 (2026-09-01) verified and closed this as done — everything above had already shipped in prior sessions (commits 7fb3be1aadfa9a, ceac96b).

Rounds 2–7: process/workflow fixes, not PDF work

Section titled “Rounds 2–7: process/workflow fixes, not PDF work”

Talbot’s review of round 1’s close surfaced a chain of real gaps in the /task-continue//task-complete skills themselves — each fixed at the skill source (~/ai-config/claude/commands/task-continue.md), not just patched in this file:

  1. Project SSOT must never point at a task file — task files get deleted on close (/task-complete disposition B); round 1’s SSOT link died same-day when its target task closed.
  2. Windows paths in a KB task file need plain WSL+Windows paths, not a guessed link protocol (wslfile://, vscode://file/) — neither has a confirmed handler. First fix attempt swapped one guess for another; caught and corrected to the format that needs no handler at all.
  3. Bare Windows paths in markdown silently mangle — backslash-escape parsing eats characters after every \. Fixed: wrap every path in a backtick code span.
  4. Goal met:/Docs updated: fields added to the Path to Completion schema, required whenever a round proposes /task-complete — a round can name the right next command and still never state whether the task’s own Goal was satisfied or whether any new tool/artifact choice got documented anywhere durable.
  5. Two real doc gaps found and fixed: packages/pdf-reports/ had no README (WeasyPrint’s rationale lived only in a code docstring); apps/sd-app/ had no README either (its CLAUDE.md predated this monorepo’s STATUS.md-based sub-project convention, never actually scaffolded). Both added, matching the sites/mbr sub-project precedent.
  6. pnpm test:py was silently skipping pdf-reports’ whole test suite — found while fixing the README gap, not something anyone had flagged. Fixed (test:py:pdf added, wired into test:py).
  7. A “Related open tasks: None found” claim was wrong — asserted from memory instead of actually running the derivation. Root-caused and the actual related task (sdc-sdapp-deploy-miniapp) surfaced.
  8. An unanswered Next Steps checkbox got silently treated as resolved by a different, similarly-themed item in Talbot’s next reply — a real ask (research Obsidian/computer-use access + testing-cycle friction) went missing for a full round. Fixed in the skill: an unanswered checkbox must carry forward unless it gets its own indented reply or an unambiguous top-level sentence naming it.
  • Obsidian↔WSL link mechanismCore/Processes/Projects/KB-OS/Tasks/frictionless-docs-links.md (already existed, status: ready, found only via a late qmd search). Cross-linked with the plugin-evaluation evidence from round 4–5 (External File Embed and Link = OS-default-app only; Markdown Anywhere = needs a companion .exe + vault symlinks, not adopted).
  • Broader testing-cycle/agent-verification frictionCore/IT/Tasks/web-testing-system.md (already existed, paused). Round 4’s ask (Obsidian access, computer-use for local web/Electron apps) appended there as a “Related follow-up” section.
  • sdc-sdapp-deploy-miniapp (Rock #2) — the natural next SDC/IT work, blocked on Talbot’s own CF Pages + Stripe account creation.

Lessons promoted (AGENTS.md, commit 47a57fa)

Section titled “Lessons promoted (AGENTS.md, commit 47a57fa)”
  • Windows paths in markdown need backtick code spans — bare backslashes get silently eaten.
  • qmd search before evaluating/installing a new tool for a friction point, not only at a task’s mandatory close-time dup-check.

Terminal — nothing follows from this task specifically. Its own scope (PDF generation) shipped round 1; every later round’s output already has its own home (listed above).