Concept painting of the city, 26 September
Course review · 17 October 2026

The Suborned

Suborn the people, control the city.
Single-player real-time tactics with social infiltration · PC · Unity
Sky Rumsey · built with a crew of 17 AI agents
The idea

The city carries out your plan without knowing it.

You command a cell of four. You turn ordinary people (a waitress, a guard, a driver) and time their small acts into one plan.

Subvert people

Knowing more about someone makes them cheaper, quieter or more loyal.

Orchestrate the city

Every system opens or closes a window that you can see coming.

Live with it

You'll meet every choice again: people remember, and the city follows the trail back.

The loop Watch→Learn→Turn→Time→Take→Fight→Inherit

Every order shows its full price before you commit: $, time, Trail (evidence) and Alert risk.

Scoutwatches and listens
Fixerturns people, makes calls
Techloops cameras, reroutes patrols
Enforcertakes and fights
Concept: the parade, an atomic-age avenue (brief 007, 13 Oct)
The world

A 1950s world that discovered atomic power centuries ago.

Everything physical is abundant: sky rail, skyports, towers, liners.
No thinking machines, no networks. Robots run fixed routines; records are paper and microfilm; calls are by voice.
So information moves through people. People are the weak point, and that's what the game is about.
An abundant city that fears disorder: optimistic surface, coercive underneath.
Where it started · 26 September

Eight paintings set the look before any code.

Gameplay plan: the Records Office and the square
Inez spills coffee on the door guard
The Records Office
Tactical HUD concept
The mission block from above
City kit and palette
The player's cell, first concepts

Cream stone, seafoam bands, chrome, a thin line of brass. They are still the reference for street level: concept art first, then build to match.

30 September · GDD v0.12 for Assignment 2

The capstone mission was designed first.

Handover storyboard: One favour opens the door

"The Handover": take Councillor Vale alive at shift handover outside the Civic Records Office.

Five links, and each one leaves a trace that the city follows back.

Three weeks later it is still the reference every generated mission must match, and it's now playable.

From concept to now

Three weeks, twelve GDD versions.

26 Sep
Eight concept paintings
The look, from an open brief
30 Sep
GDD v0.12
Assignment 2: the Handover storyboard
6 Oct
Art bible
Look locked; the cell's first picks
· · ·
10 Oct
Lean repo and crew
Assignment 4: the transit pipeline, run r008 accepted
12 Oct
World generator
Plan → world → Unity
13–14 Oct
Skyline, civic block
DecoKit pieces, crossings, the world premise
15 Oct
People and engine
130 people generated; C# simulation; Handover playable
16 Oct
Takedowns, less reading
Witnesses, the response dial, a new HUD
17 Oct
GDD v0.23
The Handover ships (check c016)
202
commits in the game repo since 10 Oct
19
recorded generation runs
16
mission checks of the Handover (c001–c016)
v0.23
GDD today, approved by Sky on 17 Oct
How it's made · the crew

One designer, seventeen agents, one source of truth.

Designer
Sky
Rules, rulings and approval. The only human.
→
Source
The GDD
Human HTML wins; agent copy in Markdown
→
bun run crew
17 crew cards
Generated: edit the GDD, never a card
→
Aster · lead
Briefs
Objective, owner, done-check, evidence, next owner
→
Crew
Work + evidence
Plans, data, code, art, reviews
→
Checkers
Pass or fail
Plan, people, mission, HUD budget, tests
→
Sky
Approve
Promoted into contracts/
Aster
Lead and producer
Motive
Systems designer
Keel
Simulation engineer, the rulebook
Waymark
Missions and the mission checker
Datum
World planner, district plans
Vantage
Level designer, block layouts
Pulse
Schedules, people and AI
Fable
Dialogue
Latch
Unity engineer, the only scene editor
Splice
Tools: checkers, pipelines
Glyph
Interface artist, the HUD
Vela
Environment artist, DecoKit
Forma
Characters and animation
Glint
Lighting
Suture
Playtest and QA
Redline
Code and performance review
Chime
Audio
Opus 5.5 × 9 · GPT 6.1 Sol × 8
The content pipeline · Assignment 4

No AI at runtime. Content is made at build time, checked, and replays exactly.

FAULTS RETURN TO THEIR OWNER · ≤ 3 ROUNDS
Retrieve
GDD + plan
SurrealDB: vectors + BM25, fused by rank
Datum
Tram and sky rail lines
Structured output, cited passages
Vantage
Stops and stations
Pulse
Speeds, dwells, headways
Code works out the timetable
Judge
Plan checker + code checks + Keel, the critic
Verdict
All clean?
Accepted
Recorded, inputs pinned by sha256
Same orders → same result. bun run verify replays every recorded run offline: no model, no database.
19
runs recorded, all replayable
4
content types: transit, skyline, people, dialogue
12 / 7
accepted / rejected by the critic loop
$31
model spend for all 19 runs
0
model calls when you play
Harbour District master plan, CAD sheet
Map making · 1 · the plan

The district is one JSON file.

Roads, plots, gates, levels, tram and sky rail, landmarks: harbour-district.plan.json. The CAD sheet is drawn from it, and the checker fails the build on any broken rule.

112/112
checker rules pass: roads, transit, walks, kit, crossings, report reach
34
plots in 7 environmental areas
14
gates, every way in a seal point
3
levels: street 0, deck 9.43 m, sky concourse 24 m
$ bun run plan PASS R-C1 One connected network: 48/48 nodes PASS T-S2 T1 platforms (30 m) on straight track: 3/3 PASS W-5 Walks keep 0.65 m from a ground solid: 571/571 PASS R-REPORT every walkable spot within 40 m of a phone sheet → out/plan/harbour-district-v0.3.0.html
Map making · 2 · generated, not modelled

From the plan to the street, seeded and deterministic.

Plan
1 · Plan
The sheet, from plan.json
Graybox from above
2 · 12 Oct · graybox
Same streets, built in Unity
Generated skyline
3 · 14 Oct · skyline
Towers, sky rail, landmarks
Dressed and lit civic block
4 · 15 Oct · dressed
DecoKit pieces and honest light
320
buildings
1,077
frontages, 35 trades
8,197
street items
116
crossings, placed by rule
113
stairs, lifts and escalators
Map making · 3 · 13 October

The generator's first fly-through: from plan view down into the street.

Every tower, roof and lamp is placed by rule from the plan. Nothing here was placed by hand.

Map making · 4 · the civic block

The mission's block: painted, planned, built.

Records Precinct sheet
Painting · 26 SepMission block painting
Unity · 15 OctUnity play view of the square
Painting · 14 OctCrossing concept with floating signal eyes
Unity · 14 OctCrossing built in Unity

The block is written by bun run block from its sources, pinned by sha256; rule C-0 fails the build if its scale ever changes.

Map making · 5 · level design

Layouts are measured, not eyeballed.

Fight cover
Cover. 103 cover points; planters moved until rule CV-2 passed (Vantage, Pulse).
Quiet places
Quiet places. Where a takedown goes unseen, before and after the 5:30 chime (Vantage).
The cell's start
The start. The cell begins in view, inside the opening camera frame and clear of every cone (Waymark).
People · 1 · generated at build time

130 people, each a routine, a need, a temperament and ties.

// out/people/harbour-district.people.json (one of 130) { "name": "Inez Nikolaou", "work": { "unit": "cafe", "position": "server", "post": "door", "shift": "12:00–18:00" }, "routine": [ "tram 11:51", "café door 12:00", "meal 15:04", "tram 18:05" ], "temperament": "fearful", "need": "debt", "start": { "bravery": 0, "fear": 1, "loyalty": 0 }, "ties": [ { "workmate": "p-cafe-05" }, { "workmate": "p-cafe-21" }, { "lover": "p-records-office-01" } ], "secret": "affair" }
Model writes cast tables→Seeded code expands them→Checker P-0…P-16→Sky promotes

Temperament

Mercenary
50
Loyal
33
Idealist
28
Fearful
19

Decides the approach that works: Pay, Help, Pressure or trust.

Ties · 123

Workmate
70
Family
33
Regular
18
Lover
2

Introductions travel only along family, workmate and regular ties.

Every field names the rule that reads it; a field nothing reads is rejected. Needs: debt 40 · cash 39 · advancement 23 · papers 13 · care 9 · housing 6.

