They are captured stdout from the field-upload pushes - the LFS progress line, the locksverify hint, the ref update - written next to the data by each upload run and committed with it. 23 KB across 23 files at the root of a 114 GB data repository. Debris, not records: nothing in this repo or the brain reads them, they describe a transfer the refs already prove, and the real delivery ledger is delivered.txt plus index.json. Confirmed by grep - zero references anywhere in the tree. Added a .gitignore (the repo had none) with a deliberately broad .push-*.log rather than the known 1-23, because the producer numbers them sequentially and pinning the range would let .push-24.log straight back in. Done from a sparse blobless clone with GIT_LFS_SKIP_SMUDGE=1, so no LFS object was fetched or rewritten. Verified before committing: 23 deletions, 1 addition, 0 paths under fields/ or corpora/ staged. |
||
|---|---|---|
| corpora | ||
| fields | ||
| .gitattributes | ||
| .gitignore | ||
| delivered.txt | ||
| index.json | ||
| LINKS-by-cell.json | ||
| LINKS.jsonl | ||
| README.md | ||
| uploaded.jsonl | ||
| USING-THE-WAVELETS.md | ||
BrainWaves
⛔⛔ BEFORE YOU RUN ANY GIT COMMAND HERE:
git statusSHOWS TENS OF THOUSANDS OF DELETIONS AND THEY ARE NOT REALThe producer writes a field, uploads it, and deletes the local copy immediately — that is the whole point, so a field exists exactly twice in the world: once here and once on the brain box. The working tree therefore holds a few hundred files while the repository tracks 26,359, and
git statusreports the difference as ~26,000 pendingDentries.⛔
git commit -ain this directory would delete 114 GB of wavelet fields from the repository and read as a perfectly ordinary commit while doing it. Stage paths explicitly. Never-a, nevergit add -Aat the root.⚠ Nothing is lost and nothing needs restoring — every one of those files is committed and pushed.
git checkout -- fields/would pull them all back down, which is a 114 GB download and almost never what anyone wants.
Everything Unity is taught from, and every picture in it written as equations.
Field files are stored gzipped (
*.field.json.gz) as of 2026-09-03. A field is a JSON skeleton wrapping base64 payloads, and git LFS stores objects verbatim, so nothing was compressing them — measured 47-51% on real fields with byte-identical coefficients. Readers must accept both encodings: the fields delivered before that date are still plain.field.jsonand are deliberately NOT being recompressed, because rewriting them would create a second full set of LFS objects (~+57 GB) while the originals stayed referenced in history.
Two halves that only mean something together, and the tables that join them:
corpora/ THE WORDS 189 cells · 50,242,378 words
fields/ THE WAVES 32,296 CDF 9/7 fields, one per figure
LINKS.jsonl THE JOIN 38,318 citations — which words point at which wave
LINKS-by-cell.json roll-up per-cell citation and distinct-wave counts
index.json field index one row per WAVE: key, path, url, w, h, coefficients
USING-THE-WAVELETS.md how to read a wave and turn it back into pixels
uploaded.jsonl production ledger — append-only, one line per field as it was
made. The record of what exists; also what a resumed
ingest reads so it never rebuilds a field twice.
.gitattributes LFS rules — *.field.json and the vector file are LFS objects,
which is why they must be fetched from /media/ and not /raw/
She does not keep images. Seeing, imagining and thinking run on the same
equational substrate, so a picture only becomes something she can hold once it is
a field. fields/ is that conversion for every illustration the corpus contains.
The join — how a wave knows which words it belongs to
This is the part that makes the repository worth more than its two halves, and it is deliberately bidirectional.
Wave → words. Every field file carries the binding inside it: phrase is the
corpus prose that references that figure, and links[] holds every citation
of it — subject, grade, theme, alt, caption, context, licence. Hand someone a
single field with no other file and they can still tell you what it is a picture
of and which lesson it belongs to.
Words → wave. LINKS.jsonl — one row per citation, not per figure:
{ "subject": "ap", "grade": "grade11", "theme": "biology",
"source": "en.wikipedia.org", "licence": "CC-BY-SA-3.0",
"alt": null,
"caption": "Punnett square depicting a cross between two pea plants…",
"context": "punnett square depicting a cross between two pea plants…",
"key": "10n9686",
"field": "fields/10/10n9686.field.json",
"url": "https://upload.wikimedia.org/…/Punnett_square_mendel_flowers.svg" }
38,318 citations → 32,296 distinct waves (3,010 figures cited more than once)
189 cells covered 33,839 citations carry referencing text (88%)
⛔ A row is a CITATION, not a figure, and that is not an accident. A plate cited by two cells is one wave with two sets of referencing words. The first version of this ingest deduplicated by url and kept only the first citation, silently discarding 6,024 links — which is precisely the text↔wave synchronisation the whole exercise exists to produce. One wave, every citation.
LINKS-by-cell.json is the roll-up: for each (subject, grade), how many
citations it makes and how many distinct waves that is. The two differ wherever a
cell cites the same plate twice.
⭐ Both tables are generated from the corpus alone and need no field to exist, so they are complete and correct independently of the field set.
The words
corpora/academic/<subject>/<grade>.json 189 cells, ~50.2M words
corpora/life/ the lived-year canon
corpora/coding/ code-concept corpus + exemplars
corpora/phonics/gpc.json 241 grapheme→phoneme rules, derived
corpora/aoa.tsv age-of-acquisition ordering
corpora/glove.6B.300d.txt third-party word vectors (see licence)
One file per (subject, grade) cell. Each holds experiences[], and each
experience is { theme, story, source, licence, figures[] } — a real course's
prose, with its illustrations attached to the entry whose text they belong to.
189 cells 50,242,378 words 38,318 figure citations
33,839 anchored to referencing text (88%)
A figure is never stored apart from the words that point at it. Every
figures[] entry carries its own alt, caption and context — the corpus
prose that references it. That is the whole design: an illustration bound to
nothing teaches nothing.
The pictures
fields/<2-char shard>/<key>.field.json 32,296 fields
index.json every field: key, path, url, w, h, coefficients, citations
One field per distinct figure, sharded two characters deep off the key so no single directory holds more than a few hundred files.
index.json is the field-side index — enumerate it if you would rather not
derive keys. LINKS.jsonl is the text-side index. They are the same set seen
from opposite ends: index.json has one row per wave, LINKS.jsonl one row
per citation.
⛔ Fetch from /media/, not /raw/. The fields are Git LFS objects;
/raw/ returns the LFS pointer stub, /media/ returns the field.
https://git.unityailab.com/UnityAILab/BrainWaves/media/branch/main/fields/11/11xggvp.field.json
No list of URLs exists, on purpose. A field's name is djb2 of the figure's
own source url, and those urls are already in the corpus. The brain hashes the
figure it is about to teach and fetches that path — nothing enumerated, and
unlike a positional index a re-ingest cannot silently re-point a field at
different content.
Why the fields live here and not on the brain's own disk
The brain server and Forgejo share one machine. Keeping the fields in the brain
repo would put a second copy on the same drive, and a git repository needs its
working tree plus .git — roughly double again. So the fields live here once,
and the brain pulls a single field when it teaches the figure that field belongs
to. Nothing is cloned wholesale.
How the fields were made
.claude/scripts/perceive-corpus-figures.mjs in the brain repo, using the same
two stages the live perception path uses, called directly: the production image
decoder (jpeg, png, and an in-repo VP8/webp decoder written for this), then
equationalizeImageData — the exact CDF 9/7 forward transform perceive() runs.
At full source resolution, with no downsample before the transform. A field renders at any size, but the analysis is discrete: shrink the image first and the fine subbands carrying a one-pixel axis label are never created. Render-at-any-size and capture-all-detail are different properties.
Two exclusions, both structural and both reported rather than silent:
- Site furniture — images cited by five or more distinct themes. A real
illustration belongs to one discussion; furniture repeats.
Question_book-new.svgwas cited by 248 themes across 18 subjects, so perceiving it once would bind a "citation needed" icon to 248 unrelated concepts. Repetition is the signal, not a list of names, so an icon nobody has seen before is caught on its behaviour. - Unanchored figures — no caption, no in-text reference, no substantive alt.
SVG is rendered, not skipped. 1,752 figures are vector — the schematics, the biology diagrams, the charts. A vector has no pixels until something chooses a size, so the width is a choice by necessity; the MediaWiki API is asked for a permitted rendition rather than a URL being constructed, because Wikimedia now rejects unlisted thumbnail widths.
Regenerating
Derived data, reproducible from corpora/ at any time. If the fidelity constants
change this repository is reset, not appended to — git keeps every version
forever, and a second copy of 200 GB of history on a shared machine is not a
mistake that deleting files undoes.
Licences — read this before redistributing anything here
This repository is a mixed-licence aggregate, and the terms travel with the material rather than being replaced by anything here.
The words. Per-experience licence fields record the terms of each source:
CC-BY, CC-BY-SA, CC-BY-NC, CC-BY-NC-ND, OGL, BSD, and public domain
(Project Gutenberg). Some sources are non-commercial and some are
no-derivatives; both are present and both are labelled.
The pictures. Each field's links[] entries record the licence of the work
the figure came from. A wavelet transform does not launder provenance — an ND
figure's field is still governed by ND terms.
corpora/glove.6B.300d.txt is Stanford's GloVe vectors, redistributed under
their own terms. It is a third-party artifact included for reproducibility, not
part of the derived corpus.
⚠ This repository is public and requires no login to download — verified by anonymous fetch from outside the network. Anyone with the URL can retrieve any field or corpus file. That is a deliberate operator decision, recorded here so the licence position is stated rather than implied: material under NC and ND terms is publicly reachable from this repository.