Skip to content

fix(rooms): canonicalize storey naming across disciplines for containment join - #55

Open
red1oon wants to merge 368 commits into
masterfrom
fix/containment-storey-alias-ltu
Open

fix(rooms): canonicalize storey naming across disciplines for containment join#55
red1oon wants to merge 368 commits into
masterfrom
fix/containment-storey-alias-ltu

Conversation

@red1oon

@red1oon red1oon commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Summary

  • Unblocks the Fly Tour room-level occlusion lever (prompts/Viewer/FLY_TOUR_DLOD_SCALE.md §5), which named rel_contained_in_space coverage as a "separate spec" prerequisite — this is that spec (prompts/done/CONTAINMENT_LTU_STOREY_ALIAS.md).
  • Root cause: compile_rooms.py's element→room containment join keyed on exact storey string equality, but LTU_AHouse's disciplines each spell the same floor differently (ARC "VÅNING N", STR "VÅN N", MEP "Plan N"/"Storey N"). Room detection is ARC-only, so every non-ARC element (83.7% of the building, all MEP) was silently excluded regardless of true geometric location — verified via Z-band clustering that all spellings match the same physical floor for a given N.
  • _canonical_floor() collapses the known spellings onto one F<n> key applied on both sides of the join; anything that doesn't match (Unknown/TAKPLAN/Ref.) falls back to nearest-Z resolution against canonical-floor anchors built from the rooms' own center_z — same nearest-anchor technique the file already uses elsewhere for Unknown-storey reassignment.
  • No change to room geometry/flood-fill — only which elements get tested against the (unchanged) detected room rectangles.

Test plan

  • scripts/witness_containment_alias.py (fresh scratch DB copies each run, original fetched via git show, never the checked-in DB touched):
    • LTU_AHouse: rel_contained_in_space 314 → 30,409 rows (0.25% → 24.2% of 125,698 positioned elements), newly covering HEAT/PLB/VENT/HVAC/SAN/VOID. Room rect count byte-identical (529/529). Zero SUSPECT-room leakage. PASS.
    • Regression: HHS_Office_Federated, Duplex, SampleHouse, Terminal — byte-identical containment counts before/after (true no-op on buildings that don't use this naming scheme).
  • python3 -m py_compile scripts/compile_rooms.py

Not in scope (by design)

  • The viewer-side room-level occlusion feature itself (separate follow-up once this lands).
  • Regenerating/redistributing the live deployed LTU_AHouse_extracted.db via OCI — no consumer depends on the wider containment yet; that's the natural first step of the follow-up viewer work, not this data-quality fix.

🤖 Generated with Claude Code

red1oon and others added 30 commits July 12, 2026 04:59
…751), size ledger, 2 classification corrections

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…PR #753), vendor-dedupe deferral with load-site map

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… #754) + live-on-Pages confirmation

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…y blobs in extracted DBs (jkr georeferenced Revit series)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-REJECT/R-DOOR-SCORE/R-SPINE), Task 0 traced, Task 3 no-evidence

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ier (1/1b/2), Lane B judgment-tier (Task 0 trace + R-SPINE non-convex validation)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…grind prompt (§POC0c/§POC5)

Lane B was judgment-shaped ("trace," "watch," "expect"); rewritten as a deterministic
compute-don't-judge prompt for Fable — Task 0's Terminal load-path trace and R-SPINE's
AABB-vs-true-polygon containment question both resolve to a measured geometry number,
not a read. No pipeline code changes in this pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…er move to bim-ootb/buildings

JKR_Project.db relocated from ~/Downloads/OPEN SOURCE BIM/ to the canonical
~/bim-ootb/buildings/JKR_extracted.db (same naming convention as Duplex/Terminal) — provisional,
not yet confirmed for ARC-walk promotion. Pointer added so a future session doesn't look in Downloads.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…0 closed (Terminal_ARC.db traced, §POC0c), R-SPINE AABB containment rejected+corrected (§POC5, 1188 violations/10 of 14 clusters)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ng>_ARC.db from an extracted DB

No generic discipline='ARC' filter script existed (confirmed by search — the 8 shipped *_ARC.db
files were built ad-hoc per-building, upstream of any extracted DB). Fills that gap by reusing two
already-established patterns: str_walker_outliner.js's _filterArc() predicate and
project_spaces_to_arcdb.py's verbatim-column-copy shape. Run against JKR_extracted.db to produce
JKR_ARC.db (3118/3118 ARC elements + transforms + instances read back clean, 83 spatial_structure
rows carried verbatim) — schema/table-set matches every sibling *_ARC.db exactly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… moved to canonical bim-ootb/buildings/JKR_extracted.db, corpus verified identical

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…both mirrors, 6/6 parity

Ports the POC-validated split-hallway merge rule and enclosure-based non-room rejection into
scripts/compile_rooms.py and build/room_walker.js — pseudocode/parameters taken verbatim from
the spec's Task 1/1b sections. R-MERGE unions same-storey pockets whose shared seam has no real
wall backing it (a synthetic flood-fill/door-partition split, not architecture); R-REJECT drops
pockets whose wall-backed perimeter fraction (enclosure) falls below 0.25, flags 0.25-0.50 as
SUSPECT_OPEN. Runs merge-then-reject per storey, after flood_rooms/partition_by_doors, before
guid assignment.

Verified: build/witness_room_walker_parity.js 6/6 PASS byte-identical (SampleCastle/HHS/Clinic/
Garage/Hospital/Terminal). Found + fixed a real cross-language determinism bug along the way: JS
Object.keys() on a union-find-root-keyed object silently reorders to ascending numeric order
(array-index-like key enumeration) instead of Python dict's insertion order, desyncing which
physical room got which guid between mirrors on Hospital/Terminal — fixed via an explicit
group-encounter-order array.

Session-scratchpad witness (not committed, see spec doc) confirms the named acceptance cases:
JKR 66 logical rooms -> 51 after merge (independently reproduces the spec's own row-level 79->51
number), storey '01 Aras Satu' 31->16 (the split-hallway chain fix), 0 false rejects among 34
pre-merge non-OPEN rooms, Duplex 0 merges/0 rejects (21 real ground-truth rooms untouched,
confirmed byte-identical before/after --write).

R-DOOR-SCORE (Task 2, common/room_graph.js, bim-ootb) was also implemented per spec but DISPROVEN
by witness_room_graph_path.js's existing G3a real-path regression check (LAMBDA=0.8 overrides a
9x distance gap on real door 204034) -- reverted, not shipped. Full finding + handoff recorded in
this file's new dated section.

PUSH PAUSE in effect -- committed locally only, not pushed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…it check

feat/room-pathfind-graph (bim-ootb) traced and confirmed STALE, not unmerged prior art: its
common/room_graph.js is byte-identical to what's already live on main (PR #746, commit 3f6dbbc) —
branch forked before that merge and was never fast-forwarded. Removed (0 unique commits).

Verified directly (real Duplex_ARC.db) that room_graph.js's existing shortestPath() already
serves R-SPINE's spine-restricted routing need when fed a node-filtered graph object -- no new
pathfinding algorithm required. 4/4 checks pass (session scratchpad witness_rspine_fit.js).
Remaining gap for a full R-SPINE build (not attempted, correctly out of scope this pass): spine
selection, a ~10-line restriction wrapper, and conduit-polyline geometry -- none are pathfinding.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…Viewer 0→59 rooms, Modeller self-heal loader + fresh room set), browser-proven

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e-press room injection + IDB persist

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… + stair + exit edges, human-walk pathfinding, POC-gated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e, needle=manual replace, embeds preprocessed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…3-state standardization)

Implementation landed in /tmp/wt-terminal-rooms (fix/terminal-rooms-selfheal @ 91e28ce, local
only, no push per PUSH PAUSE). All three witnesses PASS incl. the mid-flight §STANDARDIZATION
amendment (zero/recompute/none three-state model, replace semantics, double-press idempotency).
Logs: scratchpad/logs/w_needle_{terminal,patchsrc,healthy}.log. Honest findings: no building in
the local fixture set has real (non-RM_) extracted rooms — proven via a labeled synthetic
single-row fixture instead; old 12-column spatial_structure schema (Duplex) would throw inside
the walker's room_guid INSERT if ever pressed (caught gracefully, not exercised, flagged as
deferred, out of scope for this task).
…t camera-zoom gap noted

Room highlight verified live on HHS Office (31 real rooms on Level 2 alone): a single room isolates
as a clean, correctly-bounded translucent box, confirming the geometry is well-formed. Removed the
guide's unverified "tap a room to zoom to it" claim — confirmed live 3x that room-select doesn't
actually reframe the camera; flagged as a known gap instead of leaving a false claim in place.

Also appends a deferred design spec (corridor/hallway findability — TYPE/ROOM/PATH surfaces) to
ROOM_TAXONOMY_STRATEGY_2026-07-12.md, captured per user direction, explicitly future work.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…in bim-ootb)

POC-gate-first per spec: Terminal 1.5%->68.7% raw reachable room pairs (100% of the 49 rooms
that have any door at all, the other 10 are pre-existing SUSPECT_* zero-door rooms), Duplex
E1-only shortest paths byte-identical before/after (26 pairs, 0 mismatches), JKR logged honestly
(not gating). Engine shipped in bim-ootb common/room_graph.js on feat/occupant-pathfinder (off
fix/terminal-rooms-selfheal), API-compatible, four witnesses quoted in this file's # DONE section.

PUSH PAUSE in effect — local commit only, no push, no PR.
…, mobile QR) + OCCUPANT_PATHFINDER follow-up lane (exit detection first)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ug A fix now proven live

Both images predated the DiscWalk containment fix (Bug A, resolved+5-axis-verified 2026-07-12).
Re-ran the existing proven E2E witnesses unmodified (witness_e2e_walk.js, witness_e2e_seedtrunk.js,
both 100% pass) against bim-ootb main with the fix merged, rather than write new capture scripts.

walk-fixtures.png: 267→102 fixtures (space-scoped walk superseded the old density walk since these
were last captured) — building now reads as a clean, fully-contained shell from outside, no stray
geometry. seedtrunk-trunk.png: real post-route state (0→3,922 trunk segments, framebuffer-verified),
replacing the honestly-labeled pre-route placeholder that stood in after the 2026-07-09 retraction.

route-run.png/route-spine.png/samplecastle-arc-open.png intentionally NOT touched — unrelated tools
(Route sketch, ARC-open), not implicated in the containment bug; recapturing those is a separate
guide-freshness task.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ect small tasks + report-not-build

Codifies today's actual operating model: overlook admin/parallel sessions (standing), do small bounded
tasks directly (guide staleness checks/fixes — no need to dispatch an agent for a few-file, reuse-
existing-tooling job), and for anything that turns out bigger than "small" (a real feature/code fix
surfaced while checking a guide), name it precisely and hand it to another session rather than silently
expanding scope under cover of "fixing the guide."

Adds §GUIDE STALENESS METHOD — the concrete 7-step workflow proven this session (mtime vs fix-date
comparison, reuse existing E2E witnesses rather than hand-rolling capture scripts, look at the actual
image, shrink-guard-aware deploy via safe_gh_deploy.sh with explicit ALLOW_SHRINK blessing, verify the
live gh-pages branch directly rather than trust a curl that can lag CDN propagation).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…th mirrors, parity 6/6 (user-reported stairwell-as-room)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…fix verified live

