# 12 — Map Update Protocol (Mandatory)
> This is not optional. If a change alters what the product can do, which
> infrastructure exists, or how developed something is, the map must be updated
> **in the same unit of work**. A feature is not "done" until the map reflects it.
>
> The agent obligation is stated in [`../../AGENTS.md`](../../AGENTS.md).
---
## 1. The rule in one line
> **Feature change ⇒ map change, in the same commit / PR.**
No feature work is complete if `docs/map/10-feature-catalog.md` (and, when relevant,
`docs/map/11-gap-backlog.md`) is stale.
---
## 2. When to trigger an update
Trigger on any of these events:
| Event | Must update |
|---|---|
| **New feature** added on any surface | Feature catalog row (`10`), surface doc (`04`–`09`) if infra changed, remove matching backlog row (`11`) |
| **Feature changed** (behavior, platform coverage, tier, provider) | Feature catalog status/notes, surface doc if interfaces changed |
| **Feature deleted / de-scoped** | Flip catalog row to reflect removal (delete row or mark `[-]` with reason), surface doc cleanup, note in `11` §4 if documentation moved |
| **Feature deferred to backlog** | Add row to `11-gap-backlog.md` (§1–3) and mark catalog `[ ]` |
| **Backlog item resolved** | Flip `11` row to `[x]` with date + evidence, update catalog to `[x]`, prune after one cycle |
| **External blocker cleared** | Flip `EXT-*` to `[x]` with evidence, update the affected catalog rows |
| **New app / package / service / Edge Function / CI workflow** | `02-infrastructure.md` and the relevant surface doc (`04`–`09`) |
| **Version bump** (`release/product-version.json`) | `00-index.md` header "Last full audit", `02` §9 |
| **Surface architecture change** (new IPC group, new route, new provider) | Surface doc + `03-shared-packages.md` if shared |
---
## 3. The update checklist
Run this before declaring any feature task complete:
1. **Locate the feature** in `10-feature-catalog.md`. If it has no ID, add a row with a new ID in the right domain (`CAP/AI/MEM/MTG/CV/ACC/TEAM/MON/SHELL/INFRA`).
2. **Set status per surface** (`D/W/M/B`) using the legend (`00-index.md` §2). Status is per platform, not global.
3. **Add file anchors** in the row notes (short `path:line` where useful) so the next agent can verify.
4. **Update the surface doc** (`04`–`09`) if you added/removed a service, route, screen, IPC channel, table, or function.
5. **Update `02-infrastructure.md`** if you touched build, CI, Docker, deploy, scripts, or release identity.
6. **Update `11-gap-backlog.md`**:
- Closing an open gap → `[x]` + date + evidence path.
- Creating a newly deferred item → new row with ID, gap, evidence, next step.
- Clearing external blocker → `[x]` + evidence.
7. **Reconcile with the mobile SSOT** if the change touches mobile: `docs/v3/MOBILE_APP_COMPLETION_SSOT.md` remains authoritative for mobile checklist rows. If the SSOT and this map disagree, fix the SSOT first, then this map.
8. **Bump the header**: update `00-index.md` "Last full audit" date only for a full re-audit; for incremental changes update the per-file `> Last updated` line if you add one.
9. **Commit the docs with the code** (same commit or same PR), with a clear message.
---
## 4. Status semantics (do not abuse)
| Status | Requires |
|---|---|
| `[x]` | Code exists **and** is verified (tests/evidence in repo or an evidenced manual run recorded in the map/SSOT). |
| `[~]` | Code exists but is partial, unverified, or blocked. Say *what* is missing in the notes. |
| `[ ]` | Planned or absent. If planned, ensure a `11` backlog row exists. |
| `[!]` | Code is done but "done" is blocked by something outside the repo. Name the external gate. |
| `[-]` | Genuinely N/A for that surface. Add a one-line reason. |
Never mark `[x]` to reflect "typecheck passed" alone. Typecheck ≠ runtime ≠ verified feature.
---
## 5. Ownership & cadence
- **Every feature task** updates its own rows (no batching).
- **Every refactor wave / phase close** triggers a reconcile pass over `10` and `11`.
- **Weekly or per-release** do a light sweep: scan for rows whose status no longer matches code; fix drift.
- **Per release** (`release/product-version.json` bump) do a full re-audit of `02`, `09`, and the header dates.
---
## 6. Anti-drift rules
- Do not create a second feature list elsewhere. This catalog is the SSOT for "what exists and how done".
- Do not describe status in prose only. Use the tables and the legend.
- Do not leave a `[~]`/`[!]` row without a note explaining the remaining work.
- Do not add a feature to the product without adding it here.
- If you genuinely cannot determine status, mark `[~]` and add a backlog row "verify status of X" rather than guessing or leaving it blank.
---
## 7. Quick templates
**New feature row (catalog):**
```
| CAP-16 | Feature name | [x] | [ ] | [~] | [x] | short anchors; what's partial |
```
**New gap row (backlog §1):**
```
| GAP--NN | Area | What's missing | file anchors | Suggested next step |
```
**New external blocker (backlog §3):**
```
| EXT--NN | Blocker | What is needed | where tracked |
```