v0.1.6: human-friendly reports

- Dashboard renders deck reports and scorecards as formatted pages
  (self-contained markdown renderer inlined in index.html — headings,
  styled tables, evidence blockquotes; no CDN, air-gap friendly)
- At-a-glance strip on every deck report: composite with delta vs the
  prior deck, quant/qual/penalty mix, KPI hit/miss chips, BDEF
  best/weakest category, red-flag count
- Generated DECK_REPORT.md now leads with a concise "At a glance"
  summary table (scorecard.py); jobs.py passes the previous deck record
  so the delta appears in the file too; dashboard hides the duplicate
  section since the strip covers it
- .gitignore: .venv/

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jonathan Kirkwood
2026-07-30 09:31:40 -05:00
co-authored by Claude Fable 5
parent 6bf0786993
commit 32d5d7f373
7 changed files with 196 additions and 13 deletions
+4 -1
View File
@@ -513,7 +513,10 @@ class JobRunner:
# --- reports ------------------------------------------------------------
self.phase = "collecting"; self._persist()
deck_md = scorecard.render_deck_report(record, ext_obj, adjudication_md)
all_recs = led.deck_records(slug_c) # period-sorted, incl. the new record
idx = next((i for i, r in enumerate(all_recs) if r.get("deck_id") == deck_id), -1)
prev_rec = all_recs[idx - 1] if idx > 0 else None
deck_md = scorecard.render_deck_report(record, ext_obj, adjudication_md, prev_rec)
if rec_path and str(rec_path).endswith(".json"):
ledger_md = os.path.splitext(str(rec_path))[0] + ".md"
else: