The maze agent never simulates the world — it remembers transitions as one vector and queries it. Walk the grid to teach M = Σ bind(bind(state, action), next), then click any cell to watch the agent imagine each move by unbinding and cleaning up. No lookup table, no physics engine: just one hypervector.
Each open move unbinds its key out of M and cleans the blurry result up to the nearest real cell. ✓ = matches where that move truly leads.
bind(bind(state, action), next) into one running sum M — all transitions superposed in the same D components. To imagine action a from a state, bind M with bind(state, a): because bind is self-inverse, the matching term collapses back to the stored next symbol while every other term scatters into noise. (The next symbol is stored ρ-shifted so it can't alias the keys — without it, reverse moves in a corridor collide.) Cleanup snaps that noisy estimate to the nearest real cell. Confidence is the cleanup similarity — it falls when M is overloaded (try D = 256) or the move was never walked.
wmImagine verbatim: cleanupNearest(bind(M, bind(state, action))). The agent does one-step lookahead — imagine each move, score the result, commit the best — "trying a move in its head" before stepping. (The project keys on egocentric L/F/R actions so the model transfers between mazes — that twist is its own lab. Here we use plain N/E/S/W to keep the focus on the imagine step.)