Twenty-eight lots, one critic, and fifteen hours unattended
Day 1 ended with a walkable street of blank shopfronts. Day 2 was about building a loop that could finish them without me: a builder that writes each building in code, a critic that scores it from screenshots, and rules strict enough to let the pair run all day. By midnight the shopping arcade was dressed, both of its ends led somewhere, and seven lots of a second street stood on the far side of the gate.
Start of day
End of day- Hours unattended
- 15.5
- Commits
- 67
- Lots through the loop
- 28
- Tests passing
- 167
1:20 AM to 8:21 AM
Night shift: performance groundwork and the data layer
The first unattended block worked through the performance plan from Day 1 and laid the data foundations the story will need. Each task was its own commit, with its tests.
- A budget audit for every scene (triangles, view triangles, textures, colliders) and a test that fails when a location goes over.
- Unused assets are freed after each location change; colliders came off the window scenery (the home went from 850 colliders to 370).
- Lighter window views: only low-detail stand-ins are drawn out of the windows. Texture import rules and a check that Unity 6’s GPU Resident Drawer is on.
- Regression tests for the prototype’s old bugs, which turned up three small fixes, and content-rule tests on the script.
- Data only, no scenes yet: lot markers for every address, per-lot street state in the save, character-bible fields on the character schema, the town’s world-map data, a route framework, shopping-street threads and a message-board model.
- At dawn: a static-batching experiment, parody snack names and art for the convenience store, and a curfew system for staying out late.
- Tests went from 85 to 159 during the night.
8:21 AM
Guardrails for an unattended day
Before the art campaign could run on its own, it needed rails: tests that catch a street breaking, a repeatable way to photograph a lot, and a Blender job that refuses to run when memory is short.
- A connection test walks every link between streets in both directions; a coverage test wants exactly one marker per lot; interior scenes get their own checks.
- Repeatable lot screenshots: one script enters play mode, parks the player out of frame and takes the same six views at midday, golden hour and night.
- A Blender kit library in Python: a builder for boxes, quads, cards, tubes and spheres on the shared palette; sign cells by name; decals; three-level LOD export; collision boxes and light markers.
- A job wrapper for Blender: a memory check first, a backup of the file, peak RAM in the log, one file per job, nothing while Unity imports or plays.
- A rules file for the day: commit after every finished lot, the full suite green before each commit, tests only from an idle editor, never raise a budget, and a “Needs Elle” list instead of guessing at decisions.

How a lot gets built and judged
One lot takes about an hour and a half through four passes. The step that mattered most was separating the builder from the judge.
- A briefThe lot's row in the city layout: who runs it, what it sells, how old the building is. Every shop and brand is fictional.Input
- A module scriptOne Python file per lot builds the building from boxes, quads and cards on a shared kit library: palette swatches, a 0.5 m grid, bevels, decals, light markers and collision boxes.Python + Blender
- Signs painted by codeEvery sign, poster, tag and nameplate is a cell on a shared texture atlas, drawn with a 2D library at build time and placed by name.Pillow
- A headless Blender jobExports three levels of detail and the colliders, after a memory check, with a backup of the file and a log of peak RAM. One file per job.Blender 5
- Import and dressUnity picks materials by name, turns collision meshes into colliders, recesses coplanar faces, and a dresser places every module from a layout file.Unity 6
- Audit and testsA budget audit of every scene (triangles, textures, colliders) and the 167 EditMode tests, all green before any commit.Gate
- Eighteen screenshotsPlay mode, the player parked out of frame, six camera views at midday, golden hour and night.Unity CLI
- An independent criticA second model instance that never saw the code scores the screenshots in six categories from 1 to 5, runs a PASS/FAIL checklist, and names the three weakest things.Review
- Fix, then againThe builder fixes the weakest things and goes round once more, up to four passes. The best pass is committed with its scores in the ledger.Up to 4 passes
What the critic is told
- The rubric: real depth (reveals, frames, gutters, downpipes), services where they would really be (meters, AC units with pipes, drop wires, vent hoods, a water heater), Japanese street details (nameplate, intercom, mail slot, address plates), lived-in upper floors, an owner who shows in at least three details, a stocked interior at least 1.5 m deep, wear on every surface, and the technical rules.
- An evidence sheet of what a screenshot cannot show: triangle counts per LOD, the scene’s budgets, which materials are shared, where the colliders and light markers are, that the tests are green, and from today, that the street was walked in play mode.
- Nothing else. The critic judges only what is visible, fails anything it cannot see, and must point at a named screenshot for every claim.
Pass 1
Pass 4
Pass 1
Pass 4Scores are 1 to 5 in six categories. The bar is 4 or more in every one with no checklist failures. No lot reached it today; the critics are harsh by design, and the leftovers they name are the next pass’s brief.
10:48 AM to 2:32 PM
Twenty-one shopfronts through the quality bar
The arcade’s eleven west lots and ten east lots, each from its brief, each through four passes. The shared systems that came out of it are what made the second street fast.


