메타데이터
목표
앱 셸에 subNav 슬롯과 no-subnav 변형을 도입하고 map filter strip을 flow 레이어로 이동한다.
고정 결정
KTO 관광정보 표시 토글 기본값은 OFF다.
기존 src/api/tourismClient.ts와 src/tourismTypes.ts contract가 main에 있으면 우선 사용하고, 없으면 중복 client를 만들지 않고 해당 gap을 audit evidence로 기록한다.
API path, response shape, DB schema, OAuth 성공 경로는 변경하지 않는다.
KTO/OpenAPI, Supabase, admin import/sync를 브라우저에서 직접 호출하지 않는다.
사용자-facing copy는 이 child 목표 달성에 필요한 범위에서만 변경한다.
체크리스트
검증 체크리스트
Core Classification
Verification Contract
Required commands
npm.cmd run check:numeric-literals
npm.cmd run lint
npm.cmd run typecheck
npm.cmd run test:unit
npm.cmd run test:integration
npm.cmd run test:regression
npm.cmd run test:e2e
npm.cmd run build
git diff --check
UTF-8 integrity check
Source-of-truth readback
Required evidence
PR URL
main merge SHA
CI URL
local validation command output summary
completion report path
Fail-closed failure modes
API path, response shape, DB schema, OAuth success path change required
KTO/OpenAPI, Supabase, or admin import/sync direct browser call required
user-facing copy change outside this child scope required
subNav layout cannot be validated by unit/e2e tests
Architecture Boundary Gate
Responsibility map: AppShell owns header, optional subNav, content, bottom tab slots. MapStageCategoryStrip owns category chip rendering only. MapTabStage owns map surface and sheets only after this change.
Dependency direction: App.tsx composes active-tab shell slots from stage props. Stage internals do not reach upward into shell layout.
Test seam: AppShell public props and map tab rendering are verified through unit/e2e tests, not private DOM mutation.
Scope map: TSK-012-03 App shell subnav grid layout #407 changes app shell slot composition, map category strip placement, and minimal CSS needed for flow layout.
Architecture risk: old absolute CSS rules may remain for later TSK-012-06 App shell CSS offset cleanup #410 cleanup; TSK-012-03 App shell subnav grid layout #407 must avoid broad cleanup while preventing the map filter strip from staying inside map body overlay.
완료 근거
PR: TSK-012-03 App shell subnav grid layout #414
main merge SHA: $mergeSha
CI frontend: $ciUrl
Cloudflare Pages check: $deployUrl
CodeQL: $codeqlUrl
Completion report:
eports/completion/TSK-012-03-app-shell-subnav-grid-layout.md
메타데이터
TSK-012-03-APP-SHELL-SUBNAV-GRID-LAYOUTclosedapp-shell-subnav-grid-layout목표
앱 셸에 subNav 슬롯과 no-subnav 변형을 도입하고 map filter strip을 flow 레이어로 이동한다.
고정 결정
OFF다.src/api/tourismClient.ts와src/tourismTypes.tscontract가 main에 있으면 우선 사용하고, 없으면 중복 client를 만들지 않고 해당 gap을 audit evidence로 기록한다.체크리스트
검증 체크리스트
npm.cmd run check:numeric-literalsnpm.cmd run lintnpm.cmd run typechecknpm.cmd run test:unitnpm.cmd run test:integrationnpm.cmd run test:regressionnpm.cmd run test:e2enpm.cmd run buildgit diff --checkCore Classification
TSK-012-00Verification Contract
Required commands
npm.cmd run check:numeric-literalsnpm.cmd run lintnpm.cmd run typechecknpm.cmd run test:unitnpm.cmd run test:integrationnpm.cmd run test:regressionnpm.cmd run test:e2enpm.cmd run buildgit diff --checkSource-of-truth readback
Required evidence
Fail-closed failure modes
Architecture Boundary Gate
AppShellowns header, optional subNav, content, bottom tab slots.MapStageCategoryStripowns category chip rendering only.MapTabStageowns map surface and sheets only after this change.App.tsxcomposes active-tab shell slots from stage props. Stage internals do not reach upward into shell layout.완료 근거
eports/completion/TSK-012-03-app-shell-subnav-grid-layout.md