Reports the STAIRWELL-STACK reject fix from today's Fable session: Terminal healed from
59 to 40 clean rooms via self-heal patch, verified live on localhost. New section documents
the Type taxonomy (INTERNAL/INTERNAL_SMALL/SUSPECT_OPEN/SUSPECT_NO_DOOR) with the real
SUSPECT_NO_DOOR demo screenshot, names the corridor/CIRCULATION_DISPLAY gap honestly, and
confirms the Path sub-mode's multi-step stair-crossing routing now verified live.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…shipped (PR763), two measured open lanes (air-room containment, courtyard chord)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oor-waypoint detour, POC-gated, Sonnet-executable

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… landmine + the fix (bim-ootb #764/#765)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ass parity now visible

These 3 predate the render-material-parity fix (bim-ootb PR #735, merged 2026-07-11) and
still showed the pre-fix flat opaque window panel. Re-ran the existing witness scripts
unmodified (witness_e2e_rotate.js 7/7, witness_e2e_scale.js 7/7) against current main —
same window now renders see-through with real interior furniture visible behind the pane,
matching the fix already demoed in glass-window-transparent.png.

delete-gone.png NOT touched: re-running witness_e2e_delete.js picks a different element each
run (this time a roof skylight, not the wall the current caption describes) and produces an
unrelated bird's-eye frame with no window in it — not an improvement, needs a targeted
recapture, not a blind re-run. Left as a named gap, not silently dropped.

Also found, not fixed here: witness_e2e_delete.js's D4 (REVERSIBLE — redo after delete)
FAILs on current main (5 PASS/1 FAIL) — a real regression, unrelated to this guide task.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
red1oon and others added 28 commits July 20, 2026 23:54
…do not assume live-confirmed

User: "update the prompts/# to continue testing in new session. Do not assume
issues solved." All four cinema-orbit PRs this session (#907, #921, #923,
#925) are merged and passed their own unit-level witness (a synthetic
cinemaPathPlan() probe), but NONE has been confirmed correct by the user
actually watching a real Alt+C film — this exact gap already produced two
false "done" claims this session (R2 passed its witness and shipped, then
came back "STILL BROKEN" in live use over a completely separate bug the
witness couldn't have caught; §CINEMA_FLAT_ENDING passed its witness and
shipped, then live trial triggered the entire §CINEMA_ORBIT_V2 redesign).

Retitled all four section headers from SHIPPED to "MERGED — unit-witnessed
only, live-trial status UNKNOWN", flagged §CINEMA_FLAT_ENDING as superseded
by §CINEMA_ORBIT_V2 (no longer universal, now sun-last-only), filled in the
#925 PR number, and added a NEXT SESSION banner ahead of all four sections
with concrete per-piece things to actually watch for on a real Alt+C press
(space selection landing somewhere that reads as the main hall vs an awkward
bbox-centre fallback; rushed/graceful exit mood actually looking distinct;
motivated spin reading as natural not incomplete; sun-first/sun-last shapes
both looking intentional; end-deceleration and beat-overlap actually removing
the abruptness) rather than re-deriving from scratch or assuming the merged
code is correct just because it merged.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…live orbit test

Direction (b) chosen: reuses the already-shipped _giHoldCamSig pose-signature
diff (TM_GI_HOLD_CAMGUARD, PR #816) to force a full traverse when the camera
moved on a DLOD-engaged tick, fixing the box→real restore that silently
skipped on pure camera-orbit ticks. CLI-verified (syntax, whitebox baseline
unchanged, 5/5 pure-logic self-test); needs the user's live LTU hardware test
before merge.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…link ERP Zoom-Across

Viewer guide's Time Machine bullet was a one-liner pointing generically at the
ERP guide. Adds the box-cube LOD toggle mention, the demo video, and a direct
link to the ERP guide's Time Machine authoring section — including the red
Zoom Across pill entry point that jumps the timeline to an element's
construction moment. Targeted addition per project_viewer_guide_erp_correlation_next
memory, not a full guide rescope.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…E.md §5

Real SQL test against buildings/LTU_AHouse_extracted.db (125,698 elements, no browser/GPU needed):
grouping by storey shows even the biggest single floor leaves 65% of the building on a different
storey (most floors clear 90%+), and elements_meta.storey has complete coverage — a genuinely
viable, buildable-today culling axis, additive to the existing distance+frustum box-proxy design.
Same-floor room-level occlusion is a separate, currently-blocked idea: rel_contained_in_space only
covers 1.3% of elements, a data gap not a logic gap.

Also records why this axis was missed in weeks of prior perf triage: every phase (TM delta-render,
box-proxy, dlod.js frustum culling, retracted S261 swap) asked a camera-relative question (distance/
frustum/time-window); none asked whether the building's own storey structure already proves an
element can't be seen. Not a data gap (storey coverage was always complete) — an analysis blind
spot from reactive, reuse-existing-mechanism-only fixing. Surfaced by user pushback on the "wide
view = facade" assumption, which also caught that Alt+C Cinema Orbit dives into interior spaces
too (not purely exterior), so any occlusion design must cover both entry points.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…heck to FLY_TOUR_DLOD_SCALE.md

Two more rounds of user pushback found real cracks in §5's storey-partition idea: (1) aerial/
exterior tour legs (orbit, bird's-eye) have no single "current storey" and genuinely need other
floors visible — blanket storey-hiding punches holes in the building during establishing/closing
shots; (2) even where valid (camera deep in one floor), storey-level is too coarse — real room-
level containment data shows 8.9 elements/room average vs 44,374 on the biggest storey, so the
actual win was always the same-floor axis, which storey-partition can't touch. Retracted the
storey-only recommendation; replaced with a two-track split (box-proxy for aerial via the existing
§0-§2 mechanism, room-level occlusion for interior gated on fixing rel_contained_in_space coverage
first — a separate prerequisite task, not scope-crept into this file).

Added §6: traced real code (not assumed) for how any DLOD extension interacts with Find Panel and
Clash. Find's element-precise highlight and Clash's detail view both draw independent overlay
geometry — unaffected. Find's isolate mode (filterByGuids) writes the same per-slot visibility
state DLOD's per-tick traverse re-asserts every tick with zero coordination — a confirmed, not
hypothetical, conflict: isolating a GUID can be silently reverted by DLOD on the very next tick.
Names the required fix (an exemption clause covering A.activeGuidFilter, same shape as TM's
existing FRONTIER/RECENT-always-real rule) as non-optional before any DLOD extension ships.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PR #927 merged to bim-ootb main (ee57a3e). Live-hardware orbit test confirmed
via youtu.be/juwOrpqKhFE. Nothing further open on TM_DLOD_SCALE.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Branch was 1 behind main; merged clean, re-witnessed green, pushed, PR opened.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…PR #924 merged

The 2026-07-12 back-arrow fix (HISTORY_KNOB_SIGNAL_TAP.md) was witnessed and pushed to a
branch but never opened as a PR or merged — that's why "world/history" broke again a week
later. Cherry-picked it onto fresh main, re-witnessed, merged (bim-ootb PR #924, bbf8c9e).
Documented the fix location, the fragmented-across-8-files structural pattern behind the
recurring breakage, and closed out the three affected pointer files.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…when noticed"

61 bim-ootb worktrees had accumulated despite an earlier verbal "everyone clean up" —
that instruction only reached sessions live at the time and left nothing for a fresh
session to read. Bakes the ahead/dirty check + an active-process guard (don't yank a
worktree another concurrent session is mid-command inside, even if git-clean) into the
standing protocol instead. 26 of 61 confirmed prunable and removed this pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… for FLY_TOUR_DLOD_SCALE.md

§7: real SQL math (LTU_AHouse_extracted.db) found the §0-§4 distance-radius rule, reused verbatim
from TM_DLOD_SCALE.md, gets occlusion backwards — 54.5% of the whole building (every storey) falls
within the "stays real" 50m radius from a central interior point, including elements behind walls
5m away; at the tour's own logged real orbit distance (r=255, from an actual live log line earlier
this session) 0% of elements fall within 50m, meaning the entire building would render as boxes
during the tour's own opening/closing aerial shots. Distance is not a proxy for occlusion. Names
an existing, currently render-unused R-tree spatial index (CINEMATIC_RENDERING.md) as the basis for
a corrected line-of-sight axis — not yet designed, two open prerequisites (CPU cost of ~125k
raycasts/tick unverified; pop/flicker risk deferred to §8).

§8: user directive — before touching any DLOD visibility-swap code, checked this project's own
history and found this exact problem class has failed FOUR times already: S258 (disabled on edge-
on flicker + TM visibility conflicts), S259 (proposed BatchedMesh fix), S261 (built full geometry
swap WITH a hysteresis band specifically to prevent boundary flicker — still retracted, hysteresis
alone was proven insufficient), S262 (tried to re-enable, didn't stick, still disabled today behind
a whitebox guard). Cross-fade/opacity-blend was named once (S261_DLOD_PBR_MILLION.md) but never
built or tested — a genuinely untested idea, not a repeat of a known failure, but also not a known
success. §8 authorizes Fable to build an ISOLATED PROTOTYPE reproducing the known edge-on-flicker
failure first, then test cross-fade against that same reproduction, and REPORT FINDINGS ONLY — no
live wiring into dlod.js/streaming.js/time_machine.js, no touching the _useDlodPath guard, no PR —
until the user reviews the report and explicitly authorizes implementation.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PROGRESS.md was 116 lines (budget 80): archived 2026-07-05→07-16 DONE items to
prompts/archive/PROGRESS_DONE_ARCHIVE_pre_2026-07-17.md as one-line pointers (detail already lives
in their cited prompts files), trimmed several verbose Archive entries to true one-liners, and
updated the Fly Tour route-cache entry to reflect its final gated state (FLY_TOUR_DLOD_SCALE.md §8
— Fable authorized to investigate cross-fade only, report back, no implementation without sign-off).
116 → 87 lines; active OPEN items left untouched.

Added a durable cross-session memory (project_dlod_geometry_swap_landmine.md): this session traced
four prior failed attempts at distance/geometry-threshold visibility-swap DLOD in bim-ootb's viewer
(S258, S259, S261, S262 — hysteresis was already tried and proven insufficient alone) before
proposing anything new, per this project's own anti-drift doctrine. Recorded so a future session
doesn't have to re-derive that history from scratch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…E-ATTRIB witness — PR bim-ootb#930

Specs and witnesses the guide's own named next-piece (opt-in per-step signing):
device signer was never installed on the live UI, and rebase()/pushRows() each
independently dropped gid/branch_id/sig on every cross-device sync. S7 (signer
install + column preservation) landed and witnessed 27/27 green; S8 (roster-gated
cross-device verify) spec'd as the next phase, not yet built.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…R bim-ootb#932, guide updated

S8 as originally specced ("reuse verifyEpochSigsOps as-is") was wrong — probed
before implementing and found that module enforces a single active signer with
explicit ROTATE handoffs, which would reject any second concurrently-active
device outright. Corrected spec + built the actually-right primitive instead
(per-op independent multi-device verification, PR #932).

Extends witness_e2e_rebase_attrib.js with the S8 verification pass (both real
devices correctly attributed post-sync, tampered roster rejected) — exit 0,
37/37 green, regression-clean against witness_roster_verify.js.

ERPUserGuide.md's "one honest limit" callout rewritten: the signing/verification
mechanism is now proven end-to-end on field edits; DocAction-specific and roster
distribution remain named, honest open items rather than blanket "not yet".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…yst+fade10+depthWrite-off = pop at camera-motion baseline; report-only, gate respected

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…TX4060 + r185 BatchedMesh/InstancedMesh): batch-alpha FAILS, overlay-hoist pixel-identical, inst-alpha WORKS

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…av+Fly Tour; full disengage under Find isolation; Alt+C/Alt+P excluded

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…rtifact, not a product bug

Root-caused via a throwaway debug worktree: idempiere.html deliberately makes
individually crud-editable grid cells open a single-field inline editor on click
(P4/W-INPLACE-GRID-LIVE "GridView parity"), stopPropagation()-ing past the row's
own click handler. A bare row.click() lands wherever Playwright's default click
point falls, which cell that is depends on column layout — happened to hit
DocumentNo (crud-editable) for the Sales Order window and POReference (not
curated, falls through to opening the full form) for Purchase Order. Same table,
same code, no SO-specific defect.

Added clickRowOpen() — clicks the POReference cell explicitly (present in both
windows, deterministically non-crud-editable) instead of the ambiguous row
center. Stage 1 now PASSES: a real Sales Order can be authored and completed
end-to-end through the live UI.

Re-running the full cycle surfaced the next real, distinct gap: Stages 2/3 now
fail because neither Generate-process's order picker offers the freshly-created
order as a candidate — not yet root-caused, named as the new frontier.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… all W-DLOD-NAV witnesses PASS on real GPU (112.7→17.3ms wide orbit on LTU)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…uota defeats §4 self-heal; Fly re-plans every press (user 'hangs the scene' log); fix direction = IDB store

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…); next frontier named

Same class of gap as Stage 1's DocAction fix: renderOrderPicker() read only the
raw seed bundle, never folding the op-log overlay, so a freshly-created order
could never be a Generate-Shipments/Invoices candidate. Fixed and witnessed.

Running the process against the now-offered order surfaces a deeper, more
central gap: crud_overlay.js's shared cleanVals()/buildOp strips a save-hook-
derived mandatory field (order warehouse) before it's ever persisted on CREATE.
Named precisely, not fixed — touches every table's CREATE path, more invasive
than the two fixes already landed this cycle.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nterior-vs-aerial win profile explained

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
… wave absorbed in 34ms

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…43 chunked eval flight numbers + budget negative result

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…ge-3 version recompile (spec from Alt-C session, preserved from evaporating scratchpad)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nFrp9J35tFknm8UM9jSLs
…ge 2 next-layer + new AD_Org_ID casing bug named
Reactive shape (option 1): _ensureRoomsCore() busts the Fly-tour route
cache whenever a version-triggered recompile fires, for ANY caller of
ensureRooms (not just Fly itself). Witness proves the cache-stored-
before-a-version-bump scenario the spec's GIVEN actually describes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…irmed Stage 6 PO is data-tagged Sales doctype underneath
…ment join

CONTAINMENT_LTU_STOREY_ALIAS.md: compile_rooms.py's rel_contained_in_space
join keyed on exact storey-string equality, but LTU_AHouse's disciplines each
spell the same floor differently (ARC "VÅNING N", STR "VÅN N", MEP "Plan N"/
"Storey N") — verified via Z-band clustering that all four spellings match
the same physical floor for a given N. Since room detection is ARC-only,
every non-ARC element was silently excluded from containment regardless of
true geometric location (MEP = 83.7% of the building, zero rows before).

_canonical_floor() collapses the known spellings onto one "F<n>" key on both
sides of the join; anything that doesn't match (Unknown/TAKPLAN/Ref.) falls
back to nearest-Z resolution against canonical-floor anchors built from the
rooms' own center_z — same nearest-anchor technique the file already uses
for Unknown-storey wall/door reassignment, applied at the join instead.

W-CONTAINMENT-ALIAS (scripts/witness_containment_alias.py, scratch DB copies,
never the checked-in DB): LTU_AHouse rel_contained_in_space 314 -> 30,409 rows
(0.25% -> 24.2% of 125,698 positioned elements), newly covering HEAT/PLB/VENT/
HVAC/SAN/VOID; room geometry (529 rect rows) byte-identical before/after,
zero SUSPECT-room containment leakage. Regression-checked byte-identical
(no diff at all) on 4 other buildings (HHS_Office_Federated, Duplex,
SampleHouse, Terminal) that don't use this naming scheme — true no-op there.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
red1oon added a commit that referenced this pull request Jul 21, 2026
Room-level occlusion's blocking data gap (1.3% rel_contained_in_space
coverage) was a storey-naming mismatch across disciplines, not a source
gap. Fix landed compiler-side; LTU_AHouse now at 24.2%. Occlusion itself
still not implemented, and the live deployed DB isn't regenerated yet —
both are the next session's job on this lane.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…eeded

Correction: compile_rooms.py is the offline reference tool, not what runs
for real users. room_walker.js (client-side JS twin, the needle self-heal
path) had the identical bug and needed the same fix — otherwise this PR's
fix would never have reached anyone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant