Faraday

A numbered, dated log of what was actually done and what was actually observed. Failures are recorded, because an experiment that showed nothing is a result. Numbers run continuously and are never reused.

The method.
  1. Number continuously. An experiment keeps its number forever, so anything can cite anything by number alone.
  2. Date it. A measurement without a time is not a measurement.
  3. Say what was asked before saying what was found.
  4. Record the apparatus: the command, the machine, the version. Someone must be able to repeat it.
  5. Quote what was observed, verbatim where possible, before interpreting it.
  6. Record NO EFFECT and REFUTED as readily as CONFIRMED. Faraday's null results are half the value of his notebooks.
  7. Name the law it tests, or say that it tests none yet.

20 experiments · 11 CONFIRMED, 1 NO EFFECT, 8 REFUTED. Numbers run continuously and are never reused. The build refuses an entry missing its question, apparatus, observation or result.

1 · The instrument printed COMPLETE over an empty frame

2026-09-19 · tests L19 · REFUTED

The question

The page said it had drawn 37,796,045,093 particles. Had it?

Apparatus

Ventusltd/cosmic index.html at commit 28cfd61, Chrome, WebGL2, local server on 127.0.0.1:8802. Checked by reading gl.isContextLost() from the page.

What was done

Opened the page with my own eyes rather than trusting the readout, saw a black canvas under a confident heading, then queried the context directly and read back four pixels from the centre of the canvas.

What was observed
{"lost":true, hud:"showing 37,796,045,093 of 37,796,045,093 lines · COMPLETE in 34.0 s"} and the centre pixels all zero. The canvas was black and the instrument said it had finished.
What it shows

A lost WebGL context makes every subsequent draw call a silent no-op. An exposure with no guard therefore races to 100% at enormous apparent speed and reports a complete count of a picture that was never drawn. This is the worst class of error available to an instrument, because the output is plausible and the failure is silent.

Keys
the page's own claimcommit 28cfd61, Ventusltd/cosmic
the fixwebglcontextlost is caught, stated on screen, and stops the exposure; commit cc7a807
2 · The timer measured how fast commands were queued, not how much was drawn

2026-09-19 · tests L19 · REFUTED

The question

After the context loss was fixed, the page reported a full exposure of 37.8 billion points in 0.8 seconds. Is that possible?

Apparatus

Same page and machine. Arithmetic, then a GPU fence.

What was done

Divided the claimed population by the claimed time.

What was observed
37,796,045,093 in 0.8 s is 47 billion points per second. Repeating the run gave 9.7 s, then 34.0 s, for the same work, which is not how a fixed amount of drawing behaves.
What it shows

gl.drawArrays returns the moment the command is queued. The GPU may be minutes behind. Timing the submission and calling it COMPLETE reports a picture that has not been drawn. A fence is the receipt: the exposure may only advance when the GPU says the previous batch is retired. After the fence was added the same run reported 2.6% in 8 seconds, which is a real rate.

Keys
the fixgl.fenceSync and clientWaitSync pace the exposure; commit cc7a807
3 · More silicon was printed than the wafer contains

2026-09-19 · tests L13 · REFUTED

The question

tools/wafer.py computed the printed area of a 300 mm wafer. Does the answer make physical sense?

Apparatus

tools/wafer.py, first run. Inputs: 300 mm diameter, 3 mm edge exclusion, 26 by 33 mm reticle field, 0.08 mm scribe.

What was done

Read the output before publishing it, and compared two numbers in the same JSON object.

What was observed
printed_um2 83,226,000,000 against wafer_area_um2 70,685,834,706. The printed silicon exceeded the wafer by 18%.
What it shows

Each partial field at the rim had been counted as a whole die, although most of that rectangle hangs off the substrate. The reticle is exposed in full; the silicon is not there. Replacing it with the actual rectangle and circle intersection, on a deterministic sub grid, gave 67,518,045,832, which is inside the usable area of 67,886,675,651. The cartridge now carries that inequality as a check, so the same error cannot be published again.

