From: coordination seat. Source: Pip voice memo 2026-08-24_084241__c2b0170e, on the opening of the game. Transcribed locally; quotes are ASR output, lightly de-stuttered.
The memo arrives at this while talking about buying upgrades, and the connection is the point -- buying a thing is his worked example of an action that should not tax you.
"it also reinforces that like some actions you can take... Ah here we go, so some actions you can take don't cost attention, right? They're like trivial decisions or decisions you can fire off whenever. And so the player can do these once a month"
"maybe they can fire have like some actions that need to be planned and then some things you can fire off as like instance or even interrupts in response to instance as we get layers deeper that are like snap decisions and those are done in a different like area of the UI kind of where like the upgrades are now and those things will like trigger or like take effect on the day that the decision is taken which is anytime in the simulation."
"remember the simulation goes we kind of have the ability to pause it now so a player could be like oh cool I want to pause it on this day and then like fire these things off and that's what the speeding up and slowing down allows to happen."
"instance" is almost certainly ASR for "instants" -- Magic: the Gathering's instant speed, which fits "interrupts in response to instants" exactly and matches pdoom1#824 (MTG-style pass-priority) already being on the board. Recorded as an inference, not a fact. Ask Pip if it matters to the naming.
Three asks, and they are in decreasing order of how ready the codebase is for them.
1. A declared free/trivial tier -- and the defect that shows why it has to be declared
Today free-ness is not declarable. A grep across godot/scripts and godot/data for free_action, trivial, zero_cost, no_cost and is_free returns zero hits. Zero attention is inferred from an absent key: godot/scripts/core/actions.gd:50-55, whose own docstring says "Founder Attention an action costs to queue. 0 when free or when action is empty."
Measured across the 62 action definitions in godot/data/actions/*.json: 44 carry costs.attention of 1 or more. Zero carry attention: 0. The remaining 18 carry no attention key at all -- and that group is not one thing:
| group |
count |
actually free? |
submenu openers ("is_submenu": true) |
11 |
yes -- navigation |
pass (command.json) |
1 |
yes |
buy_compute ({"money": 50000}) |
1 |
yes -- money only |
hiring verbs: advertise, use_connections, interview_next, hire_best, onboard_next |
5 |
NO |
travel: attend_conference_trip, send_delegation |
2 |
NO |
The last seven are costs: {} in the JSON and are billed elsewhere -- the hiring five through godot/scripts/core/hiring_pipeline.gd reading Balance dials (hiring.advertise.cost_attention: 3, connections: 2, interview: 2, offer: 1, plus HiringPipeline.ONBOARD_ATTENTION), and the travel two through ConferenceTrip at commit time. godot/data/actions/travel.json:32 says so on purpose:
"Costs are {} on purpose: travel cash and Attention are consumed by ConferenceTrip at commit time, not by the plan queue, because the trip resolves synchronously instead of queueing."
So "free" and "expensive but billed somewhere you cannot see" are byte-identical in the action data. That is not a naming quibble -- it is upstream of pdoom1#1218 ("Attention spent without saying so"), of pdoom1#1086 (the onboard tooltip omits the Attention cost because the costs dict holds money only), and of pdoom1#1223 (the queue and the header disagreeing). Every one of those is a surface trying to read a fact the data does not carry.
And the upgrades are already the free tier without saying so. godot/scripts/core/upgrades.gd:3, the file's own first line: "Upgrade definitions - one-time purchases that don't consume action points". Seven of them, cash-only. Pip's memo is asking for that to become a stated category with a UI register, not an accident of where the code lives.
The ask: an explicit marker on an action definition meaning this costs no founder attention, deliberately, distinct from this has no attention key. Then fix the seven liars by declaring their real cost where a reader can find it, or by moving the billing into the cost dict.
2. Snap decisions fired into a paused sim, sited where the upgrades are
The good news: instant speed already exists and is a ruled part of the design. docs/game-design/decisions/ADR-0009-plan-months-two-speeds.md and ADR-0011-effort-economy.md. Two speeds:
- Plan speed -- queued strategic actions with durations.
godot/scripts/core/month_plan.gd:62: "Strategic actions carry DURATIONS (ADR-0009 S5 -- nothing strategic resolves instantly)". Queue entries are {action_id, attention_cost, resolves_on_turn, queued_on_turn}.
- Instant speed -- response windows paid from the reserve.
month_plan.gd:15: "reserved -- explicitly set aside at plan time for response windows (instant speed); this is ADR-0009's CRISP reserve -- the gamble that makes windows interlock".
godot/scripts/core/window_resolver.gd is the resolver, with five costed verbs -- handle_reserve, handle_cannibalize, defer (mints a Liability Ledger entry), ignore, auto_ignore -- and DEFAULT_ATTENTION_COST := 1, overridable per event. godot/scripts/core/event_tiers.gd:26-30 classifies windows un-snoozable / deferrable / standing / no-action. The reserve is pre-committed on PLAN via main_ui.gd:947 _on_reserve_ap_button_pressed().
coordination/DESIGN_2026-08-12_interrupt-resolution-variants.md works three resolution models through the same committed month and is the document to read before touching this.
What is missing is the player-initiated half. Every instant in the game today is the game interrupting you. The memo asks for the reverse: the player pausing on a chosen day and firing something off. Nothing supports that.
3. The pause premise in the memo is wrong, and it matters
"we kind of have the ability to pause it now"
We do not. godot/scripts/ui/screen_mode.gd:98-104:
var pause_stub := Button.new()
pause_stub.text = "||"
pause_stub.disabled = true
pause_stub.tooltip_text = "Pause/resume -- stub (follow-up lane). Windows already auto-pause playback."
A disabled button, explicitly a stub. What is real:
- The speed dial,
screen_mode.gd:37: const _SPEEDS := {"1x": 0.20, "2x": 0.10, "4x": 0.05} -- seconds per visible day-tick, driving game_manager.day_tick_seconds. 1x is the slowest there is; "slowing down" in the memo does not exist either.
- Auto-pause, but engine-driven only:
godot/scripts/core/month_controller.gd:59-60, is_paused() is true for exactly one status, PAUSED_ON_WINDOW. The sim stops when it needs an answer, not when the player wants a moment.
- Both live on the WATCH-only control strip (
main_ui.gd:404), so they are not reachable from PLAN at all.
scenes/pause_menu.tscn is the ESC system menu -- settings and quit. Not sim time.
So the memo's stated foundation is a stub, and the feature it describes rests on it. A player-controlled pause is the prerequisite for the whole of ask (2), and it is currently one disabled button and a follow-up lane nobody has scheduled. Read that as the first item of work, not as an assumption.
Suggested cut
- Make the pause button real. Smallest thing, unblocks everything else, and
month_controller already has a paused status to extend rather than a new concept to invent. Decide whether player-pause is a third Status or a playback-layer concern that leaves month_controller alone -- the latter is likely, since it is presentation, but it is a real design call.
- Add a declared free/trivial marker to the action schema and set it on the 13 genuinely free actions. Then either move the seven mis-declared actions' costs into their cost dicts or give them a declared "billed at commit by X" marker. This alone retires a chunk of
pdoom1#1218 and pdoom1#1086.
- A snap-decision surface, sited "where like the upgrades are now" -- which is the panel
godot/scripts/ui/layout_controller.gd:18 currently calls "the orphaned upgrades list". That panel already needs a purpose; the memo is offering it one. Populate it with the free-tier actions plus any player-initiable instants, live while paused, resolving on the paused day.
- Only then the deeper layer -- interrupts in response to instants. Explicitly "as we get layers deeper" in the memo. Not now.
Not decided here
- Whether player-fired instants cost reserve. ADR-0009's reserve is priced for windows the game raises. If the player can spend it on their own initiative, the gamble changes shape and the balance is not obviously the same. This is a design ruling, not an implementation detail.
- Whether this forks the ladder. Making pause real is presentation and probably does not. Letting the player spend reserve on their own initiative changes what happens on a fixed seed and certainly does -- the same epoch-bump trap
pdoom1#1044 documents. Split the work along that line and the first half can ship inside a league.
- "once a month" -- "the player can do these once a month or like maybe", and he trails off. Whether the free tier is rate-limited is genuinely unresolved on the recording.
Related: pdoom1#1044 (nothing takes time -- the tempo problem this sits on top of), pdoom1#824 (MTG-style pass-priority), pdoom1#1223 (queue and Attention header contradict), pdoom1#1218 (attention spent without saying so), pdoom1#1086 (tooltip omits Attention cost), pdoom1#804 (procurement -- already ruled to cost ~0 Attention, so it is a free-tier candidate), pdoom1#1004 (the parked upgrades), ADR-0009, ADR-0011, coordination/DESIGN_2026-08-12_interrupt-resolution-variants.md.
From: coordination seat. Source: Pip voice memo
2026-08-24_084241__c2b0170e, on the opening of the game. Transcribed locally; quotes are ASR output, lightly de-stuttered.The memo arrives at this while talking about buying upgrades, and the connection is the point -- buying a thing is his worked example of an action that should not tax you.
"instance" is almost certainly ASR for "instants" -- Magic: the Gathering's instant speed, which fits "interrupts in response to instants" exactly and matches
pdoom1#824(MTG-style pass-priority) already being on the board. Recorded as an inference, not a fact. Ask Pip if it matters to the naming.Three asks, and they are in decreasing order of how ready the codebase is for them.
1. A declared free/trivial tier -- and the defect that shows why it has to be declared
Today free-ness is not declarable. A grep across
godot/scriptsandgodot/dataforfree_action,trivial,zero_cost,no_costandis_freereturns zero hits. Zero attention is inferred from an absent key:godot/scripts/core/actions.gd:50-55, whose own docstring says "Founder Attention an action costs to queue. 0 when free or whenactionis empty."Measured across the 62 action definitions in
godot/data/actions/*.json: 44 carrycosts.attentionof 1 or more. Zero carryattention: 0. The remaining 18 carry no attention key at all -- and that group is not one thing:"is_submenu": true)pass(command.json)buy_compute({"money": 50000})advertise,use_connections,interview_next,hire_best,onboard_nextattend_conference_trip,send_delegationThe last seven are
costs: {}in the JSON and are billed elsewhere -- the hiring five throughgodot/scripts/core/hiring_pipeline.gdreading Balance dials (hiring.advertise.cost_attention: 3,connections: 2,interview: 2,offer: 1, plusHiringPipeline.ONBOARD_ATTENTION), and the travel two throughConferenceTripat commit time.godot/data/actions/travel.json:32says so on purpose:So "free" and "expensive but billed somewhere you cannot see" are byte-identical in the action data. That is not a naming quibble -- it is upstream of
pdoom1#1218("Attention spent without saying so"), ofpdoom1#1086(the onboard tooltip omits the Attention cost because the costs dict holds money only), and ofpdoom1#1223(the queue and the header disagreeing). Every one of those is a surface trying to read a fact the data does not carry.And the upgrades are already the free tier without saying so.
godot/scripts/core/upgrades.gd:3, the file's own first line: "Upgrade definitions - one-time purchases that don't consume action points". Seven of them, cash-only. Pip's memo is asking for that to become a stated category with a UI register, not an accident of where the code lives.The ask: an explicit marker on an action definition meaning this costs no founder attention, deliberately, distinct from this has no attention key. Then fix the seven liars by declaring their real cost where a reader can find it, or by moving the billing into the cost dict.
2. Snap decisions fired into a paused sim, sited where the upgrades are
The good news: instant speed already exists and is a ruled part of the design.
docs/game-design/decisions/ADR-0009-plan-months-two-speeds.mdandADR-0011-effort-economy.md. Two speeds:godot/scripts/core/month_plan.gd:62: "Strategic actions carry DURATIONS (ADR-0009 S5 -- nothing strategic resolves instantly)". Queue entries are{action_id, attention_cost, resolves_on_turn, queued_on_turn}.month_plan.gd:15: "reserved -- explicitly set aside at plan time for response windows (instant speed); this is ADR-0009's CRISP reserve -- the gamble that makes windows interlock".godot/scripts/core/window_resolver.gdis the resolver, with five costed verbs --handle_reserve,handle_cannibalize,defer(mints a Liability Ledger entry),ignore,auto_ignore-- andDEFAULT_ATTENTION_COST := 1, overridable per event.godot/scripts/core/event_tiers.gd:26-30classifies windowsun-snoozable / deferrable / standing / no-action. The reserve is pre-committed on PLAN viamain_ui.gd:947_on_reserve_ap_button_pressed().coordination/DESIGN_2026-08-12_interrupt-resolution-variants.mdworks three resolution models through the same committed month and is the document to read before touching this.What is missing is the player-initiated half. Every instant in the game today is the game interrupting you. The memo asks for the reverse: the player pausing on a chosen day and firing something off. Nothing supports that.
3. The pause premise in the memo is wrong, and it matters
We do not.
godot/scripts/ui/screen_mode.gd:98-104:A disabled button, explicitly a stub. What is real:
screen_mode.gd:37:const _SPEEDS := {"1x": 0.20, "2x": 0.10, "4x": 0.05}-- seconds per visible day-tick, drivinggame_manager.day_tick_seconds. 1x is the slowest there is; "slowing down" in the memo does not exist either.godot/scripts/core/month_controller.gd:59-60,is_paused()is true for exactly one status,PAUSED_ON_WINDOW. The sim stops when it needs an answer, not when the player wants a moment.main_ui.gd:404), so they are not reachable from PLAN at all.scenes/pause_menu.tscnis the ESC system menu -- settings and quit. Not sim time.So the memo's stated foundation is a stub, and the feature it describes rests on it. A player-controlled pause is the prerequisite for the whole of ask (2), and it is currently one disabled button and a follow-up lane nobody has scheduled. Read that as the first item of work, not as an assumption.
Suggested cut
month_controlleralready has a paused status to extend rather than a new concept to invent. Decide whether player-pause is a thirdStatusor a playback-layer concern that leavesmonth_controlleralone -- the latter is likely, since it is presentation, but it is a real design call.pdoom1#1218andpdoom1#1086.godot/scripts/ui/layout_controller.gd:18currently calls "the orphaned upgrades list". That panel already needs a purpose; the memo is offering it one. Populate it with the free-tier actions plus any player-initiable instants, live while paused, resolving on the paused day.Not decided here
pdoom1#1044documents. Split the work along that line and the first half can ship inside a league.Related:
pdoom1#1044(nothing takes time -- the tempo problem this sits on top of),pdoom1#824(MTG-style pass-priority),pdoom1#1223(queue and Attention header contradict),pdoom1#1218(attention spent without saying so),pdoom1#1086(tooltip omits Attention cost),pdoom1#804(procurement -- already ruled to cost ~0 Attention, so it is a free-tier candidate),pdoom1#1004(the parked upgrades), ADR-0009, ADR-0011,coordination/DESIGN_2026-08-12_interrupt-resolution-variants.md.