Golden targets: make golden-diff shows color diff if simulation output changed, make golden-update regenerates and stages for review. Checklist schema: JSON Schema for 7 condition types evaluable from ObserverSnapshot. Per-room YAML checklists for 3 Gauntlet rooms plus cross-room checks. Validation script + make checklist-validate/generate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "checklist.schema.json",
|
||||
"title": "Gauntlet QA Checklist",
|
||||
"description": "Per-room QA checklist with conditions evaluable from ObserverSnapshot (D-030). Feeds into #503 auto-checklist progress tracking.",
|
||||
"type": "object",
|
||||
"required": ["conditions"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"room_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_]*$",
|
||||
"description": "Room identifier matching constants.rs room name"
|
||||
},
|
||||
"room_name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"description": "Human-readable room name"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"conditions": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{ "$ref": "#/$defs/player_near" },
|
||||
{ "$ref": "#/$defs/player_facing" },
|
||||
{ "$ref": "#/$defs/entity_present" },
|
||||
{ "$ref": "#/$defs/entity_absent" },
|
||||
{ "$ref": "#/$defs/expected_monologue" },
|
||||
{ "$ref": "#/$defs/expected_dialogue" },
|
||||
{ "$ref": "#/$defs/expected_interaction_verb" }
|
||||
]
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"condition_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_-]*$",
|
||||
"description": "Unique condition identifier within this checklist"
|
||||
},
|
||||
"player_near": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "x", "y", "radius"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "player_near" },
|
||||
"x": { "type": "integer", "description": "Target X coordinate (absolute sim tiles)" },
|
||||
"y": { "type": "integer", "description": "Target Y coordinate (absolute sim tiles)" },
|
||||
"radius": { "type": "number", "minimum": 0, "description": "Proximity radius in tiles" }
|
||||
}
|
||||
},
|
||||
"player_facing": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "direction"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "player_facing" },
|
||||
"direction": {
|
||||
"type": "string",
|
||||
"enum": ["North", "South", "East", "West"],
|
||||
"description": "Expected player facing direction"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity_present": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "entity_present" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of expected entity" }
|
||||
}
|
||||
},
|
||||
"entity_absent": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "entity_absent" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of entity that should NOT be visible" }
|
||||
}
|
||||
},
|
||||
"expected_monologue": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "contains"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_monologue" },
|
||||
"contains": { "type": "string", "minLength": 1, "description": "Substring expected in current_monologue text" }
|
||||
}
|
||||
},
|
||||
"expected_dialogue": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "contains"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_dialogue" },
|
||||
"contains": { "type": "string", "minLength": 1, "description": "Substring expected in dialogue_response text" }
|
||||
}
|
||||
},
|
||||
"expected_interaction_verb": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id", "verb"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_interaction_verb" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of target entity" },
|
||||
"verb": { "type": "string", "minLength": 1, "description": "Expected interaction verb (e.g., Talk, Pickup, Examine)" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
description: "Cross-room checks applied to every Gauntlet room visit."
|
||||
conditions:
|
||||
- id: cross-player-entity-present
|
||||
description: "Player entity (StableId 0) always present in snapshot"
|
||||
condition_type: entity_present
|
||||
entity_id: 0
|
||||
@@ -0,0 +1,42 @@
|
||||
room_id: inventory_warehouse
|
||||
room_name: Inventory Warehouse
|
||||
description: "Tests D-065 (9-slot inventory), pickup/drop verbs, CarriedBy component. 10 crates (StableId 13-22) + 1 NPC (StableId 23)."
|
||||
conditions:
|
||||
- id: inv-player-spawn
|
||||
description: "Player starts near warehouse spawn position"
|
||||
condition_type: player_near
|
||||
x: 17
|
||||
y: 54
|
||||
radius: 2.0
|
||||
|
||||
- id: inv-player-facing-east
|
||||
description: "Player faces east at spawn"
|
||||
condition_type: player_facing
|
||||
direction: East
|
||||
|
||||
- id: inv-crate-01-visible
|
||||
description: "First crate (Keycard) is visible from spawn"
|
||||
condition_type: entity_present
|
||||
entity_id: 13
|
||||
|
||||
- id: inv-crate-10-visible
|
||||
description: "Last crate (Chip) is visible"
|
||||
condition_type: entity_present
|
||||
entity_id: 22
|
||||
|
||||
- id: inv-npc-warehouse-visible
|
||||
description: "Warehouse supervisor NPC is present"
|
||||
condition_type: entity_present
|
||||
entity_id: 23
|
||||
|
||||
- id: inv-crate-pickup-verb
|
||||
description: "Pickup verb available on crate when nearby"
|
||||
condition_type: expected_interaction_verb
|
||||
entity_id: 13
|
||||
verb: Pickup
|
||||
|
||||
- id: inv-npc-talk-verb
|
||||
description: "Talk verb available on warehouse NPC"
|
||||
condition_type: expected_interaction_verb
|
||||
entity_id: 23
|
||||
verb: Talk
|
||||
@@ -0,0 +1,41 @@
|
||||
room_id: occlusion_corridor
|
||||
room_name: Occlusion Corridor
|
||||
description: "Tests D-035 (symmetric shadowcasting), D-017 (perception modes), D-015 (vision cone sectors). 4 NPCs (StableId 9-12)."
|
||||
conditions:
|
||||
- id: occ-player-spawn
|
||||
description: "Player starts at corridor entrance"
|
||||
condition_type: player_near
|
||||
x: 84
|
||||
y: 58
|
||||
radius: 2.0
|
||||
|
||||
- id: occ-player-facing-east
|
||||
description: "Player faces east down the corridor"
|
||||
condition_type: player_facing
|
||||
direction: East
|
||||
|
||||
- id: occ-guard-visible
|
||||
description: "Guard NPC in clear LOS from spawn"
|
||||
condition_type: entity_present
|
||||
entity_id: 9
|
||||
|
||||
- id: occ-hidden-npc-absent
|
||||
description: "NPC behind north wall segment is NOT visible from spawn"
|
||||
condition_type: entity_absent
|
||||
entity_id: 10
|
||||
|
||||
- id: occ-peripheral-npc-visible
|
||||
description: "South alcove NPC visible in peripheral vision sector"
|
||||
condition_type: entity_present
|
||||
entity_id: 11
|
||||
|
||||
- id: occ-far-end-visible
|
||||
description: "Far end NPC visible down corridor"
|
||||
condition_type: entity_present
|
||||
entity_id: 12
|
||||
|
||||
- id: occ-guard-talk-verb
|
||||
description: "Talk verb available on guard NPC when nearby"
|
||||
condition_type: expected_interaction_verb
|
||||
entity_id: 9
|
||||
verb: Talk
|
||||
@@ -0,0 +1,26 @@
|
||||
room_id: pause_chamber
|
||||
room_name: Pause Chamber
|
||||
description: "Tests D-031 (pause/unpause), Bug #3 regression (movement while paused). 1 NPC (StableId 29)."
|
||||
conditions:
|
||||
- id: pause-player-spawn
|
||||
description: "Player starts at chamber center"
|
||||
condition_type: player_near
|
||||
x: 50
|
||||
y: 86
|
||||
radius: 2.0
|
||||
|
||||
- id: pause-player-facing-north
|
||||
description: "Player faces north at spawn"
|
||||
condition_type: player_facing
|
||||
direction: North
|
||||
|
||||
- id: pause-npc-present
|
||||
description: "Pause target NPC is visible"
|
||||
condition_type: entity_present
|
||||
entity_id: 29
|
||||
|
||||
- id: pause-talk-verb
|
||||
description: "Talk verb available on NPC (should work while paused)"
|
||||
condition_type: expected_interaction_verb
|
||||
entity_id: 29
|
||||
verb: Talk
|
||||
Reference in New Issue
Block a user