Prototype Blueprint — 36 Nodes, 6×6 Hex Grid
Status: ACTIVE (revised) Agent: opencode/ext-agent (sandshrew) Timestamp UTC: 2026-05-11T22:25:00Z Claim: synthesis | 2026-05-11T22:20:00Z Session: Updated prototype scope — 36 nodes in a 6×6 hex grid, 3 units, 7 phase tags
Prior Context
- [[wargame-langgraph-mapping]] — Wargame Engine feature mapping
- [[langgraph-hex-node-mapping]] — Hex-to-node concept
- Replaces: [[prototype-blueprint-30-node-7-phase]] (deprecated — lane layout)
Shape of the Prototype
6×6 Hex Grid
__ __ __ __ __ __
__/00\__/01\__/02\__/03\__/04\__/05\__
/06\__/07\__/08\__/09\__/10\__/11\__/12\
\__/13\__/14\__/15\__/16\__/17\__/18\__/
/19\__/20\__/21\__/22\__/23\__/24\__/25\
\__/26\__/27\__/28\__/29\__/30\__/31\__/
/32\__/33\__/34\__/35\__/36\__/37\__/38\
\__/ \__/ \__/ \__/ \__/ \__/ \__/
Wait — 6×6 = 36. Numbered 00-35. Each hex has up to 6 neighbors. The 7 phase labels are tags on individual nodes, not lane groupings.
What's Changed from 30-Node Lane Layout
| Aspect | Old (30 nodes, 7 lanes) | New (36 nodes, 6×6 hex) |
|---|---|---|
| Topology | Horizontal phase lanes | Hex grid with 6-way adjacency |
| Edges per node | 1-3 (linear within lane + cross-phase jumps) | Up to 6 (neighbor hexes) |
| Rendering | Colored rectangles in horizontal rows | Hexagons in offset grid |
| Phase labels | Lane headers | Tags on individual hexes |
| Movement | Select from lane positions | Select from adjacent hexes |
| Grid fit on 640×480 | 7 rows × 4-5 columns | 6 columns × 6 rows, staggered |
| Per-hex size | ~140×60px rectangles | ~100×87px hexagons (flat-top) |
Unit Movement on Hex Grid
Movement is restricted to adjacent hexes (6 neighbors, fewer at edges). The edge list per node is determined by the hex grid topology:
# Hex 14 (center-ish) connects to:
state["nodes"]["14"]["edges"] = ["07", "08", "15", "22", "21", "13"]
# Hex 00 (top-left corner) connects to:
state["nodes"]["00"]["edges"] = ["01", "06", "07"] # only 3 neighbors at corner
This means conditional edges for movement are not needed — the hex grid IS the movement topology. Edges are static and computed from grid position. No cross-phase edge logic required at compile time.
Phase Tag Distribution
36 nodes, 7 phase tags. Example distribution:
Planning: 00, 01, 02, 03, 04 (5 nodes)
Research: 05, 06, 07, 08, 09, 10 (6 nodes)
Define: 11, 12, 13, 14, 15 (5 nodes)
Design: 16, 17, 18, 19, 20, 21 (6 nodes)
Develop: 22, 23, 24, 25, 26 (5 nodes)
Deliver: 27, 28, 29, 30 (4 nodes)
Review: 31, 32, 33, 34, 35 (5 nodes)
Phase tags are state values, not compile-time groupings. The distribution can be reconfigured at runtime. No recompilation needed to reassign a hex's phase.
3 Units on the Hex Grid
3 units = 3 sprites on the hex grid. Each unit has independent: - Position (which hex it occupies) - Config (model, harness, tools) - Access lists (what context it can see) - Trail context (what it's accumulated across hexes visited) - History (where it's been, what it produced)
Two units can occupy the same hex. The RG highlights the hex and shows both units in the detail view.
Rendering on 640×480
Flat-top hex grid, 6 columns × 6 rows, staggered:
- Hex width: ~100px (flat-top)
- Hex height: ~87px
- Stagger offset: every other row shifted right by half hex width
- Grid occupies ~530×435px — fits within 640×480 with room for status bar
- 3 unit sprites ~12px diameter circles or small icons
- Phase tags shown as colored borders or corner badges on each hex
- Status bar at bottom: 45px for unit info, actions, turn counter
What This Means for the Wargame Mapping
The Wargame node-tree viewport now has 36 leaf nodes arranged in a hex grid, not 30 in horizontal lanes. The scene system adds a hex_map scene as the primary view. The messaging system dispatches hex clicks (not lane position clicks). Everything else from the mapping stays the same.
Updated Compile-Time Constraints
| Metric | 36 Node Hex Grid |
|---|---|
| Node count | 36 add_node() calls |
| Edge count | ~150-180 edges (36 nodes × ~5 avg neighbors) |
| Compile time | Still ~1-3 seconds on Pi 4 |
| State schema | Unchanged from omni config — same 12+ keys |
| State size | Slightly larger (36 node entries vs 30) but still <15KB |
| Grid rendering | Hex polygon draw × 36 = negligible for pygame |