commit 865eecc045b3ef519b6689a7eeb2dc7e41abbab3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 19 08:07:47 2026 +0200

    fix(rendering): make IR-006 render input handling mutation-safe
    
    FTR-IR-006-RENDER-INPUT-MUTATION-FIX
    
    Affected files:
    - rendering/frame_selection.py: _resolve_formula_sheet_names now copies
      the DataFrame (copy-on-write, once per frame) before assigning rewritten
      formula cells, leaving the caller-owned DataFrame unchanged.
    - rendering/composer/layout_composer.py: removed spec["resolved"] write-back
      in _add_legend_blocks; resolved placement is already fully captured in the
      generated TableBlock and does not belong in caller-owned meta.
    
    Tests added:
    - test_workbook_view_rename_does_not_mutate_source_dataframe: proves the
      original frames[frame] DataFrame is untouched after a workbook-view rename
      with LookupFormulaSpec cells.
    - test_compose_workbook_does_not_mutate_legend_blocks_meta: proves meta is
      structurally equal to a pre-call deepcopy after compose_workbook with
      legend_blocks configured.
    
    Existing test updated:
    - test_compose_adds_legend_table_block_next_to_data_table: removed assertion
      on meta["legend_blocks"]["status_codes"]["resolved"] (that mutation is now
      eliminated; legend geometry is verified through the TableBlock instead).
    
    Tests run: unit (665 passed), architecture/semantic_invariants,
      integration/io_backends/test_ods_xlsx_parity.py, integration/pipeline (all green).
    
    No render-flow, adapter, or metadata redesign was introduced.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 27744544902e46c9b1f85f3cf749f57d85e562b7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 21:23:20 2026 +0200

    doc(backlog): IR-006 render-input mutation fix

commit 26221e0195139707a02c68d1ecd33edddf67ecab
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 21:10:06 2026 +0200

    doc(concepts): strategic product concepts

commit 58fe285ba072403b5d2be545c1c3137070bc1b30
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 20:14:44 2026 +0200

    review(architecture): REVIEW-002 final summary consolidated

commit 246e7ee12651949fdec76282b28dabda49daa902
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 19:25:03 2026 +0200

    docs(FTR-FINDING-MODEL-CONSOLIDATION-P5): archive accepted finding-model consolidation
    
    Independent review of commit a285578 verdict: ACCEPT — behavior-preserving
    consolidation, ReferenceFinding/findings.py::Finding correctly kept distinct,
    no diagnostics framework, import-paths and empty-frame schemas preserved, and a
    safe prerequisite baseline for a later reference_validations.py package split.
    
    Cleanup/archive disposition (per the per-FTR workflow):
    - Resolve review finding R-1: drop the unused `import pandas as pd` from
      tests/unit/domain/test_finding_frame.py (ruff F401); file now ruff-clean.
    - Move the FTR doc and its independent review note to
      docs/cold_storage/backlog/historic_tickets/ftrs/ and update the cold-storage
      _ftrs_done.adoc index (new Phase 5 — REVIEW-002 follow-ups section).
    - Leave a compact archaeology comment in
      docs/general_info/backlog/_ftrs_open.adoc (Phase 5) naming the FTR ID and
      disposition.
    - Update the FTR status line and the review note to record the ACCEPT verdict
      and R-1 resolution.
    
    Why: the per-FTR workflow requires accepted FTRs to be archived with a
    recoverable roadmap trail. The phase narrative is intentionally not touched —
    it is written at phase granularity and Phase 5 is still open.
    
    make test: 826 passed.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit a28557809fe43cb4baf87077d53b17b5302996f9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 17:32:41 2026 +0200

    refactor(FTR-FINDING-MODEL-CONSOLIDATION-P5): consolidate finding records
    
    Behavior-preserving consolidation of the duplicated finding-frame machinery
    (REVIEW-002 D-005 / Pass 2 quadruplication). New domain-level
    domain/finding_frame.py owns the canonical 7-col FINDING_COLUMNS, a shared
    frozen Finding + to_record, row_index_label, a generic schema-stable
    findings_to_frame serializer, and simple_failure_message.
    
    resource_overrides and derived_column_policy drop their identical local
    FINDING_COLUMNS/dataclass/findings_to_frame/row_index_label/_failure_message
    and delegate to the shared model (public names kept as aliases/re-exports).
    reference_validations keeps its genuinely different ReferenceFinding,
    9-col schema, and capped/named failure message, but routes findings_to_frame
    through the one shared serializer.
    
    findings.py::Finding (category/severity-policy model, no tabular
    serialization) is intentionally left untouched: collapsing it would change
    severity behavior, an explicit non-goal. graph_validations and the package
    surfaces resolve unchanged. No diagnostics framework, no validation-semantics,
    category, severity, empty-frame, pipeline, or YAML changes.
    
    Why: removes the accidental finding-model duplication that REVIEW-002 named
    as the prerequisite blocking a later reference_validations.py package split.
    
    Tests: new tests/unit/domain/test_finding_frame.py; full active dev slice
    make test -> 826 passed. Independent review and archive disposition deferred
    per the per-FTR workflow (self-documentation review note added).
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 0d4f802e94c63a120665d00a84fa5635e8329c76
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 14:53:06 2026 +0200

    docs(backlog): FTR-FINDING-MODEL-CONSOLIDATION-P5 as suggested by review-002

commit 6ec0c4df2011b9b62f3ac9d8a8046d79fa80980c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 14:51:50 2026 +0200

    review(architecture): add REVIEW-002 pass 3

commit 86b6785c3d57aa7d4e28ea47a91380eb784d3d50
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 13:55:59 2026 +0200

    doc(review_002): prompts for passes 1,2,3

commit c13373c90748fb66a69526ac56add1f6a1352bcd
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 11:19:02 2026 +0200

    review(architecture): add REVIEW-002 pass 1 follow-up assessment

commit 626323bca71a5c5f7dd795cd27dac12df4fd04f3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 10:01:15 2026 +0200

    doc(review_002): prepare review plan and initial prompt

commit 8a460a13d1607f3c5060a6376ae149f8d15b0eb3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 09:53:05 2026 +0200

    doc(review_001): move last review reports into distinct folder

commit f7fe0a5a34950b3a457c0394092126e537a26b95
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 09:50:57 2026 +0200

    test(FTR-DOMAIN-TRANSFORMATION-PACKAGE-BOUNDARY-GUARDS-P5): review and short fix

commit dcc43f136c71dd089637be0e4876af7500fe9baa
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 09:20:19 2026 +0200

    test(FTR-DOMAIN-TRANSFORMATION-PACKAGE-BOUNDARY-GUARDS-P5): add transformation package boundary guards

commit 749ec29e25378ccd7d2db9fdddb5a8252e425d55
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 09:09:52 2026 +0200

    docs(architecture): translate German to English and slightly adjust section on guardrails

commit 4741c7c9cf68629e646aba99437d9e92247ec75e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 09:08:30 2026 +0200

    refactor(FTR-DOMAIN-TRANSFORMATION-MODULE-SPLIT-DISCRIMINATOR-P5): refactor accepted in review

commit ec5637a9f973b8ff376c523ff55fe41c2932a320
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 07:45:45 2026 +0200

    refactor(FTR-DOMAIN-TRANSFORMATION-MODULE-SPLIT-DISCRIMINATOR-P5): split discriminator transformations
    
    Mechanical, behavior-preserving split of the single discriminator_split.py
    module into a package (__init__/split/merge/naming/values/framecheck/metadata)
    with clearer internal responsibilities.
    
    Why: the module mixed both directions of a bijective split/merge transform
    across ~10 responsibilities; the package shape isolates the dangerous areas
    (split/merge symmetry, ordering restoration, canonical persisted metadata)
    without changing any runtime contract.
    
    All 32 function bodies and 4 module constants are byte-identical pre/post move
    (verified by ast.dump equivalence). No change to pipeline step IDs, YAML
    surface, _META_KEY, metadata payload shape, row/column order, discriminator
    normalization, or merge/error semantics. registry.py, steps.py,
    meta_registry.yaml and pipeline_step_registry.json are unchanged: the
    colon-target and dotted producer/consumer paths resolve through the package
    __init__ re-export. No conflict/precedence module introduced; values.py is the
    single narrow local core.
    
    Adds a package re-export + colon-target registry-resolution guard test.
    Corrects the one live concept-doc pointer (partition_by_domain.adoc) to the
    stable package-level dotted path, mirroring the accepted FK-helpers follow-up.
    
    FTR left Open (self-documentation pending independent review); not Done, not
    archived. Recorded deviation: a verbatim move forces an acyclic
    naming -> framecheck edge beyond the FTR DAG (_value_map_entries validates
    uniqueness via the structural _ensure_unique_target_frames check).
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 7be86861549d05c5f87e5f3109d7db9710d4ae68
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 07:26:52 2026 +0200

    docs(analysis): assess discriminator split package refactor

commit 2a95a5c06c2e47f32a632b7a09ec87d1d94263d7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 01:59:05 2026 +0200

    docs(FTR-DOMAIN-TRANSFORMATION-MODULE-SPLIT-FK-HELPERS-P5): fix stale FK helper concept pointer

commit 9592718ff4d3c56a4d98939d0a2f7a86f68fa3c1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 01:47:15 2026 +0200

    refactor(FTR-DOMAIN-TRANSFORMATION-MODULE-SPLIT-FK-HELPERS-P5): split FK helper transformations
    
    Behavior-preserving split of the single fk_helpers.py module into a package
    (enrich/drop/policy/provenance/formula_provider) with stable names re-exported
    from __init__. Function bodies moved verbatim (AST-identical); pipeline
    registry, YAML config, _meta.derived lifecycle, and helper cleanup unchanged.
    Documented producer/consumer symbol paths still resolve as package attributes,
    so meta_registry.yaml / pipeline_step_registry.json need no change.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 84eedf96cdd20c13471a80bc3e429f25d5b1709b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 18 01:34:28 2026 +0200

    docs(backlog): FTR-DOMAIN-TRANSFORMATION-MODULE-SPLIT-FK-HELPERS-P5
    
                   as a first step to modularize the domain/transformations package

commit 05463ed2aaf30f2963c36e929d131136489ee788
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 21:44:29 2026 +0200

    docs(FTR-DEMO-REPO-INTEGRATION-P4A): correct smoke count wording

commit 5b66fdf74887c016adc664b075fd1a10166c8ee3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 21:00:47 2026 +0200

    docs(FTR-DEMO-REPO-INTEGRATION-P4A): record partial delivery and review note
    
    Record the realignment+verification slice as a precise Delivery status (FTR
    stays Open) and add the sibling review note. Implemented in the demo repo
    (commits 9174437, 29ad0c1, 3d37f83): canonical FK step-name realignment with
    no core aliases, verified runnable journey against the local 0.1.0b6.dev
    checkout (demo smoke 9/9), sharpened public entrypoint, and an optional
    bounded Storyforge first slice. Deferred and explicitly not implied as done:
    full ACME beta-slice tutorial buildout, DEMO-* backlog, release/tag plan, and
    Pages publishing. No core src/tests changed; _ftrs_open.adoc unchanged.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 08f326341036873b210a3f95d92cad7583cbc7bc
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 20:38:47 2026 +0200

    docs(FTR-DEMO-REPO-INTEGRATION-P4A): align demo scope with beta tutorial strategy
    
    Sharpen the FTR before implementation: ACME progressive tutorial is the
    primary beta demo journey (beta slice only, per the ACME concept's "Next Beta
    Demo Slice vs Future Patterns"); Worldbuilding/Storyforge is an optional,
    bounded secondary trail limited to its characters/species first slice. Add an
    interface-stability stance (demo realigns to the current canonical surface;
    pre-0.1.0b6 step/config names may change; no core compatibility aliases),
    record the known apply_fks/reorder_helpers -> add_fk_helpers/
    configure_fk_helpers/reorder_fk_helpers drift as expected pre-stable
    realignment (not a regression), restate repository/documentation boundaries
    per repository_boundaries.adoc, fence off the ACME A-F future/deferred
    patterns, and tighten Scope/Non-goals/Acceptance accordingly.
    
    Planning/documentation only: no demo, pages, HTML, publishing automation,
    core aliases, source, or test changes; deferred patterns stay future-only.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 45711753b43f7cc67c11851115ecaa59c53f4e0b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 20:25:12 2026 +0200

    docs(concepts): clarify worldbuilding demo trail scope
    
    Add a smaller ACME-style "Demo Trail Scope" section to the worldbuilding
    continuity concept: classify first demo slice / later supported-capability
    slices / future-deferred. Define the first slice (Tutorial 01 -- Characters
    and Species: FK/helper enrichment, helper styling, reference validation,
    readable projection; no matrix, no reimport yet). List later slices grounded
    only in existing mechanics (contract_xref/expand_xref, declarative views,
    apply_workbook_view_sheet_mappings remap, opaque cells, legend validation),
    and the explicit future/deferred boundaries (prose-in-cells, event lists,
    nested dossiers, conditional detail tables, timeline/Gantt, quality checking,
    IP-derived worlds, heuristic narrative analysis).
    
    Modernize stale references: strengthen the reverse path with the registered
    deterministic apply_workbook_view_sheet_mappings step (no label inference),
    mark add_constant_columns as a conceptual sketch (not a registered step), and
    clarify the referenced FTRs are real closed/archived tickets. Restate the
    demo/pages repository-placement boundaries per repository_boundaries.adoc and
    preserve the generic-vs-domain-specific architecture principle.
    
    Documentation/planning only: no demo files, fixtures/configs, HTML, pages
    repo, runtime features, or new FTR; concept not rewritten from scratch.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit bb8064cbb23be65b19e6c58b48d8acb0330360b6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 18:53:33 2026 +0200

    docs(concepts): clarify ACME beta slice and future patterns
    
    Add an authoritative "Next Beta Demo Slice vs Future Patterns" section that
    classifies ACME tutorial ideas into included / narrative-future-preview /
    explicitly deferred, defines a coherent beta tutorial arc grounded only in
    implemented capabilities (modern step names, flat axes, closed reimport
    slice), and documents the A-F future boundaries with their owning FTRs
    (FTR-CONDITIONAL-FOLLOW-UP-PROJECTION-FLOWS-P5,
    FTR-WORKBOOK-VIEW-PAYLOAD-CONFLICT-PRECEDENCE-P6,
    FTR-XREF-GROUPED-COLUMNS-P4A2 / FTR-XREF-AXIS-MAPPINGS-P4A2).
    
    Tag each exploratory tutorial with a beta disposition, modernize the stale
    apply_fks/reorder_helpers references presented as current capability, refresh
    the stale follow-up FTR list to real backlog IDs, and restate the
    demo/pages repository-placement boundaries per repository_boundaries.adoc.
    Documentation/planning only: no capability, demo, pages, HTML, or release
    automation changes; deferred patterns are not presented as supported.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 58c4466c12f772bcb5cf3f6759eccde8d235e5bb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 18:42:37 2026 +0200

    doc(backlog): FTR-CONDITIONAL-FOLLOW-UP-PROJECTION-FLOWS-P5 created

commit edf3e40490dc792f9acee1c9e062f57415d8cd6f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 18:18:58 2026 +0200

    docs(ai_info): document repository responsibilities for demo and pages publishing
    
    Add docs/ai_info/repository_boundaries.adoc defining the separate
    responsibilities of spreadsheet-handling (core), spreadsheet-handling-demo,
    and the future/planned spreadsheet-handling-pages: what each repo owns, what
    must NOT live in each, artifact-placement rules, and the rationale for keeping
    ACME tutorial source next to demo configs/data while keeping generated HTML
    and versioned publishing out of the demo repo.
    
    Register it in the _ai_info.adoc navigation index with a precise load
    trigger, and cross-reference it from the project_context related-repos line so
    agents doing demo/tutorial/revealjs/release-publishing work reliably discover
    it. Documentation only; no pages repo, publishing automation, or CI created.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit fb06ed2d2a89df3339cd832a4572b69e84cf34df
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 16:21:28 2026 +0200

    docs(FTR-PROTOTYPE-CONSUMER-INTEGRATION-P4A): record real consumer run vs local core
    
    The developer designated spreadsheet-handling-demo (on dev, main merged) as the
    consumer integration surface, superseding the earlier "no consumer repo"
    environment-blocker assumption. Bound the demo to the local core checkout via
    its own non-invasive `make setup-lib-local` (editable install of
    ../spreadsheet-handling; only the gitignored .venv changed).
    
    Result: PARTIAL PASS. Binding clean; 6/8 maintained demo smoke flows pass
    against local 0.1.0b6.dev; the in-core proxy stays green (15 passed). The
    product-business-slice flow (make run + 2 dependent smoke tests) fails from one
    root cause: the demo's checked-in pipeline YAML uses pre-0.1.0b6 step IDs
    apply_fks/reorder_helpers, renamed in the core registry to
    add_fk_helpers/configure_fk_helpers/reorder_fk_helpers (capability verified
    present). Classified as consumer-config drift, not a missing core capability;
    fix is owned by the already-open FTR-DEMO-REPO-INTEGRATION-P4A.
    
    No core src/tests changed; no tracked demo changes; no consumer data copied
    into core; _ftrs_open.adoc unchanged (no lifecycle transition, no new FTR).
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 1431e7ff0eb76d1cdb50307e7145e7eb4dba2f1a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:58:53 2026 +0200

    docs(FTR-PROTOTYPE-CONSUMER-INTEGRATION-P4A): record prototype consumer integration pass
    
    Pre-beta integration audit. The maintained beta-readiness flow (configured
    workbook view reimport roundtrip, derived from the prototype consumer
    discussion) runs end to end against the local checkout across XLSX and ODS;
    the three FTR-named validation targets pass (15 passed).
    
    No external prototype consumer repository is provisioned in this environment,
    so the controlled external-repo integration step is documented as an
    environment/access blocker rather than a library capability gap. No generic
    spreadsheet-handling gap surfaced; no follow-up FTR created. Lifecycle status
    stays Open (self-documentation pending independent review); _ftrs_open.adoc
    unchanged. No core src/tests changed; no consumer data copied into core.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 2023fd2956cc8b25fcad532248c3aacfbbd1605a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:49:09 2026 +0200

    docs(FTR-ODS-CONSUMER-FEATURE-PARITY-P4A): record independent review

commit c2e5a7bb17efb09c1acdf00ecccc9ccf8b2338a5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:34:45 2026 +0200

    docs(FTR-ODS-CONSUMER-FEATURE-PARITY-P4A): document pre-beta ODS parity
    
    Audit-only pass for the cross-cutting ODS parity tracking FTR. No production
    code and no new tests: existing coverage already proves every implemented
    disposition, and the not-applicable items are backend-neutral by construction
    (forcing parity tests there would be fake parity).
    
    - Add the compact pre-beta ODS parity matrix and a delivery-status note to
      FTR-ODS-CONSUMER-FEATURE-PARITY-P4A; set status to "Implemented (audit
      complete) — independent review pending" (left Open, not archived).
    - Add the previously-missing explicit ODS disposition note to the three FTRs
      that lacked one in their own text: key-value resource writer and generated
      artifact manifest (not applicable — text/JSON writers), resource
      fallback/override semantics (not applicable — backend-neutral domain step).
    - Cross-reference the parity matrix from the existing
      spreadsheet_backend_capability_profiles.adoc and consolidate the accepted
      gaps (protection, column-width, freeze readback) without duplication/drift.
    - Add sibling review note, explicitly marked self-documentation pending
      independent review.
    
    Accepted gaps remain documented, not simulated. Post-wave invariants verified
    intact (centralized router dispatch, lazy-optional-import guard green, no
    parallel XLSX-only dispatch). Full project test suite passes with no
    regressions.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 0f4bcbe81e682e32874e5b1e8d67da1d7b5e01a2
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:27:50 2026 +0200

    docs(FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A): close FTR

commit af8fd37011ee08f482ee33591bb5f4fbd68d467c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:17:59 2026 +0200

    test(FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A): add configured reimport roundtrip slice
    
    Slice B: prove a configured pipeline takes an edited workbook view written
    under a renamed visible sheet back to canonical relation frames using only
    existing machinery -- forward contract_xref + configure_workbook_view, the
    Slice-A apply_workbook_view_sheet_mappings remap step, and existing expand_xref
    recomposition. No new matrix logic, no conflict detection, no precedence
    handling, no heuristics, no production code change.
    
    - Add tests/integration/pipeline/test_configured_workbook_view_reimport_roundtrip.py
      near the localized/resource matrix roundtrip tests: renamed visible sheet ->
      logical frame -> canonical relation, edited matrix values reflected, and an
      unchanged-values identity roundtrip, exercised for both XLSX and ODS.
    - Update FTR delivery status: Slice A done, Slice B done, conflict/precedence
      delegated to FTR-WORKBOOK-VIEW-PAYLOAD-CONFLICT-PRECEDENCE-P6; FTR stays Open
      (legend-validated compact path and conflict/precedence remain).
    - Update the sibling review note with a clearly labelled Slice B section
      (implemented; self-documented, independent review pending).
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 860ccc1bd43cbc60bb1fcf36b7389da5c3116249
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:16:08 2026 +0200

    docs(backlog): defer workbook view conflict precedence handling
    
    Split the conflict/precedence concern out of
    FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A into a new future FTR
    (FTR-WORKBOOK-VIEW-PAYLOAD-CONFLICT-PRECEDENCE-P6), placed in Phase 6 next to
    the merge-conflict-deferred FTR-JSON-SHARDING-BY-PARTITION so it does not block
    the upcoming beta.
    
    The new FTR captures detection of overlapping editable view payloads, explicit
    configuration-driven precedence, and clear findings/fail behavior. It states
    explicitly that execution steps must not guess winners: no heuristic conflict
    resolution, no hidden merge logic, no generic reimport framework, no broad sync
    engine; any future heuristic assistance may only propose deterministic
    configuration, never silently affect execution.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 9f32de764d21e025ccc24b68b335de62121d025c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 15:08:40 2026 +0200

    docs(FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A): close slice-a review follow-up

