spreadsheet_handling/
├─ cli/
│  ├─ json2sheet.py     # dünn: parse args → engine.orchestrate_pack(...)
│  ├─ sheet2json.py     # dünn: parse args → engine.orchestrate_unpack(...)
│  ├─ sheets_pack.py    # (delegiert nur noch an engine)
│  └─ sheets_unpack.py
├─ engine/
│  └─ orchestrator.py   # zentrale Anwendungslogik (keine I/O-Details)
├─ core/
│  ├─ fk.py             # FK-Erkennung/Helper
│  ├─ flatten.py        # (de)serialisieren Pfade
│  ├─ unflatten.py
│  ├─ validate.py       # (Phase 2b) Validation/Report
│  └─ lists.py          # (Phase 6) child-sheets, junctions, inline-delimited
├─ io_backends/
│  ├─ base.py           # Interfaces / Protocols (existiert schon)
│  ├─ excel_xlsxwriter.py
│  ├─ csv_backend.py
│  └─ ods_backend.py
├─ adapters/
│  └─ config_yaml.py    # YAML → dict (optional)
└─ logging_utils.py


Leitlinien:

engine.orchestrator nimmt fertige Frames oder eine abstrakte WorkbookPlan entgegen und orchestriert:

FK-Maps bauen → Helpers anwenden,

(später) Listen kompiliert/diskompiliert,

Validation (optional),

ruft I/O-Adapter zum Schreiben/Lesen.

CLI macht nur: Args → Config laden → engine aufrufen → Exitcode.

I/O Adapter kapseln Excel/CSV/ODS Details (flatten/lift steckt im Adapter, nicht im Engine-Kern).

core bleibt zuständig für inhaltliche Transformation (FK, Lists, Validate) – kein Dateiformat anrühren.anrühren