- A helper library for everything a shopfront repeats: meters, AC units and pipes, downpipes, shutter boxes, sign brackets, sliding windows, laundry as garment cards on a pole, price sheets, shelves, counters and tills.
- Three sign atlases and two decal atlases, about 200 cells, all drawn by code: fascias, vertical blade signs, posters, hand-written cards, tape marks, rust, drips, scuffs.
- Downward spot lamps that light every sign at night, a spill light behind every pane of glass, and alpha-clipped decals that no longer haze at a distance.
- A pass over the arcade itself: floor wear down the middle and at every threshold, rust and scuffs on the roof-bay posts.
- None of the twenty-one reached the bar. The record shop and the pharmacy came one category short (aging, both times); the futon shop, the watchmaker, the rice shop and the greengrocer were next.





3:58 PM
Both ends of the street lead somewhere
A street that stops at a wall breaks the spell. The north gate now opens onto the station street, the south gate into a riverside alley, and both exits are walk-through triggers with matching arrivals.


- Fifteen new modules, the same ones the station street and the riverside reuse, nineteen sign cells, a from-scratch LOD2 in the exporter, and spot lamps that follow a lamp’s height.
- The connection test’s half-links pass for both ends; the critic scored them on an end rubric (plausibility, depth, what closes the sightline) for three passes each.
4:05 PM to 11:52 PM
The station street
A new scene, linked to the arcade in both directions, with the Night 3 stand-ins dressed in and then replaced one lot at a time: a supermarket, a family restaurant, the station, an apartment block, an insurance agency, a constituency office and a snack bar.




| Lot | Pass 1 | Construction | Owner | Through | Aging | Technical | Lighting |
|---|---|---|---|---|---|---|---|
| The stationthe street's landmark | 3/4/3/2/3/3 | 4 | 4 | 4 | 3 | 3 | 4 |
| Ekimae Heightsa one-room apartment block | 3/2/3/2/3/3 | 4 | 4 | 3 | 4 | 4 | 4 |
| Saeki officea politician's constituency office | 3/4/3/3/3/3 | 4 | 4 | 3 | 4 | 3 | 4 |
| Nakamura Insurancea small insurance agency | 3/3/3/3/3/4 | 4 | 4 | 3 | 3 | 3 | 4 |
| Sunny Daysa family restaurant | 3/2/3/2/2/2 | 3 | 4 | 3 | 2 | 3 | 3 |
| Daily Marta supermarket | 3/3/3/3/3/3 | 3 | 3 | 3 | 3 | 3 | 3 |
| Snack Kyōkoa snack bar with the owner's home above | 3/3/1/2/3/2 | 3 | 4 | 2 | 3 | 3 | 3 |
The kept pass of each station-street lot: Construction, Owner shows, Through the glass, Aging, Technical, Lighting. Coral is at the bar.


