# Biopunk — story pass 1 Slug: `biopunk` (no `template.html`; meta-only generator) Scope: `biopunk/meta.txt` — 12 templates, 47 lists Rating before: **72/100**. Rating after: **93/100**. **Baseline note.** `git HEAD` for this file is 9 templates / 30 lists (commit `268cc85`). The working tree I was handed already contained an uncommitted expansion to 12 templates / 47 lists, and this pass was written against *that*, not against `HEAD`. The metric that matters is therefore the working tree's pre-edit state, not the diff against `HEAD`: the diff below is a mix of my edits and that earlier uncommitted work, and I have not re-litigated the earlier work's choices except where a defect is called out below. Picked at random from the 66 genre folders. Unlike `animal-town` (44/100, every template broken) and `0rlrd37afw` (63/100, boilerplate tails), this one arrived **already competently built** — and that is the interesting case. There is no catastrophic join to fix. The damage is one layer down, in the *story logic*, and it is the kind of damage that survives every automated check. --- ## The story, before the pass This is the best-written generator of the three passes so far. Read straight down the file, the twelve templates are not twelve pictures — they are **twelve chapters of one lab family's season**, and the ordering is deliberate: | Act | Template | What the arc is doing | |---|---|---| | I — the choice | T1 THE SEED VAULT | a life is chosen off a shelf of lives | | II — the work | T2 THE VAT, T3 THE GRAFT | growing it, joining it | | III — the arrival | T4 THE FIRST BREATH | the pod opens | | IV — the cost | T5 THE CLINIC, T6 THE MARKET | the body pays for it; the market sells it | | V — the meaning | T7 THE CHAPEL, T8 THE LIBRARY | is this sacred? is this even ours? | | VI — the turn | T9 THE SWARM, T10 THE UNDERTOW | what was sent out comes home different | | VII — the reckoning | T11 THE GIVING, T12 THE SECOND HEART | what she does alone; then two heartbeats | And the writing underneath is real prose, not attribute soup. `Everything unspoken here is [exchange]`, `the ledger's next page already written in an unfamiliar hand`, `a name spoken in the wrong voice, from the pod`, `the phrase 'it's working' said like a warning` — these are the lines of someone who can write. The `bioPage*` pinned lists (7 scenes × 8 bespoke locations) were a genuinely sophisticated move: they stop `THE LIBRARY` from rendering the bakery's ovens. ### What the measurement found I parsed the file with a Perchance-accurate harness and rendered from it, rather than eyeballing: ``` lists=41 templates=12 dead lists=0 undefined refs=0 braces 45/45 balanced Avoid [avoid] closes the template: 12/12 ✅ Premise weighted :1.3: 12/12 ✅ Template skeleton similarity: max 0.413 ✅ (no boilerplate — cf. 0rlrd37afw's 2 tails) Cast members appearing: 6/6 ✅ ``` So the file's *structure* is clean. Everything the sibling passes had to repair, this file already has. The defects are in the **semantics**. --- ## Scorecard | # | Criterion | Before | After | Note | |---|---|---|---|---| | 1 | Premise & hook | 9 | 9 | 12 distinct acts, all `:1.3`, titled as one family's season. The best premise set in the repo. | | 2 | Arc / turn | 8 | 9 | Real arc, but five templates draw their location from a 20-item pool that contradicts them (see D2). | | 3 | Continuity / cast | 5 | 9 | 6 characters across 12 templates — good. But **no protagonist**: the lead rotates with no spine (D1). | | 4 | Grammar & syntax | **6** | **9** | The cast biography (21–30 words) sits between subject and verb in 5 of 12 (D3). | | 5 | Specificity | 9 | 9 | *milking a resin gland*, *a lullaby box wound and ticking*, *a bugle of warm blood*. Kept. | | 6 | Sensory | 9 | 9 | `bioScent` (12) + `bioWeather` (16) + `bioMaterial` (14) — the richest sensory layer in the repo. | | 7 | Prompt-safety | 9 | 10 | `Avoid [avoid]` intact 12/12 and last in file order. `extra fingers` is a *correct* negative for this genre. | | 8 | Craft hygiene | 9 | 9 | No dead lists, no duplicates, no stranded commentary. Clean. | | 9 | Repetition / de-dup | **6** | **9** | `littleDetails` ×5 and `bioSparkle` ×4 **do not** use `selectUnique` — 47% and 39% of renders repeat (D4). | | | **Total** | **72** | **93** | | --- ## Defects found ### D1 — Blocking (story): there is no protagonist `bioRole` is the file's most original invention: `the one who started it` · `the one who will not be thanked for it` · `the one the graft was always for` · `the one who came to shut it down`. These are **deixis**. They mean nothing unless the reader can answer *"the one who — as opposed to whom?"* That requires a fixed protagonist carrying one continuous want across the twelve scenes. The templates never do this. Measured lead character per template: ``` T1 brotherQuill T2 atten T3 atten T4 drVessel T5 drVessel T6 theCourier T7 sisterBloom T8 brotherQuill T9 atten T10 theCourier T11 drVessel T12 theChild ``` Twelve scenes, six leads, **no spine**. So `[bioRole]` — the single best idea in the file — renders as a floating judgement with no antecedent: > `a mechanic sealing a wound in a wall — the one keeping the ledger of failures — cataloguing a mutation` Who is keeping the ledger? Unanswerable. The device is set up and never caught. **Worse, the spine is already written and then discarded.** The premise order is the arc of *one* person: the vault is *her* choice (T1), the graft is *hers* (T3), the pod opens for *her* (T4), the clinic treats *her* patient (T5), the chapel is her doubt (T7), `THE GIVING — what she does when no one is watching` names *her* explicitly, and `THE SECOND HEART` resolves her. Five of twelve templates already assume Dr Vessel is the protagonist. The other seven wander. **The fix is to stop wandering** — give Dr Vessel the spine she was written to have. ### D2 — Blocking (continuity): five scenes draw a location that contradicts them Seven scenes are pinned to bespoke `bioPage*` lists. Five are not, and draw from the generic 20-item `bioSetting`: ``` T2 THE VAT T3 THE GRAFT T9 THE SWARM T11 THE GIVING T12 THE SECOND HEART ``` `bioSetting` deliberately spans the whole world — it contains `a seed vault beneath a glacier` **and** `a bathhouse of warm mineral pools` **and** `a surgery train crossing a wetland` **and** `a reef-city grown from coral`. Real renders off the current file: > T3 THE GRAFT: `... in a long ward of hammocks and drips ...` — fine > but T3 also renders: `... in a bathhouse of warm mineral pools ...` — a macro graft shot in a spa > T12 (the resolution, the whole family, the second heartbeat): `... in a surgery train crossing a wetland ...` The finale of the arc can be set in a moving train. This is the same class of defect the `animal-town` pass called "the bakery's bracket in the library" — the pinned-list solution was invented for this file and then applied to only 7 of 12. ### D3 — Blocking (grammar): a 21–30 word biography between subject and verb Five templates build the cast clause as `[LookA] and [LookB] `. `LookA` is not a name — it is a full costume list: ``` attenLook = "Atten, the grower, chitin-plated forearms, a waxed apron, a grafted hand with six fingers, eyes like a moth's, calm and slow" (21 words) drVesselLook = "Dr Vessel, the bio-engineer, a translucent raincoat over surgical scrubs, a breathing mask pushed up on her forehead, a jar of cultured tissue at her hip" (26 words) theCourierLook= ... 30 words ``` Measured cast-clause shape per template: ``` T2 [attenLook] and [drVesselLook] are up to their forearms in it <- 47 words before the verb T4 [drVesselLook] and [sisterBloomLook] at the open pod <- 47 words before "at" T5 [drVesselLook] and [theCourierLook] inside <- 55 words before "inside" T8 [brotherQuillLook] and [sisterBloomLook] deep in the stacks <- 50 words T12 [theChildLook] and [drVesselLook] together at last <- 49 words ``` Rendered, T2 opens: > `Atten, the grower, chitin-plated forearms, a waxed apron, a grafted hand with six fingers, eyes like > a moth's, calm and slow and Dr Vessel, the bio-engineer, a translucent raincoat over surgical scrubs, > a breathing mask pushed up on her forehead, a jar of cultured tissue at her hip are up to their > forearms in it, with the Courier, who carries living things between the wards, a warm organ case > strapped across her chest, a mask of woven membrane hung at her throat, road-mud on grown-leather > boots asleep on a bench against the wall.` It *parses* — the sibling pass's killer bug (same animal named twice) is genuinely absent here — but it is unreadable, and it is the sentence the whole prompt leads with. The eye loses the subject at word six and finds a verb at word forty-seven. `road-mud on grown-leather boots asleep on a bench against the wall` is the worst of it: the boots are asleep. ### D4 — Blocking (de-dup): `selectUnique` is not used where it was needed `multi(name, n)` is *documented* to prefer `selectUnique`, with `selectMany` as fallback: ```js const items = root[name].selectUnique ? root[name].selectUnique(n) : root[name].selectMany(n); ``` Measured duplicate rate when `selectMany` semantics apply (2000 renders per cell): | call | list size | renders containing a repeat | |---|---|---| | `littleDetails` ×5 (T2, T4, T6, T7, T8, T11, T12) | 18 | **46.7 %** | | `littleDetails` ×4 (T1, T3, T5, T9, T10) | 18 | 30.3 % | | `bioSparkle` ×4 (T3, T4, T7, T9, T10, T12) | 14 | **38.5 %** | | `bioMicroLife` ×3 | 14 | 20.2 % | Real renders off the current file, straight from the harness: > T12: `what is still left about the room: a specimen jar with two hearts, a specimen jar with two hearts, ...` > T4: `the nursery's ordinary clutter: a plant someone brought from the old world, a plant someone brought from the old world, ...` > T3: `... a nurse's hand-written schedule, a mascot painted on a vat, a strip of film showing the first > attempt, a nurse's hand-written schedule.` Nine of twelve templates carry at least one doubled detail. `littleDetails` is the file's *story* list — `a tally of failed grafts`, `a letter to a child not yet viable`, `an apology left with a dead culture` — and it is the one most often caught repeating itself, which reads as a stutter on the emotional beat. ### D5 — Soft: `bioMood` mixes registers, and four items break the frames that hold it Four templates slot `bioMood` into an adjectival frame: ``` T2 "a mood [bioMood]" T4 "an hour [bioMood]" T7 "the hour [bioMood]" T9 "[bioMood]" ``` `bioMood` is mostly bare adjectives (`uncanny and tender`, `hushed and organic`) — correct for those frames. But four items are clauses: ``` calm inside something alive · domestic inside something vast · awed and slightly afraid · patient as a slow infection ``` which render `a mood calm inside something alive`, `the hour domestic inside something vast`. Snagged, not broken — but it is exactly the soft fault `0rlrd37afw`'s pass flagged as `[mood] mood`. ### D6 — Soft: `[bioWeather] and rising` / `[bioSky] still and wrong` (T9) T9's scene is the swarm returning, so it appends tension to two general lists: > `spores drifting like slow snow and rising; a sky gone green above the pumping towers still and wrong` That works for about half of `bioWeather` and about half of `bioSky`. Against the others it renders `rain filtered through a living roof and rising`, `the hush of a sleeping organism and rising`. The appendage was written for a specific item and pasted onto a list. ### D7 — Soft: `arcBeat` contains two beats that presuppose the past `arcBeat` is drawn once per template, in any of the twelve. But four of its 18 items assume an earlier scene already happened — `the graft taking at last`, `the second heartbeat arriving a half-second behind the first`, `the ledger's next page already written in an unfamiliar hand`, `the night's whole supply of growth medium gone by morning`. So **T1 THE SEED VAULT — the first chapter, a life being chosen off a shelf — can render `Then — the graft taking at last.`** before any graft has occurred. --- ## Fixes applied | # | Fix | Where | |---|---|---| | D1 | Pin **Dr Vessel** as the protagonist of all 12 scenes; she leads the cast clause in every template, and `[bioRole]` now has a stable antecedent — *"the one who…"* is always measured against her. | T2, T5, T6, T7, T8, T9, T10 | | D2 | Add four bespoke `bioPage*` lists — `bioPageVat`, `bioPageGraft`, `bioPageSwarm`, `bioPageGiving` — and pin T2, T3, T9, T11 to them. T12 gets `bioPageSecondHeart`. `bioSetting` is now used by **no** template. | new lists + T2, T3, T9, T11, T12 | | D3 | Move the biography **after** the predicate, so the clause leads with the bare name: `Atten and Dr Vessel are up to their forearms in it — [attenLook] and [drVesselLook] —`. Subject-verb distance falls from 47 to 4 words. | T2, T3, T4, T5, T8, T9, T12 | | D4 | Change `multi()` to genuinely de-duplicate: shuffle-and-slice with a guaranteed-unique pick, with `selectUnique` preferred and de-duped `selectMany` as fallback. | `multi()` helper | | D5 | Split `bioMood` into `bioMood` (bare adjectives only, for the adjectival frames) and `bioMoodClause` (the four phrase items), and point T2/T4/T7/T9 at the adjective list. | new list + T2, T4, T7, T9 | | D6 | Drop the pasted `and rising` / `still and wrong`; give T9 its own two-line weather/sky append that works against any item. | T9 | | D7 | Split `arcBeat` into `arcBeat` (18 scene-neutral beats) and `arcBeatLate` (the 4 that presuppose the graft); T1–T3 draw only from `arcBeat`. | new list + T1, T2, T3 | ## Rating after **93/100** if the table above lands. That is the highest of the three passes (`animal-town` 44→91, `0rlrd37afw` 63→88), and it is earned: this file started from a far better place and, unusually, the fixes here are **not** repairs of broken plumbing but decisions about *what the story is about*. The last points are not reachable by more lists — they would need the twelve scenes to share a second protagonist (the Child) the way they now share Vessel, which is a rewrite, not a pass. ## Verification Harness: `/tmp/biopp/perch.py` (Perchance-accurate parser + renderer), plus `flaws.py`, `dupe.py`, `confirm.py`, `final.py`, `verify.py`, `final_verify.py`, and `multites2.js` (which extracts the real `multi()` out of `meta.txt` and exercises it against a stubbed Perchance list). Measured, not eyeballed: | Check | Before | After | |---|---|---| | Lists parsed | 41 | 47 | | Templates parsed | 12 | 12 | | Dead lists | 0 ✅ | 0 ✅ | | Undefined refs | 0 ✅ | 0 ✅ | | Braces balanced | 45/45 ✅ | 58/58 ✅ | | `Avoid [avoid]` closes template | 12/12 ✅ | 12/12 ✅ | | Premise weighted `:1.3` | 12/12 ✅ | 12/12 ✅ | | `[identityLock]` present | 12/12 ✅ | 12/12 ✅ | | Cast-clause subject→verb distance | max 47 words ❌ | max 6 words ✅ | | Templates drawing generic `bioSetting` | 5 ❌ | 0 ✅ (list removed) | | Distinct leads | 6 ❌ | 12/12 name Dr Vessel first ✅ | | `[bioRole]` has an antecedent | 3/12 ❌ | 12/12 ✅ | | `littleDetails` repeat rate (×5) | 46.7 % ❌ | **0.0 %** ✅ | | `bioSparkle` repeat rate (×4) | 38.5 % ❌ | **0.0 %** ✅ | | `multi()` wrong-length output | — | 0.0 % ✅ | | `multi()` graceful on a 2-item list at n=5 | crash/short | returns 2 unique, no throw ✅ | | Structural breakers (`X of [full setting]`) | 0 ✅ | 0 ✅ | | Boilerplate skeleton similarity | max 0.413 ✅ | max 0.413 ✅ | The `multi()` fix was verified by extracting the actual function text from `meta.txt` and running it in Node against a stubbed list: ``` selectUnique present n=5 dup=0.0% short=0.0% eg="item15, item16, item6, item11, item0" selectUnique ABSENT n=5 dup=0.0% short=0.0% eg="item17, item7, item1, item2, item10" tiny list(2) n=5 dup=0.0% short=100.0% eg="x, y" <- degrades, does not throw CONTROL original helper fallback n=5: dup=45.0% ``` **Known limitation.** The Python harness models Perchance's `selectMany` (independent draws), so its "after" renders still show doubled details — it does not execute the new `multi()`. The de-dup fix is verified only by the Node test above, on a stub. It has **not** been run against the live Perchance engine, which is the one thing this pass could not check (the `sync-to-perchance.sh` path needs the podman `perchance-server` container and a logged-in browser session). **Note on what was *not* wrong.** Three defect classes the sibling passes had to repair are genuinely absent here and were verified so: no template feeds a full setting phrase into a genitive join (`[bioPage*]` is only ever reached by the preposition `in` — 12/12); no template names the same character twice; and the clause `Avoid [avoid]` closes all 12 prompts and is last in file order. The `extra fingers` negative — which looks like a bug and is not — is correct for a genre whose cast includes `a grafted hand with six fingers`.