Master tracking for Phase 7d implementation. Spec under review in the PR for branch `docs/phase-7d-foundation-spec`.
Scope (per spec)
Backend
- POST /api/preview + POST /api/print with γ-hybrid PrintItem schema (name/subtitle/qr_url/image_url/copies/extras)
- Tape-match logic with force-override + audit flag
- Multi-item × copies → N Job rows
- Alembic migration: Job table gains `api_key_id`, `source_ip`, `tape_match_override`, `plugin`, `plugin_item_id`
Plugin protocol
- IntegrationPlugin.search(query, limit) → list[PluginItemSummary]
- IntegrationPlugin.get_item(item_id) → PluginItem
- Optional HasChildren.get_children(item_id) → list[PluginItemSummary]
Plugins
- Grocy, SnipeIt, Spoolman: gain search() + get_item()
- Hangar: new plugin module `backend/app/integrations/hangar/` with all 3 methods + httpx client
Frontend
- New HTMX route `/qr-print` with platform-toggle, search-debounce, results-list, select-form
- Per-item copies input
- Children-toggle for hierarchical items
- Live preview with red/green tape-match border + tape badge top-right
- Print-button → toast with job IDs
Dependencies
Out-of-scope (Phase 7e+)
- Aggregations templates (one big label for whole shelf)
- Per-plugin search filters
- Saved searches/favourites
- Plugin config via UI
- Multi-printer fan-out
- Image rendering on labels (renderer falls back to QR-only for now)
Acceptance criteria
See spec Section 13 "Definition of Done for Phase 7d".
Refs #22
Master tracking for Phase 7d implementation. Spec under review in the PR for branch `docs/phase-7d-foundation-spec`.
Scope (per spec)
Backend
Plugin protocol
Plugins
Frontend
Dependencies
Out-of-scope (Phase 7e+)
Acceptance criteria
See spec Section 13 "Definition of Done for Phase 7d".
Refs #22