- Bulk delete (both explicit-IDs and apply_to_all paths) now only unlinks
source .md files for generated articles (template_slug IS NOT NULL).
Manual cornerstone articles keep their .md source on disk.
- _sync_static_articles() now also renders markdown → HTML and writes to
BUILD_DIR/<lang>/<slug>.html after upserting the DB row, so cornerstones
are immediately servable after a sync without a separate rebuild step.
- scenario_pdf(): replace d = json.loads(scenario["calc_json"]) with
d = calc(state) so all current calc fields (moic, dscr, cashOnCash, …)
are present and the PDF route no longer 500s on stale stored JSON.
- Restored data/content/articles/ cornerstone .md files via git checkout.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>