commit 8687285f8211755a1cfbf5112d636e05bc5636de
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 14:21:50 2026 +0200

    feat(FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A): add workbook view sheet remap step
    
    Slice A only: make the persisted reverse sheet->frame mapping usable in a
    configured reimport pipeline.
    
    - Add apply_workbook_view_sheet_mappings in domain/workbook_views.py: delegates
      identity resolution to resolve_workbook_view_sheet_mappings, returns a new
      frames dict keyed by logical frame names with only mapped visible sheets plus
      reserved _meta, preserves _meta unchanged, fails loudly via the resolver, and
      uses no sheet-name/order/label/column heuristics.
    - Register it as a YAML-callable pipeline step and mirror the entry in
      pipeline_step_registry.json.
    - Add focused unit tests (renamed sheet, order independence, _meta preserved,
      loud failure on undeclared sheet, config-addressable smoke test).
    - Add a narrow implementation-status delivery note to the FTR (not a final
      review). Recomposition, conflict detection, and precedence/merge remain out
      of scope for this slice.
    
    No production behavior beyond the new remap step changed.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit e7527b0ee49f60b6d236babe96e4a5eea22c898e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 12:21:28 2026 +0200

    test(FTR-WORKBOOK-REIMPORT-VIEW-MAPPING-P4A): close review gap
    
    Close the small review/documentation gaps from the commit 4654049 review.
    
    - Add focused unit test for an omitted intermediate frame
      (role intermediate / render omit_by_default): asserts it is absent from
      _meta.workbook_view.sheet_mappings and that
      resolve_workbook_view_sheet_mappings still succeeds when it is present in
      logical_frames. No production code change required; existing behavior is
      already correct.
    - Add sibling review note FTR-WORKBOOK-REIMPORT-VIEW-MAPPING-P4A_review.adoc
      recording verdict, assessment, findings, and disposition (Findings #2 and #3
      accepted with no code change; commit safe as prerequisite for
      FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A).
    - Clarify ai_info workflow guidance: every FTR review is captured in a sibling
      FTR-<ID>_review.adoc, updated before committing review follow-up.
    
    No production behavior changed.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 4654049dce86851688119bc1302e144681e2d467
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 11:55:50 2026 +0200

    feat(FTR-WORKBOOK-REIMPORT-VIEW-MAPPING-P4A): persist reverse workbook view mapping

commit ae3939c4dbe520386e33a926269b2ac78961c284
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 17 09:41:43 2026 +0200

    chore(tooling): add snapshot-multi target for per-section LLM snapshots
    
    Single monolithic snapshot had grown too large for browser LLM use.
    Adds make snapshot-multi which writes focused files to build/snapshots/
    (one per docs/, src/, tests/ subdirectory plus tree, infra, loc).
    Extends concat_files_core.sh with --include-ext whitelist flag;
    existing snapshot target and interface are unchanged.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit bb42493ada2ec09ef70f10424295a438ee19750f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 23:32:07 2026 +0200

    docs(backlog): add FTR-DERIVED-PROVENANCE-LIFECYCLE-P4A
    
    Formalize the _meta.derived provenance lifecycle concerns discovered during
    FTR-WORKBOOK-REIMPORT-DERIVED-COLUMN-POLICY-P4A and its review/fix cycle, and
    the earlier transient-vs-persisted helper-provenance discussions.
    
    Grounded in current code: documents producers (_write_helper_provenance,
    enrich_lookup._write_provenance), consumers (rendering pass, drop_helpers,
    apply_derived_column_policy), the three uncoordinated prune sites, the
    XLSX-vs-JSON-sidecar persistence asymmetry, nested _meta mutation-hygiene
    risks, and orphan/stale classes (column/sheet rename, absent columns, missing
    lookup frame, partial metadata loss).
    
    Defines lifecycle/ownership/cleanup semantics to formalize, the presence-
    checked prune rule, and an explicit deterministic-vs-heuristic boundary
    (naming the drop_helpers prefix fallback as the bounded anti-pattern). The
    FTR stays narrow and operational: docs-only, no governance framework, no
    reimport redesign, no silent heuristic reconciliation; a future explicit
    opt-in reconcile_derived_provenance step is captured as concept only.
    
    Cross-references the related reimport FTRs/review and the metadata
    canonical-vs-derived concept docs.

commit 41fed428a7023ae80b2501a4e65f0e9a7a3bd954
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 22:40:48 2026 +0200

    fix(FTR-WORKBOOK-REIMPORT-DERIVED-COLUMN-POLICY-P4A): close review blockers
    
    Close the three blockers from the 58daab5 review of c802080. Architecture
    unchanged: frame-level, in-memory, pre-drop_helpers; no workbook reimport
    mapping, no reimport framework, no frame_lifecycle/workbook_view fusion, no
    FK-helper value-check, no canonical lookup/source patching.
    
    Blocking 1 — stale provenance after drop:
    - apply_derived_column_policy now strips consumed helper_columns and
      enrich_lookup provenance for the source frame it replaces and prunes empty
      derived.sheets/derived containers; copies only the mutated metadata path so
      caller input is untouched. Distinct output preserves original source
      provenance.
    - drop_helpers' _clean_helper_provenance also prunes a stale enrich_lookup
      subkey, but only when none of its helper columns remain in the cleaned
      frame (still-present lookup helpers are never orphaned).
    
    Blocking 2 — meta_registry.yaml now lists
    apply_derived_column_policy as a derived consumer; persistence note extended
    consistently with the transient/derived-operational lifecycle.
    
    Blocking 3 — malformed _meta.derived / sheets / sheet-level / helper_columns
    / enrich_lookup now raise clear ValueErrors naming the bad path instead of
    raw AttributeError. Missing and stale-but-absent provenance stay safe no-ops.
    
    Tests: +9 (provenance cleanup on replacement, chained remove_fk_helpers,
    distinct-output preservation, drop_helpers enrich prune/keep, malformed
    shapes, stale-absent-column safety). Review doc resolution noted.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 58daab54f6be2a22feb0fccfb253051555ee7128
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 22:24:19 2026 +0200

    docs(review): review FTR-WORKBOOK-REIMPORT-DERIVED-COLUMN-POLICY-P4A

commit c8020807fde8b2c30e927ab45c45bf215702b60a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 22:13:57 2026 +0200

    feat(FTR-WORKBOOK-REIMPORT-DERIVED-COLUMN-POLICY-P4A): implement slice 1 derived-column policy
    
    Add apply_derived_column_policy: an in-pipeline, pre-drop_helpers step that
    drops helper/derived columns from a payload frame using only registered
    _meta.derived provenance (no column-name heuristics) and value-checks
    enrich_lookup helpers against their source frame.
    
    Slice 1 scope (locked decisions):
    - Step both checks and drops; runs before drop_helpers
    - Modes: drop | warn_on_mismatch | fail_on_mismatch
    - Identity strictly from _meta.derived.sheets[source]
      (helper_columns[*].column, enrich_lookup.helper_columns[*])
    - Value-check covers enrich_lookup helpers only (self-contained via 'on');
      FK helpers are dropped but not value-checked (provenance lacks target key)
    - No frame_lifecycle/workbook_view fusion; no file-level reimport
    - Findings reuse the resource_overrides FINDING_COLUMNS shape
    
    FTR wording clarified: slice-1 boundary documented as the current-code
    transient _meta.derived behaviour (not a final architectural claim);
    durable derived-provenance persistence/lifecycle and orphaned/stale
    provenance after edits/renames noted as a deferred follow-up FTR.
    
    Registry: step registered; pipeline_step_registry.json entry added with
    structured transient 'derived' meta_contract refs (architecture guard green).
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 6761296ccf052cadba2a7089f11753fc9f0d7dc4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 22:02:22 2026 +0200

    docs(tutorial-guide): think about future demo integration

commit a0e414b55fed27ad01344b97b6194e9c77388bde
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 20:26:18 2026 +0200

    fix(manifest): require portable reported artifact paths
    
    FTR-GENERATED-ARTIFACT-MANIFEST-P4A

commit 3896bf2d67e7c05baddcb97c3ac4eba4d0694ad5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 20:07:24 2026 +0200

    docs(FTR-GENERATED-ARTIFACT-MANIFEST-P4A): mark review blockers resolved
    
    Update review document to note that both blocking issues from commit 6f1f555
    have been fixed in commit 80c0499: path safety validation for reported
    artifact paths and registry inverse kind correction.
    
    Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

commit 80c04996d717faeb8fba30fe2563aa100cafb31c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 20:07:13 2026 +0200

    fix(FTR-GENERATED-ARTIFACT-MANIFEST-P4A): close review blockers
    
    Address two blocking issues from 6f1f555 review:
    
    1. Path safety: validate all reported artifact paths using _safe_target_path
       before checksum computation and manifest inclusion. Normalize paths to
       relative form. This ensures paths cannot escape output_dir and prevents
       equivalent-spelling duplicates (e.g., a/../x.txt vs x.txt) from bypassing
       duplicate detection.
    
       - Add _validate_and_normalize_paths helper
       - Call it after reading all report frames if output_dir is set
       - Duplicate detection runs on normalized paths
       - Checksum resolution reads only validated paths
    
    2. Registry contract: change inverse.kind from unsupported 'aggregation' to
       'projection_only', matching write_key_value_resources pattern. Registry
       architecture guard now passes.
    
    Add three new tests:
    - reported artifact path traversal rejection with checksum enabled
    - reported artifact path traversal rejection without checksum
    - duplicate detection catches normalized equivalent paths
    
    Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

commit 7bab6c65a9bbd89feb7b3af191370723faa1ecb9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 16:56:46 2026 +0200

    docs(review): review FTR-GENERATED-ARTIFACT-MANIFEST-P4A

commit 6f1f5551b428e546fe3030c9c42129f466fb8bab
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat May 16 16:40:07 2026 +0200

    feat(FTR-GENERATED-ARTIFACT-MANIFEST-P4A): implement artifact manifest aggregation step
    
    Add write_artifact_manifest pipeline step: merges writer report frames
    (write_structured_yaml, write_key_value_resources style) into a
    deterministic shared-shape manifest with columns path, artifact_kind,
    writer_step, source_frames (as list), row_count, checksum, status.
    
    Behavioral contracts:
    - Sorted by (path, writer_step) — independent of input frame row order
    - source_frames normalized from provisional frame column to [frame]
    - Optional sha256 checksum over raw file bytes (OS-agnostic)
    - Optional manifest_path (relative to output_dir, path-safety validated)
      written as YAML or JSON with UTF-8/LF
    - Duplicate artifact paths rejected with clear ValueError
    - Existing writer report shapes unchanged; convergence is additive
    
    Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

commit 01fe1e0da1631f33ba9b2073325cb494058b124d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 15 09:42:08 2026 +0200

    docs(ai): clarify OS boundaries and artifact portability
    
    Add OS environment and file portability section to conventions.adoc.
    Three levels: Linux-first automation environment, input compatibility
    (CRLF/XLSX/ODS/Git-normalized), and OS-agnostic generated artifacts
    (explicit encoding/newlines, relative paths, deterministic ordering,
    byte counts derived from declared policy).
    
    Motivated by the FTR-KEY-VALUE-RESOURCE-WRITER-P4A review catching
    platform-dependent newline and ordering behavior.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit e370e6315774aad5ecb5766c161d3dc4903a9095
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 21:07:54 2026 +0200

    fix(FTR-KEY-VALUE-RESOURCE-WRITER-P4A): fix partition ordering and newline determinism
    
    Fix two blockers from d30c858 review:
    
    * Partition ordering: groupby(sort=True) now sorts by partition column
      values so file/report order is canonical regardless of input row order.
    * Newline policy: write with explicit newline="\n" so line endings are
      always Unix LF, not host-platform dependent.
    
    Add three regression tests: reordered input produces identical file
    contents, report-frame path order is stable, output bytes contain only
    LF line endings.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 6b8d8c0dbb4f096b87f75c91eabffb9c82af0301
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 21:04:35 2026 +0200

    docs(review): record FTR-KEY-VALUE-RESOURCE-WRITER-P4A review

commit 2210ce3f7110fdb04e8efc1d067b566d6fe79186
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 20:58:11 2026 +0200

    docs(review): review FTR-KEY-VALUE-RESOURCE-WRITER-P4A

commit d30c858f6e7c1c3737a84f79b08bb48b946c0c6a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 20:45:37 2026 +0200

    feat(FTR-KEY-VALUE-RESOURCE-WRITER-P4A): implement key-value resource file writer
    
    Add write_key_value_resources pipeline step: writes deterministic
    .properties-style files from a configured source frame, partitioned by
    {column_name} template placeholders in file_pattern.
    
    Supports unicode (\\uXXXX) and utf-8 escaping modes, sort_by ordering,
    path-traversal rejection, duplicate-key detection, and a provisional
    report frame (path/frame/rows/bytes — aligned with write_structured_yaml;
    manifest column shape deferred to FTR-GENERATED-ARTIFACT-MANIFEST-P4A).
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 1266fc44cc0227f2b6d280e149008a44fd6e87ab
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 16:49:23 2026 +0200

    test(resources): cover FTR-RESOURCE-FALLBACK-OVERRIDE-SEMANTICS-P4A review gaps
    
    Add five secondary-path tests identified as non-blocking gaps in the
    FTR-RESOURCE-FALLBACK-OVERRIDE-SEMANTICS-P4A review: keep_tuple empty override
    retention, non-conflicting duplicate_tuple finding, mode=warn findings frame,
    mode=ignore suppression, and multi-column row_keys identity scoping.
    
    Update review document to mark all five gaps as covered.
    
    Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

commit 27c1e15c94fb1645dfc0dd8ce966ca8bbb1e41cf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 16:35:19 2026 +0200

    docs(review): record FTR-RESOURCE-FALLBACK-OVERRIDE-SEMANTICS-P4A review
    
    Reviewed commit 451a139. Verdict: ACCEPT (no blocking issues).
    Commit can remain as-is.
    
    Architecture:
    - Generic over row_keys/discriminator_column/context_column/value_column
    - No hard-coded locale semantics; column names are fully configured
    - No dense-axis or matrix-shape logic; works on flat tuple frames only
    - No artifact export behavior; pure domain primitive + thin registry entry
    
    Policy correctness:
    - All six policy fields behave as specified by the FTR
    - default_context, empty_override, explicit_empty_marker, collapse,
      default_required, allow_empty_default all verified correct
    - Duplicate/conflicting tuple detection distinguishes both cases
    
    Boundary:
    - FTR-XREF-DENSE-AXES-P4A2 boundary is intact; no XRef machinery touched
    - Boundary test explicitly documents the separation
    
    All FTR acceptance criteria covered by tests.
    
    Non-blocking gaps (no defects, defensive additions only):
    - keep_tuple path not directly tested
    - Non-conflicting duplicate (same key+value) not tested
    - warn/ignore mode paths not tested
    - Multi-column row_keys not tested
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 451a1393a30b16c9c052f01ebeaf43d5bb0f92b2
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 16:17:16 2026 +0200

    feat(resources): implement FTR-RESOURCE-FALLBACK-OVERRIDE-SEMANTICS-P4A minimal slice

commit eb5fffb866fcdab3cf58d7261e3c5485830112f5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 16:07:07 2026 +0200

    test/docs: record FTR-XREF-DENSE-AXES-P4A2 review
    
    Add review document for commit 8ce0c0d:
    - Verdict: ACCEPT (no blocking issues)
    - Architectural assessment: generic XRef shape materialization,
      no localized-resource semantics, sparse behavior preserved,
      no second matrix framework, clean compact_multiaxis deferral
    - Correctness: dense rows/columns from explicit sources, sparse/empty
      handling proven, metadata roundtrip sufficient
    - Non-blocking: multi-column row_keys tested, column_keys/columns_from
      precedence documented as improvement opportunity
    
    Add focused regression test for multi-column dense row_keys:
    - test_contract_xref_dense_multicolumn_row_keys
    - Sparse relation with 2-column row_keys
    - Dense axes reconstruct full Cartesian product (2×2)
    - Existing values land in correct cells
    - Missing cells filled with fill_value
    - Metadata preserves multi-column configuration
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 8ce0c0d04f5cc6c6a3116e34047f4a5dd1beaa0b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 13:46:55 2026 +0200

    feat(xref): implement FTR-XREF-DENSE-AXES-P4A2 minimal slice

commit c64b4315a369a65662a69554ef5ac2c030d32b67
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 13:25:29 2026 +0200

    docs(backlog): add FTR-XREF-DENSE-AXES-P4A2

commit 2abbe42ad4bd582b327eef88c9cc446d9584bed1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 13:18:40 2026 +0200

    docs(backlog): add FTR-XREF-DENSE-AXES-P4A2

commit b0e785a18ff342f50b437b7cbd21e0d421278983
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 12:42:49 2026 +0200

    docs/tests: close FTR-LOCALIZED-RESOURCE-MATRIX-ROUNDTRIP-P4A

commit 6a2a5a3c247422b592d640c12a23fcc9c96e80b6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 11:55:28 2026 +0200

    docs(backlog): clarify frame terminology for FTR-LOCALIZED-RESOURCE-MATRIX-ROUNDTRIP-P4A

commit b1e159153890fd9010aaa0fe486d43dd3a112f2a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 11:40:37 2026 +0200

    docs(backlog): clarify FTR-LOCALIZED-RESOURCE-MATRIX-ROUNDTRIP-P4A generic pattern

commit a86cff25818a223f912fc8c64c5c1c99455b8d0f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 10:14:17 2026 +0200

    chore(tools): exclude cold storage from snapshot

commit 8b2b0585b6a89b5c733bd698445e628ce9e0a9e9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 10:13:22 2026 +0200

    docs(review): summarize review wave 3r - REVIEW-001

commit a3d0e4fc59e542a6a7272034ecbf6b8a15f4145f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 14 10:03:23 2026 +0200

    docs(backlog): refresh P4A feature FTR scope after review wave
    
    Three P4A FTRs adjusted to reflect the post-REVIEW-001 state of the codebase:
    
    - FTR-WORKBOOK-REIMPORT-VIEW-MAPPING-P4A: mark FTR-DECLARATIVE-WORKBOOK-
      VIEWS-P4A prerequisite as Done; add "Meta-Carrier disposition" section
      fixing the sheet-to-frame mapping into the canonical _meta.workbook_view
      channel (roundtrip-relevant, not _meta.derived); require any new sub-key
      to be registered in meta_registry.yaml with producer/consumer refs.
    
    - FTR-WORKBOOK-REIMPORT-DERIVED-COLUMN-POLICY-P4A: mark the two helper-
      column prerequisites as Done; tie helper identification to the registered
      _meta.derived.sheets.<frame>.{helper_columns,enrich_lookup} sub-keys
      (no name heuristics); require the lifecycle order between derived
      consumption and drop_helpers to be documented and tested.
    
    - FTR-ODS-CONSUMER-FEATURE-PARITY-P4A: split scope into "Audit existing
      parity" (post-wave Done features) and "Coverage during active wave"
      (each active P4A FTR must document an ODS disposition); add post-wave
      invariants section pointing at the central router and the lazy-import
      regression guard.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 9646ccc741220386f948b34a1d9460af0a745127
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 22:34:05 2026 +0200

    refactor(FTR-REVIEW-001-BACKEND-DISPATCH-P4A_slice02): polish minor UX findings (header_levels, error wrapping, YAML hint)

commit d693a5e3f04193531d6f7407b341ad06f2cb6d37
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 22:16:33 2026 +0200

    docs(FTR-REVIEW-001-BACKEND-DISPATCH-P4A-SLICE02): add slice02 review
    
    Pass with minor notes. Module split (registry / build / execution / runner)
    verified clean; AppConfig dialect convergence handled with explicit ValueError
    for legacy shape; three new drift-prevention tests cover the separation. 708
    tests pass.
    
    Three minor notes only:
    - run_app doesn't forward header_levels (mirrors prior behavior; asymmetric
      vs orchestrate)
    - run_app doesn't wrap ValueError with AppConfig context like _load_frames does
    - legacy pipeline:{steps:[...]} rejection message could include a canonical
      example
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 0a0d17275831a9a79023bc922279e4d98657470b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 22:10:19 2026 +0200

    refactor(FTR-REVIEW-001-BACKEND-DISPATCH-P4A-SLICE02): split pipeline registry and runner

commit 7c525dcf84efc234c60174610b9caf297451d673
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 22:01:26 2026 +0200

    docs(FTR-REVIEW-001-BACKEND-DISPATCH-P4A): accept slice01 review follow-up

commit edc059c83fd74d32b9bbda796c9a73fec381f1ce
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 21:41:17 2026 +0200

    docs(FTR-REVIEW-001-BACKEND-DISPATCH-P4A): add slice01 review and slice02 FTR
    
    Slice01 (commit 573b428) implemented only the backend-dispatch part of the
    original FTR. This commit adds:
    
    - _review_slice01.adoc: pass with minor notes. Single canonical dispatch
      owner (io_backends/router.py) verified; orchestrator if/elif removed;
      csv_dir end-to-end test added; lazy-import regression guard added.
    - _slice02.adoc: follow-up FTR covering the deferred pipeline work
      (pipeline/registry.py split into registry.py + build.py, run_app rename
      of pipeline/runner.py::run_pipeline, AppConfig dialect convergence on the
      step:-based YAML form). A-010, IR-010, IR-012.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 573b428dbef914694ffd2f2564460b4e926b0f61
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 17:39:56 2026 +0200

    refactor(FTR-REVIEW-001-BACKEND-DISPATCH-P4A): centralize backend dispatch

commit 221fb1ffada7ddd0c9c73ebfffcad000e6a7a6a1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 13:04:17 2026 +0200

    docs(code_review): add completed wave notice for review 3r

commit a61a3513db1152b5582febde6c10dda966851a13
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 11:59:34 2026 +0200

    docs(backlog): archive completed review FTRs

commit 24322594953bde35fc8a94072d7d44c37306978e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 09:07:46 2026 +0200

    docs(ai): require immediate FTR and review follow-up commits

commit 8cd8874966daff884dfc6653eab9f40132889a01
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 09:06:32 2026 +0200

    refactor(FTR-REVIEW-001-PASSES-CLEANUP-P3): split rendering passes into real modules

commit ecf115b6956791f0036fb9d1df149f9dd39e261a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 09:02:58 2026 +0200

    docs(FTR-REVIEW-001-META-REGISTRY-DERIVED-P3): clarify derived subkeys

commit e378eb01a2867d3d2e676a97bd7a3b5d325da594
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 13 07:10:00 2026 +0200

    refactor(domain): move formula-mode/fail guard to enrich_lookup entry point
    
    FTR-REVIEW-001-FORMULAS-CORE-MOVE-P3 important finding: the missing="fail"
    + formula-mode incompatibility check fired inside _build_formula_enrichment,
    several frames below the public entry point, after _VALID_MISSING_MODES
    validation had already accepted "fail". Move the guard to enrich_lookup
    immediately after use_formulas is resolved; remove the duplicate check from
    the private function. No change to valid missing modes for value mode.
    
    Also commits the post-commit review document for this FTR.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 01f6b54d2133e4f797e9bc0c64bcb87c6555f294
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 23:28:48 2026 +0200

    docs: add derived meta registry FTR review
    
    FTR-REVIEW-001-META-REGISTRY-DERIVED-P3

commit 740e03d3307e1353f13dbc91a7f44748bf796ece
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 23:28:44 2026 +0200

    docs: add meta blob JSON FTR review
    
    FTR-REVIEW-001-META-BLOB-JSON-P3

commit a829990fad49767867f8ddb0ed200f193ae6de1f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 23:28:40 2026 +0200

    refactor: move formula specs to core
    
    FTR-REVIEW-001-FORMULAS-CORE-MOVE-P3

commit 773325c10b14a710d45f244c4e91ad13b4af93bc
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 23:16:15 2026 +0200

    fix: apply canonical json.dumps kwargs in _store_workbook_meta
    
    FTR-REVIEW-001-META-BLOB-JSON-P3
    
    _store_workbook_meta in openpyxl_parser.py wrote the workbook_meta_blob
    into the IR with bare json.dumps (default whitespace, unsorted keys). All
    three rendering write sites use ensure_ascii=False, sort_keys=True,
    separators=(",",":"); this site now matches. The intermediate IR blob is
    now deterministically formatted, consistent with the final output produced
    by _dump_workbook_meta_blob in build_render_plan.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit a2dfb1764aea385d6c9430cb2d369a6f171faa37
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 23:06:43 2026 +0200

    docs: clarify derived channel sub-key structure in meta_registry.yaml
    
    FTR-REVIEW-001-META-REGISTRY-DERIVED-P3
    
    Follow-up to the minor review note: the `derived` registry entry now
    explicitly names both current sub-keys (`derived.sheets.*.helper_columns`
    from fk_helpers, `derived.sheets.*.enrich_lookup` from enrich_lookup) in
    the scope field and states that the namespace is not FK-only and not owned
    by any single producer. The merge_behavior and precedence_notes fields are
    tightened to reinforce that sub-keys carry provenance metadata only and
    must not be used as runtime policy.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit bd27b57d6da9d25693f482525da0ba595ee92274
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 21:48:41 2026 +0200

    fix: serialize workbook meta blob as JSON
    
    FTR-REVIEW-001-META-BLOB-JSON-P3

commit 5756c2d14be2817724ef796ae8573c06634706ef
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 21:24:15 2026 +0200

    chore: register derived meta channel
    
    FTR-REVIEW-001-META-REGISTRY-DERIVED-P3

commit 01200cbf0913f09d0b6b1d2a303b391ad749804b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 20:41:00 2026 +0200

    feat: FTR-REVIEW-001 Remove documentation for deleted cli surface

commit d4921bd95969ed16509dc54b98a57908099c8888
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 20:32:58 2026 +0200

    feat: FTR-REVIEW-001 A-002 CLI surface cleanup

commit 23a38aa30935cb9e9625e985e1ca05c35c2f9c82
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 12 19:02:47 2026 +0200

    fix(FTR-REVIEW-001-QUICK-WINS-P3): address quick wins review

commit 858b64d1abb84c7f16dc3c3ec7d5c87413d8e854
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 21:52:39 2026 +0200

    docs(backlog): derive REVIEW-001 FTRs and integrate into phase order
    
    Eight FTRs derived from the REVIEW-001 code-review consolidation
    (docs/internal_guide/code_review/review-consolidation.adoc):
    
      P3  QUICK-WINS, META-REGISTRY-DERIVED, META-BLOB-JSON,
          FORMULAS-CORE-MOVE, PASSES-CLEANUP
      P4A BACKEND-DISPATCH, MODULARIZATION
      P5  MODULE-HEADERS
    
    Placed into _ftrs_open.adoc:
    - New Phase 3r (Architecture Hygiene) before Phase 4 — all five P3 items
      in Abhängigkeitsgraph order.
    - BACKEND-DISPATCH as first open item in Phase 4a.
    - MODULE-HEADERS + MODULARIZATION in Phase 5 alongside MAINTAINER-ENTRYPOINTS.
    - FTR-DOMAIN-CONSOLIDATION moved Phase 6 → Phase 5; slimmed: pipeline-runner
      concern extracted to BACKEND-DISPATCH, API-surface concern to MODULARIZATION.
    - REVIEW-001 derivation table replaced by archaeology comment.
    
    Also adds the two session prompt files (ftr-derivation-prompt.adoc,
    backlog-restructure-prompt.adoc) to the code-review folder.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 1556fa02fdba9a8e0695449248b842a4e5248e2c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 16:48:16 2026 +0200

    docs(concepts): migrate concept docs to human_info/concepts/ + ai_info
    
    Move the 8 prose concept docs out of internal_guide/concepts/ into a new
    human_info/concepts/ folder (English, normalized headings, added a reading
    order and an index). Add a compact agent-facing ai_info/concepts_fk_helpers.adoc
    and extend architecture_primer.adoc (derived meta channel; pipeline_step_registry
    and meta_registry registration rule; goal-vs-current-state NOTE). Extract the
    in-flight roundtrip/step-registration notes to the backlog. Source files keep a
    // MIGRATED notice and are not deleted yet. Cross-reference the overlap into
    review-consolidation.adoc so a later TODO derivation does not double-count.
    Routing and decisions: docs/internal_guide/concepts/concept_migration_proposal.adoc.

commit 375a20286dea3463eef70bd8417893f3ea54f9fa
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 16:30:21 2026 +0200

    docs(code-review): add 4-phase architecture code review and consolidation
    
    Full read-through of domain/core, IR/pipeline and adapters/CLI plus a
    consolidation pass: prioritised findings (CRITICAL/SHOULD-FIX/HYGIENE),
    clusters, quick wins, dependency graph, ai_info/ doc-delta and ADR
    proposals. Reference material for upcoming clean-up work; no code changes.

commit c6af4ea052a9a955f4c638f0a867f2262c45cf7c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 10:21:46 2026 +0200

    docs(ai_info): add FTR-or-not guidance to git_and_workflow
    
    Clarifies that FTRs are for work with acceptance criteria worth tracking.
    Cleanup, refactoring, env migration, bug fixes, and doc restructuring
    don't need an FTR — a good commit message is sufficient.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 7f1ed894afcd3436532fdf38a028c6ac6fe07c7b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 09:58:44 2026 +0200

    refactor(makefile): streamline from 453 to 335 lines; fix WSL leftover
    
    Removed:
    - reset-deps (WSL workaround; superseded by clean-stamps)
    - test-prehex / test-legacy / test-legacy-try (legacy_pre_hex/ is README-only)
    - test-ir / test-ods / test-smoke (reachable via test-one TESTPATTERN=...)
    - Duplicate VENV/PYTEST definitions in the test section
    - TARGET_DIR (unused variable)
    - Large How-to comment block (replaced by short cheatsheet comment)
    
    Fixed:
    - run: deps -> run: deps-dev (deps target never existed)
    
    Added:
    - test-fast (unit only, fastest feedback)
    - test-full (all tests including slow, replaces test-all)
    
    Updated:
    - git_and_workflow.adoc: reset-deps -> clean-stamps in venv recovery path
    - check-venv-mod: removed WSL-specific wording
    
    684 tests pass.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 68c5ac7483e8524a26413f8d085a00aa9f4abea1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 09:24:46 2026 +0200

    fix(tests): repair 4 stale architecture/unit test failures
    
    Three architecture guards had drifted from the current codebase:
    - test_spreadsheet_boundary_guards: referenced pipeline/pipeline.py
      (file was renamed to runner.py); corrected to runner.py
    - test_meta_registry_current_seed_profiles_stay_explicit: protection
      key was added to meta_registry.yaml but not to the expected-profiles
      snapshot; added to snapshot
    - test_meta_registry_code_references_resolve_or_are_explicitly_narrative:
      protection consumer refs used parenthetical narrative syntax with spaces;
      replaced with resolvable dotted module paths
    
    One runtime bug in openpyxl_renderer:
    - SetSheetProtection: ws.protection.password = None raises TypeError in
      openpyxl when password is optional; guard with `if op.password is not None`
    
    One stale column index in formula-mode test:
    - test_full_pipeline_enrich_render_xlsx assumed helper column at col 2;
      matrix frame layout is [variable_id, P-001, label_de] so formula is at col 3
    
    684 passed.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 226827e504e8ab090ebda879b9606c3120a5fe0e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 08:30:51 2026 +0200

    refactor(backlog): consolidate backlog under docs/general_info/
    
    All active FTR files moved from docs/internal_guide/backlog/ftrs/open/
    to docs/general_info/backlog/ (flat structure, no sub-directories).
    
    Removed:
    - _backlog.adoc, _features_by_status.adoc — include-only chains, unused
    - in_progress/ — empty since agentic workflow removed the concept
    - new_suggestions/ — 4 files were exact duplicates already in cold_storage
    - FTR-CLI-CONSOLIDATE-REMOVE-STEPS — discarded stub without .adoc extension
    - future/ + _ftrs_future.adoc — 4 FTRs folded into _ftrs_open.adoc as Phase 8
    
    Archived to cold_storage/backlog/historic_tickets/:
    - epics.adoc — self-declared historical artifact (superseded by narrative)
    - roadmaps/RM-IR-PARITY.adoc — IR parity migration is complete
    
    Moved to docs/general_info/:
    - project_status_notice.adoc → project_status.adoc
    - project_evolution_narrative.adoc
    
    Phase 8 ("Beyond 1.0 — wild ideas") appended to _ftrs_open.adoc.
    Path references updated in git_and_workflow.adoc and internal_guide.adoc.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 7e3f23c22347bdba0c1a3c368774ae40415916eb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 08:22:40 2026 +0200

    docs(ai_info): soften push/pull constraint to 'current sandbox' language
    
    Replaces the absolute 'do not under any circumstance' wording with a
    contextual constraint: agents hand off remote sync steps to the developer
    because of the SSH passphrase boundary, not as a permanent prohibition.
    Runbooks and documented workflows may reference push/pull steps.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 2c5abfb99a8c99ca0fcde1696c052c5afeb8bd39
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 08:22:17 2026 +0200

    docs(ai_info): clarify branching model — direct-dev default, branches by exception
    
    Single-developer linear workflow: commits go straight to dev.
    Feature branches are reserved for out-of-the-ordinary work (e.g. major refactors)
    and require developer coordination for the pull/push steps that agents cannot perform.
    
    Per-FTR workflow table updated accordingly; push/push-with-lease annotated as
    developer-executed.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 69012ecee79a30421568c72c26c5633de45bafb3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon May 11 08:22:08 2026 +0200

    refactor(backlog): move done FTRs to cold_storage; slim entry-point files
    
    All completed FTR files moved from docs/internal_guide/backlog/ftrs/done/
    to docs/cold_storage/backlog/historic_tickets/ftrs/.
    early_project_evolution.adoc relocated to cold_storage as well.
    
    AGENT.md and CLAUDE.md updated to point directly to docs/ai_info/_ai_info.adoc,
    removing dead references to deleted ai_policy/ and dev_man/ directories.
    
    Backlog index no longer includes the done/ FTR assembly; historic
    material is now reachable only via cold_storage.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit d5361fc491cf4da73beab818ff11b90617000405
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 10 22:13:51 2026 +0200

    docs(ai_info): add push/pull boundary rule for agents
    
    Agents do not run git push or git pull. Developer performs these manually.
    SSH key with passphrase is the current security boundary; may be revisited.
    
    Added as an explicit rule in agent_rules.adoc (primary) and a one-liner
    note in git_and_workflow.adoc (context).

commit 875f531369d4fed25291718d53a2bb0765650925
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 10 22:08:54 2026 +0200

    docs(backlog): strip completed phases from _ftrs_open.adoc; add lifecycle rule to primer
    
    Reduce _ftrs_open.adoc from 784 to 300 lines by replacing completed-phase
    blocks with single archaeology comment lines (Phase 3a–3f, 3h–3k, 4a
    sub-waves). All history already present in project_evolution_narrative.adoc.
    
    Also removes one broken include (FTR-CLI-CONSOLIDATE-REMOVE-STEPS had no
    file) and deduplicates the double FTR-AUTORELEASE-POLICY include.
    
    Add backlog lifecycle rule to docs/ai_info/git_and_workflow.adoc:
    update narrative per phase (not per FTR), replace phase block with one
    archaeology comment, move completed FTR files to cold_storage.

commit 2e6ef0ed23c1dff40fa55b544f07cd4525f1c283
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 10 21:48:11 2026 +0200

    docs(ai_info): restructure agent documentation for token efficiency
    
    Replace include-based ai_info assembly and scattered dev_man content
    with 6 topic-focused, telegraphic files:
    
    - project_context.adoc  — identity, tech stack, AI policy
    - conventions.adoc      — Python/Bash/YAML/Make/testing rules
    - interfaces_and_gates.adoc — consumer surface and approval gates
    - git_and_workflow.adoc — commits, branching, FTR lifecycle
    - agent_rules.adoc      — scope limits and safety rules
    - architecture_primer.adoc — layer map, IR render-flow, meta invariants
    
    Absorb dev_man/ content into ai_info; delete dev_man directory.
    Move ADRs to docs/human_info/adr/ (documentary character).
    Delete compatibility shims: ai_policy/ (agentic_info/ was untracked).
    Update internal_guide.adoc to reflect the new structure.
    
    Result: ~1 000 lines of prose across 30 files reduced to 562 lines
    in 6 agent-optimised files; internal_guide/ contains only
    architecture/, backlog/, concepts/, glossary/, and release docs.

commit eaf08e5af92bc293f69188c752b64d9e3d7e0c02
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun May 10 09:44:45 2026 +0200

    docs(backlog): realign local dev ergonomics toward remote Linux SSH workflow
    
    Set the FTR baseline to a dedicated headless Debian VM via SSH as primary maintainer and agent path, with local Linux/WSL as fallback and native Windows as best-effort only.
    
    FTR: FTR-LOCAL-DEV-ENVIRONMENT-ERGONOMICS-P5

commit 4eca697f575017affac96b645fd19f37cd069171
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 8 18:48:36 2026 +0200

    feat(domain): add formula mode to lookup helper enrichment
    
    add_lookup_helpers now supports helper_value_mode='formula' to emit
    backend-neutral LookupFormulaSpec cell values instead of copied data.
    select_render_frames resolves logical frame names to physical sheet
    names in formula specs after workbook view composition. XLSX renders
    XLOOKUP formulas; ODS renders equivalent OpenFormula XLOOKUP.
    
    Also fixes missing ProtectionPass in passes/__init__.py:apply_all.
    
    FTR: FTR-LOOKUP-HELPER-FORMULA-MODE-P4A

commit ce4b45a95a4f7c5195c6c2bd3ab8a9a4f35d74c7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 8 17:10:23 2026 +0200

    feat(rendering): add editable columns and sheet protection
    
    ProtectionPass resolves editable/locked column intent from explicit
    editable_columns lists or derived non_helper mode into column-level
    cell-lock render operations. XLSX renderer applies sheet protection
    with unlocked editable cells. ODS skips protection ops (documented
    capability gap). configure_workbook_view accepts editable_columns and
    protection at sheet level.
    
    FTR: FTR-EDITABLE-COLUMNS-AND-PROTECTION-P4A

commit 0324bf12fc8579481d0beafcf91fcdb2861a565e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 8 09:46:59 2026 +0200

    docs(backlog): add helper column style metadata review
    
    FTR: FTR-HELPER-COLUMN-STYLE-METADATA-P4A

commit 3db331ccbe6ce8686059d5a3f283447e0d7cf211
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 8 07:58:43 2026 +0200

    feat(rendering): add helper column style metadata
    
    Resolve helper-column styling from sheet-local helper_columns metadata, FK/lookup helper provenance, and the existing helper_prefix fallback. Wire configure_workbook_view, parser option hints, meta registry docs, and XLSX/ODS coverage through the existing ApplyColumnStyle render path.
    
    Also simplify a join view conditional expression so source-style guardrails stay error-free.
    
    FTR: FTR-HELPER-COLUMN-STYLE-METADATA-P4A

commit 73665add8d377f2386e84372ada022d8c18f5b02
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri May 8 07:34:50 2026 +0200

    docs(backlog): record quality hardening followups
    
    Capture the accepted workbook-view review and park lightweight maintainer-entrypoint, module-budget, and SonarQube follow-up ideas in the backlog.
    
    FTR: FTR-DECLARATIVE-WORKBOOK-VIEWS-P4A

commit 92533fc0761c5b84828290fe8c9fde5849f21c9d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 16:56:40 2026 +0200

    feat(pipeline): add declarative workbook view configuration
    
    FTR: FTR-DECLARATIVE-WORKBOOK-VIEWS-P4A
    
    Adds configure_workbook_view for metadata-only sheet selection, naming, ordering, lifecycle annotations, and render options while extending select_render_frames to consume explicit workbook_view sheets.

commit f90eb3c20f8764b9a965d308a4475b0c193fe838
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 16:07:02 2026 +0200

    docs(backlog): add view operation implementation reviews
    
    FTR: FTR-DECLARATIVE-TABULAR-VIEW-OPS-P4A
    
    FTR: FTR-SIMPLE-JOIN-VIEWS-P4A

commit 0d61e764d4f949cd0358577fdb42a423bacdba75
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 12:56:20 2026 +0200

    feat(domain): add declarative join view step
    
    FTR: FTR-SIMPLE-JOIN-VIEWS-P4A
    
    Adds join_frames for explicit left, inner, and semi-join view preparation with bounded predicates, projection, collision policy, lifecycle metadata, and ODS/XLSX smoke coverage.

commit b255f6c04fe0e5f64982bd27e088005cad3f0f60
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 11:32:44 2026 +0200

    feat(domain): add declarative pivot view step
    
    FTR: FTR-DECLARATIVE-TABULAR-VIEW-OPS-P4A
    
    Adds a bounded pivot_frame pipeline step for explicit display-view preparation and records the view-layer ownership boundary between tabular operations, join views, and workbook views.

commit 88685423937b34b346c364f813c6a2f63f39deca
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 11:02:52 2026 +0200

    docs(backlog): add graph reference validation review
    
    FTR: FTR-GRAPH-REFERENCE-VALIDATIONS-P4A

commit ca03d86ab218bcf02bd044373c70aa3c33261ce0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 10:20:46 2026 +0200

    feat(validation): add graph reference checks
    
    FTR: FTR-GRAPH-REFERENCE-VALIDATIONS-P4A

commit 28ee9decfeb981a63a654388347b27e4b00188f0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 10:14:31 2026 +0200

    fix(validation): avoid duplicate skipped findings
    
    FTR: FTR-CONDITIONAL-VALIDATION-RULES-P4A

commit 413f589823dd57d26c3dafa84b8521e5ad3860be
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 08:45:45 2026 +0200

    feat(validation): add conditional reference checks
    
    FTR: FTR-CONDITIONAL-VALIDATION-RULES-P4A

commit ed42503a9230810e7711d1eb1aed8b0a3bb0b395
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 08:02:56 2026 +0200

    test(validation): cover reference validation review gaps
    
    FTR: FTR-STANDARD-REFERENCE-VALIDATIONS-P4A

commit a9a2f24ff3006503cc76c0789f310e29d8a4fe6a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 07:21:52 2026 +0200

    feat(validation): add declarative reference checks
    
    FTR: FTR-STANDARD-REFERENCE-VALIDATIONS-P4A

commit d5c1549717eb56af1a92d3b4e4240e8d01c67243
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 06:51:29 2026 +0200

    docs(backlog): add generic extraction review
    
    FTR: FTR-GENERIC-FRAME-EXTRACTIONS-P4A

commit 7120dc8f5da5d6bc2ba15203e491c6b1416cc163
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu May 7 06:08:04 2026 +0200

    feat(domain): add generic frame extraction
    
    FTR: FTR-GENERIC-FRAME-EXTRACTIONS-P4A

commit ea6dcbd9ef180b0a6053029b148deeb71ae04d51
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 23:08:40 2026 +0200

    docs(backlog): expand prototype consumer planning
    
    Capture the pre-beta core backlog expansion from the prototype consumer analysis, including declarative view, validation, resource, reimport, publishing, and documentation-surface follow-ups.
    
    Add concept notes for localized resources and worldbuilding continuity, preserve the consolidated review, and record execution order for the next beta gate.

commit 799cf6797a87f0cbfc1885156f45bcdeab3749fb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 20:46:35 2026 +0200

    docs(concepts): add localized resource roundtrip model
    
    FTR: FTR-LOCALIZED-RESOURCE-MATRIX-ROUNDTRIP-P4A
    
    FTR: FTR-RESOURCE-FALLBACK-OVERRIDE-SEMANTICS-P4A
    
    FTR: FTR-KEY-VALUE-RESOURCE-WRITER-P4A

