Skip to content

feat(release): № 009 rebuilt — a model city whose people go indoors and talk - #19

Merged
PSheon merged 7 commits into
mainfrom
dev
Sep 27, 2026
Merged

PSheon merged 7 commits into
mainfrom
dev

Conversation

@PSheon

@PSheon PSheon commented Sep 27, 2026

Copy link
Copy Markdown
Owner

What ships

№ 009 city-of-agents, the city rebuilt (zh + en)

  • The scene is a model city now: a plinth under a gradient sky with a sunset on the sun's side, gable roofs on the houses, glass towers on podiums with set-back crowns and roof plant, lane markings, park paths, doors, soft shadows, walls darkened towards the ground, office glass that reflects the hour's sky, a river that catches the sun. 16 draw calls (was 10), measured in the Overseer.
  • The people are whole figures (legs, arms, hands, head, hair, shoes) whose limbs swing in the shader; skin, hair and trousers differ per person, the shirt carries the activity's colour. On screen only — the simulation and every number it gives are unchanged — people at work, a meal or asleep walk in through their door and come back out, and people in a park pair up and take turns talking, with a speech bubble.
  • The follow badge says what the person is doing and where: 「正在跟拍 · 佳穎 5 ● 前往 工作 · 辦公(商業區 C4)」.
  • Fig. 01 gets a strip under the picture: what share of people is doing what in each ten minutes of today, yesterday faint, a line at now. People go indoors, so the scene alone no longer shows it.
  • Fig. 04 gets a body-clock switch. Off, the needs head is run again: people asleep at home at 01:00 / 12:00 go from 73 % / 3 % to 38 % / 16 %.

The article's text, read against the code and the figures:

  • The numbers beside fig. 04 are now the ones fig. 04 shows (12 % / 10 %, was the offline 11 % / 9 %).
  • Six sentences that said what the code does not do: the clock ran backwards ("one second in the city is ten minutes outside"), people do not re-decide on arriving, the random head idles one time in five, parks are only in the outer ring, fig. 04's read-out counts sleep and not everyone at home, and the sources paragraph pointed at a phrase that is gone.
  • Checked and unchanged: 373 buildings, 639 nodes, 863 edges and two parks for seed 1; fig. 03's 0.573 / 0.482; the first draft's 28.8 hours; 0.095 ms per tick.

Docs: docs/HANDOFF.md, where № 015 went (c346092).

Left open on purpose

People walk 9 m a minute, a tenth of real walking pace, in a city drawn in metres; the article does not state the pace, and changing it would move every measured number. Paul chose to leave it.

Checked

  • pnpm lint, pnpm typecheck, pnpm test (324 passed, 2 skipped).
  • pnpm build and the city's E2E and axe runs: 14 passed (smoke, axe light and dark, control sizes; desktop and mobile). The smoke test now also unticks the body clock and waits for fig. 01's strip.
  • Looked at in the browser at 1440 and 390 wide, morning, noon, dusk and night, following people in and out of doors and in a park; no console warnings.

🤖 Generated with Claude Code

PSheon and others added 6 commits September 23, 2026 18:11
The draft is paused and `dev` was reset, so nothing about it is on a branch any more — this says which tag holds
it, how to read it without checking it out, and what the read-through found, so that whoever writes the article
does not start from an empty page or rebuild the simulator.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"正在跟拍 · 佳穎 5 ● 前往 工作 · 辦公(商業區 C4)": the activity dot, then the
Overseer table's own words, now one function (personTask) that both use. Only
the name is in the live region; the task changes every few seconds at 20×.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ndoors and talk

The scene: the city sits on a plinth under a gradient sky dome with a sunset
band on the sun's side; houses get gable roofs, offices a podium with a lobby,
a set-back crown and roof plant, all flat roofs a parapet; lane markings,
park paths, doors, soft shadows under buildings and trees, walls darkened by
height in the shader, office glass that reflects the hour's sky, a river that
catches the sun, softer lamp pools, neutral tone mapping.