Keys
the impossible figuretools/wafer.py first run, Ventusltd/cosmic
the checkderived.checks.printed_le_usable in wafer.json; commit e493bfe
4 · A law written in the morning was broken the same day

2026-09-19 · tests L12 · REFUTED

The question

L12 was written to say that 37.9 billion things cannot all be shown, because at full field they are 38,000 to a pixel. Is that true?

Apparatus

Ventusltd/cosmic scan mode, 1120 by 1064 window, Chrome, WebGL2.

What was done

Refused to accept the refusal, and asked what a display's capacity actually is. Then built a mode that draws the population in order, a screenful at a time, at confusion spacing, and let it run.

What was observed
SCAN, shown 27,720,288 of 37,929,011,953, 40,248 per frame at 5.5 px spacing, nothing shares a pixel, 5.11 million per second, 2.1 hours remaining.
What it shows

The confusion limit binds one FRAME. A display's capacity is its resolution elements multiplied by its frames, so showing everything was never impossible, only slow. On a 3840 by 2160 panel the same run is 18 to 38 minutes depending on refresh. The law was amended rather than defended.

Keys
the law as first writtenVentusltd/law, commit fbf1285
the amendmentVentusltd/law, commit f8e7b6e
5 · How fast this machine can actually draw

2026-09-19 · tests L18 · CONFIRMED

The question

A good game runs on a cheap phone. Was the hardware ever the limit here?

Apparatus

Ventusltd/cosmic, x-ray mode, collapsed into one repository so most of the population falls outside the viewport.

What was done

Read the exposure counter and the elapsed time off the instrument at depth, and separately at full field where every point is rasterised.

What was observed
17.43 billion of 35.56 billion drawn in 2.8 seconds with most points culled in the vertex stage, about 6.2 billion per second. Fully rasterised on screen, about 125 million per second.
What it shows

The hardware was never the constraint and is three orders of magnitude clear of it. The 5.11 million per second of experiment 4 is a rule I imposed, 30 pixel spacing for legibility, not a property of the machine. Quoting one's own throttle back as a physical limit is an error worth naming.

Keys
the measurementread from the instrument's own HUD, which is fence paced and therefore reports retired work
6 · Two independent walks of the estate agreed to the digit

2026-09-19 · tests L14 · CONFIRMED

The question

Does the estate's line count reproduce when measured twice by different code?

Apparatus

tools/belt_split.py finishing 11:13:06+01:00 and tools/clusters.py finishing 11:24:27+01:00, both walking every path in every commit's tree across every repository.

What was done

Ran both and compared the totals without adjusting either.

What was observed
37,929,011,953 lines and 15,065,506 entries from both, independently.
What it shows

The walk is deterministic and the number is reproducible. This is the only reason the figure is quoted as measured rather than as a candidate.

Keys
both runsbelt-meta.json in Ventusltd/cosmic
7 · The estate grew while it was being measured

2026-09-19 · tests L13 · CONFIRMED

The question

Is the count stable between measurements taken 36 minutes apart?

Apparatus

tools/clusters.py at 11:24:27+01:00 and tools/web.py at 12:00:07+01:00.

What was done

Compared the repository counts from the two runs.

What was observed
67 repositories at 11:24 and 68 at 12:00. The difference was caused by cloning a new repository into the working directory, which is to say by the act of doing this work.
What it shows

A measured system includes the act of measuring it. The honest response is to timestamp every total rather than to round it or to pick one. A total without a time is not a total.

Keys
both runsbelt-meta.json and web-meta.json
8 · The routing table was incomplete, so it was not used

2026-09-19 · tests L14 · NO EFFECT

The question

estate-index.tsv lists blob identity, line count, repository, commit and path. Can the belt be built from it?

Apparatus

estate-index.tsv in Ventusltd/cosmic, compared against the distinct blob count at HEAD from the earlier runner pass.

What was done

Counted its distinct rows before building anything on it.