commit aae24e12a0256e9aabf3f6039d72f9ec703a5657
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 20:36:08 2026 +0200

    docs(concepts): add business workbook roundtrip model
    
    Describe the canonical relation model, business-facing workbook views, forward projection, reverse recomposition, validation boundaries, and conflict policies for prototype consumer calculation configuration workflows.

commit 85a3b0a98719e33f5f0754c26e78cf481e71a978
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 19:10:32 2026 +0200

    docs(backlog): clarify tuple-driven join views
    
    FTR: FTR-SIMPLE-JOIN-VIEWS-P4A

commit 0cc7bc98265d3578b8b8194ad6f3754b45726e40
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 18:16:58 2026 +0200

    docs(backlog): add generic extraction and validation FTRs
    
    FTR: FTR-GENERIC-FRAME-EXTRACTIONS-P4A
    
    FTR: FTR-STANDARD-REFERENCE-VALIDATIONS-P4A
    
    FTR: FTR-SIMPLE-JOIN-VIEWS-P4A

commit 60aef733c82f80015e4e8763dde3bd6b722e1f9b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 18:14:16 2026 +0200

    docs(backlog): neutralize consumer integration references
    
    FTR: FTR-PROTOTYPE-CONSUMER-INTEGRATION-P4A

commit 4d1c1fa0c5d7a26b503ed30bde014bf42ca59d13
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 18:07:52 2026 +0200

    docs(backlog): add declarative view roundtrip FTRs
    
    FTR: FTR-DECLARATIVE-TABULAR-VIEW-OPS-P4A
    
    FTR: FTR-WORKBOOK-VIEW-ROUNDTRIP-RECOMPOSITION-P4A

commit 28b50abf071146722b0eed81dde443e724d9baae
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 17:42:52 2026 +0200

    docs(backlog): add BA-derived pre-beta core FTRs
    
    FTR: FTR-DECLARATIVE-WORKBOOK-VIEWS-P4A
    
    FTR: FTR-HELPER-COLUMN-STYLE-METADATA-P4A
    
    FTR: FTR-EDITABLE-COLUMNS-AND-PROTECTION-P4A
    
    FTR: FTR-LOOKUP-HELPER-FORMULA-MODE-P4A
    
    FTR: FTR-ODS-CONSUMER-FEATURE-PARITY-P4A

commit 57e47ad54715790ccdd8ee58f8220c9c969fe9b9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 16:32:20 2026 +0200

    docs(backlog): add pre-beta integration planning
    
    FTR: FTR-BA-CONFIG-INTEGRATION-P4A
    
    FTR: FTR-DEMO-REPO-INTEGRATION-P4A
    
    FTR: FTR-PAGES-AND-RELEASE-NOTES-P5

commit 38c00c2d2e0360a591ee4b1ca0c98ed8ccc2b31a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 15:51:43 2026 +0200

    docs(backlog): add frame lifecycle review
    
    FTR: FTR-FRAME-LIFECYCLE-AND-WORKBOOK-VIEWS-P4

commit 3e0eba1affaf23c3ac8db27f204feeec18669544
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 14:03:15 2026 +0200

    feat(rendering): add frame lifecycle view selection
    
    FTR: FTR-FRAME-LIFECYCLE-AND-WORKBOOK-VIEWS-P4

commit d88d28d1f4442e67964242fa5722894db3391f04
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 12:59:27 2026 +0200

    refactor(pipeline): remove legacy pipeline facade
    
    FTR: FTR-PIPELINE-FACADE-AND-SIMPLE-CLI-CLEANUP-P4A

commit 1f9829454c72048199249c3d280c0336f3ce2ea0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 10:40:15 2026 +0200

    docs(FTR-SOURCE-STYLE-GUARDRAILS-P4): add accepted review note
    
    Add the post-hoc review artifact and link it from the completed FTR backlog entry.

commit 88abd2fcc09828fae4bf42a5e8346097f93bf7af
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 09:21:07 2026 +0200

    test(style): add source style guardrails
    
    FTR: FTR-SOURCE-STYLE-GUARDRAILS-P4

commit 71544e0a30f48db2e905577305c41f85d1e87c80
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 08:54:51 2026 +0200

    docs(backlog): add source style cleanup review
    
    FTR: FTR-SOURCE-STYLE-CLEANUP-P4

commit e7e98a2f0b498568d3334764f013885d513cbf99
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 08:18:06 2026 +0200

    refactor(style): clean source readability drift
    
    FTR: FTR-SOURCE-STYLE-CLEANUP-P4

commit 11d5b814ecf105dd0284a7f372ef18542defb21f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 07:45:55 2026 +0200

    docs(backlog): add pipeline semantics guard review
    
    FTR: FTR-PIPELINE-SEMANTICS-GUARDS-P4

commit 870e45f137845ae821a884faaaf8551ab998b035
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 07:34:29 2026 +0200

    test(architecture): add pipeline semantics guards
    
    FTR: FTR-PIPELINE-SEMANTICS-GUARDS-P4

commit 9e821a5e4f0a54aaa917540041b23235cb2822b4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 07:12:22 2026 +0200

    fix(io): lazy load optional spreadsheet backends
    
    FTR: FTR-COLUMN-WIDTH-ROUNDTRIP-P4

commit caee2dae2e0ded4dd99e08d2f52350a6d0643103
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 06:58:17 2026 +0200

    feat(xlsx): preserve column widths across roundtrips
    
    FTR: FTR-COLUMN-WIDTH-ROUNDTRIP-P4

commit 50d813b25988b6f602f7cce4745d05dd14c3762f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed May 6 06:09:57 2026 +0200

    test(rendering): cover legend validation review gaps
    
    FTR: FTR-LEGEND-VALIDATION-LISTS-P4A

commit da76435d9f4a3aea5a2597ce6489867b06ef1a02
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 5 20:07:41 2026 +0200

    feat(rendering): add legend-derived validation lists
    
    FTR: FTR-LEGEND-VALIDATION-LISTS-P4A

commit 942b2948afc639abf7d8acb8810039d821755461
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 5 18:55:14 2026 +0200

    fix(domain): harden sparse default column resolution
    
    FTR: FTR-SPARSE-CROSSTABLE-COLLAPSE-P4A

commit f2a34488aeced3ec321d2ef65ab0fb16da40c067
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 5 07:30:21 2026 +0200

    docs(backlog): add discriminator split review
    
    FTR: FTR-SPLIT-BY-DISCRIMINATOR-P4A

commit b3e8d2b8f17dcb259f26ab39fad084b05187e593
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 5 07:24:04 2026 +0200

    feat(domain): add sparse crosstable defaults
    
    FTR: FTR-SPARSE-CROSSTABLE-COLLAPSE-P4A

commit 0fe6449c31a0e7b0dcecbc98a415ea47dafe1dfe
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue May 5 07:11:18 2026 +0200

    docs(backlog): add source style guardrail FTRs
    
    FTR: FTR-SOURCE-STYLE-CLEANUP-P4
    
    FTR: FTR-SOURCE-STYLE-GUARDRAILS-P4

commit b87c7d0855f06bc719d1aa208df867a5a46208e4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 20:10:54 2026 +0200

    docs(backlog): add planned FTR backlog entries
    
    Capture new planning entries for legend validation lists, JSON sharding by partition, rename reconciliation, and the updated open backlog ordering.

commit d8745db712f4236fc387dcc1c7e48441b4d3c386
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 20:09:23 2026 +0200

    docs(backlog): add project evolution narrative
    
    Capture the project story as a condensed historical layer so completed FTRs can later move into archive without becoming the default context path.

commit 5855c28b2e4aafac5ec973244b734d560a429f2d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 19:43:22 2026 +0200

    feat(domain): add discriminator split transforms
    
    FTR: FTR-SPLIT-BY-DISCRIMINATOR-P4A

commit e1a5cf4e2e95f7cc37b67dfc958d3b5b901044fc
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 17:51:15 2026 +0200

    docs(backlog): add test archive quarantine review
    
    FTR: FTR-TEST-ARCHIVE-AND-QUARANTINE-RULES-P3C

commit a676430dc15dcb906b59b9faa151becf242e3409
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 17:40:53 2026 +0200

    docs(backlog): add pre-beta domain transform FTRs
    
    FTR: FTR-SPLIT-BY-DISCRIMINATOR-P4A
    
    FTR: FTR-SPARSE-CROSSTABLE-COLLAPSE-P4A

commit 2acee54fa3a582ab6e15b106fc9c68ceb713c37b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 17:28:47 2026 +0200

    test: document archive and quarantine rules
    
    FTR: FTR-TEST-ARCHIVE-AND-QUARANTINE-RULES-P3C

commit 11f3090effaa21bbca8e3131e5d0403fb88d0b1f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 17:13:34 2026 +0200

    docs(backlog): add test naming review
    
    FTR: FTR-TEST-NAMING-AND-CONVENTIONS-P3C

commit 26d22c02afaad7ed821b3941d81f7cbbbe9fe334
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 17:01:27 2026 +0200

    test: establish test naming conventions
    
    FTR: FTR-TEST-NAMING-AND-CONVENTIONS-P3C

commit 87a8ab51c6708c63c97c6d6f3e5b328405aee690
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 30 14:28:24 2026 +0200

    feat(domain): add structured YAML writer
    
    FTR: FTR-STRUCTURED-YAML-WRITER-P4

commit cec79fd189322c8ef5468e6fbd8cd6141a35fbbf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 20:02:29 2026 +0200

    docs(backlog): preserve FTR phase archaeology
    
    Keep compact phase-history comments in the open backlog when FTRs move to done/archive, and document the convention for AI-assisted FTR workflow.

commit 5b006088f0f1a16596666c5d2d8249973401f586
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 19:52:18 2026 +0200

    docs(backlog): refine pre-beta cleanup plan
    
    Rescopes the pipeline facade/simple CLI cleanup FTR, parks the two Phase 5 stabilization follow-ups, and keeps the open backlog order aligned after the YAML-safe key work.

commit 3e58054f8084af9d3304cfb283d27521c7d0e1bf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 19:50:02 2026 +0200

    feat(pipeline): add YAML-safe lookup join keys
    
    FTR: FTR-YAML-SAFE-STEP-KEYS-P4

commit 47a057e5cce9d95dd0b6f1ac27876bed1195de35
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 17:53:20 2026 +0200

    feat(domain): harden compact transform ergonomics
    
    FTR: FTR-COMPACT-TRANSFORM-API-ERGONOMICS-P4

commit 4425f7996657f6323f22eccfd88683472b5bc482
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 17:16:27 2026 +0200

    test(pipeline): address FK helper configuration review
    
    FTR: FTR-FK-HELPER-CONFIGURATION-STEPS-P4

commit ec41772e999800fa89f6a54744cb8957fd02785c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 15:12:54 2026 +0200

    feat(pipeline): add FK helper configuration step
    
    FTR: FTR-FK-HELPER-CONFIGURATION-STEPS-P4

commit 7f954e4006faa63a7d2b30e66dd8179aa0a9e6f9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 08:42:27 2026 +0200

    docs(architecture): record CLI shortcut pattern as intended mechanism
    
    The thin-CLI-to-orchestrator pattern (sheets-pack, sheets-unpack) is an
    intentional product mechanism, not legacy.  This concept document records
    the architectural intent before the concrete shortcut names are deprecated
    in FTR-PIPELINE-FACADE-AND-SIMPLE-CLI-CLEANUP-P4A.
    
    No code changes.  The concept is not yet implemented beyond the existing
    sheets-pack / sheets-unpack shortcuts.
    
    FTR: FTR-PIPELINE-FACADE-AND-SIMPLE-CLI-CLEANUP-P4A (upcoming)

commit 4b6e77e233bfeffaf254e1c57af80df32c4d3372
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 08:41:34 2026 +0200

    test(rendering): address FK helper formula review
    
    FTR: FTR-FORMULA-FK-HELPER-PROVIDERS-P4A

commit edba6852d037481d49d388ebb777775b9870efa8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 07:35:15 2026 +0200

    feat(rendering): add FK helper lookup formula specs
    
    FTR: FTR-FORMULA-FK-HELPER-PROVIDERS-P4A

commit 998902e706db5bc47949f0ec264034730073ff21
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 29 06:43:07 2026 +0200

    test(pipeline): address lookup configuration review
    
    FTR: FTR-LOOKUP-FK-CONFIGURATION-STEPS-P4

commit 420a9d7bf980868bd7bc149c51612e4e986852eb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 20:10:13 2026 +0200

    feat(pipeline): add lookup helper configuration step
    
    FTR: FTR-LOOKUP-FK-CONFIGURATION-STEPS-P4

commit 1d5bf571ed8d23325039151b131c325e8179a0aa
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 19:47:28 2026 +0200

    test(architecture): address step registry review
    
    FTR: FTR-PIPELINE-STEP-REGISTRY-P4

commit d9bbae85c7d6d8f66f64a4bd5aeecc0d8b95530b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 18:36:39 2026 +0200

    feat(pipeline)!: normalize helper step names
    
    FTR: FTR-PIPELINE-STEP-NAMING-P4
    
    BREAKING CHANGE: Renamed apply_fks, drop_helpers, check_fk_helpers, reorder_helpers, and enrich_lookup to add_fk_helpers, remove_fk_helpers, validate_fk_helpers, reorder_fk_helpers, and add_lookup_helpers.

commit fd819f21656e2540d471176d8e816b3dfcc4b28b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 16:13:41 2026 +0200

    docs(architecture): add pipeline step registry
    
    FTR: FTR-PIPELINE-STEP-REGISTRY-P4

commit eeaeb2f46eab5dcf3c29afc897ccad5ae6598ae2
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 15:55:27 2026 +0200

    chore(backlog): archive completed feature slices
    
    Move completed FK/helper, legend, compact transform, architecture guard, and run-path override FTRs to done.
    
    Keep log.txt untracked as a temporary audit aid.

commit 0ebcb4f8a7531b589095912ed9c468038bd402e8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 15:31:30 2026 +0200

    chore(backlog): curate pipeline semantics roadmap
    
    Add FTR-COLUMN-WIDTH-ROUNDTRIP-P4 for adapter column-width fidelity.
    
    Move completed FTRs and reviews to done, reorder the pipeline semantics backlog waves, and narrow deep semantics guards to post-registry work.

commit 419d091ec114ee6ad1fa978137f75d08952e0cd4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 14:56:04 2026 +0200

    docs(architecture): incorporate pipeline semantics review findings
    
    FTR: FTR-PIPELINE-SEMANTICS-CONCEPT-P4

commit a7513778627f703e5da3765567c9723a1ae3294d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 12:56:20 2026 +0200

    docs(architecture): archive pipeline semantics concept
    
    FTR: FTR-PIPELINE-SEMANTICS-CONCEPT-P4

commit 86bb6ac3cd0671bd88da3ce259647635ec48eba6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 07:20:23 2026 +0200

    docs(backlog): add yaml safe step keys follow-up
    
    FTR: FTR-YAML-SAFE-STEP-KEYS-P4

commit 38a00715270c177a5c1632ecac01aa7f81325cf1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 06:55:27 2026 +0200

    docs(backlog): quote enrich lookup on key
    
    FTR: FTR-EXPLICIT-HELPER-LOOKUP-POLICY-P4

commit ce1b6cc97d8e53e52fd79d8fedf61eacbb0fd331
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 28 06:49:34 2026 +0200

    docs(backlog): review explicit helper lookup policy
    
    FTR: FTR-EXPLICIT-HELPER-LOOKUP-POLICY-P4

commit 8e620b440df24e2e5766b04a2c5fbd83f44a16c2
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 27 18:27:35 2026 +0200

    feat(enrich-lookup): implement explicit helper lookup step (FTR-EXPLICIT-HELPER-LOOKUP-POLICY-P4)
    
    Add generic enrich_lookup pipeline step for explicit helper field
    projection from lookup tables via configured join keys.
    
    Implements:
    - Explicit source/lookup/output/on/helpers/order configuration
    - Helper field allowlist validation and default policy from _meta
    - Duplicate lookup key rejection
    - Column conflict detection between source and helper fields
    - Missing match semantics: fail (default) or empty
    - Invalid helper_position and sort_by validation
    - Helper provenance in _meta.derived.sheets
    - Multi-key join support
    - Pipeline registry binding via make_frames_target_step
    
    Replaces consumer-side plugins like ba-config
    enrich_variable_usage_matrix_helpers with declarative YAML config.
    
    Tests: 22 domain + 2 pipeline smoke = 24 new tests, 475 total green.

commit 0298756db676a902d356318f3562f31dcc36ca39
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 27 17:05:10 2026 +0200

    docs(backlog): capture phase 4 integration follow-ups
    
    FTR: FTR-COMPACT-TRANSFORM-API-ERGONOMICS-P4
    
    FTR: FTR-EXPLICIT-HELPER-LOOKUP-POLICY-P4
    
    FTR: FTR-STRUCTURED-YAML-WRITER-P4

commit 3d4d7deaa3f4872c470fef1b79ec2f197218d8ee
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 27 08:44:13 2026 +0200

    feat(domain): add compact multiaxis transforms
    
    FTR: FTR-COMPACT-MULTIAXIS

commit c740e647d46500011d9fcf7cfda19bc56a6f2307
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 26 10:10:27 2026 +0200

    feat(domain): add cell codec transforms
    
    FTR: FTR-CELL-CODEC

commit 88bb74bff5d4b07bb46e4f446e6951dc7b254b6b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 25 22:32:34 2026 +0200

    docs(backlog): add phase 4a2 xref axis planning
    
    FTR: FTR-XREF-AXIS-MAPPINGS-P4A2
    
    FTR: FTR-XREF-GROUPED-COLUMNS-P4A2
    
    FTR: FTR-COMPACT-XREF-USE-CASE-SLICE-P4A2

commit e8d1a3d1c7a44549d8ed34b587a197ed964dde52
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 25 22:17:28 2026 +0200

    feat(domain): add xref crosstable transforms
    
    FTR: FTR-XREF-CROSSTABLE

commit 4a114c3d585123d52b291ed9969e9be86dc00c78
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 25 21:25:55 2026 +0200

    feat(rendering): add legend codebook blocks
    
    FTR: FTR-LEGEND-BLOCKS

commit 448cba33c831ac28ecef772e0cb7ad3bb83b49cf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 25 21:07:12 2026 +0200

    docs(backlog): refine legend blocks transform path
    
    FTR: FTR-LEGEND-BLOCKS

commit 1748e9991dccaa0dbc33743feb0c4995c94d53ef
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 25 09:38:23 2026 +0200

    test(rendering): harden formula provider review cases
    
    FTR: FTR-FORMULA-PROVIDERS
    
    Review: add comma/quote coverage for XLSX and ODS FormulaSpec translation, move structural formula intent to semantic invariants, and note the future FormulaSpec Union/Protocol expansion in FTR-FORMULA-FK-HELPER-PROVIDERS-P4A.

commit d9cff7fe212969b6d5f91abe87bf0754b551247c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 23:01:13 2026 +0200

    feat(rendering): carry validation formulas as specs
    
    FTR: FTR-FORMULA-PROVIDERS
    
    Backlog: split formula-driven FK helper providers into FTR-FORMULA-FK-HELPER-PROVIDERS-P4A.

commit 8fda2b8d5a50352f99c43d30cdf2a3669ebfcaf0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 22:43:13 2026 +0200

    docs(backlog): move completed resume gate FTRs to done
    
    Backlog work: move completed Phase 4a resume-gate FTRs and reviews from open to done.
    
    FTRs: FTR-TEST-SUITE-TOPOLOGY-P3C, FTR-ARCHITECTURE-TEST-LAYER-P3C, FTR-TEST-MARKERS-AND-MAKE-TARGETS-P3C, FTR-ARCHITECTURE-GUARD-INVENTORY-P4, FTR-GUARDRAIL-DECISION-RECORD-P4, FTR-RAW-FORMULA-BOUNDARY-GUARDS-P4, FTR-TEST-CARRIER-BOUNDARY-GUARDS-P4, FTR-META-CARRIER-BOUNDARY-GUARDS-P4, FTR-ADAPTER-CONTRACT-BOUNDARY-GUARDS-P4, FTR-PREHEX-TEST-CLASSIFICATION-P3C, FTR-INTEGRATION-SLICE-CONSOLIDATION-P3C

commit b108549586ec38bf72f6c549dee4eff1271b2ca8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 22:10:56 2026 +0200

    test(integration): document integration slices
    
    FTR: FTR-INTEGRATION-SLICE-CONSOLIDATION-P3C

commit 0474f37b5d325577399fa262d6c7a5d26a357ae8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 22:00:16 2026 +0200

    docs(tests): classify empty prehex quarantine
    
    FTR: FTR-PREHEX-TEST-CLASSIFICATION-P3C

commit fa05921f1ea8939708cb4bc3f2412233a64a68eb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 21:49:18 2026 +0200

    docs(backlog): record open backlog work
    
    Backlog work: capture open FTR and review artifacts plus guard inventory updates.
    
    FTRs: FTR-ADAPTER-CONTRACT-BOUNDARY-GUARDS-P4, FTR-TEST-CARRIER-BOUNDARY-GUARDS-P4, FTR-META-CARRIER-BOUNDARY-GUARDS-P4, FTR-ARCHITECTURE-GUARD-INVENTORY-P4, FTR-GUARDRAIL-DECISION-RECORD-P4, FTR-PREHEX-TEST-CLASSIFICATION-P3C, FTR-TEST-SUITE-TOPOLOGY-P3C, FTR-TEST-MARKERS-AND-MAKE-TARGETS-P3C, FTR-TEST-ARCHIVE-AND-QUARANTINE-RULES-P3C, FTR-TEST-NAMING-AND-CONVENTIONS-P3C, FTR-INTEGRATION-SLICE-CONSOLIDATION-P3C

commit 00792de47c3cddb1562aa9280c477d2e33b4f98b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 21:37:31 2026 +0200

    test(architecture): guard spreadsheet adapter contracts
    
    FTR: FTR-ADAPTER-CONTRACT-BOUNDARY-GUARDS-P4

commit 8dafa9a50a8c8a6b7aa04b95ba0bd2edd6aa3511
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 21:34:39 2026 +0200

    test(architecture): add carrier boundary guards
    
    FTRs: FTR-TEST-CARRIER-BOUNDARY-GUARDS-P4, FTR-META-CARRIER-BOUNDARY-GUARDS-P4

commit 53ccb887e25c2742d297948ecec5cda058402b41
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 14:23:23 2026 +0200

    test: guard raw formula boundaries for FTR-RAW-FORMULA-BOUNDARY-GUARDS-P4

commit 69b00d2243dba4a08114cef0651982817ff1eb78
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 14:02:13 2026 +0200

    docs: record guardrail decisions for FTR-GUARDRAIL-DECISION-RECORD-P4

commit 515261961e50c7f1ff5ee12aa71ac116a289aa65
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 13:51:12 2026 +0200

    docs: add guard inventory for FTR-ARCHITECTURE-GUARD-INVENTORY-P4

commit ebdc9673ae5050fadf8a668cb0a33771a9b2aebf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 13:16:49 2026 +0200

    docs(review): refine prehex note for FTR-TEST-MARKERS-AND-MAKE-TARGETS-P3C

commit 3b9f74429741c859d1977f861bb5f1800742d83c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 10:57:19 2026 +0200

    test: normalize markers and make targets for FTR-TEST-MARKERS-AND-MAKE-TARGETS-P3C

commit 6a02eeeebc71e1318dd20d160b40fcaa309d7628
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 10:54:57 2026 +0200

    docs(backlog): formalize phase-4 guardrail governance and resume sequencing
    
    Context:\nPhase 4a feature work was intentionally paused after Formula Providers surfaced architectural degrees of freedom that could erode recently stabilized boundaries.\n\nIntent of this backlog revision:\n- make guardrail decisions explicit and reviewable via a dedicated mini-FTR\n- align Formula Providers with semantic-boundary testing (not generic-layer raw formula string assertions)\n- define a clear pre-resume execution order in _ftrs_open with explicit resume-gate criteria\n- ensure guard implementation tickets carry concrete initial GDR entries to prevent ad-hoc exceptions\n\nWhat is included:\n- add FTR-GUARDRAIL-DECISION-RECORD-P4 with GDR template, ownership, exception-sunset rules\n- expand FTR-FORMULA-PROVIDERS to FormulaSpec-boundary framing and architecture-compatible acceptance criteria\n- restructure Phase 4a in _ftrs_open: paused status, target sequence, guardrail baseline, implementation wave, and grouped follow-ups\n- link architecture guard inventory to the new GDR mini-FTR\n- add initial GDR entries in RAW-FORMULA, META-CARRIER, and ADAPTER-CONTRACT guard tickets\n\nScope note:\nThis commit intentionally stages only backlog documentation artifacts and leaves parallel in-progress non-backlog work untouched.

commit 1ee085ec19b0971cb810dd2ec707e688721c0662
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 09:28:18 2026 +0200

    test: refine architecture test layer for FTR-ARCHITECTURE-TEST-LAYER-P3C

commit 4b4863ebcce24051c8556e0cb286c714a475b305
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 24 09:03:43 2026 +0200

    test: establish suite topology for FTR-TEST-SUITE-TOPOLOGY-P3C

commit 70ee5bb0e0159eb611687e156acf144184bc7cfd
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 23 18:50:22 2026 +0200

    test(FTR-ARCHITECTURE-FITNESS-GUARDS-P4X): extend architecture seam guards

commit 026c4c2dae716bc240518df82465cf2ee7de9add
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 23 18:43:22 2026 +0200

    docs(backlog): record phase 4a follow-ups and review notes

commit a83c29ecc7be138b50253f584b7d65e24fd45868
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 23 17:46:29 2026 +0200

    refactor(domain): extract FK-helper logic from pipeline.steps into domain layer
    
    FTR-FK-HELPER-DOMAIN-EXTRACTION
    
    - New module domain.transformations.fk_helpers with enrich_helpers() and drop_helpers()
    - pipeline.steps factories now thin adapters delegating to domain entry points
    - Registry entries remain as plain factories (no StepRegistration target leak)
    - Direct domain-level tests for enrich_helpers/drop_helpers (15 cases)
    - Architecture drift guard: pipeline.steps must not contain FK-helper domain logic
    - All 56 FK-helper/pipeline/guard tests pass

commit 6f2a57bc8ddfb45286dd21ba77240e65244e88fb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 16 14:54:06 2026 +0200

    refactor(pipeline): normalize step registration binding

commit ac3cc4358b3e1127fc644815f61a1c9cae32b51c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 16 09:47:08 2026 +0200

    docs(backlog): add pipeline step registration normalization plan

commit 3a8a803b944a3d7f0c0a5a5d6756aeea98e5f1e7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Apr 16 08:16:44 2026 +0200

    docs(architecture): clarify linear pipeline payload boundary

commit 97b74843d915ca69b8eb8fff42dce35a02089fdf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 15 21:26:53 2026 +0200

    fix(fk-helpers): harden provenance cleanup and add follow-up FTRs

commit 32ebb1ec6034a22e5f3d7cd67107aac82f0ddba0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 15 20:42:34 2026 +0200

    feat(fk-helpers): implement derived helper provenance cleanup (FTR-FK-HELPER-PROVENANCE-CLEANUP)

commit d67916dfdef8cc3b728a59a05c6b14f43eb0cfab
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 15 20:38:57 2026 +0200

    docs(review): add review notes for FK helper provenance cleanup

commit 79d6099a03a80ecd0d6cd59c023a20f1fb3a32ee
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 15 15:59:12 2026 +0200

    Tighten FK helper provenance docs after review

commit 4360351da8a2eae42701d1d05b5d6a1d75008145
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Apr 15 15:38:14 2026 +0200

    Refine FK helper concept and add provenance cleanup FTR

commit c7a970c0a44df1c3c2e97e0cf13b0f8662c67613
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 19:31:48 2026 +0200

    docs: add FK helper metadata concept note

commit 1702d31017fa44bf1e652b10f5598bb5fac85330
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 18:20:51 2026 +0200

    fix(FTR-MULTI-HELPER-COLUMN): harden helper reordering

commit 966de43f438b75e74de33a21f23fc906f8574841
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 17:41:20 2026 +0200

    feat(FTR-MULTI-HELPER-COLUMN): support multiple FK helper columns

commit 5cd68808ca727c4cb4babbe052b37c64218bb018
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 17:25:51 2026 +0200

    docs: reorder phase 4a execution plan

commit 82a40b7b6804ecc8104f6c39f5e5c6903c4f6a3e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 17:15:28 2026 +0200

    docs: mark epics file as historical after b5

commit 7a0a501b85ec2424475ece0581ccef62043f1923
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 17:09:19 2026 +0200

    docs: refine phase 4 roadmap and nested JSON scope

commit 972473928efb3e89523c3517bd0a89320a741aa1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 16:51:43 2026 +0200

    docs: move completed b5 tickets to done

commit e2ecea1eae4c9b244f995eac0c470813c6291bb3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 14 16:40:30 2026 +0200

    docs: add release management runbooks and beta roadmap

commit d21358c28f00bbac40178aad061df6ee7f9cff94
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 14:15:02 2026 +0200

    test: avoid parser modularization module-name collision

commit 47847d63eb0ad0222d8097295931f26d2454d1ab
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 13:45:13 2026 +0200

    docs(FTR-SIMPLE-CLI-SHIMS-P6): align beta b5 milestone title

commit 9ef2f0ae14ad134502ebadc49c587a71927030ef
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 13:44:41 2026 +0200

    docs(FTR-SIMPLE-CLI-SHIMS-P6): capture deferred shim UX and beta scope

commit 286553284e98d031190bea931036f2197a4ac8df
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 13:31:01 2026 +0200

    docs(FTR-DEMO-REINTEGRATION): clarify demo run-path target

commit fae7ced82d7d28fd9052114ae47aa27b81268ef2
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 12:58:44 2026 +0200

    review(FTR-ODS-PARSER-ROBUSTNESS-P3K): pass

commit 1eec0f6fdcd3b825e80b913e2e7b8ab450d58a29
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 11:55:32 2026 +0200

    Add ODS parser robustness tests

commit dee6d238c4aa59aa3f7cab1f12525148181502d1
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 11:43:24 2026 +0200

    docs(backlog): adjust plan - move parts of the ODS adapter hardening down in the backlog

commit b8ea45d3a78652de7d230ba320150912ff312c26
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 11:28:46 2026 +0200

    docs(backlog): adjust plan - remove FTR-VALIDATION-PARITY-SEMANTICS-P3K as this issue was addressed in e413386

commit 8ec44f9bd56c75862f6183d7619008e2d9b7a64b
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 11:25:56 2026 +0200

    docs(backlog): adjust plan - remove FTR-VALIDATION-PARITY-SEMANTICS-P3K as this issue was addressed in e413386

commit 08b47057759872cf6dba7ed91c0801aab534f3a7
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 11:03:10 2026 +0200

    docs(backlog): integrate ods adapter hardening phase into backlog

commit 185ab87f808ab23198181c2734aabbc340a73c76
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 10:18:02 2026 +0200

    Update backlog after Phase 3j completion

commit e4133863ec8c5c5b7d772027795fea9e5ed6f701
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 10:03:29 2026 +0200

    Clarify validation formula semantics

commit e9676e60d13d00d6db122049079e341f871d2f2c
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 10:02:03 2026 +0200

    Add ODS/XLSX parity test coverage

commit a402165d624f77bcf40ac23265dce83732aba4ed
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 08:36:04 2026 +0200

    Soften parser modularization architecture guards

commit 78edd9d6e719d2b49d8896fe8966ba8c2fa77aa1
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Apr 14 08:03:48 2026 +0200

    feat(FTR-ODS-CALC-ADAPTER-IMPLEMENTATION-P3J): land first ODS/Calc spreadsheet adapter
    
    Add the first non-XLSX spreadsheet backend on top of the stabilized spreadsheet contract. The ODS/Calc path now participates in the same Frames <-> WorkbookIR <-> RenderPlan <-> workbook file seam that Phase 3h/3i prepared for XLSX.
    
    The implementation adds a dedicated ODS backend, parser and renderer, wires the backend into the first-party backend registry, and exposes both ods and calc through the router/factory surface. The parser reconstructs hidden _meta payloads, visible sheets, named ranges, list validations and autofilter carriers into WorkbookIR. The renderer executes the backend-neutral RenderPlan into ODS elements, including hidden sheets, named ranges, list validations, merges, current header/helper style operations and best-effort freeze settings.
    
    This commit also answers the review follow-ups directly in code. The ODS read path now has a local parser_interpretation seam so carrier-near ODF extraction and spreadsheet-semantic interpretation no longer live in one monolithic parser file. Freeze settings emission is slightly hardened by coalescing per-sheet freeze entries into a single ooo:view-settings block. The router/factory alias language is made consistent by teaching the router to understand calc as well as ods.
    
    Test coverage is expanded around the review hotspots: ODS adapter roundtrip checks, parser modularization guards, renderer support guards for freeze settings, merged headers and style carriers, router alias coverage, and boundary guards that keep the ODS modules on the intended spreadsheet contract seams. The FTR implementation and review note are moved to the done backlog, while the follow-up parity/gap work remains explicitly open under FTR-ODS-CALC-PARITY-TESTS-P3J.

commit b8fe522bfe0168938f937cb477fdb052c3a9c31a
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Apr 13 21:36:42 2026 +0200

    docs(FTR-ODS-CALC-CONTRACT-MAPPING-P3J): map initial ODS/Calc capability profile

commit 6c9cb5cc77995a16d2e5a80ac0c403f5142c18e8
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Apr 13 20:55:48 2026 +0200

    docs(backlog): close completed 3h and 3i ftrs
    
    Add the missing review disposition for FTR-XLSX-PARSER-MODULARIZATION-P3I, mark completed 3h/3i FTRs as done, and move their FTR and review files from open to done so Phase 3j can start from a cleaner backlog state.

commit 478472d1a2a08633fa637679759c0d58538e0706
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Apr 13 20:34:39 2026 +0200

    test(FTR-SPREADSHEET-SEMANTIC-INVARIANTS-P3I): separate durable semantic invariants
    
    Separate current-state spreadsheet meta checks from durable cross-adapter semantic invariants. Document the new test taxonomy in the architecture notes and record the implementation disposition in the FTR review file.

commit 84fe1d6c026f2cae025e511889b96075c5f783e7
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Apr 13 17:30:27 2026 +0200

    test(FTR-META-REGISTRY-HARDENING-P3I): harden manual meta registry guards
    
    Systematize the manual meta registry with explicit classifications, maintenance rules, and stronger drift checks. Document the hardening trade-off explicitly in the FTR review note and keep the checks outside the product runtime path.

commit e595151cbabd974e8c702ed53844b7c6a5d3dca9
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Apr 13 12:44:23 2026 +0200

    docs(ai-policy): consolidate agent entry points and commit guidance
    
    Add thin root entry points for AI agents and move canonical repo-committing guidance into the internal guide. Also tighten commit-message expectations and refresh the schematic umbrella-FTR example for clearer backlog archaeology.

commit a01cf55e465b347d356c5cfd9641e144edabd40b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 19:20:24 2026 +0200

    chore(io): close boundary guard review

commit a31563bd8b77b7e96a8cf301784847ec1072084b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 18:54:55 2026 +0200

    test(io): add spreadsheet boundary guards

commit 665ed7a89d108f13e32c5e6aaf46d550bee24cda
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 18:53:17 2026 +0200

    docs(backlog): mark parse contract complete

commit 3506519954757c13d3f9c2661e15f4069596d8f8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 15:04:55 2026 +0200

    refactor(io): modularize xlsx parser interpretation

commit 6133f39ea8303cdcc0b80972a0143bf085dc4da4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 15:00:55 2026 +0200

    feat(io): harden spreadsheet parse contract

commit 1ac87dcfe78008d54f3723cfb7f0bbf8a599aa68
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Apr 12 11:24:19 2026 +0200

    docs(backlog): refine phase 3i and 3j follow-ups

commit 51111ee985797fb1b5d4da448e4017c954bbc5b0
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Apr 11 21:16:17 2026 +0200

    docs(backlog): add spreadsheet parse contract follow-up

commit 4e5014a65b0f7c8bbbc512371dfcb5becabc8f61
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Fri Apr 10 16:25:58 2026 +0200

    refactor(xlsx): move parser behind adapter boundary

commit cbb3fbb0311457e3b3f717d96eee2e6c386737f8
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Fri Apr 10 15:14:42 2026 +0200

    feat(meta): add manual spreadsheet meta registry

commit 04fe7c245f6ef56435ba0d296383ec32e09ba8c0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 7 10:00:44 2026 +0200

    docs(architecture): define spreadsheet meta semantics
    
    Implement the first architecture slice of FTR-SPREADSHEET-META-SEMANTICS-P3H by adding a dedicated spreadsheet meta semantics note, tightening the wording around canonical vs render-driving spreadsheet semantics, and documenting the remaining transition areas explicitly.
    
    The new architecture note records where spreadsheet semantics currently live across meta_canonical, meta_rendering/WorkbookIR, and RenderPlan. It also distinguishes more clearly between normative contract, current write-path behavior, and quarantined adapter-near representations such as WriteMeta carriers or validation formulas.
    
    The review note for this FTR is included next to the backlog item and the open backlog now references it directly. The review's main follow-up was adopted in scope: the note now marks current-state statements more explicitly, carrier-near details are framed as transition forms, and the current tests are named and described more honestly as smoke/presence checks where appropriate. Broader hardening remains intentionally deferred to Phase 3i guardrails rather than spawning a new Phase 3h FTR.
    
    Focused rendering tests are added for the hidden workbook payload carrier, non-layout spreadsheet semantics reaching the render plan, sheet-level override precedence over workbook defaults, and the distinction between canonical validation rules and derived adapter-facing formulas.
    
    Refs: FTR-SPREADSHEET-META-SEMANTICS-P3H
    
    Review: docs/internal_guide/backlog/ftrs/open/FTR-SPREADSHEET-META-SEMANTICS-P3H_review.adoc
    
    Tests: .venv/bin/pytest tests/unit/rendering/test_spreadsheet_meta_semantics.py -q

commit ab9b28cb0a1bf076c335855e4614d8588ab3fec6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 7 09:46:47 2026 +0200

    refactor(io): extract spreadsheet backend contract
    
    Implement the first production slice of FTR-SPREADSHEET-BACKEND-CONTRACT-P3H by pulling spreadsheet-generic orchestration behind a narrow adapter-facing contract and rewiring the XLSX adapter onto that boundary.
    
    This introduces a dedicated spreadsheet contract module with a generic write-path facade from frames plus canonical metadata to RenderPlan and a matching read-path facade from a format-specific parser back to frames. The XLSX adapter now stays at a thin format-specific entry layer: it calls the spreadsheet contract, then delegates only to the openpyxl parser/renderer modules.
    
    The surrounding architecture is updated to make that boundary explicit. generic_ir and ADR-006 now describe the spreadsheet backend contract and the intended dependency direction, and the open backlog references the dedicated review note for this FTR. The existing review is kept next to the FTR because it captures the remaining work as naming and module-hygiene follow-up rather than as a missing contract extraction.
    
    Focused tests are updated accordingly. The XLSX call-chain tests now guard the new contract entry points for both write and read paths, and the IR architecture clarity test is lifted from the old compose/pass/build sequence to the new spreadsheet-contract boundary.
    
    Refs: FTR-SPREADSHEET-BACKEND-CONTRACT-P3H
    
    Review: docs/internal_guide/backlog/ftrs/open/FTR-SPREADSHEET-BACKEND-CONTRACT-P3H_review.adoc
    
    Tests: .venv/bin/pytest tests/unit/io_backends/xlsx tests/unit/io_backends/test_router.py tests/unit/rendering/test_ir_architecture_clarity.py -q

commit ded2a5c178fbc21e21e5a4595d83d464b54f5448
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Apr 7 08:50:24 2026 +0200

    docs(backlog): record IR clarity review follow-up
    
    Refine the FTR-IR-ARCHITECTURE-CLARITY-P3H follow-up by documenting the review outcome, tightening the hidden-meta invariant test, and making the review path visible in the open backlog.
    
    The new review note next to FTR-IR-ARCHITECTURE-CLARITY-P3H records both the external review and the project-specific disposition of its findings. It now also documents that the one direct follow-up accepted for the current FTR has already been implemented: the invariant test no longer clears all hidden sheets but removes only the persisted canonical payload on the hidden _meta sheet.
    
    The open FTR backlog now references the dedicated review note from the Phase 3h entry and keeps stronger write-path and parse-path guardrails explicitly scoped to Phase 3i. This helps keep the current Clarity FTR narrow while still preserving the review trail and the follow-up discipline for later phases.
    
    Refs: FTR-IR-ARCHITECTURE-CLARITY-P3H
    
    Review: docs/internal_guide/backlog/ftrs/open/FTR-IR-ARCHITECTURE-CLARITY-P3H_review.adoc
    
    Tests: .venv/bin/pytest tests/unit/rendering/test_ir_architecture_clarity.py -q

commit 658065104742b61759886b815b8ed3a7bcd99d7b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 6 22:25:20 2026 +0200

    test(rendering): add IR architecture clarity guardrails
    
    Implement the first executable guardrails for FTR-IR-ARCHITECTURE-CLARITY-P3H and align the surrounding architecture notes with the active spreadsheet render chain.
    
    The new test file fixes the write-path boundary in executable form. Generic rendering modules are checked for accidental imports of xlsx/openpyxl details, the visible render result is asserted to stay stable after canonical payload has already been materialized into IR state, canonical metadata is required to roundtrip independently of render annotations, and the XLSX backend is pinned to the compose -> passes -> build_render_plan -> render_workbook chain.
    
    The architecture note on generic IR is extended with the currently defined parse direction and with naming rules for generic spreadsheet layers versus adapter-specific code. ADR-006 is rewritten to reflect the current render chain, key types, pass conventions, and the intended split between persisted canonical payload and render-driving IR state.
    
    This keeps the first FTR concrete: document the boundary, make the active path explicit, and add tests that fail when the adapter boundary or spreadsheet-neutral layer discipline drifts.
    
    Tests: .venv/bin/pytest tests/unit/rendering/test_ir_architecture_clarity.py -q

commit 14043b6cb037074822cb8dd242d133fec85f3c0e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 6 21:50:43 2026 +0200

    chore(tools): restore executable bits on helper scripts
    
    Mark the helper shell scripts in tools/ as executable again.
    
    This commit only records file mode changes (100644 -> 100755) for the affected scripts so they can be invoked directly from the shell.
    
    No content changes.

commit cb838b2aad2d1dee06e35446f73bd1d2b9741785
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Apr 6 21:47:49 2026 +0200

    docs(architecture): clarify canonical vs rendering meta flow
    
    Refine the spreadsheet write-path documentation and Phase 3h backlog around the new split between canonical metadata and render-driving metadata.
    
    This commit adds a dedicated architecture note that describes the problem behind the current shared meta space, introduces the meta_canonical / meta_rendering distinction, and records the intended write-path invariants. It also wires that note into the architecture index so the concept is part of the internal architecture handbook instead of remaining an isolated draft.
    
    On the backlog side, the IR architecture and spreadsheet meta semantics FTRs now explicitly cover the write-path split, executable invariants, and the broader role of meta_rendering beyond visual layout. A new FTR-META-REGISTRY-P3H is added as a deliberate explikation step: first build a manual registry with behaviour profiles, then derive later follow-up work from that inventory instead of freezing automation too early.
    
    The phase overview is updated accordingly: Phase 3h now settles contracts, invariants, and the first manual registry before concrete second-adapter work proceeds; Phase 3i may later add registry consistency checks and lightweight tooling, but deeper follow-ups such as registry-backed IR resolvers or a typed meta model stay intentionally unsplit until the concepts have stabilized.
    
    This keeps LibreOffice Calc / ODS adapter work downstream of the architectural clarification rather than letting a second adapter force the shape of the model prematurely.
    
    No runtime behavior change.

commit 2084fe5bdf6933dd0967f06de7fdb0062db69344
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 4 15:26:03 2026 +0200

    test(FTR-RUN-PATH-SHEET-OVERRIDES-P3G): expand override coverage

commit c79486055b2ac66c42f29b39a715e6beba733b94
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Apr 4 12:07:09 2026 +0200

    docs(dev): note venv stamp recovery workflow

commit 51e7c106af20ea96024cf4ac123618599dacddec
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 21:35:12 2026 +0200

    test(FTR-RUN-PATH-SHEET-OVERRIDES-P3G): verify run path overrides regression

commit 500d4db4d8c67b8aea989bed35f0dd3b4c650078
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 21:17:17 2026 +0200

    test(FTR-RUN-PATH-SHEET-OVERRIDES-P3G): cover run path sheet overrides

commit d60c65be69c13d3cac324500765c975aee9c60ea
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 20:44:39 2026 +0200

    docs(backlog): defer concrete ods planning until post-3h

commit e3017d1acfc4b02b797bfb3f1d11fb86128314c3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 20:41:00 2026 +0200

    docs(backlog): reserve 3i and refine follow-up docs

commit 1c338c74d83d237e6db8f036e7f2a75234648950
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 20:25:00 2026 +0200

    docs(dev): document shared tooling sync workflow

commit affc50227843227529e2fa6dfde72e97eaef39fd
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Apr 3 20:18:19 2026 +0200

    docs(backlog): refine cli deprecation and spreadsheet 3h planning

commit f79ede09af8283131817f389bc7ecf89da0ed1b8
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 20:32:01 2026 +0200

    docs(backlog): add validation mode alias follow-up

commit 895fc0932fb906a89aa6f08432521b79233b0431
Merge: 2e9bb58 83f3575
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 19:47:30 2026 +0200

    Merge feature/move-orchestrator-to-application into dev

commit 83f3575abbede19e19e3c4f7e68fb08b5fe92d19
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 19:47:22 2026 +0200

    refactor: move orchestrator.py into application/ package
    
    - Create src/spreadsheet_handling/application/ package
    - Move orchestrator logic to application/orchestrator.py
    - Keep backward-compat shim at old location (re-exports)
    - Update all internal imports (CLI apps + tests)
    - Remove empty engine/ directory
    
    All 274 tests pass. CLI API and YAML configs unchanged.

commit 2e9bb5860853ea0f5720d19f1ffa530b4a23689e
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 17:45:56 2026 +0200

    fix(FTR-RUN-PATH-SHEET-OVERRIDES-P3G): honor workbook sheet defaults in run path

commit a9a7ad063065c698e95454386b41858d7a0d0f5f
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 17:35:22 2026 +0200

    docs(backlog): track run-path sheet override defect

commit e1626b9178af2770b89eaf1c571826b7d548b7b9
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 14:58:17 2026 +0200

    docs(backlog): add Phase 3g CLI consolidation FTR

commit 3bdbd7e42186b04369ca5212c85d7b5be10d5969
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 12:15:51 2026 +0200

    chore(docs): remove accidental pipeline puml files

commit e2ca99a752a9efd9f01e2e355e1f2fcadeb85572
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Thu Apr 2 12:03:03 2026 +0200

    fix(FTR-DEMO-FREEZE): restore dotted plugin schema

commit 62d87413f18c82de671127a8884352187e8dfa51
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 20:36:32 2026 +0200

    docs(git): define feature branch workflow for AI-assisted work

commit d1fc930cba7cf923fb49f2a8df9fc59f034e40a3
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 20:22:39 2026 +0200

    Complete Phase 3f I/O cleanup

commit 9180c15ea2459839bbd0f9e7dfaeafa4f5a9dc28
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 17:26:40 2026 +0200

    backlog: add Phase 3f -- I/O Infrastructure Cleanup (2 FTRs)
    
    Code review identified remaining defensive I/O patterns:
    - FTR-IO-COMPAT-REMOVAL-P3F: dual-order sigs, TypeError fallbacks, _coerce_options
    - FTR-ROUTER-DECLARATIVE-P3F: try/except imports -> direct registration
    
    Reviewed and filtered 10 proposed FTRs down to 2 actionable ones.
    3 already covered by existing backlog (DOMAIN-CONSOLIDATION, BACKEND-ABC, P3E).
    5 rejected as premature (WorkbookFrames, compat/ module, Step simplification,
    IR meta classes, generic fail-fast policy).

commit 252fc3486900c39b55fc1c76f5be1e4cb1586deb
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 17:01:06 2026 +0200

    backlog: Phase 3d complete -- move TYPING-CONSISTENCY to done

commit 293a6703de499f917c9d9f151965c123fe137614
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 16:59:35 2026 +0200

    FTR-TYPING-CONSISTENCY-P3D: add missing type annotations across layers
    
    Core layer:
    - refs.py: type add_helper_columns, write_vlookup_formula params
    - flatten.py: type flatten_json params (obj, parent, sep)
    - unflatten.py: type set_nested, row_to_obj, df_to_objects params
    
    Domain layer:
    - validate_columns.py: type add_validations(frames, rules) -> Frames
    
    Rendering layer:
    - passes/__init__.py: type apply_all(ir, meta) -> WorkbookIR
    - passes/style_pass.py: type apply(ir, meta) -> WorkbookIR
    
    Design decision: domain and io_backends keep local Frames aliases
    to avoid cross-layer imports (domain must not depend on pipeline).
    Canonical Frames in pipeline/types.py remains the reference definition.
    
    252 tests pass

commit c9400bded16e5e5dff4415e559aeff423b72c658
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:59:52 2026 +0200

    backlog: Phase 3e complete -- move all 3 FTRs to done

commit a9d19822cffc0b6a8357a91b2b37dd2c3b022dfd
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:58:28 2026 +0200

    FTR-DEPRECATED-ADAPTER-REMOVAL-P3E: remove deprecated backend stubs
    
    - Delete excel_xlsxwriter.py (deprecated shim with DeprecationWarning)
    - Delete ods_backend.py (never-implemented stub)
    - __init__.py: remove ODSBackend from _BACKENDS registry and __all__
    - pyproject.toml: remove ods_backend.py from coverage omit
    - test_adapter_deprecation_stubs.py: remove ODS/xlsxwriter tests,
      add test that make_backend('ods') now raises ValueError
    
    252 tests pass (8 deprecated-stub tests removed)

commit 447a2763cbcf4daca0ed973ac9ae53f2aa7587c5
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:50:07 2026 +0200

    FTR-ZOMBIE-IMPORT-CLEANUP-P3E: fix dead imports and cross-layer violations
    
    - json_backend.py: remove try/except zombie import of BackendOptions
      from pipeline.types (always failed; real import from .base on line 21)
    - helpers.py: remove cross-layer import from pipeline.types (domain->pipeline
      violation); keep local Frames/Step type aliases that shadowed it anyway
    - orchestrator.py: import directly from pipeline.registry and pipeline.types
      instead of through the backward-compat facade pipeline.pipeline
    - xml_backend.write_xml_dir(): standardize to (frames, path) signature,
      drop dual-order (path,frames)|(frames,path) type-sniffing hack
    
    260 tests pass

commit 19b07abd85a99618326255faa13a396e398d576a
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:47:53 2026 +0200

    FTR-ENGINE-RETIREMENT-P3E: remove dead engine/ package, consolidate config
    
    - Delete engine/__init__.py, engine/config.py, engine/orchestrator.py
      (Engine class had zero importers; EngineConfig/SheetMeta never used)
    - pipeline/config.py: remove try/except zombie import from engine.config;
      dataclass definitions are now the sole canonical config types
    - 260 tests pass

commit 90dddee72acdc1ff2c249c175a71082d912cd32c
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:41:42 2026 +0200

    backlog: add Phase 3e -- Shim & Dead-Code Removal (3 FTRs)
    
    Code review findings after P3d:
    - FTR-ENGINE-RETIREMENT-P3E: engine/ package dead (zero importers)
    - FTR-ZOMBIE-IMPORT-CLEANUP-P3E: dead imports, cross-layer violations
    - FTR-DEPRECATED-ADAPTER-REMOVAL-P3E: remove deprecated adapter stubs
    
    Also deferred FTR-TYPING-CONSISTENCY-P3D until after P3e.

commit a251f325c1be154512b50e935ee1eacf45457571
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:05:07 2026 +0200

    backlog: move FTR-MODULE-SPLIT-CLEANUP-P3D to done

commit 09c28afed55489d844c68c8f6df776ac136d76a0
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 15:03:53 2026 +0200

    FTR-MODULE-SPLIT-CLEANUP-P3D: split pipeline.py into types/steps/registry
    
    pipeline.py (446 lines, 5 concerns) split into:
    - types.py: canonical Frames, Step, BoundStep, StepSpec
    - steps.py: all 12 step factories + _resolve_callable
    - registry.py: REGISTRY dict, run_pipeline, build_steps_from_config/yaml
    - pipeline.py: backward-compat facade (re-exports only)
    
    Also fixed:
    - runner.py: imports from .registry instead of .pipeline
    - test_xlsx_writer_styling.py: removed MetaDict/Context (orphaned types)
    
    260 tests pass.

commit 3b1a5f23a8f137a09d7f2173e2f251fe6d242d31
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 14:49:20 2026 +0200

    FTR-PREHEX-TEST-CONSOLIDATION-P3C: classify and migrate legacy_pre_hex tests
    
    Classification results (23 test files):
    - PROMOTE (5): moved to active suite unchanged
      - test_indexing_multiindex_unit.py -> tests/unit/core/
      - test_order_stability.py -> tests/unit/core/
      - test_csv_backend.py -> tests/unit/io_backends/
      - test_pipeline_basic.py -> tests/unit/pipeline/
      - test_pipeline_yaml.py -> tests/unit/pipeline/
    - REWRITE (13 tests in 2 new files):
      - test_fk_edge_cases.py: custom id_field, mixed types, multi-targets,
        missing label, duplicate-ids last-wins, parentheses guard (7 tests)
      - test_validate_modes.py: duplicate_ids fail/warn, missing_fk
        fail/warn/ignore, detect_fk toggle (6 tests)
    - RETIRE (18 test files):
      - test_libre_smoke.py (placeholder)
      - 10x old sheets_pack CLI tests (obsolete entry points)
      - 5x old Engine direct-method tests (replaced by pipeline steps)
      - conftest.py + README.md (empty directory artifacts)
    
    legacy_pre_hex/ directory is now empty and can be deleted.
    260 tests pass (was 240, +20 new rewritten tests).

commit 3af27c27f59c6a73d3816acc5fbd005fa3e3d995
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 12:54:30 2026 +0200

    backlog: remove dangling Phase 3b includes from _ftrs_open, drop duplicate VALIDATION-PASS-INFRA

commit bd5a0f8616fe5bb07e0c538503d0e2c85c44cdcb
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 12:46:56 2026 +0200

    FTR-ARCHITECTURE-DOC-POST-3B: post-3b architecture documentation
    
    - Updated ARCH-LAYERS.adoc to reflect implemented architecture:
      - Pipeline section: REGISTRY/step-factory pattern, direct core calls, Engine shim
      - Domain section: sub-packages (transformations, validations), Finding model
      - New Core layer section (3b): leaf-level pure utility functions
      - Render IR section: composition flow and pass ordering
      - Layer Dependency Overview: ASCII diagram + rules
      - New: Validation Findings and Severity Policy section
      - New: FK-Helper feature slice across all layers
    - Moved 4 Phase 3b FTRs from open/ to done/
    - Updated _ftrs_open.adoc (Phase 3b completion summary)
    - Updated _ftrs_done.adoc (Phase 3b includes appended)
    
    Phase 3b complete (4/4 FTRs).

commit ae5518b3ef2d0ba50203e6b2286dbeff6bfc6b54
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 11:37:19 2026 +0200

    FTR-VALIDATION-FINDINGS-P3B: shared Finding + severity policy
    
    - New domain/validations/findings.py: Finding dataclass, Severity type,
      SeverityPolicy dict, resolve_severity(), apply_severity_policy()
    - Refactored fk_helpers.py: FKFinding -> Finding alias, .kind -> .category
    - Refactored pipeline.py: make_validate_step and make_check_fk_helpers_step
      now delegate to domain check functions + apply_severity_policy
    - Removed ~50 lines of inline validation logic from pipeline.py
    - Removed unused imports (FKDef, has_level0, level0_series) from pipeline.py
    - 10 new tests for severity policy (test_findings.py)
    - Updated 12 existing tests (.kind -> .category)
    - 240 tests pass

commit fd8afa9717117fceb368f7fc574cf743e1d84b15
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 11:19:11 2026 +0200

    FTR-FK-HELPER-REFACTOR-P3B: domain validation layer for FK helpers
    
    - Create domain/validations/fk_helpers.py with pure validation functions:
      check_duplicate_ids, check_unresolvable_fks, check_unexpected_helpers,
      check_missing_helpers, check_helper_values, validate_fk_helpers
    - Introduce FKFinding dataclass (typed, frozen) with structured kind/detail
    - All validations are stateless pure functions returning List[FKFinding]
    - Add make_check_fk_helpers_step pipeline factory (mode: ignore/warn/fail)
    - Register 'check_fk_helpers' in pipeline REGISTRY
    - Fill test_fk_check.py placeholder: 12 tests covering all 5 finding kinds
    - Fill test_fk_helpers_enrich.py placeholder: 4 tests for pure domain
      FK enrichment (build_registry → detect → apply as pure functions)
    - mypy: 0 errors
    - pytest: 230 passed (+16 new)

commit db9240dc431cec098c395c307371ee5d21354e84
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 11:03:48 2026 +0200

    FTR-PIPELINE-CONSOLIDATION-P3B: decouple pipeline from Engine
    
    - Rewire make_validate_step to call core/fk.build_registry,
      build_id_label_maps, detect_fk_columns directly (no Engine)
    - Rewire make_apply_fks_step to call core/fk functions directly
    - Remove 'from ..engine.orchestrator import Engine' from pipeline.py
    - Pipeline now imports core/fk and core/indexing directly
    - Reduce Engine to backward-compat shim delegating to core/fk
    - Engine._build_registry/id_label_maps now thin wrappers
    - Simplify Engine FK iteration (use FKDef NamedTuple directly
      instead of duck-typed dict/object branching)
    - Engine kept for legacy_pre_hex tests only
    - pytest: 214 passed

commit 799d0b75b9399b287da032099e452ff3f29e560d
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 09:06:20 2026 +0200

    chore(backlog): Phase 3a complete — move 9 FTRs to done/
    
    Move remaining Phase 3a feature tickets to ftrs/done/:
      META-PERSISTENCE, PARITY-IR-P3, IR-READPATH, NAMED-RANGES,
      CLI-DEFAULT-PIPELINES, IR-SHIM-CLEANUP, ADAPTER-DEPRECATION-STUBS,
      CLEANUP-IR-P4, IR-TYPING-CANONICAL
    
    Update _ftrs_open.adoc: replace Phase 3a includes with completion
    summary. Update _ftrs_done.adoc: append all 9 FTR includes.
    
    Phase 3a is now fully closed (11/11 FTRs).

commit ed34cfbeaee82d8ed2815f2a5ab4ab7d105ee429
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 08:56:04 2026 +0200

    FTR-IR-TYPING-CANONICAL: typed renderer, remove top_left, mypy clean
    
    - Rewrite openpyxl_renderer.py: replace all duck-typed dispatch
      (getattr/type().__name__/hasattr) with isinstance checks against
      typed RenderOp dataclasses from plan.py
    - render_workbook() now accepts RenderPlan (typed) instead of Any
    - Remove SetCell/WriteCell/FreezeBelowHeader/FreezePane/AutoFilter/
      AddMetaSheet dead-code branches (only canonical op types remain)
    - Remove debug print statements from renderer
    - Remove deprecated TableBlock.top_left field and __post_init__ shim
    - Fix test_ir_model.py to use canonical top/left kwargs
    - Change SheetIR.meta type from Dict[str,object] to Dict[str,Any]
    - Fix MetaPass.minimal_fields typing (Optional[List[str]])
    - Fix ValidationPass variable shadowing for mypy
    - Fix parse_ir return type annotation
    - Add py.typed marker for PEP 561 compliance
    - Add [tool.mypy] config to pyproject.toml (mypy_path=src, pandas/
      openpyxl overrides)
    - mypy: 0 errors on 17 checked source files
    - pytest: 214 passed

commit da587076e498464456995f6e6040b0b865dd4b90
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 08:27:56 2026 +0200

    FTR-CLEANUP-IR-P4: remove legacy XLSX path, IR is now sole backend
    
    Removed:
    - Legacy write path (pandas ExcelWriter + _decorate_workbook)
    - Legacy read path (_read_multi_legacy)
    - All legacy helpers: _decorate_workbook, _find_col_index_by_header,
      _apply_xlsx_validations, _flatten_header_to_level0, _flatten_cols_for_excel
    - SH_XLSX_BACKEND env var dispatch and use_ir_backend option
    - xlsx_openpyxl.py (old plan-based renderer)
    - test_parity_ir_p3.py (replaced by test_ir_golden.py)
    - test_smoke_both_backends.py (parametrized legacy/ir)
    - xlsx_ir / xlsx_legacy pytest markers from pyproject.toml
    - Backend selector fixture from conftest.py
    - All monkeypatch.setenv SH_XLSX_BACKEND calls from 11 test files
    
    Added:
    - test_ir_golden.py: 12 IR-only golden structural tests
    
    ExcelBackend now unconditionally uses compose -> passes -> plan -> render.
    214 passed.

commit 5817d0ea4c1cb3661c862796326a3c80cfe5f3c8
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 08:02:44 2026 +0200

    FTR-ADAPTER-DEPRECATION-STUBS: typed errors for deprecated adapters
    
    Added:
    - DeprecatedAdapterError in io_backends/errors.py (subclass of NotImplementedError)
    - ODSBackend now raises DeprecatedAdapterError with migration hint
    - excel_xlsxwriter warns on import and provides _raise() helper
    - ODS registered in make_backend() factory
    - 11 smoke tests asserting error contract per stubbed adapter
    
    Removed:
    - Empty xlsx/adapter.py (unused stub)
    
    228 passed, 1 skipped.

commit 3f64ce777417fb713c6dcabad505466d84b790ee
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 07:51:21 2026 +0200

    chore: gitignore out.adoc and input.json (AI interface transit files)

commit 8b27b248439593ec4e63839673812a01a34299ff
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 07:49:08 2026 +0200

    backlog: insert Phases 3b, 3c, 3d between IR stabilization and feature expansion
    
    Phase 3b - Pipeline & Orchestration Consolidation:
      - FTR-PIPELINE-CONSOLIDATION-P3B
      - FTR-FK-HELPER-REFACTOR-P3B
      - FTR-VALIDATION-FINDINGS-P3B
      - FTR-ARCHITECTURE-DOC-POST-3B
    
    Phase 3c - Test Consolidation:
      - FTR-PREHEX-TEST-CONSOLIDATION-P3C (supersedes FTR-PREHEX-TEST-RETIRE)
    
    Phase 3d - Code Quality & Maintainability:
      - FTR-MODULE-SPLIT-CLEANUP-P3D
      - FTR-TYPING-CONSISTENCY-P3D
    
    Phase 6 dedup:
      - FTR-PREHEX-TEST-RETIRE: marked superseded by P3C
      - FTR-DOMAIN-CONSOLIDATION: scope-narrowing note (3b is prerequisite)
      - FTR-BACKEND-ABC: dependency on FTR-ADAPTER-DEPRECATION-STUBS
    
    Renamed Phase 3 -> Phase 3a for clarity.

commit d7a3e45b72856cc4d35008a079b8f7304b275fef
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 00:12:04 2026 +0200

    chore: add scratch/ to .gitignore for parallel untracked work

commit 7c065b0099ff4c203aee880977fbb71ae7349df1
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Tue Mar 31 00:08:08 2026 +0200

    FTR-IR-SHIM-CLEANUP: remove deprecated compatibility shims
    
    Removed dead code:
    - _apply_plan_to_existing() from xlsx_backend.py
    - render_workbook_ir_legacy() and helpers from xlsx_openpyxl.py
    - _render_from_ir() from openpyxl_renderer.py
    - compose_ir() from flow.py (prior session)
    - render_plan alias from openpyxl_renderer.py (prior session)
    
    render_workbook() now only accepts RenderPlan (.ops).
    
    Updated tests:
    - test_openpyxl_renderer_stub.py: uses build_render_plan
    - test_ir_render_flow_p1.py: uses compose_workbook + apply_all
    - test_validation_pass_infra.py: cleaned stale imports
    
    217 passed, 1 skipped.

commit d17f79538b09a67af8c731714fe2a528f24d0ec4
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 23:35:34 2026 +0200

    feat(cli): default pipeline for sheets-pack with bootstrap_meta (FTR-CLI-DEFAULT-PIPELINES)
    
    sheets-pack now runs bootstrap_meta(auto_filter=true, freeze_header=true) by default.
    New flags: --config (override defaults), --no-defaults (suppress pipeline).
    sheets-unpack unchanged (backward compatible).
    
    5 new tests: default steps, --no-defaults, --config override, end-to-end styling.
    217 tests green.

commit b79a9df880e9591d9bb4e8952842ecd3a844f89a
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 23:22:49 2026 +0200

    feat(ir): auto-generate named ranges per TableBlock (FTR-NAMED-RANGES)
    
    NamedRangePass generates 3 stable named ranges per table: _table, _header, _body.
    DefineNamedRange RenderOp + openpyxl renderer handler (wb.defined_names).
    parse_ir extracts named ranges from XLSX on read.
    SheetIR.named_ranges field added.
    
    9 new tests: pass logic, plan emission, XLSX roundtrip.
    212 tests green.

commit cb045805db842498b5f0c2878dd228ac987ff32d
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 23:07:13 2026 +0200

    feat(ir): XLSX read via IR pipeline with data extraction (FTR-IR-READPATH)
    
    parse_ir: _parse_table_block now extracts data cells into tbl.data.
    parse_ir: new workbookir_to_frames() converts WorkbookIR -> Dict[str, DataFrame].
    xlsx_backend: read_multi() dispatches to IR path when SH_XLSX_BACKEND=ir.
    Legacy read path refactored into _read_multi_legacy().
    
    10 new tests: data extraction, IR->frames conversion, JSON->XLSX->JSON roundtrip.
    203 tests green.

commit b100e2d3f2fd3a50d282747abb94d58ba2403dc2
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 22:57:58 2026 +0200

    test(parity): structural parity suite legacy vs IR XLSX backend (FTR-PARITY-IR-P3)
    
    22 parity tests comparing normalized structural equivalence:
    - Sheet names/order, data cell values, header styles (bold+fill),
      AutoFilter, freeze panes, data validations, hidden _meta sheet.
    - Side-by-side comparison tests verify legacy == IR for shared features.
    - Makefile target: make test-parity (TZ=UTC, LC_ALL=C, PYTHONHASHSEED=0).
    
    193 tests green (1 skip: legacy freeze not meta-driven).

commit ada93e8c248ab6ef856d9762469ef618100fbda1
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 22:42:40 2026 +0200

    feat(meta): persist meta across XLSX and JSON backends (FTR-META-PERSISTENCE)
    
    XLSX read: extract hidden _meta sheet via parse_ir, exclude from data frames.
    JSON write: skip _meta from data files, write _meta.yaml sidecar.
    JSON read: load _meta.yaml sidecar if present.
    
    10 new tests covering JSON sidecar, XLSX meta, and cross-backend roundtrip.
    172 tests green.

commit 702ab1c07a255b7f1f6afb7692e3213d29771985
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 22:22:19 2026 +0200

    feat(ir): emit WriteDataBlock ops for fully IR-driven XLSX write (FTR-IR-DATA-CELLS)
    
    - New WriteDataBlock op in plan.py (sheet, r1, c1, data as tuple of tuples)
    - TableBlock.data field stores row-major cell data from compose_workbook
    - build_render_plan emits WriteDataBlock per table
    - openpyxl_renderer handles WriteDataBlock: writes cells directly
    - xlsx_backend IR path simplified: compose -> passes -> plan -> render_workbook
      (pandas ExcelWriter pre-write and _apply_plan_to_existing removed from IR path)
    - test_ir_call_chain updated for new call sequence
    - 7 new tests in test_ir_data_cells.py
    - 161 tests green
    - FTR moved to done

commit 314e604f6abd30e5ffeb665d0b0aca394ed743df
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 21:51:55 2026 +0200

    feat(demo): freeze demo repo and add consumer smoke tests (FTR-DEMO-FREEZE)
    
    - Demo README updated with freeze notice and version pin (0.1.0b4)
    - 3 consumer smoke tests in tests/integration/test_consumer_smoke.py:
      * import surface (load_app_config, run_pipeline, build_steps_from_config, orchestrate)
      * JSON-to-JSON roundtrip
      * JSON-to-XLSX roundtrip
    - FTR moved to done
    - 154 tests green

commit 89a01c2709fa6cd6abf6af6e7c6feb118097d60f
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 21:36:21 2026 +0200

    docs(backlog): reorder Phase 3 FTRs by dependency chain
    
    Execution order decided 2026-03-30:
    1. DEMO-FREEZE, 2. IR-DATA-CELLS, 3. META-PERSISTENCE,
    4. PARITY-IR-P3, 5. IR-READPATH, 6. NAMED-RANGES,
    7. CLI-DEFAULT-PIPELINES, 8. IR-SHIM-CLEANUP,
    9. ADAPTER-DEPRECATION-STUBS, 10. CLEANUP-IR-P4,
    11. IR-TYPING-CANONICAL

commit dcac4136f587ad413d268573d47b0d4c02f41d02
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 21:07:33 2026 +0200

    docs(backlog): restructure FTR-COMPACT-TRANSFORMS as umbrella + 3 sub-FTRs
    
    - FTR-COMPACT-TRANSFORMS becomes umbrella (Status: Open Umbrella)
      with integration-level acceptance
    - Add sub-FTRs: FTR-XREF-CROSSTABLE, FTR-CELL-CODEC, FTR-COMPACT-MULTIAXIS
    - FTR-COMPACT-MULTIAXIS acceptance refined with concrete fixture and
      diagnostics requirements
    - FTR-CROSSTAB-XREF-LONG marked as superseded by FTR-XREF-CROSSTABLE
    - _ftrs_open.adoc updated with umbrella + sub-feature grouping
    - dev_man: document umbrella FTR convention (ftr_conventions.adoc)
    - dev_man: document per-FTR workflow with self-review checklist and
      epic-end consolidated review (ftr_workflow.adoc)

commit 871eca0219a4cc36cee59e752695e683187af808
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 20:54:10 2026 +0200

    chore(tools): exclude .venv_win from repo_snapshot
    
    Windows Python uses .venv_win instead of .venv for the virtual
    environment directory, inflating snapshot output.

commit 66fc48cefdf4910330d13b768504b2e37c477f89
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 20:27:30 2026 +0200

    docs(dev_man): document FTR traceability marker convention
    
    - New section in testing docs: ftr_markers.adoc
    - Convention: pytestmark = pytest.mark.ftr('FTR-XXX') after imports
    - Usage: pytest -m ftr / pytest -m ftr -k FTR_NAME

commit 4de367bb60d03dab21187e20a2977dea57fbf79f
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 20:25:26 2026 +0200

    chore(tests): add @pytest.mark.ftr markers for FTR traceability
    
    - Register 'ftr' marker in pyproject.toml
    - Add pytestmark = pytest.mark.ftr('FTR-XXX') to 22 test files
    - Enables filtering tests by FTR via 'pytest -m ftr'
    - FTR mapping derived from git history (commit → test file association)

commit 565e82ba1d7c9b4d23c17ba11e05812b04c79004
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 20:23:58 2026 +0200

    feat(roundtrip): add parse_ir for Scenario A round-trip (FTR-ROUNDTRIP-SAFE-P1)
    
    - parse_ir reconstructs WorkbookIR from renderer-produced XLSX
    - reads embedded _meta sheet (JSON + Python repr fallback)
    - detects MultiIndex headers via horizontal/vertical merges
    - extracts merges, header grid, validations, freeze panes
    - 11 round-trip tests covering geometry, multi-sheet, MultiIndex,
      merges, header grid, meta, freeze, autofilter, validations, edge cases
    - FTR moved to done

commit 8bafaf752c3727664cc54f03d44cd4ee5138cbd2
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 14:05:10 2026 +0200

    feat(FTR-XML-MULTIHEADER-P2): XML backend with MultiIndex parity
    
    - new XMLBackend: nested XML write for MultiIndex, flat write for simple columns
    - read path flattens nested XML to dotted keys (unflatten_headers for roundtrip)
    - registered in __init__.py, router.py (xml/xml_dir aliases), orchestrator.py
    - helper columns (_-prefix) skipped on write
    - 8 tests: nested write, read roundtrip, flatten+write, unflatten roundtrip,
      flat roundtrip, empty DF, helper skip, ragged MultiIndex
    - FTR moved to done

commit 79084fa8537232b9f32fb7e433178313a34d8b8c
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 13:52:00 2026 +0200

    fix: review FTR-MULTIHEADER-P2 – pass order, flatten lossiness, ragged tests
    
    - unify default_p1_passes to match production apply_all order
    - flatten_headers join mode now preserves empty levels for lossless roundtrip
    - update compose_workbook docstring (dynamic header_rows)
    - add test_flatten_join_preserves_empty_levels_roundtrip
    - add test_ragged_multiindex_vertical_merge

commit eed28dc732a7c819bd8fd57987a75db6e2d1617a
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 13:25:21 2026 +0200

    backlog: move FTR-MULTIHEADER-P2 to done

commit 6c69249888533cf18bcd128cad9f03d4ead430a9
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 12:58:42 2026 +0200

    docs(backlog): split XML parity from FTR-MULTIHEADER-P2 scope

commit 479a2002f7e21ed09a6a1636a4e3da1f4fe3bce6
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 11:19:06 2026 +0200

    feat(multiheader): JSON default nested output for MultiIndex headers
    
    - json backend now serializes MultiIndex columns as nested objects by default
    - flat columns remain flat (compatible with flatten_headers edge step)
    - ignore helper columns and empty header segments in nested serialization
    - add tests for multi->json nested and multi->flatten->json flat behavior
    
    Validation:
    - pytest tests/unit/io_backends/test_json_multiheader_output.py: 2 passed
    - pytest tests/ (non-legacy set): 131 passed
    - interactive smoke roundtrips re-run: flat, nested1, nested2 (behavior unchanged)

commit 6068b849920528e9ec14d69e0ae95d0a3ed05a04
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Mon Mar 30 10:45:47 2026 +0200

    docs(multiheader): link FTR to implementation concept note

commit 4a7f403ee1c9e47df84ff710f743a1ddbce390a2
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 21:21:00 2026 +0100

    feat(multiheader): render multi-row headers end-to-end in IR xlsx path
    
    - IR write path now writes data without pandas headers and overlays SetHeader/MergeCells from RenderPlan
    - _apply_plan_to_existing now applies SetHeader ops (DefineSheet still skipped)
    - handle pandas MultiIndex no-header limitation by normalizing temporary data-write columns
    - add end-to-end xlsx test proving multi-row headers, merges, and data row offsets
    
    Validation:
    - pytest tests/ (non-legacy set): 129 passed
    - interactive smoke roundtrips re-run: flat, nested1, nested2 (behavior unchanged)

commit 2fb668867cab90056d3919945d1b1c9b2ac57b12
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 21:14:32 2026 +0100

    feat(multiheader): emit multi-row header plan with merge ops
    
    - compose_workbook now preserves MultiIndex header depth (header_rows)
    - generate header grid + merge metadata for multi-level column headers
    - build_render_plan emits SetHeader across all header rows and MergeCells ops
    - FreezePass and ValidationPass now respect dynamic header row offsets
    - openpyxl renderers handle MergeCells in both plan paths
    - add unit tests for composer multiheader metadata and render-plan merge/freeze behavior
    
    Validation:
    - pytest tests/unit/rendering/composer/test_layout_composer.py tests/unit/rendering/test_multiheader_p2_plan.py: passed
    - pytest tests/ (non-legacy set): 128 passed
    - interactive smoke roundtrips re-run: flat, nested1, nested2 (behavior unchanged)

commit 2f03abd0bae33e7ce41b2f438b13c99c45ec0864
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 21:09:52 2026 +0100

    feat(multiheader): add unflatten_headers edge step
    
    - add domain transformation unflatten_headers(sep='.')
    - register pipeline step 'unflatten_headers'
    - add tests for join/flatten -> unflatten reversibility conventions
    - validate separator handling and sheet-scoped application
    
    Validation:
    - pytest tests/unit/domain/transformations/test_helpers.py: 4 passed
    - pytest tests/ (non-legacy set): 126 passed

commit 5568550f6af640e4b879b963101812ab6d659285
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 21:07:16 2026 +0100

    chore(repo): normalize dash typography and snapshot smoke+IR docs
    
    Mixed commit by intent:
    - mechanical text normalization (unicode dash to ASCII '-') across docs/comments
    - user-guide capability docs for nested smoke scenarios and formatting pipeline
    - new backlog items: FTR-IR-DATA-CELLS, FTR-CLI-DEFAULT-PIPELINES
    - IR xlsx path adjustment: build render plan + apply plan overlay on existing workbook
    - tests updated for new xlsx IR call chain
    
    Validation:
    - pytest (non-legacy set) 123 passed

commit f1368fa7190ad35d512c20efa20cc04484f0c181
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 17:03:55 2026 +0100

    backlog: move FTR-VALIDATION-PASS-INFRA to done

commit e2665475c8475b2a5b807c54bde1cbc1e3fcec9d
Author: Stefan Schade <stefan.schade@msg.group>
Date:   Sat Mar 28 17:00:14 2026 +0100

    FTR-VALIDATION-PASS-INFRA: unify validation paths, 11 tests
    
    - ValidationPass (core.py) now handles both legacy _p1_validations
      and workbook-level constraints from _meta hidden sheet
    - apply_all rewritten to use CorePass classes (MetaPass, ValidationPass,
      StylePass, FilterPass, FreezePass) and stash meta blob
    - 11 new tests covering domain->compose->passes->plan e2e flow
    - 123/123 tests green

commit 741448793108321b8e461622be0d3bc08ad18774
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 16:48:54 2026 +0100

    docs(backlog): move FTR-YAML-OVERRIDES to done; Phase 2 complete

commit ad12b1b7a99a65d2bed89d4ec6d876fbdd4523e3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 16:34:30 2026 +0100

    feat(FTR-YAML-OVERRIDES): per-sheet config from YAML files
    
    - domain/yaml_overrides.py: load_overrides() + apply_overrides()
      reads YAML with defaults + per-sheet sections, merges into _meta
    - Pipeline step make_apply_overrides_step (file path or inline dict)
      registered as 'apply_overrides' in REGISTRY
    - layout_composer: transfers meta.sheets.<name> to SheetIR.meta.options
      so rendering passes (Style/Filter/Freeze) pick up per-sheet config
    - 20 new tests: load/apply/precedence/pipeline/composer/end-to-end
    
    Precedence: profile defaults < YAML defaults < per-sheet YAML < CLI
    All 112 tests pass.
    
    References: FTR-YAML-OVERRIDES

commit c5c9f972916d7166683a7d186bab638153f943a3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 16:28:57 2026 +0100

    docs(backlog): move FTR-META-BOOTSTRAP to done

commit 209ab3e6de96a9127c24b9c97c993987350a0f71
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 16:11:07 2026 +0100

    fix(tests): repair 3 stale tests broken by earlier refactors
    
    - openpyxl_renderer: recognise SetFreeze op name (was only FreezePane)
    - test_main_with_top_level_pipeline: mock orchestrate() instead of
      removed get_loader/get_saver (FTR-ONE-ORCHESTRATOR refactor)
    
    All 92 tests pass.

commit 00143204140caa354076431748857b532341ae09
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 16:02:44 2026 +0100

    chore: remove lib64 symlink from tracking, add to .gitignore

commit cd4142b4ee90ac427a05148ee92790d39c5b3e76
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 14:52:22 2026 +0100

    feat(FTR-META-BOOTSTRAP): bootstrap_meta step with fault-tolerant meta merging
    
    - domain/meta_bootstrap.py: bootstrap_meta() with precedence model
      (profile_defaults < persisted < cli_overrides), deep-merge support
    - Pipeline step factory make_bootstrap_meta_step + REGISTRY entry
    - SheetIR.__post_init__: coerce meta=None to {} for fault tolerance
    - 25 new tests (test_meta_bootstrap.py): deep merge, both interfaces,
      precedence chain, pipeline integration, SheetIR fault tolerance
    
    References: FTR-META-BOOTSTRAP

commit c2d12f2395f36fd06b9cde7990c46a5da2ab2a67
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 13:49:58 2026 +0100

    docs(backlog): move FTR-STYLE-THEMES to done

commit 1dfc83c7f3d6ac84546adcff3609f2ca9f76bf21
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 13:24:08 2026 +0100

    feat(FTR-STYLE-THEMES): configurable styling via IR passes; helper column highlighting
    
    - StylePass: configurable header_fill_rgb, helper_fill_rgb, helper_prefix
      (global defaults + per-sheet overrides via options)
    - New ApplyColumnStyle RenderOp for helper column fill
    - flow.py: build_render_plan emits ApplyColumnStyle ops from __helper_cols
    - openpyxl_renderer: handle ApplyHeaderStyle + ApplyColumnStyle;
      removed hardcoded P1 parity defaults (now driven by passes)
    - xlsx_openpyxl: handle ApplyColumnStyle in typed renderer
    - 19 new tests (test_style_themes.py): StylePass config, RenderPlan ops,
      XLSX output verification (bold, fill, autofilter, helper highlight)
    
    References: FTR-STYLE-THEMES

commit 7885812a1638fe5fd45ab2e54b3908b408553052
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 13:14:13 2026 +0100

    chore: fix .gitattributes; add ADR-006 render chain; note pipeline runner cleanup in backlog
    
    - .gitattributes: proper text=auto with binary overrides (fixes CRLF warnings)
    - ADR-006: document Compose → Passes → Plan → Render data flow
    - ADR index: include adr-005, ADR-RENDER-FLOW, adr-006
    - FTR-DOMAIN-CONSOLIDATION: add acceptance criterion for pipeline.runner retirement

commit ca0f80ea436650990c41d13ec3311ddd946fff23
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 12:21:11 2026 +0100

    docs(backlog): move FTR-ONE-ORCHESTRATOR to done; clean up phase 0/1 from open

commit 01d1535dcf411ea35a323559ec38efe49e6d634b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 12:13:58 2026 +0100

    chore: remove repo.txt from tracking; add to .gitignore

commit 3ac29634bbf7c4787ff2367a68e1c5eeee9ef2c5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Mar 28 12:11:02 2026 +0100

    feat(FTR-ONE-ORCHESTRATOR): wire all CLIs to orchestrate(); add delegation tests
    
    - sheets-run, sheets-pack, sheets-unpack now delegate to orchestrate()
    - Removed direct get_loader/get_saver/run_pipeline calls from CLIs
    - Fixed iterator consumption bug in orchestrate() step count logging
    - Added 7 delegation + e2e tests (test_cli_delegation.py)
    - Updated test_run_main_smoke.py to match new orchestrate()-based flow
    - _args() in pack/unpack now accepts argv for testability
    
    References: FTR-ONE-ORCHESTRATOR

commit 49c19ee06d8a71873526022327131f81728ceba9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Dec 21 18:29:25 2025 +0100

    feat(FTR-ONE-ORCHESTRATOR): add orchestrate() scaffold + smoke test; tidy Makefile dirs
    
    - Add initial orchestrator module with IO routing (json/yaml/xlsx) and optional pipeline steps
    
    - Add unit smoke test for json_dir -> json_dir execution
    
    - Make pyproject.toml the single dependency source (stamps no longer depend on requirements*.txt)
    
    - Normalize build vs target directories; move doc output under target/ and snapshot/coverage under build/
    
    - Simplify venv creation + ensure-pip wiring
    
    WIP: CLI shims (pack/unpack/run) not yet routed through orchestrate().
    
    Refs: FTR-ONE-ORCHESTRATOR

commit 063691ebf34fc5516967a018d30c95bacf60f356
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Nov 3 19:32:02 2025 +0100

    chore(tools/snapshot): simplify repository snapshot logic and prune obsolete planning folder
    
    - Replaced legacy multi-layer snapshot implementation with clean two-layer design:
      - `tools/repo_snapshot.sh`: curated wrapper defining directory, path, and extension blacklists.
      - `tools/concat_files_core.sh`: minimal, robust UTF-8 concatenator with NUL-safe `find` loop.
    - Updated Makefile `snapshot` target to invoke new tooling directly.
    - Removed outdated `planning/_old` folder from snapshots, reducing output size by ~2k lines.
    - Verified that docs, FTRs, and primer prompts remain included for AI-context snapshots.
    
    This keeps the snapshot reproducible and easier to maintain while retaining all relevant project context.

commit f3a13d691650971d102f33b7fe54af369593c4cf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Nov 3 09:08:59 2025 +0100

    docs(FTR-ROUNDTRIP-SAFE-P1): Backlog / Concept work to make the roundtrip stable for speadsheets with layouts
    
    - add FTR-ROUNDTRIP-P1 to the backlog and the roadmap RM-IR-PARITY
    - add a concept detailing the considerations on the problem
    - make file names in concept section consistent
    - modify/reorg git primer prompts and dev man sections for clarity

commit aceec64f86ce564c4e687e62bf4b52f892569028
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Nov 3 07:36:33 2025 +0100

    test(FTR-TEST-HARNESS): finalize dual-backend markers and quarantine pre-hex suite
    
    - Confirmed xlsx_ir and xlsx_legacy markers cover all active backend tests
    - Added conftest skip for pre-hex suite (RUN_PREHEX=1 to enable)
    - Kept rendering tests layer-pure (no backend calls)
    - Simplified Makefile targets (test, test-ir, test-legacy, test-legacy-try)
    - Updated internal guide and acceptance text for FTR-TEST-HARNESS
    - Verified FTR-TEST-HARNESS criteria met → mark as Done
    
    Refs: FTR-TEST-HARNESS, FTR-DOMAIN-CONSOLIDATION

commit 1414e870cd7a903bf359896bd9d7368e5b4adec2
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 31 18:07:53 2025 +0100

    build(FTR-IR-WRITEPATH-P1): avoid unnecessary reinstalls by wiring deps stamp to inputs
    
    - Wire $(DEPS_STAMP) to $(DEPS_INPUTS) (and gate via ensure-pip).
    - Cuts repeated pip installs; ~5m → ~30s under WSL.
    - Mark feature doc as DONE (was still in “in-progress”).

commit f6b894f3b1732c06c3503f68e39da45d902d3f1f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 31 17:11:34 2025 +0100

    fix(FTR-IR-WRITEPATH-P1): align IR model with legacy tests (styles on SheetIR, top_left alias)
    
    - Reintroduce SheetIR.styles for no-op style_pass
    - Accept TableBlock(top_left=(r,c)) and translate to top/left in __post_init__
    - Keeps tests green while migration proceeds
    
    References: closes #24
    Follow-up: remove top_left under FTR-IR-TYPING-CANONICAL

