Two changes that, together, complete the loop from comment dir to a
single MD corpus per item in Zotero.
The inline-body lookup in cli.comments was querying items.key for a
CMS comment ID — but item keys are bib hashes (e.g. M5IR9YAE), so
every lookup returned None and every previously-extracted combined.md
was written with an empty inline body. Replace it with a one-shot
URL → comment_id parse over the items table, materialized into a
cache (164k+ rows × LIKE matching can't use any index).
Wire combined.md back to bib so it flows to Zotero via `bib sync`.
walker.walk_and_extract now accepts an `on_combined(comment_id, path)`
callback invoked on the main thread for every dir that ends up with
a combined.md — written or pre-existing. Skipped dirs get the
callback too, so backfill-attaching previously-extracted MDs on a
re-run works without --force. CLI exposes --attach/--no-attach
(default on; auto-off under --no-bib). Idempotent: pre-loads the
set of items already carrying a combined.md attachment.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>