For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.
Goal: Split the 492-line useNavigator god-hook into a wired-tools-style store + three filters, extract door lifecycle to useDoorState, hoist NavigatorView's 9 local useState into a Zustand navigatorUiStore, migrate all 13 consumers, delete the shim — zero user-visible change.
Architecture:src/hooks/navigator/useNavigatorStore.ts is the internal useBetween closure holding data state + non-door event listeners + the sendSearch/reloadCurrentSearch actions. Three filter files (useNavigatorData.ts, useNavigatorUiState.ts, useNavigatorActions.ts) expose flat slices. navigatorUiStore.ts is a Zustand store for 9 panel-visibility/lifecycle flags. useDoorState.ts (in src/hooks/rooms/widgets/) is a separate useBetween closure for door bell/password lifecycle — dual-subscribed to GetGuestRoomResultEvent and GenericErrorEvent alongside the navigator store, each filtering by branch / error code.
Tech Stack: React 19.2, TypeScript (TS 7 native preview for typecheck), Zustand 5 via createNitroStore, use-between 1.x, Vitest 3 with co-located suites + src/nitro-renderer.mock.ts.
Branch:feat/navigator-modernization (already created at 66062c6, forked from origin/Dev @ d5d5ca59). All commits stay on this branch; auto-push to simoleo/feat/navigator-modernization FF-only.
House rules (apply to every commit):
Commit author: simoleo89 <simoleo89@users.noreply.github.com> via per-command -c overrides — do NOT modify global git config.
No Co-Authored-By trailer.
Each commit must be a stopping point: yarn typecheck clean, yarn test --run green, yarn lint:hooks clean.
cd Nitro-V3 ; yarn test --run src/hooks/navigator/navigatorUiStore.test.ts
Expected: PASS (all ~14 cases green).
Step 5: Commit
cd Nitro-V3
git add src/hooks/navigator/navigatorUiStore.ts src/hooks/navigator/navigatorUiStore.test.ts
git -c user.name=simoleo89 -c user.email=simoleo89@users.noreply.github.com commit -m "feat(navigator): Zustand UI store for panel-visibility + lifecycle flags
Hoists the 9 useState in NavigatorView (isVisible, isReady, isCreatorOpen,
isRoomInfoOpen, isRoomLinkOpen, isOpenSavesSearches, isLoading, needsInit,
needsSearch) into a createNitroStore-backed Zustand store with named
actions. Future linkTracker / lifecycle wiring will call these actions
instead of mutating local component state.
TDD: ~14 cases on each action's transitions + idempotency."
git push simoleo feat/navigator-modernization
Step 4: Verify the renderer mock exposes the events used in tests
cd Nitro-V3 ; grep -E "DoorbellMessageEvent|RoomDoorbellAcceptedEvent|FlatAccessDeniedMessageEvent|GenericErrorEvent|GetGuestRoomResultEvent|RoomDataParser" src/nitro-renderer.mock.ts
Expected: all six symbols present. If any are missing, ADD a minimal stub to src/nitro-renderer.mock.ts (real class with a no-arg constructor; getParser will be overridden in tests). Use the existing pattern — e.g. find RoomSessionDoorbellEvent and follow its shape.
Step 5: Run the test to verify it passes
cd Nitro-V3 ; yarn test --run src/hooks/rooms/widgets/useDoorState.test.tsx
Expected: PASS (11 cases).
Step 6: Commit
cd Nitro-V3
git add src/hooks/rooms/widgets/useDoorState.ts src/hooks/rooms/widgets/useDoorState.test.tsx src/nitro-renderer.mock.ts
git -c user.name=simoleo89 -c user.email=simoleo89@users.noreply.github.com commit -m "feat(rooms): extract useDoorState from useNavigator god-hook
Separates the door bell/password lifecycle from Navigator data. Subscribes
to DoorbellMessageEvent / RoomDoorbellAcceptedEvent /
FlatAccessDeniedMessageEvent / GenericErrorEvent (-100002 only) /
GetGuestRoomResultEvent (roomForward branch with DOORBELL_STATE or
PASSWORD_STATE doorMode only). Other branches/errorCodes stay on
useNavigator — both subscribers coexist via useMessageEvent + filtering.
TDD: 11 cases incl. userName-empty filter + errorCode -100002 filter +
owner-skip + reset()."
git push simoleo feat/navigator-modernization
Task 3: Internal useNavigatorStore (closure with data + non-door listeners + new actions)
Files:
Create: src/hooks/navigator/useNavigatorStore.ts
Step 1: Read current useNavigator.ts in full
cd Nitro-V3 ; cat src/hooks/navigator/useNavigator.ts | head -100
You will translate this file's useNavigatorState function into the new useNavigatorStore.ts, with these surgical changes:
RemovedoorData state and its dual writers (lines that called setDoorData).
Remove the door-only branches of GetGuestRoomResultEvent (doorMode bell/password) — these are now in useDoorState. KEEP the roomEnter branch and the roomForward branch that calls CreateRoomSession(parser.data.roomId).
Remove the GenericErrorEvent case for errorCode -100002 — now in useDoorState. KEEP cases 4009/4010/4011/4013.
Keep all other listeners untouched.
Add two new actions extracted from NavigatorView.tsx locals (currently at NavigatorView.tsx:42-79): sendSearch(searchValue, contextCode) and reloadCurrentSearch().
The store function is NAMED useNavigatorStore (not useNavigatorState) and is NOT wrapped in useBetween here — the wrapping happens in the three filter files.
Expected: no NEW errors in src/hooks/navigator/useNavigatorStore.ts. Pre-existing floorplan-related typecheck errors (applyFloorModelLocally, JSX namespace) are environmental, not caused by P1 — see spec §11.
Step 4: Do NOT commit yet
The three filter files in Task 4 will land in the same commit as this file — atomically, so the codebase always has working hook exports.
Task 4: Three filter files + updated barrel + smoke test
export { useNavigatorActions } from './useNavigatorActions';
export { useNavigatorData } from './useNavigatorData';
export { useNavigatorUiState } from './useNavigatorUiState';
export { useNavigatorUiStore } from './navigatorUiStore';
export { useDoorState } from '../rooms/widgets/useDoorState';
export type { DoorStateSnapshot } from '../rooms/widgets/useDoorState';
export type { NavigatorUiActions, NavigatorUiState } from './navigatorUiStore';
Notice: the old export * from './useNavigator'; is GONE. useNavigator is no longer exported by the barrel — consumers must use the new filters. (The old file still exists on disk until Task 9.)
Step 6: Run typecheck — the project will fail because consumers still import useNavigator
cd Nitro-V3 ; yarn typecheck 2>&1 | tail -20
Expected: errors like Module '"...hooks/navigator"' has no exported member 'useNavigator' in the 13 consumer files. That's intentional — Tasks 6/7/8 fix them. The hook files themselves must typecheck clean.
Step 7: Run the smoke test in isolation
cd Nitro-V3 ; yarn test --run src/hooks/navigator/useNavigatorStore.test.tsx
Expected: PASS (3 cases).
Step 8: Commit all new hook files together
cd Nitro-V3
git add src/hooks/navigator/useNavigatorStore.ts src/hooks/navigator/useNavigatorData.ts src/hooks/navigator/useNavigatorUiState.ts src/hooks/navigator/useNavigatorActions.ts src/hooks/navigator/index.ts src/hooks/navigator/useNavigatorStore.test.tsx
git -c user.name=simoleo89 -c user.email=simoleo89@users.noreply.github.com commit -m "feat(navigator): wired-tools-style hook split (Store + 3 filters)
Splits the 492-line useNavigator god-hook into a useBetween-backed
useNavigatorStore closure plus three flat-shape filters
(useNavigatorData, useNavigatorUiState, useNavigatorActions), mirroring
the wired-tools layout. sendSearch + reloadCurrentSearch are extracted
as named actions out of NavigatorView locals.
Door-mode handling is removed from this store and lives in useDoorState
(committed previously) — see GetGuestRoomResultEvent and
GenericErrorEvent dual-subscription with mutually exclusive filters.
The barrel index.ts no longer re-exports useNavigator. The 13 consumers
will fail typecheck until Tasks 6-8 migrate them; the hook files
themselves are clean. Smoke test covers filter shapes."
git push simoleo feat/navigator-modernization
Note: yarn test --run overall is RED at this commit (consumers can't typecheck) — that's why we commit AND PUSH but DO NOT verify whole-project test green here. The next tasks make it green.
Deviation from house rule: this is the only intentionally-broken intermediate commit in the plan. Documented in spec §11.
cd Nitro-V3 ; cat src/components/navigator/NavigatorView.tsx
You will replace 9 local useState, the local sendSearch/reloadCurrentSearch definitions, and most of the linkTracker body with calls to useNavigatorUiStore.getState().
The sendSearch prop from the component's signature
DELETED
sendSearch(value, code) calls in handlers
replace with destructured local: const { sendSearch } = useNavigatorActions(); and call sendSearch(...)
(Exact line-by-line edit — read the file then mechanically apply the table above. If the file uses sendSearch from props, the JSX type for the component changes too.)
Step 3: Verify typecheck
cd Nitro-V3 ; yarn typecheck 2>&1 | grep NavigatorSearchView
Expected: no NEW errors. (Pre-existing floorplan errors applyFloorModelLocally / JSX namespace may still appear — they are NOT introduced by P1 and may be present on origin/Dev independently of this work.)
Step 3: Run full test suite
cd Nitro-V3 ; yarn test --run 2>&1 | tail -10
Expected: all suites pass, including the 3 new ones from this PR.
Step 4: Run lint:hooks
cd Nitro-V3 ; yarn lint:hooks 2>&1 | tail -5
Expected: clean.
Step 5: Commit the full consumer-migration sweep (Tasks 5, 6, 7, 8 atomic)
cd Nitro-V3
git add src/components/navigator/views/NavigatorDoorStateView.tsx src/components/navigator/NavigatorView.tsx src/components/navigator/views/search/NavigatorSearchView.tsx src/components/navigator/views/NavigatorRoomCreatorView.tsx src/components/navigator/views/NavigatorRoomInfoView.tsx src/components/navigator/views/NavigatorRoomLinkView.tsx src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx src/components/navigator/views/search/NavigatorSearchResultItemView.tsx src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx src/components/navigator/views/search/NavigatorSearchResultView.tsx src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx src/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsx src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx
git -c user.name=simoleo89 -c user.email=simoleo89@users.noreply.github.com commit -m "refactor(navigator): migrate all 13 consumers off useNavigator god-hook
Mechanical swap to the new filter hooks landed in the previous commit:
- NavigatorDoorStateView -> useDoorState (snapshot/setSnapshot/reset)
- NavigatorView -> useNavigatorData + useNavigatorUiState +
useNavigatorActions + direct useNavigatorUiStore.getState() in handlers
(linkTracker collapsed to a dispatch table; 9 useState gone)
- NavigatorSearchView -> useNavigatorData + useNavigatorActions
(sendSearch prop drilling removed)
- 10 bulk consumers (one-line import swap) -> useNavigatorData
Zero behavioural change intended. yarn typecheck + yarn test --run +
yarn lint:hooks all clean on this commit."
git push simoleo feat/navigator-modernization
Task 9: Delete the old useNavigator.ts + final verification
Expected: both commands return no results (or only the deletion target itself).
Step 2: Delete the file
cd Nitro-V3 ; git rm src/hooks/navigator/useNavigator.ts
Step 3: Run the gate trio
cd Nitro-V3 ; yarn typecheck 2>&1 | tail -10
cd Nitro-V3 ; yarn test --run 2>&1 | tail -10
cd Nitro-V3 ; yarn lint:hooks 2>&1 | tail -5
Expected: all clean.
Step 4: Manual smoke (development build)
Start the dev server. Verify each path renders identically to pre-P1:
cd Nitro-V3 ; yarn start
Then in the browser:
Open Navigator via toolbar icon → opens at default tab
Click each top-level tab (Pubbliche / Tutte le stanze / Eventi / Il mio mondo) → results load, loading spinner shows briefly
Type into filter input → search returns
Open a room with NO door (your own room or a public) → enters directly
Open a room with DOORBELL → doorbell prompt appears, click Ring, then close
Open a room with PASSWORD → password prompt appears, type wrong password → "wrong password" message, then close
Click favourite ☆ on a search result → star fills/empties
Open RoomInfo (navigator/toggle-room-info link or in-room button) → opens, close again
Open RoomLink (navigator/toggle-room-link) → opens, close again
Open Room Creator (the + tab) → renders, close
Close Navigator → all sub-windows hide
If anything regresses → STOP, do NOT commit, investigate.
Step 5: Commit + push final
cd Nitro-V3
git add src/hooks/navigator/useNavigator.ts
git -c user.name=simoleo89 -c user.email=simoleo89@users.noreply.github.com commit -m "refactor(navigator): remove deprecated useNavigator god-hook
P1 complete. All 13 consumers migrated to the wired-tools-style split:
- useNavigatorData / useNavigatorUiState / useNavigatorActions (filters)
- useNavigatorStore (internal useBetween closure)
- navigatorUiStore (Zustand for 9 UI flags)
- useDoorState (extracted to src/hooks/rooms/widgets)
Closes spec docs/superpowers/specs/2026-05-26-navigator-modernization-p1-design.md.
Next phases: P2 (TanStack Query for search), P3 (reactive favourites
via snapshot), P4 (visual rework + virtualization + persistence)."
git push simoleo feat/navigator-modernization
Step 6: Open PR (optional, but recommended)
cd Nitro-V3 ; gh pr create --base Dev --head simoleo89:feat/navigator-modernization --title "feat(navigator): wired-tools-style hook split + Zustand UI store (P1)" --body "## Summary
- Splits the 492-line useNavigator god-hook into useNavigatorStore + useNavigatorData / useNavigatorUiState / useNavigatorActions filters (wired-tools layout)
- Extracts door bell/password lifecycle to src/hooks/rooms/widgets/useDoorState
- Hoists the 9 useState in NavigatorView into a Zustand navigatorUiStore via createNitroStore
- Migrates all 13 consumers off useNavigator
- Removes the deprecated useNavigator shim entirely
- Zero user-visible change — spec marks the visual rework as P4 (separate plan)
Spec: docs/superpowers/specs/2026-05-26-navigator-modernization-p1-design.md
Plan: docs/superpowers/plans/2026-05-26-navigator-modernization-p1.md
## Test plan
- [x] yarn typecheck clean
- [x] yarn test --run green (+3 new suites: navigatorUiStore, useDoorState, useNavigatorStore smoke)
- [x] yarn lint:hooks clean
- [x] Manual smoke (see plan §9 step 4 checklist)"
(If the gh PR fails on --base Dev mapping, use Dev exactly as written; the duckietm upstream uses capital-D Dev.)
Self-review against spec
After completing all tasks, verify:
§3.1 useNavigatorStore — Task 3 creates this file
§3.2 useNavigatorData/UiState/Actions — Task 4 creates these
Navigator Modernization P1 Implementation Plan
Goal: Split the 492-line
useNavigatorgod-hook into awired-tools-style store + three filters, extract door lifecycle touseDoorState, hoist NavigatorView's 9 local useState into a ZustandnavigatorUiStore, migrate all 13 consumers, delete the shim — zero user-visible change.Architecture:
src/hooks/navigator/useNavigatorStore.tsis the internaluseBetweenclosure holding data state + non-door event listeners + thesendSearch/reloadCurrentSearchactions. Three filter files (useNavigatorData.ts,useNavigatorUiState.ts,useNavigatorActions.ts) expose flat slices.navigatorUiStore.tsis a Zustand store for 9 panel-visibility/lifecycle flags.useDoorState.ts(insrc/hooks/rooms/widgets/) is a separateuseBetweenclosure for door bell/password lifecycle — dual-subscribed toGetGuestRoomResultEventandGenericErrorEventalongside the navigator store, each filtering by branch / error code.Tech Stack: React 19.2, TypeScript (TS 7 native preview for typecheck), Zustand 5 via
createNitroStore,use-between1.x, Vitest 3 with co-located suites +src/nitro-renderer.mock.ts.Branch:
feat/navigator-modernization(already created at66062c6, forked fromorigin/Dev@d5d5ca59). All commits stay on this branch; auto-push tosimoleo/feat/navigator-modernizationFF-only.House rules (apply to every commit):
simoleo89 <simoleo89@users.noreply.github.com>via per-command-coverrides — do NOT modify global git config.Co-Authored-Bytrailer.yarn typecheckclean,yarn test --rungreen,yarn lint:hooksclean.Task 1: Zustand
navigatorUiStore(TDD)Files:
Create:
src/hooks/navigator/navigatorUiStore.tsTest:
src/hooks/navigator/navigatorUiStore.test.tsStep 1: Write the failing test
Create
src/hooks/navigator/navigatorUiStore.test.ts:Expected: FAIL —
Cannot find module './navigatorUiStore'.Create
src/hooks/navigator/navigatorUiStore.ts:Expected: PASS (all ~14 cases green).
Task 2: Extract
useDoorState(TDD)Files:
Create:
src/hooks/rooms/widgets/useDoorState.tsTest:
src/hooks/rooms/widgets/useDoorState.test.tsxStep 1: Write the failing test
Create
src/hooks/rooms/widgets/useDoorState.test.tsx:Expected: FAIL —
Cannot find module './useDoorState'.useDoorStateCreate
src/hooks/rooms/widgets/useDoorState.ts:Expected: all six symbols present. If any are missing, ADD a minimal stub to
src/nitro-renderer.mock.ts(real class with a no-arg constructor;getParserwill be overridden in tests). Use the existing pattern — e.g. findRoomSessionDoorbellEventand follow its shape.Expected: PASS (11 cases).
Task 3: Internal
useNavigatorStore(closure with data + non-door listeners + new actions)Files:
Create:
src/hooks/navigator/useNavigatorStore.tsStep 1: Read current
useNavigator.tsin fullYou will translate this file's
useNavigatorStatefunction into the newuseNavigatorStore.ts, with these surgical changes:doorDatastate and its dual writers (lines that calledsetDoorData).GetGuestRoomResultEvent(doorMode bell/password) — these are now inuseDoorState. KEEP theroomEnterbranch and theroomForwardbranch that callsCreateRoomSession(parser.data.roomId).GenericErrorEventcase for errorCode-100002— now inuseDoorState. KEEP cases 4009/4010/4011/4013.NavigatorView.tsxlocals (currently atNavigatorView.tsx:42-79):sendSearch(searchValue, contextCode)andreloadCurrentSearch().useNavigatorStore(notuseNavigatorState) and is NOT wrapped inuseBetweenhere — the wrapping happens in the three filter files.Create
src/hooks/navigator/useNavigatorStore.ts:Expected: no NEW errors in
src/hooks/navigator/useNavigatorStore.ts. Pre-existing floorplan-related typecheck errors (applyFloorModelLocally, JSX namespace) are environmental, not caused by P1 — see spec §11.The three filter files in Task 4 will land in the same commit as this file — atomically, so the codebase always has working hook exports.
Task 4: Three filter files + updated barrel + smoke test
Files:
Create:
src/hooks/navigator/useNavigatorData.tsCreate:
src/hooks/navigator/useNavigatorUiState.tsCreate:
src/hooks/navigator/useNavigatorActions.tsModify:
src/hooks/navigator/index.tsCreate:
src/hooks/navigator/useNavigatorStore.test.tsxStep 1: Create
useNavigatorData.tsuseNavigatorUiState.tsuseNavigatorActions.tsindex.tsNotice: the old
export * from './useNavigator';is GONE.useNavigatoris no longer exported by the barrel — consumers must use the new filters. (The old file still exists on disk until Task 9.)Create
src/hooks/navigator/useNavigatorStore.test.tsx:useNavigatorExpected: errors like
Module '"...hooks/navigator"' has no exported member 'useNavigator'in the 13 consumer files. That's intentional — Tasks 6/7/8 fix them. The hook files themselves must typecheck clean.Expected: PASS (3 cases).
Note:
yarn test --runoverall is RED at this commit (consumers can't typecheck) — that's why we commit AND PUSH but DO NOT verify whole-project test green here. The next tasks make it green.Deviation from house rule: this is the only intentionally-broken intermediate commit in the plan. Documented in spec §11.
Task 5: Migrate
NavigatorDoorStateView.tsxFiles:
Modify:
src/components/navigator/views/NavigatorDoorStateView.tsxStep 1: Apply the consumer rewrite
Replace the file content with:
Key changes:
useNavigator()→useDoorState()doorData→snapshotsetDoorData(null)→reset()setDoorData(prev => ...)→setSnapshot(prev => ...)Defensive
if(doorData && ...)guards removed becausesnapshotis never null (always has a default{ roomInfo: null, state: NONE })Step 2: Verify typecheck for this file is clean
Expected: no output (no errors mentioning this file).
Task 6: Migrate
NavigatorView.tsx(the big one)Files:
Modify:
src/components/navigator/NavigatorView.tsxStep 1: Read the current file in full
You will replace 9 local
useState, the localsendSearch/reloadCurrentSearchdefinitions, and most of thelinkTrackerbody with calls touseNavigatorUiStore.getState().Replace the file contents with:
Key changes:
9
useState→ 3 filter hooks (useNavigatorData,useNavigatorUiState,useNavigatorActions) + directuseNavigatorUiStore.getState()calls in handlerssendSearchandreloadCurrentSearchremoved from this file — they're inuseNavigatorStorenowlinkTrackerbody becomes a clean dispatch table onstore.show()/store.hide()/ etc.NavigatorSearchViewno longer receivessendSearchas a prop — Task 7 updates that consumer tooStep 3: Verify typecheck
Expected: no errors in
NavigatorView.tsx. (Other consumer files still red — fixed in Tasks 7-8.)Task 7: Migrate
NavigatorSearchView.tsx(drop the prop)Files:
Modify:
src/components/navigator/views/search/NavigatorSearchView.tsxStep 1: Read the current file
Find and replace inside the file:
import { useNavigator } from '../../../../hooks';import { useNavigatorActions, useNavigatorData } from '../../../../hooks';const { topLevelContext = null } = useNavigator();const { topLevelContext } = useNavigatorData();sendSearchprop from the component's signaturesendSearch(value, code)calls in handlersconst { sendSearch } = useNavigatorActions();and callsendSearch(...)(Exact line-by-line edit — read the file then mechanically apply the table above. If the file uses
sendSearchfrom props, the JSX type for the component changes too.)Expected: no errors.
Task 8: Migrate the remaining 10 bulk consumers
Files (10 modifications):
src/components/navigator/views/NavigatorRoomCreatorView.tsxsrc/components/navigator/views/NavigatorRoomInfoView.tsxsrc/components/navigator/views/NavigatorRoomLinkView.tsxsrc/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsxsrc/components/navigator/views/search/NavigatorSearchResultItemView.tsxsrc/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsxsrc/components/navigator/views/search/NavigatorSearchResultView.tsxsrc/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsxsrc/components/room/widgets/room-filter-words/RoomFilterWordsWidgetView.tsxsrc/components/room/widgets/room-tools/RoomToolsWidgetView.tsxStep 1: For each of the 10 files above, apply this mechanical swap
import { useNavigator } from '...../hooks';import { useNavigatorData } from '...../hooks';(keep the same relative path)const { X = ..., Y = ..., ... } = useNavigator();const { X, Y, ... } = useNavigatorData();(drop the= null/= []defaults — the new filter always returns the same shape)Spot-checks per file (verify you've changed nothing else):
NavigatorRoomCreatorView: readscategoriesonlyNavigatorRoomInfoView: readsnavigatorDataandfavouriteRoomIdsNavigatorRoomLinkView: readsnavigatorData.enteredGuestRoomNavigatorRoomSettingsBasicTabView: readscategoriesNavigatorSearchResultItemView: readsfavouriteRoomIdsandnavigatorDataNavigatorSearchResultItemInfoView: readsnavigatorDataNavigatorSearchResultView: readstopLevelContextCatalogLayoutRoomAdsView: readsnavigatorData.currentRoomIdRoomFilterWordsWidgetView: readsnavigatorData.currentRoomIdRoomToolsWidgetView: readsnavigatorDataStep 2: Run full typecheck
Expected: no NEW errors. (Pre-existing floorplan errors
applyFloorModelLocally/ JSX namespace may still appear — they are NOT introduced by P1 and may be present onorigin/Devindependently of this work.)Expected: all suites pass, including the 3 new ones from this PR.
Expected: clean.
Task 9: Delete the old
useNavigator.ts+ final verificationFiles:
Delete:
src/hooks/navigator/useNavigator.tsStep 1: Verify no references remain
Expected: both commands return no results (or only the deletion target itself).
Expected: all clean.
Start the dev server. Verify each path renders identically to pre-P1:
Then in the browser:
navigator/toggle-room-infolink or in-room button) → opens, close againnavigator/toggle-room-link) → opens, close again+tab) → renders, closeIf anything regresses → STOP, do NOT commit, investigate.
(If the
ghPR fails on--base Devmapping, useDevexactly as written; the duckietm upstream uses capital-DDev.)Self-review against spec
After completing all tasks, verify: