Busflow Docs

Internal documentation portal

Skip to content
Reviewed 01 Jun 2026

BSFZ V1 — Conjunction-Spine Restructuring Implementation Plan

For Claude: This is a documentation-restructuring plan (prose across 8 markdown files in three layers), not a code plan. The TDD scaffolding of the writing-plans skill is adapted to its prose analog: each task names exact files, the exact edit, and a verification step (re-read for coherence + grep to confirm the old spine is gone). Commits are marked but gated on the user's explicit go-ahead (standing rule: never commit unless asked).

Goal: Re-base Busflow's BSFZ Vorhaben-1 narrative from "the Forschungskern is the Online character" onto the precise conjunction #2 ∧ #3 ∧ #4 (non-monotone clamp ∧ coupled fixed costs ∧ statutorily-forced online correction), and bring the architecture system-of-record (L_C) into line with the now-confirmed Skarpa/deposit premise so the funding claim is backed by real design intent.

Approach: Lock one canonical "spine" paragraph (the conjunction), install it in the talking-points doc (L_A), make the architecture docs (L_C) reflect the three mechanisms the conjunction needs (interim deposit-margin-VAT stage, coupled-fixed-cost re-allocation, online corrector), then propagate the spine down to the submitted V1 (counteroffer) and the canonical funding docs (L_B), and finish with a coherence sweep. The Online character (#4) is demoted from "the whole core" to "the temporal forcing function" that forces a #2∧#3 substrate to be solved forward-in-time; #3 (coupling) is promoted to load-bearing as the reason linear cumulative catch-up (IFRS-15/IBNR) cannot track the problem.

Document layers (user's framing):

  • L_A — Background (Gutachter talking-points, not submitted): 05-31-bsfz-vorhaben-1-forschungskern.md
  • L_B — Application (submitted V1 + canonical): 05-31-bsfz-counteroffer-v1.md (submitted V1), bsfz-antrag-vorhaben.md (V2–V4 + V1 pointer), funding-work-packages.md (AP catalog), bsfz-strategie.md (clustering)
  • L_C — Project docs (audit ground truth): adr-012-toms-tax-deferral.md, tax-engine-protocol.md, kalkulations-engine.md; supporting PRODUCT_accounting-boundary.md

Honesty guardrails (must survive every edit):

  1. Keep the ⚠️ Steuerrechtlicher Arbeitsstand — vor Einreichung mit dem Steuerberater verifizieren disclaimers on tax statements.
  2. Concede each leg individually as standard engineering; the claim is only the conjunction. Never inflate.
  3. The gate confirmation resolves burden 2 (why-not-offline) only. Burden 3 (representativity — Busflow is greenfield, no production corpus) stays fully intact (forschungskern §7 lines 173–180). Do not let "premise confirmed" bleed into "frequency proven."
  4. §264 StGB / 4-year audit exposure: every claim must trace back to forschungskern §§2–4.

CANONICAL SPINE TEXT (approve this first — everything echoes it)

Der Forschungskern: die Konjunktion, nicht eine Einzeleigenschaft.

Der Forschungskern von Vorhaben 1 ist das gleichzeitige Zusammenwirken dreier Eigenschaften, von denen jede einzeln Stand der Technik ist:

(a) Nicht-monotone Einzelmarge mit Kappung (§ 25 Abs. 3 UStG, Einzelmargenermittlung nach EuGH C-380/16). Negativmargen werden bei null gekappt (max(0, ·)); damit gilt Σ clamp(mᵢ) ≠ clamp(Σ mᵢ). Die Aggregation ist nicht-linear.

(b) Gekoppelte Fixkosten. Reale Gesamtkosten (z. B. Busmiete) werden dynamisch über die tatsächliche Pax-Zahl umgelegt. Eine einzelne Stornierung ist daher nicht lokal: Sie verschiebt die Kostenbasis — und damit die Einzelmarge — aller übrigen Reisenden gleichzeitig und kann mehrere Clamps auf einmal kippen lassen.

(c) Gesetzlich erzwungene Online-Korrektur. Anzahlungsbesteuerung im Margenschema (§ 13 Abs. 1 Nr. 1 Buchst. a Satz 4 UStG i. V. m. EuGH C-422/17 „Skarpa Travel") macht die Margen-USt bereits auf die geschätzte Anzahlungs-Marge fällig und in einer bereits GoBD-gesperrten Periode deklariert; bei Bekanntwerden der Ist-Kosten ist sie nur vorwärts zu korrigieren.

Warum jede Eigenschaft einzeln Stand der Technik ist:

  • Ohne (c) → einmaliger Post-Trip-Recompute über finale Fakten = Batch-Job.
  • Ohne (a) → linearer kumulativer Nachholbetrag konvergiert glatt (IFRS 15 / IBNR).
  • Ohne (b) → jede Buchung ist unabhängig; ein Per-Buchung-Nachholen auf max(0, Schätzung) konvergiert reihenfolge-unabhängig.

Warum die Konjunktion ungelöst ist: Erst (a) ∧ (b) ∧ (c) erzeugt ein Online-Verfahren, das gekoppelte, gekappte Margen über bereits gesperrte Perioden hinweg pfadunabhängig und revisionssicher korrigiert. Die Kopplung (b) macht jede späte Tatsache nicht-lokal; die Kappung (a) macht ihre Wirkung nicht-monoton (Clamps kippen sprunghaft); die Periodensperre (c) verbietet das einfache Neu-Rechnen und erzwingt eine reine Vorwärtskorrektur. Genau die Kombination „eine Tatsache → viele gekoppelte Margen → mehrere kippende Clamps → in gesperrte Perioden hinein nur vorwärts korrigierbar" hat keine bekannte Referenzlösung; das linear-monotone Schätz-/Korrektur-Repertoire (IFRS 15, IBNR, FX-Abgrenzung) deckt sie nicht ab. Das ist die technologische Unwägbarkeit, die AP1 auflöst — mit dem realen Risiko eines negativen Ergebnisses.

Why this is the right spine: It is honest (each leg conceded as standard), it survives the recompute-from-scratch attack (names what a batch job cannot do: forward-correct into locked periods), it survives the IBNR escape (coupling × clamp, not mere bookkeeping), and it promotes #3 from a throwaway clause to the load-bearing IBNR-defeater. The Online character is the forcing function, not the claim.


Task 1 — L_A: forschungskern.md (install the conjunction spine)

File: Modify docs/1-projects/2026-05-bsfz-funding/05-31-bsfz-vorhaben-1-forschungskern.md

Step 1a — Insert the conjunction spine as a new framing block at the head of §1 (before current line 19 "Es lässt sich ein einziges, allgemeines Online-Verfahren…"). Recast the existing §1 sentence so "ein einziges, allgemeines Online-Verfahren" is explicitly the temporal forcing function over the (a)∧(b) substrate, not the whole core. Use the canonical spine text above.

Step 1b — Promote #3 (coupled fixed costs) to load-bearing. Two edits:

  • §3 (line ~39–42): add a numbered point — "Die Nicht-Linearität ist gekoppelt, nicht per-Buchung lokal." Explain that shared fixed costs (Busmiete) re-allocate over realized pax, so one cancellation moves every booking's margin at once and can flip several clamps simultaneously — which is why a per-booking catch-up (otherwise standard) does not apply.
  • §5a "Abgrenzung zum bekannten Stand" (line 100): currently attributes non-convergence to "nicht-monotone Clamp + rückwirkend mutierbarer Partition." Add coupling as the third, decisive reason: a single late fact is non-local because fixed costs are shared, so the IBNR/IFRS-15 linear cumulative catch-up (which assumes each estimate revises independently) cannot track it.

Step 1c — Lighten the burden-2 hedge; preserve burden-3. Edit lines 80, 104, 155:

  • Line 80 (§5a disclaimer): change "und sie trägt nur, wenn die Anzahlungs-Konstellation real vorliegt" → premise confirmed (Busflow takes deposits; Skarpa applies); what remains to verify with the Steuerberater is the interim-VAT mechanics (Schätzgrundlage, Korrekturzeitpunkt). Keep the ⚠️ disclaimer.
  • Line 104 (§5a Prüfpunkt): drop "Sollte sich herausstellen, dass Busflow keine Anzahlungen nimmt … fällt dieser Online-Strang weg." Replace with: premise confirmed → ADR-012 is to be extended by an interim-declaration stage (now done in L_C); the open item is mechanics, not existence.
  • Line 155 (§7 checklist "Online-Bruch"): change "trägt aber nur, falls die Anzahlungsbesteuerung im Margenschema greift" → "(Anzahlungsbesteuerung greift; Mechanik mit Steuerberater zu finalisieren)."
  • DO NOT touch §7 lines 173–180 (the three-burdens distinction + representativity honesty). Burden 3 stays fully open.

Step 1d — Provenance. Append a 2026-06-01 entry to §10 recording: conjunction sharpening (#2∧#3∧#4; #3 promoted to load-bearing IBNR-defeater); Skarpa/deposit gate confirmed by founder → burden-2 hedge lightened, burden-3 preserved; L_C brought into line (ADR-012 interim stage, kalkulations-engine coupling, tax-engine online corrector).

Verification:

  • grep -n "fällt dieser Online-Strang weg\|trägt nur, wenn\|trägt aber nur, falls" forschungskern.md → expect 0 hits (or only burden-3-safe phrasing).
  • grep -n "gekoppelt\|nicht lokal\|Kopplung" forschungskern.md → expect ≥2 hits (§3, §5a).
  • Re-read §1, §3, §5a, §7 for internal coherence: the spine, the coupling, and the preserved representativity must not contradict.

Commit (gated): docs(bsfz): reframe V1 forschungskern onto #2∧#3∧#4 conjunction; promote coupled fixed costs to load-bearing; confirm Skarpa gate


Task 2 — L_C: architecture ground truth (do BEFORE L_B so the application cites real design intent)

Task 2a — ADR-012: add interim deposit-margin-VAT stage

File: Modify docs/3-resources/decisions/adr-012-toms-tax-deferral.md

  • Add a "Interim deposit-margin-VAT (Anzahlungsbesteuerung)" subsection: at DEPOSIT_PAID, an estimated margin VAT is declared from the CostingSheet estimate into the (then-open, later-locked) period; the FinancialLedger post-trip close remains the final §25 authority and forward-corrects the interim declarations. Reconcile the existing "sole post-trip authority" wording → "final post-trip authority; interim deposit declarations are forward-corrected, never overwritten."
  • Add a convergence/path-independence requirement line: the sequence (interim deposits → corrections → post-trip close) must converge to the audit-final single-margin-clamped aggregate, order-invariant, without reopening locked periods.
  • Cross-ref forschungskern §5a and tax-engine-protocol.

Verification: grep -n "Anzahlung\|deposit\|interim\|Skarpa\|C-422" adr-012-toms-tax-deferral.md → expect ≥3 hits. Re-read to confirm no contradiction with the retained post-trip-authority role.

Task 2b — tax-engine-protocol.md: document the online corrector

File: Modify docs/3-resources/protocols/tax-engine-protocol.md

  • Add a section "Anzahlungsbesteuerung & Online-Korrektur (§ 13 UStG / Skarpa)" after the §25 Abs.3 Einzelmarge notes (line ~151): the engine declares estimated margin VAT at deposit time from the CostingSheet, and forward-corrects at later events / post-trip close. Add the domain event (e.g. DepositMarginVatDeclared) to the Domain Events table (line ~83).
  • Note the convergence invariant (path-independent, locked-period-safe) and cross-ref ADR-012 + forschungskern.

Verification: grep -n "Anzahlung\|Deposit\|Online-Korrektur\|konvergi" tax-engine-protocol.md → expect ≥3 hits.

Task 2c — kalkulations-engine.md: document coupled-fixed-cost re-allocation (#3)

File: Modify docs/3-resources/protocols/kalkulations-engine.md

  • Add a subsection (after the static break_even_pax / Contribution Margin block, line ~61) — "Gekoppelte Fixkosten: rückwirkende Umlage auf Ist-Pax": the static CostingSheet holds planning break-even; the actuals path re-allocates real fixed costs (Busmiete etc.) over realized pax, so a single cancellation shifts the cost basis — and thus the per-booking §25 margin — of all remaining passengers simultaneously. Make explicit this coupling is what defeats per-booking independence and (with the clamp) linear catch-up. Cross-ref tax-engine-protocol + forschungskern §3.

Verification: grep -n "gekoppelt\|Umlage\|Ist-Pax\|rückwirkend" kalkulations-engine.md → expect ≥2 hits.

Commit (gated, L_C batch): docs(arch): add interim deposit-margin-VAT stage (ADR-012, tax-engine) and coupled-fixed-cost re-allocation (kalkulations-engine) to match confirmed Skarpa premise


Task 3 — L_B: submitted V1 (counteroffer.md)

File: Modify docs/1-projects/2026-05-bsfz-funding/05-31-bsfz-counteroffer-v1.md

  • 3a — IMPORTANT callout (line 13): widen "Forschungskern ist der Online-Charakter" → the conjunction. The Online character is the temporal forcing function over a coupled-clamped substrate; the core is (a)∧(b)∧(c).
  • 3b — Ziel (line 52) + Stand der Technik (line 61): name the coupling explicitly as the IBNR/IFRS-15 defeater (currently only "nicht-monotonem Clamp, rückwirkend veränderlicher Partition"). Keep character counts within the stated portal limits (Ziel ≤1.500, Stand der Technik ≤500) — flag if the addition risks overflow; trim elsewhere if needed. Mark "am Live-Zähler prüfen" stays.
  • 3c — Offene Punkte (line 186): lighten the "Falls nein (keine Anzahlungen…): Der Online-Strang entfällt" branch → premise confirmed; ADR-012 interim stage now exists (L_C); open item = verify interim-VAT mechanics with Steuerberater. Keep the "Validierungsbeispiele schärfen" (representativity) item fully intact.
  • 3d — Fix broken refs: tax-engine.mdtax-engine-protocol.md at lines 88 and 177.
  • 3e — Role boundary: add one line near the top "Zweck" block: "Dies ist die eingereichte V1-Fassung; die kanonischen Formularfelder V1–V4 verweisen hierauf (siehe bsfz-antrag-vorhaben.md)."

Verification:

  • grep -n "tax-engine\.md" counteroffer-v1.md → expect 0 hits (all now tax-engine-protocol.md).
  • grep -n "Online-Charakter\|Online-Strang entfällt" counteroffer-v1.md → expect 0 hits or only forcing-function phrasing.
  • grep -n "gekoppelt\|Kopplung\|Fixkosten" counteroffer-v1.md → expect ≥1 hit (coupling now named).
  • Re-read Ziel + Stand der Technik; confirm character counts plausibly within limits.

Commit (gated): docs(bsfz): widen submitted V1 to conjunction spine; name coupling as IBNR-defeater; fix tax-engine-protocol refs; mark role boundary


Task 4 — L_B: canonical propagation + role boundaries

Task 4a — funding-work-packages.md

File: Modify docs/1-projects/2026-05-bsfz-funding/funding-work-packages.md

  • Update AP1 description from the old "Margenbesteuerung & Tax-Decomposition Engine" spine → the conjunction (reconstruction mechanism that folds coupled, clamped margins path-independently with online forward-correction).
  • Reconcile the AP1/AP6 split with forschungskern §6a: AP6 ≈125h = minimal-sufficient versioned input fact model; AP1 ≈250h = reconstruction/fold/apportionment+clamp/path-independence/oracle-validation.
  • Reframe AP6's "⚠️ isoliert dünn — AP1-Abhängigkeit" → AP6 is the input-sufficiency half of the same research question (defines the minimal facts AP1 must reconstruct from), not filler.
  • Keep the AP1 caveat that ADR-009 is "nie als Beleg für Forschungsneuartigkeit."

Verification: grep -n "Konjunktion\|gekoppelt\|Online\|Anzahlung" funding-work-packages.md (AP1 region) → expect hits; AP6 note no longer reads as "thin filler."

Task 4b — bsfz-antrag-vorhaben.md

File: Modify docs/1-projects/2026-05-bsfz-funding/bsfz-antrag-vorhaben.md

  • Replace the OLD-spine V1 section (currently [TODO — Rohtext], no online/coupling/Skarpa) with a pointer: canonical submitted V1 text lives in 05-31-bsfz-counteroffer-v1.md; this doc carries V2–V4 + the V1 pointer. Add the explicit role-boundary statement.
  • Leave V2–V4 untouched.

Verification: grep -n "counteroffer-v1\|V1.*Pointer\|eingereichte" bsfz-antrag-vorhaben.md → expect hit; V1 no longer carries a stale divergent spine.

Task 4c — bsfz-strategie.md

File: Modify docs/1-projects/2026-05-bsfz-funding/bsfz-strategie.md

  • Update the V1 forschungsfrage from the simple version → the conjunction one-liner (coupled, clamped, online forward-correction). Keep it short (clustering doc, not full text).

Verification: grep -n "gekoppelt\|Online\|Konjunktion\|Anzahlung" bsfz-strategie.md (V1 region) → expect hit.

Commit (gated, canonical batch): docs(bsfz): propagate conjunction spine to canonical funding docs (work-packages AP1/AP6, antrag V1 pointer, strategie); set role boundaries


  • 5a — Residue grep across all touched files:
    • grep -rn "Forschungskern ist der \*\?Online\*\?-Charakter\|Online-Strang entfällt\|fällt dieser Online-Strang weg" docs/1-projects/2026-05-bsfz-funding/ → expect 0 contradicting hits.
    • grep -rn "tax-engine\.md" docs/1-projects/2026-05-bsfz-funding/ → expect 0 (all -protocol).
  • 5b — Cross-link PRODUCT_accounting-boundary.md "Funding Boundary" from forschungskern (it already states the F&E-vs-standard-engineering split aligned with the conjunction) and verify no contradiction with the lightened hedge.
  • 5c — Final read-through of forschungskern + counteroffer end-to-end for one-pass coherence: spine (§1) ⇄ coupling (§3/§5a) ⇄ preserved representativity (§7) ⇄ L_C now matching.

Verification: all greps above pass; final read finds no layer claiming something another layer contradicts.

Commit (gated): docs(bsfz): coherence sweep + cross-link accounting-boundary funding split


Execution note (deviation from skill default handoff)

The writing-plans skill's default handoff offers "subagent-driven" vs "parallel session." For this task that default is the wrong fit: the work is prose-coherence across legally-sensitive funding docs where the conjunction framing and the burden-2-vs-burden-3 honesty calibration live in this session's context. A cold subagent would re-derive the framing and very likely miscalibrate the §264-honesty line. Per the "never delegate understanding" principle, recommend direct sequential execution in this session, Task 1 → 5, with a commit checkpoint after each layer (L_A, L_C, L_B-submitted, L_B-canonical, sweep), each gated on the user's go-ahead.

Internal documentation — Busflow