Game Development State Change Notification
Use this skill when the hard part is not behavior architecture or event routing alone, but how systems announce meaningful state changes consistently without every subsystem inventing its own private notification folklore.
This skill is for designing, reviewing, or refactoring a reusable state-change notification model in gameplay, AI, UI, observer, invalidation, and coordination-heavy systems. Its job is to define what counts as a meaningful change, when change notifications should fire, what payload they should carry, when diff data is better than snapshots, how batching and invalidation should work, and how consumers avoid drowning in noisy or semantically inconsistent updates.
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 signals, Unity event channels, or equivalent framework notification surfaces.
For reusable notification shapes, payload heuristics, and abstraction cautions, see references/notification-shapes.md.
Purpose
This skill is used to:
- determine whether a reusable state-change notification model is justified at all
- define the boundary between one local callback and shared change semantics
- choose timing, payload, diff, snapshot, batching, and invalidation rules deliberately
- make consumer expectations and notification meaning explicit enough to review
- return a structured state-change design or review artifact another agent can implement incrementally
Use this skill when
Invoke this skill for requests such as:
- several systems need to react to the same state changes but currently get notified inconsistently
- observers, UI, AI, or caches keep drifting because invalidation behavior is unclear
- a team needs to distinguish noisy internal mutations from externally meaningful state changes
- diff payloads, snapshots, or change tags are being improvised per caller
- requests that explicitly mention
state change, notification, invalidation, observer update, diff, snapshot, batching, or change events
Trigger examples
- "Should this system send diffs, full snapshots, or just invalidation pings?"
- "Our UI and AI react to the same changes, but not with the same timing"
- "How do we avoid event floods when several state changes happen in one burst?"
- "Nobody can explain which changes are worth notifying versus staying local"
Do not use this skill when
Do not use this skill when:
- the hard problem is still choosing event topology, command flow, or behavior architecture; use the narrower skill first
- one local callback is already sufficient and no shared notification contract is needed
- the task is primarily truth ownership rather than change announcement semantics
- the task is primarily timing cadence rather than notification meaning or batching policy
- the task is a localized runtime bug investigation rather than notification-model design or review
Pattern
- Primary pattern: Tool Wrapper
- Secondary pattern: Generator
Related skills and routing notes
- Start with
game-development-events-and-signals if the main problem is publisher/subscriber topology, direct-call boundaries, or lifecycle wiring rather than notification meaning.
- Pair with
game-development-world-state-facts when invalidation or update semantics are really about fact freshness, truth ownership, or blackboard drift.
- Pair with
game-development-time-source-and-tick-policy when batching windows, deferred emission, or reevaluation cadence depend on explicit clock policy.
- Pair with
game-development-entity-reference-boundary when change payloads carry handles, IDs, or references that must survive delayed consumption safely.
- Hand off to
game-development-utility-ai or game-development-coordinator once shared change semantics are clear and the next question is how downstream systems react to them.
Diagnostic checklist
Evaluate these questions before recommending or refining a state-change notification model:
| Question |
Healthy sign |
Warning sign |
| Is there real shared notification pressure? |
Several consumers need the same change semantics |
One local callback is being over-abstracted |
| Is the change boundary explicit? |
The team can explain which changes are externally meaningful |
Every mutation threatens to emit something |
| Are timing rules clear? |
Consumers know when updates arrive relative to the change |
Notification timing is implicit and caller-specific |
| Is payload meaning stable? |
Diff, snapshot, or invalidation-only payloads have named semantics |
Consumers guess what each payload means |
| Are batching and flood control deliberate? |
Burst changes have explicit grouping or suppression rules |
Notification spam is treated as normal |
| Is invalidation reviewable? |
The system can explain who must refresh and why |
Caches or observers quietly go stale with no clear trigger |
Decision rules
Before recommending a reusable state-change notification model, ask whether the smaller honest answer is:
- one local callback at a legitimate boundary
- one subsystem-private invalidation hook
- one world-fact freshness problem rather than a notification problem
- one timing or reevaluation policy issue rather than a change-announcement issue
- one event-topology problem rather than payload or change-boundary semantics
Reject a shared notification layer if it mostly renames obvious callbacks without improving shared meaning, timing clarity, or consumer consistency.
Prefer a local callback when
- the change is local and only one nearby consumer cares
- there is no need for shared payload or invalidation semantics
- abstraction would mostly hide one obvious owner and effect
Prefer invalidation-only notifications when
- consumers only need to know that cached or derived state is no longer trustworthy
- the refreshed value is expensive or better resolved on demand
- sending full payload data would mostly duplicate authoritative reads
Prefer diff payloads when
- consumers materially benefit from knowing what changed instead of re-reading everything
- change granularity matters for performance or behavior
- the system can explain diff semantics consistently
Prefer snapshot payloads when
- consumers need a coherent post-change view
- diff logic would be more error-prone than a stable snapshot contract
- batching or consolidation makes a single full update clearer than several tiny deltas
Prefer batching or coalescing when
- one logical update produces several low-level mutations
- notification bursts would otherwise create redundant work or noisy state churn
- consumers care about meaningful update windows rather than every microscopic step
Escalate to adjacent foundations when
- the real issue is event routing topology rather than notification semantics
- the real issue is world-fact freshness rather than change payload meaning
- the real issue is time cadence rather than batching or invalidation boundaries
- the real issue is condition or scoring reevaluation rules rather than generic change signaling
Workflow
Follow this sequence every time.
1. Identify the change boundary
State what change-related question the system is trying to answer before naming buses, signals, or observer lists.
Examples:
- which mutations deserve external notification
- whether consumers need a diff or a snapshot
- when caches or planners must invalidate derived state
- whether a burst of updates should coalesce into one meaningful change
2. Separate local mutations from meaningful external changes
List the important change families explicitly.
Typical categories:
- purely local internal mutations
- externally meaningful state changes
- invalidation-only changes
- batched or consolidated updates
- replay or audit-relevant changes, if any
3. Define timing and emission rules
Specify:
- when notifications fire relative to mutation
- whether notifications are immediate, deferred, frame-batched, or transaction-batched
- who owns emission timing
- whether consumers may observe intermediate states or only consolidated ones
4. Define payload shape and semantics
Specify:
- whether payloads are diffs, snapshots, tags, or invalidation notices
- what minimum fields consumers may rely on
- how absent, partial, or coalesced change data is represented
- what payloads should never carry
5. Define batching, suppression, and invalidation policy
Specify:
- when multiple changes collapse into one notification
- what redundant notifications may be suppressed
- how invalidation differs from full update notification
- who owns recomputation or refresh after invalidation
6. Define consumer expectations and debugging visibility
Specify:
- what consumers may assume about ordering and completeness
- how reviewers inspect notification timing and payload meaning
- what diagnostics classify dropped, coalesced, or noisy updates
- what evidence shows consumers are responding to the same change semantics
7. Separate state-change notification from adjacent concerns
Clarify what stays outside the notification model, such as:
- event routing topology in full
- world-fact ownership in full
- timing policy in full
- behavior architecture selection
- generic pub-sub frameworks as an end in themselves
8. Plan the rollout
Migrate incrementally: isolate one drifting change family, define meaningful change boundaries, choose diff or snapshot rules, add invalidation semantics, coalesce burst updates where needed, replace inconsistent consumers gradually, and verify before widening the notification surface.
Output contract
Return the result using assets/state-change-brief-template.md in this section order.
If the best answer is not a reusable notification model, still use the template and say that explicitly instead of wrapping one honest callback in event theater.
Return the result in these sections:
- Change boundary
- Local callback vs shared notification model decision
- Notification timing and emission rules
- Payload shape and diff-vs-snapshot policy
- Batching, suppression, and invalidation rules
- Consumer expectations and debugging notes
- Related foundations and handoff notes
- Engine integration notes
- Migration plan
- Verification notes
Keep the section order stable so state-change recommendations are easy to compare across reviews and refactor passes.
Engine-specific notes
Godot / .NET
- Be explicit about whether a change signal is engine-facing UI glue, gameplay-facing semantic notification, or both.
- Do not let convenient signal emission points silently define the true change boundary for the whole system.
- Be careful when several node-level mutations happen in one frame but only one gameplay-meaningful change should be observed.
Unity
- Distinguish clearly between local callbacks, event-channel patterns, and gameplay-level change semantics.
- Avoid making inspector-wired events the sole definition of payload meaning or batching policy.
- Be explicit when consumers should re-read authoritative state instead of trusting a serialized or convenience payload.
Generic C# / engine-neutral
- Prefer named notification families and payload contracts over generic
OnChanged events everywhere.
- Keep diff and snapshot semantics explicit so consumers do not guess at missing data.
- Use structured notification diagnostics only where they materially improve debugging or reviewability.
Common pitfalls
- abstracting one local callback into a shared event framework with no reuse benefit
- treating every low-level mutation as a meaningful external change
- mixing diff, snapshot, and invalidation payloads without naming the semantics
- letting notification timing drift across callers with no clear contract
- flooding consumers with redundant updates instead of batching or coalescing
- hiding dropped or suppressed changes until caches or UI drift mysteriously
- turning a notification skill into a full event-topology doctrine or infrastructure obsession
- accidentally using notification payloads as the sole source of truth instead of a consumer aid
Companion files
references/notification-shapes.md — reusable heuristics for change boundaries, payload types, diff-vs-snapshot trade-offs, and abstraction cautions
references/invalidation-and-batching.md — reusable review guide for invalidation semantics, batching, suppression, consumer refresh rules, and noisy-update handling
assets/state-change-brief-template.md — reusable output template for returning the state-change design or review artifact
Validation
A good result should satisfy all of the following:
- a simpler local-callback alternative was considered first
- the change boundary is explicit
- timing, payload, and invalidation semantics are distinguished clearly
- batching and suppression rules are concrete enough to review
- consumer expectations and debugging visibility are addressed where relevant
- rollout steps are incremental enough to verify safely
- the design does not quietly expand into world-facts, timing doctrine, or full event-topology architecture by accident
Completion rule
This skill is complete when the agent has:
- decided whether a reusable notification model is justified at all
- identified the change boundary and notification families
- defined timing, payload, batching, and invalidation semantics
- specified consumer expectations and debugging visibility
- described engine integration notes where relevant
- returned a concrete migration and verification brief
1---2name: game-development-state-change-notification3description: Use when a cross-engine gameplay task needs a Layer 1 foundation for change callbacks, invalidation signals, observer updates, or diff-vs-snapshot semantics, and the agent must define or review a reusable state-change notification model with explicit change boundaries, timing rules, payload shape, batching policy, and invalidation semantics.4---56# Game Development State Change Notification78Use this skill when the hard part is not behavior architecture or event routing alone, but **how systems announce meaningful state changes consistently without every subsystem inventing its own private notification folklore**.910This skill is for designing, reviewing, or refactoring a reusable state-change notification model in gameplay, AI, UI, observer, invalidation, and coordination-heavy systems. Its job is to define what counts as a meaningful change, when change notifications should fire, what payload they should carry, when diff data is better than snapshots, how batching and invalidation should work, and how consumers avoid drowning in noisy or semantically inconsistent updates.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 signals, Unity event channels, or equivalent framework notification surfaces.1314For reusable notification shapes, payload heuristics, and abstraction cautions, see `references/notification-shapes.md`.1516## Purpose1718This skill is used to:1920- determine whether a reusable state-change notification model is justified at all21- define the boundary between one local callback and shared change semantics22- choose timing, payload, diff, snapshot, batching, and invalidation rules deliberately23- make consumer expectations and notification meaning explicit enough to review24- return a structured state-change design or review artifact another agent can implement incrementally2526## Use this skill when2728Invoke this skill for requests such as:2930- several systems need to react to the same state changes but currently get notified inconsistently31- observers, UI, AI, or caches keep drifting because invalidation behavior is unclear32- a team needs to distinguish noisy internal mutations from externally meaningful state changes33- diff payloads, snapshots, or change tags are being improvised per caller34- requests that explicitly mention `state change`, `notification`, `invalidation`, `observer update`, `diff`, `snapshot`, `batching`, or `change events`3536### Trigger examples3738- "Should this system send diffs, full snapshots, or just invalidation pings?"39- "Our UI and AI react to the same changes, but not with the same timing"40- "How do we avoid event floods when several state changes happen in one burst?"41- "Nobody can explain which changes are worth notifying versus staying local"4243## Do not use this skill when4445Do not use this skill when:4647- the hard problem is still choosing event topology, command flow, or behavior architecture; use the narrower skill first48- one local callback is already sufficient and no shared notification contract is needed49- the task is primarily truth ownership rather than change announcement semantics50- the task is primarily timing cadence rather than notification meaning or batching policy51- the task is a localized runtime bug investigation rather than notification-model design or review5253## Pattern5455- Primary pattern: **Tool Wrapper**56- Secondary pattern: **Generator**5758## Related skills and routing notes5960- Start with `game-development-events-and-signals` if the main problem is publisher/subscriber topology, direct-call boundaries, or lifecycle wiring rather than notification meaning.61- Pair with `game-development-world-state-facts` when invalidation or update semantics are really about fact freshness, truth ownership, or blackboard drift.62- Pair with `game-development-time-source-and-tick-policy` when batching windows, deferred emission, or reevaluation cadence depend on explicit clock policy.63- Pair with `game-development-entity-reference-boundary` when change payloads carry handles, IDs, or references that must survive delayed consumption safely.64- Hand off to `game-development-utility-ai` or `game-development-coordinator` once shared change semantics are clear and the next question is how downstream systems react to them.6566## Diagnostic checklist6768Evaluate these questions before recommending or refining a state-change notification model:6970| Question | Healthy sign | Warning sign |71| --- | --- | --- |72| Is there real shared notification pressure? | Several consumers need the same change semantics | One local callback is being over-abstracted |73| Is the change boundary explicit? | The team can explain which changes are externally meaningful | Every mutation threatens to emit something |74| Are timing rules clear? | Consumers know when updates arrive relative to the change | Notification timing is implicit and caller-specific |75| Is payload meaning stable? | Diff, snapshot, or invalidation-only payloads have named semantics | Consumers guess what each payload means |76| Are batching and flood control deliberate? | Burst changes have explicit grouping or suppression rules | Notification spam is treated as normal |77| Is invalidation reviewable? | The system can explain who must refresh and why | Caches or observers quietly go stale with no clear trigger |7879## Decision rules8081Before recommending a reusable state-change notification model, ask whether the smaller honest answer is:8283- one local callback at a legitimate boundary84- one subsystem-private invalidation hook85- one world-fact freshness problem rather than a notification problem86- one timing or reevaluation policy issue rather than a change-announcement issue87- one event-topology problem rather than payload or change-boundary semantics8889Reject a shared notification layer if it mostly renames obvious callbacks without improving shared meaning, timing clarity, or consumer consistency.9091### Prefer a local callback when9293- the change is local and only one nearby consumer cares94- there is no need for shared payload or invalidation semantics95- abstraction would mostly hide one obvious owner and effect9697### Prefer invalidation-only notifications when9899- consumers only need to know that cached or derived state is no longer trustworthy100- the refreshed value is expensive or better resolved on demand101- sending full payload data would mostly duplicate authoritative reads102103### Prefer diff payloads when104105- consumers materially benefit from knowing what changed instead of re-reading everything106- change granularity matters for performance or behavior107- the system can explain diff semantics consistently108109### Prefer snapshot payloads when110111- consumers need a coherent post-change view112- diff logic would be more error-prone than a stable snapshot contract113- batching or consolidation makes a single full update clearer than several tiny deltas114115### Prefer batching or coalescing when116117- one logical update produces several low-level mutations118- notification bursts would otherwise create redundant work or noisy state churn119- consumers care about meaningful update windows rather than every microscopic step120121### Escalate to adjacent foundations when122123- the real issue is event routing topology rather than notification semantics124- the real issue is world-fact freshness rather than change payload meaning125- the real issue is time cadence rather than batching or invalidation boundaries126- the real issue is condition or scoring reevaluation rules rather than generic change signaling127128## Workflow129130Follow this sequence every time.131132### 1. Identify the change boundary133134State what change-related question the system is trying to answer before naming buses, signals, or observer lists.135136Examples:137138- which mutations deserve external notification139- whether consumers need a diff or a snapshot140- when caches or planners must invalidate derived state141- whether a burst of updates should coalesce into one meaningful change142143### 2. Separate local mutations from meaningful external changes144145List the important change families explicitly.146147Typical categories:148149- purely local internal mutations150- externally meaningful state changes151- invalidation-only changes152- batched or consolidated updates153- replay or audit-relevant changes, if any154155### 3. Define timing and emission rules156157Specify:158159- when notifications fire relative to mutation160- whether notifications are immediate, deferred, frame-batched, or transaction-batched161- who owns emission timing162- whether consumers may observe intermediate states or only consolidated ones163164### 4. Define payload shape and semantics165166Specify:167168- whether payloads are diffs, snapshots, tags, or invalidation notices169- what minimum fields consumers may rely on170- how absent, partial, or coalesced change data is represented171- what payloads should never carry172173### 5. Define batching, suppression, and invalidation policy174175Specify:176177- when multiple changes collapse into one notification178- what redundant notifications may be suppressed179- how invalidation differs from full update notification180- who owns recomputation or refresh after invalidation181182### 6. Define consumer expectations and debugging visibility183184Specify:185186- what consumers may assume about ordering and completeness187- how reviewers inspect notification timing and payload meaning188- what diagnostics classify dropped, coalesced, or noisy updates189- what evidence shows consumers are responding to the same change semantics190191### 7. Separate state-change notification from adjacent concerns192193Clarify what stays outside the notification model, such as:194195- event routing topology in full196- world-fact ownership in full197- timing policy in full198- behavior architecture selection199- generic pub-sub frameworks as an end in themselves200201### 8. Plan the rollout202203Migrate incrementally: isolate one drifting change family, define meaningful change boundaries, choose diff or snapshot rules, add invalidation semantics, coalesce burst updates where needed, replace inconsistent consumers gradually, and verify before widening the notification surface.204205## Output contract206207Return the result using `assets/state-change-brief-template.md` in this section order.208209If the best answer is **not** a reusable notification model, still use the template and say that explicitly instead of wrapping one honest callback in event theater.210211Return the result in these sections:2122131. **Change boundary**2142. **Local callback vs shared notification model decision**2153. **Notification timing and emission rules**2164. **Payload shape and diff-vs-snapshot policy**2175. **Batching, suppression, and invalidation rules**2186. **Consumer expectations and debugging notes**2197. **Related foundations and handoff notes**2208. **Engine integration notes**2219. **Migration plan**22210. **Verification notes**223224Keep the section order stable so state-change recommendations are easy to compare across reviews and refactor passes.225226## Engine-specific notes227228### Godot / .NET229230- Be explicit about whether a change signal is engine-facing UI glue, gameplay-facing semantic notification, or both.231- Do not let convenient signal emission points silently define the true change boundary for the whole system.232- Be careful when several node-level mutations happen in one frame but only one gameplay-meaningful change should be observed.233234### Unity235236- Distinguish clearly between local callbacks, event-channel patterns, and gameplay-level change semantics.237- Avoid making inspector-wired events the sole definition of payload meaning or batching policy.238- Be explicit when consumers should re-read authoritative state instead of trusting a serialized or convenience payload.239240### Generic C# / engine-neutral241242- Prefer named notification families and payload contracts over generic `OnChanged` events everywhere.243- Keep diff and snapshot semantics explicit so consumers do not guess at missing data.244- Use structured notification diagnostics only where they materially improve debugging or reviewability.245246## Common pitfalls247248- abstracting one local callback into a shared event framework with no reuse benefit249- treating every low-level mutation as a meaningful external change250- mixing diff, snapshot, and invalidation payloads without naming the semantics251- letting notification timing drift across callers with no clear contract252- flooding consumers with redundant updates instead of batching or coalescing253- hiding dropped or suppressed changes until caches or UI drift mysteriously254- turning a notification skill into a full event-topology doctrine or infrastructure obsession255- accidentally using notification payloads as the sole source of truth instead of a consumer aid256257## Companion files258259- `references/notification-shapes.md` — reusable heuristics for change boundaries, payload types, diff-vs-snapshot trade-offs, and abstraction cautions260- `references/invalidation-and-batching.md` — reusable review guide for invalidation semantics, batching, suppression, consumer refresh rules, and noisy-update handling261- `assets/state-change-brief-template.md` — reusable output template for returning the state-change design or review artifact262263## Validation264265A good result should satisfy all of the following:266267- a simpler local-callback alternative was considered first268- the change boundary is explicit269- timing, payload, and invalidation semantics are distinguished clearly270- batching and suppression rules are concrete enough to review271- consumer expectations and debugging visibility are addressed where relevant272- rollout steps are incremental enough to verify safely273- the design does not quietly expand into world-facts, timing doctrine, or full event-topology architecture by accident274275## Completion rule276277This skill is complete when the agent has:278279- decided whether a reusable notification model is justified at all280- identified the change boundary and notification families281- defined timing, payload, batching, and invalidation semantics282- specified consumer expectations and debugging visibility283- described engine integration notes where relevant284- returned a concrete migration and verification brief