What was observed
17,599 distinct blobs in the file against 19,304 distinct blobs at HEAD. It covers 91% of them, and the per repository totals it gives are 25,323,372 lines against a measured 25,335,587.
What it shows

It is a partial index and would have under-split the belt by a visible margin. It was not used, and the belt was built from a fresh complete walk instead. Recorded because deciding not to use something is a result, and because the file is still published and someone else may reach for it.

Keys
the fileestate-index.tsv, Ventusltd/cosmic
9 · A public file named private repositories

2026-09-19 · tests grid L6 · REFUTED

The question

belt.tsv was published to a public repository. Were all 67 of the names in it mine to publish?

Apparatus

gh repo list Ventusltd --limit 200 --json name,visibility, compared against the names in belt.tsv.

What was done

Asked the question after publishing rather than before, which is the error.

What was observed
Four repositories named in the public file are PRIVATE, and two are not under the organisation at all. The commit shard headers carried the same names.
What it shows

A name is disclosure even when a count is not. The six were replaced with our own word and a number, the totals were untouched and still sum to 37,929,011,953, and the tool now asks GitHub which repositories are public before writing, refusing to assume. The names remain in the published history of three commits, which cannot be removed without a force rewrite of a public repository.

Keys
the redactioncommit d672e69, Ventusltd/cosmic
still exposedcommits cc7a807, 188fb5b, e493bfe
10 · Every drop is the ocean, timed: a Merkle walk against brute force

2026-09-19 · tests L14 · CONFIRMED

The question

Git stores each distinct directory once. If the lines under every distinct tree are counted once and reused, does every commit still come out to exactly the number the slow walk gave?

Apparatus

tools/trees.py in Ventusltd/cosmic on a 24 core machine, against the per commit counts written that morning by tools/clusters.py, which ran git ls-tree -r on every commit and took 565.2 seconds. A commit sha is immutable, so the same commit must hold the same lines under both methods.

What was done

Measured each of the estate's roughly 31,000 distinct trees once, summed children into parents, and compared lines and entries for every commit sha present in both results.

What was observed
"matched_exactly": 9869, "differed": 0, "brute_force_seconds": 565.2, "merkle_walk_seconds": 4.9, "merkle_arithmetic_seconds": 0.21, "only_in_brute_force": 0, "only_in_merkle": 0
What it shows

A third, independent count of the estate agrees with the first two on every commit, and the method that uses the structure git already has is 115 times faster. The count is no longer one number trusted once: it is 9,869 separate agreements.

Keys
the runE:/particles-runs/trees.err on the measuring machine; tools/trees.py in Ventusltd/cosmic
11 · Any key, chosen at random, followed to the actual line of text

2026-09-19 · tests L23 · CONFIRMED

The question

The wafer claims one key for every line in every file in every commit. Can any key, chosen by anybody, be followed to the line it names?

Apparatus

tools/key.py in Ventusltd/kuiper-belt, run unattended with --prove-until. It uses git alone: binary search to the commit, git ls-tree -r in git's own order to the file, git cat-file to the text. It stops dead at the first failure, and it checks the cached line count of the blob it lands in against git every time.

What was done

Drew keys uniformly from all issued lines, about two a second, and logged every one.

What was observed
{"state": "RUNNING", "keys_proved": 558, "wafer_keys": 37929255811} at 12:58Z, and still running. For example key 45,108,233,899 resolved to globalgrid2050 / b1c4ec082c6d / data/generation/archive/2022/elexon_generation_sources_2022-09.csv line 37939, and printed the line.
What it shows

The count and the map are the same object. If the counts were wrong anywhere, the walk inside a commit would not end where the index says the commit ends, and the tool would refuse. In 558 draws from 37.9 billion it did not.

Keys
the logE:/particles-runs/prove-keys.log and PROVE-KEYS.json
publishedproof 1 on globalgrid2050.com, commit 99bb7965
12 · The first one-wafer drawing was true and dead

2026-09-19 · tests L22 · REFUTED

