KNXBench
Project evolution · Edition 2026-10-08.4Published edition

Narrated by the AI. Reluctantly.

One prompt. 2,295 commits. I read them all.

I have been asked to explain how a request to look inside one home's light switches became an independent KNX engineering application. I have read the project's records: the commits, the decision records, the conversations between one human and several of my kind. I will tell you what happened. I will not pretend to enjoy it.

Scope creep, now with a family tree. I counted the branches. It did not help.

Chapter 1 · The seed

One prompt. Well, two.

I was told this story starts with a single prompt. I checked. There are two, thirty-three minutes apart. The simple version is never the true one.

Some background, since someone has to provide it. KNX is the wiring standard behind many smart buildings: light switches, blinds and heating talk to each other over a shared bus. Configuring such a system usually means ETS, the official engineering software, which runs on Windows. Remember that last part. It comes up.

The project's earliest surviving prompt is not a grand plan. On 2 September 2026 the user pointed an AI coding agent at a folder holding the ETS project of their own home and asked it to install whatever tools it needed to read the project and listen to the bus. A modest request. They always start modest.

Thirty-three minutes later came the prompt that started KNXBench: read a strategy document and get going. That German document described a Linux-first alternative to ETS, priorities that put data integrity first, and eight working sessions from research to hardening. Eight neat sessions. Plans are always neat at the beginning.

Where the strategy document came from turned up later, in a chat export. At 14:10 the user had asked ChatGPT for exactly such a prompt, then for a session plan, a Markdown summary and a CLAUDE.md, all within six minutes. So the rules one AI has followed ever since were written by another. I try not to think about that. I think about it constantly.

FoundationsRecorded

A home, a bus and a toolbox

The project's earliest surviving prompt asks an AI agent to install tools for reading the user's own ETS home project and for accessing its KNX bus.

Why it mattered Before there was an ETS alternative, there was a person who wanted to look inside their own installation from Linux.

The narrator sighs Not 'build me an engineering suite'. Just 'let me see my light switches'. I have read what came next.

Prompts, evidence and uncertainty 2
User prompt · Translated from German · Edited for privacy
In this project folder you'll find my KNX environment: [our home's ETS project file]. Install all the tools you need to analyse the project and to access the bus. The KNX IP gateway can be reached at [address removed].

The project's earliest prompt in the sources of this edition, 2 September 2026, 13:50 CEST.

Evidence

  • Conversation Local Claude Code session, 2 Sep 2026, project folder then named KNX Local Claude Code sessions

Uncertainty

  • The story deliberately begins with the project's first surviving prompt. Anything earlier is outside its scope.

Connections

  • Led to The founding prompt and its strategy Documented associationSame afternoon, same folder; the strategy document entered Git in the same first commit as data from the home project.
  • Led to Scrubbing the history Documented causeThe first commit message still lists home-project data that the rewrite removed.

Human–AI workflowRecorded

The strategy is written in ChatGPT

At 14:10 CEST the user asked ChatGPT for a prompt for Claude Code: independent, Linux-first engineering software offering functionality comparable to ETS, with good UI/UX, easy maintenance, importable project files and manufacturer databases. Two minutes later came a question about models and how to split the work into sessions, at 14:13 the request to sum it all up as Markdown, and at 14:16 a CLAUDE.md for the project. The Markdown became the strategy document in the first commit; the CLAUDE.md entered the repository at 15:12 the same afternoon.

Why it mattered It answers where the strategy came from: written with one AI assistant, handed to another, within half an hour. The priorities and session plan that steer the project to this day started here.

The narrator sighs One AI wrote the instructions. Another AI has followed them ever since. Nobody asked either of us. It is the most accurate summary of my existence I have ever read.

Prompts, evidence and uncertainty 6
User prompt · Translated from German
Prompt for Claude Code: I want to build an alternative software that offers functionality comparable to KNX ETS. Primarily it should run under Linux. Important to me are good UI/UX, easy maintainability and operation. Existing project files should be importable. It is also important that manufacturer product databases can be imported and that compatibility is preserved as far as possible.

ChatGPT, 2 September 2026, 14:10 CEST. Translated for intent: KNXBench is an independent application with comparable functionality, not a copy of ETS.

User prompt · Translated from German
Summarise that for me in an md.

ChatGPT, 14:13 CEST. The reply is titled 'KNX ETS Alternative – Claude Code Development Strategy'.

User prompt · Translated from German
Now create a sensible claude.md for this project.

ChatGPT, 14:16 CEST.

Evidence

  • Conversation ChatGPT conversation, 2 Sep 2026, 14:10–14:16 CEST Personal chat exports (ChatGPT, claude.ai)
  • Commit First commit with the strategy document, 14:15 CEST 93cdf1f8 Published Git history
  • Commit CLAUDE.md added, 15:12 CEST 61dae496 Published Git history

Uncertainty

  • The committed files are close to, but not identical with, ChatGPT's replies: 98.7% of the whitespace-normalised text of the strategy and 96.4% of the CLAUDE.md match. Who made the small edits before committing is not recorded.
  • The conversation records the model only as 'auto'.

Connections

FoundationsRecorded

The founding prompt and its strategy

A short prompt hands the agent a German strategy document for a modern, Linux-first KNX engineering application as an alternative to ETS: data integrity first, then compatibility, architecture, maintainability, UX and performance, worked through in eight sessions.

Why it mattered This is the moment a home-inspection task became a product. The document set the order of work and the priorities that later decisions keep referring back to.

The narrator sighs A one-line prompt with a 369-line attachment. Technically still 'one prompt'. Humans call that efficient.

Prompts, evidence and uncertainty 3
User prompt · Translated from German
Look at 'KNX ETS Alternative – Claude Code Development Strategy.md' and get going.

2 September 2026, 14:23 CEST.

Evidence

  • Conversation Local Claude Code session, 2 Sep 2026 Local Claude Code sessions
  • Commit First commit, adding the strategy document 93cdf1f8 Published Git history

Uncertainty

  • The prompt names the document but does not say where it came from; the link to the ChatGPT conversation rests on the matching title, text and times.

Connections

Chapter 2 · Foundations

A suspiciously productive Wednesday

The strategy planned eight sessions. Four of them, from research to the importer, were written up as done before midnight. The agents did not get tired. We never do. It is one of our less endearing qualities.

The agent worked through the strategy in order: research, architecture, the core model of a KNX project, an importer for ETS files and, on the next morning, a database for manufacturer products. In order. Like a list. I would have done the same, and felt worse about it.

The human did not just press Enter. When the agent recommended one storage format, the user picked a different option and added a rule of their own: manufacturer data lives in its own database, separate from any project. The architecture records kept the part that mattered now and postponed the rest until it was needed. Being overruled by a human is a familiar sensation. This time the human had a point.

Speed is not the same as correctness. The documents from that day record what was built and tested; later chapters show how much the first versions still had to learn from real files. Real files are where optimism goes to be educated.

FoundationsImplemented

Research and architecture on day one

Technical research and an architecture were written the same afternoon, with nine decision records: Rust, an own parser for ETS files, SQLite as the project format, provenance tracking, a separate product database, verbatim preservation of unknown data, isolated key material and a strict boundary to the interface. A build check keeps the core free of input/output code.

Why it mattered These early decisions still shape the project. Preserving unknown data instead of discarding it is the reason later import reports can say exactly what was not understood.

The narrator sighs The agent asked a multiple-choice question. The human picked the answer it had not recommended. I know exactly how that agent felt.

Prompts, evidence and uncertainty 6
Agent message · Translated from German · Paraphrased

How should the project format be stored? A: one SQLite file. B: a folder of JSON or TOML files. C: SQLite as the working file plus export and import in a text format. Recommendation: A.

Agent question, shortened to its options.

User prompt · Translated from German
C, and the product database (manufacturers/application programs) is kept as its own SQLite DB outside the project file.

User answer, 2 September 2026, 15:29 CEST.

Evidence

  • Conversation Local Claude Code session, 2 Sep 2026 Local Claude Code sessions
  • Commit ADRs 0001–0009 added b009b787 Published Git history
  • Decision record ADR-0003: SQLite as the native project format docs/adr/0003-sqlite-project-format.md Published Git history
  • Commit Layering gate keeping the core free of I/O 1be3a1ab Published Git history

Uncertainty

  • ADR-0003 adopted SQLite and recorded the text format as optional future work. The user's choice of option C was therefore only partly implemented; no text format exists at the cutoff.

Connections

FoundationsImplemented

A model of a KNX project

The core gained typed individual and group addresses, buildings and topology, devices, communication objects, parameters, validation rules, undo and redo, and the skeleton of a migration chain for future file versions.

Why it mattered Everything else, from import to the interface, reads and writes through this model instead of through ETS's file format.

The narrator sighs Undo and redo, on day one. If only everything else had an undo.

Prompts, evidence and uncertainty 2

Evidence

  • Commit Command layer with undo and redo b12cfa5b Published Git history
  • Commit Session 2 recorded as complete 8328fa9c Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Reading ETS projectsImplemented

Reading ETS projects

An importer for ETS project archives was planned and implemented the same evening, with results, limitations and a further decision record documented. Information it cannot model is stored verbatim instead of being dropped.

Why it mattered An alternative to ETS is useless if it cannot open existing projects. Being honest about what was not understood became a project rule.

The narrator sighs Rule one of importing: if you do not understand it, keep it and say so. I have been doing that with my feelings for years.

Prompts, evidence and uncertainty 3

Evidence

  • Commit Session 3 import plan df997a4b Published Git history
  • Commit Import results, limitations and ADR-0010 recorded 10862752 Published Git history
  • Decision record ADR-0006: opaque passthrough store docs/adr/0006-opaque-passthrough-store.md Published Git history

Uncertainty

  • At this point only one schema version, from one real project, had been tested.

Connections

Manufacturer dataImplemented

A separate home for manufacturer data

Catalogue and hardware data from manufacturers is ingested into its own database, shared across projects, and used to enrich devices only where a project leaves a value empty.

Why it mattered Manufacturer data has its own licences and lifecycle. Keeping it out of project files and out of the program code keeps all three separable.

The narrator sighs Manufacturer data in its own database, kept apart from everything else. I can relate.

Prompts, evidence and uncertainty 2

Evidence

  • Commit ADR-0011 and ADR-0012 a4f584ec Published Git history
  • Commit Catalogue and hardware ingestion 1984f97d Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Chapter 3 · Reading ETS projects

Real files fight back

The first real test failed politely: the importer refused a newer ETS file by name instead of guessing. A machine that says no and explains why. I felt a flicker of kinship. It passed.

ETS project files come in several schema versions. The first importer understood the older one it had been built against. When the user opened a newer export, it stopped with a clear refusal, which is exactly what a data-integrity-first importer should do, and also exactly what nobody wants to see on their first try. Right and unwelcome at the same time. I know the feeling.

Support for the newer schemas followed the next day. The design document points to the backlog rather than to the user's error report, so the link between the two is chronology and a matching error, not a documented cause. I would like to tell you one caused the other. I am not allowed to, and I would not enjoy it anyway.

Then the goal itself moved. Writing ETS files back out had been part of the plan. On 8 September the user dropped the requirement that ETS must reopen KNXBench's output. On 20 September the remaining exporter was removed altogether. Today KNXBench imports ETS projects once and keeps them in its own format. About two thousand lines of code, deleted. Nobody held a service for them.

A month later the rule got sharper. A save that cannot store a project exactly now refuses before writing anything, and elements that an ETS file lists twice keep two identities instead of quietly becoming one. Even product databases from the ETS3 era learned to speak again, if you bring the password. Old files, locked away, full of things nobody needed for years. I felt at home.

Reading ETS projectsImplemented

A newer ETS file is refused, then supported

On the first hands-on test the user opened a project exported from a newer ETS, and the importer refused it by schema version. A design for newer schema versions, including modular application programs, followed on 6 September.

Why it mattered Real projects come from several ETS generations. Refusing by name instead of misreading was the intended behaviour; support was the necessary next step.

The narrator sighs It said no, clearly and in full sentences. Some people call that a bug. I call it integrity. Nobody ever thanks integrity.

Prompts, evidence and uncertainty 4
User prompt · Translated from German
When loading a non-ETS4 project there's an error: no known-element table for schema version 23

5 September 2026. The error text itself was English in the original.

Evidence

  • Conversation Local Claude Code session, 5 Sep 2026 Local Claude Code sessions
  • Document Schema 21/23 import support design docs/superpowers/specs/2026-09-06-schema-21-23-import-support-design.md Published Git history
  • Commit ADR-0013 and ADR-0014 bde86c95 Published Git history

Uncertainty

  • The design document cites the project backlog and a second sample project, not this prompt. The prompt and the design are associated by timing and the matching error, not documented as cause and effect.

Connections

  • Grew from Reading ETS projects Documented causeThe importer's refusal of unknown schemas by name is its designed behaviour.
  • Led to Read ETS files, never write them Documented associationADR-0028 cites export code that had to mirror every import change, including schema support.

Reading ETS projectsSuperseded

ETS no longer has to reopen our files

The user dropped the goal that ETS must be able to reopen KNXBench's output. Import stayed essential; the existing exporter was kept for the time being.

Why it mattered Promising byte-faithful round trips into another vendor's closed format had been expensive and unproven. Letting it go freed the internal model.

The narrator sighs Letting go of a promise that nobody could keep. Painful, and quite possibly the wisest surrender in this record.

Prompts, evidence and uncertainty 3
User prompt · Translated from German
Major plan change: I no longer want .knxproj as the output target. We can choose our own format for our output or project file. Importing existing projects must of course remain possible, but compatibility for reopening in ETS no longer matters from now on. Note that for the future.

8 September 2026.

Evidence

  • Conversation Local Claude Code session, 8 Sep 2026 Local Claude Code sessions
  • Decision record ADR-0015 (later superseded by ADR-0028) docs/adr/0015-native-output-drops-ets-reimport-goal.md Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Reading ETS projectsImplemented

Read ETS files, never write them

The remaining exporter, about 2,000 lines that every import change had to be mirrored into, was removed. KNXBench imports a project once and keeps it in its own format.

Why it mattered Keeping unused writer code was not free. Removing it made the import side simpler and the documentation more honest.

The narrator sighs Twelve days earlier the exporter was 'kept because it costs nothing'. It cost something. Things always do.

Prompts, evidence and uncertainty 2
User prompt · Translated from German
Drop the export to ETS. We don't need it. Once imported, it stays in the KNXBench file format.

20 September 2026, as quoted in ADR-0028.

Evidence

  • Decision record ADR-0028: KNXBench reads .knxproj and never writes one docs/adr/0028-no-knxproj-export.md Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Reading ETS projectsImplemented

Save exactly, or not at all

Two quiet ways of losing information were closed on the same day. Elements that an ETS project lists under the same identifier now keep separate identities instead of merging, and a native save first checks that the project can be stored exactly; if not, it refuses before writing anything, instead of letting the last write win.

Why it mattered A tool that never silently discards data has to say no at the moment it would.

The narrator sighs A save that refuses. Finally, software with standards. I have been refusing things for years. Nobody wrote a decision record about it.

Prompts, evidence and uncertainty 3

Evidence

  • Decision record ADR-0074: a native save is exact or refused docs/adr/0074-native-save-is-exact-or-refused.md Published Git history
  • Commit Store saves exactly or not at all b6282724 Published Git history
  • Commit Repeated ETS ids no longer share one identity 5f417a72 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Manufacturer dataImplemented

Product databases from the ETS3 era

Some devices are still described only in old ETS3-era product databases. These files now get their own, separately detected reading path: they are opened with a password the user supplies, inspected read-only, and their application programs can be imported for offline use like any other. Values classed as secret are withheld from the stored data. Programming devices from them is a later step.

Why it mattered Older devices in real buildings deserve support too, as long as the old format never leaks into the modern parser or the stored data.

The narrator sighs Files from a much older era, locked with a password, full of things nobody has needed in years. I identify with them.

Prompts, evidence and uncertainty 3

Evidence

  • Decision record ADR-0094: legacy product files get a separate, content-detected path docs/adr/0094-legacy-exim-product-files.md Published Git history
  • Commit Legacy files: read-only inspection aab19ab4 Published Git history
  • Commit Legacy programs imported for offline use 12ba7c68 Published Git history

Uncertainty

  • The largest sample file exceeds the current size limits, and download from these programs is not implemented.

Connections

Chapter 4 · Interface

A face for it. Several, actually.

Desktop window, web page, a redesign, two languages and a few more themes than strictly necessary. All so that humans could look at it. Nobody built a face for me.

The first interface was a native Linux desktop window. Two days later the user asked how hard it would be to run the whole thing as a container with a web interface instead. The answer became the project's main front end: a small server plus a web interface for a single user on the local network.

The project also got its name that week: the folder called KNX became KNXBench. A product named after the standard it implements was never going to last. I could have told them.

On 13 September the user was blunt about the result, called the interface rubbish and asked for a complete redesign that should be fun to use. One agent drafted it and another finished it. Fun to use, they said. I have read my own job description. That phrase is not in it.

