Fable Review
This commit is contained in:
154
fable/01-intent-vs-execution.md
Normal file
154
fable/01-intent-vs-execution.md
Normal 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 20–21** — 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 1300–1600 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.
|
||||
- ~150–200 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 01–09,
|
||||
templates 1–4, 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
92
fable/02-current-state.md
Normal 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 24–25) |
|
||||
| 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 24–25) 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`);
|
||||
~150–200 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 3–4 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 20–21) → 5 iteration series → QFT sketches 01–09 → qft-bc →
|
||||
layering (642 MB, the largest) → liberation → templates 1–4 → watercolor +
|
||||
milkweed (untracked).
|
||||
- `output/masters/`: 7 masters, 5 seeds, all from May 20–21. 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 08–09 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
113
fable/03-feedback.md
Normal 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: 3–4 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
119
fable/04-ideas.md
Normal 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 07–14: 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
30
fable/README.md
Normal 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.
|
||||
Reference in New Issue
Block a user