Ariadne Holm · cook · idealist · needs cash Ariadne Dahl · server · idealist · needs cash Anika Nasser · keeper · idealist · needs cash Anders Haddad · server · fearful · needs debt Freya Antoniou · server · mercenary · needs debt Omar Ekman · cook · idealist · needs cash Sanjay Holm · server · loyal · needs debt Eleni Vidal · cook · mercenary · needs cash Amara Thorsen · cook · loyal · needs care Mateo Rao · cook · idealist · needs cash Astrid Dimitriou · server · idealist · needs papers Milena Rask · server · mercenary · needs debt Joaquin Holm · cook · mercenary · needs advancement Inez Nikolaou · server · fearful · needs debt Jiyeon Kimura · server · loyal · needs care Arjun Nyholm · server · loyal · needs cash Haruto Lin · cook · loyal · needs cash Pilar Zhou · cook · fearful · needs papers Tomas Iyer · server · idealist · needs debt Daphne Castillo · server · loyal · needs debt Layla Sokol · server · idealist · needs debt Soren Pappas · server · mercenary · needs cash Haruto Mensah · cook · fearful · needs papers Minho Zhou · server · mercenary · needs debt Arjun Nair · resident · fearful · needs housing Omar Sokol · resident · idealist · needs debt Soren Mavros · resident · mercenary · needs cash Mateo Salazar · resident · fearful · needs debt Leif Mavros · resident · mercenary · needs cash Idris Castillo · resident · loyal · needs cash Thea Zhou · resident · fearful · needs housing Sigrid Ferrer · resident · mercenary · needs cash Katya Osei · resident · mercenary · needs cash Daphne Zhou · resident · idealist · needs cash Nils Mavros · resident · mercenary · needs debt Nils Mendes · resident · idealist · needs care Wei Salazar · resident · mercenary · needs cash Joaquin Bergstrom · resident · mercenary · needs debt Tomasz Cheng · resident · fearful · needs housing Meera Salazar · resident · idealist · needs debt Folake Okafor · guard · mercenary · needs debt Tariq Nwosu · clerk · loyal · needs papers Freya Farouk · clerk · idealist · needs debt Tomasz Iyer · clerk · mercenary · needs cash Meera Castillo · clerk · loyal · needs papers Omar Vlahos · clerk · loyal · needs care Efua Vale · councillor · mercenary · needs debt Costas Danso · clerk · idealist · needs advancement Pilar Salazar · clerk · idealist · needs advancement Elena Sundberg · clerk · loyal · needs cash Folake Fujita · clerk · loyal · needs debt Chidi Halvorsen · clerk · mercenary · needs cash Astrid Eriksen · clerk · loyal · needs care Marisol Castillo · clerk · loyal · needs advancement Nadia Nair · clerk · loyal · needs papers Kofi Adeyemi · clerk · mercenary · needs debt Ravi Diallo · clerk · fearful · needs papers Elena Han · clerk · mercenary · needs cash Abena Tanaka · clerk · mercenary · needs advancement Sigrid Sato · clerk · loyal · needs care Ingrid Roldan · clerk · idealist · needs care Zora Vidal · clerk · mercenary · needs debt Kofi Nwosu · clerk · loyal · needs advancement Milena Novak · clerk · loyal · needs advancement Tomas Pappas · clerk · idealist · needs cash Sakura Cabrera · clerk · loyal · needs care Efua Desai · clerk · mercenary · needs debt Joaquin Georgiou · clerk · idealist · needs debt Anton Navarro · guard · mercenary · needs debt Elena Mendes · guard · mercenary · needs advancement Mei Zhou · official-driver · mercenary · needs cash Lian Park · clerk · fearful · needs papers Anton Halvorsen · clerk · idealist · needs advancement Abena Georgiou · clerk · loyal · needs advancement Ravi Lin · clerk · idealist · needs cash Abena Boateng · guard · mercenary · needs cash Irina Salazar · clerk · mercenary · needs debt Kavya Banerjee · clerk · loyal · needs advancement Costas Kamara · guard · mercenary · needs debt Elena Diallo · clerk · mercenary · needs advancement Anton Mori · clerk · mercenary · needs cash Sakura Zelenko · clerk · fearful · needs debt Efua Vlahos · clerk · mercenary · needs advancement Mei Ekman · clerk · loyal · needs advancement Arjun Desai · clerk · mercenary · needs advancement Kwame Okafor · guard · mercenary · needs cash Freya Desai · clerk · loyal · needs advancement Anika Jaber · clerk · mercenary · needs advancement Ravi Kostas · clerk · mercenary · needs advancement Tunde Diallo · clerk · mercenary · needs debt Kwame Marek · clerk · mercenary · needs debt Costas Halvorsen · clerk · fearful · needs debt Nadia Lin · clerk · loyal · needs cash Mateo Rask · clerk · fearful · needs debt Nadia Kimura · clerk · fearful · needs debt Omar Zhou · clerk · fearful · needs papers Minho Lin · guard · mercenary · needs debt Wei Alexiou · clerk · idealist · needs papers Layla Castillo · clerk · mercenary · needs cash Ariadne Vidal · clerk · loyal · needs cash Pilar Sato · guard · mercenary · needs advancement Sanjay Halvorsen · clerk · loyal · needs papers Marisol Mavros · clerk · mercenary · needs debt Milena Dahl · guard · mercenary · needs cash Nikos Haddad · guard · loyal · needs advancement Karim Jaber · clerk · idealist · needs cash Stavros Zelenko · guard · loyal · needs debt Dev Ferentinos · guard · loyal · needs cash Sakura Iyer · clerk · loyal · needs cash Ingrid Dahl · clerk · loyal · needs care Kenji Dahl · clerk · mercenary · needs cash Anika Dvorak · clerk · mercenary · needs debt Astrid Chaudhry · guard · mercenary · needs debt Astrid Tanaka · guard · mercenary · needs advancement Lucia Nair · guard · mercenary · needs debt Katya Owusu · guard · loyal · needs advancement Leif Cabrera · resident · mercenary · needs debt Dmitri Dvorak · resident · idealist · needs cash Jiyeon Tanaka · resident · loyal · needs housing Priya Antoniou · resident · mercenary · needs cash Folake Varma · resident · idealist · needs housing Yannis Castillo · resident · idealist · needs housing Omar Halvorsen · resident · mercenary · needs cash Efua Tanaka · resident · fearful · needs papers Sanjay Sundberg · keeper · fearful · needs debt Chidi Boateng · attendant · fearful · needs debt Sakura Osei · attendant · idealist · needs cash Bogdan Fujita · keeper · idealist · needs advancement Freya Mendes · attendant · idealist · needs cash Karim Lindqvist · attendant · fearful · needs papers Inez, the waitress the door guard the driver Councillor Vale start: a café server
Records Office (76)Café (24)Residents (24)Kiosks (6) workmatefamilyregularlover

Drawn for this deck from out/people/harbour-district.people.json; node size = ties held. Hover a node for the person.

People · 2 · the graph

Who can introduce you to whom?

bun run people:graph loads the people into SurrealDB as a graph, so the questions the design asks become one query.

254
nodes
1,783
edges: ties, shifts, stops, needs
query who-can-introduce · 7 hops
  1. A café serverstart
  2. Layla, a café serverworkmate
  3. Inez, the waitressworkmate
  4. The door guardregular · evening
  5. Sanjay, a café serverregular · pre-shift
  6. Costas, an Office guardregular · pre-shift
  7. Mei, the driverworkmate
  8. Councillor Valeworkmate
Inez and the door guard

"The guard comes to visit Inez when she calls him, because you bribed or pressured her, and that's what makes him leave his post." · Sky, 15 Oct

People · 3 · the lovers

A secret the city generated, and the mission casts.

The Handover names roles, not people. Rule M-2 casts each role from the generated city and pins it by id. Inez's need is her debt (Help clears it); her secret is the affair (Pressure threatens to expose it).

$ bun run people:graph query lovers a_name b_position secret at Freya Antoniou guard affair evening Inez Nikolaou guard affair evening

This cast made Inez Fearful, so Help works one step worse: two Helps, $80,000, not $40,000. The city set that price, not a script.

People · 4 · the café, fixed by rule

Before: five servers on one door point. After: Inez alone, customers come and go.

Café frontage before and after
Top: before · bottom: after, at 0:30, 3:10 and 5:00. Ring = Inez.
Unity · afterThe café in play
5 → 1
people standing on the café door
2 → 10
customers on the terrace (per 30 s, peak)

New rule P-16: no two drawn people on one place at once. More eyes at the café, so the witness rules had more to do.

Simulation · 1 · one engine, two hosts

A deterministic C# engine: the same orders give the same result.

Keel's rulebook
35 events as data
Each: what it needs, what it changes, who sees it. Unknown = reject.
→
Suborned.Sim · C#, Unity-free
10 Hz fixed tick, integer state
Replay = start state + orders + checksums
→
Headless · dotnet
Tests and the mission checker
Thousands of plays per check
=
Live · Unity
The play build
Must match headless at every checkpoint
457/457
engine tests pass
137/137
scenarios match in Unity, hash for hash
1,030
TypeScript tests across the tools
33 → 457
engine tests, 15 → 17 Oct
Unity · 15 Oct · the engine running live, loud routeGoing loud in the play build

Hit chances are accumulators, not dice: "hits 3 in 4 · down in 4 s" is a promise the engine keeps.

Simulation · 2 · how the city finds out

