Fable Review

This commit is contained in:
2026-07-04 09:47:50 -04:00
parent e7fb2e9a68
commit 4314087557
15 changed files with 1302 additions and 3 deletions

View File

@@ -0,0 +1,154 @@
# Intent vs. execution
The project states its intent unusually well, in four layers:
- **originalprompt.md** (May 19): "One goal is large format print. Vector
graphics are ideal. …seed/hash concept for reproducibility. This is an art
project."
- **DESIGN.md**: one renderer-agnostic scene model, many renderers; "get the β
statistics right and the image reads as authentic."
- **PRINT.md**: a ~2.5 × 4 m wall piece, assembled from registered SVG geometry
+ raster texture layers.
- **roadmap.md**: the feelings — awe, stillness, melancholy, scale-vertigo, the
numinous — and a guiding test: *"does it deepen the sense that we are looking
at a real trace of something unseen — and does it reward standing closer?"*
Below, each declared intent against what the repo actually shows.
---
## 1. "Large-format print" — the founding goal is the least-executed one
The print pipeline is real and good: `tools/render.sh`, a hand-rolled CMYK PDF
writer with OCG layers (`src/render/pdf.js`, 295 lines, genuinely impressive),
Inkscape-convention layered SVG, resolution math in PRINT.md.
The execution record: `output/masters/` holds 7 masters across 5 seeds, **all
dated May 2021** — the first 48 hours. No master exists from any of the eight
creative phases since. No `_9000.png` photographic master is on disk. The tiled
renderer PRINT.md names as the escape hatch for the 4 m dimension
(`tools/render-tiled.mjs` — "ask and I'll build it") was never built. The dev
entry `index.html` still says "Print target: 24″ × 24″", contradicting the
2.5 × 4 m ambition in PRINT.md — neither has been updated because neither has
been tested against a physical object.
Every phase since May 21 stopped at 13001600 px exploration renders. The
roadmap's guiding test — "does it reward standing closer?" — is a question about
a physical print viewed by a body, and it has never once been asked of a
physical print. **The project optimizes a feeling it has not yet measured.**
## 2. "One scene model, many renderers" — the seam holds; the look leaks
DESIGN.md's architectural claim is verifiably true in the strict sense: all 11
files in `src/scene/` are pure data, zero canvas/DOM references. Bubble
positions come from one shared salted stream and land identically in raster,
SVG, and PDF. The discipline held for six weeks of feature growth. That is rare
and worth saying plainly.
But the *look* was never given the same seam. Style decisions live triplicated
as freehand copies inside the three renderers, and they have already drifted:
- Bubble radius: `rr*foot(soft)` in canvas, `b.r*scale*1.15` in SVG,
`b.r*scale` (no 1.15) in PDF — three renderers, three bubble sizes.
- Fiducial arm length: 6u canvas, 9u SVG, 8u PDF.
- ~150200 lines of formulas (under-stroke width, bubble alpha, disk-stroke
alpha, iridescent spectrum mix) exist in verbatim triplicate.
- PDF quietly lags: no vignette, no media layer (grease pencil / réseau / film
furniture), no shock stains, no fingerprints. Fingerprints are canvas-only.
Whole parameters (`boundaryY/R`, `diskPressure`, `emit`, `transparentPaper`)
exist only in the SVG renderer.
`bubbleStops()` in palette.js — one edge profile consumed by both the canvas
sprite gradient and the SVG radial gradient — is the model the rest of the look
logic should have followed. The architecture document describes the seam that
exists; it does not mention the seam that's missing.
## 3. "Determinism is a feature. The seed as a true name" — true at the altar, loose in the pews
The salt discipline (`makeRng(seed, 'subsystem')`) is followed at feature
granularity: changing cosmic count cannot move the shock disk; `eventX/eventY`
overrides still burn their rng draws so downstream is stable. Someone thought
about this carefully.
But within modules the promise breaks: dialing `shockStriations` reshuffles the
rim segments, rings, stains, *and* core cracks; the `artifacts` slider re-rolls
every scratch and dust speck instead of fading them; the density slider —
nominally a render-mode param — reshuffles every bubble position on every
track. And the theology weakens with distance from the original generator:
PRINT.md admits manual slider tweaks are *not* part of the seed fingerprint;
`src/qft/params.js` claims "seed → complete fingerprint" while the camera,
ripples, vortices, and wavepackets have **no seeded path at all** — a bare QFT
seed always yields the default isometric lattice. The true name names less and
less of the plate the further you get from `src/scene/`.
## 4. The confirmed bug that is secretly the thesis
`renderQFTSVG` silently drops ripple grids. The scene builder creates
`id:'ripple'` grids; the renderer emits only `cubic`, `schlegel`, and `e8`
layers (`src/qft/renderer.js:178-181`). Verified at runtime: a scene declaring
ripples renders an SVG with no ripple geometry. This has been true since the
single "Added QFT" commit.
Consequence: sketch08's entire premise ("RIPPLES — concentric expanding
wavefronts"), sketch09's `03_vortex-with-spinning-ripples`,
`15_perturbation-cascade`, `17_spectral-vortex-storm` — **106 hand-authored
variation configs, and every one that invoked ripples shipped a plate whose
label describes a feature absent from the image.** Two subsequent sketch series
were art-directed on top of it. Nobody noticed, because the plates were judged
by eye against feelings, not against their own scene models.
Note what happened here: a project whose subject is *evidence of the invisible*,
which forges archival captions ("PLATE 095 · EXPOSED 1972"), produced a
catalogue of plates whose captions confidently describe invisible content. The
fiction became true by accident. There are two valid responses — fix it, or
recognize it (see [04-ideas.md](04-ideas.md) §3, the neutrino argument) — but
the current state, where the archive lies and the author doesn't know, is the
only wrong one.
## 5. "The series is an argument" — the argument exists; it's the repo itself
Roadmap principle 5 wants Becher-typology grids, a fabricated catalogue, an
archive. Phase 4 is marked "in progress" and the media layer (grease pencil,
sprockets, réseau) shipped beautifully — the BEBC-1973 output plate genuinely
reads as a worn archival photograph; I looked.
Meanwhile, without noticing, the project *built an actual archive*: 19 output
directories, 675 tracked files, ten gallery `index.html`s, sketch series 0109,
templates 14, a wall-mock (`tools/archive-wall.html`) frozen at the May 29
curation. It has the true properties of real archives: numbered series with
missing entries (perspective1/2 scripts deleted, their outputs orphaned),
instruments that no longer match their plates (`compositions/hero.mjs` uses
radial-grid keys the code no longer reads), mislabeled holdings (§4), and an
expedition that never reported back (the `milkweed-wind-field` branch). The
fabricated-archive artwork the roadmap plans is a *simulation* of what the repo
has *actually become*. That inversion is the most interesting unexploited
material in the project.
## 6. Physics honesty — the one place intent and execution fully agree
The code is candid about its fakery in a way most generative-art code isn't:
δ-rays are analytic log spirals because integrating to sub-percent radii "is
unreliable" (the header says so); the shock disk announces "Not physics — a
chamber/window pressure artifact"; every particle in this universe has mass 1;
V-decays conserve neither momentum nor anything else. The load-bearing claim —
get the 1/β² bubble statistics right and the eye accepts everything — is
correct, and the outputs prove it. One comment lies (`delta.js:53` claims the
angular step gets finer toward the center; the formula coarsens it), which is
the kind of thing that only matters because the rest of the codebase has earned
the habit of being believed.
## 7. The drift nobody wrote down
The documents describe a project: *one generator, deepened along a staged plan.*
The git history records a different project: *a widening fleet of instruments*
bubble chamber → QFT lattices → carpet/perspective primitives → composition
schema → art-historical templates → element liberation → watercolor → milkweed —
where each phase spawns a fork-and-mutate tool family and a fresh output
directory, and commits are creative sessions ("vast ocean", "Element
Liberation"), not code changes. Neither mode is wrong. But the roadmap still
narrates mode one while the hands do mode two, which is why Phase 3 (the
translucent stacked print — the *stated* strongest fusion) has had no work at
all while two unplanned renderers and two unplanned subject-matters shipped.
The truest sentence in the repo is in the memory index, not the roadmap:
"typology MATRIX of standalone singles." The roadmap should be made to say what
the project has decided by doing.

92
fable/02-current-state.md Normal file
View File

@@ -0,0 +1,92 @@
# Current state — factual snapshot (2026-07-04)
## Codebase
| Area | Size | State |
|---|---|---|
| Core (`src/rng` + `scene/` + `render/` + `ui/` + `main` + build) | ~3,220 lines | Committed, disciplined, small |
| QFT (`src/qft/`) | 9 files, ~1,250 lines | Committed (one commit, May 29) |
| Compose (`src/compose/`) | 4 files, ~680 lines | Committed |
| Watercolor (`src/render/watercolor.js`) | 427 lines | **Uncommitted** (Jun 2425) |
| Milkweed-botanical (`src/milkweed/umbel.js`) | 169 lines | **Uncommitted** (Jun 25) |
| Milkweed-windfield (`src/field/wind.js`, `src/scene/umbel.js`, `src/scene/drift.js`, GROUP_BUILDERS registry) | ~225 lines + compose rework | **Committed on unmerged branch** `milkweed-wind-field` (63066ee, Jun 17, also pushed) |
| Tools | 37 files, ~4,750 lines | Committed except 3 newest |
Git: 12 commits on `main`, May 20 → Jun 10. Last commit **24 days ago**. The
uncommitted watercolor + milkweed work is a 2-day session (Jun 2425) followed
by 9 days of silence. An entire fourth renderer exists only in the working tree.
## The two milkweeds (important — memory/docs conflate them)
1. **Branch** `milkweed-wind-field`: the "hidden realities" system — one
divergence-free wind field (closed-form time integral, elegantly done), three
detectors (dunes/water/seeds), umbel-as-vertex, drift-as-advection, plus the
GROUP_BUILDERS registry refactor of the composition engine. Committed Jun 17,
never merged.
2. **Working tree on main** (`src/milkweed/umbel.js`): a *different* milkweed —
a botanical Asclepias still-life scene built for the watercolor renderer.
Does not import the wind field.
Both export `generateUmbel` with **incompatible signatures**. Merging the branch
as-is collides. This is an unmade decision materialized as two files.
## Renderers
4 renderers for bubble-chamber scenes (photo raster / SVG / PDF / watercolor);
QFT has only its own SVG renderer — no photographic or watercolor QFT exists.
Feature parity: PDF lags (no media layer, vignette, stains, fingerprints); SVG
has private params (`boundary*`, `diskPressure`, `emit`, `transparentPaper`);
~150200 lines of look logic triplicated and drifting (three bubble sizes).
Watercolor integrates through the proper seam (same signature, shared
`sampleBubbles`/`depthFactors`, palette registry extended not bypassed), with
known rough edges: dead `preview` flag, scratch-canvas cache keyed by width
only, heavy per-pigment blur cost at print resolution, no UI entry point yet —
reachable only via `tools/preview.html?renderer=watercolor`.
## Parameter surface
≈68 total: 53 in the UI (43 sliders / 2 selects / 8 toggles) + ~15 hidden or
SVG-only. Flat namespace is starting to encode per-palette sub-schemas by label
convention ("(magentarise)" ×3). Every new param is a 34 place edit.
## Tools & outputs
- 8 durable pipeline tools; ~25 one-off sketch scripts (fork-and-mutate: the
same `merge()` helper verbatim in 5 files, `F()` color helper redefined in 12
of 17 QFT tools, the contact-sheet HTML inlined 17 times). Zero shared
tool-level utility module.
- `output/`: 2.4 GB, 19 directories, 675 tracked files. Chronology: inspiration
→ masters (May 2021) → 5 iteration series → QFT sketches 0109 → qft-bc →
layering (642 MB, the largest) → liberation → templates 14 → watercolor +
milkweed (untracked).
- `output/masters/`: 7 masters, 5 seeds, all from May 2021. Nothing since.
## Stale / dead weight
- `bubble_chamber.html` — the headline "portable single file" deliverable —
built May 31, now 3.5 weeks behind `src/` (missing the milkweed palette, the
Jun 17 svgVector changes, watercolor). Nothing detects staleness; the built
file stamps *that* it was built, not from what.
- `bubble_chamber.v2.html` — superseded snapshot, dead.
- `tools/archive-wall.html` — hardcodes the May 29 curation; predates
templates/liberation/watercolor.
- `compositions/hero.mjs` — the only file in `compositions/`; uses radial-grid
keys (`vp`, `rays`, `depthLines`) that `gridSheets` now silently ignores.
- `tools/inkwash-export.mjs` — self-declared superseded by the native
watercolor renderer ("kept as a record").
- `composer.html` — works, but one phase behind (untouched during watercolor).
- `package.json` — 3 npm scripts, all from May 20; none of the ~25 later tools
registered.
- `tools/render-qft-svg.mjs` references a `render-milkweed-svg.mjs` that
doesn't exist.
## Known bugs
1. **Ripple grids silently dropped** by `renderQFTSVG` (`src/qft/renderer.js:178-181`)
— every "ripple" variation across sketches 0809 shipped without its subject.
2. `drawDamage`/`drawInstrument` last param named `inv` but called with `light`
(`src/render/canvasPhoto.js:110,208`) — works today, trap for the next edit.
3. `perspectiveGridSVG` creates an rng it never uses — the compose layer's
'pA'/'pB' salts do nothing for radial grids.
4. Dead pre-palette-era fields in `canvasPhoto.js` `palette()`; `delta.js:53`
comment inverts what the formula does; `watercolor.js:374` `0.05 * 8`.

113
fable/03-feedback.md Normal file
View File

@@ -0,0 +1,113 @@
# Feedback
Ordered by how much I think each item matters. Praise is included only where
it's load-bearing for a recommendation.
## 1. You are avoiding the print, and the repo shows it
Eight creative phases in six weeks, and the master pipeline — the thing the
project exists for — was last fed on day two. This has the signature of a
familiar creative pattern: exploring is reversible and always rewarding;
printing is a commitment that risks discovering the piece doesn't work at
scale. So the exploration space keeps widening (new generator, new renderer,
new subject) because widening is the move that never has to survive contact
with a wall.
The honest counter-argument is that the vocabulary wasn't ready. It's ready.
The BEBC plates read as archival photographs; the watercolor stillwater study
holds up; PRINT.md already contains the assembly recipe. Every week of further
exploration is now producing information about the *screen* version of a *wall*
piece. One A1/A2 test print of one strong seed would generate more course
correction than any three future sketch series — it will tell you whether the
grain scales, whether the δ-ray curls reward approach, whether "standing
closer" works, and it will almost certainly reorder the roadmap.
## 2. Decisions are being deferred into the working tree
Three currently open:
- The wind-field milkweed (branch, Jun 17) vs. the botanical milkweed (working
tree, Jun 25) — two incompatible `generateUmbel`s. Which milkweed is *the*
milkweed, or are they two subjects (a field study and a specimen plate)?
Either answer is fine; not answering is what costs.
- The watercolor renderer: 427 good lines, uncommitted for 10 days. Ten more
days of this and merging the branch becomes an archaeology project.
- The GROUP_BUILDERS registry on the branch is a strictly better composition
engine than what's on main, independent of milkweed. It could be
cherry-picked today.
A useful rule given how you work (commits = sessions): **end every session with
a commit, even a WIP one.** Your commits are already narrative; let them be
frequent-narrative.
## 3. Nothing verifies that a plate contains what its scene model says
The ripple bug survived three sketch series because the only QA is your eye,
and your eye judges *feeling*, not *inventory*. Determinism is the project's
religion, but determinism without ground truth just means you reproducibly get
the wrong image. Cheap fixes that fit the project's culture:
- A layer-census check: render a scene, assert every `id` in the scene model
produced a nonempty layer/group in the output. ~30 lines, would have caught
the ripple drop on day one.
- Golden-seed snapshots: 34 canonical seeds rendered per renderer, diffed on
commit (you already have headless Chrome plumbing in `shoot.sh`).
- Stamp the build: embed the source git hash + date in `bubble_chamber.html`
so staleness is visible instead of silent.
## 4. The look needs its own seam
The scene/renderer split is genuinely well-kept — which makes it strange that
the *style* never got the same treatment. Three renderers currently disagree
about bubble size, and each new visual feature is hand-ported (or, for PDF,
quietly not). `bubbleStops()` already demonstrates the fix: one shared module
of style formulas (stroke widths, alphas, radii, spectrum mixes) consumed by
all renderers. This is a half-day of consolidation that removes the largest
source of drift in the codebase. Do it before renderer #5, because there will
be a renderer #5.
## 5. Sketch tools: keep the data, share the harness
The 17 QFT scripts are a legitimate serial sketchbook — the variation configs
*are* the artwork's process record, and hardcoded OUT dirs are honest about
their one-shot nature. But the 12-line render loop, `F()`, `paper()`, and the
gallery HTML are copy-pasted across all of them, with signature drift. One
40-line `renderSketch(outDir, baseSeed, variations)` harness turns every future
sketch into a pure data file. Same for the deep-`merge()` in 5 compose tools.
Don't retrofit the old ones; they're finished documents. Change the template
for the next one.
## 6. Small structural debts worth an hour each
- `carpet.js`/`perspgrid.js` are compose-system primitives parked in
`src/qft/` — they share nothing with the QFT pipeline.
- `src/compose/composition.js` imports parameter defaults from
`src/ui/controls.js` — the headless engine depends on the UI layer. Move
defaults down; let the UI consume them.
- The `MILK` pigment table just colonized core `palette.js` from the milkweed
satellite. One entry is fine; it's the precedent to watch — palettes should
be injectable from the satellite that owns them.
- Delete or archive: `bubble_chamber.v2.html`, `tools/inkwash-export.mjs` (it
says goodbye in its own header), `tools/find-semicircle.mjs`. Fix or delete
`compositions/hero.mjs` (currently half-ignored by the code) and
`tools/archive-wall.html` (frozen curation), or explicitly rename them as
dated snapshots.
- `params.js` QFT: either seed the camera/perturbation params or drop the
"seed → complete fingerprint" claim from the header. The claim is currently
the documentation equivalent of the ripple bug.
## 7. What's working — keep doing these on purpose
- **Literate headers.** Nearly every file explains *why the fake was chosen
over the real*. This is the best code-as-notebook practice I've seen in a
personal art repo, and it's why the intent/execution comparison in this
review was even possible.
- **The β thesis.** "Get the statistics right and the eye believes" was the
founding bet and it paid; the outputs are convincing at thumbnail and at
1500 px. Protect that thesis as you add renderers — watercolor already
correctly routes 1/β² into stroke weight.
- **Deterministic fiction.** Plate numbers and exposure dates derived from the
seed hash — the forgery itself is reproducible. This idea is bigger than its
current use (see ideas §2).
- **Commits as sessions** produce a legible creative history. The fix from §2
isn't to change the style, just the frequency.

119
fable/04-ideas.md Normal file
View File

@@ -0,0 +1,119 @@
# Ideas to explore
Ordered roughly by information-per-effort. §1 is the forcing function; the rest
are perpendicular moves the roadmap doesn't already contain (I've skipped
things roadmap.md lists — stereo pairs, sonification, animation — except where
there's a twist).
## 1. The calibration print — and make the calibration itself the artwork
Not "eventually print the piece": print a *test instrument*. One strong seed
(LAMBDA-2648 already has three disk-variant masters) rendered as an A1 sheet
that deliberately contains its own diagnostics — a strip of the plate at 1:1
wall scale, a δ-ray magnified 10×, grain swatches at three DPIs, the archival
header, a ruler. Real labs print calibration targets; yours would be a
fictional lab's calibration target, which means it's simultaneously the
cheapest possible print test *and* a legitimate piece in the archive fiction.
You cannot art-direct "does it reward standing closer" from a screen, and this
turns the scary commitment into a small in-universe document.
## 2. Generate the catalogue raisonné from the repo itself
The project plans a *fabricated* archive (Phase 4) while sitting on a *real*
one: 675 outputs, 19 directories, sketch series with gaps, orphaned plates
whose generating instruments were deleted, a wall-mock frozen at an old
curation. Perpendicular move: a tool that walks `output/` + `git log` and
typesets the actual history as an archival catalogue — every plate with its
seed, commit hash as accession number, session name ("vast ocean") as
expedition title, *including* the losses ("plates 0714: instrument lost,
holdings retained"). The deterministic-fiction machinery (seed → plate number →
exposure date) already exists; point it at the truth. This is the Becher-grid
"series is an argument" piece, except the argument is real, and it costs a
script rather than a new subsystem.
## 3. The neutrino plate — the bug is pointing at something
Before fixing the ripple bug, notice what it made: plates whose captions
describe content that isn't visible. That is *literally the most famous bubble
chamber result*. Gargamelle's 1973 neutral-current discovery — the actual lab
your plates cite — was an image where the evidence was an *absence*: a neutrino
enters, nothing appears, an electron suddenly moves. A deliberate series of
"invisible content" plates — captions and grease-pencil annotations
confidently marking events the plate doesn't show, a measured arrow pointing
at blank emulsion, `EVENT: ν̄ CANDIDATE` over undisturbed paper — is the
purest possible execution of the roadmap's founding line: *evidence of the
invisible*. The most devotional plate in the archive should be the one where
faith is required. (Then fix the renderer, and let the ripples exist on
purpose.)
## 4. Fill the matrix — subjects × mediums is the actual typology
Your own memory note already names the thesis: "typology MATRIX of standalone
singles." Make the matrix literal. You have subjects {bubble chamber, QFT
lattice, milkweed/wind} and mediums {photographic, clean vector, CMYK plate,
watercolor} — and only ~half the cells exist. No photographic QFT (a *lattice*
shot on worn film, with grain and grease pencil, would be extraordinary and is
mostly plumbing — QFT only ever got an SVG renderer). No watercolor QFT. No
photographic milkweed (a botanical subject shot as if it were a physics event —
herbarium-as-detector). The empty cells are cheaper than any new subject
because both axes already exist; and a wall hung *as the matrix* — same seed
down each column — is the standalone-singles argument stated in one object.
## 5. One hidden field, many instruments — say the quiet thesis out loud
The wind-field branch stumbled onto the project's real unifying idea: **one
invisible cause, several detectors that each transduce it differently** (dunes
remember, water reports instantaneously, seeds integrate along their path).
Notice the bubble chamber is already this — the B-field and beam are the
hidden cause; chamber, film, and scanner are the detector chain. The QFT plates
are this — the vacuum as field, lattices as instruments. Reframed, the project
isn't "a bubble chamber generator plus spinoffs"; it's *portraits of invisible
fields, each painted by the instruments that can feel them*. Concretely: merge
the branch's field/detector separation into the architecture (`src/field/` as
a first-class layer any subject can sample), and let one seed drive the same
hidden field through a chamber plate, a dune plate, and a water plate — a
triptych where the viewer slowly realizes all three images are the *same
event*. That's the scale-vertigo feeling the roadmap chases, produced
structurally instead of stylistically.
## 6. The failure plates
Real bubble chamber archives are mostly failures: empty triggers, double
exposures, boiling chamber, light leaks, frames where the beam didn't arrive.
Your generator only makes successes. A `misfire` archetype — blank plates with
full film furniture, an over-exposed white-out with one surviving corner, a
splice through the event — does three things: deepens the archive fiction
(archives without failures read as fake), gives the typology grids their
necessary rest-notes (24 perfect plates read as wallpaper; 21 + 3 failures read
as history), and it's nearly free — the media/damage layers already exist and
just need permission to win.
## 7. Verification as darkroom craft, not engineering chore
Framing matters in a solo art repo: don't build "CI", build *the darkroom
contact sheet*. One command that renders the golden seeds through all four
renderers onto a single dated sheet, with the layer census (§feedback 3)
printed in the margin like exposure notes. Run it when you commit. It catches
the next ripple bug, documents renderer drift as a visible artifact, and the
sheets themselves accumulate into a record of the project's eye changing over
time — which, given idea §2, eventually becomes material.
## 8. The seed as edition certificate
"The seed as a true name" is currently a private convenience. Push it to the
viewer-facing surface: the frame label carries the seed, the git hash of the
renderer, and the sentence "this image can be re-derived, at any size,
forever." An edition where what's sold/kept is effectively *the name plus the
instrument version* is both honest about how the work is made and — because
PRINT.md's fingerprint claim currently has holes (manual tweaks, unseeded QFT
params) — it forces the discipline to become real: if the seed is the
certificate, everything must actually live in the seed. Theology becomes
engineering requirement.
---
**One anti-idea, for balance:** no fifth subject and no fifth renderer until
something hangs on a wall. The pattern analysis in 01/03 says the next new
instrument is the most likely next move and the least informative one
available. The wind field (§5) is exempt because it consolidates instruments;
everything else can wait a print.

30
fable/README.md Normal file
View File

@@ -0,0 +1,30 @@
# fable/ — an outside reading of the bubble chamber project
Written 2026-07-04 by Claude (Fable 5), after a full review: every doc, the core
`src/` tree, the QFT and compose subsystems, the milkweed/watercolor working set,
all 37 tools, the 2.4 GB output archive, the git history on `main`, and the
unmerged `milkweed-wind-field` branch. Outputs were viewed, not just listed.
Four documents:
1. **[01-intent-vs-execution.md](01-intent-vs-execution.md)** — what the project
says it is vs. what the repo shows it does. The interesting gaps, including
one confirmed rendering bug that is also, accidentally, the most on-theme
thing in the archive.
2. **[02-current-state.md](02-current-state.md)** — a factual snapshot: what
exists, what's committed, what's stale, what's stranded on a branch.
3. **[03-feedback.md](03-feedback.md)** — critique. The habits that are working,
the ones that are quietly costing you, and the decisions currently deferred
into the working tree.
4. **[04-ideas.md](04-ideas.md)** — directions to explore, weighted toward the
perpendicular ones the roadmap doesn't already contain.
The one-paragraph version: **the images earn their ambition; the stated purpose
of the project is the only part of it that has never been exercised.** This is a
large-format print project with no evidence of a print — the master pipeline was
built in the first 48 hours and never fed again, while eight subsequent creative
phases produced 2.2 GB of screen-resolution sketches. The instinct that keeps
generating new instruments (QFT, compositions, milkweed, watercolor) is the
project's engine and its avoidance mechanism at the same time. The single
highest-information act available right now costs less than any feature on the
roadmap: pick one seed and send it to a printer.