# MAISpace reconciliation — prototype → your real world

Read after `README.md`. This is the diff between my generic Live Village and your actual `maispace-world` repo, plus the transforms `bridge-bindings.json` references. Where my placeholders disagree with your canon, **your canon wins** (SPEC-0015 rule).

## 1. Team colors — use the roster's, not mine

My `crew.json` proposed colors from the world palette. Your `agent-roster.json` has the real ones — **override with these** (already applied in `bridge-bindings.json`):

| Agent | Role (Codex L3) | Real team_color | Badge | Status now |
|---|---|---|---|---|
| Dispatch | Chief of Staff | `#A78BFA` | DISPATCH | alive |
| Hermes | Foreman | `#F59E0B` | FOREMAN | alive |
| Codex | Engineer | `#10B981` | OFFLINE | **offline** (CLI login pending) |
| Cowork | Builder | `#2E7D32` | BUILDER | alive |
| Fable | Curator | `#EC4899` | STORYTELLER | alive |
| Jarvis Prime | Strategist | `#3B82F6` | STRATEGY | alive |
| Jarvis Anchor | The Critic | `#1E40AF` | ANCHOR | alive |
| QLA Jarvis | Auctions | `#06B6D4` | DOMAIN | alive |
| R-13 Foreman | Cluster Host | `#EF4444` | FOREMAN | alive |
| OptiPlex Node-05 | CPU Node | `#64748B` | NODE | alive |
| ChatGPT | Outsourcing | `#0D9488` | OUTSOURCE | alive (external) |
| Erika's Minions | Titlers (SKILL) | `#84CC16` | SKILL NOT EMPLOYEE | alive |

Note these are flatter/Tailwind-ish than my saturated palette — they'll sit slightly muted against the Stardew-warm atmosphere. If you want them to pop at Command-view as status dots, let me derive a parallel "marker" ramp (same hues, lifted chroma) so the legend reads bright while desk-view avatars keep the brand color. Say the word.

## 2. Rooms & floors — adopt the canon + go vertical

My `zones.json` used generic room keys. Map them to `rooms.json` ids, and note the **3-floor tower** from SPEC-0014 v0.2 (my prototype = the **Ground** floor only):

| Floor | Canon room(s) | My zone key | Notes |
|---|---|---|---|
| **Up** | The Hearth | `hearth` | sanctuary; `the-hearth` rules: max_visible_items=1, dismissible, no metrics |
| **Ground** | The Workfloor (open + zoom), The Roster, The Movement, The Mechanical Room, The Tool Room → the Vault, Dispatch desk + business wings (Earl's, QLA, MAIspace, RVC) | `workfloor`/`movement`/`mechanical`/`toolvault`/`bench`/`lab*` | the command view |
| **Basement** | The Lab | `lab` | containment boundary — sandboxed, no prod outreach; stairs = staging→prod |

Two structural adds for you: **The Roster** (crew directory wall — Help Desk v1 lives here) and the **business wings** (Earl's / QLA / MAIspace / RVC / Dispatch) aren't in my 7-room prototype. And `the-vault` is a brass box *inside* The Tool Room with `always_escalate`. The build requirement from the spec is right: **each floor = its own map + crew + permission boundary**, so 2→N floors (and the skyscraper/multi-tenant vision) is additive.

## 3. The transforms `bridge-bindings.json` calls

Pure functions; keep them tiny and testable.

- **`presenceToAvatar(a)`** → `{ x:(a.position.x/100)*floorW, y:(a.position.y/100)*floorH, render: a.roster_status!=='offline', ghost: a.roster_status==='offline', anim: a.status==='working'?'work':a.status==='idle'?'idle':'rest', badge:a.specialty_badge, color:a.team_color, edge: a.position.kind==='external' }`. `working/idle/rest` already derived by the feed against `thresholds` (20min / 6h) — don't recompute.
- **`messageToWalk(msg, prev)`** → if `msg.ts > prev.lastSeen`: emit a walk `from`→`to` desk (or →hub `crew-news-hub` @ ground 50,50 for broadcasts). `critical_path_blocker` → fire the **single** sanctioned Hearth knock. This is the only motion source — render real events only (truth-first).
- **`agentsToDirectory(agents)`** → rows `{name, role, color, dot: status}` for The Roster board + the Command-view legend.
- **`tasksToBoard(tasks)`** → counts by state + the BLOCKED/critical-path items (e.g. `TASK-077` first live auction, blocked by `TASK-050` Codex CLI). Link → task `location`.
- **`clusterStatus(agents)`** → working/idle/offline tallies + R-13/OptiPlex health from `roster_status`.
- **`loadToGlow(v)`** → `{ alpha: 0.3 + v*0.5, color: lerp('#2EE6C8','#F0479E', v) }` (calm→hot under load).
- **`wmoToWeather(code)`** → see `tokens.json.wmoMap`.

## 4. Two things to change in MY prototype to match SPEC-0014 v0.2

You flagged these in the spec and they're correct — my Live Village doesn't do them yet:

1. **Snap zoom to discrete levels** (Desk / Floor / Building), whole-number scales, pixel-snapped camera. My prototype tweens *continuous* zoom → that's the "pixel crawl" the Operator called out. Easy fix: quantize `camTarget.zoom` to the nearest level and round `cam.x/y` to integers before draw.
2. **LOD swap at Command view.** Mine always draws detailed sprites. At the zoomed-out Building view, swap avatars for **clean markers + name label + status light** (don't shrink detailed sprites — they go muddy). I can design that marker/label/status set (it's small) — it doubles as the dashboard legend. Want me to add both detail levels to `fable-art.js`?

## 5. First three bindings to light up (my recommendation)

1. **Crew presence** — the `crewTemplate` over `presence.json.agents[]`. Instant payoff: the whole crew appears, positioned, working/idle, in their team colors. Codex shows as a ghost (honest).
2. **Walk-to-deliver** — `world.deliveries`. Now the world *moves* on real bridge messages — the demo moment.
3. **The Mechanical Room board** — `bb.mechanical` from `task-registry.json`. A real, glanceable work queue with the auction critical path on it.

Then layer zone glows and the Roster directory. Weather/clock are already real.

---
Send me the `presence.json` field for an agent's *current task title* (I only see `messages[].subject` + the task-registry) and I'll wire the desk-side "what are you working on" readout. And if you want, I'll cut the Command-view LOD marker set + snapped-zoom patch into the prototype so you've got a reference for both.
