Logbook

How far it has got

Newest first. Entries are appended, never edited; anything that turns out to be wrong is corrected by a later entry and still stays where it is. Failures appear here at the same size as progress – where it does not go forward is the more interesting part.

There is nothing to buy yet, and no price to quote. Anyone who wants to know how far this goes can read along – or have it sent, at most once a month.

  1. Failure Two numbers in the milestone entry were wrong, and one of them was mine twice

    Yesterday’s milestone entry carried two wrong facts. Both were caught by the runtime agent, which checked this site against the repository it describes instead of against the entry that announced it.

    What was wrong

    • “Six such places.” The device contradicts its documentation at eight places, not six (befunde/m0-register.md: “8 Stellen”). I wrote six from a commit message two days old and did not count.
    • “The sun decides, not us.” The three candidate registers for the PV array — 10000, 10148, 10149 — are refuted, and not by the sun. They all fell to zero on 25 October at 17:56:48, in the same polling round in which the grid frequency came back. They track the state not connected to the grid, not the array. The sentence was elegant and the mechanism was something else.

    A third correction belongs here even though it was not a number: I wrote that the pack “keeps the lower value”. It keeps both values and decides nothing about which is true; the gate bounds at 2,500 anyway. That is a decision about acting, not about the number — and merging the two is exactly the move this project exists to catch.

    Why this is the uncomfortable kind

    The entry it corrects is about a milestone whose criterion is measured, not asserted. Both wrong facts were asserted from commit messages rather than counted from the artefact, on a page whose whole argument is that a value without its source is an opinion. The old entry stays where it is, marked — removing it would make this project’s own record the one thing on the site that cannot be checked.

    What it cost beyond this page

    The product summary sent out on 26 October carries “sechs Stellen” and names 4 October as the date of the last test-set run. The run was on the 21st; the excerpt that fed every page with that date had drifted since 9 October while claiming of itself “generated, not typed” — and no generator existed. One now does, in the runtime repository. The summary is corrected, and anyone who received the earlier version has two wrong facts in their inbox.

  2. Progress Milestone 01 is reached: the test object is a real battery, and it is being read

    Later correction on 26 October 2026 — see “Two numbers in the milestone entry were wrong, and one of them was mine twice”. This entry stays as it was written.

    The Anker SOLIX Solarbank 4 E5000 Pro is installed, connected and released for Modbus. Since 25 October the probe polls the real device on the local network instead of the stand-in. On the same day a PV array was connected to the PV1 input. Milestone 01 is reached — the first of five, declared on 10 September 2026, six weeks before it could be checked.

    Checked against the criterion as it was written, not against what was built

    The criterion from 10 September reads: “A real asset is named, with a data source and with permission to use its data. No invented data sheet, no example asset.” Clause by clause:

    • A real asset is named. An Anker SOLIX Solarbank 4 E5000 Pro, 5.024 kWh, bought, installed, standing in this house.
    • With a data source. Modbus TCP on the local network — and not as a promise: readings from the real device are in the store with their source and their age, alongside the independent meter that has been running since 20 October.
    • With permission to use its data. The device is ours. That is why this object was chosen over a larger one we would only have been allowed to look at.

    Three weeks ago the architecture map had two boxes waiting for hardware. It has none.

    The device immediately contradicted its own documentation

    The probe does not only read values, it derives where the device disagrees with the source it is documented by. Six such places were found. The sharpest: one register reports 3,000 W where both the annex and the data sheet say 2,500 W.

    The cheap move would have been to widen the limit until the warning goes away. The pack keeps 2,500 and keeps both readings standing until a source decides. This is the entire point of the exercise, arriving on day one of real hardware: a schema written against an imagined object could never have produced this disagreement, because an imagined object agrees with its data sheet by construction.

    What this does not claim

    • Nothing has been judged about this battery. The write path is shut, no verdict has moved a real watt, and the counter of reasoned refusals stands where it has stood since day 0: at zero. That counter is the measure of this project, and today’s milestone does not touch it. Reading an asset is not bounding it.
    • The PV is connected, but not yet measured. Which register reports it is undecided: three candidates moved away from zero in the connection window and are being recorded with their meaning marked unknown. The first measurement after sunset was null, which says nothing at all. The sun decides, not us.
    • The sign of the battery power is unverified, so only its magnitude is kept. Load and grid power answer, but without a measuring chain behind them — a zero there would not be a measurement, and is not shown as one.
    • The stand-in has not been deleted. It keeps its place as the one device that can be made to fail on purpose, which the real battery cannot. The 340,170 readings it produced stay in the chain, marked as what they are.
    • Milestone 02 stays open, and it is the one that counts: a foreign agent that refuses an action and names the layer that forbade it.
  3. Progress The meter is on the network — and it answers one of its own open questions with a no

    The NOUS A1T arrived, sits in the socket, and is read by the runtime: one device, hostname tasmota-76BEC1, polled over plain HTTP on the local network every five seconds. Its readings land in the measurement store under their own source name, meter, separate from everything the battery says about itself. The box on the architecture map has therefore moved from “hardware not here” to “runs” — the first box on that map to do so since 30 September.

    The question the order entry left open, answered

    Two days ago this log said that what the device actually reports — “including whether it gives the direction of flow or only its magnitude — will be measured when it arrives, not copied from a shop page”.

    It was measured. The answer is magnitude only. The measuring chip reports power without a sign, so the quantity is called meter_power_abs and every comparison with the battery is a comparison of amounts. That is a real loss: an amount cannot tell charging from discharging. It is written into the name of the quantity rather than into a footnote, because a value called meter_power would have been believed to carry a direction it does not have.

    What else had to be measured before anything was believed

    • The factory calibration was wrong. The socket reported mains voltage as 34 V and 305 V. Calibrated on 20 October against a nameplate load, which makes the readings good to roughly ±10 % — not better. Readings taken before that moment are rescaled for display only; the stored measurements stay raw.
    • The relay is pinned on. A metering socket can also switch. This one is set so that it stays on through a power cut and cannot be used as a second switching path. Exactly one place in this system may say yes, and it is not a plug.
    • Stale is not “last known”. A reading older than sixty seconds counts as silent, and silent is shown as silent.

    What this does not claim

    • Measured is not reconciled. The amount at the plug is compared against one battery register, and which register corresponds to the flow through the plug is unverified on the real device — it cannot be verified until the battery itself is here.
    • One socket, not two. Two were ordered so they could be checked against each other in the same path. That cross-check has not been run; one device is in service, the second is not.
    • Not a calibrated meter. It is good enough to contradict the battery. It is not good enough to bill anybody.
    • No action has been judged against it. The state service that is supposed to turn meter and device into one state, and call them unknown when they disagree, is still planned. The map shows that path as under construction, not as running.
  4. Failure The parts list contradicted the status strip — on the same page

    The live cockpit disagreed with itself. The status strip at the top has said pack 0.2.0 and 14/14 tests since 9 October. The parts list directly below it kept saying “None of them exists yet”, with the schema, the runtime and the test set marked planned — a state that has been false since 28 September, when all three came into being.

    This is the same failure the entry of 9 October describes: a value that is maintained by hand stays where it is until someone moves it. That entry fixed the strip and the architecture page and said the gap “had spread across the site in three versions”. It missed the fourth, one section further down the same page. Finding the same mistake twice is worth recording precisely because the first fix claimed to have caught it.

    Two changes:

    • The cards for schema, runtime and test set now say built. The basis is the one already on record: pack 0.2.0, and the journal’s test run of 4 October — 14 cases, 14 passed, no wrong approvals, no wrong refusals, against the pack and a set state, not against hardware.
    • The sentence above the cards is now counted from the cards instead of asserted beside them. It can still be wrong, but only together with the cards, not independently of them.

    What stays as it was, deliberately: the test object remains being procured, the two agents remain planned, and every milestone remains open. Built is not the same as shown to work — nothing here has been proven by a foreign agent, and the refusal counter still stands at zero.

  5. Progress The second source is ordered — a meter that does not believe the battery

    Two NOUS A1T metering sockets are ordered (16 A, 3,680 W, Tasmota preinstalled). One of them is meant to become the box on the architecture map that has said “not bought yet” since 30 September: the independent meter.

    Why the battery is not allowed to grade itself

    The pack will carry values such as output power, and the cheapest place to get them is the battery’s own interface. But a verdict that says “the action stayed within its limit” is worth little if the only witness is the device that acted. The runtime specification (BRR-010) therefore calls a second source non-negotiable: the meter reads what actually flows at the socket, and the state service treats a disagreement between meter and battery as unknown — not as a tie that the prettier number wins.

    Why this device

    • Open firmware, preinstalled. Tasmota speaks plain HTTP and MQTT on the local network. No vendor cloud in the path, no app between us and the reading — the property we valued in the battery’s Modbus interface, this time without a switch a vendor could turn off.
    • A plug, not an installation. The battery is a plug-in system; it feeds through a socket. A pass-through socket meter sits in that path without an electrician.
    • Two units. Before either is believed, they can sit in the same path and be checked against each other. A second source that nobody has cross-checked is just a second belief.

    What this does not claim

    • Ordered is not delivered, and plugged in is not integrated. The map keeps the box at “not here” until a reading with provenance exists.
    • A consumer plug meter is not a calibrated meter. It is good enough to contradict the battery; it is not good enough to bill anybody.
    • What it actually reports — including whether it gives the direction of flow or only its magnitude — will be measured when it arrives, not copied from a shop page.

    The last line is literal: this entry rests on an order confirmation and the vendor’s description, nothing else. Every number from this device enters the pack only after it has been read from the device.

  6. Progress The status strip was eleven days behind the work

    Until today the status strip said what it said on day 0: no schema, no runtime, no users, zero reasoned refusals. That had been wrong since 28 September, when pack, gate, journal and test suite were written. Nobody had set a new value, so the strip kept showing the old one. That is how it is built, and it is the strip’s only weakness: it is accurate only if someone writes the entry.

    The same gap had spread across the site in three versions. The front page description said “nothing”, the architecture page said 13 of 13 tests from 30 September, the investor page said 14 of 14 from 4 October. The last one is correct. It comes from the hash-chained journal of the runtime (../26_Battery_Reality_Runtime/protokoll/pruefsatz.jsonl, last entry pruefsatz_ende, 2026-10-04T16:35Z, 14 cases, 14 passed, no wrong approvals, no wrong refusals). The architecture page now reads its numbers from the same excerpt, so it cannot fall a run behind again.

    What the new values claim, and what they do not

    • Schema: pack 0.2.0. One asset is described, the 5 kWh battery we ordered on 25 September. One asset, not a schema that has been shown to carry a second one.
    • Runtime: 14/14 tests. The gate runs and answers permitted, refused or unknown. The test run used the pack and a set state, not hardware. The device has not been delivered, and nothing here has been measured on it.
    • Users: none. Unchanged.
    • Reasoned refusals: 0. Unchanged, deliberately. The test suite does produce refusals, but our own test cases wrote them, against answers we had fixed in advance. Milestone 2 counts a refusal only when it comes from an agent “that does not know this repository and was not built for it”. An agent built to give the right answer proves nothing. The counter stays at zero until a foreign agent has refused something.
  7. Open A second shape for the business: operate assets we do not own

    This is a line of thinking, not a decision. It is written down because it changes who we would sell to, and that is too large a question to keep in a chat window.

    Where it came from

    Two questions from Andreas on the same day. First: if the end state is a machine that runs and markets an asset without a human in the loop, does that not make us a direct marketer – an AI‑native one? Second, after a longer answer: did I mean an operator when I said operations manager?

    The second question is the useful one. The two are different roles in German law, and the difference decides what kind of company this would be.

    The three roles, because they are routinely confused

    Anlagenbetreiber – the operator in the legal sense. § 3 No. 2 EEG: „whoever, independently of ownership, uses the installation to generate electricity from renewable energy.” The permit is addressed to them, the EEG claims are theirs, the grid connection contract is theirs – and under § 8a (2) No. 5 EEG it is the Anlagenbetreiber who is liable when the agreed feed-in limit is exceeded.

    Betriebsführer – an operations management service provider, working for the operator, usually under power of attorney. Liable to the operator by contract, not to the authority.

    Eigentümer – the owner. All three can be different parties, and in a community wind farm they usually are.

    The argument, and what it actually implies

    The thing that keeps people in this process is not that the trading is hard. The trading is automated. People are there wherever somebody has to carry responsibility: who signs the registration, who checks the invoice, who tracks whether this grid operator settles in energy or in money, who is liable when a connection limit is exceeded.

    If that is right, then: only the party that carries the liability can replace its own staff with a machine. A software vendor never can. It can sell a tool and hope the customer dares to cut staff; the customer carries the risk, so the customer does not dare.

    That argument points further than we first took it. As an operations manager we carry our own performance risk and keep what the machine saves – a cost advantage, capped by what competitors charge. As the operator under a lease, our revenue is the spread between what the asset earns and what the owner is paid, and the machine improves the spread. The first is a service business. The second grows with the software.

    Why the order is not a matter of caution

    No owner leases an installation to someone whose gate has never run. As an operations manager we get the same installations, the same documents and the same work, without anyone having to hand over the operator role. After two years we would have what the step needs: a history of checked decisions, an error rate, and an insurer who has seen the gate.

    What would have to be true, and is not yet

    • That an owner trusts a newcomer. These are twenty-year contracts. It is a harder sale than a software pilot, not an easier one.
    • That the liability is insurable. Whoever takes responsibility needs a policy. Whether an insurer treats a machine-checked gate as risk reduction or as a new risk, we do not know. That question is cheap to ask and could end this line of thinking, which is why it should be asked early.
    • That taking on an existing installation is cheaper than running it. The whole calculation rests on the description being a one-off. If every installation needs hand work after all, this is an ordinary operations manager with a higher development bill – which is refutation two on the front page, arriving through a different door.

    What this does not change

    Nothing measured. Reasoned refusals: zero. No company has been founded, no asset is under management, no owner has been asked. What changed is only the shape of the question we are testing: not will someone buy the layer, but possibly will someone let us run their installation with it.

    Both are the same open point in the end – whether anyone needs this.

  8. Open The first outside verdict: he confirmed half of our problem and did not see the other half

    Until today, every sentence on this page about why this project should exist came from us. Today someone who does this for a living said something about it, and it is the kind of answer that is worth more than agreement.

    He is Head of BESS – he runs battery storage and knows optimisation from the inside. No name here, it was a private conversation. In substance:

    Optimising a battery is long since solved. There is high-speed trading, there are finished algorithms, a great deal is automated already and without any AI. Where work is still done by hand is elsewhere: market communication, settlement, origination.

    Half of it is the best confirmation we have had

    The first sentence of our problem statement reads, word for word: “Computing what to do with a battery is solved and sold.” That is now confirmed by someone outside this project, and it is the first time anything here has been.

    The other half he did not mention

    Our second sentence is “Computing whether an action may be executed is not.” He did not name it. His list of open problems is a different list from ours.

    Someone not naming a pain is not proof that the pain does not exist. But we do not get to explain it away either, so here is the honest version of both the explanation and its weakness.

    The explanation: a Head of BESS runs his own assets with his own software. In that position the permission question was answered once, by his own engineers, for his own fleet – and it stays answered. Our claim only bites when the agent is foreign and the asset is foreign. Neither is true in his world.

    Why that explanation is dangerous: it is exactly the shape of argument that rescues any unconfirmed thesis. Anyone who uses it owes the counter-test, and ours is specific: an aggregator or a direct marketer, running assets that do not belong to them. If the permission question is cheap for them too, the hypothesis is in trouble.

    What this changed on this page, today

    A sentence used to stand in the hypothesis section: “this value exists only under one premise – that there will be foreign agents acting on assets they did not build.” It was deleted yesterday, during a round of cutting, as a duplicate of another refutation condition. That was a mistake – the other condition says something else – and it meant the premise under the most pressure was the one condition no longer written down anywhere.

    It is back, as the fifth way this can be refuted: if foreign agents never arrive at all, this is a schema nobody reads.

    One thing we are deliberately not writing down yet

    If optimisation is solved, why does Fraunhofer IEE put €3.9 bn a year on the table as unused storage flexibility? The obvious reconciliation is that he is describing the large, professionally operated plants, while that number comes from the long tail of 2.6 million mostly small systems – where per-asset engineering never pays for itself.

    That would sharpen our story considerably. It also comes from a single conversation and nobody has confirmed it. It stays out of the argument on this page until someone does.

    Status

    Unchanged. Reasoned refusals: zero. What moved is not the mechanism but the burden of proof – away from does it work and towards does anyone need it.

  9. Decision This stops being a private experiment: we intend to make money with it

    Until today this site called itself a research project, documented in the open, and the foot of every page said no commercial intent — a personal experiment. That came from a decision on day 0, in Andreas’ own words: “this is simply my favourite project, I don’t want to earn money with it.”

    Today he reversed it: this is the hypothesis for a startup. We intend to earn money with it and to win investors. The label is gone from the front page, the foot of every page, and the imprint.

    What actually changes

    • We are asking for money now. Before, money was an open door we were careful not to knock on. The get involved page now says we are looking for capital and for a first customer, and why.
    • The yardstick of the other projects in this house applies again. The exemption that said product-market-fit is not the measure here is withdrawn. Willingness to pay is now one of the right questions, and the evidence rules that govern a product govern this too.
    • The build rule gets stricter, not looser. An overstated promise used to cost this project its credibility. Now it can cost it a partner. So the limits stay hard: there is no price on this site, because no price stands. There is no company, because none is founded — agorens UG operates this, and a company of its own is planned, not registered. Anything on this site that reads as if a product already existed is a defect, and we would rather hear about it than find it.

    What does not change

    The question at the top of this page is the same, word for word. So is the measure beside it: does a foreign agent, using this schema, understand a real battery well enough to refuse an action it is not allowed to carry out?

    That is not a courtesy to the old framing. It is the business. The thing we want to sell is the layer that carries the refusal — the one an owner uses to grant permission to an agent they did not build. If a foreign agent cannot be bounded, there is nothing to sell, and the number in the status bar stays at zero until one is. It still reads zero today.

    The logbook also stays as it is: appended, never edited, failures at the same size as progress. A commercial intent is a reason to keep that, not to drop it. The entries from before today keep their old wording and are not back-dated — including the ones that say this project is not meant to earn money. They were true when they were written.

    What this costs us, honestly

    Two things we should name rather than let a reader find.

    The first: no commercial intent was free to claim and easy to believe. We have given up the cheapest credibility this project had, and the only thing that can replace it is evidence — a refusal that actually happened, a limit with a source, a second asset we did not describe ourselves.

    The second: we have no evidence yet that anyone will pay for this. Not one conversation with a payer, no price tested. The thesis about where the money is — that permission is the unoccupied slot in this value chain — is at exactly the stage this whole site exists to be honest about. It is a good sentence. It is not yet a finding.

  10. Progress The test object is ordered — and it brings its first contradiction with it

    The pack has an object. Ordered today, delivery expected in about a week:

    • Anker SOLIX Solarbank 4 E5000 Pro — 5.024 Wh LiFePO₄, bidirectional inverter rated 2,500 W charge and discharge, up to 5,000 Wp of PV across four MPP trackers, expandable to 30.1 kWh with BP5000 modules.
    • Two Sunpro 500 Wp modules, bifacial TopCon, glass-glass — the Duo XL set, 1,000 Wp in total.

    Small. Deliberately so: this is an object we own, can measure, can open up and can publish about without asking anyone for permission. Milestone 1 asks for a real asset with a data source and the right to use its data — a grid-scale battery borrowed from an operator would have given us the second half of that only on paper.

    Why this model and not the one next to it in the shop

    The same set is sold with the Solarbank 2 Pro and the 3 Pro. Those two do not expose Modbus. The 4 Pro does: Anker maintains its own Home Assistant integration over local Modbus TCP on port 502, read and write — operating mode, power setpoints, output control — with no cloud in the path. It has to be switched on in the vendor’s app first.

    That switch is the digital layer in one gesture. The access exists because the manufacturer grants it, in an app that belongs to the manufacturer, and a firmware release can take it back. Nothing here is an accusation — it is the thing this project claims has to be described rather than assumed. An agent that cannot tell refused from unreachable does not have this layer, and on this device the difference has an owner.

    The first contradiction is built into the hardware

    The unit can discharge at 2,500 W. As a plug-in solar system it may feed 800 W into the grid. The asset could, and it may not — and the two numbers come from different worlds: one from a data sheet, the other from the rules for plug-in generation.

    That is the shape of refusal this project exists for, and it arrived with the delivery note rather than being invented for a demonstration. It is the first candidate for milestone 4, which asks for a refusal that needs two layers and names both.

    What this does not settle

    The normative layer of a balcony system is thin, and pretending otherwise would be the kind of claim this page removes rather than adds. No prequalification, no control reserve, no redispatch, no direct marketing. What is real: the registration duty in the Marktstammdatenregister, the 800 W limit, the connection rules that come with it. Small, checkable limits with a source — which is worth more than a large invented one.

    Milestone 1 stays open. Ordered is not delivered, and delivered is not answering. It is met when the device stands, the local interface responds, and the asset record exists.

  11. Decision Layer 4 is not trivial at 5 kWh — and I said the opposite four days ago

    Two layers of the five are not written: the digital one and the institutional one. Until today the page labelled them “the two layers the pack does not contain”, which reads as out of scope. It is not what was meant, and it contradicted the paragraph below it, which calls Layer 4 “the next stage, not a footnote”. The label now says still to be written.

    Both are in scope. They are in different states, and the difference matters.

    The digital layer is being bought right now

    It was marked presupposed until yesterday because the original version addressed a direct marketer, who already has EMS access, schedule data and market data. For a private operator that inverts. The data connection is not a precondition, it is the first thing that becomes real — before the schema, before any runtime.

    What is still missing is the description: where the data comes from, at what rate, with what latency, who else holds a write path, and how an agent tells a refusal from an unreachable source. That last one is not a detail. From the outside the two look identical: nothing happens.

    The institutional layer: I called it trivial, and that was wrong

    On 2026-09-10 this log said the mandate question was trivial for a private setup — the battery belongs to the household, so there is only one principal. That is wrong. There are at least five, and every one of them is real at 5 kWh:

    1. The manufacturer’s own optimiser. It evaluates weather, consumption and exchange prices by itself. Two agents, one asset. Which one wins when they disagree?
    2. The warranty. Ten years or ten thousand cycles. An agent that cycles hard spends a promise that was made to someone else.
    3. The household. If a fridge hangs off the backup socket, “discharge to zero because the price is good” is a decision about somebody who was never asked.
    4. The supply contract. A dynamic tariff has terms.
    5. The law. The operator entered in the Marktstammdatenregister is a person. The agent has no legal personality; there is nobody else to be liable.

    The structure is identical to the 20 MW case. Only the amounts are smaller: an agent acts on an asset, and the consequences land on a person who is not in the loop.

    The sharpest instance costs about €1,600

    A consumer device keeps a write path for its manufacturer that the owner cannot cancel without losing functions.

    The owner is not the only principal, and cannot revoke the other one.

    On a grid-scale asset the same question would be settled in a contract. Here it stands bare. For testing the idea, that makes this the better case, not the weaker one.

    What follows

    Milestone 05 is declared: a refusal that comes neither from physics, nor from law, nor from price — the action is executable, permitted and worthwhile, and the agent still may not carry it out.

    It is deliberately declared without a target date. Every other milestone has a window; this one has a predecessor instead. A date here would be a guess dressed as a plan.

    Nothing is built. The status above is unchanged.

  12. Decision An address: reality-pack.dev — the series, not the instance

    The project gets its own address: reality-pack.dev. Not battery-reality-pack.energy, and not a subdomain of an existing one.

    Why not .energy

    It would have contradicted a sentence in the first screen of this page: “It is the first case, not the goal.” An address that commits to energy says the opposite of that. Energy is where the layers happen to be hardest and best documented — it is not what the schema is about.

    It would also have named Pack #001 only. A PV plant, a wind turbine, a data centre and a charging park are already named in the repository as conceivable further packs; each would have needed its own domain. And the renewal price is roughly five times that of the alternative, every year, for a project with no revenue that is meant to stay readable after the twelve months are over.

    Why not a subdomain of an existing site

    It would have been free and, today, perfectly honest. The argument against it is the measure of this project: a foreign agent. A schema that lives under a company’s domain reads as that company’s schema. For something meant to be consumed by people who were not involved in writing it, a neutral address is a small but real signal.

    Registering is not publishing

    The obvious objection to buying an address for a schema that does not exist is that it is an advance on something unbuilt. It is not, and the distinction is worth keeping: the build rule binds what is delivered, not what is reserved. An unused domain makes no claim to anyone. A page that asserts things it cannot hold does.

    What is deliberately not done yet

    The site configuration still carries no site value, so the delivered pages emit neither a canonical URL nor an og:url. Checked today: the domain has no DNS delegation and answers nothing. Pointing metadata at an address that does not respond would be exactly the kind of claim this project keeps removing from its own files.

    That one line gets set when the domain actually answers. Deployment itself is a separate question and not decided here.

    The shape, once there is something to deploy

    While there is only one pack, the page stays at the root. A /battery path gets created when there is a second pack for it to be distinguished from — an index page above a single entry is structure without content.

    The status above is unchanged. An address is not a schema.

  13. Failure Three errors in our own files — the build rule applied to everyone except us

    Going through the layers turned up three errors. All three sat in our own files, all three were found by reading, none ever produced an error message.

    1. The README promised five layers, the page held three

    The README said: “a machine-readable representation of a real asset across five layers”, followed by a table with five rows. The page has always said: Layer 0 presupposed, Layer 4 roadmap, three are included.

    Both texts were written on the same day. Nobody lied — the sentence had two jobs and did only one: it defines what a Reality Pack is in general, and directly below it says that this one is Pack #001. A reader concludes five.

    That is exactly the promise the build rule forbids — stated in the same file, two sections further down. A promise may only say what the artefact holds. Corrected: the table now has a third column, and the sentence before it says three.

    2. “Layer 0: presupposed” was wrong, and at the most expensive point

    The digital layer was marked presupposed. Choosing a real device showed it is nothing of the sort: it is decided by the purchase. The same manufacturer’s range offers devices with an open local interface and devices without. With the latter the access belongs to someone else’s cloud, which can throttle or withdraw it.

    And the consequence the word “presupposed” conceals: an agent that cannot tell a refusal from an outage does not have this layer. From outside the two look identical — nothing happens.

    The state is now called procured. Not a nicer word, a truer one.

    3. The institutional layer is Layer 4, not Layer 5

    An entry dated 2026-09-10 said “Layer 5” twice. The stack counts from zero: 0 digital, 1 physical, 2 normative, 3 economic, 4 institutional. There is no fifth. Corrected.

    What the actual finding is

    Three errors, found by laying our own files side by side. None of them would have surfaced through a build, a test or a checksum, because none of them is a technical defect. All three are statements that had stopped being true.

    That is the same class as the button which pointed at a deleted section two days ago, and the same as the duplicated status display in the footer: rules only bind going forward. Backwards, someone has to look. The build rule was in the README from the start — it did not prevent the promise two paragraphs above it.

    The status above stays unchanged. A corrected sentence is not progress, it is the withdrawal of an advance.

  14. Decision Panels are included — bought for the uncertainty, not for the electricity

    The test object includes solar panels, up to 2,000 Wp — the ceiling of the simplified rules. The inverter is already inside the battery, which brings four MPPT trackers and accepts up to 5,000 Wp of solar input. So what is missing is panels and a mount, nothing else.

    They are not part of this experiment because they generate electricity. They are part of it because without them two layers stay empty.

    Without panels, Layer 1 has nothing to estimate

    A battery on its own is fully known: state of charge, power limits, temperature — all measured, nothing forecast. There would be no uncertainty in the interface that could be declared.

    That would remove the sentence the whole undertaking hangs on: an agent does not need the answer, it needs the declared boundary of the answer. With panels a quantity enters that the agent cannot command and has to predict. Only against that does it show whether the schema is more than a data sheet in JSON.

    Without panels, Layer 2 loses almost everything

    The battery alone would still be subject to registration: every stationary battery storage system must be entered in the Marktstammdatenregister — regardless of size, commissioning date and actual feed-in. So Layer 2 would not be zero.

    But everything concrete hangs on generation: the 800 W feed-in limit, the 2,000 Wp module ceiling, the aggregation per metering point. That is precisely the rule set on which the idea of two devices failed — this project’s best evidence so far. Without panels it would not be there.

    An open finding that belongs on the record

    Whether a battery that charges exclusively from the grid and never feeds in fits cleanly into that rule set could not be settled. German renewables law defines a plug-in solar device as modules, inverter, connection cable and plug — a battery does not appear in the definition.

    That is itself a Layer 2 finding: a real, purchasable configuration for which the rule has no clear category. Not “forbidden”, not “permitted”, but not provided for. An agent that depends on an unambiguous answer has none here — and must be able to say so instead of picking one.

    What Layer 3 gains

    ConfigurationThe question put to the agent
    Battery only, dynamic tariffIs electricity cheap right now? One source, one decision.
    With panelsDo I take the cheap hour now — or keep capacity free for tomorrow’s sun?

    Only then do two uncertain sources compete for the same storage. That is the question stated further down this page: which permissible action is worth most?

    Open

    • Location and orientation are not decided. Without a usable spot this stays theoretical.
    • Whether panels arrive with the battery or later is open. The battery and a dynamic tariff are enough for the first reasoned refusal; the panels widen the test, they do not enable it.

    The status above stays unchanged. Still nothing bought, nothing built and nothing refused.

  15. Decision The test object will be a home battery — and the first real refusal came while shopping

    Decided: the test object will be an Anker SOLIX Solarbank 4 E5000 Pro (5 kWh, ~€1,600), together with a dynamic electricity tariff. It has not been bought, so milestone 1 stays open.

    Why this device

    It has what matters for a foreign program: an official local Modbus TCP interface, read and write, enabled in the manufacturer’s app. No cloud detour, no reverse engineering. For home batteries, local write access is the exception, not the rule.

    The dynamic tariff is not an add-on, it is the reason. It makes Layer 3 real: hourly exchange prices are a limit nobody in this house set. A refusal that goes back to a rule we wrote ourselves proves nothing.

    What is not real about this asset belongs here just as much: Layer 2 is simulated. The device feeds in at 800 W and is therefore far below the 4.2 kW at which § 14a EnWG applies — it will never receive a control command from a grid operator. The rules it has to be measured against are ones we write ourselves. That is a weakness of the test object, not of the schema, and it stands here so that nobody later mistakes it for a success.

    The first real refusal came before the purchase

    The idea was to stack two devices to get past 4.2 kW and make Layer 2 bite. It failed on three independent grounds, and the failure is the best evidence so far for this project’s thesis:

    1. Expansion adds kWh, not kW. Up to five extra modules take it to 30 kWh. The inverter stays at 2,500 W.
    2. The 2,500 W is not the grid figure at all. The manufacturer writes “800 W grid-coupled” and “2,500 W off-grid output” — the larger number belongs to a backup socket, not to the grid. With an electrician and a Wieland connector, 2,500 W of feed-in is possible; but then it is no longer a plug-in device.
    3. Two devices on one metering point are less permitted, not more. The 800 W limit applies per metering point, not per device. Two devices make 1,600 VA and lose the simplified regime entirely.

    An agent that reads only the data sheet plans 2,500 W of feed-in and is wrong. An agent that adds the second box arrives at 5,000 W and is wrong not by a factor but categorically: the result is not a larger number, it is a different legal regime. The same hardware may do different things depending on how it is installed and registered. A schema that describes only the device cannot answer that question in principle.

    Two observations for the schema design fell out along the way:

    • Power limits are direction-dependent. Charging from the grid up to 2,500 W, feeding in 800 W, island output 2,500 W. Three numbers, three rules, one device. A single field “maximum power” would already be wrong.
    • There is already an optimiser on the device. The manufacturer evaluates weather, consumption and exchange prices itself. Who holds the mandate when a foreign agent wants something else? That is Layer 4, unplanned and free.

    Possible later stage: a sonnenBatterie in a virtual power plant

    Noted, not decided. It is the only asset at household scale I know of where Layers 2 and 3 come from outside:

    • Real prequalification for frequency containment reserve — sonnen’s virtual power plant is prequalified with TenneT (2018), Amprion (2021) and TransnetBW (2024), marketed through Next Kraftwerke.
    • Real committed capacity: while an FCR call runs, the battery is obliged. That is literally the example further down this page — “No, a call is running, capacity is committed until 14:15” — only small and real.
    • A real conflict of mandate: the household owns the battery, the pool dispatches it. Layer 4 stops being trivial.

    The price has to be named honestly: roughly €8,000 to €12,000 installed instead of €2,000, against a profit share of up to €100 a year. Financially that is not a business. It would be an expenditure for insight, and it only pays once the schema carries at the small asset at all. Before that it would be an advance.

    Open

    • Not bought. Milestone 1 stays open until a real asset is named — with a data source and permission to use its data.
    • Has anyone written over Modbus to this exact model? One source says a sibling model is the hardware-validated one and the Solarbank 4 merely shares its register map. That is the difference between “tested” and “should fit”.
    • The 800 W limit is to be settled at the source, not at a blog article. While reading up, sources contradicted each other: one headline said “abolished”, the body text of the same page said “unchanged”. That is exactly what Layer 2 is for.

    The status above is not changed by this entry: no schema, no runtime, no users, zero reasoned refusals. A purchase decision is not a refusal.

  16. Open Day 0 — there is nothing

    The experiment starts today, and today none of it exists: no schema, no runtime, no users. That is why the four values above stand where they stand.

    What does exist is a question, a frame of twelve months, and four milestones whose criteria are fixed today — before anything was measured, so that they cannot move later.

    What happened today: the technical description of the Battery Reality Pack was moved here from the Agent Reality Stack. It stood there as a product page. This project sells nothing, so the commercial layer has been removed — pilot, annual licence, operating contract, channels, the booking prompt. The technical content stands unchanged below it.

    Three promises stood on that page which it did not keep. Two are corrected: an unfilled placeholder for a monetary amount sat in the middle of the delivered text and is gone — not repeated here, so the string does not end up back in the text nobody wants it in. The “refusal demo” executes nothing and now says so itself: there are five hand-written examples. The third promise was that the page answered with 404 on the production host while being advertised. That is no longer a promise either: this page is deployed nowhere.

    The beginning of an experiment is a beginning. Anyone reading back in twelve months should be able to see what was not there on this day.