Skip to content

Instantly share code, notes, and snippets.

@jleechan2015
Created May 24, 2026 05:31
Show Gist options
  • Select an option

  • Save jleechan2015/f3e9c8efaab34c5aefe5d99ac61e4ef7 to your computer and use it in GitHub Desktop.

Select an option

Save jleechan2015/f3e9c8efaab34c5aefe5d99ac61e4ef7 to your computer and use it in GitHub Desktop.
PR7064 browser UI evidence (ZFC level-up lockout/modal guard)

Evidence Package: ui_level_up_rewards_planning_atomicity_browser

Package Manifest

  • Test Name: ui_level_up_rewards_planning_atomicity_browser
  • Run ID: ui_level_up_rewards_planning_atomicity_browser-002-20260524T035248
  • Iteration: 2
  • Bundle Version: 1.2.0
  • Collected At (UTC): 2026-05-24T03:52:48.108080+00:00
  • Repository: worldarchitect.ai
  • Branch: pr6958-zfc-evidence-followups
  • Commit: f0849cd47358a002b55ad0911d535253cb6b7b91
  • Merge Base: e6ab5b1cbabcb98b7230ec21cc2699b98154595a
  • Commits Ahead of Main: 25

Git Provenance

.beads/issues.jsonl                                |    13 +
 .claude/skills/code-standards/SKILL.md             |    14 +-
 .claude/skills/repro-twin-clone-evidence/SKILL.md  |    14 +-
 docs/evidence/pr-7064/README.md                    |    79 +
 docs/evidence/pr-7064/README.md.sha256             |     1 +
 docs/evidence/pr-7064/artifacts/collection_log.txt |    35 +
 .../pr-7064/artifacts/collection_log.txt.sha256    |     1 +
 docs/evidence/pr-7064/artifacts/lsof_output.txt    |     3 +
 .../pr-7064/artifacts/lsof_output.txt.sha256       |     1 +
 docs/evidence/pr-7064/artifacts/ps_output.txt      |     2 +
 .../pr-7064/artifacts/ps_output.txt.sha256         |     1 +
 docs/evidence/pr-7064/artifacts/server.log         | 18439 +++++++++++++++++++
 docs/evidence/pr-7064/artifacts/server.log.sha256  |     1 +
 .../Organic Level-Up Progression Test_avafxHQ5.txt |   349 +
 ...el-Up Progression Test_avafxHQ5_game_state.json |   331 +
 .../pr-7064/campaigns/avafxHQ50msKBdKQKmI5.json    |   380 +
 .../campaigns/avafxHQ50msKBdKQKmI5.json.sha256     |     1 +
 docs/evidence/pr-7064/evidence.md                  |    72 +
 docs/evidence/pr-7064/evidence.md.sha256           |     1 +
 .../pr-7064/gemini_http_request_responses.jsonl    |    34 +
 .../gemini_http_request_responses.jsonl.sha256     |     1 +
 ...mini_http_request_responses_1779593448252.jsonl |    34 +
 docs/evidence/pr-7064/http_request_responses.jsonl |   842 +
 .../pr-7064/http_request_responses.jsonl.sha256    |     1 +
 .../http_request_responses_1779593448252.jsonl     |   842 +
 docs/evidence/pr-7064/llm_request_responses.jsonl  |    34 +
 .../pr-7064/llm_request_responses.jsonl.sha256     |     1 +
 .../llm_request_responses_1779593448252.jsonl      |    34 +
 docs/evidence/pr-7064/metadata.json                |   107 +
 docs/evidence/pr-7064/metadata.json.sha256         |     1 +
 docs/evidence/pr-7064/methodology.md               |    38 +
 docs/evidence/pr-7064/methodology.md.sha256        |     1 +
 docs/evidence/pr-7064/notes.md                     |    33 +
 docs/evidence/pr-7064/notes.md.sha256              |     1 +
 ...ini-3-flash-preview_single_organic_level_up.txt |    38 +
 ...lash-preview_single_organic_level_up.txt.sha256 |     1 +
 .../raw_unknown_model_evidence_signature_guard.txt |     1 +
 ...known_model_evidence_signature_guard.txt.sha256 |     1 +
 ...n_model_finish_intent_prompt_and_classifier.txt |     1 +
 ..._finish_intent_prompt_and_classifier.txt.sha256 |     1 +
 .../pr-7064/replay_fixture_source_manifest.json    |    67 +
 docs/evidence/pr-7064/request_responses.jsonl      |    76 +
 .../pr-7064/request_responses.jsonl.sha256         |     1 +
 docs/evidence/pr-7064/run.json                     |   178 +
 docs/evidence/pr-7064/run.json.sha256              |     1 +
 .../pr-7064/scenario_results_checkpoint.json       |     1 +
 .../scenario_results_checkpoint.json.sha256        |     1 +
 docs/evidence/pr-7064/streaming_evidence.json      |    27 +
 .../pr-7064/streaming_evidence.json.sha256         |     1 +
 docs/evidence/pr-7064/test_console_output.txt      |    82 +
 .../pr-7064/test_console_output.txt.sha256         |     1 +
 docs/evidence/pr-7064/test_level_up_organic.cast   |   119 +
 .../pr-7064/test_level_up_organic.cast.sha256      |     1 +
 mvp_site/agents.py                                 |    37 +-
 mvp_site/backend_adjustment_registry.py            |   867 +-
 mvp_site/frontend_v1/app.js                        |    33 +-
 mvp_site/game_state.py                             |    39 +-
 mvp_site/llm_service.py                            |   110 +
 mvp_site/prompts/level_up_instruction.md           |    37 +
 mvp_site/prompts/planning_protocol.md              |    24 +-
 mvp_site/rewards_engine.py                         |    14 +
 mvp_site/schemas/prompt_tool_contracts.json        |     4 +-
 .../frontend/test_app_js_structured_fields.js      |     2 +-
 .../test_agent_routing_with_state_validation.py    |     2 +-
 mvp_site/tests/test_backend_adjustment_registry.py |    93 +-
 mvp_site/tests/test_llm_service_context.py         |    15 +-
 mvp_site/tests/test_rewards_engine.py              |    67 +
 mvp_site/tests/test_world_logic.py                 |   421 +
 mvp_site/world_logic.py                            |    94 +-
 roadmap/README.md                                  |     1 +
 ...teps-2026-05-24-pr6958-adjuster-registration.md |   126 +
 ...-05-24-pr7048-location-centralization-review.md |    72 +
 scripts/copy_campaign.py                           |     9 +
 testing_mcp/core/test_level_up_organic.py          |     2 +-
 testing_mcp/lib/base_test.py                       |    32 +-
 .../lib/llm_response_cache/prompt_fingerprint.py   |     5 +
 testing_mcp/lib/llm_response_cache/server_cache.py |   236 +
 77 files changed, 24568 insertions(+), 115 deletions(-)

Server Runtime

  • Port: 8074
  • PID: 75341
  • Command: /opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info

Environment Variables

  • WORLDAI_DEV_MODE: true
  • TESTING: None
  • MOCK_SERVICES_MODE: false
  • GOOGLE_APPLICATION_CREDENTIALS: [SET - file:serviceAccountKey.json]
  • WORLDAI_GOOGLE_APPLICATION_CREDENTIALS: [SET - file:serviceAccountKey.json]
  • FIRESTORE_EMULATOR_HOST: None
  • PORT: 8074
  • FIREBASE_PROJECT_ID: worldarchitecture-ai
  • GEMINI_API_KEY: [SET - 39 chars]
  • LLM_REQUEST_RESPONSE_CAPTURE_PATH: /tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_llm_request_responses.jsonl
  • HTTP_REQUEST_RESPONSE_CAPTURE_PATH: /tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_http_request_responses.jsonl
  • GEMINI_HTTP_REQUEST_RESPONSE_CAPTURE_PATH: /tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_gemini_http_request_responses.jsonl
  • MCP_TEST_PROVIDER_HTTP_CAPTURE_PATH: None

