---
phase: 07-workflow-smoke-convention-locks
plan: 03
type: execute
wave: 1
depends_on: []
files_modified:
  - docs/adr/0011-bncentral-gridvania-chunking.md
autonomous: true
requirements: [MAP-02]
tags: [adr, ldtk, bncentral, gridvania, chunking]

must_haves:
  truths:
    - "ADR 0011 documents 3×3 GridVania chunk grid (9 chunks; odd dimension preserves central hub uninterrupted)"
    - "ADR 0011 documents chunk dimensions cols 2668/2664/2668 px, rows 2132/2136/2132 px summing to 8000×6400"
    - "ADR 0011 inline-verifies all chunk dimensions are multiples of 4 (honors gridSize=4)"
    - "ADR 0011 cites BNCentral 8000×6400 source-of-truth meta.json"
    - "ADR 0011 carries [doc->REQ-MAP-02] tag"
    - "Absorbs CONTEXT.md decisions D-09, D-10, D-11 (BNCentral Chunk Grid ADR category)"
  artifacts:
    - path: "docs/adr/0011-bncentral-gridvania-chunking.md"
      provides: "Locked BNCentral GridVania chunk grid; Phase 8 + smoke test inherit chunk dimensions"
      contains: "3×3"
  key_links:
    - from: "docs/adr/0011-bncentral-gridvania-chunking.md"
      to: "extracted/client-5-8/rooms/0058-BNCentral/meta.json"
      via: "8000×6400 source-of-truth citation"
      pattern: "8000.*6400"
    - from: "docs/adr/0011-bncentral-gridvania-chunking.md"
      to: "traceable-reqs.toml REQ-MAP-02"
      via: "[doc->REQ-MAP-02] tag"
      pattern: "\\[<doc>->REQ-MAP-02\\]"
---

<objective>
Author ADR 0011 locking the BNCentral GridVania chunking convention as a **3×3 GridVania (9 chunks)** with chunk dimensions **cols 2668/2664/2668 px, rows 2132/2136/2132 px** (sums = 8000×6400, all dims divisible by 4 to honor gridSize=4). Odd dimension keeps the central hub area in a single uninterrupted chunk. This ADR locks the chunk-grid convention only; concrete BNCentral conversion is v1.2 work.

Purpose: Provide a stable chunk-grid target for v1.2 BNCentral conversion AND for the Phase 7 smoke test (Plan 07-07) which authors a synthetic `8000×6400` LDtk world matching these exact dimensions. All chunks must stay well under LDtk's ~5000 px editor-lag threshold (deepnight/ldtk #1029, #1073).
Output: `docs/adr/0011-bncentral-gridvania-chunking.md` passing `lint-adr.mjs --no-matrix`.
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/07-workflow-smoke-convention-locks/07-CONTEXT.md
@.planning/phases/07-workflow-smoke-convention-locks/07-PATTERNS.md
@CLAUDE.md
</context>

<tasks>

