<task-notification>
<task-id>aada27e5a9993ba8f</task-id>
<tool-use-id>toolu_01SHg5gT44gj3GrmXznmrtaC</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\aada27e5a9993ba8f.output</output-file>
<status>completed</status>
<summary>Agent "Recon: NPC dialogue extraction integrity" completed</summary>
<result>Report written to `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\10-npc-dialogue-integrity.md`.

VERDICT: PRESENT — NPC dialogue fully survived extraction. No data loss, no re-extraction needed.

Key findings:
- The owner's hypothesis is correct: per-NPC dialogue lives in instance creation code, NOT object events. The base object `npc_greenprog` (id 376) only holds `nullcheck`-guarded defaults ("Mr. Prog" / "Hello, I'm Mr. Prog..."), which apply only when an instance doesn't override them.
- The room extraction format DOES capture per-instance creation code. `rooms/*/instances.json` is a JSON array where each instance has a `creationCode` field, and for NPCs it is populated with the real text: `name`, `say`/`say[]` arrays, `sayings`, `saytype`, plus `pcode_*` movement calls.
- Coverage: 66 NPC instances across 11 rooms; 64 carry populated creation code. The 2 "empty" ones (in Database) are legitimate source defaults that intentionally use the object's fallback text — not dropped data. (Confirmed normal: only 30 of 6141 BNCentral instances have non-empty creation code, so `""` is the expected value for most instances.)
- The hint-giver NPCs are intact with their spatial hints — e.g. Pallikos (ctrl+r run hint, 13-line cycle), B.U. Gaito / Nelelle / Coptre (directional hints naming adjacent/hidden zones), and REAPROG the abyss wanderer (path-driven fade/respawn in Digital_Abyss, with its own Create-event defaults).
- Tool confirmation: `tools/extract-gmd/src/reader/rooms.ts:152` reads `instCreationCode = r.readStr()` per instance; `types.ts:222` documents the field; reader test RM-04 round-trips it. Instance creation code was never out of scope.

Rebuild note for the NPC/dialogue importer: parse `instances.json[].creationCode` to recover dialogue; treat the object Create-event defaults only as fallback.</result>
<usage><subagent_tokens>52014</subagent_tokens><tool_uses>17</tool_uses><duration_ms>149616</duration_ms></usage>
</task-notification>


-avatar customization: while it is mostly aesthetically a palette swap, there is one suite of spectrum data (P or PH, coded after "phoenix") which actually had unique shapes/silhouette and didn't look…


ReBNO feature parity and platform expansion


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


<task-notification>
<task-id>a6dea409fe4103cba</task-id>
<tool-use-id>toolu_011aDPBZqiRsnKXTVRyULvZo</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\a6dea409fe4103cba.output</output-file>
<status>completed</status>
<summary>Agent "Recon: message data feature" completed</summary>
<result>Report written to `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\11-message-data.md`.

## Summary

**MESSAGE DATA (inventory category 4) is ~25% built — a read-only stub.** The owner's "half-implemented" recall is generous; it's closer to a quarter, all of it on the read side.

**What works:** A storage string format `Title#1#Author#2#ModDate#3#ModTime#4#Body` (5 fields, parsed by `iv_mdatainfo.gml`), an inventory icon with an editable-vs-readable distinction (`IC_MData_Editable`/`IC_MData_Readable`, chosen by an author == playername check), and generic server persistence — the whole inventory blob round-trips via msgid 8 with no special-casing for category 4, so items *would* save if any existed. The only working runtime action is **View**, which dumps the note to the chat log.

**What's stubbed (menu entry present, body inert):** **Edit** — the author-only guard works, but on success it literally prints `'When this is in, you will now be editing the message.'` and no-ops. **Delete** — present in the menu but its body only closes the menu; unlike Friend/Link/Key delete, it never calls `iv_collapse`, so nothing is removed.

**What's entirely absent:** the write/create UI (no `iv_additem(4,...)` call exists anywhere — the two notes in-game are hardcoded test seeds), any **world-drop object** (`d_spectrum`/`d_link`/`d_key` exist; no `d_message`), any **send-to-friend** path (no msgid, command, or recipient field), and any **stranger-lock or lifetime/expiry** logic (no such field in the format; seed timestamps are literal `MM/DD/YY` placeholders, never written for real).

**Strongest evidence the rest was *planned but unbuilt*:** the author's own comment at `iv_backdraw/Create.gml:160-162` lists "Use, **Send, Drop** (for Message Data), Delete, Duplicate, **Edit**" as possible actions — Send and Drop were intended, never coded.

**Build vs port for ReBNO:** Port only the data format and read/parse path. Build from scratch: authoring/edit UI, world-drop entity + pickup, send-to-friend delivery, stranger-lock, and lifetime/expiry — and if redesigning, add the recipient/lock/expiry fields the legacy 5-field format never had. Full `file:line` evidence table is in the report. Lowest-confidence claim (flagged): the Delete "stub" verdict is inferred from the missing `iv_collapse` call rather than an explicit TODO.</result>
<usage><subagent_tokens>75738</subagent_tokens><tool_uses>32</tool_uses><duration_ms>152544</duration_ms></usage>
</task-notification>


NPC integrity: **VERDICT PRESENT — no data loss.** Extraction *does* capture per-instance `creationCode` (`instances.json[].creationCode`), 64/66 NPC instances populated (the 2 empty ones legitimately fall back to object defaults). Hint-givers intact — Pallikos (run-hint), B.U. Gaito / Nelelle / Coptre (directional hints naming adjacent/hidden zones), REAPROG the abyss guide. No re-extraction needed. Correcting the caveat:


Edit

**NPC**:
Non-player characters are **functional hint-givers**, not pure flavor. Some give dialogue hints
about nearby hidden paths/platforms/puzzles — that dialogue lived in each NPC's **instance
creation code** (room-editor per-instance code), which is **at risk of having been dropped by
extraction** (verification in progress — possible data loss). **REAPROG** is a "spooky" Abyss
wanderer that **guides the player out if they choose to follow**. Some NPCs are positioned **on
hidden tiles or in obscure spots** — a deliberate *visual hint* that those places are reachable.
They give no items, and there is no quest system. (~14 "**Mr. Prog**" talkers populate BNCentral.)

**NPC**:
Non-player characters are **functional hint-givers**, not pure flavor. Some give dialogue hints
about nearby hidden paths/platforms/puzzles; this dialogue lives in each NPC's **instance
creation code** (`rooms/*/instances.json[].creationCode` — `name`, `say`/`sayings`, `saytype`),
**confirmed fully preserved by extraction** (64/66 instances populated; no data loss). Named
hint-givers: **Pallikos** (run-hint), **B.U. Gaito / Nelelle / Coptre** (directional hints naming
adjacent/hidden zones); **REAPROG** is a "spooky" Abyss wanderer that **guides the player out if
they choose to follow**. Some NPCs stand **on hidden tiles or in obscure spots** — a deliberate
*visual hint* that those places are reachable. They give no items, and there is no quest system.
(~14 "**Mr. Prog**" talkers populate BNCentral.) _Importer: parse `creationCode`; object
Create-event text is only the fallback._


The file C:\Users\decid\Documents\projects\rebno\CONTEXT.md has been updated successfully. (file state is current in your context — no need to Read it back)

**NPC**:
Non-player characters are **functional hint-givers**, not pure flavor. Some give dialogue hints
about nearby hidden paths/platforms/puzzles — that dialogue lived in each NPC's **instance
creation code** (room-editor per-instance code), which is **at risk of having been dropped by
extraction** (verification in progress — possible data loss). **REAPROG** is a "spooky" Abyss
wanderer that **guides the player out if they choose to follow**. Some NPCs are positioned **on
hidden tiles or in obscure spots** — a deliberate *visual hint* that those places are reachable.
They give no items, and there is no quest system. (~14 "**Mr. Prog**" talkers populate BNCentral.)

**NPC**:
Non-player characters are **functional hint-givers**, not pure flavor. Some give dialogue hints
about nearby hidden paths/platforms/puzzles; this dialogue lives in each NPC's **instance
creation code** (`rooms/*/instances.json[].creationCode` — `name`, `say`/`sayings`, `saytype`),
**confirmed fully preserved by extraction** (64/66 instances populated; no data loss). Named
hint-givers: **Pallikos** (run-hint), **B.U. Gaito / Nelelle / Coptre** (directional hints naming
adjacent/hidden zones); **REAPROG** is a "spooky" Abyss wanderer that **guides the player out if
they choose to follow**. Some NPCs stand **on hidden tiles or in obscure spots** — a deliberate
*visual hint* that those places are reachable. They give no items, and there is no quest system.
(~14 "**Mr. Prog**" talkers populate BNCentral.) _Importer: parse `creationCode`; object
Create-event text is only the fallback._

-about nearby hidden paths/platforms/puzzles — that dialogue lived in each NPC's **instance

-creation code** (room-editor per-instance code), which is **at risk of having been dropped by

-extraction** (verification in progress — possible data loss). **REAPROG** is a "spooky" Abyss

-wanderer that **guides the player out if they choose to follow**. Some NPCs are positioned **on

-hidden tiles or in obscure spots** — a deliberate *visual hint* that those places are reachable.

-They give no items, and there is no quest system. (~14 "**Mr. Prog**" talkers populate BNCentral.)

+about nearby hidden paths/platforms/puzzles; this dialogue lives in each NPC's **instance

+creation code** (`rooms/*/instances.json[].creationCode` — `name`, `say`/`sayings`, `saytype`),

+**confirmed fully preserved by extraction** (64/66 instances populated; no data loss). Named

+hint-givers: **Pallikos** (run-hint), **B.U. Gaito / Nelelle / Coptre** (directional hints naming

+adjacent/hidden zones); **REAPROG** is a "spooky" Abyss wanderer that **guides the player out if

+they choose to follow**. Some NPCs stand **on hidden tiles or in obscure spots** — a deliberate

+*visual hint* that those places are reachable. They give no items, and there is no quest system.

+(~14 "**Mr. Prog**" talkers populate BNCentral.) _Importer: parse `creationCode`; object

+Create-event text is only the fallback._

