Windward

A tea porter carries ninety kilos of brick tea over a Himalayan pass, and the wind up here comes in gusts you can see arriving. Hold to plant the stick and brace; release to walk. Bracing is safe and it is not free — the lamp burns down whichever you choose, and the load on your back swings a half-beat behind your stride, so a gust that catches you mid-step takes you over the edge. Nine crossings, built end to end by AI agents on Cocos Creator, headless on Linux — with the porter's walk, brace and fall carried as real motion capture in 2,275 bytes.

Play it now

Hold anywhere to brace · release to walk — mouse, touch or SPACE · R restarts · P pause · M reduced motion · N mute
Payload 2,379,340 B raw / 965,836 B gzip · loads and plays in a few seconds · portrait, desktop and phone

▶ Play

The concept is the contract

The concept sheet is generated before any code and the build is audited against it region by region — ten props on the callout board, each one matched to an inventory row and to the file that finally shipped. Nine of the ten agree. The tenth is recorded as a deviation with its reason, which is the only useful kind of coherence check.

Concept sheet C1: a tea porter leaning into a crosswind on a snowbound ledge
C1 — the hero frame. The lean is not painted into the art: it comes out of the motion capture, about 2° through the walk and near 25° in the brace.
The live Cocos build mid-crossing
The live build. Same ledge, same load, same drop — and the figure is ten cutout sprites driven by baked joint angles.

Motion capture is the payload, not the animation

This piece exists to answer one question: what does real human motion cost on a tier with a 4 MB main package? A sprite sheet per animation is unaffordable and a skeletal runtime is out of the question, so the walk, the brace and the topple are mined out of CMU capture, reduced to one angle per limb per frame, and shipped as 2,275 bytes of JSON. Forty frames across three clips. The figure is a ten-limb cutout hierarchy; the same forward kinematics drives the blockout sticks and the authored sprites, which is why swapping the art in did not move a single gameplay number.

The blockout: the same crossing drawn in flat primitives
Blockout. The whole nine-crossing loop played through in flat primitives, and the blind readability check ran here — twice, because it failed the first time.
The porter braced against a gust, stick planted
Braced. A mined segment of CMU 15_04, three frames, held — and the load stops swinging because the stride stops.

Code-modelled in Blender, authored at final size

Fourteen inventory rows, seventeen rendered sprites, one 512×512 atlas with a matching camera-space normal pass. The porter's parts render at 249.6 px per metre — the lab's shared 96 PPU times this figure's scale — because that is their size on screen, so a part is drawn at scale 1 and never resampled. Rendering at 96 and scaling up in the engine is the mistake the previous cycle already paid for in a different costume.

The rendered porter part sprites
The cutout parts. Each is modelled with its joint at the origin, and the atlas carries where that joint lands after cropping.
Concept sheet C2, the ten-prop callout board
C2, the board they are audited against.
The prop atlas, albedo pass
One 512×512 atlas holds the porter, his load, and the whole pass.
The matching camera-space normal atlas
Its matching normal pass — identical layout, so one UV addresses both.

A gust you cannot see coming is not a mechanic

The prayer flags snap out straight before the wind lands, and the tell is a change of shape rather than a change of tint, because shape reads in peripheral vision while you are watching your feet. Every layout is checked before it is played: the warning window, the smallest gap between gusts, and whether the lamp can actually cover the crossing plus the cost of bracing for all of them. A layout that fails prints FAIR=false and the audit fails the build. That assertion caught a light budget that could not fund its own crossing.

A gust striking, flags snapped straight and streaks crossing the frame
The strike. Colour marks danger and motion marks wind — two channels, two jobs; the streaks are never red.
The same crossing on a phone viewport
The same crossing at 390×844. Every gate is audited on desktop AND phone; a portrait design resolution once hid a rendering bug only the desktop leg could see.

Measured, honestly

Every number is measured on the build that shipped. This lab's signature question is what a capability costs against the 4 MB gate, and this cycle adds motion capture to that table.

MeasurementValueCondition
WeChat main package2,462,582 B (2.35 MiB)58.7% of the 4,194,304 B cap
Headroom remaining1,731,722 Bunused
Cost of real motion capture2,275 B3 clips, 40 frames, 10 limbs — 0.06% of the cap
— for comparison, real Box2D415,693 B9.9%, measured the same way in cycle 2
— and a real tilemap143,558 B3.4%, measured the same way in cycle 4
Prop atlas234,728 Balbedo + camera-space normal, 512×512, 17 sprites
Audio248,024 B7 mono MP3s from sampled instruments
Unused fonts pruned per build868,140 B20.7% of the cap the builder ships by default and this piece does not use
Web build2,379,340 B raw / 965,836 B gzipweb-mobile target
Verified playthrough9/9 crossings, desktop AND phone, 0 errorsdesktop 1280×720 and phone 390×844, Playwright
Cost of the Graphics backdrop4.3 fps → 9.9 fps with it hiddenisolated by deactivating one scene layer at a time at runtime; software GL, shared host
— the same box, same minute, sibling piece13.9 fpsKarez, already shipped and clean — the control that says how much of the number is the machine
Device verificationPENDINGWeChat devtools are Windows/macOS-only; see below

What is not proven. This piece has never run on a handset. The WeChat package is structurally valid and the same code plays cleanly under headless GL, but that proves coherence and rendering, not that it boots inside WeChat. That needs operator-side credentials and a device, and until then the claim is not made.

Real engine features, earned

Cycle 1 earned the engine with a custom lighting shader, cycle 2 with real Box2D bodies, cycle 3 by generating its own texture, cycle 4 by making the tilemap the state. This one earns it by carrying real human motion as data on a tier that cannot afford it any other way.

Mocap as data

Three CMU clips reduced to one angle per limb per frame — 2,275 B for a whole gait.

Cutout hierarchy

Ten limbs, far side dimmed and drawn first, posed by forward kinematics.

A load with its own physics

The stack is a damped spring driven by hip sway; it lags the stride, and the lag is the danger.

Fairness, asserted

Every layout proves its warning window, gust spacing and light budget before it is played.

A tell that reads peripherally

The flags change shape, not colour — two authored states rather than a tint.

One verb, two input families

Hold to brace through one shared handler pair; mouse and touch are probed separately.

9 crossings, 36→52 m walk 1.5 m/s lamp 50 s 4→8 gusts per crossing warning 2.3→0.9 s minimum gap 2.0 s topple past 26° of swing 40 mocap frames 96 PPU, art at 249.6