commit c6b550d4fd1dbef270d4f25f4239570753acb8d3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 31 16:34:48 2025 +0100

    feat(FTR-IR-WRITEPATH-P1): complete P1 parity path with meta persistence and validations
    
    Implements remaining P1 functionality for the IR-backed XLSX renderer:
    - Added handling for AddValidation ops (list-based data validations)
    - Added support for WriteMeta ops with hidden _meta sheet persistence
    - Ensured freeze panes and autofilter parity with legacy writer
    - Confirmed test_ir_render_flow_p1 passes end-to-end
    
    References: #24
    
    Known issues:
    - Unit tests for IR passes (style_pass and validation_pass) still fail pending model alignment
    - IR model test_ir_basic_structure fails due to outdated TableBlock constructor signature
    These will be fixed in subsequent commits before closing #24.

commit 74a0a1b6d9d9a72cba9ff94952a2485c8a16b73c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 30 14:57:18 2025 +0100

    docs(ai-policy): add CC + branching; adoc separators; Python typing; Makefile scripting guidance
    
    - Add Conventional Commits requirement; prefer English; rebase merges; feature branches; main/dev model
    - Note to use ''' for horizontal rules in AsciiDoc (not ---)
    - Clarify Python guidance: require type hints for public APIs; enable from __future__ import annotations
    - Document Makefile/Bash quoting pitfalls; advise moving multi-line logic to tools/*.sh

commit f21f8e89472d6d489cf0ffda30c4bd8b2b405b6a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 30 14:32:39 2025 +0100

    build (make, tools): make runtime deps non editable and dev deps editable

commit c47d4c82466553c3c89c4c14127ce59949b50143
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 30 14:18:46 2025 +0100

    build(make,tools): make Python environment setup robust and WSL-friendly
    
    - Added explicit SYS_PY/SYS_PIP detection and sanity checks (python, pip, venv)
    - Improved venv creation with clear error messages and WSL/Ubuntu install hints
    - New tools/ensure_pip.sh: ensures pip availability via ensurepip or get-pip.py
    - New tools/pip_install_spec.sh: generic pip installer with verbose mode and clear failure guidance
    - Unified dependency installation flow using ensure-pip and stamp files
    - Introduced VERBOSE flag (→ PIP_VERBOSE_FLAG)
    - Minor Makefile cleanup (PHONY targets, consistent variable names)
    
    No functional changes to the package itself — only build and environment setup reliability improved, especially under WSL.

commit c914d6d8eaa0147fbbeb06f95a6d5e703a46eecf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Oct 28 19:47:37 2025 +0100

    docs(internal guide): ftrs for project documentation and marketing, corrections
    
    - FTRs for project documentation and publication
    - FTRs for project marketing
    - fixing chapter levels, formating, file names etc.

commit 6a4610c2cac88b438e84658249c0f8a45dd0deb0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Oct 28 11:20:03 2025 +0100

    docs(internal doc): polish and preparing FTR-IR-WRITEPATH-P1 implementation
    
    - ai: add best practice reference to ai section and integrate transparency note into README.md
    - FTRs: unifiy formating of the features, header levels
    - roadmaps: Introduce the concept of roadmaps that wrap a series of features that are interdependent
    - FTR-IR-WRITEPATH-P1: detail FTR description and RM-IM-PARITY to prepare for feature

commit c6d5059c50c71091ed5b4dd6e97ac75e1ebfa049
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 27 18:13:18 2025 +0100

    chore(scripts): add branch-audit helpers (merged_into.sh, print_delete_merged.sh)
    
    - list remote feature/refactor/modularization branches merged into a base (default: dev)
    - optional printer for delete commands (manual review before execution)
    - safe defaults: fetch --prune, exclude origin/HEAD, keep active WIP branches

commit 537a56bbd6f02a6d4b839110a894ff55adee169a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 27 17:17:36 2025 +0100

    docs(internal doc): ai policy, release notes
    
    Improve the internal documentation in the repo
    
    - reorganise chapter names
    - add a section "Release History" containing relase notes for all the betas we published
    - add a section "On the Use of AI" containing policies, guidelines and primer prompts

commit 8ba23a03606fc73a079fe7dd27986f5fe9550a8a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 27 10:06:13 2025 +0100

    chore: input.json is a temporal document that is not to be committed

commit 81af042e82572cfe7b0ecd9b4a3e5e4fa1358cba
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 27 09:47:30 2025 +0100

    docs(backlog): work on backlog
    
    - FTR-BACKEND-ABC formalize interface for backend
    - FTR-ORDERED-LIST add an aspect to nested json interpretation
    - FTR-YAML-OVERRIDES per sheet configuration
    - capture various long term ideas in section "future"
    - describe the intent behind the early project evolution (before switching to this backlog)

commit fcb26337f127a265863dde04222321a51069924c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Oct 25 22:31:53 2025 +0200

    docs(backlog): complete backlog and concept documentation for phase 1–4
    
    - add finalized FTR entries for meta bootstrap, multiheader, nested lists, demo sync, and autosync
    - align epics and phases (1–4) with implementation roadmap
    - fix typos, duplicate phase markers, and inconsistent status lines
    - include project status notice (early beta, no external dependencies)
    - prepare documentation for merge into dev after phase-1 completion

commit 6dd0c5048ff731ab3ec4e283f4ad7ed8931a6322
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 20 20:00:18 2025 +0200

    working on docu

commit 2b958c3790fc0b531d625a3426c32887d9c93f12
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 17 19:06:19 2025 +0200

    feat(rendering): add header_map and meta preservation to compose_workbook
    
    - extend IR model with header_map (header -> 1-based column)
    - preserve hidden _meta sheet in WorkbookIR
    - skip non-DataFrame entries
    - enable precise column targeting for validation passes

commit 682bfc55ca3515f7640add363eb7a49bc0e9a6b3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 17 18:52:05 2025 +0200

    refactor (move): move xlsx_backend into xlsx subpackage

commit 7fea52c02cd5cf2012ebfb91aa29f656ce3f9f89
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 17 18:50:07 2025 +0200

    refactor (move): move xlsx_backend into xlsx subpackage

commit 04836606b6842c7a5e8bd0913f89affdb1db358c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 17 16:38:27 2025 +0200

    documentation (dev guide): backlog, concepts, document stub

commit 5967ccfac3c8444625d8c4f7a11a90f2d30a1fcf
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 16 19:35:32 2025 +0200

    feat(xlsx-backend): introduce intermediate rendering layer (IR) and refactor Excel adapter
    
    - added new `rendering/` domain with IR dataclasses, composer, and render passes
    - implemented `openpyxl_renderer` and minimal `validation_pass` for list validations
    - refactored `xlsx_backend.py` to support dual backend modes (legacy vs IR)
    - added `SH_XLSX_BACKEND` env flag and Make targets for `test-ir` / `test-legacy`
    - added missing __init__.py files for proper package discovery
    - moved Excel adapter under `io_backends/xlsx/`
    - introduced IR-focused unit and integration tests:
      - test_ir_call_chain, test_ir_roundtrip_smoke, openpyxl_renderer_stub
      - placeholder tests for composer and render passes
    - updated Makefile, pyproject, and pipeline exports for IR backend support
    
    This establishes a modular, extensible rendering pipeline for Excel output,
    paving the way for styling, formulas, and multi-header support in future passes.

commit 781582970cd1b82b47376e347a01c5b21912fcf9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Oct 14 12:39:46 2025 +0200

    feat(xlsx): preserve meta and apply Excel data validations (in_list); logging and reserved _meta handling

commit 9149fca346d39e0ebb72d67231a029d27dc82b5d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Oct 12 09:14:47 2025 +0200

    fix: issues appearing during integration testing

commit f2f01e55c426f91a1e1a39fef3eef1e8b2495dfb
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Oct 11 17:07:29 2025 +0200

    (chore) delete temporary file

commit 87b28fb9d37361582ecea69048541859b5d16d8b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 10 17:34:55 2025 +0200

    (feat) column validations that show in excel

commit 8cbdcd35638a11a0324966b049b79caf29a104c1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 10 16:46:48 2025 +0200

    (test) test coverage run.py

commit cb2fcaf1657fbdf3f4003b50c0e05e5d9bb66c7e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Oct 10 10:42:25 2025 +0200

    (chore) tidy up cli package - documentation and exclude legacy for coverage report

commit 87fa09197ea3691f22f1d6bc0392a327074a0907
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 9 15:55:34 2025 +0200

    (chore) tidy up cli package

commit d6d76e737574ba63668a2f7bb973fa13456994b9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 6 22:17:06 2025 +0200

    ci: ensure fetch-depth:0 and align test selection

commit 567141815a5bcd44b39920f1093bf5b1f9ee7a7c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Oct 6 21:02:58 2025 +0200

    (fix) functional problems found during integration

commit 5c6b071f22095d93255742fdf8fff6e02ba01cf5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Oct 5 15:21:24 2025 +0200

    (fix) adjust run cli plausibility

commit 3c63550f073ec3bc0b6c3603b505cb89fd9fd4d4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Oct 5 15:14:14 2025 +0200

    (fix) fix issues during pipeline integration

commit 90ac53f32fae9b2fb8b749eb0206601f8a9d33c4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 2 14:44:42 2025 +0200

    (chore) prevent legacy tests from executing if not explicitly requested

commit d79e5ddb0c63f9517dbc396801f788fdf28855ac
Merge: d29709a 5ede1ce
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 2 13:28:06 2025 +0200

    Merge feature/redesign: runner+router+xlsx styling + thin CLI adapters

commit 5ede1ce1852dd861a6af708497784018c6c723b6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 2 13:10:47 2025 +0200

    feat(cli): thin adapters for sheets-pack/unpack over new runner
    
    - Introduce thin CLI shims:
      - sheets-pack: JSON/CSV -> XLSX via pipeline.runner
      - sheets-unpack: XLSX -> JSON via pipeline.runner
      (keeps legacy UX while using the new architecture)
    
    - Router/backends:
      - Lightweight router with get_loader/get_saver registration
      - Register json/json_dir, yaml/yaml_dir, and xlsx backends
      - XLSX writer now applies AutoFilter + gray/bold header
    
    - Pipeline/config:
      - test-facing config shim so runner can load simple YAML
    
    - Tests & tooling:
      - Unit tests for JSON/YAML/XLSX backends and XLSX styling
      - Minimal integration test (json -> xlsx) via runner
      - Makefile: consolidated test targets with legacy filter options
    
    This lays the groundwork for dotted-path steps, YAML outputs,
    and helper-column transforms while keeping the public CLI stable.

commit 1517360c9e8b1aa92704f0013ae458b3cb92d0d5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Oct 1 13:29:31 2025 +0200

    refactor towards a hexagonal architecture
    
    - unify pipeline config fallback and backend routing, fix test suite
    - replaced pipeline.config with clean shim (engine.config preferred, lightweight fallback for tests)
    - added ExcelOptions.helper_fill_rgb for test compatibility
    - reintroduced router with get_loader/get_saver to stabilize backend API
    - fixed default_factory usage in dataclasses to remove mutable defaults
    - aligned JSON/XLSX backends with consistent read/write_multi contract
    - test suite now green for json_roundtrip, xlsx_writer_styling, and integration

commit d29709ac8d62166b3559510bcb9277438c2bf794
Merge: b835dd8 3bd76f7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Oct 2 09:29:28 2025 +0200

    Merge remote-tracking branch 'origin/main' into dev

commit 3bd76f79bffd1b11843cb72e22024a27e18463b5
Merge: 5675000 b835dd8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Sep 29 19:28:48 2025 +0200

    Merge dev into main (0.1.0b3)

commit b835dd8bd370b42af65c32015b63c5e0bcd78a2b
Merge: a3177bd 93f60c8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Sep 29 19:26:55 2025 +0200

    Merge feature/quick-wins: XLSX autofilter and header styling

commit 93f60c8006dddce8327e10e4a135b2956a155aee
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Sep 29 19:24:04 2025 +0200

    (feat) autofilters and header design in excel

commit a3177bdfcca283a5613bfd5406e0e0d099c8e165
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 27 18:21:49 2025 +0200

    (backlog) improve pipeline, autofilter, xref, config, helper columns

commit 56750009930a70797aaa98978fa970916973f114
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 19:38:46 2025 +0200

    chore: ignore generated _version.py; add release workflow

commit cef91e1faf41b62c7ac68c466da41adff067a18f
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 17:06:45 2025 +0200

    feat(entdinofizieren): adjust toml

commit 0cd3c8b02d078bb6f179f4bfa968a8e39d55102d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 15:37:08 2025 +0200

    feat(entdinofizieren): adjust documentation

commit ac9da52f856884c2750a19b8e922390b3f423c87
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 15:29:23 2025 +0200

    feat(entdinofizieren) add readme

commit bedf36653860060ad7f86482a17f1029dccceada
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 13:16:53 2025 +0200

    feat(fix tests)

commit b5eed8fd69c00cb2da7cc2a532effb72ec7da6e1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 24 12:18:51 2025 +0200

    feat(entdinofizieren) adjust folder structure and get everything running agaain

commit dca797b41c45988179f805da5a9256c951bccee0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Sep 22 10:47:14 2025 +0200

    feat(pipeline-dotted-path): allow domain specific pipeline steps

commit d8b82c6386ff233b3e0ae1cbfe29bb65e245117d
Merge: a5df30d 4ad6cee
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 22:47:30 2025 +0200

    Merge feature/pipeline-refactor into dev

commit 4ad6cee1d33ff265c7e8a585297284e7ab6b0197
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 22:37:21 2025 +0200

    feat(pipeline): tidy up backends and optimize config possibilites

commit 47b9c30f8e567cb30b02ed48bcddf81509af13e0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 20:50:48 2025 +0200

    feat(pipeline): add option to specify pipeline with a yml

commit 4e6cf15ed74a1aa5eb08e24cd996b6a24c15fe13
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 20:35:31 2025 +0200

    feat(pipeline): introduce BoundStep and run_pipeline, wrap validate/apply_fks/drop_helpers as steps

commit 1fa7677e1389c7979b75392395355e7441739df1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 20:35:13 2025 +0200

    feat(pipeline): introduce BoundStep and run_pipeline, wrap validate/apply_fks/drop_helpers as steps

commit a5df30d53d0fb9fe685f195821a701bf0d888593
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 19 19:51:22 2025 +0200

    setup for wsl

commit 0eb5a2f8b9b71a911d277c7563c0dd9b6e426f64
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 10 13:01:55 2025 +0000

    fix errors

commit 48b974ca32686d870eac1d7b86c2b0a5b8801cef
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 9 15:45:05 2025 +0000

    backend base mit Options

commit 8c0aa7e708a10270d2b4b7cae5d27d7658c75bd8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 9 15:21:45 2025 +0000

    io_backends: rename excel_xlsxwriter -> xlsx_backend (with compat shim)

commit 1bbb18a0621a10e967c987a2682ff3c4b6c03674
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 9 13:57:14 2025 +0000

    io_backends: rename excel_xlsxwriter -> xlsx_backend (with compat shim)

commit 988197bd3005776f6b9cb364b02a9ec52cf11da0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Mon Sep 8 17:37:26 2025 +0000

    refactor #15

commit 5939adc494d518465e787c85da46d1be8178ae40
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Sep 7 21:00:36 2025 +0000

    close test gaps #6

commit 4dbdea9e6a3bc9ae3b03932870721bc8899e92ec
Merge: 15d2c9f 5fb0c9e
Author: Stefan Schade <53253271+StefanSchade@users.noreply.github.com>
Date:   Sun Sep 7 12:24:31 2025 +0000

    Merge pull request #18 from StefanSchade/refactor/w1-cleanup
    
    Refactor #14

commit 5fb0c9e484486ef68fd3b1f36646b6bdd68f12ee
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Sep 7 12:22:58 2025 +0000

    refactor #14

commit 7243dc0fadfac01cc1c7ecfebda6d40ac0386a71
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sun Sep 7 12:05:17 2025 +0000

    refactoring #14

commit 15d2c9f2e45415f56a736bdb887c8cf3a546b45e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 19:38:47 2025 +0000

    refactoring #14

commit 046509030a47ce4bd76c6322ecd7e56561974ab9
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 15:18:11 2025 +0000

    new helper functions
    
    # 14

commit abcb1990983fa77af49e5cfe988f1c411a811a81
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 10:48:50 2025 +0000

    tests fixed

commit 4b0afe0f2cb356bad11fde0656198322e7e26e47
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 09:50:28 2025 +0000

    fixing errors

commit 01ea4c7d2735a82c6718344740cb6bfab8ffe705
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 09:36:06 2025 +0000

    new tests - still some errors

commit 992e2205129faa65e59d636a23eaff948d7fddd1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 09:27:07 2025 +0000

    Vaildiierungslogik - regressionstests laufe

commit aa8d585700c5478a8c7606a443187940f1d7a3e0
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Sat Sep 6 08:14:53 2025 +0000

    makefile optimization

commit 74b05a1d2ae84c7edcd9e87519d54705dd902230
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 19:02:08 2025 +0000

    optimize logging and make

commit c2cebc8d80f8f1dec81ea4b11e73cf889a3c03e5
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 18:20:02 2025 +0000

    engine verkabeln

commit 4cf1d2716e8dc406fb4557f9f126c11de935c862
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 17:29:51 2025 +0000

    logging #9

commit f943cc4e306921ba15f8991b26e3b54bf2e1ad6b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 15:42:08 2025 +0000

    more test cases #6

commit 0c9fa731f643eb57f1fd05d1927adba1a68a4d4a
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 09:18:09 2025 +0000

    succeeded to fix errors

commit 9fc895e496bd9d29f21e473c5283bd1cdb4c583e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Sep 5 09:09:05 2025 +0000

    trying to fix errors

commit ee68eaca91aabae8aa2818c2dbea06fc9b78b367
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Sep 4 13:25:57 2025 +0000

    tests for the foreign key logic #4 #6

commit fb88e12459207e318bedda1b9ffa11a1192d05dc
Merge: cd14586 477c192
Author: Stefan Schade <53253271+StefanSchade@users.noreply.github.com>
Date:   Thu Sep 4 08:40:25 2025 +0000

    Merge pull request #13 from StefanSchade/dev
    
    Dev

commit 477c192157f8809520003e68a77eab96fee10f5c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Thu Sep 4 08:25:29 2025 +0000

    improve project toml #9

commit 61c3a871f7542b7abf3233a148e136184f410a73
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 19:46:19 2025 +0000

    start implementing multipage spreasheets
    
    #4

commit d1f5b360ed489fdbc76d6629e3bb236dd82fead4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 17:56:24 2025 +0000

    requirement analysis #4 #5

commit bb9e2637abe6d82db07262ef153c958cb57243ea
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 17:55:52 2025 +0000

    additional test cases #6

commit cd145868a15417b22aaad8d0fcfb2e3605972b67
Merge: 5d846ac 9afba61
Author: Stefan Schade <53253271+StefanSchade@users.noreply.github.com>
Date:   Wed Sep 3 13:28:17 2025 +0000

    Merge pull request #12 from StefanSchade/dev
    
    Dev

commit 9afba61e9d1ce218ee3a1cbe780a9fb6bbf046d4
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 13:27:40 2025 +0000

    work on non xls backends - cli integration

commit 3996db3dde2cc1a4855054ab7d85a632f0039c81
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 13:18:49 2025 +0000

    work on non xls backends - test
    
    closes #2
    
    closes #3

commit 3f847a59f470030f80a30f7d42c5b9627a68301e
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 12:51:10 2025 +0000

    work on non xls backends

commit 5d846ac716ddc7a2e675db2cba0064e6218b59a5
Merge: f4a898e f3e7073
Author: Stefan Schade <53253271+StefanSchade@users.noreply.github.com>
Date:   Wed Sep 3 10:13:31 2025 +0000

    Merge pull request #1 from StefanSchade/modularization
    
    Modularization

commit f3e707346b1ee627d8b9bea858a9fd7de058fb7d
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 10:03:08 2025 +0000

    remove repo.txt

commit 62907a113cf580ac2a0e06985c4a1ec7050b450c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 09:59:31 2025 +0000

    adjust wrapper script

commit 3fcc37f0b51aa634d98ed72ee78879b1d1c315b7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Wed Sep 3 09:56:03 2025 +0000

    repo snapshot script

commit 5e9939681e7c20f7625b50adb0ed38349763a42c
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 20:59:34 2025 +0000

    README for the python project

commit c0c632aba8e626dab759ffd64a53f9f0e5212c20
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 20:58:43 2025 +0000

    README for the python project

commit 122af29d26fbaad74b21e921435655ea3f4f5ff8
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 20:47:47 2025 +0000

    remove pycache

commit b68197406a025d9a5edb01ef10a440b67c174535
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 20:39:51 2025 +0000

    adding tests

commit fc518a4d89d35c21568dddfc35301220e5905e06
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 19:44:05 2025 +0000

    improve separation of python code for future repo split

commit dbbfde6040832c1ca2a80088dc6f9058a2329338
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 19:16:26 2025 +0000

    improve robustness

commit 741afc48871bfff48e359a82e389e9c64c2248f1
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 18:24:07 2025 +0000

    modularize conversion logic

commit f4a898edcad2b010bfc64e7eb988fe7c26f43ce6
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 13:46:20 2025 +0000

    avoid index column in spreadsheet by using custom writer

commit cd131d91896805367a0f841b636820bba56f0ab3
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 12:46:36 2025 +0000

    keep json order in spreadsheet

commit ca8d731d1fdbd69ce16e4c77e2705133c448bea7
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Tue Sep 2 09:32:55 2025 +0000

    immplement transformation beteween spreadsheet and json in python

commit d90fc75da8a08fe036feaab5bdbfb8295597619b
Author: Dr. Stefan Schade <dr_stefan_schade@yahoo.com>
Date:   Fri Aug 29 17:27:50 2025 +0000

    first commit