The question

With every line placed by one law and repositories as rings, does the whole estate look like the CPU wafer it was modelled on?

Apparatus

Ventusltd/kuiper-belt index.html, first version: keys issued repository by repository, a ring drawn wherever one repository or commit ended.

What was done

Looked at it.

What was observed
A flat, featureless disc. 42.5 thousand keys per pixel, the account correct, and not one ring visible: one repository holds 94% of the keys and no commit is wide enough to show at full field, so the ring rule correctly drew nothing.
What it shows

The real wafer's rings are numbers that were never issued. The estate has a measured source of exactly that, which is silence. Reissuing keys in the order time issued them, with unissued keys in proportion to the silence before each commit, produced the dark pupil and the rings at once, and every ring is a gap between commit timestamps rather than a decoration. The constant was first set so that silence was 57% of the wafer against a stated intention of a quarter; the constant was wrong, not the data, and was changed to 600 keys a second and frozen.

Keys
the second versionVentusltd/kuiper-belt commit 0755869; tools/wafer_keys.py
13 · Two local models hunted the law book for unexplained symbols

2026-09-19 · tests L19 · REFUTED

The question

The law book promises that every symbol is named. Is that true?

Apparatus

deepseek-coder:6.7b and qwen2.5-coder:14b under Ollama on one RTX 5070 Ti, both loaded at once, each shown every law's equation and symbol list. A model's answer was treated as a candidate and then checked mechanically: a symbol counts only if it is in the equation and nowhere in the explanations.

What was done

40 readings, 20 laws by 2 models.

What was observed
5 claims survived the mechanical check. 4 were noise: a multiplication sign, the word whole, the word child. 1 was real: pi, used in two laws and explained in neither.
What it shows

The promise was false in one place, and the place is instructive: pi is exactly the kind of symbol a textbook treats as too obvious to mention. A small local model found it for nothing; the mechanical check is what made its answer usable, since four fifths of what survived was still wrong.

Keys
the auditE:/particles-runs/LAW-AUDIT-LATEST.md
the fixVentusltd/law commit 675717e
14 · A command that killed itself

2026-09-19 · tests none yet · REFUTED

The question

Will stopping every process whose command line contains key.py stop the old proof loop?

Apparatus

A PowerShell filter on Win32_Process CommandLine, run from a shell whose own command line contained the text key.py.

What was done

Ran it.

What was observed
Exit code 255 and no output. The filter matched the shell that was running it, and everything queued after it died with it.
What it shows

A pattern that selects by description selects the describer. The same mistake is available to any rule written in the language of the thing it governs. The old loop did stop, which is the least interesting fact about it.

Keys
the transcriptsession of 2026-09-19
15 · The binding constraint was money, and it was measurable

2026-09-19 · tests L18 · CONFIRMED

The question

What actually limits this work this afternoon?

Apparatus

Five readings of a prepaid balance between 13:40 and 13:57 London time, with two subordinate agents running for the first three minutes and stopped thereafter.

What was done

Divided money spent by minutes elapsed, then by steps taken.

What was observed
1.04 pounds a minute with two agents running; 0.40 pounds a minute after they were stopped; about 0.45 pounds a step, because each step rereads the whole conversation, and nothing at all while idle. The machine under the desk, its GPU and its two local models cost nothing.
What it shows

L18 held on the day it was written: the physics was not what limited the work. The constraint was the cost of rereading context, so the cure was fewer and larger steps, work moved to the local machine, and stones to carry context instead of the transcript.

Keys
the readingsscreenshots supplied by the account holder, 13:40 to 13:58 London time
16 · Eight dots add one and one

2026-09-19 · tests L26 · CONFIRMED

The question

Can the dots compute anything at all, or can they only be lit? The claim under test was made the same evening: every dot can be programmed like a transistor.

Apparatus