<task type="auto">
  <name>Task 1: Author ADR 0011 BNCentral 3×3 GridVania chunking convention</name>
  <files>docs/adr/0011-bncentral-gridvania-chunking.md</files>

  <read_first>
    - docs/adr/0008-canvas-base-resolution.md (Pattern B template — verbatim header ordering: Date/Phase, blank, [<doc>->] tag, blank, ## Status; Positive/Negative/Neutral subsections)
    - tools/asset-catalog/scripts/lint-adr.mjs lines 67-72 (required ADR sections enforcement under --no-matrix mode)
    - CLAUDE.md §"Extracted Constants" (BNCentral 8000×6400 px source-of-truth — the dimension this chunk math must add to)
    - CLAUDE.md §"Requirements Traceability" (tagging contract)
    - .planning/phases/07-workflow-smoke-convention-locks/07-CONTEXT.md §"BNCentral Chunk Grid ADR" D-09..D-11 (3×3 GridVania, odd-dim hub-centric rationale, chunk dims, v1.2 deferral)
    - .planning/phases/07-workflow-smoke-convention-locks/07-PATTERNS.md §"docs/adr/0011-bncentral-gridvania-chunking.md" (MANDATORY arithmetic-check block from PITFALL 5)
    - extracted/client-5-8/rooms/0058-BNCentral/meta.json (8000×6400 source-of-truth referenced in ADR)
    - .planning/research/v1.1/PITFALLS.md §Pitfall #4 (BNCentral LDtk editor-lag rationale)
  </read_first>

  <action>
Create `docs/adr/0011-bncentral-gridvania-chunking.md` using Pattern B template. H1 `# ADR 0011: BNCentral GridVania chunking`, then `**Date:** 2026-05-20`, `**Phase:** 07 (Workflow Smoke + Convention Locks, Plan 07-03)`, blank, `[doc->REQ-MAP-02]` on its own line, blank, then six sections.

`## Status` — "Accepted" with re-eval gate: "Phase 7 smoke-test (Plan 07-07) operator UAT reports unacceptable lag on the 3×3 synthetic world. Absent that, locked through v1.2 BNCentral concrete conversion (out of v1.1 scope per ROADMAP). Concrete BNCentral conversion is v1.2 work; this ADR locks the chunk-grid convention only so v1.2 inherits a stable target."

`## Context` — explain: BNCentral is the largest BNO room at 8000×6400 px per `extracted/client-5-8/rooms/0058-BNCentral/meta.json` (cite CLAUDE.md Extracted Constants table). LDtk authoring is reported to lag significantly when individual Level dimensions exceed ~5000 px (cite deepnight/ldtk issues #1029, #1073, #985, #1006 — these are Phase 7 research-referenced upstream LDtk issues). A single 8000×6400 Level would be unauthorable. GridVania world-layout (LDtk multi-worlds where Levels are tiled in a grid) is the LDtk-native way to chunk a large zone while keeping a single playable world. Operator preference: odd-dim grid so the central hub area (BNCentral's namesake) lives in a single uninterrupted chunk — the highest-value area is easiest to author, not hardest.

`## Decision` — three numbered sub-decisions implementing D-09, D-10, D-11:
  1. Chunk grid = **3×3 GridVania** (9 chunks total) per D-09. Center chunk owns the BNCentral hub area uninterrupted — no central seam to author across or test transitions through.
  2. Chunk dimensions per D-10: cols `2668 / 2664 / 2668` px, rows `2132 / 2136 / 2132` px. Each chunk dimension is a multiple of 4 to honor gridSize=4 from ADR 0009. All chunks well under the LDtk ~5000 px editor-lag threshold.
  3. ADR file location + scope per D-11: this ADR locks the chunk-grid CONVENTION ONLY. Concrete BNCentral conversion (the 9-chunk authoring + import) is **out of v1.1 scope** (per ROADMAP "Carried out of v1.1 scope" — v1.2 work).

**MANDATORY arithmetic-check block** placed inside `## Decision` (per PATTERNS.md PITFALL 5 — verbatim form):
```
cols: 2668 + 2664 + 2668 = 8000 ✓ (matches BNCentral pxWid)
rows: 2132 + 2136 + 2132 = 6400 ✓ (matches BNCentral pxHei)
all dims % 4 == 0 ✓ (honors gridSize=4 from ADR 0009)
```

Add corner-coordinate worked example to make the smoke-test recipe (Plan 07-07) unambiguous: NW corner level at `(worldX=0, worldY=0)` is `2668×2132`; N edge level at `(worldX=2668, worldY=0)` is `2664×2132`; NE corner at `(worldX=5332, worldY=0)` is `2668×2132`; W edge at `(0, 2132)` is `2668×2136`; CENTER at `(2668, 2132)` is `2664×2136`; E edge at `(5332, 2132)` is `2668×2136`; SW at `(0, 4268)` is `2668×2132`; S at `(2668, 4268)` is `2664×2132`; SE at `(5332, 4268)` is `2668×2132`.

`## Consequences` — `### Positive`: central hub uninterrupted; all chunks within LDtk editor-comfort zone; gridSize=4 alignment preserved; deferred concrete conversion gives smoke-test (Plan 07-07) freedom to fail without blocking v1.1 close. `### Negative`: 9 chunks means 9 Level files (not one); cross-chunk transitions must be authored at edges (deferred to v1.2 implementation). `### Neutral`: 3×3 is odd, so any future 2×N or N×2 layout for other zones is a separate decision; this ADR scopes only BNCentral.

`## Alternatives considered` — bullet list with `Rejected: <reason>`:
  - Single 8000×6400 Level (no chunking) — Rejected: known LDtk editor lag above ~5000 px (deepnight/ldtk #1029, #1073).
  - 2×2 GridVania (4 chunks of 4000×3200) — Rejected: still near editor-lag threshold; central hub straddles all 4 chunks (worst case for authoring).
  - 4×4 GridVania (16 chunks of 2000×1600) — Rejected: too many chunks; central hub straddles the 2×2 center; transition overhead × 16.
  - 3×4 / 4×3 mixed — Rejected: asymmetric grid forces operator to remember row≠column count.

`## References` — bullet list:
  - `extracted/client-5-8/rooms/0058-BNCentral/meta.json` (8000×6400 source-of-truth)
  - `CLAUDE.md` §"Extracted Constants"
  - `docs/adr/0009-ldtk-gridsize-convention.md` (gridSize=4 invariant the chunk dims honor)
  - `.planning/phases/07-workflow-smoke-convention-locks/07-CONTEXT.md` D-09..D-11
  - `.planning/research/v1.1/PITFALLS.md` §Pitfall #4 (BNCentral LDtk editor-lag rationale)
  - deepnight/ldtk issues: #1029, #1073, #985, #1006 (external — cite URL format `https://github.com/deepnight/ldtk/issues/<n>`)

Do NOT include MX-* citations; this ADR uses `--no-matrix`.
  </action>

  <verify>
    <automated>node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0011-bncentral-gridvania-chunking.md --no-matrix</automated>
  </verify>

  <acceptance_criteria>
    - File `docs/adr/0011-bncentral-gridvania-chunking.md` exists.
    - File contains H1 starting `# ADR 0011:`.
    - File contains `[doc->REQ-MAP-02]` on its own line.
    - File contains all six required sections.
    - `## Decision` contains the literal arithmetic line `2668 + 2664 + 2668 = 8000` (or equivalent unspaced form).
    - `## Decision` contains the literal arithmetic line `2132 + 2136 + 2132 = 6400`.
    - `## Decision` contains the literal phrase `3×3` or `3x3`.
    - `## Decision` contains the literal phrase `multiple of 4` or `% 4` (gridSize=4 alignment proof).
    - `node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0011-bncentral-gridvania-chunking.md --no-matrix` exits 0.
  </acceptance_criteria>

  <done>
    ADR 0011 committed; lint passes; smoke-test plan (07-07) and v1.2 BNCentral conversion both inherit the locked 3×3 chunk grid with exact per-chunk dimensions.
  </done>
</task>

</tasks>

<threat_model>
## Trust Boundaries

| Boundary | Description |
|----------|-------------|
| operator → repo | Documentation; no runtime code surface in Phase 7 |

## STRIDE Threat Register

| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-07-03-T | Tampering | chunk-dim arithmetic drift (someone edits ADR without re-running the sum) | mitigate | Acceptance criteria pin the literal arithmetic lines; Plan 07-07 smoke test re-uses the exact same numbers (cross-check) |
| T-07-03-R | Repudiation | future operator forgets why 3×3 (not 2×2 or 4×4) | mitigate | `## Alternatives considered` documents rejection rationale for each |
| T-07-03-SC | Tampering (supply chain) | npm/pnpm | accept | Zero new dependencies — ADR markdown only |
</threat_model>

<verification>
- `node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0011-bncentral-gridvania-chunking.md --no-matrix` exits 0
- `grep -c "2668 + 2664 + 2668 = 8000" docs/adr/0011-bncentral-gridvania-chunking.md` returns ≥ 1
- `grep -c "2132 + 2136 + 2132 = 6400" docs/adr/0011-bncentral-gridvania-chunking.md` returns ≥ 1
- `grep -c "\[<doc>->REQ-MAP-02\]" docs/adr/0011-bncentral-gridvania-chunking.md` returns ≥ 1
</verification>

<success_criteria>
ADR 0011 committed, passes ADR lint, contains the verbatim arithmetic checks, carries `[doc->REQ-MAP-02]`, locks 3×3 GridVania chunk grid per CONTEXT.md D-09..D-11.
</success_criteria>

<output>
Create `.planning/phases/07-workflow-smoke-convention-locks/07-03-SUMMARY.md` when done.
</output>