A fact reaches security only through a person.

A takedown, a carry, a body→ Seen within 13 m, clear line→ Reacts by temperament→ Walks to a phone→ Report lands: Alert rises

Staff radio in 5 s · kin and lovers report at once · Loyal report · Mercenaries keep quiet until Alert 2 · the terrified flee · a turned witness says nothing.

The response dial, as data

SNameDispatchAlert ≥ 2 sendsSeal
0lax20 s1 unit3:00
1routine12 s1 unit2:25
2watchful · Handover10 s1 unit + 2 robots2:25
3guarded8 s2 units + 2 robots2:00
4swarm6 s2 units + 4 robots1:30

Standing, per district

−3 Menace
Hero +3
start +2

Only acts seen or found move it. A public fight moves it once, by opponent. Between missions, word of mouth: each person you helped tells their ties.

Hero turns people slower and dearer but loyal; Menace faster and cheaper, with betrayal.

Simulation · 3 · the mission checker

A mission ships only if the engine proves it's fair.

MC-0 ✓Every script plays as expected and replays to identical checkpoints26/26
MC-1 ✓At least two quiet routes winA, B, G
MC-2 ✓The loud route wins but costs more Trail than every quiet win13 T
MC-3 ✓Every fail condition is reachable8/8
MC-4 ✓No single contact is essential✓
MC-5 ✓An informed player finishes ≥ 1:00 before the closing event1:42+
MC-6 ✓Quiet is not slower than loud53.6 s faster
MC-7 ✓Careless violence is worse: seen, found or reported5/5
MC-8 ✓Takedown routes are viable, at a real time cost3 wins
MC-9 ✓Turning people stays competitive with takedownsnone dominant
SHIPS

Check c016, 17 October, on GDD v0.23.

3,017
plays, each landing on its recorded hash
16
checks since 15 Oct, every one re-recorded when the rules moved

bun run missions:check replay handover c016

The capstone · the Handover

Take Councillor Vale alive. Many ways in, each with its price.

5:30 chime
8:30 close
Threaten InezRoute A · Pressure
3:29.9
$07 TAlert 1
Knock out the guardRoute G · takedown
3:35.9
$06 TAlert 1
Help Inez, twiceRoute A · clear her debt
4:22.8
$80,0005 TAlert 1
Go loudShoot the guard
4:23.5
$013 TAlert 2
Pay the driverRoute B · pickup moves to the lane
7:39.3
$70,0003 TAlert 0

Time to get Vale to the getaway car, from check c016. $100,000 purse · Trail follows you to the next mission · loud is never cheaper.

The cell · Forma

Visitors from a nearby timeline: sharper, no 1950s tailoring.

The cell, final lineup
HUD portraits
ScoutFixerTechEnforcer
26 SepFirst concepts
Motion testProxy motion test

No long coats or flowing hems: the silhouette comes from shoulders, packs and props, so it can be animated at 40–60 px tall.

Play · Sky played it: "It's the reading, it's too much"

Show the rules in the street, not in text.

After: brief 014 HUD
Before: brief 013 HUD
Before · brief 013After · brief 014

The same moment: the Enforcer about to take down the guard. Drag to compare.

34.2% → 9.0%
of the screen covered by HUD
28 → 0
lines of running text
13/13
play shots inside the HUD budget (bun run budget)

One-line prices, icons for numbers, a sentence only when a person speaks.

Play · the street says it

One ring tells you who will see you before you move.

Safe
Safe. Turquoise, footprints; the rim fills with walk time.
Seen
Seen. The watcher's colour, an open eye.
Unknown
Unknown. A watcher nobody has watched yet.
Raises Alert
Raises Alert. A dark double rim and the lamp.
Takedown card
One line per way. "Knock out · 7 s · +4 · ▲1"
Plot scope
Plot scope. Where Vale is, and who you know.
Learned camera cone
The Scout's cones. Learned by watching, one at a time.
Environment · DecoKit

A kit generated in Blender, headless, at build time.

Records Office entrance
Robot butler
Signal eye
Fountain garden
Café set
Sphere lamp with banners
Utility cabinet
Crossing pieces
282
pieces in the catalogue
144
adopted, each with a sha256
86,820
triangles for the civic block (budget 110,000)
SF-21
brass stays a thin line, checked by rule
What's next

From one person, to networks, to districts.

Concept · eye level · 14 OctEye-level concept of the café crossing
Concept: the liner at the quay
The Suborned

Thank you.

Questions? Everything here replays from the repo: bun run verify

Notes