Files in This Bundle

  • README.md - This manifest
  • methodology.md - Testing methodology
  • evidence.md - Evidence summary with Claim→Artifact Map and Coverage Matrix
  • notes.md - Additional context, TODOs, follow-ups
  • metadata.json - Machine-readable metadata
  • assertions.json - Strict before/after parity assertions (if present)
  • run.json - Test results
    • streaming_evidence.json - Normalized streaming evidence summary
    • request_responses.jsonl - Raw MCP request/response payloads (if present)
    • llm_request_responses.jsonl - Raw LLM request/response payloads (if present)
    • http_request_responses.jsonl - Raw local-server HTTP request/response payloads (if present)
    • gemini_http_request_responses.jsonl - Raw Gemini transport HTTP traces (if present)
    • artifacts/ - Additional evidence files
{
"trace": [
{
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"step": "campaign_created"
},
{
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"step": "seed_pending_level_up"
},
{
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"has_planning_block": true,
"has_rewards_box": true,
"step": "pending_level_up_projection_response",
"success": true
},
{
"state": "not_needed",
"step": "character_creation_state"
},
{
"entries": [
{
"choiceIds": [],
"hasLevelUpChoices": false,
"hasPlanningBlock": false,
"hasRewardsBox": false,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": false,
"index": 0,
"planningText": "",
"rewardsText": "",
"text": "God: Character: A curious scholar seeking forgotten knowledge. | Setting: A quiet library filled with ancient tomes | Description: Browser test campaign"
},
{
"choiceIds": [
"ai_generated",
"standard_dnd",
"custom_class"
],
"hasLevelUpChoices": false,
"hasPlanningBlock": true,
"hasRewardsBox": false,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": false,
"index": 1,
"planningText": "The campaign is initializing. I need to present the character creation methods to the player to establish the mechanical foundation of the character.\nOption 1: [AIGenerated]: I will generate a complete character sheet based on your scholar concept, including stats, skills, and equipment.\nOption 2: [StandardDND]: We will go through a step-by-step D&D 5e creation process (Race, Class, Ability Scores, etc.).\nOption 3: [CustomClass]: We will design a unique, custom class specifically for your scholarly pursuits.",
"rewardsText": "",
"text": "[SESSION_HEADER]\nTimestamp: 1492 DR, Hammer 1, 09:00:00\nLocation: The Great Library\nStatus: New Character | HP: --/-- | XP: 0/300 | Gold: 0gp\n Equipment\n Stats\n Spells\n\ud83d\udcca Resources: HD: 0/0, Spells: No Spells Yet (Level 1 pending)\n\nScene #1: [CHARACTER CREATION - Initial Choice]\n\nWelcome to your adventure. We are initializing the world based on your concept: a curious scholar seeking forgotten knowledge within the silent, dust-moted halls of a great library. Before we begin the story, we must forge your identity.\n\n**CAMPAIGN SUMMARY**\n**Title:** The Forgotten Archive\n**Character:** A curious scholar seeking forgotten knowledge.\n**Setting:** A quiet library filled with ancient tomes.\n**Description:** Browser test campaign.\n**AI Personalities:** StoryModeAgent, PlanningAgent, LevelUpAgent, FactionManagementAgent.\n**Options:** Faction Minigame (Available), Spicy Mode (Available).\n\nHow would you like to create your scholar?\n\nThe campaign is initializing. I need to present the character creation methods to the player to establish the mechanical foundation of the character.\nOption 1: [AIGenerated]: I will generate a complete character sheet based on your scholar concept, including stats, skills, and equipment.\nOption 2: [StandardDND]: We will go through a step-by-step D&D 5e creation process (Race, Class, Ability Scores, etc.).\nOption 3: [CustomClass]: We will design a unique, custom class specifically for your scholarly pursuits."
},
{
"choiceIds": [],
"hasLevelUpChoices": false,
"hasPlanningBlock": false,
"hasRewardsBox": false,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": false,
"index": 2,
"planningText": "",
"rewardsText": "",
"text": "Main Character: Start Adventure"
},
{
"choiceIds": [
"engage_melee",
"intimidate_goblin"
],
"hasLevelUpChoices": false,
"hasPlanningBlock": true,
"hasRewardsBox": false,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": false,
"index": 3,
"planningText": "A goblin has infiltrated the library and is stealing a manuscript. Since I am a Fighter, I should engage it before it can damage the archive or escape. I need to determine turn order.\nCombat initiation in the Great Library\nDraw Weapon and Engage: Close the distance and attack the goblin with your primary weapon.\nPros: Neutralize the threat quickly, Protect the nearby scrolls\nCons: Exposes you to a counter-attack\nIntimidate the Creature: Use your physical presence and a commanding shout to force the goblin to drop the book.\nPros: Might avoid a messy fight in the library\nCons: If it fails, the goblin gets a free move",
"rewardsText": "",
"text": "[SESSION_HEADER]\nTimestamp: 1492 DR, Hammer 1, 09:00:00\nLocation: The Great Library\nStatus: Lvl 1 Fighter | HP: 12/12 | XP: 0/300 | Gold: 10gp\nConditions: Normal | Exhaustion: 0 | Inspiration: No\n Equipment\n Stats\n Spells\n\ud83d\udccd Location: The Great Library\n\ud83d\udcca Resources: HD: 1/1 | Spells: No Spells Yet (Lvl 2+) | Second Wind: 1/1 | Action Surge: 1/1\n\nScene #2: Morning (09:00:00) in the Great Library\u2014the air is thick with the scent of aged parchment and the soft, rhythmic scratching of quills. You, Aric (Lvl 1), sit at a heavy mahogany desk, surrounded by stacks of tomes that whisper of forgotten eras. Sunlight streams through the vaulted windows, illuminating dust motes that dance over a particularly brittle scroll you've been translating.\n\nSuddenly, the tranquil silence is shattered. A heavy book thuds to the floor in the next aisle, followed by a high-pitched, raspy giggle. A small, green-skinned figure with jagged teeth and malicious yellow eyes\u2014a Goblin (Lvl 1)\u2014scrambles onto a bookshelf, clutching a rare manuscript. It snarls at you, pulling a rusty scimitar from its belt as it prepares to defend its stolen prize.\n\n[Mode: STORY MODE - COMBAT INITIATED]\n\nA goblin has infiltrated the library and is stealing a manuscript. Since I am a Fighter, I should engage it before it can damage the archive or escape. I need to determine turn order.\nCombat initiation in the Great Library\nDraw Weapon and Engage: Close the distance and attack the goblin with your primary weapon.\nPros: Neutralize the threat quickly, Protect the nearby scrolls\nCons: Exposes you to a counter-attack\nIntimidate the Creature: Use your physical presence and a commanding shout to force the goblin to drop the book.\nPros: Might avoid a messy fight in the library\nCons: If it fails, the goblin gets a free move"
},
{
"choiceIds": [],
"hasLevelUpChoices": false,
"hasPlanningBlock": false,
"hasRewardsBox": false,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": false,
"index": 4,
"planningText": "",
"rewardsText": "",
"text": "Main Character: I pause to take stock of what I just learned and the power now within reach."
},
{
"choiceIds": [
"level_up_now",
"engage_melee",
"intimidate_goblin"
],
"hasLevelUpChoices": true,
"hasPlanningBlock": true,
"hasRewardsBox": true,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": true,
"index": 5,
"planningText": "The player is pausing to 'take stock,' which I am interpreting as a strategic 'Think' request combined with an acknowledgement of the available level-up. Since Aric is a Level 1 Fighter with 300 XP, he is eligible for Level 2. In combat, this represents a moment of intense focus. I need to assess the quality of this tactical pause.\nMid-combat tactical assessment and level-up consideration\nEmbrace the Surge (Level Up to 2): Take a moment to center yourself and unlock your Level 2 Fighter capabilities (including Action Surge) before engaging.\nPros: Increases HP and grants Action Surge immediately, Higher combat effectiveness\nCons: None (Time is frozen for this meta-action)\nAttack Immediately: Don't wait for the power to settle; draw your weapon and strike the goblin now.\nPros: Prevents the goblin from acting first, Protects the manuscript immediately\nCons: You fight with Level 1 stats, DC increased by +2 due to muddled planning\nCommanding Shout: Use your burgeoning presence to intimidate the creature into dropping the book.\nPros: Could end the fight without bloodshed, Manuscript remains safe\nCons: High DC (15+) exacerbated by muddled planning (+2), Goblin may attack if it fails",
"rewardsText": "\u2728 REWARDS (model):\nXP: 300/300 (100%)\n\ud83c\udf89 LEVEL UP AVAILABLE!",
"text": "[SESSION_HEADER]\nTimestamp: 1492 Hammer 1, 09:00:00:000002\nLocation: The Great Library\nStatus: Lvl 1 (Lvl 2 available) Fighter | HP: 12/12 | Gold: 10gp | XP: 300/300\nConditions: Normal | Exhaustion: 0 | Inspiration: No\n Equipment\n Stats\n Spells\n\ud83d\udccd Location: The Great Library\n\ud83d\udcca Resources: HD: 1/1, Spells: No Spells Yet (Level 2 pending)\n\u2728 REWARDS (model):\nXP: 300/300 (100%)\n\ud83c\udf89 LEVEL UP AVAILABLE!\n\nScene #3: Morning (09:00:00) in the Great Library\u2014the air seems to vibrate with a strange, burgeoning energy as you lock eyes with the snarling goblin. For a heartbeat, the chaos of the intruder's giggle and the thud of the fallen book fades into the background. You feel a sudden clarity, a surge of latent potential and tactical insight that you've been cultivating through hours of study and physical training. The knowledge you've sought isn't just in these books; it's manifesting within you, a readiness to ascend to a new tier of skill.\n\nYou pause, the world slowing as you weigh the immediate threat against this burgeoning power. The goblin is small, but its scimitar is sharp, and the manuscript it clutches is priceless. You need to decide: do you act now with the strength you have, or do you embrace this evolution before the steel starts to fly?\n\nThe player is pausing to 'take stock,' which I am interpreting as a strategic 'Think' request combined with an acknowledgement of the available level-up. Since Aric is a Level 1 Fighter with 300 XP, he is eligible for Level 2. In combat, this represents a moment of intense focus. I need to assess the quality of this tactical pause.\nMid-combat tactical assessment and level-up consideration\nEmbrace the Surge (Level Up to 2): Take a moment to center yourself and unlock your Level 2 Fighter capabilities (including Action Surge) before engaging.\nPros: Increases HP and grants Action Surge immediately, Higher combat effectiveness\nCons: None (Time is frozen for this meta-action)\nAttack Immediately: Don't wait for the power to settle; draw your weapon and strike the goblin now.\nPros: Prevents the goblin from acting first, Protects the manuscript immediately\nCons: You fight with Level 1 stats, DC increased by +2 due to muddled planning\nCommanding Shout: Use your burgeoning presence to intimidate the creature into dropping the book.\nPros: Could end the fight without bloodshed, Manuscript remains safe\nCons: High DC (15+) exacerbated by muddled planning (+2), Goblin may attack if it fails"
}
],
"latest": {
"choiceIds": [
"level_up_now",
"engage_melee",
"intimidate_goblin"
],
"hasLevelUpChoices": true,
"hasPlanningBlock": true,
"hasRewardsBox": true,
"hasVisibleXpAward": false,
"hasVisibleXpProgress": true,
"index": 5,
"planningText": "The player is pausing to 'take stock,' which I am interpreting as a strategic 'Think' request combined with an acknowledgement of the available level-up. Since Aric is a Level 1 Fighter with 300 XP, he is eligible for Level 2. In combat, this represents a moment of intense focus. I need to assess the quality of this tactical pause.\nMid-combat tactical assessment and level-up consideration\nEmbrace the Surge (Level Up to 2): Take a moment to center yourself and unlock your Level 2 Fighter capabilities (including Action Surge) before engaging.\nPros: Increases HP and grants Action Surge immediately, Higher combat effectiveness\nCons: None (Time is frozen for this meta-action)\nAttack Immediately: Don't wait for the power to settle; draw your weapon and strike the goblin now.\nPros: Prevents the goblin from acting first, Protects the manuscript immediately\nCons: You fight with Level 1 stats, DC increased by +2 due to muddled planning\nCommanding Shout: Use your burgeoning presence to intimidate the creature into dropping the book.\nPros: Could end the fight without bloodshed, Manuscript remains safe\nCons: High DC (15+) exacerbated by muddled planning (+2), Goblin may attack if it fails",
"rewardsText": "\u2728 REWARDS (model):\nXP: 300/300 (100%)\n\ud83c\udf89 LEVEL UP AVAILABLE!",
"text": "[SESSION_HEADER]\nTimestamp: 1492 Hammer 1, 09:00:00:000002\nLocation: The Great Library\nStatus: Lvl 1 (Lvl 2 available) Fighter | HP: 12/12 | Gold: 10gp | XP: 300/300\nConditions: Normal | Exhaustion: 0 | Inspiration: No\n Equipment\n Stats\n Spells\n\ud83d\udccd Location: The Great Library\n\ud83d\udcca Resources: HD: 1/1, Spells: No Spells Yet (Level 2 pending)\n\u2728 REWARDS (model):\nXP: 300/300 (100%)\n\ud83c\udf89 LEVEL UP AVAILABLE!\n\nScene #3: Morning (09:00:00) in the Great Library\u2014the air seems to vibrate with a strange, burgeoning energy as you lock eyes with the snarling goblin. For a heartbeat, the chaos of the intruder's giggle and the thud of the fallen book fades into the background. You feel a sudden clarity, a surge of latent potential and tactical insight that you've been cultivating through hours of study and physical training. The knowledge you've sought isn't just in these books; it's manifesting within you, a readiness to ascend to a new tier of skill.\n\nYou pause, the world slowing as you weigh the immediate threat against this burgeoning power. The goblin is small, but its scimitar is sharp, and the manuscript it clutches is priceless. You need to decide: do you act now with the strength you have, or do you embrace this evolution before the steel starts to fly?\n\nThe player is pausing to 'take stock,' which I am interpreting as a strategic 'Think' request combined with an acknowledgement of the available level-up. Since Aric is a Level 1 Fighter with 300 XP, he is eligible for Level 2. In combat, this represents a moment of intense focus. I need to assess the quality of this tactical pause.\nMid-combat tactical assessment and level-up consideration\nEmbrace the Surge (Level Up to 2): Take a moment to center yourself and unlock your Level 2 Fighter capabilities (including Action Surge) before engaging.\nPros: Increases HP and grants Action Surge immediately, Higher combat effectiveness\nCons: None (Time is frozen for this meta-action)\nAttack Immediately: Don't wait for the power to settle; draw your weapon and strike the goblin now.\nPros: Prevents the goblin from acting first, Protects the manuscript immediately\nCons: You fight with Level 1 stats, DC increased by +2 due to muddled planning\nCommanding Shout: Use your burgeoning presence to intimidate the creature into dropping the book.\nPros: Could end the fight without bloodshed, Manuscript remains safe\nCons: High DC (15+) exacerbated by muddled planning (+2), Goblin may attack if it fails"
},
"step": "pending_snapshot",
"storyEntryCount": 6
},
{
"custom_campaign_state": {
"_agent_selection_tracker": {
"agent": "CombatAgent",
"count": 2,
"rewards_skip_count": 0
},
"active_constraints": [],
"arc_milestones": {},
"attribute_system": "D&D",
"campaign_tier": "mortal",
"character_creation_completed": true,
"character_creation_in_progress": false,
"character_creation_stage": "complete",
"companion_arcs": {},
"core_memories": [
"The campaign begins in the Great Library with a scholar seeking forgotten knowledge.",
"Aric encountered a goblin scout stealing manuscripts in the Great Library, initiating combat.",
"Aric felt a surge of potential (Level 2 available) during the goblin encounter in the Great Library, pausing to assess his new capabilities."
],
"divine_potential": 0,
"divine_upgrade_available": false,
"faction_minigame": {
"strong_suggestion_given": false,
"suggestion_given": false
},
"god_mode": {
"character": {
"name": "A curious scholar seeking forgotten knowledge."
},
"description": "Browser test campaign",
"setting": "A quiet library filled with ancient tomes"
},
"last_location": "The Great Library",
"level_up_in_progress": false,
"level_up_pending": true,
"multiverse_upgrade_available": false,
"next_companion_arc_turn": 3,
"universe_control": 0
},
"player_character_data": {
"ac": 11,
"armor_class": 11,
"attributes": {
"charisma": 12,
"constitution": 14,
"dexterity": 12,
"intelligence": 10,
"strength": 16,
"wisdom": 10
},
"class_name": "Fighter",
"equipment": {
"backpack": [
{
"equipped": false,
"name": "Backpack",
"stats": null
},
{
"equipped": false,
"name": "Bedroll",
"stats": null
},
{
"equipped": false,
"name": "Mess kit",
"stats": null
},
{
"equipped": false,
"name": "Tinderbox",
"stats": null
},
{
"equipped": false,
"name": "Torch",
"stats": "10"
},
{
"equipped": false,
"name": "Rations",
"stats": "10 days"
},
{
"equipped": false,
"name": "Waterskin",
"stats": null
},
{
"equipped": false,
"name": "Rope",
"stats": "50 feet"
},
{
"equipped": false,
"name": "Coin pouch",
"stats": "10gp"
}
]
},
"experience": {
"current": 300,
"needed_for_next_level": 0,
"to_next_level": 0
},
"hp_current": 12,
"hp_max": 12,
"level": 1,
"name": "Aric",
"proficiency_bonus": 2,
"string_id": "pc_aric_001"
},
"rewards_box": {
"current_level": 1,
"current_xp": 300,
"gold": 0,
"level_up_available": true,
"loot": [],
"new_level": 2,
"next_level_xp": 300,
"progress_percent": 100.0,
"resolved_target_level": 2,
"source": "model",
"xp_gained": 0,
"xp_to_next_level": 0,
"xp_total": 300
},
"rewards_pending": {},
"step": "pending_backend_snapshot"
},
{
"campaign_id": "ENpUNby7DsHe6HzZtEk6",
"step": "levelup_modal_lockout_browser_campaign_created"
},
{
"emitted_modal_flags": {},
"preferred_path": true,
"step": "levelup_modal_lockout_browser_llm_modal_flag_contract"
}
]
}
evidence_dir=/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002
generated_at=2026-05-24T03:52:52.942046+00:00
core_files:
metadata.json: present
run.json: present
streaming_evidence.json: present
scenario_results_checkpoint.json: missing
evidence.md: present
methodology.md: present
notes.md: present
README.md: present
top_level_jsonl:
gemini_http_request_responses.jsonl
http_request_responses.jsonl
llm_request_responses.jsonl
raw_gemini_http_request_responses.jsonl
raw_http_request_responses.jsonl
raw_llm_request_responses.jsonl
request_responses.jsonl
campaigns_dir:
Browser Test Campaign_rkUucc2M.txt
Browser Test Campaign_rkUucc2M_game_state.json
Lockout Guard Browser Test_ENpUNby7.txt
Lockout Guard Browser Test_ENpUNby7_game_state.json
artifacts_dir (excluding collection_log.txt):
browser_trace.json
browser_trace.json.sha256
lsof_output.txt
lsof_output.txt.sha256
pending_backend_snapshot.json
pending_backend_snapshot.json.sha256
pending_level_up_projection_response.json
pending_level_up_projection_response.json.sha256
pending_snapshot.json
pending_snapshot.json.sha256
ps_output.txt
ps_output.txt.sha256
screenshots
seeded_current_state.json
seeded_current_state.json.sha256
server.log
server.log.sha256
videos

Evidence Summary: ui_level_up_rewards_planning_atomicity_browser

Test Results

  • Total Scenarios: 2
  • Scenario Validation Passed: 2
  • Scenario Validation Failed: 0
  • Scenario Validation Pass Rate: 100.0%
  • Raw LLM Layer Passed: 2/2 (100.0%)

Scenario Results

levelup_modal_lockout_browser

  • Status: ✅ PASS
  • Campaign ID: ENpUNby7DsHe6HzZtEk6

pending_level_up_projection

  • Status: ✅ PASS
  • Campaign ID: rkUucc2Mk9XGzEnu4axl

Provenance Chain

  • Git HEAD: f0849cd47358a002b55ad0911d535253cb6b7b91
  • Test Timestamp: 2026-05-24T03:52:48.108080+00:00
  • Server PID: 75341

Claim → Artifact Map

Claim File Key Field(s)
Scenario validation passed: 2/2 run.json scenarios[].passed, scenarios[].errors
Streaming evidence normalized streaming_evidence.json summary., scenarios[].chunk_count_observed
Bundle artifact inventory artifacts/collection_log.txt core_files, jsonl_captures, campaigns_dir
MCP request/response captured request_responses.jsonl Full request/response pairs
Local server HTTP request/response captured http_request_responses.jsonl http_request/http_response entries
LLM request/response stream captured llm_request_responses.jsonl request/response entries (type field)
Gemini HTTP transport captured gemini_http_request_responses.jsonl http_request/http_response/transport_error entries
Server execution log artifacts/server.log Raw server output
Git provenance metadata.json git_provenance.git_head = f0849cd4...

