Day 2 · Monday, October 5, 2026 · 1:20 AM to 11:52 PM

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.

Where Day 1 left the arcade: finished buildings, blank shops.Start of day
Where Day 1 left the arcade: finished buildings, blank shops.
The same view at the end of Day 2, every shop dressed and lit.End of day
The same view at the end of Day 2, every shop dressed and lit.
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.
Signs are code. A corner of the fourth sign atlas: every fascia, poster, nameplate and chalkboard is a cell painted at build time and placed by name.
Signs are code. A corner of the fourth sign atlas: every fascia, poster, nameplate and chalkboard is a cell painted at build time and placed by name.

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.

  1. 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
  2. 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
  3. 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
  4. 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
  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
  6. Audit and testsA budget audit of every scene (triangles, textures, colliders) and the 167 EditMode tests, all green before any commit.Gate
  7. Eighteen screenshotsPlay mode, the player parked out of frame, six camera views at midday, golden hour and night.Unity CLI
  8. 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
  9. 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.
An office at pass 1: a sofa that reads as a box, no flag on the stand, nothing on the desks.Pass 1
An office at pass 1: a sofa that reads as a box, no flag on the stand, nothing on the desks.
Pass 4: the daruma on the counter where every camera sees it, flags, a bookcase, a water cooler.Pass 4
Pass 4: the daruma on the counter where every camera sees it, flags, a bookcase, a water cooler.
The station at pass 1.Pass 1
The station at pass 1.
Pass 4: the campaign’s highest score, 4/4/4/3/3/4.Pass 4
Pass 4: the campaign’s highest score, 4/4/4/3/3/4.

Scores 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.

The stationer, the first lot through the loop.
The stationer, the first lot through the loop.
The record shop, one category short of the bar.
The record shop, one category short of the bar.
  • 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.
The pharmacy, with a clinic above and a home above that.
The pharmacy, with a clinic above and a home above that.
The watchmaker at golden hour.
The watchmaker at golden hour.
The greengrocer. The produce is the module cap talking: 8,000 triangles per building.
The greengrocer. The produce is the module cap talking: 8,000 triangles per building.
The futon shop and its closing-down sale.
The futon shop and its closing-down sale.
The arcade at night after the lighting pass: both gooseneck lamps on every sign, the lanterns, the glass lit from inside.
The arcade at night after the lighting pass: both gooseneck lamps on every sign, the lanterns, the glass lit from inside.

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.

South: the alley runs down to the embankment, the river, the bridge and the far bank.
South: the alley runs down to the embankment, the river, the bridge and the far bank.
The shrine at the alley’s mouth, in coursed concrete until the kit has stone.
The shrine at the alley’s mouth, in coursed concrete until the kit has stone.
  • 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.

The station at night, the street’s landmark: a lit lobby, a kiosk, payphones, the board.
The station at night, the street’s landmark: a lit lobby, a kiosk, payphones, the board.
Ekimae Heights, a one-room block with its balconies and meters.
Ekimae Heights, a one-room block with its balconies and meters.
The insurance agency: a vertical lightbox, an A-board, a bicycle at the wall.
The insurance agency: a vertical lightbox, an A-board, a bicycle at the wall.
The constituency office: posters on both panes, a nobori, a thank-you banner.
The constituency office: posters on both panes, a nobori, a thank-you banner.
LotPass 1ConstructionOwnerThroughAgingTechnicalLighting
The stationthe street's landmark3/4/3/2/3/3444334
Ekimae Heightsa one-room apartment block3/2/3/2/3/3443444
Saeki officea politician's constituency office3/4/3/3/3/3443434
Nakamura Insurancea small insurance agency3/3/3/3/3/4443334
Sunny Daysa family restaurant3/2/3/2/2/2343233
Daily Marta supermarket3/3/3/3/3/3333333
Snack Kyōkoa snack bar with the owner's home above3/3/1/2/3/2342333

The kept pass of each station-street lot: Construction, Owner shows, Through the glass, Aging, Technical, Lighting. Coral is at the bar.

The snack bar at its hour: the lit sign, the bottle-keep window, the chalkboard.
The snack bar at its hour: the lit sign, the bottle-keep window, the chalkboard.
The west end, built because the walk fell off it: the street becomes a lane and meets a cross lane at a T.
The west end, built because the walk fell off it: the street becomes a lane and meets a cross lane at a T.
  • 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.

The first sign atlas as two lots had left it: insurance and apartment signs painted over the arcade’s banner.Damaged
The first sign atlas as two lots had left it: insurance and apartment signs painted over the arcade’s banner.
Restored from the LFS history. The new cells live on a fourth atlas; the registry refuses new cells here.Restored
Restored from the LFS history. The new cells live on a fourth atlas; the registry refuses new cells here.

Two 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.

Shopping arcade237,233 triangles · budget 250,000
Plus 26,065 triangles of the next street seen through the gates, against a 30,000 view budget.
Station street156,648 triangles · budget 250,000
Family home227,587 triangles · budget 120,000
Over budget: the window views are the bulk of it. Next on the list.
Convenience store52,919 triangles · budget 120,000

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.