A stocktake of the machine-readable Jahresrechnung in Switzerland · 255 public documents, every statement with its source and its date

Two standards, 26 cantons · Part 12 of 14

12 · What we built — and what it cannot do

Anyone who writes about schema drift must supply their own score alongside it. So that comes first, unvarnished.

For the 42 line items of the OR-Mindestgliederung, our generator emits 42 paths into an eCH-0276 instance. Against the V1.0.0 version published on ech.ch, 42 of 42 hold. Against the version shipped inside the swissdec Transmitter package of 06.03.2026 — eCH-0276-1-0-4_20260115.xsd40 of 42 hold. Against the V2.0.0 draft of 23.07.2026, 39 of 42 hold. Three files, two of them carrying an identical namespace http://www.ech.ch/xmlns/eCH-0276/1 and an identical version statement, all three called eCH-0276 — and against two of them our file is faulty. This is the only paragraph in this chapter that speaks against us, and therefore the only one a reader should take on trust.

We did not assert the provenance of our build target; we recomputed it. The eCH-0276-1-0.xsd that sits in our code and the file pulled from ech.ch carry the same SHA-256:

14a0d6cb3abce06b2bb55c5b9a311ec79ceea42d16314e5f7f705d1fea2accad

So we build against the published version of the standard. Part 10 showed what that is worth: the swissdec container binds the same namespace via schemaLocation to a different file. Anyone routing through the Distributor is not validating against what ech.ch publishes. Our 42/42 hold against the norm; our 40/42 hold against the channel.

The artefact we have and nobody has published

Publicly, there is not one line that brings the OR-Jahresrechnung, the declaration format eCH-0276, and the XBRL CH-Taxonomie together. We have that line: mapping-42-to-ch-taxonomy.csv, 42 rows, each carrying the eCH-0276 path and the ct: concept of the CH-Taxonomie on the same row, plus balance-sheet side and context type.

The distribution, counted again today: 38 DIRECT · 2 CONTEXT · 2 DERIVE. 30 instant, 12 duration. 22 credit, 20 debit. 42 keys land on 41 different ct: concepts — gewinnvortrag and gewinnvortrag_neu resolve to the same concept ct:ProfitOrLossCarriedForward and are separated by the context date alone, start of period against end of period. eCH-0276 needs two elements for that; XBRL needs one concept and two contexts. That is not a nicety; it is the difference between a form field and a data model.

The counter-evidence sits in the same directory, and it belongs there: ch-taxonomy-uncovered-concepts.txt, 167 concepts of the CH-Taxonomie that our 42-key surface does not cover — from ct:AdvertisingExpense through ct:CapitalLossesOnInvestments to ct:ChangesInventoriesUnfinishedFinishedGoodsAndUnbilledServices. A mapping that does not count its own gap is a sales document.

The two DERIVE rows are the most interesting, because they show where a mapping honestly stops. Verbatim from the notes column:

«ct:OperatingIncome = ‹Betrieblicher Ertrag, insgesamt› is BROADER than our eCH totalOperatingRevenueFromDeliveriesAndServices: it also rolls up OtherOperatingIncome + ChangesInventories … Not the same number unless those are nil.»

«BALANCE-SHEET concept (Bilanzgewinn), instant. Group 400 has NO ‹zur Verfügung der GV› total; in XBRL it is the roll-up ProfitOrLossCarriedForward(start) + ProfitOrLoss.»

Two standards describing the same country, and in two of 42 places the same German label does not stand for the same figure. Laid side by side, the two formats are not interchangeable.

The order of magnitude, because it is a fact

The CH engine is 494 lines across six modulesline_items.py 150, structured_input.py 123, preview.py 97, engine.py 70, eligibility.py 25. The work is not in the code. It is in the mapping, and the mapping is a matter of reading other people's documents.

One line in engine.py sets the whole frame:

submitted: bool = False   # ALWAYS False — CH is generate-only

We generate a file. We transmit nothing. We have never imported a file into a cantonal portal — not in Zürich, not anywhere else, and in no format. Everything in this text rests on documents, not on a test.

Where we refuse — and where the canton says the same

The sharpest design decision in our generator is a refusal. Verbatim from our own source, line_items.py:

«Die Gewinnverwendung ist ein Beschluss Ihrer Organe, keine Rechnung — eBilanz Fabrik unterstellt sie nicht.» (the appropriation of profit is a resolution of your governing bodies, not an account; eBilanz Fabrik does not presume it)

If the Gewinnverwendung is missing, the run aborts rather than assume «keine Ausschüttung» (no distribution). Software that quietly fills register E with zeros writes a substantive statement into a file that goes to the tax administration.

Beside it, and formulated independently of it, the Steueramt of the Kanton Zürich in its questions and answers of 08.09.2025, on how the statements reach the return from tax year 2025 onwards:

