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

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:

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