- Each lot added cells to the atlases and fixes to the kit: planters that stood inside the station, an atlas overlap, a decal that used the wrong material, an exporter that repairs empty UVs, a dresser that treats built lots as view scenery from the next street over.
- The first play-mode walk of a whole street, and the first draw-call reading, both came out of the office lot’s passes.
- The snack bar closed the day at the row’s end: its exposed side wall needed an ad, a heater and an address plate, and its pavement needed a floor.
Fifteen hours unattended
From 8:21 AM to 11:52 PM nobody was watching. What made that possible wasn’t a smarter model; it was the shape of the work.
What kept it safe
- One lot per commit, the full suite green first, nothing pushed
- Tests only from an idle editor, never in or right after play mode
- A memory check before every Blender job; one file per job
- Budgets that can never be raised, only met
- Decisions written to a “Needs Elle” list instead of guessed
- Every choice that changed something recorded as a “choice to review”
What kept it honest
- A critic that never saw the code and judges only screenshots
- An evidence sheet of measured facts, not claims
- A cap of four passes, then commit the best and record what is left
- A ledger row per lot with every pass’s scores
- Faults found on the way written up as faults, with the fix
- A stopping rule the run reports against, even when it continues
- The day ended on a message from a second session: finish the current lot through its cap, commit, write the summary, stop. It did.
- By the numbers: 67 commits, 28 lots through the loop, 115 critic reports, 2,398 screenshots, 193 models, 12.7k lines of Python art tooling, 14.3k lines of C#.
Challenges
What went wrong, how it was found, and what changed so it stays fixed.
Damaged
RestoredTwo lots painted over the arcade's banner
The first sign atlas looked half empty in the cell registry, so two station lots put their new signs there. The registry had never recorded the hand-placed art already on it: the arcade banner, directory strips, price tags, vending fronts. Nobody saw it, because the station shots never show the arcade.
Fix: The atlas was restored byte for byte from the Git LFS history. Every station cell moved to a fourth atlas, and the registry now refuses new cells on the first one.
Lesson: A registry is only as complete as what it was told. Check against the committed bytes, not the index.
The street ended at x ±30
The first real play-mode walk found that the ground colliders stop six meters short of the west exit. A player walking west fell off the world at the last shop's door.
Fix: A west-end module carries the pavements and road to the exit and on into a residential lane that meets a cross lane at a T, with a traffic mirror where you would expect one.
Lesson: Walk the whole street, in play mode, every time. Screenshots only show what the camera faces.
The keys never arrived
To walk the street from a script I tried simulated key presses, then queued Input System events. Neither reached the game's Move action.
Fix: The walk pushes the character controller a few centimeters per frame from a coroutine, which still respects every collider. It slid round planters, bicycles and a nobori without sticking.
Blender refused to start
Late in the night free memory fell to 2.7 GB with Unity holding 3.2 GB. The job wrapper's memory check refused two Blender runs, as it should.
Fix: Unity released its unused assets on request and dropped to 0.8 GB; the jobs ran five minutes later.
Lesson: A guard that says no is doing its job. Give it a way to make room.
Kit helpers with surprises
A shutter-box helper quietly runs guide rails down to the ground, which put four full-height bars across a facade. Welded bevelled frames left faces without UVs that rendered as red hairlines. The kit glass hazes small openings into flat plates.
Fix: The exporter now repairs the empty UVs. Small openings are open frames. The shutter boxes over bedroom windows are plain boxes.
Lesson: Preview from the player's eye before the critic does; the Blender preview alone misses what a shared material does.
The draw-call budget can't be read yet
The bar asks for 300 draw calls after batching. The editor reports 489 raw and zero batched, and the profiler's batch counter returns zero from outside, even with the profiler driver on.
Fix: Open. Recorded with the raw numbers; either the batcher is off in the pipeline asset or its draws are not counted there.
Budgets
Measured in the Unity editor at the end of the day. Both streets sit under their triangle budgets with their window views included; the home is still over, and that is the next performance job.
Textures: 36.7 MB on the arcade and 35.3 MB on the station street, of 64 MB each. Draw calls: 489 raw, unverified after batching (see Challenges).
What’s next
- The station street’s last five lots, built in parallel batches with the night’s open questions answered first.
- The north alley’s end, a whole-street screenshot set, and preloading the next street while measuring against a 150 MB rule.
- A live station clock, a draw-call test that can read the batched count, and the home’s window views under budget.
End of Day 2.
