Game Development Time Source and Tick Policy
Use this skill when the hard part is not behavior architecture or event routing alone, but how time is sourced, sampled, advanced, paused, scaled, and interpreted without every subsystem quietly inventing its own private clock law.
This skill is for designing, reviewing, or refactoring a reusable time policy in gameplay, AI, interaction, cooldown, timer, and update-heavy systems. Its job is to define where authoritative time comes from, which systems sample or advance it, when work runs per frame versus fixed step versus event-driven cadence, how cooldowns and reevaluation intervals are expressed, and how drift or pause behavior stays understandable enough to debug and review.
If the engine is unspecified, keep the recommendation engine-agnostic first. Only use engine-native guidance when the task explicitly depends on runtime features such as Godot process modes and timers, Unity update loops, or equivalent framework scheduling constraints.
For reusable timing shapes, cadence heuristics, and clock-boundary cautions, see references/timing-shapes.md.
Purpose
This skill is used to:
- determine whether a reusable time-source or tick policy is justified at all
- define the boundary between one local timer choice and shared timing semantics
- choose frame, fixed-step, event-driven, or sampled-clock models deliberately
- make cooldown, reevaluation, pause, scaling, and drift rules explicit enough to review
- return a structured time-policy design or review artifact another agent can implement incrementally
Use this skill when
Invoke this skill for requests such as:
- several systems use timers or cooldowns but disagree on what clock they mean
- gameplay logic keeps assuming
every frame without a named cadence policy
- AI, UI, pooling, and runtime execution all need clearer reevaluation intervals
- a team needs to separate authoritative time sources from convenience sampling helpers
- requests that explicitly mention
tick, update cadence, timer, cooldown, fixed step, delta time, pause, time scale, or reevaluation interval
Trigger examples
- "Our cooldowns work, but every system seems to count time differently"
- "Should this logic run every frame, on a fixed step, or only when state changes?"
- "How do we define pause and time-scale behavior so timers stop drifting?"
- "We need one clear policy for AI reevaluation instead of each behavior polling however it wants"
Do not use this skill when
Do not use this skill when:
- the hard problem is still choosing behavior architecture, command flow, or event topology; use the narrower skill first
- one local timer decision is already sufficient and no shared timing contract is needed
- the task is primarily resource spend, reservation, or rollback behavior rather than cadence semantics
- the task is primarily world-fact freshness or observation truth rather than time-source policy
- the task is a localized runtime bug investigation rather than time-policy design or review
Pattern
- Primary pattern: Tool Wrapper
- Secondary pattern: Reviewer
Related skills and routing notes
- Start with
game-development-behavior-architecture if the bigger uncertainty is still which control model owns reevaluation at all.
- Pair with
game-development-state-change-notification when the design should stop polling and move toward meaningful invalidation or state-change-driven updates.
- Pair with
game-development-world-state-facts when the real disagreement is freshness, staleness, or observation validity rather than the clock itself.
- Pair with
game-development-resource-transaction-system when reservation windows, cooldown-spend interactions, or delayed commit semantics depend on shared time rules.
- Hand off to
game-development-utility-ai, game-development-fsm, game-development-behavior-tree, or game-development-object-pool once the clock and cadence policy are clear and the next question is subsystem behavior.
Diagnostic checklist
Evaluate these questions before recommending or refining a time policy:
| Question |
Healthy sign |
Warning sign |
| Is there real shared timing pressure? |
Several systems depend on the same cadence or clock semantics |
One local timer is being over-abstracted |
| Is the time source explicit? |
The authoritative clock can be named clearly |
Callers read whatever time value is nearby |
| Does cadence materially affect behavior? |
Polling, fixed-step, and event-driven choices lead to different outcomes |
Cadence is treated as an implementation afterthought |
| Are pause and scaling rules defined? |
The team can explain what pauses, what scales, and what ignores scaling |
Some timers stop, some do not, and nobody knows why |
| Are cooldown semantics stable? |
Cooldowns share a named clock and evaluation rule |
Each caller reinvents its own elapsed-time math |
| Is drift observable? |
The system can explain late, skipped, or desynced updates |
Timing errors show up as vague flakiness |
Decision rules
Before recommending a reusable time policy, ask whether the smaller honest answer is:
- one local timer choice at a legitimate call site
- one scheduler or loop decision already owned by a specific subsystem
- one cooldown rule that does not need a shared clock contract
- one world-fact freshness or sensing problem rather than a timing problem
- one engine-specific integration concern rather than a cross-system time policy
Reject a shared timing layer if it mostly renames one obvious timer without improving consistency, debuggability, or cross-system coordination.
Prefer a local timer decision when
- the timing rule is simple and used in one place
- there is no shared cooldown, reevaluation, or pause contract to preserve
- abstraction would mostly hide an obvious delay or interval
Prefer frame-driven cadence when
- the logic is lightweight and naturally tied to presentation or immediate responsiveness
- slight variance per frame is acceptable
- there is no strong need for deterministic step boundaries
Prefer fixed-step cadence when
- the design needs stable simulation intervals or consistent step boundaries
- gameplay meaning changes if frame rate changes materially
- cooldown or accumulation logic would become misleading under variable sampling
Prefer event-driven or state-change-driven cadence when
- reevaluation only matters after meaningful state transitions
- polling every frame would mostly waste work or hide ownership
- the design benefits from explicit invalidation rather than constant checking
Prefer sampled-clock semantics when
- several systems need a common notion of elapsed time without sharing the same update loop
- cooldowns, delayed actions, or AI reevaluation all read from one named clock
- pause or scaling behavior must be explained independently of how each consumer runs
Escalate to adjacent foundations when
- the real issue is resource reservation or commit timing rather than cadence policy
- the real issue is stale world observations rather than clock ownership
- the real issue is condition composition rather than when rules are reevaluated
Workflow
Follow this sequence every time.
1. Identify the timing boundary
State what time-related question the system is trying to answer before naming loop APIs, timers, or engine callbacks.
Examples:
- which clock a cooldown should use
- how often AI should reevaluate
- whether an update belongs to frame, fixed-step, or event-driven cadence
- what should pause, scale, or continue while paused
2. Separate time sources from time consumers
For each important path, specify:
- authoritative time source
- who advances or owns that source
- who samples it read-only
- whether multiple clocks exist and why
- how callers know which clock they are using
3. Define cadence and sampling rules
For each important system, decide whether work is:
- frame-driven
- fixed-step
- event-driven
- sampled on demand
- batched or rate-limited
Specify what makes that choice appropriate.
4. Define cooldown, delay, and reevaluation semantics
Specify:
- what clock cooldowns use
- whether elapsed time is scaled or unscaled
- whether reevaluation is interval-based, event-driven, or hybrid
- how delayed actions or pooled-object resets measure time
5. Define pause, slow-motion, and time-scale policy
Specify:
- what pauses
- what ignores pause
- what respects global time scale
- whether some subsystems use unscaled time intentionally
- how pause and resume affect pending timers or cooldowns
6. Define drift, desync, and catch-up policy
Specify:
- what counts as acceptable drift
- whether late updates are skipped, caught up, or clamped
- how long frames or missed ticks are handled
- how the system distinguishes timing lag from logic failure
7. Define observability and debugging expectations
Specify:
- what minimum timing traces or debug views are needed
- whether cooldown or reevaluation state is inspectable
- how reviewers can tell which clock a system is using
- what evidence helps confirm timing consistency across systems
8. Separate timing policy from adjacent concerns
Clarify what stays outside the time policy, such as:
- full behavior architecture choice
- resource-spend or rollback semantics
- world-fact truth ownership
- network replay or deterministic lockstep in full
- engine-specific scheduler tutorials
9. Plan the rollout
Migrate incrementally: isolate one repeated cooldown or reevaluation family, name the clock boundary, define cadence rules, add pause and drift policy, replace divergent callers gradually, and verify before widening the timing surface.
Output contract
Return the result using assets/time-policy-template.md in this section order.
If the best answer is not a reusable time policy, still use the template and say that explicitly instead of wrapping one honest timer choice in temporal pageantry.
Return the result in these sections:
- Timing boundary
- Local timer vs shared time policy decision
- Time source and ownership model
- Cadence and sampling design
- Cooldown, delay, and reevaluation model
- Pause, scaling, and drift policy
- Observability and debugging notes
- Related foundations and handoff notes
- Engine integration notes
- Migration plan
- Verification notes
Keep the section order stable so time-policy recommendations are easy to compare across reviews and refactor passes.
Engine-specific notes
Godot / .NET
- Keep authoritative clock choice explicit instead of letting
_Process, _PhysicsProcess, timers, and scene-tree pause behavior blur together.
- If some timers must keep running while paused, state that policy directly rather than hiding it inside node configuration.
- Be careful when pooled or transient nodes own timers; the lifetime of the node should not accidentally redefine global timing semantics.
Unity
- Distinguish clearly between
Update, FixedUpdate, coroutine delays, and any custom scheduler or tick service.
- Make unscaled versus scaled time choices explicit where pause menus, UI, or cooldowns differ.
- Avoid letting inspector-configured intervals imply a global cadence policy if the runtime ownership story is unclear.
Generic C# / engine-neutral
- Prefer named clocks and cadence rules over magic numbers scattered through callers.
- Keep reevaluation policy explicit so systems do not silently drift from event-driven to polling behavior.
- Use structured timing diagnostics only where they materially improve reviewability or runtime debugging.
Common pitfalls
- abstracting one local timer into a shared timing framework with no reuse benefit
- letting every subsystem sample a different clock without naming the difference
- assuming
every frame is automatically the right cadence for gameplay logic
- mixing scaled and unscaled time without policy clarity
- hiding pause behavior inside engine defaults nobody has documented
- making cooldown math differ between UI preview, AI evaluation, and runtime execution
- treating drift and missed ticks as mysterious flakiness instead of defined policy questions
- expanding a time-policy skill into a full determinism or networking doctrine too early
Companion files
references/timing-shapes.md — reusable heuristics for time-source choice, cadence boundaries, pause semantics, drift handling, and abstraction cautions
references/cooldown-and-reevaluation-guide.md — reusable review guide for cooldown clocks, interval reevaluation, state-change triggering, and hybrid timing models
assets/time-policy-template.md — reusable output template for returning the time-policy design or review artifact
Validation
A good result should satisfy all of the following:
- a simpler local-timer alternative was considered first
- the timing boundary is explicit
- authoritative time sources and consumers are distinguishable clearly
- cadence, cooldown, and reevaluation rules are concrete enough to review
- pause, scaling, and drift behavior are stated explicitly
- observability and debugging expectations are addressed where relevant
- rollout steps are incremental enough to verify safely
- the design does not quietly expand into resource semantics, world-fact ownership, or full networking determinism by accident
Completion rule
This skill is complete when the agent has:
- decided whether a reusable time policy is justified at all
- identified the timing boundary and authoritative clock model
- defined cadence, cooldown, reevaluation, and pause semantics
- specified drift handling, observability, and debugging expectations
- described engine integration notes where relevant
- returned a concrete migration and verification brief
1---2name: game-development-time-source-and-tick-policy3description: Use when a cross-engine gameplay task needs a Layer 1 foundation for timer logic, update cadence, cooldown clocks, pause rules, or frame-vs-fixed-step policy, and the agent must define or review a reusable time-source and tick policy with explicit ownership, sampling cadence, drift handling, pause and scaling semantics, and observability boundaries.4---56# Game Development Time Source and Tick Policy78Use this skill when the hard part is not behavior architecture or event routing alone, but **how time is sourced, sampled, advanced, paused, scaled, and interpreted without every subsystem quietly inventing its own private clock law**.910This skill is for designing, reviewing, or refactoring a reusable time policy in gameplay, AI, interaction, cooldown, timer, and update-heavy systems. Its job is to define where authoritative time comes from, which systems sample or advance it, when work runs per frame versus fixed step versus event-driven cadence, how cooldowns and reevaluation intervals are expressed, and how drift or pause behavior stays understandable enough to debug and review.1112If the engine is unspecified, keep the recommendation engine-agnostic first. Only use engine-native guidance when the task explicitly depends on runtime features such as Godot process modes and timers, Unity update loops, or equivalent framework scheduling constraints.1314For reusable timing shapes, cadence heuristics, and clock-boundary cautions, see `references/timing-shapes.md`.1516## Purpose1718This skill is used to:1920- determine whether a reusable time-source or tick policy is justified at all21- define the boundary between one local timer choice and shared timing semantics22- choose frame, fixed-step, event-driven, or sampled-clock models deliberately23- make cooldown, reevaluation, pause, scaling, and drift rules explicit enough to review24- return a structured time-policy design or review artifact another agent can implement incrementally2526## Use this skill when2728Invoke this skill for requests such as:2930- several systems use timers or cooldowns but disagree on what clock they mean31- gameplay logic keeps assuming `every frame` without a named cadence policy32- AI, UI, pooling, and runtime execution all need clearer reevaluation intervals33- a team needs to separate authoritative time sources from convenience sampling helpers34- requests that explicitly mention `tick`, `update cadence`, `timer`, `cooldown`, `fixed step`, `delta time`, `pause`, `time scale`, or `reevaluation interval`3536### Trigger examples3738- "Our cooldowns work, but every system seems to count time differently"39- "Should this logic run every frame, on a fixed step, or only when state changes?"40- "How do we define pause and time-scale behavior so timers stop drifting?"41- "We need one clear policy for AI reevaluation instead of each behavior polling however it wants"4243## Do not use this skill when4445Do not use this skill when:4647- the hard problem is still choosing behavior architecture, command flow, or event topology; use the narrower skill first48- one local timer decision is already sufficient and no shared timing contract is needed49- the task is primarily resource spend, reservation, or rollback behavior rather than cadence semantics50- the task is primarily world-fact freshness or observation truth rather than time-source policy51- the task is a localized runtime bug investigation rather than time-policy design or review5253## Pattern5455- Primary pattern: **Tool Wrapper**56- Secondary pattern: **Reviewer**5758## Related skills and routing notes5960- Start with `game-development-behavior-architecture` if the bigger uncertainty is still which control model owns reevaluation at all.61- Pair with `game-development-state-change-notification` when the design should stop polling and move toward meaningful invalidation or state-change-driven updates.62- Pair with `game-development-world-state-facts` when the real disagreement is freshness, staleness, or observation validity rather than the clock itself.63- Pair with `game-development-resource-transaction-system` when reservation windows, cooldown-spend interactions, or delayed commit semantics depend on shared time rules.64- Hand off to `game-development-utility-ai`, `game-development-fsm`, `game-development-behavior-tree`, or `game-development-object-pool` once the clock and cadence policy are clear and the next question is subsystem behavior.6566## Diagnostic checklist6768Evaluate these questions before recommending or refining a time policy:6970| Question | Healthy sign | Warning sign |71| --- | --- | --- |72| Is there real shared timing pressure? | Several systems depend on the same cadence or clock semantics | One local timer is being over-abstracted |73| Is the time source explicit? | The authoritative clock can be named clearly | Callers read whatever time value is nearby |74| Does cadence materially affect behavior? | Polling, fixed-step, and event-driven choices lead to different outcomes | Cadence is treated as an implementation afterthought |75| Are pause and scaling rules defined? | The team can explain what pauses, what scales, and what ignores scaling | Some timers stop, some do not, and nobody knows why |76| Are cooldown semantics stable? | Cooldowns share a named clock and evaluation rule | Each caller reinvents its own elapsed-time math |77| Is drift observable? | The system can explain late, skipped, or desynced updates | Timing errors show up as vague flakiness |7879## Decision rules8081Before recommending a reusable time policy, ask whether the smaller honest answer is:8283- one local timer choice at a legitimate call site84- one scheduler or loop decision already owned by a specific subsystem85- one cooldown rule that does not need a shared clock contract86- one world-fact freshness or sensing problem rather than a timing problem87- one engine-specific integration concern rather than a cross-system time policy8889Reject a shared timing layer if it mostly renames one obvious timer without improving consistency, debuggability, or cross-system coordination.9091### Prefer a local timer decision when9293- the timing rule is simple and used in one place94- there is no shared cooldown, reevaluation, or pause contract to preserve95- abstraction would mostly hide an obvious delay or interval9697### Prefer frame-driven cadence when9899- the logic is lightweight and naturally tied to presentation or immediate responsiveness100- slight variance per frame is acceptable101- there is no strong need for deterministic step boundaries102103### Prefer fixed-step cadence when104105- the design needs stable simulation intervals or consistent step boundaries106- gameplay meaning changes if frame rate changes materially107- cooldown or accumulation logic would become misleading under variable sampling108109### Prefer event-driven or state-change-driven cadence when110111- reevaluation only matters after meaningful state transitions112- polling every frame would mostly waste work or hide ownership113- the design benefits from explicit invalidation rather than constant checking114115### Prefer sampled-clock semantics when116117- several systems need a common notion of elapsed time without sharing the same update loop118- cooldowns, delayed actions, or AI reevaluation all read from one named clock119- pause or scaling behavior must be explained independently of how each consumer runs120121### Escalate to adjacent foundations when122123- the real issue is resource reservation or commit timing rather than cadence policy124- the real issue is stale world observations rather than clock ownership125- the real issue is condition composition rather than when rules are reevaluated126127## Workflow128129Follow this sequence every time.130131### 1. Identify the timing boundary132133State what time-related question the system is trying to answer before naming loop APIs, timers, or engine callbacks.134135Examples:136137- which clock a cooldown should use138- how often AI should reevaluate139- whether an update belongs to frame, fixed-step, or event-driven cadence140- what should pause, scale, or continue while paused141142### 2. Separate time sources from time consumers143144For each important path, specify:145146- authoritative time source147- who advances or owns that source148- who samples it read-only149- whether multiple clocks exist and why150- how callers know which clock they are using151152### 3. Define cadence and sampling rules153154For each important system, decide whether work is:155156- frame-driven157- fixed-step158- event-driven159- sampled on demand160- batched or rate-limited161162Specify what makes that choice appropriate.163164### 4. Define cooldown, delay, and reevaluation semantics165166Specify:167168- what clock cooldowns use169- whether elapsed time is scaled or unscaled170- whether reevaluation is interval-based, event-driven, or hybrid171- how delayed actions or pooled-object resets measure time172173### 5. Define pause, slow-motion, and time-scale policy174175Specify:176177- what pauses178- what ignores pause179- what respects global time scale180- whether some subsystems use unscaled time intentionally181- how pause and resume affect pending timers or cooldowns182183### 6. Define drift, desync, and catch-up policy184185Specify:186187- what counts as acceptable drift188- whether late updates are skipped, caught up, or clamped189- how long frames or missed ticks are handled190- how the system distinguishes timing lag from logic failure191192### 7. Define observability and debugging expectations193194Specify:195196- what minimum timing traces or debug views are needed197- whether cooldown or reevaluation state is inspectable198- how reviewers can tell which clock a system is using199- what evidence helps confirm timing consistency across systems200201### 8. Separate timing policy from adjacent concerns202203Clarify what stays outside the time policy, such as:204205- full behavior architecture choice206- resource-spend or rollback semantics207- world-fact truth ownership208- network replay or deterministic lockstep in full209- engine-specific scheduler tutorials210211### 9. Plan the rollout212213Migrate incrementally: isolate one repeated cooldown or reevaluation family, name the clock boundary, define cadence rules, add pause and drift policy, replace divergent callers gradually, and verify before widening the timing surface.214215## Output contract216217Return the result using `assets/time-policy-template.md` in this section order.218219If the best answer is **not** a reusable time policy, still use the template and say that explicitly instead of wrapping one honest timer choice in temporal pageantry.220221Return the result in these sections:2222231. **Timing boundary**2242. **Local timer vs shared time policy decision**2253. **Time source and ownership model**2264. **Cadence and sampling design**2275. **Cooldown, delay, and reevaluation model**2286. **Pause, scaling, and drift policy**2297. **Observability and debugging notes**2308. **Related foundations and handoff notes**2319. **Engine integration notes**23210. **Migration plan**23311. **Verification notes**234235Keep the section order stable so time-policy recommendations are easy to compare across reviews and refactor passes.236237## Engine-specific notes238239### Godot / .NET240241- Keep authoritative clock choice explicit instead of letting `_Process`, `_PhysicsProcess`, timers, and scene-tree pause behavior blur together.242- If some timers must keep running while paused, state that policy directly rather than hiding it inside node configuration.243- Be careful when pooled or transient nodes own timers; the lifetime of the node should not accidentally redefine global timing semantics.244245### Unity246247- Distinguish clearly between `Update`, `FixedUpdate`, coroutine delays, and any custom scheduler or tick service.248- Make unscaled versus scaled time choices explicit where pause menus, UI, or cooldowns differ.249- Avoid letting inspector-configured intervals imply a global cadence policy if the runtime ownership story is unclear.250251### Generic C# / engine-neutral252253- Prefer named clocks and cadence rules over magic numbers scattered through callers.254- Keep reevaluation policy explicit so systems do not silently drift from event-driven to polling behavior.255- Use structured timing diagnostics only where they materially improve reviewability or runtime debugging.256257## Common pitfalls258259- abstracting one local timer into a shared timing framework with no reuse benefit260- letting every subsystem sample a different clock without naming the difference261- assuming `every frame` is automatically the right cadence for gameplay logic262- mixing scaled and unscaled time without policy clarity263- hiding pause behavior inside engine defaults nobody has documented264- making cooldown math differ between UI preview, AI evaluation, and runtime execution265- treating drift and missed ticks as mysterious flakiness instead of defined policy questions266- expanding a time-policy skill into a full determinism or networking doctrine too early267268## Companion files269270- `references/timing-shapes.md` — reusable heuristics for time-source choice, cadence boundaries, pause semantics, drift handling, and abstraction cautions271- `references/cooldown-and-reevaluation-guide.md` — reusable review guide for cooldown clocks, interval reevaluation, state-change triggering, and hybrid timing models272- `assets/time-policy-template.md` — reusable output template for returning the time-policy design or review artifact273274## Validation275276A good result should satisfy all of the following:277278- a simpler local-timer alternative was considered first279- the timing boundary is explicit280- authoritative time sources and consumers are distinguishable clearly281- cadence, cooldown, and reevaluation rules are concrete enough to review282- pause, scaling, and drift behavior are stated explicitly283- observability and debugging expectations are addressed where relevant284- rollout steps are incremental enough to verify safely285- the design does not quietly expand into resource semantics, world-fact ownership, or full networking determinism by accident286287## Completion rule288289This skill is complete when the agent has:290291- decided whether a reusable time policy is justified at all292- identified the timing boundary and authoritative clock model293- defined cadence, cooldown, reevaluation, and pause semantics294- specified drift handling, observability, and debugging expectations295- described engine integration notes where relevant296- returned a concrete migration and verification brief