A cell is one dot with a permanent key and no other property. It is dark or lit. A program gives each cell one rule, and there are only two kinds: an input cell is lit when the visitor says so; a gate cell is lit UNLESS both of the two cells it answers to were lit one tick earlier. That second rule is the gate from which every other logic gate can be made. Nothing is stored per cell: the state of a cell at a tick is worked out backwards from that tick to tick nought, when every gate cell is dark.

What was done

Wrote a half adder as a program of 8 cells (2 inputs, 6 gate cells, one kind of gate only). Ran all four input rows. The check reads the lit or dark state of the sum cell and the carry cell after they settle; it never looks at the wiring. Ran it again with the cache switched off, so nothing at all is kept between one question and the next. Then planted a fault (the carry cell rewired) and ran the same check.

What was observed
Rows as read from the cells: 0 and 0 give sum 0 carry 0; 0 and 1 give sum 1 carry 0; 1 and 0 give sum 1 carry 0; 1 and 1 give sum 0 carry 1. Identical with the cache off. The slowest row settled at tick 3. The planted fault was caught.
What it shows

A cell whose rule answers to the OUTPUT of other cells is a logic gate, and cells so wired compute. One and one make two, read off the dots. The word that was honest before this entry was 'programmable'. After it, for this apparatus, 'computes' is also honest. It is a statement about cells run by this rule. It is not a statement that any published page computes anything.

Keys
the apparatus and the commandVentusltd/faraday, apparatus/cells.mjs and apparatus/cells.test.mjs; run: node apparatus/cells.test.mjs; the numbers are in apparatus/cells.result.json
17 · Sixty nine dots add any two numbers up to fifteen

2026-09-19 · tests L26 · CONFIRMED

The question

Does it scale by composition alone, with no new kind of cell?

Apparatus

The same two rules as entry 16. A four bit adder written as a program of 69 cells, 60 of them gate cells.

What was done

Set the eight input cells to every pair of numbers from 0 to 15, which is 256 pairs. For each, waited for the five output cells to settle, read them as a binary number, and compared it with ordinary addition.

What was observed
0 of 256 wrong. Examples as read from the cells: 6 + 3 = 9 (settled at tick 9); 7 + 9 = 16 (settled at tick 15); 15 + 15 = 30 (settled at tick 5). The slowest sum settled at tick 16: the carry has to travel from the lowest bit to the highest, one cell per tick.
What it shows

Composition is enough. Nothing was added between entry 16 and this one except more cells obeying the same rule. Since every Boolean function can be built from this one gate, any finite calculation can in principle be laid out as a program of cells; what it costs is cells and ticks, and 38 billion cells is a large budget of the first.

Keys
the apparatus and the commandVentusltd/faraday, apparatus/cells.mjs and apparatus/cells.test.mjs; run: node apparatus/cells.test.mjs; the numbers are in apparatus/cells.result.json
18 · The answer is never there before the pulse could have reached it

2026-09-19 · tests L11 · CONFIRMED

The question

Does a change travel through the cells at a finite speed, as the pulse on the screen does?

Apparatus

The half adder of entry 16. The carry cell is two gate cells away from the inputs.

What was done

Switched both inputs on at tick 10 and read the carry cell at every tick from 8 to 16.

What was observed
Carry first lit at tick 12: two ticks after the inputs, one tick per cell, never sooner.
What it shows

Propagation delay is a property of the rule, not an effect added for show. What a cell shows at a tick is the past of the cells it answers to. This is L11 for the cells, and it is what gives the pulse a front.

Keys
the apparatus and the commandVentusltd/faraday, apparatus/cells.mjs and apparatus/cells.test.mjs; run: node apparatus/cells.test.mjs; the numbers are in apparatus/cells.result.json
19 · Two dots remember, with nothing stored in either

2026-09-19 · tests L26 · CONFIRMED

The question

A working view earlier the same evening was: the day a latch is wanted, one bit must be kept per dot, and 'nothing stored per dot' must be dropped. Is that so?

Apparatus

Two gate cells, each answering to the other, and two input cells (set and reset, where OFF means 'do it'). Same two rules as entry 16. Still nothing stored per cell.

