Help us improve
Share bugs, ideas, or general feedback.
From claude-commands
Reference for agent routing priority and modal lock patterns in a WorldArchitect application. Covers route ordering, stale flag guards, and cross-modal isolation to prevent incorrect modal activation.
npx claudepluginhub jleechanorg/claude-commands --plugin claude-commandsHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-commands:agentsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**COMPACTNESS RULE**: Keep this file under 200 lines. Link to code instead of duplicating implementation details.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
COMPACTNESS RULE: Keep this file under 200 lines. Link to code instead of duplicating implementation details.
Error Handling: Warnings only - no assertions, retries, or default content. Log issues explicitly and let validation catch failures rather than silently backfilling missing data.
Routing order in get_agent_for_input():
GOD MODE: prefix)Problem: Leftover flags (e.g., level_up_pending=True) from previous modal sessions can incorrectly reactivate modals.
Solution: Check for explicit False flags that indicate intentional deactivation:
# In agents.py get_agent_for_input():
level_up_in_progress = custom_state.get("level_up_in_progress")
if level_up_in_progress is False: # Explicit False = stale guard
level_up_modal_active = False
level_up_pending_flag = custom_state.get("level_up_pending")
if level_up_pending_flag is False and not bool(level_up_in_progress):
level_up_modal_active = False
Why: None (unset) vs False (explicit guard) distinction prevents modal reactivation from stale data.
Problem: Character creation lock was protecting ALL custom_state flags, including level-up flags.
Solution: Scoped protection per modal type (world_logic.py _should_protect_field()):
level_up_in_progress=True)Modal activates when ANY of these are true:
level_up_in_progress=True (explicit in-progress flag)level_up_pending=True (pending flag from rewards)rewards_pending.level_up_available=True (rewards system signal)Prevented by stale guards: If level_up_in_progress=False or level_up_pending=False explicitly set, modal won't activate.
Modal exit enforcement via server-side choice injection:
# In _inject_modal_finish_choice_if_needed():
# 1. Uses pre-update state (not post-update) to prevent race conditions
# 2. Checks modal is active (no stale guards blocking)
# 3. Adds canonical finish choice as LAST item in planning_block.choices
# 4. Uses structured_fields["planning_block"] not structured_response (preserves injection)
Key fix: Use current_game_state_dict (pre-update) instead of updated_game_state_dict to avoid race condition where LLM sets level_up_in_progress=False in same turn.
Level-up and character creation modals freeze game time:
# In world_logic.py should_freeze_time():
is_char_creation = not custom_state.get("character_creation_completed", False)
is_level_up_mode = custom_state.get("level_up_in_progress", False) or \
custom_state.get("level_up_pending", False)
return is_char_creation or is_level_up_mode
| Issue | Root Cause | Fix Location | Fix |
|---|---|---|---|
| Modal bypass | level_up_pending=True didn't activate lock | agents.py:2871-2876 | Added pending flag to activation logic |
| Routing inconsistency | Injection used different detection logic than routing | agents.py + world_logic.py | Unified stale flag guards |
| Cross-modal interference | Char creation protected level-up flags | world_logic.py _should_protect_field() | Scoped protection per modal |
| Finish choice position | LLM response overwrote server injection | world_logic.py:5414 | Use structured_fields not structured_response |
| Stale reactivation | Old flags reactivated completed modals | agents.py:2864-2876 | Check explicit False flags |
Unit Tests ($PROJECT_ROOT/tests/):
test_rev_439p_modal_bypass.py - Activation with level_up_pending=Truetest_rev_0g1y_inconsistent_detection.py - Stale flag guard consistencytest_world_logic.py::TestModalLockFlagScoping - Cross-modal isolationE2E Tests (testing_mcp/creation/):
test_level_up_modal_flow_real.py - Full modal lifecycle with real LLMtest_character_creation_agent_real_e2e.py - Character creation flowsAgent matching check order:
matches_game_state(game_state)matches_input(user_input)Modal debugging:
level_up_in_progress, level_up_pending, rewards_pending.level_up_availableFalse values blocking activationcharacter_creation_completed not interfering with level-upSee also:
.claude/skills/character-creation-modal-exit.md - Character creation specific patterns$PROJECT_ROOT/agents.py - Full implementation (lines 2739-3200)$PROJECT_ROOT/world_logic.py - Modal injection and protection (lines 1800-1900, 5400-5500)