The people: one merged figure (legs, shoes, arms, hands, head, hair, nose)
whose limbs swing in the vertex shader; the shirt carries the activity colour
and a glow of it sits at their feet. On screen only (the simulation and every
number in the article are unchanged): people at work, a meal or asleep walk in
through their door and come back out; people in a park pair up, face each
other and take turns talking, with a speech bubble. Figures grow as the camera
pulls back so the overview stays readable.

Draw calls 10 → 16 (measured in the Overseer), sidenote and the two sentences
about drawing updated in zh and en. window.__cities in development only.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nder fig. 01

Fig. 04 gets a body-clock switch. Off, the needs head is run once more with
fatigue growing as fast by day as by night (the timetable and the dice never
read the needs, so they are not rerun), and each head now shows who is at
home at 01:00 and at 12:00: 73 % / 3 % with the clock, 38 % / 16 % without,
seed 1, 300 people, day two, as the reader's browser works it out.

Fig. 01 gets a strip under the picture: what share of people is doing what in
each ten minutes of today, yesterday faint where today has not got to yet, a
line at now. People go indoors now, so the scene alone no longer shows it.

Both charts are one component (activity-chart.tsx) drawing one path per
activity, and count people with the same activityOf in sim/metrics.ts. The
prose says where the switch is and quotes the two pairs of numbers; the smoke
test unticks the clock and waits for the strip.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The busiest ten minutes read 11 % (needs) and 9 % (random) in the text, from
the offline five-day runs, while the figure the reader is looking at works out
day two and shows 12 % and 10 %. The body-clock paragraph quoted offline
shares too (two thirds at 01:00, 2 % at noon) against the figure's 73 % / 3 %.
The text now quotes the figure, once, after it; the needs section only says
what happens and points to the switch. Two loose phrases went with it ("about
as many asleep at noon as at midnight", "half of that shape"). The backlog-off
measurement stays: it is labelled offline and no figure shows it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Read against the code and the figures, in both languages:

- The clock ran backwards: "one second in the city is ten minutes outside".
  It is one second outside, ten minutes in the city (minutesPerSecond: 10).
- People do not think again on arriving: arrive() starts what was decided and
  restarts the 30-minute count. They think on finishing and every 30 minutes.
- The random head does nothing one time in five (pickAtRandom); the list left
  that out, though fig. 04 shows it as the idle band.
- Parks are drawn only in the outer ring; zh said "中間".
- Fig. 04's new read-out counts sleep, not everyone at home: "在家睡覺" /
  "asleep at home", in the label and the paragraph that quotes it.
- The sources paragraph still pointed at "我量過", a phrase the text no longer
  uses, and left out the strip under fig. 01, which is computed live too.

Checked and left alone: 373 buildings (248 / 96 / 29, tallest 79.5 m), 639
nodes, 863 edges, two parks for seed 1; fig. 03's 0.573 / 0.482 and the 0.77
crossover; 8 h to 0.6 hunger and 40 min to eat; the 28.8-hour first draft and
its 14:06 median start; 5000 events ≈ 10.5 h; 0.095 ms per tick.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
paul-notebook Ready Ready Preview Sep 27, 2026 10:34am UTC

Request Review

PR #19's run of the E2E job failed once on "URLs outside both locales get
the site's own 404": no h1 for five seconds, and the error context had no page
snapshot at all. The same commit passed in the push run. Locally it passed 40
of 40 against a production build, and 12 of 12 with the CPU throttled 6×: the
h1 is there on the first sample, the page never reloads (a marker set after
load survives), and the second framenavigated is the router's replaceState.

Nothing to fix without seeing the page, and a retry would hide the next real
failure as well. The CI step already uploads test-results on failure; now it
will hold a screenshot.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@PSheon
PSheon merged commit a9df0a9 into main Sep 27, 2026
6 checks passed

This branch was successfully deployed

1 active deployment
Preview — 90caaccf Deployed Sep 27, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant