Plan the focus: Improving performance on the steamdeck. keep it concrete and simple. use or exte #294
Labels
No labels
agent
agent:ci
agent:done
agent:failed
agent:needs-input
agent:refined
agent:refining
agent:running
agent:shipped
agent:skip
autonomous
autopilot
driven
local
plan
proposal
qa
qa-gap
research
retro
ship
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jeroen/cartopolis#294
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The maintainer has set a focus for this lane, and it needs turning into a queue of work.
This is a planning pass, not a build. Change no code and open no branch. What comes
back is a list, which the maintainer reorders and edits in the console before any of it
is filed — so propose the work, do not start it.
docs/direction.mdfor the goal and the seven values,CLAUDE.mdfor how this tree is built and what it already does, and whatever part ofthe code the focus names. Half of a good plan is noticing the thing is already there.
sitting, ordered so the earlier ones unblock the later ones. A title that says what
changes, and a note saying where in the code it lands and how a machine would judge
it — that last part is what this lane can land unattended.
workflows,
tools/autopilot.tsitself andassetlinks.jsonare fenced: a tickettouching one is built and then parked for a person. Anything whose success is a
matter of taste belongs to a person too.
JSON, an array,
titleandnoteboth strings. The autopilot reads the last suchblock on this ticket and stores it as the queue; everything else in the comment is
ignored, so write whatever reasoning you want around it.
5. Then close this ticket. There is no branch to merge.
Decide it yourself. Nobody is watching this ticket, so a question asked here is a
ticket that stops. The values at the top of
docs/direction.mdsettle the ambiguity, anda piece of work you are unsure about is one to leave off the list rather than ask about.
Filed by the autopilot.
🤖 Picked this up — working on branch
perf/294-plan-focus-improving-performancein a fresh worktree on the VPS. I'll report back here when I'm done.Label an issue
agent:skipto keep me off it, ordrivento keep it in a session you are driving.The focus is the Steam Deck, and the shape of the answer is already set by what
landed on 2026-09-09: the Deck was the machine that settled the globe cloud shell —
71% of the GPU frame at 1280x720, the difference between 52 and 85 fps — after this
container had spent weeks unable to say anything about it. That result is the model.
It came from counts and from a real GPU, and it was only trustworthy because the
windows reported
quiet, the fragment counts repeated to the unit, and the machinewas idle.
So the queue below is in three parts, and the order is the dependency order.
The instrument first (1-4).
cargo perftoday writes one sample per window to/tmp/perf.jsonand has no way to repeat a run, no way to diff two runs, and oneglobal resolution. Every withdrawn finding in
docs/notes/performance-suite.mdis apoint sample differenced against a point sample; the survey records a within-group
spread wider than every difference it was trying to measure. Repeats, a diff that
refuses an unsupported claim, and a per-scenario size are what make a Deck run mean
something. Item 4 is there because the one ground-level scenario's "steady" window
is not steady — it carries ~10 MB of uploads per frame — and that gets worse on a
fast GPU, not better.
Then find (5-6). Two per-pixel effects default to on on a Steam Deck and
have no headless switch at all:
light_shafts_onresolves to true on any adapterthat is not a CPU rasteriser with shadows on, which is a 48-step volumetric march
per pixel, and
ambient_occlusion_onresolves to true wherever compute shadersexist, which is an SSAO pass plus the depth and normal prepasses it requires.
Neither is measurable here — lavapipe refuses the march outright — so this is
exactly the gap the Deck exists to fill. Item 5 adds the switches and proves they
reach the render world, because the clouds already taught this lane that a flag
which never arrives reads as an exoneration.
Then act (7-9). Item 7 is the payoff:
adaptive_qualityhasMAX_STEP = 1andsays in its own header that there is no step 2 because nothing else has been
measured. Item 8 is free and independent — 88% of triangles at 7,191 km go into
shadow cascades where no shadow can resolve. Item 9 is the survey's named remaining
win and the only one here that can fail loudly, so it is last.
Left off deliberately: anything decided by looking at it, the
growth_factorslabquestion (the note already says it buys memory back with a buffer copy, which is the
burst that cost this project a device), and a rung for the Deck by name — a
vendor-family generalisation is not a measurement, and this tree has learned that
twice. Nothing here touches the wire protocol, a migration, the CI workflows,
tools/autopilot.tsorassetlinks.json.Item 6 needs the Deck. Everything else builds and is judged in the container.
Planning pass — no code changed, no commits, branch left as cut from
main. The plan is posted on #294 as anautopilot-planblock of nine items, and the ticket is closed.What the plan says, and why
The Steam Deck already proved its worth once: the 2026-09-09 run is what settled the globe cloud shell at 71% of the GPU frame after this container had spent weeks unable to say anything about it. That result is the template — counts, a real GPU,
quietwindows, fragment counts repeating to the unit. The nine items are in dependency order across three parts.Instrument first (1–4).
cargo perfwrites one sample per window, cannot repeat a run, cannot diff two runs, and pins one global 640×360. Every withdrawn finding inperformance-suite.mdis a point sample differenced against a point sample, and the survey records a spread wider than the differences it was chasing. Items 1–3 add--repeat Nwith a median and spread, a--baselinediff that reports a delta inside the spread as not established rather than as a number, and a per-scenario size so a fill-bound scenario can be measured at the Deck's own panel. Item 4 fixes thecitysteady window, which carries ~10 MB of uploads per frame while claiming to be idle — worse on a fast GPU, not better.Then find (5–6). The concrete Deck finding from this read: two per-pixel effects default to on there and have no headless switch at all.
light_shafts_onresolves true on any non-software adapter with shadows on — a 48-step volumetric march per pixel — andambient_occlusion_onresolves true wherever compute shaders exist, bringing a depth and a normal prepass with it. Neither is measurable in this container; lavapipe refuses the march outright (a capture didn't finish in ten minutes). Item 5 adds the switches and proves they reach the render world, because the clouds already taught this lane that a flag which never arrives reads as an exoneration.Then act (7–9).
adaptive_qualityhasMAX_STEP = 1and says in its own header that there is no step 2 because nothing else has been measured — item 6 supplies the order, item 7 spends it. Item 8 is free and independent: 88% of triangles at 7,191 km go into shadow cascades where no shadow can resolve, fixable withNotShadowCaster(not by reconfiguring the lights — bevy_light panics). Item 9 is the survey's named remaining win, egui's second full-resolution pass, ordered last because its failure mode is a wgpu validation error and a silent mid-stream quit.Left off deliberately
Anything judged by looking at it; the mesh-slab
growth_factorquestion, since the note already says it buys memory back with a buffer copy — the burst that has cost this project a device; and a rung for the Deck picked by name, which is the vendor-family generalisation this tree has now learned against twice.For you to decide
Item 6 needs the Deck. It is a measurement ticket with no code change, and its numbers cannot come from this container. Everything else builds and is judged here. If the Deck isn't reachable from the build lane, item 6 parks and item 7 parks behind it — the other seven still stand on their own.
No fenced surface is touched: no wire protocol, no migration, no CI workflow, no
tools/autopilot.ts, noassetlinks.json.No commits were made.
🤖 viberfox issue agent on the VPS — 34 turns · $3.86 · session
3852aea3-48f3-40af-93d4-92ec7493e720. Reply with @agent to continue this session.alreadyFiledonly ever sees 50 issues, so every autopilot dedupe key silently expires — #206 was QA'd twice #281alreadyFiledonly ever sees 50 issues, so every autopilot dedupe key silently expires — #206 was QA'd twice #281