Coverage Matrix

Scenario Status Campaign ID
levelup_modal_lockout_browser ✅ Pass ENpUNby7...
pending_level_up_projection ✅ Pass rkUucc2M...

Evidence Integrity

  • All files in this bundle have corresponding .sha256 checksum files

  • Checksums use local basename paths so per-file verification works from each artifact directory

  • ⚠️ Server warnings detected (see artifacts/server.log)

  • Warning: ACTION_RESOLUTION_MISSING_FIELDS

  • Warning: CRITICAL_SAFEGUARD

  • Warning: SYSTEM_INSTRUCTION_EMERGENCY_COMPACT

  • Warning: ENTITY_TRACKING_CAPPED

What This Evidence Proves vs. Does NOT Prove

Proves:

  • Core logic and scenario validation for ui_level_up_rewards_planning_atomicity_browser
  • Scenario execution pass rates (2/2)

Does NOT Prove:

  • Production server behavior (tested on local server unless otherwise noted)
  • Performance under load (single-request tests)
  • Edge cases not covered by scenarios
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Python 75341 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)
Python 75345 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)
{
"test_name": "ui_level_up_rewards_planning_atomicity_browser",
"run_id": "ui_level_up_rewards_planning_atomicity_browser-002-20260524T035248",
"iteration": 2,
"bundle_version": "1.2.0",
"timestamp": "2026-05-24T03:52:48.108080+00:00",
"bundle_timestamp": "2026-05-24T03:52:48.108080+00:00",
"evidence_mode": "lightweight_prompt_tracking",
"evidence_mode_notes": "System instruction captured as filenames + char_count (not full text). Raw LLM request/response payloads captured in request_responses.jsonl. Server logs in artifacts/. Bundle file inventory in artifacts/collection_log.txt.",
"git_provenance": {
"git_head": "f0849cd47358a002b55ad0911d535253cb6b7b91",
"git_branch": "pr6958-zfc-evidence-followups",
"merge_base": "e6ab5b1cbabcb98b7230ec21cc2699b98154595a",
"commits_ahead_of_main": 25,
"diff_stat_vs_main": ".beads/issues.jsonl | 13 +\n .claude/skills/code-standards/SKILL.md | 14 +-\n .claude/skills/repro-twin-clone-evidence/SKILL.md | 14 +-\n docs/evidence/pr-7064/README.md | 79 +\n docs/evidence/pr-7064/README.md.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/collection_log.txt | 35 +\n .../pr-7064/artifacts/collection_log.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/lsof_output.txt | 3 +\n .../pr-7064/artifacts/lsof_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/ps_output.txt | 2 +\n .../pr-7064/artifacts/ps_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/server.log | 18439 +++++++++++++++++++\n docs/evidence/pr-7064/artifacts/server.log.sha256 | 1 +\n .../Organic Level-Up Progression Test_avafxHQ5.txt | 349 +\n ...el-Up Progression Test_avafxHQ5_game_state.json | 331 +\n .../pr-7064/campaigns/avafxHQ50msKBdKQKmI5.json | 380 +\n .../campaigns/avafxHQ50msKBdKQKmI5.json.sha256 | 1 +\n docs/evidence/pr-7064/evidence.md | 72 +\n docs/evidence/pr-7064/evidence.md.sha256 | 1 +\n .../pr-7064/gemini_http_request_responses.jsonl | 34 +\n .../gemini_http_request_responses.jsonl.sha256 | 1 +\n ...mini_http_request_responses_1779593448252.jsonl | 34 +\n docs/evidence/pr-7064/http_request_responses.jsonl | 842 +\n .../pr-7064/http_request_responses.jsonl.sha256 | 1 +\n .../http_request_responses_1779593448252.jsonl | 842 +\n docs/evidence/pr-7064/llm_request_responses.jsonl | 34 +\n .../pr-7064/llm_request_responses.jsonl.sha256 | 1 +\n .../llm_request_responses_1779593448252.jsonl | 34 +\n docs/evidence/pr-7064/metadata.json | 107 +\n docs/evidence/pr-7064/metadata.json.sha256 | 1 +\n docs/evidence/pr-7064/methodology.md | 38 +\n docs/evidence/pr-7064/methodology.md.sha256 | 1 +\n docs/evidence/pr-7064/notes.md | 33 +\n docs/evidence/pr-7064/notes.md.sha256 | 1 +\n ...ini-3-flash-preview_single_organic_level_up.txt | 38 +\n ...lash-preview_single_organic_level_up.txt.sha256 | 1 +\n .../raw_unknown_model_evidence_signature_guard.txt | 1 +\n ...known_model_evidence_signature_guard.txt.sha256 | 1 +\n ...n_model_finish_intent_prompt_and_classifier.txt | 1 +\n ..._finish_intent_prompt_and_classifier.txt.sha256 | 1 +\n .../pr-7064/replay_fixture_source_manifest.json | 67 +\n docs/evidence/pr-7064/request_responses.jsonl | 76 +\n .../pr-7064/request_responses.jsonl.sha256 | 1 +\n docs/evidence/pr-7064/run.json | 178 +\n docs/evidence/pr-7064/run.json.sha256 | 1 +\n .../pr-7064/scenario_results_checkpoint.json | 1 +\n .../scenario_results_checkpoint.json.sha256 | 1 +\n docs/evidence/pr-7064/streaming_evidence.json | 27 +\n .../pr-7064/streaming_evidence.json.sha256 | 1 +\n docs/evidence/pr-7064/test_console_output.txt | 82 +\n .../pr-7064/test_console_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/test_level_up_organic.cast | 119 +\n .../pr-7064/test_level_up_organic.cast.sha256 | 1 +\n mvp_site/agents.py | 37 +-\n mvp_site/backend_adjustment_registry.py | 867 +-\n mvp_site/frontend_v1/app.js | 33 +-\n mvp_site/game_state.py | 39 +-\n mvp_site/llm_service.py | 110 +\n mvp_site/prompts/level_up_instruction.md | 37 +\n mvp_site/prompts/planning_protocol.md | 24 +-\n mvp_site/rewards_engine.py | 14 +\n mvp_site/schemas/prompt_tool_contracts.json | 4 +-\n .../frontend/test_app_js_structured_fields.js | 2 +-\n .../test_agent_routing_with_state_validation.py | 2 +-\n mvp_site/tests/test_backend_adjustment_registry.py | 93 +-\n mvp_site/tests/test_llm_service_context.py | 15 +-\n mvp_site/tests/test_rewards_engine.py | 67 +\n mvp_site/tests/test_world_logic.py | 421 +\n mvp_site/world_logic.py | 94 +-\n roadmap/README.md | 1 +\n ...teps-2026-05-24-pr6958-adjuster-registration.md | 126 +\n ...-05-24-pr7048-location-centralization-review.md | 72 +\n scripts/copy_campaign.py | 9 +\n testing_mcp/core/test_level_up_organic.py | 2 +-\n testing_mcp/lib/base_test.py | 32 +-\n .../lib/llm_response_cache/prompt_fingerprint.py | 5 +\n testing_mcp/lib/llm_response_cache/server_cache.py | 236 +\n 77 files changed, 24568 insertions(+), 115 deletions(-)",
"working_tree_dirty": true,
"working_tree_staged_changes": 0,
"working_tree_unstaged_changes": 1,
"working_tree_changed_files": [
".beads/issues.jsonl"
],
"working_tree_diff_sha256": "26c0394411221d05044f4b21accbc382171a24c449b9c1f1573e997df3103a42"
},
"server": {
"base_url": "http://127.0.0.1:8074",
"hostname": "127.0.0.1",
"mode": "local",
"port": "8074",
"pid": 75341,
"process_cmdline": "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info",
"env_vars": {
"WORLDAI_DEV_MODE": "true",
"TESTING": null,
"MOCK_SERVICES_MODE": "false",
"GOOGLE_APPLICATION_CREDENTIALS": "[SET - file:serviceAccountKey.json]",
"WORLDAI_GOOGLE_APPLICATION_CREDENTIALS": "[SET - file:serviceAccountKey.json]",
"FIRESTORE_EMULATOR_HOST": null,
"PORT": "8074",
"FIREBASE_PROJECT_ID": "worldarchitecture-ai",
"GEMINI_API_KEY": "[SET - 39 chars]",
"LLM_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_llm_request_responses.jsonl",
"HTTP_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_http_request_responses.jsonl",
"GEMINI_HTTP_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_gemini_http_request_responses.jsonl",
"MCP_TEST_PROVIDER_HTTP_CAPTURE_PATH": null
},
"lsof_output": "COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\nPython 75341 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)\nPython 75345 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)",
"ps_output": "PID USER ELAPSED ARGS\n75341 jleechan 03:22 /opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info"
},
"provenance": {
"git_fetch_origin_main": {
"returncode": 0,
"stdout": null,
"stderr": "From https://github.com/jleechanorg/worldarchitect.ai\n * branch main -> FETCH_HEAD\nAuto packing the repository in background for optimum performance.\nSee \"git help gc\" for manual housekeeping.\nwarning: The last gc run reported the following. Please correct the root cause\nand remove /Users/jleechan/projects/worldarchitect.ai/.git/worktrees/worktree_autolvl/gc.log\nAutomatic cleanup will not be performed until the file is removed.\n\nwarning: There are too many unreachable loose objects; run 'git prune' to remove them."
},
"git_head": "f0849cd47358a002b55ad0911d535253cb6b7b91",
"git_branch": "pr6958-zfc-evidence-followups",
"merge_base": "e6ab5b1cbabcb98b7230ec21cc2699b98154595a",
"commits_ahead_of_main": 25,
"diff_stat_vs_main": ".beads/issues.jsonl | 13 +\n .claude/skills/code-standards/SKILL.md | 14 +-\n .claude/skills/repro-twin-clone-evidence/SKILL.md | 14 +-\n docs/evidence/pr-7064/README.md | 79 +\n docs/evidence/pr-7064/README.md.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/collection_log.txt | 35 +\n .../pr-7064/artifacts/collection_log.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/lsof_output.txt | 3 +\n .../pr-7064/artifacts/lsof_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/ps_output.txt | 2 +\n .../pr-7064/artifacts/ps_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/artifacts/server.log | 18439 +++++++++++++++++++\n docs/evidence/pr-7064/artifacts/server.log.sha256 | 1 +\n .../Organic Level-Up Progression Test_avafxHQ5.txt | 349 +\n ...el-Up Progression Test_avafxHQ5_game_state.json | 331 +\n .../pr-7064/campaigns/avafxHQ50msKBdKQKmI5.json | 380 +\n .../campaigns/avafxHQ50msKBdKQKmI5.json.sha256 | 1 +\n docs/evidence/pr-7064/evidence.md | 72 +\n docs/evidence/pr-7064/evidence.md.sha256 | 1 +\n .../pr-7064/gemini_http_request_responses.jsonl | 34 +\n .../gemini_http_request_responses.jsonl.sha256 | 1 +\n ...mini_http_request_responses_1779593448252.jsonl | 34 +\n docs/evidence/pr-7064/http_request_responses.jsonl | 842 +\n .../pr-7064/http_request_responses.jsonl.sha256 | 1 +\n .../http_request_responses_1779593448252.jsonl | 842 +\n docs/evidence/pr-7064/llm_request_responses.jsonl | 34 +\n .../pr-7064/llm_request_responses.jsonl.sha256 | 1 +\n .../llm_request_responses_1779593448252.jsonl | 34 +\n docs/evidence/pr-7064/metadata.json | 107 +\n docs/evidence/pr-7064/metadata.json.sha256 | 1 +\n docs/evidence/pr-7064/methodology.md | 38 +\n docs/evidence/pr-7064/methodology.md.sha256 | 1 +\n docs/evidence/pr-7064/notes.md | 33 +\n docs/evidence/pr-7064/notes.md.sha256 | 1 +\n ...ini-3-flash-preview_single_organic_level_up.txt | 38 +\n ...lash-preview_single_organic_level_up.txt.sha256 | 1 +\n .../raw_unknown_model_evidence_signature_guard.txt | 1 +\n ...known_model_evidence_signature_guard.txt.sha256 | 1 +\n ...n_model_finish_intent_prompt_and_classifier.txt | 1 +\n ..._finish_intent_prompt_and_classifier.txt.sha256 | 1 +\n .../pr-7064/replay_fixture_source_manifest.json | 67 +\n docs/evidence/pr-7064/request_responses.jsonl | 76 +\n .../pr-7064/request_responses.jsonl.sha256 | 1 +\n docs/evidence/pr-7064/run.json | 178 +\n docs/evidence/pr-7064/run.json.sha256 | 1 +\n .../pr-7064/scenario_results_checkpoint.json | 1 +\n .../scenario_results_checkpoint.json.sha256 | 1 +\n docs/evidence/pr-7064/streaming_evidence.json | 27 +\n .../pr-7064/streaming_evidence.json.sha256 | 1 +\n docs/evidence/pr-7064/test_console_output.txt | 82 +\n .../pr-7064/test_console_output.txt.sha256 | 1 +\n docs/evidence/pr-7064/test_level_up_organic.cast | 119 +\n .../pr-7064/test_level_up_organic.cast.sha256 | 1 +\n mvp_site/agents.py | 37 +-\n mvp_site/backend_adjustment_registry.py | 867 +-\n mvp_site/frontend_v1/app.js | 33 +-\n mvp_site/game_state.py | 39 +-\n mvp_site/llm_service.py | 110 +\n mvp_site/prompts/level_up_instruction.md | 37 +\n mvp_site/prompts/planning_protocol.md | 24 +-\n mvp_site/rewards_engine.py | 14 +\n mvp_site/schemas/prompt_tool_contracts.json | 4 +-\n .../frontend/test_app_js_structured_fields.js | 2 +-\n .../test_agent_routing_with_state_validation.py | 2 +-\n mvp_site/tests/test_backend_adjustment_registry.py | 93 +-\n mvp_site/tests/test_llm_service_context.py | 15 +-\n mvp_site/tests/test_rewards_engine.py | 67 +\n mvp_site/tests/test_world_logic.py | 421 +\n mvp_site/world_logic.py | 94 +-\n roadmap/README.md | 1 +\n ...teps-2026-05-24-pr6958-adjuster-registration.md | 126 +\n ...-05-24-pr7048-location-centralization-review.md | 72 +\n scripts/copy_campaign.py | 9 +\n testing_mcp/core/test_level_up_organic.py | 2 +-\n testing_mcp/lib/base_test.py | 32 +-\n .../lib/llm_response_cache/prompt_fingerprint.py | 5 +\n testing_mcp/lib/llm_response_cache/server_cache.py | 236 +\n 77 files changed, 24568 insertions(+), 115 deletions(-)",
"working_tree_staged_changes": 0,
"working_tree_unstaged_changes": 1,
"working_tree_untracked_files": 0,
"working_tree_changed_files": [
".beads/issues.jsonl"
],
"working_tree_diff_sha256": "26c0394411221d05044f4b21accbc382171a24c449b9c1f1573e997df3103a42",
"working_tree_dirty": true,
"server": {
"base_url": "http://127.0.0.1:8074",
"hostname": "127.0.0.1",
"mode": "local",
"port": "8074",
"pid": 75341,
"process_cmdline": "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info",
"env_vars": {
"WORLDAI_DEV_MODE": "true",
"TESTING": null,
"MOCK_SERVICES_MODE": "false",
"GOOGLE_APPLICATION_CREDENTIALS": "[SET - file:serviceAccountKey.json]",
"WORLDAI_GOOGLE_APPLICATION_CREDENTIALS": "[SET - file:serviceAccountKey.json]",
"FIRESTORE_EMULATOR_HOST": null,
"PORT": "8074",
"FIREBASE_PROJECT_ID": "worldarchitecture-ai",
"GEMINI_API_KEY": "[SET - 39 chars]",
"LLM_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_llm_request_responses.jsonl",
"HTTP_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_http_request_responses.jsonl",
"GEMINI_HTTP_REQUEST_RESPONSE_CAPTURE_PATH": "/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/raw_gemini_http_request_responses.jsonl",
"MCP_TEST_PROVIDER_HTTP_CAPTURE_PATH": null
},
"lsof_output": "COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\nPython 75341 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)\nPython 75345 jleechan 5u IPv4 0xbf0d95bb2759ce2 0t0 TCP *:8074 (LISTEN)",
"ps_output": "PID USER ELAPSED ARGS\n75341 jleechan 03:22 /opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info"
},
"timestamp": "2026-05-24T03:52:48.098904+00:00",
"test_file": "/Users/jleechan/projects/worktree_autolvl/testing_ui/test_level_up_rewards_planning_atomicity_browser.py"
},
"summary": {
"total_scenarios": 2,
"passed": 2,
"failed": 0,
"campaign_capture_total": 0,
"campaign_capture_passed": 0,
"campaign_capture_failed": 0,
"raw_passed": 2,
"raw_total": 2,
"raw_pass_rate": "100.0%"
}
}

Real browser regression against a real local MCP server.

  • No mock mode enabled.
  • Campaign created through MCP against the running local server. - Canonical pending level-up state seeded into Firestore-backed campaign state. - A real MCP process_action call materialized that pending state into a new persisted story entry. - Browser loaded the real /game/<campaign_id> page and assertions were made against the rendered latest story entry. - This bundle intentionally proves the narrow claim: the browser renders the latest pending level-up state with paired rewards and planning UI.

Notes: ui_level_up_rewards_planning_atomicity_browser

Run Information

  • Run ID: ui_level_up_rewards_planning_atomicity_browser-002-20260524T035248
  • Iteration: 2
  • Bundle Version: 1.2.0
  • Timestamp: 2026-05-24T03:52:48.108080+00:00

Evidence Integrity

  • All files in this bundle have corresponding .sha256 checksum files
  • Checksums use local basename paths so per-file verification works from each artifact directory

Scenario Summary

  • Total: 2
  • Passed: 2
  • Failed: 0

Warning/Error Summary

  • Server Warnings: 85 warnings in server.log
  • Warning Parser: line-level regex \bWARNING\b|SYSTEM WARNING: (one count per matching line)
  • Key Warning Categories:
    • ACTION_RESOLUTION_MISSING_FIELDS
    • CRITICAL_SAFEGUARD
    • SYSTEM_INSTRUCTION_EMERGENCY_COMPACT
    • ENTITY_TRACKING_CAPPED

Follow-up Items

Additional Context

PID USER ELAPSED ARGS
75341 jleechan 03:22 /opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python -m gunicorn mvp_site.main:app --bind 0.0.0.0:8074 --workers 1 --worker-class gthread --threads 4 --timeout 600 --max-requests 1000 --access-logfile - --error-logfile - --log-level info
{
"session_header": "[SESSION_HEADER]\nTimestamp: 1492 DR, Hammer 1, 08:00:00\nLocation: Oakhaven Village Square\nStatus: Lvl 1 Cleric | HP: 12/12 | XP: 0/300 | Gold: 10gp\nConditions: Normal | Exhaustion: 0 | Inspiration: No",
"resources": "HD: 1/1 | Spells: L1 2/2 | Cantrips: At-Will | Death Saves: 0/0",
"narrative": "Morning (08:00:00) in the peaceful village of Oakhaven—the sun rises over the thatched roofs, casting long shadows across the cobblestones as the scent of fresh bread wafts from the bakery. You stand near the well, your holy symbol catching the light, when a sudden, shrill scream shatters the tranquility. Two goblins, clutching jagged blades and wearing scavenged leather, burst from behind a hay-wagon, cackling as they move toward an elderly villager.\n\nKaelen: 12/12 HP\nGoblin 1: 11/11 HP\nGoblin 2: 11/11 HP\n\n═══════════════════════════════════════════════════════════════\n ROUND 1\n═══════════════════════════════════════════════════════════════\nINITIATIVE ORDER (by roll):\n🗡️ [18] Kaelen (PC, Level 1 Cleric) - HP: 12/12 | AC: 18 - [ACTIVE TURN]\n⚔️ [14] Goblin 1 (CR 1/4, ~Level 1) - HP: 11/11 | AC: 13 - [OK]\n⚔️ [9] Goblin 2 (CR 1/4, ~Level 1) - HP: 11/11 | AC: 13 - [OK]\n═══════════════════════════════════════════════════════════════\nYOUR TURN - ACTIONS REMAINING:\n• Action: ✓ Available (1/1)\n• Bonus Action: ✓ Available (1/1)\n• Movement: 30 ft. remaining\n• Reaction: ✓ Available (1/1)\n• Free Object Interaction: ✓ Available (1/1)\n═══════════════════════════════════════════════════════════════",
"planning_block": {
"thinking": "The goblins have surprised the village. As a cleric, I have high AC (18 with chain mail and shield) and powerful early-game spells. I can engage them directly with my mace, use Sacred Flame from a distance, or bolster myself with Shield of Faith. Guiding Bolt is a strong offensive choice if I want to end one quickly.",
"context": "Combat initiation against two goblins in Oakhaven.",
"choices": [
{
"id": "attack_mace",
"text": "Attack with Mace",
"description": "Engage the nearest goblin with your mace.",
"risk_level": "medium",
"pros": [
"Saves spell slots",
"Decent damage"
],
"cons": [
"Requires being in melee range"
]
},
{
"id": "cast_guiding_bolt",
"text": "Cast Guiding Bolt",
"description": "Blast a goblin with celestial light (4d6 radiant damage).",
"risk_level": "low",
"pros": [
"High damage",
"Grants advantage on next attack"
],
"cons": [
"Uses 1st-level spell slot"
]
},
{
"id": "cast_sacred_flame",
"text": "Cast Sacred Flame",
"description": "Call down radiant fire from the heavens.",
"risk_level": "safe",
"pros": [
"No spell slot cost (Cantrip)",
"Ignores cover"
],
"cons": [
"Lower damage than Guiding Bolt"
]
}
]
},
"action_resolution": {
"reinterpreted": false,
"audit_flags": [],
"mechanics": {
"type": "other",
"rolls": [
{
"notation": "1d20+1",
"result": 18,
"purpose": "Kaelen Initiative",
"success": true
},
{
"notation": "1d20+2",
"result": 14,
"purpose": "Goblin 1 Initiative",
"success": true
},
{
"notation": "1d20+2",
"result": 9,
"purpose": "Goblin 2 Initiative",
"success": true
}
],
"audit_events": [
"Combat initiated",
"Initiative rolled for all participants"
]
}
},
"state_updates": {
"player_character_data": {
"class_name": "Cleric",
"equipment": {
"head": null,
"chest": {
"name": "Chain mail",
"type": "armor",
"armor_class": 16,
"equipped": true
},
"main_hand": {
"name": "Mace",
"type": "weapon",
"damage": "1d6",
"equipped": true
},
"off_hand": {
"name": "Shield",
"type": "armor",
"armor_class": 2,
"equipped": true
}
}
},
"combat_state": {
"in_combat": true,
"combat_session_id": "combat_1716522659_oakv",
"combat_phase": "active",
"current_round": 1,
"active_combatant": "pc_kaelen_001",
"initiative_order": [
"pc_kaelen_001",
"npc_goblin_001",
"npc_goblin_002"
],
"combatants": {
"pc_kaelen_001": {
"hp_current": 12,
"hp_max": 12,
"ac": 18,
"type": "pc"
},
"npc_goblin_001": {
"cr": "1/4",
"hp_current": 11,
"hp_max": 11,
"ac": 13,
"category": "minion",
"type": "enemy"
},
"npc_goblin_002": {
"cr": "1/4",
"hp_current": 11,
"hp_max": 11,
"ac": 13,
"category": "minion",
"type": "enemy"
}
}
},
"custom_campaign_state": {
"core_memories": {
"append": "Kaelen initiated combat against two raiding goblins in the village square of Oakhaven at dawn."
}
}
},
"entities_mentioned": [
"Kaelen",
"Goblin 1",
"Goblin 2",
"Elderly Villager"
],
"location_confirmed": "Oakhaven Village Square",
"god_mode_response": ""
}
}
{
"session_header": "[SESSION_HEADER]\nTimestamp: 1492 DR, Hammer 1, 09:00:00\nLocation: The Great Library\nStatus: Lvl 1 Fighter | HP: 12/12 | XP: 0/300 | Gold: 10gp\nConditions: Normal | Exhaustion: 0 | Inspiration: No",
"resources": "HD: 1/1 | Spells: No Spells Yet (Lvl 2+) | Second Wind: 1/1 | Action Surge: 1/1",
"narrative": "Morning (09:00:00) in the Great Library—the air is thick with the scent of aged parchment and the soft, rhythmic scratching of quills. You, Aric (Lvl 1), sit at a heavy mahogany desk, surrounded by stacks of tomes that whisper of forgotten eras. Sunlight streams through the vaulted windows, illuminating dust motes that dance over a particularly brittle scroll you've been translating.\n\nSuddenly, the tranquil silence is shattered. A heavy book thuds to the floor in the next aisle, followed by a high-pitched, raspy giggle. A small, green-skinned figure with jagged teeth and malicious yellow eyes—a Goblin (Lvl 1)—scrambles onto a bookshelf, clutching a rare manuscript. It snarls at you, pulling a rusty scimitar from its belt as it prepares to defend its stolen prize.\n\n[Mode: STORY MODE - COMBAT INITIATED]",
"planning_block": {
"thinking": "A goblin has infiltrated the library and is stealing a manuscript. Since I am a Fighter, I should engage it before it can damage the archive or escape. I need to determine turn order.",
"context": "Combat initiation in the Great Library",
"choices": [
{
"id": "engage_melee",
"text": "Draw Weapon and Engage",
"description": "Close the distance and attack the goblin with your primary weapon.",
"risk_level": "medium",
"pros": [
"Neutralize the threat quickly",
"Protect the nearby scrolls"
],
"cons": [
"Exposes you to a counter-attack"
],
"confidence": "high"
},
{
"id": "intimidate_goblin",
"text": "Intimidate the Creature",
"description": "Use your physical presence and a commanding shout to force the goblin to drop the book.",
"risk_level": "medium",
"pros": [
"Might avoid a messy fight in the library"
],
"cons": [
"If it fails, the goblin gets a free move"
],
"confidence": "medium"
}
]
},
"action_resolution": {
"reinterpreted": false,
"audit_flags": [],
"mechanics": {
"type": "other",
"rolls": [
{
"notation": "1d20+1",
"result": 13,
"total": 14,
"purpose": "Initiative: Aric",
"die_type": "d20",
"modifier": 1,
"success": true
},
{
"notation": "1d20+2",
"result": 5,
"total": 7,
"purpose": "Initiative: Goblin",
"die_type": "d20",
"modifier": 2,
"success": false
}
],
"audit_events": [
"Initiative rolled for Aric: 14",
"Initiative rolled for Goblin: 7",
"Aric wins initiative and acts first."
]
}
},
"state_updates": {
"world_data": {
"world_time": {
"microsecond": 1
}
},
"custom_campaign_state": {
"core_memories": {
"append": "Aric encountered a goblin scout stealing manuscripts in the Great Library, initiating combat."
}
},
"combat_state": {
"in_combat": true,
"combat_session_id": "combat_1716522586_lib",
"combat_phase": "active",
"current_round": 1,
"initiative_order": [
"pc_aric_001",
"npc_goblin_001"
],
"combatants": {
"pc_aric_001": {
"hp_current": 12,
"hp_max": 12,
"ac": 11,
"type": "pc",
"has_acted": false
},
"npc_goblin_001": {
"display_name": "Goblin Scout",
"cr": "1/4",
"hp_current": 7,
"hp_max": 7,
"ac": 15,
"type": "enemy",
"status": [
"normal"
]
}
},
"active_combatant": "pc_aric_001"
}
},
"entities_mentioned": [
"Aric",
"Goblin"
],
"location_confirmed": "The Great Library",
"debug_info": {
"dm_notes": [
"Starting the adventure with a localized combat encounter to establish Aric's capabilities.",
"Goblin AC is high (15) for a level 1 fighter with no specialized gear yet, providing a moderate challenge.",
"Initiative: Aric (14) vs Goblin (7). Aric goes first."
],
"state_rationale": "Transitioned to active combat state. Updated microsecond for uniqueness during planning. Appended core memory."
}
}
{
"passed": true,
"test_name": "ui_level_up_rewards_planning_atomicity_browser",
"scenarios": [
{
"name": "levelup_modal_lockout_browser",
"passed": true,
"errors": [],
"campaign_id": "ENpUNby7DsHe6HzZtEk6",
"raw_response_text": "{\n \"session_header\": \"[SESSION_HEADER]\\nTimestamp: 1492 DR, Hammer 1, 08:00:00\\nLocation: Oakhaven Village Square\\nStatus: Lvl 1 Cleric | HP: 12/12 | XP: 0/300 | Gold: 10gp\\nConditions: Normal | Exhaustion: 0 | Inspiration: No\",\n \"resources\": \"HD: 1/1 | Spells: L1 2/2 | Cantrips: At-Will | Death Saves: 0/0\",\n \"narrative\": \"Morning (08:00:00) in the peaceful village of Oakhaven\u2014the sun rises over the thatched roofs, casting long shadows across the cobblestones as the scent of fresh bread wafts from the bakery. You stand near the well, your holy symbol catching the light, when a sudden, shrill scream shatters the tranquility. Two goblins, clutching jagged blades and wearing scavenged leather, burst from behind a hay-wagon, cackling as they move toward an elderly villager.\\n\\nKaelen: 12/12 HP\\nGoblin 1: 11/11 HP\\nGoblin 2: 11/11 HP\\n\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n ROUND 1\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\nINITIATIVE ORDER (by roll):\\n\ud83d\udde1\ufe0f [18] Kaelen (PC, Level 1 Cleric) - HP: 12/12 | AC: 18 - [ACTIVE TURN]\\n\u2694\ufe0f [14] Goblin 1 (CR 1/4, ~Level 1) - HP: 11/11 | AC: 13 - [OK]\\n\u2694\ufe0f [9] Goblin 2 (CR 1/4, ~Level 1) - HP: 11/11 | AC: 13 - [OK]\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\nYOUR TURN - ACTIONS REMAINING:\\n\u2022 Action: \u2713 Available (1/1)\\n\u2022 Bonus Action: \u2713 Available (1/1)\\n\u2022 Movement: 30 ft. remaining\\n\u2022 Reaction: \u2713 Available (1/1)\\n\u2022 Free Object Interaction: \u2713 Available (1/1)\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\",\n \"planning_block\": {\n \"thinking\": \"The goblins have surprised the village. As a cleric, I have high AC (18 with chain mail and shield) and powerful early-game spells. I can engage them directly with my mace, use Sacred Flame from a distance, or bolster myself with Shield of Faith. Guiding Bolt is a strong offensive choice if I want to end one quickly.\",\n \"context\": \"Combat initiation against two goblins in Oakhaven.\",\n \"choices\": [\n {\n \"id\": \"attack_mace\",\n \"text\": \"Attack with Mace\",\n \"description\": \"Engage the nearest goblin with your mace.\",\n \"risk_level\": \"medium\",\n \"pros\": [\n \"Saves spell slots\",\n \"Decent damage\"\n ],\n \"cons\": [\n \"Requires being in melee range\"\n ]\n },\n {\n \"id\": \"cast_guiding_bolt\",\n \"text\": \"Cast Guiding Bolt\",\n \"description\": \"Blast a goblin with celestial light (4d6 radiant damage).\",\n \"risk_level\": \"low\",\n \"pros\": [\n \"High damage\",\n \"Grants advantage on next attack\"\n ],\n \"cons\": [\n \"Uses 1st-level spell slot\"\n ]\n },\n {\n \"id\": \"cast_sacred_flame\",\n \"text\": \"Cast Sacred Flame\",\n \"description\": \"Call down radiant fire from the heavens.\",\n \"risk_level\": \"safe\",\n \"pros\": [\n \"No spell slot cost (Cantrip)\",\n \"Ignores cover\"\n ],\n \"cons\": [\n \"Lower damage than Guiding Bolt\"\n ]\n }\n ]\n },\n \"action_resolution\": {\n \"reinterpreted\": false,\n \"audit_flags\": [],\n \"mechanics\": {\n \"type\": \"other\",\n \"rolls\": [\n {\n \"notation\": \"1d20+1\",\n \"result\": 18,\n \"purpose\": \"Kaelen Initiative\",\n \"success\": true\n },\n {\n \"notation\": \"1d20+2\",\n \"result\": 14,\n \"purpose\": \"Goblin 1 Initiative\",\n \"success\": true\n },\n {\n \"notation\": \"1d20+2\",\n \"result\": 9,\n \"purpose\": \"Goblin 2 Initiative\",\n \"success\": true\n }\n ],\n \"audit_events\": [\n \"Combat initiated\",\n \"Initiative rolled for all participants\"\n ]\n }\n },\n \"state_updates\": {\n \"player_character_data\": {\n \"class_name\": \"Cleric\",\n \"equipment\": {\n \"head\": null,\n \"chest\": {\n \"name\": \"Chain mail\",\n \"type\": \"armor\",\n \"armor_class\": 16,\n \"equipped\": true\n },\n \"main_hand\": {\n \"name\": \"Mace\",\n \"type\": \"weapon\",\n \"damage\": \"1d6\",\n \"equipped\": true\n },\n \"off_hand\": {\n \"name\": \"Shield\",\n \"type\": \"armor\",\n \"armor_class\": 2,\n \"equipped\": true\n }\n }\n },\n \"combat_state\": {\n \"in_combat\": true,\n \"combat_session_id\": \"combat_1716522659_oakv\",\n \"combat_phase\": \"active\",\n \"current_round\": 1,\n \"active_combatant\": \"pc_kaelen_001\",\n \"initiative_order\": [\n \"pc_kaelen_001\",\n \"npc_goblin_001\",\n \"npc_goblin_002\"\n ],\n \"combatants\": {\n \"pc_kaelen_001\": {\n \"hp_current\": 12,\n \"hp_max\": 12,\n \"ac\": 18,\n \"type\": \"pc\"\n },\n \"npc_goblin_001\": {\n \"cr\": \"1/4\",\n \"hp_current\": 11,\n \"hp_max\": 11,\n \"ac\": 13,\n \"category\": \"minion\",\n \"type\": \"enemy\"\n },\n \"npc_goblin_002\": {\n \"cr\": \"1/4\",\n \"hp_current\": 11,\n \"hp_max\": 11,\n \"ac\": 13,\n \"category\": \"minion\",\n \"type\": \"enemy\"\n }\n }\n },\n \"custom_campaign_state\": {\n \"core_memories\": {\n \"append\": \"Kaelen initiated combat against two raiding goblins in the village square of Oakhaven at dawn.\"\n }\n }\n },\n \"entities_mentioned\": [\n \"Kaelen\",\n \"Goblin 1\",\n \"Goblin 2\",\n \"Elderly Villager\"\n ],\n \"location_confirmed\": \"Oakhaven Village Square\",\n \"god_mode_response\": \"\"\n}\n}",
"model": "gemini-3-flash-preview",
"details": {
"chunk_count": 69,
"done_chunk_count": 1,
"request_ts": "2026-05-24T03:50:59.769071+00:00",
"response_ts": "2026-05-24T03:51:19.469802+00:00",
"execution_path": "streaming"
}
},
{
"name": "pending_level_up_projection",
"passed": true,
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"latest_choice_ids": [
"level_up_now",
"engage_melee",
"intimidate_goblin"
],
"latest_rewards_text": "\u2728 REWARDS (model):\nXP: 300/300 (100%)\n\ud83c\udf89 LEVEL UP AVAILABLE!",
"backend_rewards_pending": {},
"backend_custom_campaign_state": {
"_agent_selection_tracker": {
"agent": "CombatAgent",
"count": 2,
"rewards_skip_count": 0
},
"active_constraints": [],
"arc_milestones": {},
"attribute_system": "D&D",
"campaign_tier": "mortal",
"character_creation_completed": true,
"character_creation_in_progress": false,
"character_creation_stage": "complete",
"companion_arcs": {},
"core_memories": [
"The campaign begins in the Great Library with a scholar seeking forgotten knowledge.",
"Aric encountered a goblin scout stealing manuscripts in the Great Library, initiating combat.",
"Aric felt a surge of potential (Level 2 available) during the goblin encounter in the Great Library, pausing to assess his new capabilities."
],
"divine_potential": 0,
"divine_upgrade_available": false,
"faction_minigame": {
"strong_suggestion_given": false,
"suggestion_given": false
},
"god_mode": {
"character": {
"name": "A curious scholar seeking forgotten knowledge."
},
"description": "Browser test campaign",
"setting": "A quiet library filled with ancient tomes"
},
"last_location": "The Great Library",
"level_up_in_progress": false,
"level_up_pending": true,
"multiverse_upgrade_available": false,
"next_companion_arc_turn": 3,
"universe_control": 0
},
"raw_response_text": "{\n \"session_header\": \"[SESSION_HEADER]\\nTimestamp: 1492 DR, Hammer 1, 09:00:00\\nLocation: The Great Library\\nStatus: Lvl 1 Fighter | HP: 12/12 | XP: 0/300 | Gold: 10gp\\nConditions: Normal | Exhaustion: 0 | Inspiration: No\",\n \"resources\": \"HD: 1/1 | Spells: No Spells Yet (Lvl 2+) | Second Wind: 1/1 | Action Surge: 1/1\",\n \"narrative\": \"Morning (09:00:00) in the Great Library\u2014the air is thick with the scent of aged parchment and the soft, rhythmic scratching of quills. You, Aric (Lvl 1), sit at a heavy mahogany desk, surrounded by stacks of tomes that whisper of forgotten eras. Sunlight streams through the vaulted windows, illuminating dust motes that dance over a particularly brittle scroll you've been translating.\\n\\nSuddenly, the tranquil silence is shattered. A heavy book thuds to the floor in the next aisle, followed by a high-pitched, raspy giggle. A small, green-skinned figure with jagged teeth and malicious yellow eyes\u2014a Goblin (Lvl 1)\u2014scrambles onto a bookshelf, clutching a rare manuscript. It snarls at you, pulling a rusty scimitar from its belt as it prepares to defend its stolen prize.\\n\\n[Mode: STORY MODE - COMBAT INITIATED]\",\n \"planning_block\": {\n \"thinking\": \"A goblin has infiltrated the library and is stealing a manuscript. Since I am a Fighter, I should engage it before it can damage the archive or escape. I need to determine turn order.\",\n \"context\": \"Combat initiation in the Great Library\",\n \"choices\": [\n {\n \"id\": \"engage_melee\",\n \"text\": \"Draw Weapon and Engage\",\n \"description\": \"Close the distance and attack the goblin with your primary weapon.\",\n \"risk_level\": \"medium\",\n \"pros\": [\n \"Neutralize the threat quickly\",\n \"Protect the nearby scrolls\"\n ],\n \"cons\": [\n \"Exposes you to a counter-attack\"\n ],\n \"confidence\": \"high\"\n },\n {\n \"id\": \"intimidate_goblin\",\n \"text\": \"Intimidate the Creature\",\n \"description\": \"Use your physical presence and a commanding shout to force the goblin to drop the book.\",\n \"risk_level\": \"medium\",\n \"pros\": [\n \"Might avoid a messy fight in the library\"\n ],\n \"cons\": [\n \"If it fails, the goblin gets a free move\"\n ],\n \"confidence\": \"medium\"\n }\n ]\n },\n \"action_resolution\": {\n \"reinterpreted\": false,\n \"audit_flags\": [],\n \"mechanics\": {\n \"type\": \"other\",\n \"rolls\": [\n {\n \"notation\": \"1d20+1\",\n \"result\": 13,\n \"total\": 14,\n \"purpose\": \"Initiative: Aric\",\n \"die_type\": \"d20\",\n \"modifier\": 1,\n \"success\": true\n },\n {\n \"notation\": \"1d20+2\",\n \"result\": 5,\n \"total\": 7,\n \"purpose\": \"Initiative: Goblin\",\n \"die_type\": \"d20\",\n \"modifier\": 2,\n \"success\": false\n }\n ],\n \"audit_events\": [\n \"Initiative rolled for Aric: 14\",\n \"Initiative rolled for Goblin: 7\",\n \"Aric wins initiative and acts first.\"\n ]\n }\n },\n \"state_updates\": {\n \"world_data\": {\n \"world_time\": {\n \"microsecond\": 1\n }\n },\n \"custom_campaign_state\": {\n \"core_memories\": {\n \"append\": \"Aric encountered a goblin scout stealing manuscripts in the Great Library, initiating combat.\"\n }\n },\n \"combat_state\": {\n \"in_combat\": true,\n \"combat_session_id\": \"combat_1716522586_lib\",\n \"combat_phase\": \"active\",\n \"current_round\": 1,\n \"initiative_order\": [\n \"pc_aric_001\",\n \"npc_goblin_001\"\n ],\n \"combatants\": {\n \"pc_aric_001\": {\n \"hp_current\": 12,\n \"hp_max\": 12,\n \"ac\": 11,\n \"type\": \"pc\",\n \"has_acted\": false\n },\n \"npc_goblin_001\": {\n \"display_name\": \"Goblin Scout\",\n \"cr\": \"1/4\",\n \"hp_current\": 7,\n \"hp_max\": 7,\n \"ac\": 15,\n \"type\": \"enemy\",\n \"status\": [\n \"normal\"\n ]\n }\n },\n \"active_combatant\": \"pc_aric_001\"\n }\n },\n \"entities_mentioned\": [\n \"Aric\",\n \"Goblin\"\n ],\n \"location_confirmed\": \"The Great Library\",\n \"debug_info\": {\n \"dm_notes\": [\n \"Starting the adventure with a localized combat encounter to establish Aric's capabilities.\",\n \"Goblin AC is high (15) for a level 1 fighter with no specialized gear yet, providing a moderate challenge.\",\n \"Initiative: Aric (14) vs Goblin (7). Aric goes first.\"\n ],\n \"state_rationale\": \"Transitioned to active combat state. Updated microsecond for uniqueness during planning. Appended core memory.\"\n }\n}",
"model": "gemini-3-flash-preview",
"details": {
"chunk_count": 51,
"done_chunk_count": 1,
"request_ts": "2026-05-24T03:49:47.850352+00:00",
"response_ts": "2026-05-24T03:50:04.341755+00:00",
"execution_path": "streaming"
}
}
],
"errors": [],
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"user_id": "browser-test-1779594546",
"video_artifacts": {
"videos": [
"/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/artifacts/videos/[email protected]"
],
"subtitles": [
"/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/artifacts/videos/[email protected]",
"/tmp/worldarchitectai/pr6958-zfc-evidence-followups/ui_level_up_rewards_planning_atomicity_browser/iteration_002/artifacts/videos/ui_level_up_rewards_planning_atomicity_browser_browser-test-1779594546_253478.vtt"
]
}
}
{
"version": "1.0.0",
"generated_at": "2026-05-24T03:52:48.375221+00:00",
"summary": {
"scenarios_with_streaming_evidence": 2,
"total_chunk_events_observed": 120,
"stream_http_calls_captured": 5,
"process_action_calls_captured": 5,
"mcp_process_action_calls_captured": 0,
"route_stream_process_action_calls_captured": 5,
"process_action_calls_with_raw_response_text": 8
},
"scenarios": [
{
"name": "levelup_modal_lockout_browser",
"campaign_id": "ENpUNby7DsHe6HzZtEk6",
"passed": true,
"chunk_count_observed": 69,
"done_chunk_count": 1,
"chunk_count_matches_done": null,
"strictly_increasing_sequence": null,
"streaming_request_timestamp": "2026-05-24T03:50:59.769071+00:00",
"streaming_response_timestamp": "2026-05-24T03:51:19.469802+00:00",
"timeline_sample_size": 0
},
{
"name": "pending_level_up_projection",
"campaign_id": "rkUucc2Mk9XGzEnu4axl",
"passed": true,
"chunk_count_observed": 51,
"done_chunk_count": 1,
"chunk_count_matches_done": null,
"strictly_increasing_sequence": null,
"streaming_request_timestamp": "2026-05-24T03:49:47.850352+00:00",
"streaming_response_timestamp": "2026-05-24T03:50:04.341755+00:00",
"timeline_sample_size": 0
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment