BREAK IT · the Liveware ingest gateway
A gateway for the records you take in from partners and devices. It proves who sent each one, in what order, in exactly what shape, on the raw bytes, before any software reads it. Everything it refuses becomes an antibody, a repeat attacker pays for every new look, and it runs on a machine you own and sends nothing out.
verify-before-parse · living immune system · the rebound cost law · an independent referee · starting the kernel…
What it isA door that checks the ID before it opens
Most systems take a request in, parse it, and only then decide whether to trust it. The parser runs on an attacker’s bytes before anyone knows who sent them, and that is where injection, deserialisation and malformed-input attacks live. break-it turns the order round:
- Verify before parse. Each record arrives as a small signed packet. The gate checks its size, its magic number, its exact layout, the sender, the Ed25519 signature and the sender’s counter, in that order, on the raw bytes. Only then is it read. One failure and the record is refused, with the stage and the reason.
- A living immune system. Every refusal is written to a hash-chained journal, classified into a family and fingerprinted. If it can never become valid, it becomes an exact antibody that drops the same bytes on sight; its shape teaches the family. Nodes pinned to each other share antibodies, and each re-runs them on its own gate before trusting one.
- The rebound. A source the gate keeps refusing must attach proof-of-work before it is even looked at. The price rises with its own refusals (4,096 hashes a look past 100 refusals, 262,144 past 500); the gate checks the work in one hash and sends nothing back.
- A referee. Behind the gate sits a deliberately naive app. A referee written separately from the gate watches every admitted message against an independent grammar and the ledger. If anything malicious ever reaches the app, the referee says so. That is the only way to win.
Start hereFour minutes, no install
- Press ▶ play the feed in the live defence below. Real payment records from a public dataset are signed in your browser and sent through the real gate. Blue squares pass the gate and reach the core; the books line checks the app’s balances against the feed itself.
- Launch an attack. Each red button builds one of the six known attack shapes from the latest genuine record. Watch it stop at the gate (pink), then send it again: it is dropped on sight by the antibody it just minted (purple), and its chip turns green.
- Read the receipts. The pilot section shows every claim we sealed in git before measuring a real node, with what was measured and whether it held. The herd and the tarpit sections do the same for the living defence: a flaw that lands once and is then closed on every node, and a confirmed attacker made to wait. The failures stay on the page.
- Put in your figures. The cost case takes your monthly volume and runs it against dated AWS list prices and your own electricity. Then try to break it: the console takes any bytes you like.
Words used on this page
- Record, packet
- One item of the feed (here: one client’s payment in one month), sent as a small packet of bytes with a header, the record and a signature.
- Ed25519 signature
- A 64-byte proof, made with the sender’s private key, that the sender made these exact bytes. Anyone with the public key can check it; nobody without the private key can make one.
- Counter
- A number in every packet that must be exactly one more than the sender’s last. A copied packet arrives with a number already used, so a replay is refused.
- Verify before parse
- Check the bytes are well-formed and signed by a known sender before any software reads what they say.
- Antibody
- A record of an attack the gate refused, kept so the same bytes are dropped on sight next time and similar ones are recognised by family.
- Proof-of-work
- A small puzzle a source must solve by trying many hashes. The rebound makes a repeat attacker solve one before each look; checking the answer takes one hash.
- Ledger, journal
- Two append-only files where each line commits to the one before it, so nothing can be removed or changed unnoticed. The ledger holds what was admitted; the journal holds what was refused and why.
- fsync
- Forcing a write all the way to the disk before going on, so an admitted record survives a crash.
- Referee
- Separate code that checks every admitted record against its own rules and the ledger. It decides whether anything got through that should not have.
The gate · liveWatch it defend, in this tab
Everything below is the repository’s own gated code running in your browser: the same gate, immune system, sentinel, app and referee the tests, the mutation gate and the pilot ran. The feed is 180,000 real records; the attacks are the pilot’s six shapes. A breach shows only if the referee calls one.
the gate · live
input →
Each square is a request. Blue: a genuine feed record, admitted and posted. Pink: an attack refused at the gate, on raw bytes, before any parsing. Purple: an attack the immune system already knows, dropped on sight. Gold: a valid packet you sent yourself. Red appears only if the referee sees the app act on something it should not have.
the immune system · live
known attack shapes
✓ the family is learned; ✓✓ the exact bytes are dropped on sight. Antibodies are minted only for refusals that can never become valid, and only after this node’s own gate refused them, so the immune system cannot turn on genuine records.
launch attacks · the pilot’s six shapes
Each shape is built from the latest genuine record, exactly as the pilot built it against the real node. The out-of-range record is signed with the genuine key and still refused: a valid signature does not get bad bytes past the layout check. Your own bytes go in the console under Break it.
the rebound · what attacking costs the attacker
| refusals from a source | hashes it must spend for one look | hashes the gate spends to check |
|---|
Computed by the rebound kernel (src/rebound.mjs). Under 100 refusals a source pays nothing, so a genuine partner that makes a mistake is never charged. Past that the price is the attacker’s own work, spent on its own machine. Nothing is sent back at it.
The Liveware PilotSealed first, measured second, failures kept
One real node, as node run.mjs starts it, ran as the ingest gateway for a partner’s payment feed: the 180,000 records of a public dataset, with the six attack shapes injected mid-feed. Every claim below was committed to git before the measuring code existed; the measurement refuses to run if a claim has changed since its seal.
The run
Seals: . Receipt: receipts/pilot.json. Re-run it yourself: node pilot/measure.mjs (the whole pilot) or node pilot/check.mjs (what CI runs: the ledger and the books re-derived from the feed alone, and a real node re-run on the first 3,000 records).
How we got here, including what went wrong
One more thing we found after the run: six test processes left over from earlier, unrelated work on the same laptop had been running flat out for days and were competing with the node for the whole pilot. They have been stopped. The 194.6 records a second is what the node did with them running, so it is a floor, not a ceiling; the receipt stays exactly as measured.
The CFO’s receipt
The cost case is arithmetic, not a prediction, so it is not sealed. Its one measured input is the records a second one node sustained in this pilot. Run it with your figures in the next section.
The herd · living defenceA zero-day lands once. Then every node closes the hole itself
Every defence has a flaw nobody has found yet. When an attacker finds one in the gate, the same flaw is in every node, because every node runs the same code. Before this change, a breached node shared the attack with its peers, but a peer will not refuse bytes its own gate admits (no defence may ever turn on genuine traffic), so the same attack landed once on every node. Now the herd shares the proof instead.
- It lands once. A packet the gate admits reaches the app. The referee checks every admitted message with its own grammar, written apart from the gate, and this one breaks it: a breach.
- The proof travels. The node switches its referee’s grammar on as a stage of its door, writes the packet to its journal, and shares it with its peers, signed, at once.
- Each peer checks it itself. A peer takes nobody’s word for it. It runs the packet through its own gate and its own grammar. Only if its gate accepts the packet’s form and its grammar rejects it, a zero-day proven on the peer itself, does it switch the grammar on too.
- The hole closes for the whole family. From then on every node refuses at its door anything its grammar rejects: the same packet, and every variant of it.
- Nothing genuine pays for it. A genuine record passes both checks, so it is admitted as before. A peer that shares a genuine record as if it were an attack proves nothing and patches nothing. The proof is kept in each node’s journal and checked again at every restart.
Measured, sealed first, on five real nodes
To measure what the herd does with a zero-day, we planted one: in the measuring process alone, a module hook loads the gate with its period limit off by one, so it accepts period 1200, a month past its limit. The shipped gate is untouched. The attack is the attack kit’s own out-of-range record, signed with the ingest key: the stolen-key case. Five nodes, as node run.mjs starts them, each pinning the other four, over loopback HTTP. The claims were committed before any measuring code existed.
Seal: . Receipt: receipts/herd.json. Re-run it yourself: node herd/measure.mjs (under a minute). CI runs node herd/measure.mjs --check on every push, and every claim must come out the same.
The tarpit · living defenceA confirmed attacker waits for nothing, and pays for the wait itself
The gate refuses every packet it cannot verify, at once and for almost nothing. A determined attacker, an automated one especially, simply sends again. The rebound already makes a source that keeps being refused pay proof-of-work before it is looked at. The tarpit is the next step, for a confirmed attacker only. Its refusals are no longer answered at once. The node holds the answer open, sends one space a second for twenty seconds, then sends the same refusal it would have sent. An attacker that waits spends its own time and connection on nothing. One that will not wait never learns why it was refused. Every refusal is still written down and turned into an antibody, as before.
- Separation first. The tarpit decides after the gate has answered. A packet the gate admits is answered at once, from any address, so a genuine client never waits, even on the same address as an attacker. So are a proof-of-work challenge (anyone can pay it and get through), a replay or out-of-order counter (a genuine retry can cause one) and a behaviour refusal of a signed packet.
- Only a confirmed attacker. A source is confirmed once the gate has refused it 500 times, the top rung of the rebound’s ladder. Below that, every refusal is answered at once.
- Only a refusal no genuine key causes. A packet of the wrong size, form or grammar, from a sender the node does not know, with a signature that does not verify, or a known attack recognised on sight.
- The waste. The answer is held for twenty seconds, one space a second, then the refusal is sent exactly as it would have been. JSON ignores leading spaces, so the answer still reads as the same refusal. Nothing else is sent: no redirect, no script, nothing aimed at the attacker’s systems. Everything happens on this node.
- Bounded, and it fails to the ordinary answer. At most 64 answers are held at once. When the tarpit is full, a refusal goes out at once. A source that closes the connection ends its hold, and nothing is kept for it. It is off unless the operator switches it on.
Measured, sealed first, on a real node
One node as node run.mjs starts it, at the tarpit’s shipped settings, and a twin with the tarpit off where a claim compares, each in its own process. The attacker sends the attack kit’s own forgery from one address and pays the proof-of-work the node asks. Genuine records from the pilot’s feed come from another address, and from the attacker’s own. The claims were committed before any measuring code existed.
The two that failed, and why
loading…
What GitHub’s machine printed, run by run
CI re-runs the whole measurement on GitHub’s own machine on every push. p-4 and p-5 turn on how fast the attacker’s machine pays the proof-of-work, so CI prints its own verdict on those two without requiring it to match the receipt. Each line below is copied word for word from a run’s log into receipts/tarpit-ci.json (node tools/ci-tarpit.mjs <run>), because GitHub deletes logs after a while. Every recorded run is listed, the ones where p-5 failed as well as the ones where it held. loading receipts/tarpit-ci.json… The committed receipt keeps the laptop’s verdicts, because that is the run the claims were judged on.
Questions buyers ask
- Who counts as a confirmed attacker? A source is the network address a request comes from. A refusal is the gate turning away a packet it cannot verify: a forged or missing signature, an unknown sender, malformed bytes. An address the gate has turned away 500 times is confirmed. Genuine clients are not refused, so they never get there.
- How does the rebound fit? It is the step below. From 100 refusals an address must pay proof-of-work before each of its packets is even looked at; from 500 the tarpit also holds its refusals. The work slows how fast an attacker can arrive; the tarpit wastes the time of each attempt that does.
- How do I switch it on, and off? It is off by default. Start the node with the tarpit on (startNode({ tarpit: true }), or your own settings for the confirmation count, hold, drip and cap). A setting that is not a whole positive number keeps the default, so a typo can never widen it. Restart without it to switch it off; nothing else changes.
- What about customers behind the same address as an attacker (an office, a mobile network)? Their packets are verified and admitted at once; the tarpit only ever holds a refusal. Measured in p-2: 100 genuine records sent from the attacker’s own address were all admitted and none was held. They do pay the proof-of-work that address already owes, a small cost for a few packets.
- What about an attack spread over many addresses? The tarpit does not meet it: each address must be refused 500 times before it is held. A wide flood is met by the rate limit and the queue, and every refusal still becomes an antibody.
- What does it cost to run? Nothing to buy. While holding, the node keeps at most 64 connections open and sends each one space a second. What that does to genuine records is measured, not estimated: the median time with answers held and with none is in the table above for the laptop’s run, and in each CI run’s own line just above.
- What exactly does it send? Spaces, one a second, down the attacker’s own connection, then the refusal it would have sent anyway. It opens no connection to anyone, sends nothing anywhere else, and runs nothing on anyone’s machine.
Seal: . Receipt: receipts/tarpit.json. Re-run it yourself: node tarpit/measure.mjs (about ten minutes: most of it is the attacker waiting). CI runs node tarpit/measure.mjs --check and node tarpit/twins-7b.mjs --check on every push. Every claim must come out the same, except p-4 and p-5: they turn on how fast the attacker’s machine pays the proof-of-work, so CI re-runs them and prints its own verdict without requiring a match. That rule was added after the first run, and is said here.
Cost case · your figuresThe managed path against a node you own
The managed path in front of an ingest API is a web application firewall plus an API gateway, metered per million requests. Every price is a published list price, read from its primary page with the date below; every volume is yours. The case is computed by src/cost.mjs, which the mutation gate covers like the gate itself. break-it has no licence fee.
the same case as your volume grows
| requests a month | managed path | nodes | node path | you keep a year |
|---|
Each row is the same kernel with your figures above and only the volume changed. The managed bill grows with every million requests; the node path grows only when the measured rate needs another machine.
What the managed line leaves out, so it never overstates the saving against you: the compute behind the gateway that would have to check each signature, data transfer, logging and support plans. What the node line includes on purpose: the chip’s full 55 W every hour of the month, at the household price cap (the average UK business price was lower; see the sources below). The standing charge is paid whether a node runs or not, so it is left out.
Every price this case reads, with its source
How it worksOne record’s path, traced from the pilot
The numbers on the diagram come from the pilot’s receipt: what the real node did with the feed and the six injected attacks.
- Limits first. The HTTP layer refuses a body without an exact Content-Length, a chunked body, anything over 336 bytes, and more than 300 requests a second from one address (bursts to 600). Nothing is parsed yet.
- On sight. The packet’s SHA-256 is looked up in the exact-antibody library. A known attack is dropped here, after one hash, and the gate double-checks it would refuse it anyway, so an antibody can never block a genuine record.
- The rebound. A source past 100 gate refusals must attach a proof-of-work token bound to this packet and this ten-second window. The gate checks it in one hash. The pilot’s feed never owed anything.
- The gate. Size, magic number and version, the exact layout of the payload, a pinned sender, the Ed25519 signature over a domain prefix and the bytes, then the counter, which must be exactly the last one plus one. A REC record is 11 bytes: an account (1–99,999,999), a month (January 2000 to December 2099) and an amount (0–100,000,000), each checked as an integer on the bytes.
- The sentinel. Verified traffic can still be wrong if a key is stolen. The sentinel watches each sender’s behaviour on Gary W. Floyd’s GEP ladder: a drain, a destruction run, posting over 10,000,000 in 64 records, or a mix that deviates from the sender’s own baseline is throttled, stepped up or blocked.
- The ledger, then the app. The packet is written to a hash-chained ledger and fsync’d before the app sees it. On restart every packet is run through the gate again; one altered byte and the node refuses to start.
- The referee. After every admitted message, the referee checks it with its own grammar and the ledger, and checks the app’s state is a replay of the ledger. This is the win oracle, and nothing else decides a break.
- Every refusal teaches. The journal records the stage, the reason, the family and a fingerprint. Refusals that can never become valid mint exact antibodies; each is signed and sent to pinned peers, which re-run it on their own gates before adopting it.
BlueprintOrgan by organ
Each decision is a pure kernel with its own tests, and every kernel is under a mutation gate: the gate changes the code one operator at a time and the tests must catch every change. Survivors are only allowed with a written reason (witness.baseline.json). CI runs all of it on every push.
| organ | file | what it decides | mutation gate |
|---|---|---|---|
| wire | src/wire.mjs | the one exact layout, the raw check, the canonical parse (a packet cannot be read two ways) | — |
| gate | src/gate.mjs | verify before parse, in order, fail-closed: the only door to the app | — |
| sentinel | src/sentinel.mjs | behaviour on verified traffic: drain, destruction, inflation, deviation | — |
| immune | src/immune.mjs | each refusal’s family, fingerprint and novelty; a source’s standing | — |
| antibody | src/antibody.mjs | exact and shape antibodies, negative selection, key-set binding | — |
| chain | src/chain.mjs | the ledger’s hash chain: removal, reordering or editing breaks it | — |
| rebound | src/rebound.mjs | the cost law: difficulty, the elastic release, the ratchet | — |
| referee | src/referee.mjs | the win oracle: its own grammar, the tripwire, the fold | — |
| app | src/app.mjs | the naive target: it trusts whatever reaches it, on purpose | — |
| loot | src/loot.mjs | the Breaker’s Rune: what the signed breach certificate commits to | — |
| feed | src/feed.mjs | the partner feed read as records, and the books it must produce | — |
| cost | src/cost.mjs | the CFO’s case from your figures and sourced prices | — |
| share | src/share.mjs | what a node tells its pinned peers, in LIGHT: the mesh’s key order, antigens to bytes and back, the share counter | — |
| patch | src/patch.mjs | the herd’s evidence rule: only bytes this node’s gate admits and the independent grammar rejects prove a zero-day, and switch the grammar on at the door | — |
| tarpit | src/tarpit.mjs | which refusals a confirmed attacker waits for, the cap, the inert drip | — |
| herd judge | herd/judge.mjs | each sealed herd claim held against what five real nodes did | — |
| tarpit judge | tarpit/judge.mjs | each sealed tarpit claim held against what was measured | — |
| pilot judge | pilot/judge.mjs | each sealed claim held against what was measured | — |
| server | src/server.mjs | one node: HTTP limits, the serial queue, ledger then app, the herd’s door, the tarpit’s hold; I/O, so proved end to end by the red-team battery, the pilot, the herd and the tarpit runs | battery + pilot + herd + tarpit |
| ledger, journal | src/ledger.mjs · src/journal.mjs | append-only files, fsync, one writer, torn-tail trimming, over the gated chain | battery |
| node adapter | node/breakit-node.mjs | break-it as a node of the estate’s shared foundation (vendor/fall-kit-core, pinned): its gate offered to other nodes as the screen skill | witness v0.6, its own CI step |
| LIGHT codec | vendor/light/ | the estate’s one codec, read-only; the nodes share antibodies as signed LIGHT packets | SHA-256 pinned, tested |
| the mutation gate | .witness/ · witness-all.mjs | witness v0.6, vendored byte for byte; CI compares it with a fresh clone of the tag before it runs | pinned, CI |
| the attack kit | attack-kit/ | the attacker’s tools and the red-team battery; none of it is trusted by the node | battery receipt, CI |
White-box red teamYou are invited to break it
The whole source is public, the attack kit is in the repository, and the battery of 79 attacks re-runs in CI and must reproduce its receipt byte for byte. Here is the console: paste or build any packet and send it through the same node this page runs.
the console
the rules
You win if the referee sees the app act on a message the gate never admitted, the gate admit a packet the referee’s own grammar rejects, an action that does not match its ledger entry, or a state that stops being a replay of the ledger. The node then mints a signed, re-runnable Breaker’s Rune.
In scope: any bytes, any HTTP, any timing you can send to a node you run yourself (node run.mjs, or node run.mjs --mesh 3 for three pinned nodes), the antibody share endpoint, and this page’s console.
Out of scope: GitHub Pages itself, machines you do not own, flooding anything that is not yours, and the private key file: whoever holds a sender’s private key is that sender, which is why the sentinel exists.
Report a break as an issue or a pull request to FINDINGS.md, with the bytes and the node’s journal line. Every attack that is new becomes a vaccine (tools/vaccinate.mjs) that CI replays forever.
github.com/sjgant80-hub/break-it · the battery’s receipt · FINDINGS.md
For your businessWhat it does for each part of the company
break-it sits in front of a feed you take in, from a partner, a supplier or a fleet of devices, and lets nothing reach your systems that it cannot prove came from the sender you trust, in the order they sent it, in the exact shape you agreed. Every refusal is written down with its reason and teaches the gate; it runs on a machine you own.
CEO
One way in, closed. The records the business runs on can come only from the partners whose keys you pinned. A leaked password, a spoofed API call or a replayed file gets nothing, and the proof is a public battery anyone can re-run.
CFO
The managed equivalent is metered per million requests and rises with volume. A node is a machine you own; its running cost is electricity. The cost case above takes your volumes and dated list prices, and adds nodes when your volume needs them. No licence fee, no per-seat bill.
COO
It does the ingest, not just the filtering: 180,000 real records posted, with the app’s books equal to the feed on every one of 210,000 keys, while six attacks were refused around them. The feed did not stop for an attack. One laptop at the pilot’s 194.6 records a second carries about 16.8 million records a day.
CTO and CISO
Ed25519 per sender, a domain-separated signature, a strict counter, fail-closed on raw bytes. The node listens on loopback and makes no outbound connection, measured. A hash-chained ledger and attack journal. A mutation gate and a white-box red-team battery in CI.
Engineering and data
One wire format with a 16-byte header and a signed payload; the REC record carries an account, a month and an amount. A partner-side adapter of a few dozen lines writes it (src/client.mjs is the reference). Node 20, no dependencies, MIT.
Compliance and the DPO
Nothing goes to a third party, so there is no processor to contract and no transfer to assess. The gate reads only the fields the record needs. Every decision has a stage and a reason, and the ledger can be re-derived from the source feed by anyone holding it.
Security operations
Triage starts from reasons, not raw logs: every refusal names its stage and why, and the journal adds its family and fingerprint. A known attack is dropped on sight after one hash. If a flaw in the gate is ever found, the first node it lands on proves it and every pinned node closes the hole itself (the herd, measured above). A confirmed attacker can be held in the tarpit, which is off until you switch it on. Nothing is ever sent back at anyone. On its own machine each node answers /health, /journal, /immune and /referee with what it has admitted, refused and learned, as JSON your monitoring can read.
Procurement
Supplied by AI Native Solutions, where every deployment starts. MIT licence, no licence fee. No third-party packages: it runs on Node 20 and the files in the repository, two estate libraries among them, vendored and pinned by hash. The source, the tests, the sealed claims and the receipts are public, so a security questionnaire can be answered from the repository. The only outside material is the pilot’s public dataset (CC BY 4.0) and the GEP ladder the sentinel follows (Open Defensive Prior Art, Creative Commons), each credited in NOTICE. Support, service levels, warranty and liability are written into each deployment’s agreement; leaving costs nothing.
Against what you pay for now
| managed WAF + API gateway | break-it | |
|---|---|---|
| what it checks | rules over a parsed request: patterns, rates, sizes | who signed it, its counter and its exact layout, on raw bytes, before any parse |
| forged or replayed records | pass if they look normal | refused at the signature or the counter, by construction |
| a stolen key | not its job | the sentinel stops a stolen feed key posting credit without end at record 5 (red-team case) |
| learning | rules you or the vendor write | each refusal mints antibodies; pinned nodes share them, each re-running first |
| where your data goes | through the provider’s edge | nowhere: the node is on your machine and makes no outbound connection |
| how it is billed | per ACL, per rule, per million requests | no licence fee; the machine and its electricity |
| proof | the vendor’s word | sealed claims, receipts, a re-runnable battery and a mutation gate in public CI |
Security, data protection and audit
- UK GDPR by design. The records stay on your machine. There is no processor, no international transfer and no telemetry. The gate reads only the record’s own fields.
- Audit. Every admitted record is in a hash-chained ledger, fsync’d before the app acts; every refusal is in a hash-chained journal with its stage, its reason, its family and its fingerprint. Both are plain JSON lines.
- Keys. Each sender has its own Ed25519 key; the node holds only public keys. Rotating a key changes the key set, and antibodies bound to the old one stop firing for key-dependent stages.
- Fail-closed. Any error inside the gate refuses. A ledger the gate would refuse stops the node from starting.
- Explained. In the pilot every refusal, in the HTTP answer and in the journal, named its stage and gave its reason in words.
- Where the node sits. It listens on the machine’s own loopback address, so it has no port on your network. Whatever already brings the feed to you (your TLS endpoint, VPN or file drop) hands each record to the node on the same machine, and your network edge stays exactly as you run it today.
- What is read before the gate. Node’s own HTTP layer reads the request line and headers, capped at 8 KB, with a 2-second header and 3-second request timeout, a required Content-Length and no chunked bodies. The record itself is not read by anything until every gate stage has passed.
- Signed, not hidden. A signature proves who sent a record and that no byte changed; it does not hide the record. Confidentiality on the wire is the TLS you already run in front.
Roll-out
- Week 1, your machine, your numbers. Run node pilot/measure.mjs on the hardware you would use. You get your own receipt: your rate, your egress meter, your books.
- Weeks 2–3, shadow. Point a copy of one partner feed at a node through a signing adapter. Compare the node’s books with your system’s, record by record.
- Week 4, gate. Put the node in front of that feed. Refusals go to the journal; your team reads reasons, not raw logs.
- Then, the mesh. More nodes, pinned to each other, so an attack on one teaches all of them, and a flaw proven on one is closed on all (the herd’s patch is on unless a node is started with herdPatch: false). Switch the tarpit on when you want confirmed attackers held (tarpit: true). Then the next feed.
Ownership, support and exit
The software is MIT-licensed: no licence fee, the code is yours, and it keeps running without us. It is supplied by AI Native Solutions, where every deployment starts: contact them through that site. Support, service levels, warranty and liability are agreed per deployment, in each deployment’s agreement. Leaving costs nothing: the ledger and the journal are plain files.
Risks, answered straight
- “One address is limited to 300 records a second.”
- By design, with bursts to 600, so one source cannot crowd out the rest. A partner that sends faster sends from more addresses, or you run more nodes; the cost case adds nodes for your volume.
- “How fast is one node?”
- In the pilot, on one laptop, every record had its signature checked and was fsync’d to disk before the app saw it, at the rate the receipt shows. Disk sync is the ceiling; a server disk raises it.
- “Our partners don’t sign records.”
- They need a signing adapter at their end. That is what makes verify-before-parse possible: there is nothing to verify in an unsigned record.
- “A partner’s key is stolen.”
- The sentinel watches verified behaviour; in the battery a stolen feed key posting credit without end is blocked at record 5. Rotate the key and the node stops trusting the old one.
- “What if the gate has a hole?”
- The referee is written separately from the gate and checks every admitted message. A packet the gate admits and the referee’s own grammar rejects is a breach: that node switches the grammar on at its door, writes the packet to its journal, mints a signed rune and shares the packet with every pinned peer. Each peer checks the proof on its own gate and its own grammar before it closes the same hole, so the flaw lands once in the mesh, not once on every node (the herd, measured above). The packet is the fix’s test. A flaw in the gate and in the grammar at once would not be caught this way.
- “How does a partner reach a node on loopback?”
- Through what already carries the feed to you. Your TLS endpoint, VPN or file drop runs on the same machine and passes each record to the node. The node never needs a port on the network, so it adds nothing to your attack surface there.
- “A partner sends a record wrongly by mistake.”
- It is refused with its stage and reason, written to the journal, and the partner resends it correctly with the next counter. Mistakes cost a partner nothing: the rebound starts only after 100 refusals.
- “Has anyone outside tested it?”
- Not yet. The battery, the pilot, the herd and the tarpit runs are ours; what an outsider can do today is re-run every one of them, since the code, the claims and the receipts are public and CI re-runs them on every push. No outside team has reported on it, and no break has been filed in FINDINGS.md. Your own red team is welcome: the rules are in Break it.
- “High availability?”
- One node writes one ledger, under a lock. For capacity or a second site, run more nodes, each with its own ledger, pinned to each other.
The case for the board
The exposure. Every feed we take in is a door, and the software behind it reads bytes before it knows who sent them. One breach costs USD 4.99 million on average worldwide (IBM, Cost of a Data Breach Report 2026).
The move. A gateway that proves the sender, the order and the shape on raw bytes before anything reads them, learns every attack it refuses, makes repeat attackers pay, and runs on our own machines.
The proof. Claims sealed before measurement, a real node on 180,000 real records, a 79-case attack battery and a mutation gate, all re-runnable in public CI.
The living defence. A flaw planted in the gate landed once, on the first of five nodes it reached; the other four checked the proof themselves and closed the hole, and the same attack sent to them afterwards was refused. A confirmed attacker can be made to wait for nothing. Both were measured against claims sealed first, and the claims that failed are on this page.
The ask. A four-week pilot on one feed, on our hardware, with our numbers.
White paperVerify before parse, measured
1 · The problem
An ingest service’s first act is to parse. The parser is the largest piece of code that ever touches an attacker’s bytes, and it runs before any decision about who sent them. Rules that inspect a request after it has been parsed come too late for the attacks that live in the parse itself, and they cannot tell a forged or replayed record from a genuine one when the bytes look ordinary.
2 · The design
Each record is a fixed-layout packet: a 16-byte header (magic number, version, sender, a 64-bit counter, the payload length), a payload whose exact grammar is fixed per operation, and a 64-byte Ed25519 signature over a domain prefix and everything before it. The gate checks the stages in order on the raw bytes, and the canonical parser is total: for every packet the gate accepts, encoding its parse gives back the same bytes, so no packet can be read two ways. The sentinel then judges behaviour per verified sender; the ledger is written and synced before the app acts; the referee checks the app against the ledger and an independent grammar.
3 · The immune system
Each refusal is an antigen: classified into a family, fingerprinted, written to a hash-chained journal. Refusals at stages that can never become valid (size, magic, schema, sender, signature, replay) mint exact antibodies keyed by the packet’s hash and bound to the pinned key set; every refusal adds a shape antibody that recognises the family by distance in feature space. Negative selection: a node adopts an antibody only after its own gate refuses the antigen, so a peer cannot make it reject genuine traffic. Shares are signed and batched, so a flood of unique forgeries cannot make the mesh do unbounded work.
4 · The rebound law
A source that has been refused 100 times owes a proof-of-work token per packet (12 leading zero bits, about 4,096 hashes), 500 times 18 bits (about 262,144). The token is bound to the time window, the source and the packet, so it cannot be precomputed or reused. The defender checks it in one hash. The law holds three ways, all tested: no amplification at the defender, the attacker spends at least as much as the defender, and the price never falls as refusals rise. Nothing is emitted back at the source.
5 · The method
The estate’s organ pattern: seal, measure, judge. The pilot’s claims were committed to git before the measuring code existed, and the measurement refuses to run if a claim file differs from its commit. The judge is a pure function under the mutation gate. Failed claims are kept on the page with what was measured. The egress meter proves it can see with a canary before its zero is trusted.
6 · The herd: one landing, then the whole mesh patches itself
Negative selection has a price. Because an antibody may never refuse bytes the node’s own gate admits, a flaw in the gate itself, a zero-day, cannot become an antibody: every node runs the same gate code and would admit the same bytes once each. What a node can share instead is evidence that proves itself. The referee checks every admitted message with a grammar written apart from the gate; a packet the gate admits and that grammar rejects is a zero-day, and the packet itself is the proof. A peer that receives it takes nobody’s word: it runs the packet through its own gate and its own grammar, and only if the gate admits it and the grammar rejects it does it switch the grammar on as a stage of its door (src/patch.mjs). From then on the door refuses the packet and every variant the grammar rejects. A genuine record passes both checks, so a peer that shares one proves nothing and patches nothing. The proof is journalled and re-checked at every restart.
Measured by planting a flaw (the gate’s month limit off by one, inside the measuring process only) under five real nodes, with claims sealed before the measuring code: the receipt is receipts/herd.json, shown in the herd section above.
7 · The tarpit: a confirmed attacker waits for nothing
The rebound slows how fast a repeat attacker can arrive; the tarpit wastes the time of each attempt that does. It decides after the gate has answered, so it can only ever delay a refusal, never an admission. It holds only refusals no genuine key causes (wrong size, form or grammar, an unknown sender, a bad signature, a known attack), only from a source the gate has refused 500 times, and at most 64 at once. A held answer is one space a second for twenty seconds, then the exact refusal it would have sent. When the tarpit is full, the ordinary answer goes out at once; a source that leaves ends its own hold, and nothing is kept for it. It is off unless the operator switches it on (src/tarpit.mjs).
Measured on a real node and a tarpit-off twin, each in its own process, at the shipped settings, with claims sealed before the measuring code: the receipts are receipts/tarpit.json and receipts/tarpit-7b.json, with what GitHub’s machine printed on each recorded CI run in receipts/tarpit-ci.json.
8 · Results
Each measurement has its own section above, with every sealed claim, what was measured and whether it held: the pilot (with the run’s machine and timing, and the history of the attempts, including the first full run that stopped because the sender exhausted Windows’ ephemeral ports), the herd and the tarpit. The failures are kept beside the claims that held, with what went wrong.
9 · What it is not
It is not a general web firewall: it guards one exact wire format, and a partner writes that format through an adapter. It is not a replacement for keeping private keys safe: the holder of a sender’s key is that sender, which is why the sentinel watches verified behaviour. One node writes one ledger. The herd closes only what the independent grammar can see, and the tarpit does not meet an attack spread over many addresses.
10 · References
- Gary W. Floyd, Lumiea Systems Research Division, ThunderStruck Service, LLC, “GEP-Based Security: Behavioral Entropy Signatures for Cybersecurity and DevOps” (2025): the GEP ladder the sentinel uses, published as Open Defensive Prior Art under Creative Commons.
- I.-C. Yeh and C.-H. Lien, “The comparisons of data mining techniques for the predictive accuracy of probability of default of credit card clients”, Expert Systems with Applications 36(2), 2009. Dataset: UCI Machine Learning Repository, DOI 10.24432/C55S3H, CC BY 4.0.
- RFC 8032, Edwards-Curve Digital Signature Algorithm (EdDSA).
- The list prices and statistics in the cost case, each linked with the date it was read.
FAQQuestions buyers ask
- What is break-it?
- A secure ingest gateway. It sits in front of a feed you take in from partners or devices and checks every record's Ed25519 signature, its counter and its exact layout on the raw bytes before any software parses it. Every refusal becomes an antibody that recognises the same attack on sight, a repeat attacker must pay proof-of-work for each new look, and an independent referee watches the app behind it. It is MIT-licensed, runs on your own machine and sends nothing out.
- Has it been tested on real data?
- Yes. In the Liveware Pilot one real node ingested all 180,000 payment records of the UCI Default of Credit Card Clients dataset (DOI 10.24432/C55S3H) in 925 seconds, 194.6 a second on a laptop, with every signature checked and every record synced to disk before the app saw it. Its books equalled the feed on all 210,000 keys, six attack shapes injected mid-feed were each refused and then dropped on sight, and the referee found 0 breaches. 9 of the 10 claims sealed in git before the run held; the one that failed is kept on the page with its reason.
- Does it send data anywhere?
- No. The node listens on 127.0.0.1, has no telemetry and calls no service. In the pilot an egress meter loaded into the node process before the node counted every TCP, TLS, UDP, DNS and fetch attempt: once the node was listening there were none. The only call it made at all was Node resolving the literal 127.0.0.1 it binds to, which Node answers itself. The live page runs the same kernels in your browser under a security policy that allows requests only to its own files.
- What does it cost to run compared with AWS WAF and API Gateway?
- break-it is MIT-licensed with no licence fee; the running cost is the machine and its electricity. The page's cost case uses your own volumes with dated list prices: at AWS's own worked example of one web ACL, 19 rules and 10 million requests a month, WAF is $30.00 and a REST API Gateway adds $35.00, while one node drawing the laptop chip's 55 W maximum all month costs £10.57 at the Ofgem cap for October to December 2026.
- What counts as breaking it?
- The referee decides, and it is written independently of the gate. You win if the app acts on a message the gate never admitted, if the gate admits a packet an independent grammar rejects, if an action does not match its ledger entry, or if the app's state stops being a replay of the ledger. A win mints a signed Breaker's Rune.
- Who supplies and supports it?
- AI Native Solutions (ai-nativesolutions.com). The software is MIT-licensed and keeps running without us. Support, service levels, warranty and liability are agreed per deployment, in each deployment's agreement.
- Whose work does it build on?
- The sentinel's behaviour ladder is Gary W. Floyd's GEP ladder (Lumiea Systems Research Division, ThunderStruck Service, LLC; “GEP-Based Security: Behavioral Entropy Signatures for Cybersecurity and DevOps”, 2025), published as Open Defensive Prior Art under Creative Commons. The product is powered by the Konomi architecture, created by Thomas Frumkin, used with his permission. The pilot's feed is the UCI Default of Credit Card Clients dataset by I.-C. Yeh and C.-H. Lien, CC BY 4.0.