There is **no currency** — progression is purely keyed unlocks (no economy in the port; possibly


Prompt:
<task-notification>
<task-id>a6dea409fe4103cba</task-id>
<tool-use-id>toolu_011aDPBZqiRsnKXTVRyULvZo</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\a6dea409fe4103cba.output</output-file>
<status>completed</status>
<summary>Agent "Recon: message data feature" completed</summary>
<result>Report written to `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\11-message-data.md`.

## Summary

**MESSAGE DATA (inventory category 4) is ~25% built — a read-only stub.** The owner's "half-implemented" recall is generous; it's closer to a quarter, all of it on the read side.

**What works:** A storage string format `Title#1#Author#2#ModDate#3#ModTime#4#Body` (5 fields, parsed by `iv_mdatainfo.gml`), an inventory icon with an editable-vs-readable distinction (`IC_MData_Editable`/`IC_MData_Readable`, chosen by an author == playername check), and generic server persistence — the whole inventory blob round-trips via msgid 8 with no special-casing for category 4, so items *would* save if any existed. The only working runtime action is **View**, which dumps the note to the chat log.

**What's stubbed (menu entry present, body inert):** **Edit** — the author-only guard works, but on success it literally prints `'When this is in, you will now be editing the message.'` and no-ops. **Delete** — present in the menu but its body only closes the menu; unlike Friend/Link/Key delete, it never calls `iv_collapse`, so nothing is removed.

**What's entirely absent:** the write/create UI (no `iv_additem(4,...)` call exists anywhere — the two notes in-game are hardcoded test seeds), any **world-drop object** (`d_spectrum`/`d_link`/`d_key` exist; no `d_message`), any **send-to-friend** path (no msgid, command, or recipient field), and any **stranger-lock or lifetime/expiry** logic (no such field in the format; seed timestamps are literal `MM/DD/YY` placeholders, never written for real).

**Strongest evidence the rest was *planned but unbuilt*:** the author's own comment at `iv_backdraw/Create.gml:160-162` lists "Use, **Send, Drop** (for Message Data), Delete, Duplicate, **Edit**" as possible actions — Send and Drop were intended, never coded.

**Build vs port for ReBNO:** Port only the data format and read/parse path. Build from scratch: authoring/edit UI, world-drop entity + pickup, send-to-friend delivery, stranger-lock, and lifetime/expiry — and if redesigning, add the recipient/lock/expiry fields the legacy 5-field format never had. Full `file:line` evidence table is in the report. Lowest-confidence claim (flagged): the Delete "stub" verdict is inferred from the missing `iv_collapse` call rather than an explicit TODO.</result>
<usage><subagent_tokens>75738</subagent_tokens><tool_uses>32</tool_uses><duration_ms>152544</duration_ms></usage>
</task-notification>


Message Data recon in — last one. Legacy is **~25% built (read-only stub)**: the storage format + View work; **Edit/Delete are inert stubs**; **create UI, world-drop, send-to-friend, stranger-lock, and expiry were never coded** (the author's own comment lists "Send, Drop" as intended-but-unbuilt). So "fully realize" = mostly **net-new build**, and the legacy 5-field format lacks recipient/lock/expiry fields. Correcting the entry:


**Message Data** (inventory category 4) _(legacy half-implemented; ReBNO intends to fully realize)_:
A player-authored note — like a Minecraft book. Full intended feature: write a message, then
either **drop it in the world** (anywhere) or **send it to a friend** via Friend Data (an in-game
email). Planned options: a **stranger lock** (only players who hold your Friend Data can open it)
and a **lifetime** (it returns to the author, or disappears, if not picked up within N days).
Distinct from **Message Board** (global per-zone walls).

**Message Data** (inventory category 4) _(legacy ~25% built; ReBNO intends to fully realize)_:
A player-authored note — like a Minecraft book. Full intended feature: write a message, then
either **drop it in the world** (anywhere) or **send it to a friend** via Friend Data (an in-game
email). Planned options: a **stranger lock** (only players who hold your Friend Data can open it)
and a **lifetime** (it returns to the author, or disappears, if not picked up within N days).
Distinct from **Message Board** (global per-zone walls).
_Legacy state: only the storage format (`Title#…#Body`, 5 fields) + a read-only **View** path
exist; **Edit/Delete are inert stubs**; create UI, world-drop entity, send-to-friend, stranger-
lock and expiry were **never coded**. ReBNO = mostly net-new build; the 5-field format must gain
recipient / lock / expiry fields._


**Message Data** (inventory category 4) _(legacy half-implemented; ReBNO intends to fully realize)_:
A player-authored note — like a Minecraft book. Full intended feature: write a message, then
either **drop it in the world** (anywhere) or **send it to a friend** via Friend Data (an in-game
email). Planned options: a **stranger lock** (only players who hold your Friend Data can open it)
and a **lifetime** (it returns to the author, or disappears, if not picked up within N days).
Distinct from **Message Board** (global per-zone walls).

**Message Data** (inventory category 4) _(legacy ~25% built; ReBNO intends to fully realize)_:
A player-authored note — like a Minecraft book. Full intended feature: write a message, then
either **drop it in the world** (anywhere) or **send it to a friend** via Friend Data (an in-game
email). Planned options: a **stranger lock** (only players who hold your Friend Data can open it)
and a **lifetime** (it returns to the author, or disappears, if not picked up within N days).
Distinct from **Message Board** (global per-zone walls).
_Legacy state: only the storage format (`Title#…#Body`, 5 fields) + a read-only **View** path
exist; **Edit/Delete are inert stubs**; create UI, world-drop entity, send-to-friend, stranger-
lock and expiry were **never coded**. ReBNO = mostly net-new build; the 5-field format must gain
recipient / lock / expiry fields._

friend's connect/disconnect notices client-side — it is **not a hard gate**. _ReBNO: modernize

in place — move the friend graph + presence server-side._

-**Message Data** (inventory category 4) _(legacy half-implemented; ReBNO intends to fully realize)_:

+**Message Data** (inventory category 4) _(legacy ~25% built; ReBNO intends to fully realize)_:

+_Legacy state: only the storage format (`Title#…#Body`, 5 fields) + a read-only **View** path

+exist; **Edit/Delete are inert stubs**; create UI, world-drop entity, send-to-friend, stranger-

+lock and expiry were **never coded**. ReBNO = mostly net-new build; the 5-field format must gain

Legacy presence is **ephemeral and global** — a live `p_online[pid]` socket array broadcast to


All eleven recon docs are in and `CONTEXT.md` is a complete domain glossary. We've reached the synthesis point.

## Mutual understanding — locked

**What BNO *is*:** a social-exploration **Metroidvania-of-connectivity** — no combat, no economy, no quests. The loop: reach a Zone's Central Portal → claim its Zone Link → Area-links light up → find Navi-Expansion Key Items → unlock the next zone. Progression *is* the inventory.

**The load-bearing truth for the rebuild:** legacy is **fully client-authoritative** (the Master is a pure relay). ReBNO's server-authoritative model is therefore a **ground-up rebuild of the entire rule layer**, not a port — the single biggest divergence, alongside the plaintext-password and RCE-admin anti-ports.

**ReBNO design pillars that emerged:** Perception gating (you perceive only what your progression/relationships grant — avatars, chat, markers, location names), gamepad-first input (retiring backtick commands), the visible/refillable Fall Safety Buffer, and the parity-vs-new-system scope test.

**Net-new / expanded for ReBNO:** Message Data (legacy ~25% — mostly net-new), Quick Portal (new QoL bookmark), richer customization (post-parity, rides the IP-shed), modern onboarding (no OCS, spawn into BNCentral, creation-time Spectrum pick).

**Good news:** NPC hint dialogue fully survived extraction (no data loss). **Open archaeology:** the hexsling "prefer-not-travelling" rule isn't in 5-8 — settling it needs a pre-5-8 client extraction.

A few decisions are heavy enough to deserve durable records beyond the glossary:


AskUserQuestion

Question: The grill produced a few decisions/threads worth recording beyond CONTEXT.md. Which should I action to close out the session?

Choices:
Write docs/adr/0013 locking the per-player visibility pillar (avatars/chat/map-markers/location names are revealed only by progression + relationships). Hard to reverse — drives interest-management, render, and chat routing — and a deliberate NEW system vs legacy's client-relay. Strongest ADR candidate.
Record the parity-vs-new-system dividing test + the mandated divergences (server authority, no-RCE, argon2) into PROJECT.md so it governs future planning, not just this glossary.
Spin a recon pass to fix doc-vs-5-8-code drift (the hexsling rule was wrong; likely more in the tile-mechanics section). Makes the hand-written reference trustworthy for the Phase 9 conversion work.
Treat the session as complete — commit CONTEXT.md and the 11 .planning/legacy-recon/ docs, no further artifacts right now.


Your questions have been answered: "The grill produced a few decisions/threads worth recording beyond CONTEXT.md. Which should I action to close out the session?"="ADR: Perception gating, Scope principle → PROJECT.md, Reconcile LEGACY_FEATURE_REFERENCE.md, note about perception gating: relationships do not affect what avatars or chat you can see. -there were a few things at the start of the grilling session from before you started recon. might want to flesh those out with recon. -ignore the hexsling terms mismatch. we'll just port them as they exist in the 5.8 legacy code. -note that some of the behavior mismatches in the legacy feature reference are *the intended behavior for rebno*, rather than a full-faith log of the existing behavior. those should be preserved". You can now continue with these answers in mind.

Question: The grill produced a few decisions/threads worth recording beyond CONTEXT.md. Which should I action to close out the session?

Choices:
Write docs/adr/0013 locking the per-player visibility pillar (avatars/chat/map-markers/location names are revealed only by progression + relationships). Hard to reverse — drives interest-management, render, and chat routing — and a deliberate NEW system vs legacy's client-relay. Strongest ADR candidate.
Record the parity-vs-new-system dividing test + the mandated divergences (server authority, no-RCE, argon2) into PROJECT.md so it governs future planning, not just this glossary.
Spin a recon pass to fix doc-vs-5-8-code drift (the hexsling rule was wrong; likely more in the tile-mechanics section). Makes the hand-written reference trustworthy for the Phase 9 conversion work.
Treat the session as complete — commit CONTEXT.md and the 11 .planning/legacy-recon/ docs, no further artifacts right now.

ADR: Perception gating, Scope principle → PROJECT.md, Reconcile LEGACY_FEATURE_REFERENCE.md, note about perception gating: relationships do not affect what avatars or chat you can see. -there were a few things at the start of the grilling session from before you started recon. might want to flesh those out with recon. -ignore the hexsling terms mismatch. we'll just port them as they exist in the 5.8 legacy code. -note that some of the behavior mismatches in the legacy feature reference are *the intended behavior for rebno*, rather than a full-faith log of the existing behavior. those should be preserved


All four approved — and your closing notes change a few things. Capturing them precisely:

- **Perception-gating correction:** relationships do **not** affect raw avatar/chat visibility (that's spatial/progression only). I'll fix the pillar — relationships can grant *markers*, not in-world avatar/chat sight.
- **Hexsling:** port the 5-8 behavior as-is; stop chasing pre-5-8. Closing that thread.
- **Critical for the reconcile:** `LEGACY_FEATURE_REFERENCE.md` deliberately mixes *legacy-truth* and *ReBNO-intended* behavior — so the reconcile must **classify** each mismatch, never auto-"fix" to legacy. The reconcile recon will also flesh out the early-grilled tile-mechanics + sync topics.

Stage 1 — CONTEXT corrections + launch the reconcile recon + read the ADR format:


Edit

**Perception gating** (ReBNO):
The unifying rule — *you perceive only what your progression and relationships grant.* It governs
**avatar visibility** (hidden-tile bodies, Duo), **chat** (can't see a Navi's avatar → can't see
their chat), **map / friend markers** (shown only when the friend's avatar is visible to you —
**except Duo partners**, whose markers are visible worldwide), and **friend location text** (you
see a friend's Zone name only if you hold that Zone's Link Data, their Area name only if you hold
that Area's Link Data — otherwise `???`).

**Perception gating** (ReBNO):
The unifying rule — *you perceive only what your **progression and spatial state** grant.*
**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an
  avatar otherwise hidden from you.
- **Chat** — inherits avatar visibility (can't see the avatar → can't see their chat).
- **Map markers** — *may* be relationship-granted (metadata, not in-world sight): a friend's
  marker shows only when their avatar is visible to you, **except Duo partners**, whose markers
  are visible worldwide.
- **Friend location text** — gated by *your* Link Data: a friend's Zone name shows only if you
  hold that Zone's Link Data, their Area name only if you hold that Area's Link Data, else `???`.


**Perception gating** (ReBNO):
The unifying rule — *you perceive only what your progression and relationships grant.* It governs
**avatar visibility** (hidden-tile bodies, Duo), **chat** (can't see a Navi's avatar → can't see
their chat), **map / friend markers** (shown only when the friend's avatar is visible to you —
**except Duo partners**, whose markers are visible worldwide), and **friend location text** (you
see a friend's Zone name only if you hold that Zone's Link Data, their Area name only if you hold
that Area's Link Data — otherwise `???`).

**Perception gating** (ReBNO):
The unifying rule — *you perceive only what your **progression and spatial state** grant.*
**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an
  avatar otherwise hidden from you.
- **Chat** — inherits avatar visibility (can't see the avatar → can't see their chat).
- **Map markers** — *may* be relationship-granted (metadata, not in-world sight): a friend's
  marker shows only when their avatar is visible to you, **except Duo partners**, whose markers
  are visible worldwide.
- **Friend location text** — gated by *your* Link Data: a friend's Zone name shows only if you
  hold that Zone's Link Data, their Area name only if you hold that Area's Link Data, else `???`.

planned first-class accessibility feature (also serving controller play).

-The unifying rule — *you perceive only what your progression and relationships grant.* It governs

-**avatar visibility** (hidden-tile bodies, Duo), **chat** (can't see a Navi's avatar → can't see

-their chat), **map / friend markers** (shown only when the friend's avatar is visible to you —

-**except Duo partners**, whose markers are visible worldwide), and **friend location text** (you

-see a friend's Zone name only if you hold that Zone's Link Data, their Area name only if you hold

-that Area's Link Data — otherwise `???`).

+The unifying rule — *you perceive only what your **progression and spatial state** grant.*

+**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:

+- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their

+  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an

+- **Chat** — inherits avatar visibility (can't see the avatar → can't see their chat).

+- **Map markers** — *may* be relationship-granted (metadata, not in-world sight): a friend's

+  marker shows only when their avatar is visible to you, **except Duo partners**, whose markers

+- **Friend location text** — gated by *your* Link Data: a friend's Zone name shows only if you

+  hold that Zone's Link Data, their Area name only if you hold that Area's Link Data, else `???`.


Benefits: partners always see each other (overrides hidden-tile visibility); auto-accepted
Summon/Join between them; a **teleport tether** (link-data teleport is blocked while in a duo; the
digger auto-rejoins the spotter on transit); and the **Duo Net**.

Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per
**Perception gating** this is camera/marker — NOT a general avatar-visibility override);
auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while
in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.
_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter
hasn't reached? — confirm._


Benefits: partners always see each other (overrides hidden-tile visibility); auto-accepted
Summon/Join between them; a **teleport tether** (link-data teleport is blocked while in a duo; the
digger auto-rejoins the spotter on transit); and the **Duo Net**.

Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per
**Perception gating** this is camera/marker — NOT a general avatar-visibility override);
auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while
in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.
_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter
hasn't reached? — confirm._

**Duo** (via the **DuoPlugn** Navi Expansion; the **Duo System**):

A **mutual, consented** pairing of two Navis (gated by `DuoPlugn`), modelled on Mega Man Legends'

digger+spotter. Roles: **Digger** (explores) + **Spotter** (rides a *pannable* duo-camera).

-Benefits: partners always see each other (overrides hidden-tile visibility); auto-accepted

-Summon/Join between them; a **teleport tether** (link-data teleport is blocked while in a duo; the

-digger auto-rejoins the spotter on transit); and the **Duo Net**.

+Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per

+**Perception gating** this is camera/marker — NOT a general avatar-visibility override);

+auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while

+in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.

+_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter

The two Duo roles — **Spotter** (pannable observation camera + assist) and **Digger** (the Navi


5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. (No "prefer the direction you weren't travelling" rule in 5-8 — that reversal
is the **hexbridge** zero-arrow bounce, a different object. The behavior described in
`docs/LEGACY_FEATURE_REFERENCE.md` is inaccurate for 5-8; see Flagged ambiguities.) **Hexbridge**

5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. **ReBNO ports this 5-8 behavior as-is** (the `LEGACY_FEATURE_REFERENCE.md`
"prefer-the-direction-you-weren't-travelling" wording is dropped — that reversal is only the
hexbridge zero-arrow bounce). **Hexbridge**


5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. (No "prefer the direction you weren't travelling" rule in 5-8 — that reversal
is the **hexbridge** zero-arrow bounce, a different object. The behavior described in
`docs/LEGACY_FEATURE_REFERENCE.md` is inaccurate for 5-8; see Flagged ambiguities.) **Hexbridge**

5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. **ReBNO ports this 5-8 behavior as-is** (the `LEGACY_FEATURE_REFERENCE.md`
"prefer-the-direction-you-weren't-travelling" wording is dropped — that reversal is only the
hexbridge zero-arrow bounce). **Hexbridge**

six light orbs that re-form into a flat hexagon of light, travelling in a straight line across

empty space and *under* the floor tiles. **Hexsling** tiles redirect a hexporting Navi: in the

-arrow-key choice. (No "prefer the direction you weren't travelling" rule in 5-8 — that reversal

-is the **hexbridge** zero-arrow bounce, a different object. The behavior described in

-`docs/LEGACY_FEATURE_REFERENCE.md` is inaccurate for 5-8; see Flagged ambiguities.) **Hexbridge**

+arrow-key choice. **ReBNO ports this 5-8 behavior as-is** (the `LEGACY_FEATURE_REFERENCE.md`

+"prefer-the-direction-you-weren't-travelling" wording is dropped — that reversal is only the

+hexbridge zero-arrow bounce). **Hexbridge**

tiles bounce it back after spawning a floor tile recorded **permanently per-account** (bridge id

= `x + room + y`), synced to the server and replayed at every login — cleared hexbridges persist


- ⚠ **Hexsling direction rule** — resolved for 5-8, and it **contradicts the user's memory AND
  `docs/LEGACY_FEATURE_REFERENCE.md`**: 5-8 hexslings do ≤1-exit auto-pick / >1-exit
  wait-for-input; there is NO "prefer the direction not travelled" (that's the hexbridge
  zero-arrow bounce). If the recalled rule ever existed it's in an un-extracted pre-5-8 client.
  **Action: reconcile `LEGACY_FEATURE_REFERENCE.md` against 5-8 code — it may have other drift.**

- ✅ **Hexsling direction rule** — RESOLVED: **port the 5-8 behavior as-is** (≤1-exit auto-pick /
  >1-exit wait-for-input). The pre-5-8 "prefer-not-travelling" rule is dropped, not chased.
- 📋 **`LEGACY_FEATURE_REFERENCE.md` is dual-purpose** — it mixes *faithful legacy log* AND
  *ReBNO-intended behavior*. A reconcile pass vs 5-8 code must **classify** each mismatch
  (legacy-drift vs ReBNO-intent) rather than auto-correct to legacy; ReBNO-intent entries are
  preserved. _(In progress — recon classifying.)_


- ⚠ **Hexsling direction rule** — resolved for 5-8, and it **contradicts the user's memory AND
  `docs/LEGACY_FEATURE_REFERENCE.md`**: 5-8 hexslings do ≤1-exit auto-pick / >1-exit
  wait-for-input; there is NO "prefer the direction not travelled" (that's the hexbridge
  zero-arrow bounce). If the recalled rule ever existed it's in an un-extracted pre-5-8 client.
  **Action: reconcile `LEGACY_FEATURE_REFERENCE.md` against 5-8 code — it may have other drift.**

- ✅ **Hexsling direction rule** — RESOLVED: **port the 5-8 behavior as-is** (≤1-exit auto-pick /
  >1-exit wait-for-input). The pre-5-8 "prefer-not-travelling" rule is dropped, not chased.
- 📋 **`LEGACY_FEATURE_REFERENCE.md` is dual-purpose** — it mixes *faithful legacy log* AND
  *ReBNO-intended behavior*. A reconcile pass vs 5-8 code must **classify** each mismatch
  (legacy-drift vs ReBNO-intent) rather than auto-correct to legacy; ReBNO-intent entries are
  preserved. _(In progress — recon classifying.)_

it more simply/usably. No separate parallel account-level friends list.

- ✅ **Hidden-tile contiguous-body visibility** — RESOLVED: a **ReBNO design intention (new)**,

-- ⚠ **Hexsling direction rule** — resolved for 5-8, and it **contradicts the user's memory AND

-  `docs/LEGACY_FEATURE_REFERENCE.md`**: 5-8 hexslings do ≤1-exit auto-pick / >1-exit

-  wait-for-input; there is NO "prefer the direction not travelled" (that's the hexbridge

-  zero-arrow bounce). If the recalled rule ever existed it's in an un-extracted pre-5-8 client.

-  **Action: reconcile `LEGACY_FEATURE_REFERENCE.md` against 5-8 code — it may have other drift.**

+- ✅ **Hexsling direction rule** — RESOLVED: **port the 5-8 behavior as-is** (≤1-exit auto-pick /

+  >1-exit wait-for-input). The pre-5-8 "prefer-not-travelling" rule is dropped, not chased.

+- 📋 **`LEGACY_FEATURE_REFERENCE.md` is dual-purpose** — it mixes *faithful legacy log* AND

+  *ReBNO-intended behavior*. A reconcile pass vs 5-8 code must **classify** each mismatch

+  (legacy-drift vs ReBNO-intent) rather than auto-correct to legacy; ReBNO-intent entries are

+  preserved. _(In progress — recon classifying.)_

- ✅ **`dabypass`** — RESOLVED: a persisted **"trapped in Abyss" sticky flag** (respawn in the

Abyss each login until you walk out), not an exemption.


CONTEXT corrections applied. Launching the reconcile recon (background) and reading the ADR format:


Agent

Recon: reconcile feature reference

Prompt:
Reverse-engineering extracted GameMaker 5.3a source of "BN Online". GML under `C:\Users\decid\Documents\projects\rebno\extracted\` (`client-5-8`, server `server-5-4`). Plain-text — don't hex-inspect.

MISSION: Reconcile `C:\Users\decid\Documents\projects\rebno\docs\LEGACY_FEATURE_REFERENCE.md` (the hand-written floor-tile + interactive-tile reference) against the ACTUAL 5-8 client code, AND flesh out the tile mechanics + determinism behaviorally.

CRUCIAL FRAMING: the reference doc is **dual-purpose** — it deliberately mixes (a) a faithful log of legacy behavior and (b) the author's *intended behavior for ReBNO* (which may differ from legacy on purpose). So when the doc and the 5-8 code disagree, DO NOT assume the doc is wrong. Classify each mismatch.

DO — for EVERY tile type and behavior the doc lists (BORDERED, BORDERLESS, HIDDEN, GLOW, MOVER incl. accel/peak velocity + the "push off into void", PLATFORM incl. pause-at-ends + deterministic sync, DYNAMIC incl. all neighbor variants + SPECIAL corner rule, SLIPPERY/ice momentum, FLICKER present/gone timing, QUARTERED; and the interactive tiles HEXPORTER, HEXSLING, HEXBRIDGE, WARP, SPECTRAL GATE):
1. Locate the implementing object/code in `extracted/client-5-8` (objects like `mtile*`/`pcode_mover`, `mplat*`, `hiddentile`, `btile`, `icetile`, `qtile`, `cornercheck*`/`grassbends`, `loctele`, `swaptile`, the hex* family, etc.).
2. State: **doc claim** vs **what 5-8 code actually does** (with concrete numbers: accel, max speed, decel, timings, pause durations) vs **MATCH / MISMATCH**.
3. For each MISMATCH, classify **[LIKELY-DOC-DRIFT]** (memory error — should match legacy) vs **[LIKELY-REBNO-INTENT]** (doc describes desired ReBNO behavior, preserve) — give your reasoning. The human will arbitrate the uncertain ones.
4. Note which behaviors are **deterministic-synced** (animation loops, platform positions, flicker cycles, glow activation) vs per-player.
5. FLICKER specifically: a prior pass found no FLICKER object — re-verify; if truly absent, mark it as a doc/ReBNO-intent concept with no legacy implementation.

OUTPUT: Write `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\12-feature-reference-reconcile.md` — a per-entry table (Tile/mechanic | doc claim | 5-8 code reality + numbers | match? | classification | evidence file:line). End with a "Mismatches needing human arbitration" shortlist. Return a ~12-line summary listing the mismatches and your DRIFT-vs-INTENT classification for each. Evidence-based; never assume the doc is wrong by default.


<owl_reachability_notice>
You have an active owl perch. Launch this Agent with run_in_background: true so you stay reachable for incoming messages while it works.
</owl_reachability_notice>


Async agent launched successfully.
agentId: ab90d043fcd4958f4 (internal ID - do not mention to user. Use SendMessage with to: 'ab90d043fcd4958f4' to continue this agent.)
The agent is working in the background. You will be notified automatically when it completes.
Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.
output_file: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\ab90d043fcd4958f4.output
Do NOT Read or tail this file via the shell tool — it is the full subagent JSONL transcript and reading it will overflow your context. If the user asks for progress, say the agent is still running; you'll get a completion notification.

Recon: reconcile feature reference

Prompt:
Reverse-engineering extracted GameMaker 5.3a source of "BN Online". GML under `C:\Users\decid\Documents\projects\rebno\extracted\` (`client-5-8`, server `server-5-4`). Plain-text — don't hex-inspect.

MISSION: Reconcile `C:\Users\decid\Documents\projects\rebno\docs\LEGACY_FEATURE_REFERENCE.md` (the hand-written floor-tile + interactive-tile reference) against the ACTUAL 5-8 client code, AND flesh out the tile mechanics + determinism behaviorally.

CRUCIAL FRAMING: the reference doc is **dual-purpose** — it deliberately mixes (a) a faithful log of legacy behavior and (b) the author's *intended behavior for ReBNO* (which may differ from legacy on purpose). So when the doc and the 5-8 code disagree, DO NOT assume the doc is wrong. Classify each mismatch.

DO — for EVERY tile type and behavior the doc lists (BORDERED, BORDERLESS, HIDDEN, GLOW, MOVER incl. accel/peak velocity + the "push off into void", PLATFORM incl. pause-at-ends + deterministic sync, DYNAMIC incl. all neighbor variants + SPECIAL corner rule, SLIPPERY/ice momentum, FLICKER present/gone timing, QUARTERED; and the interactive tiles HEXPORTER, HEXSLING, HEXBRIDGE, WARP, SPECTRAL GATE):
1. Locate the implementing object/code in `extracted/client-5-8` (objects like `mtile*`/`pcode_mover`, `mplat*`, `hiddentile`, `btile`, `icetile`, `qtile`, `cornercheck*`/`grassbends`, `loctele`, `swaptile`, the hex* family, etc.).
2. State: **doc claim** vs **what 5-8 code actually does** (with concrete numbers: accel, max speed, decel, timings, pause durations) vs **MATCH / MISMATCH**.
3. For each MISMATCH, classify **[LIKELY-DOC-DRIFT]** (memory error — should match legacy) vs **[LIKELY-REBNO-INTENT]** (doc describes desired ReBNO behavior, preserve) — give your reasoning. The human will arbitrate the uncertain ones.
4. Note which behaviors are **deterministic-synced** (animation loops, platform positions, flicker cycles, glow activation) vs per-player.
5. FLICKER specifically: a prior pass found no FLICKER object — re-verify; if truly absent, mark it as a doc/ReBNO-intent concept with no legacy implementation.

OUTPUT: Write `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\12-feature-reference-reconcile.md` — a per-entry table (Tile/mechanic | doc claim | 5-8 code reality + numbers | match? | classification | evidence file:line). End with a "Mismatches needing human arbitration" shortlist. Return a ~12-line summary listing the mismatches and your DRIFT-vs-INTENT classification for each. Evidence-based; never assume the doc is wrong by default.


<owl_messages>
<owl_message from="ling-w12" priority="info">[WORKING_PERCH_NOTICE] Subagent working perch created.
Perch: ling-w12
Agent type: general-purpose
To message it: $OWL send ling-w12 ling</owl_message>
</owl_messages>

[OWL SYSTEM] Informational owl messages above — no acknowledgment needed. Continue your current task.


1	# ADR Format
2
3	ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc.
4
5	Create the `docs/adr/` directory lazily — only when the first ADR is needed.
6
7	## Template
8
9	```md
10	# {Short title of the decision}
11
12	{1-3 sentences: what's the context, what did we decide, and why.}
13	```
14
15	That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections.
16
17	## Optional sections
18
19	Only include these when they add genuine value. Most ADRs won't need them.
20
21	- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited
22	- **Considered Options** — only when the rejected alternatives are worth remembering
23	- **Consequences** — only when non-obvious downstream effects need to be called out
24
25	## Numbering
26
27	Scan `docs/adr/` for the highest existing number and increment by one.
28
29	## When to offer an ADR
30
31	All three of these must be true:
32
33	1. **Hard to reverse** — the cost of changing your mind later is meaningful
34	2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?"
35	3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
36
37	If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing."
38
39	### What qualifies
40
41	- **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres."
42	- **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP."
43	- **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out.
44	- **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s.
45	- **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate.
46	- **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract."
47	- **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months.
48

# ADR Format

ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc.

Create the `docs/adr/` directory lazily — only when the first ADR is needed.

## Template

```md
# {Short title of the decision}

{1-3 sentences: what's the context, what did we decide, and why.}
```

That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections.

## Optional sections

Only include these when they add genuine value. Most ADRs won't need them.

- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited
- **Considered Options** — only when the rejected alternatives are worth remembering
- **Consequences** — only when non-obvious downstream effects need to be called out

## Numbering

Scan `docs/adr/` for the highest existing number and increment by one.

## When to offer an ADR

All three of these must be true:

1. **Hard to reverse** — the cost of changing your mind later is meaningful
2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?"
3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons

If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing."

### What qualifies

- **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres."
- **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP."
- **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out.
- **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s.
- **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate.
- **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract."
- **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months.


ADR format is minimal — good. `docs/adr/` tops out at 0012, so this is **0013**. Writing it:


Write

---
status: accepted
---

# Perception gating — per-player visibility is server-computed from progression + spatial state

Legacy BNO is fully client-authoritative (the Master only relays): hidden tiles self-reveal
client-side, public chat is a proximity rebroadcast, and appearance/inventory are unvalidated, so
the original could not meaningfully enforce *who sees what*. ReBNO is server-authoritative, so we
adopt **perception gating** as a core pillar: what a player perceives — which avatars they see,
whose chat they receive, which map markers and friend-location text are shown — is **computed
server-side from that player's own progression + spatial state**, never trusted from the client.

The rule has a deliberate boundary: **avatar and chat visibility are spatial/progression-only**
(you see a Navi only if you share their contiguous hidden-tile body / reachable geometry, and
within chat proximity). **Relationships (friend / Duo) grant metadata markers only** (e.g. a Duo
partner's worldwide map marker), **never raw in-world avatar or chat sight.** This is a *new*
system — legacy had no equivalent — and an intentional exception to ReBNO's otherwise parity-first
scope principle.

## Consequences

- The server performs **interest management**: it computes a per-recipient visibility set and
  filters position + chat broadcasts accordingly — not a single room-wide rebroadcast.
- **Contiguous-hidden-tile-body** membership becomes server-tracked state.
- **Chat routing is visibility-filtered** (can't see the avatar → don't receive the chat).
- **Markers are a separate, relationship-aware metadata channel**, decoupled from avatar streams.
- Higher server CPU + per-recipient payloads than legacy's blind rebroadcast — acceptable at the
  <50 CCU target.
- Open question (tracked in `CONTEXT.md`): whether the Duo camera renders the Digger when they
  stand on hidden tiles the Spotter has not reached.

## Considered alternatives

- **Faithful client-relay (legacy model)** — rejected: client-authoritative, unenforceable, and
  contradicts CLAUDE.md Hard Rule 1.
- **Room-wide broadcast with client-side hiding** — rejected: leaks position/chat to the client
  and is trivially cheatable.

See `CONTEXT.md` → "Perception gating" for the living definition.


File created successfully at: C:\Users\decid\Documents\projects\rebno\docs\adr\0013-perception-gating.md (file state is current in your context — no need to Read it back)

---
status: accepted
---

# Perception gating — per-player visibility is server-computed from progression + spatial state

Legacy BNO is fully client-authoritative (the Master only relays): hidden tiles self-reveal
client-side, public chat is a proximity rebroadcast, and appearance/inventory are unvalidated, so
the original could not meaningfully enforce *who sees what*. ReBNO is server-authoritative, so we
adopt **perception gating** as a core pillar: what a player perceives — which avatars they see,
whose chat they receive, which map markers and friend-location text are shown — is **computed
server-side from that player's own progression + spatial state**, never trusted from the client.

The rule has a deliberate boundary: **avatar and chat visibility are spatial/progression-only**
(you see a Navi only if you share their contiguous hidden-tile body / reachable geometry, and
within chat proximity). **Relationships (friend / Duo) grant metadata markers only** (e.g. a Duo
partner's worldwide map marker), **never raw in-world avatar or chat sight.** This is a *new*
system — legacy had no equivalent — and an intentional exception to ReBNO's otherwise parity-first
scope principle.

## Consequences

- The server performs **interest management**: it computes a per-recipient visibility set and
  filters position + chat broadcasts accordingly — not a single room-wide rebroadcast.
- **Contiguous-hidden-tile-body** membership becomes server-tracked state.
- **Chat routing is visibility-filtered** (can't see the avatar → don't receive the chat).
- **Markers are a separate, relationship-aware metadata channel**, decoupled from avatar streams.
- Higher server CPU + per-recipient payloads than legacy's blind rebroadcast — acceptable at the
  <50 CCU target.
- Open question (tracked in `CONTEXT.md`): whether the Duo camera renders the Digger when they
  stand on hidden tiles the Spotter has not reached.

## Considered alternatives

- **Faithful client-relay (legacy model)** — rejected: client-authoritative, unenforceable, and
  contradicts CLAUDE.md Hard Rule 1.
- **Room-wide broadcast with client-side hiding** — rejected: leaks position/chat to the client
  and is trivially cheatable.

See `CONTEXT.md` → "Perception gating" for the living definition.


ADR 0013 written. Now recording the scope principle + mandated divergences in `PROJECT.md`:


Edit

## Evolution

This document evolves at phase transitions and milestone boundaries.

## Scope Principle & Mandated Divergences

Established in the 2026-06 domain grilling session (see `CONTEXT.md` for the full glossary and
`.planning/legacy-recon/` for the supporting code recon).

**Dividing test (parity vs new system):** a change is in-scope **QoL** if it preserves the legacy
mechanic's *inputs, gating, and outcomes* and only improves presentation, ergonomics, feedback,
or accessibility. It is an out-of-scope **new system** if it adds a player capability, changes
progression gating, or changes what is collectable/unlockable. Worked calls: portal/Link-Data UX
overhaul, gamepad-first input, and cross-zone hexporters are **in** (the last is trivial under
ReBNO's chunked overworld); IP-shed + a battle system are **far-future, out**.

**Mandated divergences (faithful port deliberately rejected):**
- **Server authority** — legacy is fully client-authoritative (the Master only relays); ReBNO is
  server-authoritative across rules + inventory (Hard Rule 1). This is a ground-up rebuild of the
  rule layer, not a port.
- **Perception gating** — per-player visibility is server-computed (see ADR 0013).
- **No RCE** — the legacy clipboard-exec admin model is replaced by a vetted command set
  (Hard Rule 3); note not all legacy "mod items" are RCE (Location, Joker Shell, roster, spectate
  are fenced features worth keeping).
- **Passwords** — argon2id, never plaintext (Hard Rule 2).

**Identity reminder:** BNO is a social-exploration **Metroidvania-of-connectivity** — no combat,
no economy, no quests in the parity target. The MMBN aesthetic is skin, not mechanics.

## Evolution

This document evolves at phase transitions and milestone boundaries.


The file C:\Users\decid\Documents\projects\rebno\.planning\PROJECT.md has been updated successfully. (file state is current in your context — no need to Read it back)

## Scope Principle & Mandated Divergences

Established in the 2026-06 domain grilling session (see `CONTEXT.md` for the full glossary and
`.planning/legacy-recon/` for the supporting code recon).

**Dividing test (parity vs new system):** a change is in-scope **QoL** if it preserves the legacy
mechanic's *inputs, gating, and outcomes* and only improves presentation, ergonomics, feedback,
or accessibility. It is an out-of-scope **new system** if it adds a player capability, changes
progression gating, or changes what is collectable/unlockable. Worked calls: portal/Link-Data UX
overhaul, gamepad-first input, and cross-zone hexporters are **in** (the last is trivial under
ReBNO's chunked overworld); IP-shed + a battle system are **far-future, out**.

**Mandated divergences (faithful port deliberately rejected):**
- **Server authority** — legacy is fully client-authoritative (the Master only relays); ReBNO is
  server-authoritative across rules + inventory (Hard Rule 1). This is a ground-up rebuild of the
  rule layer, not a port.
- **Perception gating** — per-player visibility is server-computed (see ADR 0013).
- **No RCE** — the legacy clipboard-exec admin model is replaced by a vetted command set
  (Hard Rule 3); note not all legacy "mod items" are RCE (Location, Joker Shell, roster, spectate
  are fenced features worth keeping).
- **Passwords** — argon2id, never plaintext (Hard Rule 2).

**Identity reminder:** BNO is a social-exploration **Metroidvania-of-connectivity** — no combat,
no economy, no quests in the parity target. The MMBN aesthetic is skin, not mechanics.

## Evolution

This document evolves at phase transitions and milestone boundaries.

| **Deploy: operator-local `flyctl deploy`** (GH Actions storage exhausted) | 06.7-09 | ⚠ Revisit — accept permanently OR restore CI in next milestone |

| Phase 06.8 anti-cheat fall-reset cut from 06.7 | 06.7 | ⚠ Carry forward — currently no fall-reset backstop on client-trust model |

+## Scope Principle & Mandated Divergences

+Established in the 2026-06 domain grilling session (see `CONTEXT.md` for the full glossary and

+`.planning/legacy-recon/` for the supporting code recon).

+**Dividing test (parity vs new system):** a change is in-scope **QoL** if it preserves the legacy

+mechanic's *inputs, gating, and outcomes* and only improves presentation, ergonomics, feedback,

+or accessibility. It is an out-of-scope **new system** if it adds a player capability, changes

+progression gating, or changes what is collectable/unlockable. Worked calls: portal/Link-Data UX

+overhaul, gamepad-first input, and cross-zone hexporters are **in** (the last is trivial under

+ReBNO's chunked overworld); IP-shed + a battle system are **far-future, out**.

+**Mandated divergences (faithful port deliberately rejected):**

+- **Server authority** — legacy is fully client-authoritative (the Master only relays); ReBNO is

+  server-authoritative across rules + inventory (Hard Rule 1). This is a ground-up rebuild of the

+- **Perception gating** — per-player visibility is server-computed (see ADR 0013).

+- **No RCE** — the legacy clipboard-exec admin model is replaced by a vetted command set

+  (Hard Rule 3); note not all legacy "mod items" are RCE (Location, Joker Shell, roster, spectate

+- **Passwords** — argon2id, never plaintext (Hard Rule 2).

+**Identity reminder:** BNO is a social-exploration **Metroidvania-of-connectivity** — no combat,

+no economy, no quests in the parity target. The MMBN aesthetic is skin, not mechanics.


Scope principle recorded in `PROJECT.md`. The reconcile recon is still running (its findings will need your arbitration on doc-vs-intent mismatches — a follow-up). Committing the stable deliverables now, per your selection:


PowerShell

cd 'C:\Users\decid\Documents\projects\rebno'; git add CONTEXT.md docs/LEGACY_FEATURE_REFERENCE.md docs/adr/0013-perception-gating.md .planning/PROJECT.md .planning/legacy-recon; git status --short

Stage CONTEXT, recon, ADR, PROJECT for commit


warning: in the working copy of '.planning/PROJECT.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/01-globals-constants.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/02-feature-identifiers.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/03-behavioral-linkage.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/04-mod-items.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/05-hexsling-dabypass.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/06-watch-requests.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/07-social-board-chat.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/08-avatar-spectrum.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/09-npcs-economy-onboarding.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/10-npc-dialogue-integrity.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.planning/legacy-recon/11-message-data.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'CONTEXT.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'docs/adr/0013-perception-gating.md', LF will be replaced by CRLF the next time Git touches it
M  .planning/PROJECT.md
A  .planning/legacy-recon/01-globals-constants.md
A  .planning/legacy-recon/02-feature-identifiers.md
A  .planning/legacy-recon/03-behavioral-linkage.md
A  .planning/legacy-recon/04-mod-items.md
A  .planning/legacy-recon/05-hexsling-dabypass.md
A  .planning/legacy-recon/06-watch-requests.md
A  .planning/legacy-recon/07-social-board-chat.md
A  .planning/legacy-recon/08-avatar-spectrum.md
A  .planning/legacy-recon/09-npcs-economy-onboarding.md
A  .planning/legacy-recon/10-npc-dialogue-integrity.md
A  .planning/legacy-recon/11-message-data.md
A  CONTEXT.md
A  docs/LEGACY_FEATURE_REFERENCE.md
A  docs/adr/0013-perception-gating.md


cd 'C:\Users\decid\Documents\projects\rebno'; git commit -m @'
docs: capture BNO domain model — CONTEXT.md glossary + legacy recon + perception-gating ADR

Establish the canonical game-domain glossary (CONTEXT.md) from a structured grilling
session backed by 11 legacy-code recon passes (.planning/legacy-recon/). BNO is a
social-exploration Metroidvania-of-connectivity (no combat/economy/quests); legacy is
fully client-authoritative, so ReBNO's server-authoritative model is a rule-layer rebuild.

Adds ADR 0013 (perception gating) and records the parity-vs-new-system scope principle
plus mandated divergences in PROJECT.md. Tracks docs/LEGACY_FEATURE_REFERENCE.md (was
untracked) as the dual-purpose tile reference pending reconcile.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
'@; git log --oneline -1

Commit domain model artifacts


[main e7927bc] docs: capture BNO domain model — CONTEXT.md glossary + legacy recon + perception-gating ADR
 15 files changed, 3586 insertions(+)
 create mode 100644 .planning/legacy-recon/01-globals-constants.md
 create mode 100644 .planning/legacy-recon/02-feature-identifiers.md
 create mode 100644 .planning/legacy-recon/03-behavioral-linkage.md
 create mode 100644 .planning/legacy-recon/04-mod-items.md
 create mode 100644 .planning/legacy-recon/05-hexsling-dabypass.md
 create mode 100644 .planning/legacy-recon/06-watch-requests.md
 create mode 100644 .planning/legacy-recon/07-social-board-chat.md
 create mode 100644 .planning/legacy-recon/08-avatar-spectrum.md
 create mode 100644 .planning/legacy-recon/09-npcs-economy-onboarding.md
 create mode 100644 .planning/legacy-recon/10-npc-dialogue-integrity.md
 create mode 100644 .planning/legacy-recon/11-message-data.md
 create mode 100644 CONTEXT.md
 create mode 100644 docs/LEGACY_FEATURE_REFERENCE.md
 create mode 100644 docs/adr/0013-perception-gating.md
e7927bc docs: capture BNO domain model — CONTEXT.md glossary + legacy recon + perception-gating ADR


Committed — **`e7927bc`**, 15 files (CONTEXT.md, 11 recon docs, ADR 0013, PROJECT.md scope section, and `LEGACY_FEATURE_REFERENCE.md` now tracked).

**Done this session:**
- Canonical domain glossary (`CONTEXT.md`) built from grilling + 11 legacy-code recon passes
- ADR 0013 (perception gating) + scope principle & mandated divergences in `PROJECT.md`
- All Q1–Q7 resolutions + your closing corrections folded in

**Pending (one follow-up):**
- **Reconcile recon still running** — it classifies each `LEGACY_FEATURE_REFERENCE.md` tile-mechanic mismatch as *legacy-drift* vs *ReBNO-intent*. When it lands I'll bring you the shortlist needing arbitration, then commit doc 12 + any agreed doc fixes.
- One flagged micro-question: **does the Duo camera render the Digger on hidden tiles the Spotter hasn't reached?** (noted in `CONTEXT.md`).

Standing by for the reconcile agent.


<task-notification>
<task-id>ab90d043fcd4958f4</task-id>
<tool-use-id>toolu_01QLgQzRFyy3TGjUiFYZtg1P</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\ab90d043fcd4958f4.output</output-file>
<status>completed</status>
<summary>Agent "Recon: reconcile feature reference" completed</summary>
<result>Done. Wrote the full reconciliation to `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\12-feature-reference-reconcile.md`.

Summary of mismatches and classifications:

1. **PLATFORM deterministic sync** — Legacy platforms are pure local GM sim (vspeed/hspeed = ±3 px/step) with NO server-time sync; end-pause uses `random(60)`. Doc demands deterministic server-synced positions. **[LIKELY-REBNO-INTENT]** (doc's "needs to be" is prescriptive) — preserve; it's real new work.
2. **PLATFORM end-pause** — `90+random(60)` or fixed `150` steps (3–5s / 3s). The `random()` must be seeded to satisfy #1.
3. **HEXSLING 1–2 dir auto-send + "prefer non-traveling direction"** — Legacy only auto-sends for *exactly 1* enabled dir (fixed up>down>left>right priority); 2-dir slings actually fall into the manual keywait pause, and there's no "prefer the direction not traveling" logic. **[LIKELY-DOC-DRIFT]** — but could be intended smoothing; **needs arbitration**.
4. **MOVER accel differs by actor** — Player = +2/−1/cap 6 (180 px/s peak); NPCs & data drops (`pcode_mover`) = +1.5/−0.5/cap 5. Doc under-specifies. **[LIKELY-DOC-DRIFT]**.
5. **FLICKER tile** — Re-verified ABSENT. Only `flicker` token is the player joker-shell blink in `0000-server`. No floor-tile implementation. **[LIKELY-REBNO-INTENT]** (design from scratch).
6. **QUARTERED** — Maps to `btilemini`/BahooTileMini = **22×20** (½×½ of 44×40). The object literally named `qtile` is full-size 44×41/animated. Doc's geometry is correct; **[LIKELY-DOC-DRIFT]** in which object it points at.
7. **DYNAMIC neighbor rule** — Doc generalizes ("non-hidden, non-transparent tiles"); code uses explicit per-tile allow-lists in `cornercheck[g|i]`. **[LIKELY-DOC-DRIFT]** — pin exact lists when porting.
8. **HIDDEN-glass "50% opacity, no flicker"** — Legacy `hiddentile` Draw already has BOTH a 50%-opacity (`global.alphaon`) path and a blinking path; doc prescribes always-50%. **[LIKELY-REBNO-INTENT]**.

Everything else (BORDERED, BORDERLESS, fall-into-void, HIDDEN reveal+1s timeout, GLOW=btiletouch, MOVER variants/peak/push-off-edge, PLATFORM carry, DYNAMIC neighbor sprites + the SPECIAL corner = `bend*` rule, SLIPPERY/ice momentum, HEXPORTER directional/station/station-only, HEXBRIDGE per-player activation + reverse-direction, WARP glowing sub-rect + step-off lockout + dead 1-way + WrpPlugn gate, SPECTRAL GATE = `swaptile` + MskPlugn) is a **MATCH**, now pinned with concrete numbers. A determinism map distinguishes per-player vs would-need-server-sync behaviors. Note: `0000-server` is the local-player physics controller, `0042-player` is the remote renderer — all tile mechanics live in `0000-server/events/Step.gml` plus the `abscheck*`/`corner*`/`pcode_mover` scripts.</result>
<usage><subagent_tokens>107022</subagent_tokens><tool_uses>34</tool_uses><duration_ms>377380</duration_ms></usage>
</task-notification>


Reconcile recon (doc 12) in — the final piece. Result: **everything matches except 8 items**, already classified. Most are clear-cut; combined with your earlier rulings, only a couple need your eye.

First, a correction to `CONTEXT.md` it forced: I'd listed Platforms/Flicker/Glow as "deterministic-synced" — but **legacy did NOT sync them** (platforms are pure local sim with `random()` pauses; *Flicker tiles don't exist in legacy at all*). Those are ReBNO *intentions*, not legacy facts. Fixing:


Edit

**Deterministic-Synced state**:
World state driven by shared server time so every client renders it identically: moving
**Platform** positions, animation loops, **Flicker** tile present/gone cycles, **Glow** tile
activation. Not per-player. (Movers and slippery ice have no unique state — just a looping
animation.)

**Deterministic-Synced state** _(ReBNO intent — legacy did NOT sync these)_:
World state ReBNO will drive by shared server time so every client renders it identically: moving
**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no
Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)
and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —
just a looping animation.)


**Deterministic-Synced state**:
World state driven by shared server time so every client renders it identically: moving
**Platform** positions, animation loops, **Flicker** tile present/gone cycles, **Glow** tile
activation. Not per-player. (Movers and slippery ice have no unique state — just a looping
animation.)

**Deterministic-Synced state** _(ReBNO intent — legacy did NOT sync these)_:
World state ReBNO will drive by shared server time so every client renders it identically: moving
**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no
Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)
and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —
just a looping animation.)

-World state driven by shared server time so every client renders it identically: moving

-**Platform** positions, animation loops, **Flicker** tile present/gone cycles, **Glow** tile

-activation. Not per-player. (Movers and slippery ice have no unique state — just a looping

+**Deterministic-Synced state** _(ReBNO intent — legacy did NOT sync these)_:

+World state ReBNO will drive by shared server time so every client renders it identically: moving

+**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran

+platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no

+Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)

+and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —

Anything tied to a player's unlocks, abilities, or inventory: **Hexbridge** activation,


5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. **ReBNO ports this 5-8 behavior as-is**

5-8 build, **exactly 1** enabled exit auto-picks that direction (fixed priority up>down>left>
right); **2+** exits halt the orb and wait for an arrow-key choice. **ReBNO ports this 5-8
behavior as-is**


5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an
arrow-key choice. **ReBNO ports this 5-8 behavior as-is**

5-8 build, **exactly 1** enabled exit auto-picks that direction (fixed priority up>down>left>
right); **2+** exits halt the orb and wait for an arrow-key choice. **ReBNO ports this 5-8
behavior as-is**

The signature in-zone traversal mechanic. A **Hexporter** floor terminal splits the Navi into

six light orbs that re-form into a flat hexagon of light, travelling in a straight line across

empty space and *under* the floor tiles. **Hexsling** tiles redirect a hexporting Navi: in the

-5-8 build, ≤1 enabled exit auto-picks that direction; >1 exits halts the orb and waits for an

-arrow-key choice. **ReBNO ports this 5-8 behavior as-is** (the `LEGACY_FEATURE_REFERENCE.md`

+5-8 build, **exactly 1** enabled exit auto-picks that direction (fixed priority up>down>left>

+right); **2+** exits halt the orb and wait for an arrow-key choice. **ReBNO ports this 5-8

+behavior as-is** (the `LEGACY_FEATURE_REFERENCE.md`

"prefer-the-direction-you-weren't-travelling" wording is dropped — that reversal is only the

hexbridge zero-arrow bounce). **Hexbridge**

tiles bounce it back after spawning a floor tile recorded **permanently per-account** (bridge id


**Reconcile verdict: all tile/interactive mechanics MATCH except 8 items** — now pinned with concrete numbers. Dispositions (recon classification + your earlier rulings):

**Preserve as ReBNO-intent (doc is prescriptive, not drift — real new work):**
1. **Platform sync** — legacy platforms are pure local sim (±3 px/step), *not* synced. Your determinism requirement stands → ReBNO builds it.
2. **Platform end-pause** — legacy uses `random(60)`; must seed it to honor #1.
5. **Flicker tile** — confirmed **no legacy implementation at all** → ReBNO designs from scratch.
8. **Hidden-glass = always 50% / no flicker** — legacy has both a 50%-opacity *and* a blink path; your "always 50%" is the intended simplification.

**Fix doc to legacy truth (drift):**
3. **Hexsling** — per your ruling, port 5-8: **exactly-1 exit auto-picks** (priority U>D>L>R), **2+ waits** for input. Drop the "prefer-not-traveling" wording.
4. **Mover accel** — pin both profiles: player `+2/−1/cap 6` (~180 px/s); NPCs & data-drops `+1.5/−0.5/cap 5`.
6. **Quartered** — geometry right (22×20 = `btilemini`), but the doc's `qtile` is actually full-size — fix the object reference.
7. **Dynamic neighbor rule** — replace the "non-hidden/non-transparent" generalization with the exact per-tile allow-lists (`cornercheckg`/`cornerchecki`).

**Ask:** confirm these 8, and shall I **apply the `LEGACY_FEATURE_REFERENCE.md` edits** (tag the 4 intent items `[ReBNO-INTENT]`, correct the 4 drift items with the concrete numbers/objects), then commit doc 12 + the doc fixes? Anything you'd reclassify?


canonical notes about the digital abyss we didn't cover: -players there can see each other, but can't see nametags -chat is disabled there, with the chat input line permanently reading `VOID` --- note about the post-perity duo beacon items: it would break after a fatal fall-->sends player to their home portal. hence consumable. --- in legacy, i believe you can change your home portal from anywhere. this should change to only be permitted while the player is standing at a zone or area portal. --- the inter-zone portals (which don't have associated link data) should be formally referred to as "Gateways". --- micro q: yes, in duos agents should be able to see each other at all times, including the hidden tiles they're standing on. --- intent: 1. correct 2. correct 3. --- a QoL feature intended for moving platforms: they should blink an animation ~5 times prior to departure. will need /clear


nProceed with next steps


[Request interrupted by user]


ignore the '/clear', accident. --- moving platforms pre-departure blink anim: it will need new animations per platform. --- back to intent: 3. incorrect. it might just have a different name, but it definitely exists. it is used prominently in emptiness' hull. it is NOT deterministically server synced in legacy, but needs to be. 4. correct --- fix doc items: 3. ok 4. sgtm 6. ok 7. ok --- all confirmed


Final canonical notes captured — and two **reclassifications** that matter:

- **Duo IS the exception** to perception gating: partners always see each other (incl. hidden tiles) → I had over-absolutized "relationships never grant sight." That was about *friendship*; Duo is the co-op carve-out. Fixing pillar + ADR.
- **Flicker tiles DO exist** (different object name, prominent in Emptiness' Hull) — recon's "absent" was wrong. So flicker is **legacy-real but unsynced** → ReBNO syncs it (like platforms), not net-new.

Plus: Abyss has no-nametags + chat-disabled (`VOID`); Gateways = link-data-less inter-zone portals; Home Portal settable only at a portal in ReBNO; Duo Beacon breaks on fatal fall; platforms get a ~5-blink departure tell.

Launching a targeted recon to pin the flicker object, then applying all edits:


Agent

Recon: find flicker tile object

Prompt:
Reverse-engineering extracted GameMaker 5.3a source of "BN Online". GML under `C:\Users\decid\Documents\projects\rebno\extracted\client-5-8`. Plain-text — don't hex-inspect.

MISSION (correction pass): FIND THE FLICKER FLOOR TILE. Two prior recon passes wrongly concluded "no FLICKER tile exists." The project owner confirms it DOES exist — under a non-obvious object name — and is used **prominently in Emptiness' Hull**. `docs/LEGACY_FEATURE_REFERENCE.md` describes it: "FLICKER: tile disappears and reappears. flickers before disappearing. present-time and gone-time randomize" and lists "BORDERLESS FLICKER: White, prominently in Emptiness' Hull."

DO:
1. Identify which extracted room is **Emptiness' Hull** (check `rooms/*` names; it is zone 3). List the tile/object instances in that room and look for a floor object whose visibility/alpha toggles on a timer.
2. Hunt broadly for the mechanism (do NOT just grep "flicker"): floor objects using `alarm[]` to flip `visible`/`image_alpha`/`solid`, or a draw event that blinks then hides, or `random()`-driven present/gone durations. Likely a white borderless tile. Candidate name patterns: `*flick*`, `*blink*`, `*fade*`, `*appear*`, `*vanish*`, `wtile*`, or something Emptiness-Hull-specific.
3. Report: the object's real NAME, its present-duration / gone-duration logic (with numbers + whether randomized), the pre-disappear "flicker" tell, whether it's BORDERED or BORDERLESS, and whether the timing is local/unsynced (expected: local — needs ReBNO server-sync).
4. If after a thorough search you genuinely cannot find it, say so explicitly and list every floor-tile object you DID find in Emptiness' Hull so we can identify it by elimination.

OUTPUT: Write `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\13-flicker-tile.md` (object name, behavior, numbers, sync, evidence file:line). Return a ~8-line summary LEADING WITH the object name. Be rigorous — this is a correction of a prior miss.


Async agent launched successfully.
agentId: a81c5cf178f395d4f (internal ID - do not mention to user. Use SendMessage with to: 'a81c5cf178f395d4f' to continue this agent.)
The agent is working in the background. You will be notified automatically when it completes.
Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.
output_file: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-rebno\27ced91a-de41-488a-b2a2-10f1c09be4bb\tasks\a81c5cf178f395d4f.output
Do NOT Read or tail this file via the shell tool — it is the full subagent JSONL transcript and reading it will overflow your context. If the user asks for progress, say the agent is still running; you'll get a completion notification.

Recon: find flicker tile object

Prompt:
Reverse-engineering extracted GameMaker 5.3a source of "BN Online". GML under `C:\Users\decid\Documents\projects\rebno\extracted\client-5-8`. Plain-text — don't hex-inspect.

MISSION (correction pass): FIND THE FLICKER FLOOR TILE. Two prior recon passes wrongly concluded "no FLICKER tile exists." The project owner confirms it DOES exist — under a non-obvious object name — and is used **prominently in Emptiness' Hull**. `docs/LEGACY_FEATURE_REFERENCE.md` describes it: "FLICKER: tile disappears and reappears. flickers before disappearing. present-time and gone-time randomize" and lists "BORDERLESS FLICKER: White, prominently in Emptiness' Hull."

DO:
1. Identify which extracted room is **Emptiness' Hull** (check `rooms/*` names; it is zone 3). List the tile/object instances in that room and look for a floor object whose visibility/alpha toggles on a timer.
2. Hunt broadly for the mechanism (do NOT just grep "flicker"): floor objects using `alarm[]` to flip `visible`/`image_alpha`/`solid`, or a draw event that blinks then hides, or `random()`-driven present/gone durations. Likely a white borderless tile. Candidate name patterns: `*flick*`, `*blink*`, `*fade*`, `*appear*`, `*vanish*`, `wtile*`, or something Emptiness-Hull-specific.
3. Report: the object's real NAME, its present-duration / gone-duration logic (with numbers + whether randomized), the pre-disappear "flicker" tell, whether it's BORDERED or BORDERLESS, and whether the timing is local/unsynced (expected: local — needs ReBNO server-sync).
4. If after a thorough search you genuinely cannot find it, say so explicitly and list every floor-tile object you DID find in Emptiness' Hull so we can identify it by elimination.

OUTPUT: Write `C:\Users\decid\Documents\projects\rebno\.planning\legacy-recon\13-flicker-tile.md` (object name, behavior, numbers, sync, evidence file:line). Return a ~8-line summary LEADING WITH the object name. Be rigorous — this is a correction of a prior miss.


ignore the '/clear', accident. --- moving platforms pre-departure blink anim: it will need new animations per platform. --- back to intent: 3. incorrect. it might just have a different name, but it de…


Flicker recon running. Applying the canonical-note edits to `CONTEXT.md` + fixing ADR 0013's Duo carve-out:


Edit

respawn in the Abyss on every login until you physically walk out (it blocks the Home Portal
spawn). `dabypass` is a "trapped" flag, NOT an exemption.

respawn in the Abyss on every login until you physically walk out (it blocks the Home Portal
spawn). `dabypass` is a "trapped" flag, NOT an exemption. _In-Abyss rules: players **see each
other but with no nametags**, and **chat is disabled** — the chat input line permanently reads
`VOID`._


<tool_use_error>String to replace not found in file.
String: respawn in the Abyss on every login until you physically walk out (it blocks the Home Portal
spawn). `dabypass` is a "trapped" flag, NOT an exemption.</tool_use_error>

Error: String to replace not found in file.
String: respawn in the Abyss on every login until you physically walk out (it blocks the Home Portal
spawn). `dabypass` is a "trapped" flag, NOT an exemption.


"trapped" flag, NOT an exemption.

**Fall Safety Buffer** (ReBNO):

"trapped" flag, NOT an exemption. _In-Abyss rules: players **see each other but with no
nametags**, and **chat is disabled** — the chat input line permanently reads `VOID`._

**Fall Safety Buffer** (ReBNO):


<owl_messages>
<owl_message from="ling-w13" priority="info">[WORKING_PERCH_NOTICE] Subagent working perch created.
Perch: ling-w13
Agent type: general-purpose
To message it: $OWL send ling-w13 ling</owl_message>
</owl_messages>

[OWL SYSTEM] Informational owl messages above — no acknowledgment needed. Continue your current task.


"trapped" flag, NOT an exemption.

**Fall Safety Buffer** (ReBNO):

"trapped" flag, NOT an exemption. _In-Abyss rules: players **see each other but with no
nametags**, and **chat is disabled** — the chat input line permanently reads `VOID`._

**Fall Safety Buffer** (ReBNO):

(`dafalls` is a client/session counter; your first 5 falls are immune). On Abyss entry the

server sets a **persisted, sticky `dabypass` flag** — you then **respawn in the Abyss on every

login until you physically walk out** (it blocks the Home Portal spawn). `dabypass` is a

+"trapped" flag, NOT an exemption. _In-Abyss rules: players **see each other but with no

+nametags**, and **chat is disabled** — the chat input line permanently reads `VOID`._

The legacy fall-immunity counter (`dafalls`, ≤5 safe) reimagined as a **visible, depleting GUI


here — with a slim chance of landing in the **Digital Abyss** instead.

here — with a slim chance of landing in the **Digital Abyss** instead. _ReBNO change: you may
only **set** your Home Portal while standing at a Zone or Area portal (legacy allowed changing it
from anywhere)._


here — with a slim chance of landing in the **Digital Abyss** instead. _ReBNO change: you may
only **set** your Home Portal while standing at a Zone or Area portal (legacy allowed changing it
from anywhere)._

A player-chosen portal (any cleared zone/area portal) that is their login spawn and the only

destination fast-travelable from *anywhere*. Falling during exploration also returns the Navi

-here — with a slim chance of landing in the **Digital Abyss** instead.

+here — with a slim chance of landing in the **Digital Abyss** instead. _ReBNO change: you may

+only **set** your Home Portal while standing at a Zone or Area portal (legacy allowed changing it

**Digital Abyss** (legacy room: **Abyssal Ruin**, zone 4):

A fall-failure destination, and itself a **no-teleport zone** (you climb out on foot). Exact


**Warp** (requires **WrpPlugn**):
Intra-zone teleportation via Warp tiles. Inert without the expansion.

**Summon / Join**:

**Warp** (requires **WrpPlugn**):
Intra-zone teleportation via Warp tiles. Inert without the expansion.

**Gateway**:
An **inter-zone portal with NO associated Link Data** — an on-foot connector you walk through to
reach an adjacent zone before (or without) holding that zone's Zone Link. Distinct from a
**Central Portal** (which *grants* Link Data) and from Link-Data fast-travel. (This is the
"travel there on foot" path; ReBNO may add special cross-zone hexport Gateways.)

**Summon / Join**:


**Warp** (requires **WrpPlugn**):
Intra-zone teleportation via Warp tiles. Inert without the expansion.

**Summon / Join**:

**Warp** (requires **WrpPlugn**):
Intra-zone teleportation via Warp tiles. Inert without the expansion.

**Gateway**:
An **inter-zone portal with NO associated Link Data** — an on-foot connector you walk through to
reach an adjacent zone before (or without) holding that zone's Zone Link. Distinct from a
**Central Portal** (which *grants* Link Data) and from Link-Data fast-travel. (This is the
"travel there on foot" path; ReBNO may add special cross-zone hexport Gateways.)

**Summon / Join**:

+An **inter-zone portal with NO associated Link Data** — an on-foot connector you walk through to

+reach an adjacent zone before (or without) holding that zone's Zone Link. Distinct from a

+**Central Portal** (which *grants* Link Data) and from Link-Data fast-travel. (This is the

+"travel there on foot" path; ReBNO may add special cross-zone hexport Gateways.)

A player-to-player teleport system. It refuses to teleport a user into a Zone where that user

holds no **Zone Link Data** — only a **Duo** can bridge that gap (the gate literally checks


**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an
  avatar otherwise hidden from you.

**Friendship does NOT affect raw avatar or chat visibility** (markers only); an active **Duo** is
the one exception. It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship does **not** reveal a hidden
  avatar. **Exception: active Duo partners always see each other — including on hidden tiles
  either is standing on.**


**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an
  avatar otherwise hidden from you.

**Friendship does NOT affect raw avatar or chat visibility** (markers only); an active **Duo** is
the one exception. It governs:
- **Avatar visibility** — spatial/progression only: you see a Navi only if you share their
  contiguous hidden-tile body / reachable geometry. Friendship does **not** reveal a hidden
  avatar. **Exception: active Duo partners always see each other — including on hidden tiles
  either is standing on.**

The unifying rule — *you perceive only what your **progression and spatial state** grant.*

-**Relationships (friend / Duo) do NOT affect raw avatar or chat visibility.** It governs:

+**Friendship does NOT affect raw avatar or chat visibility** (markers only); an active **Duo** is

-  contiguous hidden-tile body / reachable geometry. Friendship or Duo does **not** reveal an

+  contiguous hidden-tile body / reachable geometry. Friendship does **not** reveal a hidden

+  avatar. **Exception: active Duo partners always see each other — including on hidden tiles

- **Chat** — inherits avatar visibility (can't see the avatar → can't see their chat).

- **Map markers** — *may* be relationship-granted (metadata, not in-world sight): a friend's

marker shows only when their avatar is visible to you, **except Duo partners**, whose markers


Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per
**Perception gating** this is camera/marker — NOT a general avatar-visibility override);
auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while
in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.
_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter
hasn't reached? — confirm._

Benefits: **partners always see each other — including on hidden tiles either is standing on**
(the one relationship that overrides the spatial visibility rule; their chat follows too, since
chat inherits avatar visibility), plus the Spotter's pannable duo-camera and a worldwide duo
marker; auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is
blocked while in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.


Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per
**Perception gating** this is camera/marker — NOT a general avatar-visibility override);
auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while
in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.
_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter
hasn't reached? — confirm._

Benefits: **partners always see each other — including on hidden tiles either is standing on**
(the one relationship that overrides the spatial visibility rule; their chat follows too, since
chat inherits avatar visibility), plus the Spotter's pannable duo-camera and a worldwide duo
marker; auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is
blocked while in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.

**Duo** (via the **DuoPlugn** Navi Expansion; the **Duo System**):

A **mutual, consented** pairing of two Navis (gated by `DuoPlugn`), modelled on Mega Man Legends'

digger+spotter. Roles: **Digger** (explores) + **Spotter** (rides a *pannable* duo-camera).

-Benefits: the **Spotter observes the Digger via the duo camera + a worldwide duo marker** (per

-**Perception gating** this is camera/marker — NOT a general avatar-visibility override);

-auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is blocked while

-in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.

-_Open: does the duo camera render the Digger even when they stand on hidden tiles the Spotter

+Benefits: **partners always see each other — including on hidden tiles either is standing on**

+(the one relationship that overrides the spatial visibility rule; their chat follows too, since

+chat inherits avatar visibility), plus the Spotter's pannable duo-camera and a worldwide duo

+marker; auto-accepted Summon/Join between them; a **teleport tether** (link-data teleport is

+blocked while in a duo; the digger auto-rejoins the spotter on transit); and the **Duo Net**.

The two Duo roles — **Spotter** (pannable observation camera + assist) and **Digger** (the Navi


**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no
Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)
and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —
just a looping animation.)

**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause); **Flicker** tiles *do*
exist (under a non-obvious object name, prominent in Emptiness' Hull) — but **neither is synced**
in legacy. So ReBNO must *add* the determinism (seed the RNG / drive by server time). _ReBNO QoL:
moving platforms blink a departure tell (~5 blinks) before moving — needs a new per-platform
animation._ Not per-player. (Movers and slippery ice have no unique state — just a looping
animation.)


**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no
Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)
and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —
just a looping animation.)

**Platform** positions, animation loops, **Flicker** cycles, **Glow** activation. Legacy ran
platforms as **pure local sim** (±3 px/step, `random(60)` end-pause); **Flicker** tiles *do*
exist (under a non-obvious object name, prominent in Emptiness' Hull) — but **neither is synced**
in legacy. So ReBNO must *add* the determinism (seed the RNG / drive by server time). _ReBNO QoL:
moving platforms blink a departure tell (~5 blinks) before moving — needs a new per-platform
animation._ Not per-player. (Movers and slippery ice have no unique state — just a looping
animation.)

**Deterministic-Synced state** _(ReBNO intent — legacy did NOT sync these)_:

World state ReBNO will drive by shared server time so every client renders it identically: moving

-platforms as **pure local sim** (±3 px/step, `random(60)` end-pause) with no sync, and had **no

-Flicker tile at all** — so ReBNO must *add* the determinism (seed the RNG / drive by server time)

-and build Flicker from scratch. Not per-player. (Movers and slippery ice have no unique state —

+platforms as **pure local sim** (±3 px/step, `random(60)` end-pause); **Flicker** tiles *do*

+exist (under a non-obvious object name, prominent in Emptiness' Hull) — but **neither is synced**

+in legacy. So ReBNO must *add* the determinism (seed the RNG / drive by server time). _ReBNO QoL:

+moving platforms blink a departure tell (~5 blinks) before moving — needs a new per-platform

+animation._ Not per-player. (Movers and slippery ice have no unique state — just a looping

Anything tied to a player's unlocks, abilities, or inventory: **Hexbridge** activation,


A carriable consumable/findable world item a player can **set down as a non-sentient target for
a "partial" Duo** — soloing some Duo benefits without a second live player.

A carriable consumable/findable world item a player can **set down as a non-sentient target for
a "partial" Duo** — soloing some Duo benefits without a second live player. It **breaks on a fatal
fall** (which sends the player to their Home Portal) — hence consumable.


A carriable consumable/findable world item a player can **set down as a non-sentient target for
a "partial" Duo** — soloing some Duo benefits without a second live player. It **breaks on a fatal
fall** (which sends the player to their Home Portal) — hence consumable.

**Duo Beacon** _(ReBNO post-port concept — far future)_:

-a "partial" Duo** — soloing some Duo benefits without a second live player.

+a "partial" Duo** — soloing some Duo benefits without a second live player. It **breaks on a fatal

+fall** (which sends the player to their Home Portal) — hence consumable.

A **one-way follow-camera** on another Navi — ungated (no expansion). A camera eases toward the


Now ADR 0013 — correcting the Duo carve-out (it's no longer "never"):


within chat proximity). **Relationships (friend / Duo) grant metadata markers only** (e.g. a Duo
partner's worldwide map marker), **never raw in-world avatar or chat sight.** This is a *new*
system — legacy had no equivalent — and an intentional exception to ReBNO's otherwise parity-first
scope principle.

within chat proximity). **Friendship grants metadata markers only** (e.g. a friend's marker when
visible), **never raw in-world avatar or chat sight** — with one deliberate exception: an active
**Duo** lets its two partners always see each other (including on hidden tiles), and thus each
other's chat (chat inherits avatar visibility). This is the co-op carve-out. The whole thing is a
*new* system — legacy had no equivalent — and an intentional exception to ReBNO's otherwise
parity-first scope principle.