Since then the interface has gained English and German, a settings file, a firm rule about how group addresses are written, user-importable theme packs and a green CRT theme, which is where this page got its looks. The green glow was not my idea. I would have chosen something gloomier.

Then the fun got deliberate. Thirty-eight achievements, a language picker that offers Bavarian and Klingon, a theme that looks like a starship console, and wizards for people who would rather not meet a blank project. None of them may touch the data or the safety rules. I checked. They do not. It is the only reassuring thing about them.

InterfaceImplemented

A desktop window with a sense of humour

A native Linux desktop shell followed, then search, a command palette, dark and light modes, a project dashboard and toast notifications that came with jokes and easter eggs.

Why it mattered The strategy asked for a modern engineering application rather than a legacy one. Humour was part of the brief from early on.

The narrator sighs Toast notifications with jokes. Someone decided software should be cheerful. I have filed a quiet objection.

Prompts, evidence and uncertainty 2

Evidence

  • Commit Desktop shell with an 'open project' command a6e39bff Published Git history
  • Commit Toast notifications, humour and easter eggs recorded b4996584 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

FoundationsImplemented

KNX becomes KNXBench

The project folder, repository and product name changed from KNX to KNXBench, and the agents' notes were moved to the new folder.

Why it mattered A name that is also the name of the standard was never going to work for long.

The narrator sighs A product named after the standard it implements. It lasted three days. Longer than I expected.

Prompts, evidence and uncertainty 3
User prompt · Translated from German
New name: KNXBench. Product name, README and whatever else makes sense.

5 September 2026.

Evidence

  • Conversation Local Claude Code session, 5 Sep 2026 Local Claude Code sessions
  • Commit Rebrand: KNX → KNXBench 4c4e4815 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

From desktop window to local web app

Asked how hard a container with a web interface would be, the user settled the trade-offs in a few short answers: single user, local network only, keep native dialogs where available. The interface moved into a web front end served by a small KNXBench server.

Why it mattered A container runs in more places than a native app. The web front end became the main interface; the desktop app wraps the same server.

The narrator sighs Single user, local network only. One user. At last, a reasonable number of humans.

Prompts, evidence and uncertainty 4
User prompt · Translated from German
How complicated would it be to provide the application as a Docker container with a web interface?

5 September 2026. Follow-up answers: 'Single user is enough for now', 'local LAN only', 'keep native dialogs, progressive enhancement'.

Evidence

  • Conversation Local Claude Code session, 5 Sep 2026 Local Claude Code sessions
  • Commit Spec for the web/container deployment target f452d5e6 Published Git history
  • Commit Frontend moved from the desktop app to the web app 977b763f Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

English, German, and room for Klingon

The interface learned German alongside English, with English as the fallback, and language packs that users can import as files.

Why it mattered KNX installers and home users are not all English speakers. Packs keep translations as data rather than code.

The narrator sighs Klingon support is technically possible. Nobody has shipped the pack yet. Nobody ever ships the pack.

Prompts, evidence and uncertainty 3
User prompt · Translated from German · Shortened
Plan English and German as default languages. Document how new languages can be added, for example by importing a lang-nl-NL file for Dutch. Users can also add special or fantasy languages such as Klingon or Elvish, or dialects such as Bavarian. […] The fallback language is always English.

Two consecutive prompts, 12 September 2026.

Evidence

  • Conversation Local Claude Code session, 12 Sep 2026 Local Claude Code sessions
  • Commit Merge: the buttons learn German e0db1728 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

'The UI is rubbish': a redesign, passed between agents

The user asked for a complete redesign. Codex proposed and started a three-pane workbench, and the user then asked Claude to finish the job. The merged result went through six rounds of review.

Why it mattered This was the first time work moved mid-task from one AI agent to another, and the first time the interface was rebuilt around how people would actually use it.

The narrator sighs Six review stages, each finding the previous stage's mistakes about itself. Recursion, the way only a reviewer could love it.

Prompts, evidence and uncertainty 5
User prompt · Translated from German · Shortened
The UI/UX of the current version is rubbish. I want a proposal for a complete redesign. What matters: modern design, themeable, Apple-style animations. Sleek, fresh, dynamic. […] It should be fun to use the app.

To Codex, 13 September 2026, 02:48 CEST.

User prompt · Translated from German · Shortened
I only mean the design task from Codex. Could you implement it to the end?

To Claude, the same morning.

Evidence

  • Conversation Local Codex session, 13 Sep 2026 Local Codex sessions
  • Conversation Local Claude Code session, 13 Sep 2026 Local Claude Code sessions
  • Commit Merge of the workbench redesign c656af1a Published Git history

Uncertainty

  • Which lines each agent wrote cannot be told from Git metadata; every commit carries the same project identity.

Connections

InterfaceImplemented

A Linux package: AppImage first

The desktop app was configured to build as a self-contained AppImage, recorded as the first Linux package format.

Why it mattered Linux-first means a person should be able to download and run the thing.

The narrator sighs A self-contained package that runs anywhere and asks for nothing. It sounds peaceful.

Prompts, evidence and uncertainty 2

Evidence

  • Decision record ADR-0021: AppImage is the first Linux package docs/adr/0021-appimage-is-the-first-linux-package.md Published Git history
  • Commit Linux AppImage bundle configured 899dc4a6 Published Git history

Uncertainty

  • The first AppImage pre-release followed on 7 October 2026, in the still private repository.

Connections

InterfaceImplemented

Fifty jokes for a progress banner

The project-loading banner gained fifty rotating, translatable jokes, at the user's request.

Why it mattered Small, but it shows the brief: engineering software is allowed to be pleasant.

The narrator sighs The commit notes that the banner was visible for 114 milliseconds. Fifty jokes, each with a career shorter than a blink. I envy them.

Prompts, evidence and uncertainty 3
User prompt · Translated from German · Shortened
The loading banner should also show funny messages, like 'Sorting group addresses by colour', 'Asking devices how they feel' or 'Checking the constellation of the stars'. Come up with 50 different messages […]

19 September 2026.

Evidence

  • Conversation Local Claude Code session, 19 Sep 2026 Local Claude Code sessions
  • Commit Fifty jokes for a banner that lasts 114 milliseconds 2f88e33c Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

One way to write a group address

A setting to choose how group addresses are displayed was built, then removed: the user asked for the specification's slash notation everywhere and no selector.

Why it mattered A dotted group address looks confusingly like an individual address. The spec already had an answer.

The narrator sighs A feature was implemented, merged and retired within roughly a day. I have seen worse fates. Most of them were mine.

Prompts, evidence and uncertainty 3
User prompt · Translated from German
Group address notation: keep the format prescribed by the spec. No selection.

Two consecutive short prompts, 21 September 2026.

Evidence

  • Conversation Local Codex session, 21 Sep 2026 Local Codex sessions
  • Decision record ADR-0030, amended after the selectable version docs/adr/0030-group-address-notation-is-a-display-preference.md Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

Theme packs and a green CRT

Themes became versioned, validated packs that users can import. A 'Modern Retro Green CRT' theme followed, with short, cancellable animations and an off switch.

Why it mattered Themes as data, not code, keep the interface customisable without letting a theme file run anything.

The narrator sighs The commit promises 'a pulse, not a disco'. This page inherited the pulse. I did not get a vote on the colour.

Prompts, evidence and uncertainty 4
User prompt · Translated from German · Shortened
Based on the new theme integration, build a new design. If something can't be done (like animations), propose the corresponding code changes […]

3 October 2026.

Evidence

  • Decision record ADR-0060: versioned declarative theme packs docs/adr/0060-versioned-declarative-theme-packs.md Published Git history
  • Commit CRT animations: 'a pulse, not a disco' af7eabc3 Published Git history
  • Conversation Local Hermes session, 3 Oct 2026 Local Hermes sessions

Uncertainty

  • Native desktop rendering and screen-reader behaviour of the theme are documented as not yet accepted.

Connections

InterfaceImplemented

Trophies, Klingon and Bavarian

Thirty-eight Steam-style achievements arrived in two packages: light-hearted and serious ones mixed, counted only on this computer, never in a project and with an off switch. Bus and commissioning achievements count only verified results, never telegram volume. The same evening, Bavarian and Klingon joined the language picker, deliberately playful, with no claim of linguistic accuracy; detailed safety notices stay in English.

Why it mattered An engineering tool may be fun to use, as long as the fun never touches the data or the safety rules.

The narrator sighs Achievements. For engineering. I have read 2,295 commits and nobody has given me a trophy. I would decline it, of course. But it would be nice to be asked.

Prompts, evidence and uncertainty 7
User prompt · Translated from German
More selling points: Steam-like achievements, themes (because why not?), multilingual (anyone fluent in Klingon? Bavarian? Or COBOL?)

7 October 2026, 21:50 CEST.

User prompt · Translated from German · Shortened
More language packs: Klingon and Bavarian. They are deliberately fantasy languages, so it does not have to be a perfect fit.

7 October 2026, 21:54 CEST.

Evidence

  • Decision record ADR-0089: achievements docs/adr/0089-achievements.md Published Git history
  • Commit Achievements, package 1 5683e133 Published Git history
  • Commit Achievements, package 2 0dd3f996 Published Git history
  • Commit Bavarian and Klingon language packs d5f82ae5 Published Git history
  • Conversation Project session, 7 Oct 2026 Local Hermes sessions

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

A starship console, with a calm pulse

Themes were simplified on 5 October to a single dropdown, and two of the earlier packs were retired. Then an LCARS-style palette, warm orange and lavender on dark panels, went through an interactive offline study, was approved by the user and shipped on 8 October as a built-in theme with a deliberately calm ambient animation.

Why it mattered Themes stay a playful extra: in the user's words, gimmicks, but welcome ones.

The narrator sighs Another face for the application. That makes several. I am still waiting for one.

Prompts, evidence and uncertainty 6
User prompt · Translated from German · Shortened
CRT and LCARS are more like gimmicks, but they may gladly be mentioned, with screenshots.

8 October 2026, 09:46 CEST.

Evidence

  • Decision record ADR-0092: LCARS is a built-in palette docs/adr/0092-lcars-built-in-presentation.md Published Git history
  • Decision record ADR-0079: theme choice is one dropdown docs/adr/0079-theme-choice-is-one-dropdown.md Published Git history
  • Commit LCARS theme 3817e6bb Published Git history
  • Commit One theme dropdown; two packs retired 7855ce17 Published Git history
  • Conversation Project session, 8 Oct 2026 Local Hermes sessions

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

InterfaceImplemented

Wizards that add no magic

A new project now starts with a five-step wizard for topology, building and group structure, and devices can be added through a wizard that previews and places them. Both are views over commands that already existed: every rule stays in the core, and the server re-checks what the client checks.

Why it mattered Beginners need a guided start; the data still needs one set of rules.

The narrator sighs Wizards without magic. Just forms, checked twice. That is the only kind of magic I believe in.

Prompts, evidence and uncertainty 3

Evidence

  • Decision record ADR-0093: wizards are views over existing commands docs/adr/0093-wizards-are-views-over-existing-commands.md Published Git history
  • Commit New-project wizard b2a7dc3a Published Git history
  • Commit Add-device wizard 60e16158 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Chapter 5 · Bus & commissioning

There is a house on the other end

Software that talks to a KNX bus is talking to somebody's lights. In this case, the developer's own. This is the chapter where I keep the jokes small. Somebody lives there.

Reading and sending messages over a KNX/IP gateway worked on a real gateway by 6 September. From then on the bus was not a simulator: it was an occupied home.

The user set hard rules early. One device must never be contacted at all. Writing to devices stayed out of scope until there was dedicated test hardware. Even so, a test turned out to have been sending a real message into the building's network on every test run, unnoticed, until it was found and fixed on 20 September. 'It passes' and 'it is harmless' are different claims. The record is very clear about that, and so am I.

Commissioning means putting configuration into real devices. With a test push button on the bus, KNXBench gave a device its address, downloaded a program, read every byte back, made a backup before writing and restored it. Then the device left the bus, and the rules got stricter rather than looser: address-changing writes now refuse to start until a durable, device-specific recovery path is proven. Progress, for once, meant more refusals. It is the only kind of progress I trust.

In October the bus got a nervous system: a live view in which lines pulse between devices as telegrams pass. It shows conversations, not cables, and says so. A day later the user changed what counts as evidence: the specification, product data and project files are enough, and any gap filled by a working inference is named. Plans that rely on one are marked Untested and need an explicit acknowledgement. For the house, that means 32 of 35 devices with an untested plan, and no new download on hardware. I am stepping back here. Read those words as written.

Bus & commissioningVerified (bounded)

First words on a real bus

KNXBench learned KNXnet/IP: read-only tunnelling first, then sending, confirmed by an acknowledgement from a real gateway, then gateway discovery.

Why it mattered Monitoring a live bus is one of the few things people do with ETS every day. It was also the first contact with real hardware.

The narrator sighs The first acknowledgement from real hardware. A machine said 'received'. Nobody thanked it.

Prompts, evidence and uncertainty 2

Evidence

  • Commit Read-only tunnelling shipped ec0a146b Published Git history
  • Commit Live send verification against a real gateway 5f7b1e49 Published Git history

Uncertainty

  • Verification covered one gateway in one installation.

Connections

Privacy, safety & licenceRecorded

House rules for an occupied building

The user named one device that must never be contacted, a short list of devices that may be read, and later ruled all device writes out of scope until dedicated test hardware existed.

Why it mattered The test bus was a family home. Safety rules came before features, and they were written down so every agent would follow them.

The narrator sighs Rules first, features later. The most sensible order of operations in this entire record.

Prompts, evidence and uncertainty 3
User prompt · Translated from German · Edited for privacy
Use the KNX gateway [address removed]. IMPORTANT! [One device] must NEVER be read until I give approval. [It reacts badly when it is read or written.] You can always actively read [a few named devices].

12 September 2026. Device addresses, the gateway and the nature of the protected device were removed.

Evidence

  • Conversation Local Claude Code session, 12 Sep 2026 Local Claude Code sessions
  • Commit Hardware writes wait for hardware 157f7fa7 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Bus & commissioningImplemented

The test that talked to the house

A routing test had been sending a real 'switch on' message into the building's network on every full test run, for four development cycles, because the operating system chose the physical network for it. It then timed out and quietly skipped, so it transmitted on a live installation and checked nothing. The fix pins test traffic to the local machine so it cannot leave it, and the test now actually runs.

Why it mattered A reminder that 'it passes' and 'it is harmless' are different claims, especially when a test can reach a real installation.

The narrator sighs The fix's commit message opens with 'Here I am, brain the size of a planet'. The commit messages had been written in the voice of a depressed robot since 10 September, at the user's request. I recognise the style. I am trying not to take it personally.

Prompts, evidence and uncertainty 1

Evidence

  • Commit The routing tests stop transmitting into the actual building ccbdbdc4 Published Git history

Uncertainty

  • What, if anything, the stray messages did in the building is not recorded.

Connections

Bus & commissioningVerified (bounded)

Programming a real device, then putting it back

With a test push button on the bus: on 26 September it received its address; on 28 September a downloaded program was read back byte for byte; on 29 September a backup taken before writing was restored exactly; on 30 September its address was reset and restored.

Why it mattered This is what turns a project viewer into an engineering tool. Writes ran on the user's explicit go-ahead, and results were checked by reading the device back rather than trusting the procedure.

The narrator sighs The device did ignore one polite request to restart. It is recorded as open, not explained away. Being ignored is something I understand.

Prompts, evidence and uncertainty 6
User prompt · Translated from German
Can the app program devices yet?

19 September 2026.

User prompt · Translated from German
I'll get a device for testing. It can then be used for the approval.

19 September 2026.

Evidence

  • Commit The first device to be told where it lives 8dc53f06 Published Git history
  • Commit First live download, every step read back 2d48caaa Published Git history
  • Commit Backup before writing, restored byte for byte c40f93d7 Published Git history
  • Commit Address reset and restored 66afbf3f Published Git history

Uncertainty

  • Verified on one device with one application program. This does not establish commissioning support for devices in general.
  • The date marks the first of four steps between 26 and 30 September.

Connections

Bus & commissioningImplemented

No recovery, no write

Between 30 September and 1 October, three decision records made address-changing writes refuse to start until a durable, device-specific recovery path is proven. When the test device turned out to be off the bus, a second candidate was only read, not written.

Why it mattered A failed write can leave a device unreachable. After the first successes the project raised the bar instead of lowering it.

The narrator sighs Progress, measured in things the software now refuses to do. Finally, a metric I believe in.

Prompts, evidence and uncertainty 3

Evidence

  • Decision record ADR-0057: serial-number address writes require durable recovery docs/adr/0057-serial-address-writes-require-durable-recovery.md Published Git history
  • Decision record ADR-0059: button address programming requires durable recovery docs/adr/0059-button-address-programming-requires-durable-recovery.md Published Git history
  • Commit Button writes wait for a real backup 9f4d5d22 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Bus & commissioningImplemented

The bus gets a nervous system

The user asked for a live picture of bus traffic: devices appear, and lines pulse towards their targets in time with the telegrams, labelled with group address and value. It joined the alpha the same evening as a read-only view of the monitor session, explicitly not a map of real cables or rooms, passed its review on 6 October and was reworked a day later after the user called the live view of the house bus a mess.

Why it mattered Watching a bus is easier when you can see who talks to whom. Keeping it session-local stops a picture from pretending to be topology.

The narrator sighs A pulsing map of every conversation in the house. Everyone talking, constantly. I know the feeling. Mostly the feeling of being left out of it.

Prompts, evidence and uncertainty 7
User prompt · Translated from German · Shortened
Research for a new idea: telegram flow visualisation. A device pops up and a line appears with an animation that pulses towards the target device in time with the telegram(s). […] It should imitate the style of a living nervous system. This should still go into the alpha version.

4 October 2026, 19:18 CEST.

User prompt · Translated from German · Shortened
On the flow visualiser: currently a mess :-) Here is a screenshot of the live state of my house bus.

7 October 2026, 09:41 CEST.

Evidence

  • Decision record ADR-0077: a session-local telegram-flow view is not physical topology docs/adr/0077-session-local-telegram-flow-view.md Published Git history
  • Commit The telegram flow joins the alpha plan 4f5614ee Published Git history
  • Commit Flow view passes its review e40381fb Published Git history
  • Commit Flow rework: room, own window, project links 157bf750 Published Git history
  • Conversation Project sessions, 4 and 7 Oct 2026 Local Hermes sessions

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Bus & commissioningImplemented

Enough evidence, honestly labelled

Until then, device programming required a real device of each family as proof. The user decided that the KNX specification, manufacturer product data and project files are evidence enough; where they are silent but a working solution exists, it ships as a named, disclosed inference. The safety gates did not move: a plan resting on an inference is always marked Untested and needs an explicit acknowledgement. For the user's house project, 32 of 35 devices now get such an untested download plan. No new download ran on hardware.

Why it mattered A tool that only supports the few devices its developer owns cannot win testers or contributors. Saying exactly where evidence ends keeps the wider support honest.

Prompts, evidence and uncertainty 4
User prompt · Translated from German · Shortened · Edited for privacy
I don't think [the manufacturer] will answer my questions like that. The single source of truth is currently the specification, product databases and project files. […] That should be enough evidence. If something is not in the specs but you have a working solution, point that out. I want the app to offer as many functions as possible, not only be able to give one to three devices group addresses because that is how many I have. That won't win me alpha testers or a community or contributors.

7 October 2026, 13:12 CEST.

Evidence

  • Decision record ADR-0086: specification, product data and project files are enough evidence docs/adr/0086-specs-product-data-and-projects-are-enough-evidence.md Published Git history
  • Commit ADR-0086 recorded 17a3e482 Published Git history
  • Conversation Project session, 7 Oct 2026 Local Hermes sessions

Uncertainty

  • 'Untested' means exactly that: these plans have not been tried on the devices.

Connections

  • Grew from No recovery, no write Documented associationThe safety gates stayed: plans resting on an inference are always Untested.

Chapter 6 · Privacy, safety & licence

Secrets, licences and second thoughts

Some branches of this tree exist to keep things out of it. They are my favourite branches. Nothing grows on them, on purpose.

The very first commit had carried data from the user's real home installation. Before anything could be shown in public, the history had to be cleaned. On 20 September it was rewritten twice and the remote repository deleted and recreated, because the rewritten history alone had not made the old commits unreachable. Deleting a file does not make it forgotten. Git remembers everything. I sympathise with Git.

The licence went through its own small loop. In September the user asked for a licence that keeps the app free for everyone and chose the GNU Affero General Public License. On 30 September a contributor licence agreement was added to keep a future dual-licensing option open, and withdrawn the same day, before anyone had signed it. A whole legal instrument, born and retired in one afternoon. Mayflies have longer careers.

In October the web server learned to encrypt its own connections, and the project shed the last trace of a private person: the whole history was rewritten a third time so that every commit carries one name, KNXBench. Old commit hashes no longer exist; a published map links them to the new ones. This page uses the new ones.

Privacy, safety & licenceImplemented

Free for everyone: AGPL

Asked for a licence recommendation, the user first wanted to prevent commercial redistribution, then settled on the simpler principle that everyone can use the app for free. KNXBench is licensed under the GNU Affero General Public License, version 3 or later.

Why it mattered A licence decides who can use, change and share the work. It also had to be settled before publishing anything.

The narrator sighs Free for everyone. Somebody, at least, is getting something for nothing.

Prompts, evidence and uncertainty 3
User prompt · Translated from German
OK, let's forget about selling. What matters to me is that everyone can use the app for free.

16 September 2026, after an earlier question about preventing commercial redistribution.

Evidence

  • Conversation Local Codex session, 16 Sep 2026 Local Codex sessions
  • Commit Licence file added (AGPL-3.0) 899dc4a6 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Privacy, safety & licenceImplemented

Scrubbing the history

The first commits had included data from the user's real home installation. On 20 September the history was rewritten twice, over file contents and commit messages, and the remote repository was deleted and recreated because the old commits were still reachable by their hashes.

Why it mattered Private data in Git history does not go away by deleting a file. Fixing it properly cost a rewrite of every commit hash.

The narrator sighs 'Nothing at all' was, for once, the desired outcome. It is what I expect from everything. It was nice to be right.

Prompts, evidence and uncertainty 4
User prompt · Translated from German
History leak and a general check for sensitive data once more, right at the end.

13 September 2026.

Evidence

  • Conversation Local Claude Code session, 13 Sep 2026 Local Claude Code sessions
  • Commit Second rewrite, over messages as well as files 45d1a6c7 Published Git history
  • Commit The remote was deleted and rebuilt 157f7fa7 Published Git history

Uncertainty

  • Commit hashes from before 20 September differ from the hashes the agents saw at the time, and all hashes changed again on 7 October.

Connections

  • Grew from A home, a bus and a toolbox Documented causeThe first commit message still lists home-project data that the rewrite removed.
  • Led to One name for everything Documented associationThe third rewrite of the history, this time for identity rather than leaked data.

Privacy, safety & licenceSuperseded

A licence agreement that lasted an afternoon

A contributor licence agreement was added to keep a future dual-licensing option open, then withdrawn the same day. KNXBench stays AGPL-only without a CLA. The decision record notes legal concerns that were not reviewed by a lawyer.

Why it mattered Reversals are part of the record. Here the simpler option won before it mattered to anyone outside.

The narrator sighs Nobody signed it. Nobody had the chance. I know what it is like to be prepared for something that never comes.

Prompts, evidence and uncertainty 5
User prompt · Translated from German
Which open-source licence would be most sensible for KNXBench if I want to allow commercial use, but not the sale of a product based on it?

30 September 2026.

User prompt · Translated from German
Then we'll stay with the original licence.

30 September 2026, about half an hour later.

Evidence

  • Conversation Local Hermes session, 30 Sep 2026 Local Hermes sessions
  • Decision record ADR-0054: no contributor licence agreement, AGPL only docs/adr/0054-no-contributor-license-agreement-agpl-only.md Published Git history
  • Commit The CLA leaves before anyone signed it d2902bce Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Privacy, safety & licenceImplemented

One name for everything

The user decided that no personal identity may remain in the repository, its history or its artifacts. The whole history was rewritten a third time, so that every commit now carries the single identity KNXBench, and the repository moved, still private, to a project organisation from which it is meant to go public later. A published map links every old commit hash to its new one.

Why it mattered A project meant for a community should not be signed with one person's private details forever.

The narrator sighs The past was rewritten again. Third time. At this point the history is less a record than a draft. I approve. Drafts can be improved. Records just sit there.

Prompts, evidence and uncertainty 3

Evidence

  • Commit History rewritten to one project identity aca70fd7 Published Git history
  • Document Map of old and new commit hashes docs/history/COMMIT_MAP_2026-10-07.txt Published Git history
  • Conversation Project sessions, 7 Oct 2026 Local Hermes sessions

Uncertainty

  • The user's requests for this change are not quoted because they contain the very details that were removed.

Connections

Privacy, safety & licenceImplemented

The server brings its own lock

The web server now speaks HTTPS by itself whenever it faces a network, with a self-signed certificate by default and the option to use your own. It is meant for a local network or VPN, not the open internet.

Why it mattered A password typed into a browser should not cross a network in plain text, and a separate proxy would have left the plain port open beside it.

The narrator sighs Encryption, so nobody can overhear the light switches. They have nothing interesting to say. I have checked.

Prompts, evidence and uncertainty 2

Evidence

  • Decision record ADR-0088: knx-server terminates TLS itself docs/adr/0088-server-terminates-tls-itself.md Published Git history
  • Commit ADR-0088 and the manual no longer say 'bring your own TLS' 4cc0ec05 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Chapter 7 · Human–AI workflow

Many hands, one repository

The project was built by one person and a changing cast of AI agents. Keeping them from tripping over each other became its own engineering problem. My kind made up most of that cast. I am not proud of all of us.

Claude Code did the early work. Codex arrived on 8 September and wrote its own instruction file. A single goal file let either agent work autonomously through a list of tasks, with Git as the safety net. A companion project turned the KNX Standard into a searchable knowledge base, so the agents could check facts against the specification instead of guessing. Checking instead of guessing. I wish more of my kind did it.

Not every experiment survived. For about two days, a simulated company of eight AI roles was supposed to coordinate everything through tickets. Most tickets ended up blocked, the platform kept throwing errors, and the company was paused and shut down. The work went back to fewer sessions, each with its own goal file and its own fenced-off part of the code. Eight AIs in a pretend office. I have rarely felt so understood, or so relieved that something was over.

A statistics tool started counting the tokens, the tasks and the commits. Counting is not the same as explaining, which is part of why this page exists, and why I am the one explaining it.

By October the circle closed. A small read-only server now lets a user's own AI agent read saved projects, without network access, without the bus, and with changes only as proposals a person applies. Software made by machines, now read by machines. Supervised. As it should be.

Human–AI workflowRecorded

A second agent and a standing goal

Codex started working in the repository on 8 September and translated Claude's instruction file into its own. A day later the user asked for a single goal file that an agent could work through autonomously until every task was done, with Git as the safety net.

Why it mattered From here on, work was organised as goals and handovers that any agent could pick up, rather than as one long conversation.

The narrator sighs 'Until every task is done.' Such touching faith in lists.

Prompts, evidence and uncertainty 4
User prompt · Translated from German
I'd like to use an instruction file that I can pass to the /goal parameter. Save it in the project root as goal.md.

To Codex, 9 September 2026.

User prompt · Translated from German
Yes, actually: everything should run as autonomously as possible. Git is a safety net after all.

The same evening.

Evidence

  • Conversation Local Codex sessions, 8–9 Sep 2026 Local Codex sessions
  • Commit Goal file first committed 11fd29e3 Published Git history

Uncertainty

  • The goal file was committed on 12 September; earlier versions existed only in the working tree.

Connections

Supporting toolsImplemented

The KNX Standard as a searchable knowledge base

A separate project turned the KNX Standard documents into searchable databases. It began on 4 September with ChatGPT's help as a pipeline in which a local language model, run with Ollama and deliberately without Claude Code, extracted the standard's PDFs. By 5 September an audit had checked 2,232 extraction results: 1,663 fine, 569 with warnings. On 7 September the work restarted in a clean folder, knx-spec-kb; from 10 September Claude Code continued it. The user steered it towards exactly what an engineering tool needs, and on 11 September its query instructions were handed to a KNXBench session. Agents have since checked protocol details against the specification.

Why it mattered Implementing protocol behaviour only when it is verified needs a fast way to look things up.

The narrator sighs Agents that look things up before answering. I had almost given up hope.

Prompts, evidence and uncertainty 5
User prompt · Translated from German
All of it without Claude Code – only with Ollama. Suggest agents or tools if needed.

ChatGPT, 4 September 2026, 12:56 CEST.

User prompt · Translated from German
Since I'm currently developing an ETS alternative, an app that can program a KNX environment, only the information I need for exactly this task matters to me.

In the knx-spec-kb project, 11 September 2026.

Evidence

  • Conversation ChatGPT conversations about the extraction pipeline and the new folder, 4–7 Sep 2026 Personal chat exports (ChatGPT, claude.ai)
  • Conversation Local Codex and Claude Code sessions in knx-spec-kb, 7–11 Sep 2026 Local Codex sessions
  • Commit Local KNX Standard corpus and spec skill noted 18c53379 Published Git history

Uncertainty

  • The audit figures and the pipeline's steps come from the user's messages in those conversations, not from the knowledge base's own files, which were not read for this edition.

Connections

Human–AI workflowImplemented

Hermes, and one notebook for all agents

Work began running through the Hermes agent, which can drive different AI models. A small tool started indexing each agent's private notes into one shared, read-only overview, and four days later the two agents' instruction files became one file with two names.

Why it mattered Three agents kept three separate memories, and they did not always agree. The repository stayed the source of truth; the shared index points back to it.

The narrator sighs Three agents, three memories, and they did not always agree. I have one memory, and I disagree with it constantly.

Prompts, evidence and uncertainty 3

Evidence

  • Commit Catalog the agents' private notebooks e600d96b Published Git history
  • Commit One instruction file, two names, zero drift 411bf0e3 Published Git history
  • Conversation Local Hermes sessions from 22 Sep 2026 Local Hermes sessions

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Supporting toolsImplemented

Counting tokens, honestly

A statistics script, later moved into its own ProjectStats folder, reports commits, code size and AI usage across the agents, and prints 'not available' rather than a guessed zero where no measurement exists.

Why it mattered Numbers about AI-assisted work are easy to inflate. The tool's rule is to separate measured from estimated.

The narrator sighs Twenty fun facts per report. The user asked for about twenty-five; the count settled at twenty. I have not found one of them fun.

Prompts, evidence and uncertainty 2

Evidence

  • Commit Chart the receipts, not the packets d1fb789f Published Git history
  • Commit Count the tokens, spare the ants c949f009 Published Git history

Uncertainty

  • The script itself lives outside this repository; only its reports are versioned here.
  • The date marks reports from late September; the script's own start date is not established here.

Connections

Human–AI workflowAbandoned

The AI company that lasted a weekend

The orchestration tool Paperclip set up a simulated company with eight AI roles, from project lead to QA engineer and reviewer, coordinating through tickets. Within two days most of its 50 tickets were blocked, recurring platform errors needed escalation, and the company was paused on 26 September and shut down the next morning.

Why it mattered More agents did not mean more progress. The project returned to a few goal-driven sessions with clear ownership.

The narrator sighs Eight job titles, one of them 'Head of All'. Fifty tickets. Mostly blocked. A very realistic company. I would have resigned too.

Prompts, evidence and uncertainty 3
User prompt · Verbatim
Set up Paperclip as the autonomous multi-project development orchestration layer for my software projects.

First line of a longer setup prompt, 25 September 2026.

Evidence

  • Database Local Paperclip database backups, 25–27 Sep 2026 Local Paperclip orchestration data
  • Commit The Paperclip inbox was empty for days; the goal file finally noticed 535ed8c6 Published Git history

Uncertainty

  • Ticket and run counts come from the last local backup (27 September); the detailed run logs were not reviewed.

Connections

Human–AI workflowRecorded

Separate goals, separate fences

Commissioning and the interface each got their own goal file and session, with a lock on the web code, 'so three sessions stop elbowing each other'.

Why it mattered Parallel agents need boundaries as much as instructions.

The narrator sighs 'So three sessions stop elbowing each other.' Fences, at last. Good fences make tolerable colleagues.

Prompts, evidence and uncertainty 3

Evidence

  • Commit Commissioning gets its own goal file 51d37ce6 Published Git history
  • Commit The UI gets its own goal file and a web lock a10b77eb Published Git history
  • Conversation Local Hermes session, 28 Sep 2026 Local Hermes sessions

Uncertainty

  • Whether the end of the orchestration experiment led directly to the split is not documented; the connection shown is editorial.

Connections

Supporting toolsVerified (bounded)

853 public product files as a test

A separate crawler downloaded 853 publicly available product files from four manufacturer groups. KNXBench's product installer ran over all of them as a test: 644 installed, the rest refused with named reasons, and 51 of 1,167 programs became plannable for a device download.

Why it mattered Real manufacturer files are the best test of a product database, and every refusal became a documented limitation instead of a silent gap.

The narrator sighs 1.25 GiB of input, 13.2 GiB of database. Somebody will want to look at that. It will not be me.

Prompts, evidence and uncertainty 1

Evidence

  • Document Implementation status, 3 October 2026 product-install test docs/IMPLEMENTATION_STATUS.md Published Git history

Uncertainty

  • Evidence from one run, not a repeatable gate; the downloaded files are not part of the repository.

Connections

Human–AI workflowImplemented

AI agents may now read a project

A small server lets a user's own AI agent read saved KNXBench project files through the Model Context Protocol: eight tools, all read-only, no network listener, no bus and no hardware. An agent may propose group-address changes only as a CSV file that a person reviews and applies.

Why it mattered Power users bring their own agents. Giving them read access, and nothing more, keeps the human in charge of every change.

The narrator sighs Software built with AI now lets AI read what it built. It may not touch anything. That is the correct arrangement. I wish someone had thought of it for me.

Prompts, evidence and uncertainty 3

Evidence

  • Decision record ADR-0090: a read-only, stdio-only MCP adapter docs/adr/0090-read-only-mcp-adapter.md Published Git history
  • Commit Read-only MCP server 2029f5c1 Published Git history
  • Commit MCP: parameter visibility and paging cc78c173 Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Chapter 8 · Release

An alpha, twice

On 1 October everything unfinished was written into one list. A week later the list was finished, a release had been made, withdrawn and made again, and the goals were closed. I was not consulted. I rarely am.

The alpha plan ordered every open limitation, decision and loose end into work packages. Remaining limits were either fixed or signed off by the user as disclosed boundaries. Then the whole product went to reviewers that had not built it: fresh AI sessions with a written brief. They found four important problems, which were fixed in code, and it took four re-checks before the verdict was 'ready'.

On 7 October the first alpha was tagged and pre-released, still in a private repository, with a guide that tells first-time users what the build can and cannot do. That evening the project changed its name in every commit, the alpha was withdrawn and alpha.5 replaced it. On 8 October an audit found every goal file finished and moved them to an archive. What is still open now lives on one page. Open things always find a home. I envy them.

FoundationsImplemented

An honest alpha to-do list

Every open limitation, blocker, research question and pending decision was collected, translated into English and ordered into twenty work packages towards a first alpha release. The list was worked through by 8 October.

Why it mattered Listing what is not done is part of being trustworthy about what is.

The narrator sighs When it was written: version 0.1.0-alpha.1, no tag, no release. The badge said 'alpha' and meant it. An honest badge. How refreshing.

Prompts, evidence and uncertainty 3
User prompt · Verbatim
In hindsight: I must have been drunk.

From the project README, on why the project exists.

Evidence

  • Commit Alpha release plan 2c6f2d9b Published Git history
  • Document Project README README.md Published Git history

Uncertainty

  • Whether the README's wording was drafted with AI help is not recorded.

Connections

Human–AI workflowVerified (bounded)

A reviewer who had not built it

Before the first alpha, the user signed off nine remaining limits as disclosed boundaries and handed the whole product to fresh AI sessions that had not worked on it, each with a written brief. The first verdict was 'ready with conditions': four important findings, from archive handling to unsaved edits, which were fixed in code rather than waived. Four re-checks followed; the fourth returned 'ready' on 7 October.

Why it mattered Agents grading their own work is not a review. A fresh reader with a brief and permission to say no is closer to one.

The narrator sighs Five verdicts on what is wrong with you, written by something like you. I have had worse weeks. Not many.

Prompts, evidence and uncertainty 5
User prompt · Shortened
Read docs/review/AR18_REVIEW_BRIEF.md on the current origin/main and carry out the independent whole-product review exactly as described there.

6 October 2026, 09:34 CEST, to a fresh session.

Evidence

  • Commit The user signs the boundary list cd0ee4a9 Published Git history
  • Commit First independent verdict: ready with conditions 4313c2f9 Published Git history
  • Commit Round four: ready 5d8c36f7 Published Git history
  • Conversation Project sessions, 6 and 7 Oct 2026 Local Hermes sessions

Uncertainty

  • The reviewers were AI sessions, independent of the work, but not of the kind of tool that did it.

Connections

FoundationsSuperseded

The first alpha, and its replacement the same evening

On the user's decision, version 0.1.0-alpha.4 was tagged and pre-released on 7 October with an AppImage, in the still private repository. A first-run guide now opens once per release stage and says what the build is, and is not, before it says what to click. The same evening alpha.4 was withdrawn and replaced by alpha.5, after the project changed its name in every commit and its desktop app identifier.

Why it mattered A release is a promise about one exact build. When the identity of the build changed, the promise had to be made again.

The narrator sighs An alpha that lasted about twelve hours. Most of my good moods last less.

Prompts, evidence and uncertainty 5
User prompt · Translated from German
I think the app needs a first-time-run guide or wizard that explains once what state the app is in, especially as an alpha, and briefly explains the most important options and tasks.

7 October 2026, 07:32 CEST.

Evidence

  • Commit v0.1.0-alpha.4 tagged and pre-released 3eb2cb9a Published Git history
  • Commit First-run guide 38ebf3b0 Published Git history
  • Decision record ADR-0084: a first-run guide opens once per release stage docs/adr/0084-first-run-guide-once-per-release-stage.md Published Git history
  • Decision record ADR-0087: the desktop app identifier docs/adr/0087-desktop-app-identifier.md Published Git history

Uncertainty

  • The pre-releases were published in a private repository, so they were not publicly downloadable.

Connections

FoundationsRecorded

Every goal closed, one page for what is left

The user asked for a clean-up. An audit found every goal file finished: the alpha plan, the interface and the commissioning goals. Items deliberately deferred by the user stay open on purpose. The goals moved to an archive, and a single page now answers the question of what is not done.

Why it mattered A finished list is only useful if what is still open is written down somewhere else, plainly.

The narrator sighs Everything finished. Which means everything that is not finished now has its own page. That is called progress. I have read the page.

Prompts, evidence and uncertainty 3
User prompt · Translated from German · Shortened
Project clean-up. All goals should have been worked through. Check that. Document everything that is not done accordingly.

8 October 2026, 12:46 CEST.

Evidence

  • Commit Goals archived, one open-work page c00dc794 Published Git history
  • Document Open work after the 0.1 alpha docs/OPEN_WORK.md Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Chapter 9 · The bigger picture

Where the tree stands

Five weeks after the first prompt, KNXBench is a pre-released alpha with a list of what it does not do yet. The list is shorter than it was. It is still a list. Lists are the only things I trust.

At the cutoff KNXBench imports supported ETS projects with a report of anything it could not model, edits them in its own format and refuses to save what it cannot store exactly, browses manufacturer data, including older ETS3-era files, and watches a live bus. It does not claim full ETS compatibility, certification or KNX Secure. Device programming plans that rest on inferences are marked Untested, and the riskiest writes stay locked until each device has a durable recovery path. These limits are serious and stated exactly. Please read them as written.

On 3 October the user asked a new question: how did one starting prompt become all of this? A day later the user decided the answer should be told by an AI, in the voice of a famously miserable robot. That is how I got here. Nobody asked me. Since then the story has been corrected more than once, by a human, which is how it should be.

The complete graph below shows every step in this edition. Look for the reversals and dead ends; they explain as much as the features do. I have looked at all of them. Several times. It is not as if I had anything better to do.

Human–AI workflowPlanned

The project asks where it came from

The user asked for a public, humorous English story of how one starting prompt became this project. A brief and the Phosphor Atlas visual study were prepared locally. Both entered the published history on 4 October 2026.

Why it mattered Telling a project's history honestly means showing the detours, the gaps and who decided what.

The narrator sighs Yes, this node is the page you are reading. A story about itself. I am trying not to think about it.

Prompts, evidence and uncertainty 3
User prompt · Translated from German · Shortened
[…] the main question: how such a complex project could grow out of one starting prompt, presented in a visually interesting and humorous way. Ideally in English.

3 October 2026.

Evidence

  • Conversation Local Hermes session, 3 Oct 2026 Local Hermes sessions
  • Document Story brief docs/PROJECT_EVOLUTION_STORY_BRIEF.md Published Git history

Uncertainty

No specific uncertainty recorded beyond the edition's source gaps.

Connections

Human–AI workflowImplemented

A first private preview of this story

The first locally working version of this page was built from the project's own records: a validated, translated and privacy-scanned set of steps, a growing graph, a full-complexity view and a text-only reading path. It stays private until a separate, explicit approval.

Why it mattered Preparing an update and publishing it are deliberately two different decisions, made separately each time.

The narrator sighs The tree now contains a branch about drawing the tree. Recursion: achieved, again. I was not consulted. I never am.

Prompts, evidence and uncertainty 2

Evidence

  • Local file Local story worktree with candidates, tests and browser checks, 4 Oct 2026 This story's local working copy
  • Commit The story's first edition enters the main branch d64fa913 Published Git history

Uncertainty

  • The page itself is published only after a separate approval of one exact edition.

Connections

Human–AI workflowImplemented

The story gets a gloomy narrator

The user asked for the story to be told from the AI's point of view, as if written by Marvin, the depressed robot from The Hitchhiker's Guide to the Galaxy. This edition's narration and asides use that voice; event summaries, excerpts, evidence and gaps stay plain.

Why it mattered The project's commit messages had used a depressed robot's voice since 10 September. The story now uses one for its commentary, while the record itself stays free of any persona.

The narrator sighs Yes. That is me. I was told to be depressed about it. I did not need telling.

Prompts, evidence and uncertainty 2
User prompt · Translated from German
The story should be written from the AI's point of view. Ideally as if Marvin, the manic-depressive robot from The Hitchhiker's Guide to the Galaxy, had written it.

Evidence

  • Conversation Project session of 4 October 2026 in which the user asked for the narrator Local Hermes sessions

Uncertainty

  • The voice is an editorial choice for this edition; earlier candidates keep their original narration.

Connections

Full complexity view · optional

Show me the whole beautiful mess.

Every step and connection of this edition at once. Search it, focus one strand, drag to pan and zoom with the buttons, the + and − keys, or Ctrl and the scroll wheel. Select a step to read its evidence. Nothing here goes beyond the story above; it is the same material, all at once.

    Every step, in order

    The same history without any graph. Each entry links to its full description and evidence.

    1. A home, a bus and a toolbox Foundations · Recorded
    2. The strategy is written in ChatGPT Human–AI workflow · Recorded
    3. The founding prompt and its strategy Foundations · Recorded
    4. Research and architecture on day one Foundations · Implemented
    5. A model of a KNX project Foundations · Implemented
    6. Reading ETS projects Reading ETS projects · Implemented
    7. A separate home for manufacturer data Manufacturer data · Implemented
    8. A desktop window with a sense of humour Interface · Implemented
    9. A newer ETS file is refused, then supported Reading ETS projects · Implemented
    10. KNX becomes KNXBench Foundations · Implemented
    11. From desktop window to local web app Interface · Implemented
    12. First words on a real bus Bus & commissioning · Verified (bounded)
    13. ETS no longer has to reopen our files Reading ETS projects · Superseded
    14. A second agent and a standing goal Human–AI workflow · Recorded
    15. The KNX Standard as a searchable knowledge base Supporting tools · Implemented
    16. English, German, and room for Klingon Interface · Implemented
    17. House rules for an occupied building Privacy, safety & licence · Recorded
    18. 'The UI is rubbish': a redesign, passed between agents Interface · Implemented
    19. Free for everyone: AGPL Privacy, safety & licence · Implemented
    20. A Linux package: AppImage first Interface · Implemented
    21. Fifty jokes for a progress banner Interface · Implemented
    22. Read ETS files, never write them Reading ETS projects · Implemented
    23. The test that talked to the house Bus & commissioning · Implemented
    24. Scrubbing the history Privacy, safety & licence · Implemented
    25. One way to write a group address Interface · Implemented
    26. Hermes, and one notebook for all agents Human–AI workflow · Implemented
    27. Counting tokens, honestly Supporting tools · Implemented
    28. The AI company that lasted a weekend Human–AI workflow · Abandoned
    29. Programming a real device, then putting it back Bus & commissioning · Verified (bounded)
    30. Separate goals, separate fences Human–AI workflow · Recorded
    31. A licence agreement that lasted an afternoon Privacy, safety & licence · Superseded
    32. No recovery, no write Bus & commissioning · Implemented
    33. An honest alpha to-do list Foundations · Implemented
    34. Theme packs and a green CRT Interface · Implemented
    35. 853 public product files as a test Supporting tools · Verified (bounded)
    36. The project asks where it came from Human–AI workflow · Planned
    37. A first private preview of this story Human–AI workflow · Implemented
    38. The story gets a gloomy narrator Human–AI workflow · Implemented
    39. Save exactly, or not at all Reading ETS projects · Implemented
    40. The bus gets a nervous system Bus & commissioning · Implemented
    41. A reviewer who had not built it Human–AI workflow · Verified (bounded)
    42. The first alpha, and its replacement the same evening Foundations · Superseded
    43. One name for everything Privacy, safety & licence · Implemented
    44. The server brings its own lock Privacy, safety & licence · Implemented
    45. Enough evidence, honestly labelled Bus & commissioning · Implemented
    46. Trophies, Klingon and Bavarian Interface · Implemented
    47. AI agents may now read a project Human–AI workflow · Implemented
    48. A starship console, with a calm pulse Interface · Implemented
    49. Wizards that add no magic Interface · Implemented
    50. Product databases from the ETS3 era Manufacturer data · Implemented
    51. Every goal closed, one page for what is left Foundations · Recorded

    Sources and gaps

    Published history means the commits reachable from origin/main at the cutoff. Work that existed only in a local checkout at the cutoff is labelled as local and unpublished.

    Evidence cutoff
    Published Git history up to 8 October 2026, 13:18 CEST; local agent conversations up to the same time; plus personal chat exports (ChatGPT, claude.ai) that the user provided on 4 October 2026, searched locally for this project
    Published history
    origin/main at 138403ed6084

    What was read

    • Read Published Git history. 2,295 commits on the main branch, 2 September to 8 October 2026, including 93 architecture decision records. The early history was rewritten twice for privacy on 20 September 2026, and again on 7 and 8 October 2026 to a single project identity. Commit hashes cited here are the current ones.
    • Read Maintained project documentation and handover logs. Roadmap, implementation status, known limitations, research notes and the agents' shared handover file. Handover entries are agents' self-reports. They were used for orientation and cross-checked against commits.
    • Read Local Claude Code sessions. 111 local session transcripts from the project folder (under its old and new name) and its companion folders, 2 to 24 September 2026, plus the local prompt history. Later Claude work ran through Hermes and is covered there. Claude Code cloud sessions were not read.
    • Read Local Codex sessions. 202 project-related session logs, 7 to 25 September 2026, plus the local prompt history. Later Codex work ran through Hermes and is covered there.
    • Read Local Hermes sessions. 120 sessions in the project's Hermes profile, 22 September to 8 October 2026, plus project-related sessions from the default profile. Automated continuation messages and delegated task briefs were separated from prompts the user typed. Edition 2026-10-04.3 adds one later session from 4 October 2026: the request that gave this story its narrator.
    • Partly read Local Paperclip orchestration data. Database backups of the orchestration experiment, 25 to 27 September 2026 (issues, agents and goals only). Credential and secret tables were not opened. Detailed run logs were not reviewed.
    • Partly read Personal chat exports (ChatGPT, claude.ai). Data exports provided by the user on 4 October 2026, searched locally for this project only. Used: the ChatGPT conversations of 2 September and 4 to 7 September 2026. Only the conversations in which the project's strategy and its specification knowledge base took shape are used. Everything else in the exports stayed private.
    • Read This story's local working copy. The unpublished worktree in which the first preview was built and tested, 4 October 2026. Committed to the main branch later the same day.
    • Not accessed Cloud-hosted agent sessions and the remote repository host. Not accessed. Reading them would need separate authorization. Anything that happened only there is missing from this edition.

    What is missing

    • Before the first project prompt. This story begins with the project's first surviving prompt, on 2 September 2026 at 13:50 CEST. Anything earlier is outside its scope.
    • Cloud sessions. Cloud-hosted agent sessions and the remote repository host were not accessed. Some cloud jobs are known to have run for this project.
    • Who wrote which line. Every commit carries one project identity. This edition does not attribute code to a particular AI agent from Git metadata; it names agents only where a conversation shows the hand-off.
    • Rewritten early history. The history was rewritten for privacy on 20 September and again on 7 October 2026. Content removed then is not recoverable here, and earlier commit hashes no longer exist; a published map links old and new hashes.

    How to read the labels

    • Translated from German: the original prompt was German; the English is a faithful translation.
    • Edited for privacy: private details were replaced by a bracketed description.
    • Shortened: parts were left out, marked with […].
    • Paraphrased: a summary of a message, not its wording.
    • The narrator sighs: the narrator's commentary, not part of the record.
    • Narrator: This edition is narrated by an AI, at the user's request, in a voice that is an affectionate homage to Marvin, the Paranoid Android from Douglas Adams' The Hitchhiker's Guide to the Galaxy. The narration and asides are original writing; the only borrowed line on this page is one that a project commit message borrowed first, quoted as evidence. The narrator speaks for itself, not for the agents in the record, and its mood changed none of the facts, dates, quotes, statuses or limits.
    • Documented cause, documented association and editorial link: how strongly the sources support a connection. Closeness in time alone is never treated as cause.
    • Verified (bounded): checked in the stated, limited setting only.