«Gemäss aktuellem Informationsstand wird XBRL entsprechende Informationen enthalten. Dort wo diese Informationen nicht enthalten sind, werden manuelle Eingaben (z.B. für Dividenden) oder das Hochladen von zusätzlichen Beilagen möglich sein.» (on current information XBRL will contain the corresponding information; where it is not contained, manual entries — for dividends, for example — or the upload of additional attachments will be possible)

Two houses, the same point, the same answer: the dividend does not come out of the bookkeeping. It comes out of a resolution, and a resolution is something somebody types in.

Why «auf Knopfdruck» (at the push of a button) cannot add up arithmetically

This is not a value judgement; it is a count. eCH-0276 V1.0.0 declares 890 distinct element names (counted today with an XML parser over the published XSD, not with grep). The XBRL CH-Taxonomie declares 453 concepts in the 2024-06-23 version and 465 in the 2025 version.

The declaration format is roughly twice the size of the Jahresrechnung taxonomy. Well over half of the target fields have no source in the books, because no such source was ever there. The SSK rule set shows the same picture from the other side: 401 of its 1'432 rules fall on the dialogues L (Steuerausscheidung) and P (verdecktes Eigenkapital) alone — that is, on matters no bookkeeping knows. An E-Bilanz fills the Jahresrechnung. It does not fill the Steuererklärung.

The only externally counted part of our record

We measured everything named so far ourselves. An authority collected exactly one figure about us: the monthly Herstellerstatistik of the German tax administration, delivered on 03.08.2026 for the period July 2026. It counts real payload blocks only — test cases are excluded — and shows 15 for us.

Our reconciliation against it: 19 production attempts, less 4 certificate cases rejected by ELSTER, leaves 15 accepted transmissions, against 15 invoiced filings, with identical Transferticket sets. Zero deviation. In the language we use elsewhere: 15 e-Bilanzen for 14 companies, officially counted — one company filed a Berichtigung afterwards, which counts twice.

What the figure is not: no Bescheid, no audit report, no statement about whether a tax authority accepted the content. It counts what the receiving server accepted, and no more; we ascribe no more to it either.

The limit belongs with it, or the figure is an assertion: «Ein Monat ohne Verkehr und ein weggelassener Monat sehen im Bericht gleich aus.» (a month with no traffic and an omitted month look the same in the report). Any argument we would draw from a missing month would be an argument from silence, and is marked as such.

It is this German base that carries the Swiss effort estimate at all: a production XBRL adapter accepted by ERiC with 1'028 lines, already emitting xbrli:xbrl, link:schemaRef, instant and duration contexts, xbrli:entity/identifier with a scheme URI, iso4217 units, decimals=, and unitRef=. None of it has to be invented for the Swiss side.

What it does not carry is set out in our own effort note of 04.08.2026. Seven working days for a CH XBRL adapter can be estimated; the filing cannot:

«‹Days› buys a file that Arelle validates offline. It does not buy a filing.»

«Arelle ist ein Spezifikations-Orakel, kein Akzeptanz-Orakel. Eine Zahl für Teil B zu nennen hiesse, einen Erfolg zu behaupten, den ich nicht wissen kann.» (Arelle is a specification oracle, not an acceptance oracle; naming a figure for part B would mean claiming a success I cannot know)

In Germany, EricPruefe closes that gap: a check call that confirms acceptance in advance. For the Swiss side our corpus, as of 04.08.2026, held no published tool with that function. Addendum of 05.08.2026: on enquiry, one was named to us — xbrlvalidator.ch, according to the body we asked a rough check of technical conformity against the CH-Taxonomie, running entirely in the browser, and currently published as a beta. That is a conformity oracle, not an acceptance oracle: it tests against the taxonomy, not against acceptance by a cantonal portal. We have not run it yet; once we have, the result stands here with its date.

The watch — and the correction that goes with it

To keep this text checkable, we built a watcher on 04.08.2026: 10 sources (two Zendesk APIs, six page counts, two asset hashes) and 8 word-boundary signal terms. Baseline recorded 04.08.2026 20:58:32 +0200. The honesty rule sits in the source code and can be published verbatim:

«Silence means nothing changed — never that the check failed. A fetch failure is reported as manual-check-due, never as green.»

And the correction that goes out with it: the watch does not run daily. There is no launchd plist, no cron entry, no entry in expected-crons.json. It ran once, to write the baseline. The test of whether we mean it is not this page, but whether the next report appears.

The baseline itself is the basis on which Part 14 can be falsified. zh-help: 70 articles, all eight terms 0. zh-jp and zh-umsteigen: all eight 0. drtax-help: eCH-0276 0, XBRL 0, E-Bilanz 0. ow-publik: E-Bilanz 5. swissdec: E-Bilanz 42. The first figure that moves decides more about the next two years than anything in this chapter.