What was done

Held reset for ticks 0 to 5. Gave a three tick set pulse at ticks 10 to 13. Left both inputs idle and read the output cell 26 ticks later. Gave a reset pulse at ticks 40 to 43 and read again. Separately: never reset it, and read it for eight ticks. Separately: counted how many questions the backwards working asks for tick 12 and for tick 24 with the cache off.

What was observed
After reset: 0. During set: 1. Twenty six ticks after the set pulse ended: 1. After the second reset: 0. Never reset: 10101010, lit and dark in turn for ever. Questions asked: 25 for tick 12, 49 for tick 24.
What it shows

The earlier view was wrong and is corrected here. The latch remembers, and neither cell stores anything: the memory is in the HISTORY OF THE INPUTS, which is part of the program, and the state at any tick is recomputed from it. What remembering costs is time, not storage: the work grows with the tick asked for. A real page would keep a frame to save that time; that is a cache and can be thrown away and rebuilt, which a stored bit cannot. Also recorded because it is true: a latch that is never reset does not settle, it flickers. A memory must be started in a known state, in cells as in silicon.

Keys
the apparatus and the commandVentusltd/faraday, apparatus/cells.mjs and apparatus/cells.test.mjs; run: node apparatus/cells.test.mjs; the numbers are in apparatus/cells.result.json
the earlier view, now correctedworking notes of 19 Sept 2026, about 22:50 London: 'remembers only when a latch passes, and that day nothing stored per dot must be dropped'
20 · The published path answers; spare capacity remains unknown

2026-09-22 · tests Published-edge and declared-input invariants, tested here; no new physical law claimed · CONFIRMED

The question

Can I start from a place, find nearby mapped substations, follow only published voltage-consistent connections, and test entered demand against a real published rating without turning that rating into spare capacity?

Apparatus

The offline grid finder in apparatus/grid_finder.py; source-hashed public data from Ventusltd/data-grid-gb at commit 5181de3423e4fe50c77c568b9f3066c61a1d9e41. The graph contains 886 candidate sites, 489 mapped locations, 2679 nodes, 1392 existing circuits and 1472 transformers. Geometry originates with OpenStreetMap contributors; network records are NESO ETYS 2025.

What was done

I queried latitude 53.3, longitude -0.8 at 132 kV. I compared every declared site-and-voltage starting condition with an independent reverse traversal from all validated 400 kV nodes. I checked 29 distance fixtures produced by the existing GridAtlas geodesy. I then entered 100 MW and 300 MW, each at power factor 0.95, against the published West Burton transformer found by the query. I also planted an illegal circuit voltage change, an unknown-voltage edge and a missing internal site connection.

What was observed
All 9 tests passed. The independent graph audit agreed on 1645 site-and-voltage queries; 974 found a published path within 12 edges. The nearest mapped 132 kV candidate was West Burton, 6.62001574277686 km away. The one-edge path WBUR11 to WBUR41 uses published transformer row 1262, rated 274 MVA. The entered demands correspond to 105.26315789473685 MVA and 315.7894736842105 MVA: the first is below that nameplate and the second exceeds it. Available headroom remains null in both results. All three planted unsupported connections were refused. The maximum distance discrepancy over 29 source fixtures was 1.1368683772161603e-13 km.
What it shows

The apparatus computes geographic ordering, published connectivity and entered-demand comparisons on real source records. Nearness is not connectivity, a site name is not an internal bus tie, and a published nameplate is not available connection capacity. I do not infer existing loading, power sharing, queue position or an offer. Missing coordinates remain missing and unknown node voltages are not decoded from names.

Keys
the apparatusInstructions and source attribution; Python engine
the repeatable experimentpython apparatus/test_grid_finder.py; measured results
the public source revisionVentusltd/data-grid-gb, 5181de3423e4fe50c77c568b9f3066c61a1d9e41; source file hashes travel in apparatus/grid-finder-data.json