((set) => ({
- activeFilter: 'all',
- setFilter: (filter) => set({ activeFilter: filter }),
-}));
-
-// 사용 예시
-function FilterTabs() {
- const { activeFilter, setFilter } = useFilterStore();
-
- return (
-
-
- {/* ... */}
-
- );
-}
-```
-
-**Future 확장 (D-02 계층형 필터)**:
-```typescript
-interface HierarchicalFilterState {
- // 현재 선택값
- category: CategoryType | null;
- mediaId: string | null;
- castId: string | null;
- contextType: ContextType | null;
-
- // Breadcrumb
- breadcrumb: FilterBreadcrumb[];
-
- // Actions
- setCategory: (cat: CategoryType | null) => void;
- setMedia: (id: string | null) => void;
- setCast: (id: string | null) => void;
- setContext: (ctx: ContextType | null) => void;
- clearAll: () => void;
- navigateToBreadcrumb: (level: number) => void;
-}
-```
-
-### 2.2 searchStore
-
-**File**: `lib/stores/searchStore.ts` / `shared/stores/searchStore.ts`
-
-```typescript
-interface SearchState {
- query: string;
- debouncedQuery: string;
- setQuery: (query: string) => void;
- setDebouncedQuery: (query: string) => void;
-}
-
-const useSearchStore = create((set) => ({
- query: '',
- debouncedQuery: '',
- setQuery: (query) => set({ query }),
- setDebouncedQuery: (debouncedQuery) => set({ debouncedQuery }),
-}));
-
-// SearchInput 컴포넌트에서 사용
-function SearchInput() {
- const { query, setQuery, setDebouncedQuery } = useSearchStore();
-
- // 250ms debounce
- useEffect(() => {
- const timer = setTimeout(() => {
- setDebouncedQuery(query);
- }, 250);
- return () => clearTimeout(timer);
- }, [query]);
-
- return (
- setQuery(e.target.value)}
- />
- );
-}
-```
-
-### 2.3 transitionStore
-
-**File**: `lib/stores/transitionStore.ts`
-
-```typescript
-interface TransitionState {
- selectedId: string | null;
- originState: Flip.FlipState | null;
- rect: DOMRect | null;
-
- setSelectedId: (id: string | null) => void;
- setOriginState: (state: Flip.FlipState | null) => void;
- setRect: (rect: DOMRect | null) => void;
- clear: () => void;
-}
-
-const useTransitionStore = create((set) => ({
- selectedId: null,
- originState: null,
- rect: null,
-
- setSelectedId: (id) => set({ selectedId: id }),
- setOriginState: (state) => set({ originState: state }),
- setRect: (rect) => set({ rect }),
- clear: () => set({ selectedId: null, originState: null, rect: null }),
-}));
-
-// CardCell에서 클릭 시 상태 저장
-function CardCell({ image }) {
- const { setSelectedId, setOriginState } = useTransitionStore();
-
- const handleClick = (e) => {
- const element = e.currentTarget;
- const state = Flip.getState(element);
- setSelectedId(image.id);
- setOriginState(state);
- };
-
- return ...
;
-}
-
-// Detail Modal에서 애니메이션 실행
-function ImageDetailModal() {
- const { originState, clear } = useTransitionStore();
-
- useEffect(() => {
- if (originState) {
- Flip.from(originState, {
- duration: 0.5,
- ease: 'power2.inOut',
- });
- }
- return () => clear();
- }, []);
-}
-```
-
----
-
-## 3. React Query Patterns
-
-### 3.1 Query Client Configuration
-
-**File**: `lib/react-query/client.ts`
-
-```typescript
-import { QueryClient } from '@tanstack/react-query';
-
-export const queryClient = new QueryClient({
- defaultOptions: {
- queries: {
- staleTime: 60 * 1000, // 1분
- gcTime: 5 * 60 * 1000, // 5분
- retry: 1,
- refetchOnWindowFocus: false,
- refetchOnReconnect: true,
- },
- mutations: {
- retry: 1,
- },
- },
-});
-```
-
-### 3.2 Query Hooks
-
-**File**: `lib/hooks/useImages.ts`
-
-```typescript
-// 무한 스크롤 이미지 조회
-export function useInfiniteFilteredImages(options: {
- filter: FilterType;
- search: string;
- limit?: number;
- initialData?: ImagePage;
-}) {
- return useInfiniteQuery({
- queryKey: ['images', 'infinite', {
- filter: options.filter,
- search: options.search,
- limit: options.limit
- }],
- queryFn: ({ pageParam }) => fetchUnifiedImages({
- filter: options.filter,
- search: options.search,
- limit: options.limit ?? 50,
- cursor: pageParam,
- }),
- initialPageParam: null,
- getNextPageParam: (lastPage) =>
- lastPage.hasMore ? lastPage.nextCursor : undefined,
- initialData: options.initialData
- ? { pages: [options.initialData], pageParams: [null] }
- : undefined,
- staleTime: 60 * 1000,
- placeholderData: keepPreviousData, // 필터 변경 시 이전 데이터 유지
- });
-}
-
-// 단일 이미지 조회
-export function useImageById(id: string) {
- return useQuery({
- queryKey: ['image', id],
- queryFn: () => fetchImageById(id),
- enabled: !!id,
- staleTime: 60 * 1000,
- });
-}
-
-// 관련 이미지 조회
-export function useRelatedImagesByAccount(
- account: string,
- excludeId: string
-) {
- return useQuery({
- queryKey: ['related', account, excludeId],
- queryFn: () => fetchRelatedImagesByAccount(account, excludeId),
- enabled: !!account && !!excludeId,
- staleTime: 60 * 1000,
- });
-}
-```
-
-### 3.3 Query Key Factory Pattern
-
-```typescript
-// lib/react-query/keys.ts
-
-export const imageKeys = {
- all: ['images'] as const,
- lists: () => [...imageKeys.all, 'list'] as const,
- list: (filters: ImageFilters) => [...imageKeys.lists(), filters] as const,
- infinite: (filters: ImageFilters) => [...imageKeys.all, 'infinite', filters] as const,
- details: () => [...imageKeys.all, 'detail'] as const,
- detail: (id: string) => [...imageKeys.details(), id] as const,
-};
-
-export const relatedKeys = {
- all: ['related'] as const,
- byAccount: (account: string, excludeId: string) =>
- [...relatedKeys.all, account, excludeId] as const,
-};
-
-// 사용
-useInfiniteQuery({
- queryKey: imageKeys.infinite({ filter, search, limit }),
- // ...
-});
-```
-
----
-
-## 4. Store ↔ Query Integration
-
-### 4.1 State Sync Flow
-
-```
-┌─────────────────────────────────────────────────────────────────────────────────┐
-│ STORE ↔ QUERY SYNC FLOW │
-├─────────────────────────────────────────────────────────────────────────────────┤
-│ │
-│ User Action │
-│ (Filter Click) │
-│ │ │
-│ ▼ │
-│ ┌────────────────────────────────────────────────────────────────────────┐ │
-│ │ FilterTabs.tsx │ │
-│ │ │ │
-│ │ onClick={() => setFilter('blackpinkk.style')} │ │
-│ └────────────────────────────────────────────────────────────────────────┘ │
-│ │ │
-│ ▼ │
-│ ┌────────────────────────────────────────────────────────────────────────┐ │
-│ │ filterStore (Zustand) │ │
-│ │ │ │
-│ │ state.activeFilter = 'blackpinkk.style' │ │
-│ │ │ │
-│ │ → All subscribers notified │ │
-│ └────────────────────────────────────────────────────────────────────────┘ │
-│ │ │
-│ ▼ │
-│ ┌────────────────────────────────────────────────────────────────────────┐ │
-│ │ HomeClient.tsx (subscriber) │ │
-│ │ │ │
-│ │ const filter = useFilterStore(s => s.activeFilter); │ │
-│ │ // filter 값이 변경됨 → 컴포넌트 re-render │ │
-│ │ │ │
-│ │ const { data } = useInfiniteFilteredImages({ filter, search }); │ │
-│ │ // queryKey가 변경됨 │ │
-│ └────────────────────────────────────────────────────────────────────────┘ │
-│ │ │
-│ ▼ │
-│ ┌────────────────────────────────────────────────────────────────────────┐ │
-│ │ React Query │ │
-│ │ │ │
-│ │ queryKey: ["images", "infinite", { filter: "blackpinkk.style", ... }] │ │
-│ │ │ │
-│ │ Cache lookup: │ │
-│ │ • Cache miss → fetchUnifiedImages() 호출 │ │
-│ │ • Cache hit + fresh → 캐시 데이터 반환 │ │
-│ │ • Cache hit + stale → 캐시 반환 + background refetch │ │
-│ └────────────────────────────────────────────────────────────────────────┘ │
-│ │ │
-│ ▼ │
-│ ┌────────────────────────────────────────────────────────────────────────┐ │
-│ │ ThiingsGrid re-render │ │
-│ │ │ │
-│ │ 새로운 데이터로 그리드 업데이트 │ │
-│ └────────────────────────────────────────────────────────────────────────┘ │
-│ │
-└─────────────────────────────────────────────────────────────────────────────────┘
-```
-
-### 4.2 Component Usage Pattern
-
-```typescript
-// HomeClient.tsx
-
-function HomeClient({ initialData }: { initialData: ImagePage }) {
- // 1. Zustand stores에서 필터/검색 상태 구독
- const filter = useFilterStore((state) => state.activeFilter);
- const search = useSearchStore((state) => state.debouncedQuery);
-
- // 2. React Query로 데이터 페칭 (store 값이 queryKey에 포함)
- const {
- data,
- fetchNextPage,
- hasNextPage,
- isFetchingNextPage
- } = useInfiniteFilteredImages({
- filter,
- search,
- limit: 50,
- initialData,
- });
-
- // 3. 데이터 가공
- const images = useMemo(() =>
- data?.pages.flatMap(page => page.items) ?? [],
- [data]
- );
-
- // 4. 렌더링
- return (
-
- );
-}
-```
-
----
-
-## 5. State Persistence
-
-### 5.1 Current Persistence
-
-| Store | Persistence | Location |
-|-------|------------|----------|
-| filterStore | URL params | `?filter=xxx` |
-| searchStore | URL params | `?q=xxx` |
-| transitionStore | Memory only | - |
-| React Query | Memory (gcTime) | 5분 캐시 |
-
-### 5.2 Future Persistence (사용자 설정)
-
-```typescript
-// 로그인 사용자 설정 저장 예시
-const useUserPreferences = create(
- persist(
- (set) => ({
- theme: 'system',
- language: 'ko',
- setTheme: (theme) => set({ theme }),
- setLanguage: (language) => set({ language }),
- }),
- {
- name: 'user-preferences',
- storage: createJSONStorage(() => localStorage),
- }
- )
-);
-```
-
----
-
-## 6. DevTools
-
-### 6.1 React Query DevTools
-
-**File**: `app/providers.tsx`
-
-```typescript
-import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
-
-export function AppProviders({ children }: { children: React.ReactNode }) {
- return (
-
- {children}
-
-
- );
-}
-```
-
-### 6.2 Zustand DevTools
-
-```typescript
-import { devtools } from 'zustand/middleware';
-
-const useFilterStore = create(
- devtools(
- (set) => ({
- activeFilter: 'all',
- setFilter: (filter) => set({ activeFilter: filter }),
- }),
- { name: 'filterStore' }
- )
-);
-```
-
----
-
-## 7. Best Practices
-
-### 7.1 When to Use What
-
-| Use Case | Solution | Example |
-|----------|----------|---------|
-| UI 상태 (토글, 열림/닫힘) | Local useState | Modal open state |
-| 전역 클라이언트 상태 | Zustand | Filter, Search |
-| 서버 데이터 | React Query | Images, Items |
-| 애니메이션 상태 | Zustand | FLIP transition state |
-| 폼 상태 | Local useState + Zustand | Create post form |
-
-### 7.2 Performance Tips
-
-```typescript
-// 1. Zustand selector로 필요한 값만 구독
-// BAD: 전체 store 구독
-const store = useFilterStore();
-
-// GOOD: 필요한 값만 구독
-const filter = useFilterStore((s) => s.activeFilter);
-
-// 2. React Query select로 데이터 변환
-const { data } = useInfiniteFilteredImages({...}, {
- select: (data) => data.pages.flatMap(p => p.items),
-});
-
-// 3. 불필요한 refetch 방지
-{
- staleTime: 60 * 1000,
- refetchOnWindowFocus: false,
-}
-
-// 4. 낙관적 업데이트 (mutations)
-useMutation({
- mutationFn: voteItem,
- onMutate: async (newVote) => {
- await queryClient.cancelQueries(['item', newVote.itemId]);
- const previous = queryClient.getQueryData(['item', newVote.itemId]);
- queryClient.setQueryData(['item', newVote.itemId], (old) => ({
- ...old,
- votes: old.votes + 1,
- }));
- return { previous };
- },
- onError: (err, newVote, context) => {
- queryClient.setQueryData(['item', newVote.itemId], context.previous);
- },
-});
-```
-
----
-
-## Related Documents
-
-- [README.md](./README.md) - 시스템 아키텍처
-- [data-pipeline.md](./data-pipeline.md) - 데이터 파이프라인
-- [../../specs/feature-spec/workflows.md](../../specs/feature-spec/workflows.md) - 워크플로우
+> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
+>
+> 본문: [`Architecture/state-management.md`](https://github.com/decodedcorp/decoded-docs/blob/main/Architecture/state-management.md)
+>
+> Obsidian path: `Architecture/state-management`
+>
+> Sync policy: [Guides/sync-policy](https://github.com/decodedcorp/decoded-docs/blob/main/Guides/sync-policy.md)
From a11aca62146096a1771a61cbb86aefeabada86c1 Mon Sep 17 00:00:00 2001
From: thxforall <113906780+thxforall@users.noreply.github.com>
Date: Tue, 19 May 2026 11:52:29 +0900
Subject: [PATCH 2/4] =?UTF-8?q?docs:=20Step=202=20=E2=80=94=20=EB=AF=B8?=
=?UTF-8?q?=EB=B6=84=EB=A5=98=20=EB=AC=B8=EC=84=9C=20=EB=A7=A4=ED=95=91=20?=
=?UTF-8?q?(refs=20#518)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
decoded-docs vault 마이그레이션 Step 2 산출물. docs/ + .planning/codebase/
전체 파일을 transition-design.md §분류 원칙(5가지 판단 기준)에 따라
🟢 MONOREPO / 🔵 VAULT / ⚪ STUB / 🟡 ARCHIVE 로 분류.
핵심 결정:
- wiki/ 전체 MONOREPO 유지 — tools/wiki/lib/config.ts 의 INDEX_PATH +
INGEST_TOPICS 하드코딩, CLAUDE.md SSOT import 의존성 (spec과 충돌,
Step 5 PR에서 spec 정정 예정)
- .planning/codebase/ STUB 패턴 — CLAUDE.md L19/L25/L87-93 8건 직접
링크. Step 1 (ADR/architecture) 와 동일 패턴 적용
- qa-screenshots/ MONOREPO — visual-qa.spec.ts:41 테스트 출력 경로
집계: 🟢 65% / 🔵 28% / ⚪ 11% / 🟡 2%, 🔴 REVIEW 0건 (전부 확정).
다음: 팀 리뷰 → Step 3 (vault 복사 + stub 생성)
---
...2026-05-15-docs-migration-step2-mapping.md | 305 ++++++++++++++++++
1 file changed, 305 insertions(+)
create mode 100644 docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
diff --git a/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md b/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
new file mode 100644
index 00000000..f1975db8
--- /dev/null
+++ b/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
@@ -0,0 +1,305 @@
+# Docs 마이그레이션 Step 2 — 미분류 문서 매핑
+
+> **Status:** 팀 리뷰 대기 (Step 2 산출물)
+> **Refs:** #518 · [`2026-05-14-obsidian-vault-transition-design.md`](../specs/2026-05-14-obsidian-vault-transition-design.md) · Step 1 PR #542
+> **For agentic workers:** 이 문서는 분류 합의용 작업물. 본 매핑이 확정되면 Step 3(파일 복사+frontmatter), Step 4(병행 운영 1개월), Step 5(monorepo 원본 삭제 PR)로 진행한다.
+
+## 목적
+
+[transition-design.md §분류 원칙](../specs/2026-05-14-obsidian-vault-transition-design.md#분류-원칙)의 5가지 판단 기준을 `docs/` 및 `.planning/codebase/` 전체에 적용해 각 파일의 행선지를 확정한다. Step 1 (ADR + architecture) 은 이미 vault stub으로 전환됨.
+
+## 분류 기준 (재인용)
+
+| 판단 기준 | 모노레포 유지 | Vault 이동 |
+| --------------------------------- | ------------- | ---------- |
+| 특정 코드 파일/API를 참조 | O | X |
+| 코드 PR이 문서를 무효화할 수 있음 | O | X |
+| 이 리포 개발자만 읽음 | O | X |
+| 릴리스와 함께 버전닝 | O | X |
+| 여러 프로젝트에서 참조 | X | O |
+
+## 행선지 카테고리
+
+- **🟢 MONOREPO** — 코드 밀착, 이 리포에만 의미 있음
+- **🔵 VAULT** — 운영/팀/크로스프로젝트 지식 (decoded-docs로 이동)
+- **⚪ STUB** — 본문은 vault, monorepo는 redirect stub만 유지 (Step 1 패턴, ADR/architecture)
+- **🟡 ARCHIVE** — 시점 한정 스냅샷, vault `Logs/historical/` 또는 git history만 남기고 삭제
+
+---
+
+## Section A — `docs/` 루트 파일
+
+| 파일 | 행선지 | 사유 |
+| ------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------ |
+| `docs/README.md` | 🟢 MONOREPO | 모노레포 문서 인덱스. Step 5에서 vault 링크로 일부 항목 업데이트 |
+| `docs/GIT-WORKFLOW.md` | 🟢 MONOREPO | spec 명시 — 이 리포 전용 브랜치 정책 |
+| `docs/DATABASE-MIGRATIONS.md` | 🟢 MONOREPO | spec 명시 — 마이그레이션 SOT |
+| `docs/LOCAL-DEV.md` | 🟢 MONOREPO | 이 리포 dev 환경 셋업 |
+| `docs/BACKEND-ONBOARDING.md` | 🟢 MONOREPO | 이 리포 백엔드 온보딩 |
+| `docs/server-setup.md` | 🟢 MONOREPO | 이 리포 인프라 셋업 (Cloudflare/홈서버) |
+| `docs/nginx-cloudflare-setup.md` | 🟢 MONOREPO | 이 리포 nginx 설정 |
+| `docs/gstack-guide.md` | 🔵 VAULT `Guides/gstack-guide.md` | gstack 사용법은 크로스프로젝트 하네스 지식 |
+| `docs/backend-frontend-status.md` | 🟡 ARCHIVE | 시점 한정 상태 스냅샷. 최신 정보는 `.planning/codebase/`와 `docs/agent/` |
+| `docs/post-centric-refactoring-summary.md` | 🔵 VAULT `Project/refactoring/post-centric.md` | 완료된 리팩토링 회고 |
+| `docs/home-sections-backend-feasibility.md` | 🔵 VAULT `Project/feasibility/home-sections-backend.md` | 완료된 feasibility 분석 |
+
+## Section B — `docs/adr/` · `docs/architecture/` (Step 1 완료)
+
+| 파일 | 행선지 | 비고 |
+| ------------------------------------------ | ------- | --------------------- |
+| `docs/adr/ADR-0001-ai-dev-boilerplate.md` | ⚪ STUB | Step 1 완료 (PR #542) |
+| `docs/adr/ADR-0002-llm-wiki-foundation.md` | ⚪ STUB | Step 1 완료 |
+| `docs/architecture/README.md` | ⚪ STUB | Step 1 완료 |
+| `docs/architecture/assets-project.md` | ⚪ STUB | Step 1 완료 |
+| `docs/architecture/data-pipeline.md` | ⚪ STUB | Step 1 완료 |
+| `docs/architecture/state-management.md` | ⚪ STUB | Step 1 완료 |
+
+> ⚠️ spec(§모노레포 유지)은 adr/를 monorepo 유지로 표기했으나 Step 1 합의로 vault stub 전환. transition-design.md 본문은 Step 5 라우팅 PR 시 함께 정정.
+
+## Section C — `docs/agent/` (코드 인접 인벤토리)
+
+spec 명시: **전부 🟢 MONOREPO 유지.** (코드 변경 시 함께 갱신되는 라우팅/인벤토리)
+
+| 파일 | 행선지 |
+| ------------------------------------------------------------------- | ------------------------------- |
+| `docs/agent/README.md` | 🟢 MONOREPO |
+| `docs/agent/architecture-summary.md` | 🟢 MONOREPO |
+| `docs/agent/api-summary.md` · `api-v1-routes.md` | 🟢 MONOREPO |
+| `docs/agent/database-summary.md` | 🟢 MONOREPO |
+| `docs/agent/design-system-summary.md` · `design-system-llm.md` | 🟢 MONOREPO |
+| `docs/agent/ai-playbook-summary.md` | 🟢 MONOREPO |
+| `docs/agent/monorepo.md` · `environments.md` · `staging.md` | 🟢 MONOREPO |
+| `docs/agent/web-routes-and-features.md` · `web-hooks-and-stores.md` | 🟢 MONOREPO |
+| `docs/agent/e2e-testing.md` · `verify-flow-qa.md` | 🟢 MONOREPO |
+| `docs/agent/version-harness.md` | 🟢 MONOREPO |
+| `docs/agent/warehouse-schema.md` | 🟢 MONOREPO (DEPRECATED 표기됨) |
+| `docs/agent/wiki-entry.md` | 🟢 MONOREPO |
+
+## Section D — `docs/api/` (API 스펙)
+
+spec 미명시. 분류 적용: 코드 PR이 무효화할 수 있고 릴리스 버전닝 → 🟢 **MONOREPO 유지.**
+
+| 파일 | 행선지 |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
+| `docs/api/README.md` · `SPEC-CHANGE-PROCESS.md` · `schemas.md` | 🟢 MONOREPO |
+| `docs/api/admin.md` · `badges.md` · `categories.md` · `comments.md` · `earnings.md` · `posts.md` · `rankings.md` · `search.md` · `solutions.md` · `spots.md` · `users.md` · `votes.md` | 🟢 MONOREPO |
+
+## Section E — `docs/database/`
+
+spec 명시: 🟢 **MONOREPO 유지.**
+
+| 파일 | 행선지 |
+| --------------------------------------------------------------- | -------------------- |
+| `docs/database/01-schema-usage.md` ~ `04-supabase-cli-setup.md` | 🟢 MONOREPO |
+| `docs/database/operating-model.md` · `drift-check.md` | 🟢 MONOREPO |
+| `docs/database/open_api.json` | 🟢 MONOREPO (생성물) |
+
+## Section F — `docs/design-system/`
+
+분류 적용: 디자인 토큰/컴포넌트는 `packages/web/lib/design-system/` 코드와 1:1 → 🟢 **MONOREPO 유지.**
+
+| 파일 | 행선지 |
+| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- |
+| `docs/design-system/README.md` · `tokens.md` · `colors.md` · `typography.md` · `spacing.md` · `icons.md` · `patterns.md` | 🟢 MONOREPO |
+| `docs/design-system/components/README.md` · `cards.md` · `headers.md` · `inputs.md` · `typography.md` | 🟢 MONOREPO |
+| `docs/design-system/decoded-layout-specs.md` | 🟢 MONOREPO |
+| `docs/design-system/decoded.pen` · `untitled.pen` | 🟢 MONOREPO (Pencil 바이너리, 코드 인접) |
+
+## Section G — `docs/ai-playbook/`
+
+분류 적용: AI 도구 사용법은 크로스프로젝트 지식 → 🔵 **VAULT 이동.**
+
+| 파일 | 행선지 |
+| ------------------------------------------ | ------------------------------------------------------------------- |
+| `docs/ai-playbook/01-principles.md` | 🔵 VAULT `Architecture/ai-playbook/01-principles.md` |
+| `docs/ai-playbook/02-workflow-overview.md` | 🔵 VAULT `Architecture/ai-playbook/02-workflow-overview.md` |
+| `docs/ai-playbook/claude-profile.md` | 🔵 VAULT `Architecture/ai-playbook/claude-profile.md` |
+| `docs/ai-playbook/codex-profile.md` | 🔵 VAULT `Architecture/ai-playbook/codex-profile.md` |
+| `docs/ai-playbook/cursor-profile.md` | 🔵 VAULT `Architecture/ai-playbook/cursor-profile.md` |
+| `docs/ai-playbook/gemini-profile.md` | 🔵 VAULT `Architecture/ai-playbook/gemini-profile.md` |
+| `docs/ai-playbook/usage-log.md` | 🟡 ARCHIVE — 시점 한정 로그. vault `Logs/ai-usage/`로 옮기거나 폐기 |
+
+> 🟢 monorepo의 `docs/agent/ai-playbook-summary.md`는 라우팅 stub으로 유지.
+
+## Section H — `docs/wiki/` (확정: spec과 충돌 → 전부 MONOREPO)
+
+**조사 결과 (2026-05-19):**
+
+- `tools/wiki/lib/config.ts:10` — `INDEX_PATH = "docs/wiki/wiki/INDEX.md"` **하드코딩**
+- `tools/wiki/lib/config.ts:12` — `INGEST_TOPICS = ["harness", "ops", "tasks", "incidents"]` — wiki CLI가 `docs/wiki/wiki/${topic}/`에 새 노트 생성
+- `tools/wiki/ingest.ts:41` — `docs/wiki/wiki/${topicKey}/${slug}.md` 생성 경로
+- `CLAUDE.md:63` — `docs/wiki/schema/conventions.md` SSOT import
+- `docs/agent/wiki-entry.md` — wiki/ 진입 가이드, monorepo agent routing의 일부
+
+→ wiki/ 전체는 **wiki CLI + CLAUDE.md 코드 의존성**이 명확. spec의 "wiki/harness vault 이동"은 의존성 검토 누락. **전부 🟢 MONOREPO 유지.**
+
+| 파일 | 행선지 | 사유 |
+| --------------------------------------------------------------------------------------------------------------- | ----------- | --------------------------------------------- |
+| `docs/wiki/wiki/INDEX.md` | 🟢 MONOREPO | `tools/wiki/lib/config.ts:10` 하드코딩 |
+| `docs/wiki/wiki/harness/claude-code.md` | 🟢 MONOREPO | wiki CLI `INGEST_TOPICS=["harness",...]` 대상 |
+| `docs/wiki/wiki/harness/commit-protocol.md` | 🟢 MONOREPO | 동상 |
+| `docs/wiki/wiki/harness/review-flow.md` | 🟢 MONOREPO | 동상 |
+| `docs/wiki/wiki/harness/session-discipline.md` | 🟢 MONOREPO | 동상 |
+| `docs/wiki/schema/conventions.md` | 🟢 MONOREPO | `CLAUDE.md:63` SSOT import |
+| `docs/wiki/schema/README.md` · `frontmatter.md` · `harness.md` · `links.md` · `ownership-matrix.md` · `tags.md` | 🟢 MONOREPO | wiki schema SOT, agent routing 의존 |
+
+> **spec 정정 항목 (Step 5 PR에서 처리):** `transition-design.md §이동 대상 (1차)` 의 `docs/wiki/wiki/harness/*.md → Architecture/harness/` 행 제거 또는 "monorepo 유지 + vault mirror 검토"로 변경.
+>
+> **미러링 옵션은 별도 이슈로 분리.** vault 단방향 read-only mirror는 wiki CLI 리팩토링 또는 GitHub Actions sync 필요 — Step 2 범위 밖.
+
+## Section I — `docs/superpowers/`
+
+### plans/ (활성 + 완료)
+
+> ⚠️ **분류 근거 보강 필요:** 아래 "완료" 판정은 파일명 date heuristic. Step 3 진입 시 git log + 해당 이슈 close 상태로 재확정.
+
+| 파일 | 행선지 | 사유 (heuristic) |
+| --------------------------------------------------------- | --------------------------------- | --------------------------- |
+| `2026-04-04-editorial-ui-sizing-unification.md` | 🔵 VAULT `Project/plans/2026-04/` | 완료 (≥ 1개월 경과) |
+| `2026-04-04-explore-scroll-optimization.md` | 🔵 VAULT | 완료 |
+| `2026-04-04-supabase-rls-security-hardening.md` | 🔵 VAULT | 완료 |
+| `2026-04-05-explore-search-and-published-filter.md` | 🔵 VAULT | 완료 |
+| `2026-04-06-admin-seed-ops-migration.md` | 🔵 VAULT | 완료 |
+| `2026-04-09-auth-stabilization.md` | 🔵 VAULT | 완료 |
+| `2026-04-09-harness-memory-docs-update.md` | 🔵 VAULT | 완료 |
+| `2026-04-09-image-dimensions.md` | 🔵 VAULT | 완료 |
+| `2026-04-17-151-admin-real-data-plan.md` | 🔵 VAULT | 완료 |
+| `2026-04-17-229-image-proxy-robustness.md` | 🔵 VAULT | 완료 |
+| `2026-04-17-llm-wiki-foundation.md` | 🔵 VAULT | 완료 |
+| `2026-04-17-sub3-wiki-cli.md` | 🔵 VAULT | 완료 |
+| `2026-04-17-upload-modal-refactor.md` | 🔵 VAULT | 완료 |
+| `2026-04-23-170-e2e-hardening-infra-p0.md` | 🔵 VAULT | 완료 |
+| `2026-04-23-305-source-type-structured-fields-phase-a.md` | 🔵 VAULT | 완료 |
+| `2026-04-23-306-upload-ux-polish.md` | 🔵 VAULT | 완료 |
+| `2026-04-30-post-actions-modal-ux-plan.md` | 🔵 VAULT | 완료 |
+| `2026-05-14-obsidian-vault-infrastructure.md` | 🟢 MONOREPO (활성) | 진행 중. 완료 후 vault 이동 |
+| `2026-05-14-personal-vault-claude-volt.md` | 🟢 MONOREPO (활성) | 진행 중 |
+| `2026-05-14-tryon-ux-web-funnel.md` | 🟢 MONOREPO (활성) | 진행 중 |
+| `2026-05-15-docs-migration-step2-mapping.md` (this file) | 🟢 MONOREPO (활성) | 본 매핑 자체 |
+
+### plans/archive/
+
+| 파일 | 행선지 |
+| ------------------------------------------------------ | --------------------------------- |
+| `20260406-2026-04-06-admin-seed-ops-migration.md` | 🔵 VAULT `Project/plans/archive/` |
+| `20260514-2026-05-14-obsidian-vault-infrastructure.md` | 🔵 VAULT `Project/plans/archive/` |
+| `20260514-2026-05-14-personal-vault-claude-volt.md` | 🔵 VAULT `Project/plans/archive/` |
+
+### specs/
+
+전부 🔵 **VAULT `Project/specs/YYYY-MM/`** (완료된 design docs). 활성 spec은 마이그레이션 완료 후 이동.
+
+| 활성 (monorepo 유지) | 완료 (vault 이동) |
+| ----------------------------------------------------- | ---------------------------------- |
+| `2026-05-14-obsidian-vault-transition-design.md` | 나머지 25+ specs (2026-04-\* 이전) |
+| `2026-05-14-telegram-bot-vault-integration-design.md` | |
+| `2026-05-14-personal-vault-claude-volt-design.md` | |
+| `2026-05-14-tryon-ux-web-funnel-design.md` | |
+
+> Step 3 진입 시 완료된 specs 목록을 git log + 이슈 상태로 확정.
+
+### briefs/
+
+| 파일 | 행선지 |
+| -------------------------------------------- | -------------------------- |
+| `docs/superpowers/briefs/229-image-proxy.md` | 🔵 VAULT `Project/briefs/` |
+| `docs/superpowers/briefs/237-rust-audit.md` | 🔵 VAULT `Project/briefs/` |
+
+## Section J — `docs/prompts/`
+
+분류 적용: AI 프롬프트 템플릿은 크로스프로젝트 활용 → 🔵 **VAULT 이동.**
+
+| 파일 | 행선지 |
+| --------------------------------------- | ----------------------------------------------------- |
+| `docs/prompts/codex/spec-from-issue.md` | 🔵 VAULT `Templates/prompts/codex/spec-from-issue.md` |
+| `docs/prompts/gemini/feature-doc.md` | 🔵 VAULT `Templates/prompts/gemini/feature-doc.md` |
+
+## Section K — `docs/research/` · `docs/incidents/` · `docs/handoffs/`
+
+| 파일 | 행선지 |
+| ---------------------------------------------------------- | ----------------------------- |
+| `docs/research/2026-05-14-obsidian-transition-research.md` | 🔵 VAULT `Project/research/` |
+| `docs/incidents/2026-05-02-prod-postgrest-stuck.md` | 🔵 VAULT `Project/incidents/` |
+| `docs/handoffs/HANDOFF-sns-integration.md` | 🔵 VAULT `Project/handoffs/` |
+
+## Section L — `docs/testing/` · `docs/performance/`
+
+| 파일 | 행선지 | 사유 |
+| --------------------------- | ----------- | ------------------------------------------------ |
+| `docs/testing/scenarios.md` | 🟢 MONOREPO | 이 리포 e2e/qa 시나리오, 코드 변경 시 업데이트 |
+| `docs/performance/guide.md` | 🟢 MONOREPO | 이 리포 성능 가이드 (Web Vitals, Next.js 최적화) |
+
+## Section M — `docs/diagrams/` · `docs/pencil-screen/` · `docs/qa-screenshots/` (확정)
+
+**조사 결과 (2026-05-19):**
+
+- `docs/qa-screenshots/` — `packages/web/tests/visual-qa.spec.ts:41` 에서 **테스트 출력 경로로 직접 사용**. README도 `Output: docs/qa-screenshots/`로 명시.
+- `docs/pencil-screen/` — `docs/agent/design-system-summary.md`에서 텍스트 참조만. 코드 의존성은 없으나 디자인 시스템 작업 시 즉시 참조.
+- `docs/diagrams/` — 코드 구조/ERD/플로우. 코드 변경과 함께 갱신.
+
+| 디렉토리 | 행선지 | 사유 |
+| ------------------------------------ | ----------- | ------------------------------------------------------------------------ |
+| `docs/diagrams/*.excalidraw[.png]` | 🟢 MONOREPO | 코드 구조 다이어그램, 코드 변경 시 갱신 |
+| `docs/pencil-screen/*.pen` · `*.png` | 🟢 MONOREPO | 디자인 시스템 작업 인접. `docs/agent/design-system-summary.md` 참조 대상 |
+| `docs/qa-screenshots/*.png` | 🟢 MONOREPO | `packages/web/tests/visual-qa.spec.ts:41` 테스트 출력 경로 |
+
+## Section N — `.planning/codebase/` (확정: STUB 패턴)
+
+**조사 결과 (2026-05-19):**
+
+`CLAUDE.md` L19/L25/L87-L93 에서 `.planning/codebase/*.md` 전체를 **직접 링크 + Codebase documentation 테이블 SOT**. `docs/agent/api-v1-routes.md:179`에서도 `INTEGRATIONS.md` 직접 참조.
+
+→ spec은 "vault 이동"이지만, 단순 삭제 시 CLAUDE.md 깨짐. **Step 1 패턴(vault 본문 + monorepo stub) 적용.**
+
+| 파일 | 행선지 | 비고 |
+| ------------------------------------ | ------- | -------------------------------------------------------- |
+| `.planning/codebase/README.md` | ⚪ STUB | Step 3에서 vault 복사 + monorepo는 redirect stub |
+| `.planning/codebase/STACK.md` | ⚪ STUB | 동상. `CLAUDE.md:19` 직접 링크 |
+| `.planning/codebase/ARCHITECTURE.md` | ⚪ STUB | 동상. `CLAUDE.md:88` |
+| `.planning/codebase/STRUCTURE.md` | ⚪ STUB | 동상. `CLAUDE.md:89` |
+| `.planning/codebase/CONVENTIONS.md` | ⚪ STUB | 동상. `CLAUDE.md:90` |
+| `.planning/codebase/TESTING.md` | ⚪ STUB | 동상. `CLAUDE.md:91` |
+| `.planning/codebase/INTEGRATIONS.md` | ⚪ STUB | 동상. `CLAUDE.md:92` + `docs/agent/api-v1-routes.md:179` |
+| `.planning/codebase/CONCERNS.md` | ⚪ STUB | 동상. `CLAUDE.md:93` |
+
+> `.planning/` 디렉토리 전체는 GSD 아티팩트. `codebase/`만 vault로 옮기고 나머지(`milestones/`, `phases/` 등)는 monorepo 유지.
+
+---
+
+## 집계
+
+| 카테고리 | 파일 수 | 비율 |
+| ---------------------------- | ------- | ------ |
+| 🟢 MONOREPO | ~80 | 약 65% |
+| 🔵 VAULT | ~35 | 약 28% |
+| ⚪ STUB (Step 1 완료 + 신규) | 14 | 11% |
+| 🟡 ARCHIVE | ~2 | 2% |
+
+## 다음 단계 (확정 후 진행)
+
+1. **팀 리뷰** — 본 매핑 합의
+2. **Step 3 (vault 복사 + stub 생성)** —
+ - VAULT 분류 파일을 vault repo에 복사 + frontmatter 추가
+ - STUB 분류 파일(.planning/codebase/\*)은 vault 복사 + monorepo는 redirect stub 전환
+ - plans/specs 완료 여부는 git log + 이슈 상태로 재확정
+3. **Step 4 (병행 운영)** — monorepo 원본(VAULT 분류) + vault 양쪽 1개월 유지, drift 모니터링
+4. **Step 5 (monorepo 정리 + spec 정정)** —
+ - VAULT 분류 원본 삭제 PR
+ - `transition-design.md §이동 대상` 정정 (wiki/harness 행, adr/ 행)
+ - CLAUDE.md/docs/agent/ 경로 참조 업데이트
+
+## 검증 메모
+
+- 2026-05-19: 5/15 Step 1 이후 docs/ 변경 무 (wiki/tags.md 1건 외). 매핑 stale 없음.
+- wiki CLI 의존성 검증: `tools/wiki/lib/config.ts` SOT 확인 완료.
+- `.planning/codebase/` 의존성 검증: `CLAUDE.md` 직접 링크 8건 확인 완료.
+
+## 변경 로그
+
+- 2026-05-15: 초안 작성 (Step 2 산출물)
+- 2026-05-19: advisor 리뷰 반영
+ - Section H — wiki/ 전체 MONOREPO 확정 (wiki CLI 의존성 조사 결과)
+ - Section M — pencil-screen/qa-screenshots MONOREPO 확정
+ - Section N — `.planning/codebase/` STUB 패턴 (CLAUDE.md 의존성)
+ - Section I — plans/specs 완료 판정 재확정 메모 추가
+ - 집계 + 다음 단계 업데이트, REVIEW 카테고리 제거 (전부 확정)
From a67d7b131c13ad001335cee4a5e19d497056b981 Mon Sep 17 00:00:00 2001
From: thxforall <113906780+thxforall@users.noreply.github.com>
Date: Thu, 21 May 2026 12:09:08 +0900
Subject: [PATCH 3/4] =?UTF-8?q?docs:=20Step=202=20=EB=A7=A4=ED=95=91=20?=
=?UTF-8?q?=EC=9E=AC=EC=A0=90=EA=B2=80=20=E2=80=94=20Q3=20B=20+=20Q4=20E?=
=?UTF-8?q?=20=EB=B0=98=EC=98=81=20(refs=20#518)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
grill-docs 재점검 (2026-05-21, Q1~Q5) 결과 Step 2 매핑 정정:
- Section A: post-centric, home-sections-feasibility → 🟢 MONOREPO 정정
- Section I: plans/specs/briefs 전체 🟢 MONOREPO 잔류 (Q4 E, 5-criteria 4/5 monorepo)
- Section K: research/incidents/handoffs 전체 🟢 MONOREPO 잔류
- Section N: `.planning/codebase/*` STUB 패턴 폐기 → 🟢 MONOREPO 잔류 (Q3 B)
· 갱신 책임 모호 + outdated 스냅샷이 vault "팀 지식"으로 위장하는 비용 회피
· CLAUDE.md L19/L25/L87-L93 직접 링크 변경 없음
집계 재계산:
- 🟢 MONOREPO ~145 / ⚪ STUB 6 (Step 1) / 🔵 VAULT 9 / 🟡 ARCHIVE 2
- vault 이동 대상이 종전 ~35건 → 9건으로 축소
Step 3 scope:
- A (이 commit): Step 2 매핑 정정. monorepo 변경 0건.
- B (다음): vault `decoded-docs`에 9개 파일 복사 + frontmatter, 별도 PR.
`Archive/` 신설안(Q2 C)은 Q4 E 채택으로 자연 폐기.
---
...2026-05-15-docs-migration-step2-mapping.md | 220 +++++++++---------
1 file changed, 108 insertions(+), 112 deletions(-)
diff --git a/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md b/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
index f1975db8..b25ec8e1 100644
--- a/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
+++ b/docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md
@@ -29,19 +29,19 @@
## Section A — `docs/` 루트 파일
-| 파일 | 행선지 | 사유 |
-| ------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------ |
-| `docs/README.md` | 🟢 MONOREPO | 모노레포 문서 인덱스. Step 5에서 vault 링크로 일부 항목 업데이트 |
-| `docs/GIT-WORKFLOW.md` | 🟢 MONOREPO | spec 명시 — 이 리포 전용 브랜치 정책 |
-| `docs/DATABASE-MIGRATIONS.md` | 🟢 MONOREPO | spec 명시 — 마이그레이션 SOT |
-| `docs/LOCAL-DEV.md` | 🟢 MONOREPO | 이 리포 dev 환경 셋업 |
-| `docs/BACKEND-ONBOARDING.md` | 🟢 MONOREPO | 이 리포 백엔드 온보딩 |
-| `docs/server-setup.md` | 🟢 MONOREPO | 이 리포 인프라 셋업 (Cloudflare/홈서버) |
-| `docs/nginx-cloudflare-setup.md` | 🟢 MONOREPO | 이 리포 nginx 설정 |
-| `docs/gstack-guide.md` | 🔵 VAULT `Guides/gstack-guide.md` | gstack 사용법은 크로스프로젝트 하네스 지식 |
-| `docs/backend-frontend-status.md` | 🟡 ARCHIVE | 시점 한정 상태 스냅샷. 최신 정보는 `.planning/codebase/`와 `docs/agent/` |
-| `docs/post-centric-refactoring-summary.md` | 🔵 VAULT `Project/refactoring/post-centric.md` | 완료된 리팩토링 회고 |
-| `docs/home-sections-backend-feasibility.md` | 🔵 VAULT `Project/feasibility/home-sections-backend.md` | 완료된 feasibility 분석 |
+| 파일 | 행선지 | 사유 |
+| ------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------- |
+| `docs/README.md` | 🟢 MONOREPO | 모노레포 문서 인덱스. Step 5에서 vault 링크로 일부 항목 업데이트 |
+| `docs/GIT-WORKFLOW.md` | 🟢 MONOREPO | spec 명시 — 이 리포 전용 브랜치 정책 |
+| `docs/DATABASE-MIGRATIONS.md` | 🟢 MONOREPO | spec 명시 — 마이그레이션 SOT |
+| `docs/LOCAL-DEV.md` | 🟢 MONOREPO | 이 리포 dev 환경 셋업 |
+| `docs/BACKEND-ONBOARDING.md` | 🟢 MONOREPO | 이 리포 백엔드 온보딩 |
+| `docs/server-setup.md` | 🟢 MONOREPO | 이 리포 인프라 셋업 (Cloudflare/홈서버) |
+| `docs/nginx-cloudflare-setup.md` | 🟢 MONOREPO | 이 리포 nginx 설정 |
+| `docs/gstack-guide.md` | 🔵 VAULT `Guides/gstack-guide.md` | gstack 사용법은 크로스프로젝트 하네스 지식 |
+| `docs/backend-frontend-status.md` | 🟡 ARCHIVE | 시점 한정 상태 스냅샷. 최신 정보는 `.planning/codebase/`와 `docs/agent/` |
+| `docs/post-centric-refactoring-summary.md` | 🟢 MONOREPO | grill-docs 재점검 (Q4 E): 이 리포 한정 리팩토링 회고, 5-criteria 4/5 monorepo |
+| `docs/home-sections-backend-feasibility.md` | 🟢 MONOREPO | grill-docs 재점검 (Q4 E): 이 리포 한정 feasibility, 5-criteria 4/5 monorepo |
## Section B — `docs/adr/` · `docs/architecture/` (Step 1 완료)
@@ -147,63 +147,28 @@ spec 명시: 🟢 **MONOREPO 유지.**
>
> **미러링 옵션은 별도 이슈로 분리.** vault 단방향 read-only mirror는 wiki CLI 리팩토링 또는 GitHub Actions sync 필요 — Step 2 범위 밖.
-## Section I — `docs/superpowers/`
-
-### plans/ (활성 + 완료)
-
-> ⚠️ **분류 근거 보강 필요:** 아래 "완료" 판정은 파일명 date heuristic. Step 3 진입 시 git log + 해당 이슈 close 상태로 재확정.
-
-| 파일 | 행선지 | 사유 (heuristic) |
-| --------------------------------------------------------- | --------------------------------- | --------------------------- |
-| `2026-04-04-editorial-ui-sizing-unification.md` | 🔵 VAULT `Project/plans/2026-04/` | 완료 (≥ 1개월 경과) |
-| `2026-04-04-explore-scroll-optimization.md` | 🔵 VAULT | 완료 |
-| `2026-04-04-supabase-rls-security-hardening.md` | 🔵 VAULT | 완료 |
-| `2026-04-05-explore-search-and-published-filter.md` | 🔵 VAULT | 완료 |
-| `2026-04-06-admin-seed-ops-migration.md` | 🔵 VAULT | 완료 |
-| `2026-04-09-auth-stabilization.md` | 🔵 VAULT | 완료 |
-| `2026-04-09-harness-memory-docs-update.md` | 🔵 VAULT | 완료 |
-| `2026-04-09-image-dimensions.md` | 🔵 VAULT | 완료 |
-| `2026-04-17-151-admin-real-data-plan.md` | 🔵 VAULT | 완료 |
-| `2026-04-17-229-image-proxy-robustness.md` | 🔵 VAULT | 완료 |
-| `2026-04-17-llm-wiki-foundation.md` | 🔵 VAULT | 완료 |
-| `2026-04-17-sub3-wiki-cli.md` | 🔵 VAULT | 완료 |
-| `2026-04-17-upload-modal-refactor.md` | 🔵 VAULT | 완료 |
-| `2026-04-23-170-e2e-hardening-infra-p0.md` | 🔵 VAULT | 완료 |
-| `2026-04-23-305-source-type-structured-fields-phase-a.md` | 🔵 VAULT | 완료 |
-| `2026-04-23-306-upload-ux-polish.md` | 🔵 VAULT | 완료 |
-| `2026-04-30-post-actions-modal-ux-plan.md` | 🔵 VAULT | 완료 |
-| `2026-05-14-obsidian-vault-infrastructure.md` | 🟢 MONOREPO (활성) | 진행 중. 완료 후 vault 이동 |
-| `2026-05-14-personal-vault-claude-volt.md` | 🟢 MONOREPO (활성) | 진행 중 |
-| `2026-05-14-tryon-ux-web-funnel.md` | 🟢 MONOREPO (활성) | 진행 중 |
-| `2026-05-15-docs-migration-step2-mapping.md` (this file) | 🟢 MONOREPO (활성) | 본 매핑 자체 |
-
-### plans/archive/
-
-| 파일 | 행선지 |
-| ------------------------------------------------------ | --------------------------------- |
-| `20260406-2026-04-06-admin-seed-ops-migration.md` | 🔵 VAULT `Project/plans/archive/` |
-| `20260514-2026-05-14-obsidian-vault-infrastructure.md` | 🔵 VAULT `Project/plans/archive/` |
-| `20260514-2026-05-14-personal-vault-claude-volt.md` | 🔵 VAULT `Project/plans/archive/` |
-
-### specs/
-
-전부 🔵 **VAULT `Project/specs/YYYY-MM/`** (완료된 design docs). 활성 spec은 마이그레이션 완료 후 이동.
-
-| 활성 (monorepo 유지) | 완료 (vault 이동) |
-| ----------------------------------------------------- | ---------------------------------- |
-| `2026-05-14-obsidian-vault-transition-design.md` | 나머지 25+ specs (2026-04-\* 이전) |
-| `2026-05-14-telegram-bot-vault-integration-design.md` | |
-| `2026-05-14-personal-vault-claude-volt-design.md` | |
-| `2026-05-14-tryon-ux-web-funnel-design.md` | |
-
-> Step 3 진입 시 완료된 specs 목록을 git log + 이슈 상태로 확정.
-
-### briefs/
-
-| 파일 | 행선지 |
-| -------------------------------------------- | -------------------------- |
-| `docs/superpowers/briefs/229-image-proxy.md` | 🔵 VAULT `Project/briefs/` |
-| `docs/superpowers/briefs/237-rust-audit.md` | 🔵 VAULT `Project/briefs/` |
+## Section I — `docs/superpowers/` (확정: 🟢 전부 MONOREPO 잔류)
+
+> **grill-docs 재점검 결과 (2026-05-21, Q4 E):** plans/specs/briefs 전체를 🟢 MONOREPO 잔류로 정정. 종전 안은 완료된 plans/specs를 `Project/plans/`, `Project/specs/`로 이동하려 했으나, 5-criteria 적용 시 4/5 monorepo 신호:
+>
+> - 특정 코드 PR 참조 O (대부분 본문에 PR #/issue # 명시)
+> - 코드 PR이 plan을 무효화 X (이미 완료 plan은 동결)
+> - 이 리포 개발자만 읽음 O
+> - 릴리스와 함께 버전닝 △ (한 번만 쓰임)
+> - 여러 프로젝트에서 참조 X
+>
+> * 이미 monorepo에 `docs/superpowers/plans/archive/` 가 운영 중 → vault 분산 시 link 무결성 손실(monorepo PR/이슈 자동 링크 끊김), 검색 분산.
+
+### plans/ · plans/archive/ · specs/ · briefs/
+
+| 카테고리 | 행선지 |
+| --------------------------------- | ---------------------------------------------------------------------------------------- |
+| `docs/superpowers/plans/` | 🟢 MONOREPO. 완료된 것은 `docs/superpowers/plans/archive/` 로 이동 (이미 운영 중인 패턴) |
+| `docs/superpowers/plans/archive/` | 🟢 MONOREPO |
+| `docs/superpowers/specs/` | 🟢 MONOREPO |
+| `docs/superpowers/briefs/` | 🟢 MONOREPO |
+
+> 활성/완료 판정 별도 작업은 Step 3 범위 밖. monorepo 안에서 `archive/` 이동만 자체 워크플로우로 진행.
## Section J — `docs/prompts/`
@@ -214,13 +179,15 @@ spec 명시: 🟢 **MONOREPO 유지.**
| `docs/prompts/codex/spec-from-issue.md` | 🔵 VAULT `Templates/prompts/codex/spec-from-issue.md` |
| `docs/prompts/gemini/feature-doc.md` | 🔵 VAULT `Templates/prompts/gemini/feature-doc.md` |
-## Section K — `docs/research/` · `docs/incidents/` · `docs/handoffs/`
+## Section K — `docs/research/` · `docs/incidents/` · `docs/handoffs/` (확정: 🟢 전부 MONOREPO)
+
+> **grill-docs 재점검 결과 (2026-05-21, Q4 E):** Section I와 동일 논거. research/incidents/handoffs 모두 monorepo 한정 자료 + PR/이슈 inline 링크 보존을 위해 monorepo 잔류.
-| 파일 | 행선지 |
-| ---------------------------------------------------------- | ----------------------------- |
-| `docs/research/2026-05-14-obsidian-transition-research.md` | 🔵 VAULT `Project/research/` |
-| `docs/incidents/2026-05-02-prod-postgrest-stuck.md` | 🔵 VAULT `Project/incidents/` |
-| `docs/handoffs/HANDOFF-sns-integration.md` | 🔵 VAULT `Project/handoffs/` |
+| 파일 | 행선지 |
+| ---------------------------------------------------------- | ----------- |
+| `docs/research/2026-05-14-obsidian-transition-research.md` | 🟢 MONOREPO |
+| `docs/incidents/2026-05-02-prod-postgrest-stuck.md` | 🟢 MONOREPO |
+| `docs/handoffs/HANDOFF-sns-integration.md` | 🟢 MONOREPO |
## Section L — `docs/testing/` · `docs/performance/`
@@ -243,56 +210,79 @@ spec 명시: 🟢 **MONOREPO 유지.**
| `docs/pencil-screen/*.pen` · `*.png` | 🟢 MONOREPO | 디자인 시스템 작업 인접. `docs/agent/design-system-summary.md` 참조 대상 |
| `docs/qa-screenshots/*.png` | 🟢 MONOREPO | `packages/web/tests/visual-qa.spec.ts:41` 테스트 출력 경로 |
-## Section N — `.planning/codebase/` (확정: STUB 패턴)
+## Section N — `.planning/codebase/` (확정: 🟢 전부 MONOREPO)
-**조사 결과 (2026-05-19):**
+> **grill-docs 재점검 결과 (2026-05-21, Q3 B):** 종전 안은 STUB 패턴(vault 본문 + monorepo redirect stub)이었으나 폐기. 5-criteria 5/5 monorepo 신호:
+>
+> | 기준 | `.planning/codebase/*` |
+> | ----------------------- | ---------------------------- |
+> | 특정 코드 파일/API 참조 | O (전체가 코드 참조) |
+> | 코드 PR이 문서를 무효화 | O (의존성·디렉토리 변경마다) |
+> | 이 리포 개발자만 읽음 | O |
+> | 릴리스와 함께 버전닝 | O |
+> | 여러 프로젝트에서 참조 | X |
+>
+> - STUB 패턴은 갱신 책임 모호(어디서 고치나?) + outdated 스냅샷이 vault "팀 지식"으로 위장하는 신뢰성 비용.
+> - ADR과 비대칭은 자연스러움 — ADR = 결정 근거(cross-project) / codebase = 현재 상태(this-repo only).
+
+| 파일 | 행선지 |
+| ------------------------------------ | ----------- |
+| `.planning/codebase/README.md` | 🟢 MONOREPO |
+| `.planning/codebase/STACK.md` | 🟢 MONOREPO |
+| `.planning/codebase/ARCHITECTURE.md` | 🟢 MONOREPO |
+| `.planning/codebase/STRUCTURE.md` | 🟢 MONOREPO |
+| `.planning/codebase/CONVENTIONS.md` | 🟢 MONOREPO |
+| `.planning/codebase/TESTING.md` | 🟢 MONOREPO |
+| `.planning/codebase/INTEGRATIONS.md` | 🟢 MONOREPO |
+| `.planning/codebase/CONCERNS.md` | 🟢 MONOREPO |
+
+> 결과적으로 `CLAUDE.md` L19/L25/L87-L93 + `docs/agent/api-v1-routes.md:179` 의 직접 링크는 **변경 없음**. Step 3에서 monorepo 변경 0건.
-`CLAUDE.md` L19/L25/L87-L93 에서 `.planning/codebase/*.md` 전체를 **직접 링크 + Codebase documentation 테이블 SOT**. `docs/agent/api-v1-routes.md:179`에서도 `INTEGRATIONS.md` 직접 참조.
+---
-→ spec은 "vault 이동"이지만, 단순 삭제 시 CLAUDE.md 깨짐. **Step 1 패턴(vault 본문 + monorepo stub) 적용.**
+## 집계 (grill-docs 재점검 후, 2026-05-21)
-| 파일 | 행선지 | 비고 |
-| ------------------------------------ | ------- | -------------------------------------------------------- |
-| `.planning/codebase/README.md` | ⚪ STUB | Step 3에서 vault 복사 + monorepo는 redirect stub |
-| `.planning/codebase/STACK.md` | ⚪ STUB | 동상. `CLAUDE.md:19` 직접 링크 |
-| `.planning/codebase/ARCHITECTURE.md` | ⚪ STUB | 동상. `CLAUDE.md:88` |
-| `.planning/codebase/STRUCTURE.md` | ⚪ STUB | 동상. `CLAUDE.md:89` |
-| `.planning/codebase/CONVENTIONS.md` | ⚪ STUB | 동상. `CLAUDE.md:90` |
-| `.planning/codebase/TESTING.md` | ⚪ STUB | 동상. `CLAUDE.md:91` |
-| `.planning/codebase/INTEGRATIONS.md` | ⚪ STUB | 동상. `CLAUDE.md:92` + `docs/agent/api-v1-routes.md:179` |
-| `.planning/codebase/CONCERNS.md` | ⚪ STUB | 동상. `CLAUDE.md:93` |
+| 카테고리 | 파일 수 | 비고 |
+| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- |
+| 🟢 MONOREPO | ~145 | docs/agent/api/database/design-system/wiki + plans/specs/briefs/research/incidents/handoffs + `.planning/codebase/*` |
+| ⚪ STUB (Step 1 완료) | 6 | `docs/adr/*` + `docs/architecture/*` (이미 vault stub) |
+| 🔵 VAULT (Step 3 대상) | 9 | ai-playbook 6 + prompts 2 + gstack-guide 1 |
+| 🟡 ARCHIVE (삭제 예정) | 2 | `ai-playbook/usage-log.md`, `backend-frontend-status.md` |
-> `.planning/` 디렉토리 전체는 GSD 아티팩트. `codebase/`만 vault로 옮기고 나머지(`milestones/`, `phases/` 등)는 monorepo 유지.
+> grill-docs 재점검 전 종전 집계는 🔵 VAULT ~35건이었으나, plans/specs/briefs/research/incidents/handoffs를 monorepo 잔류로 정정(Q4 E) + `.planning/codebase/*` STUB 패턴 폐기(Q3 B)로 vault 이동 대상이 9건으로 축소됨.
----
+## 다음 단계 (Step 3 — grill-docs 재점검 반영)
+
+### Step 3 작업 분할
+
+| PR/Commit | scope |
+| ------------- | ---------------------------------------------------------------------------------------------------------------- |
+| A (이 commit) | Step 2 매핑 정정 (본 파일). monorepo 변경 0건. PR #542에 추가 commit |
+| B (vault PR) | vault repo `decoded-docs`에 🔵 VAULT 9개 복사 + frontmatter. 별도 브랜치 + PR (활성 워크스페이스 충돌 회피) |
-## 집계
+### Step 4 (병행 운영, 1개월)
-| 카테고리 | 파일 수 | 비율 |
-| ---------------------------- | ------- | ------ |
-| 🟢 MONOREPO | ~80 | 약 65% |
-| 🔵 VAULT | ~35 | 약 28% |
-| ⚪ STUB (Step 1 완료 + 신규) | 14 | 11% |
-| 🟡 ARCHIVE | ~2 | 2% |
+- 🔵 VAULT 분류 9개 monorepo 원본 + vault 양쪽 유지 → drift 모니터링.
+- 🟢 MONOREPO/⚪ STUB는 변경 없음.
-## 다음 단계 (확정 후 진행)
+### Step 5 (monorepo 정리)
-1. **팀 리뷰** — 본 매핑 합의
-2. **Step 3 (vault 복사 + stub 생성)** —
- - VAULT 분류 파일을 vault repo에 복사 + frontmatter 추가
- - STUB 분류 파일(.planning/codebase/\*)은 vault 복사 + monorepo는 redirect stub 전환
- - plans/specs 완료 여부는 git log + 이슈 상태로 재확정
-3. **Step 4 (병행 운영)** — monorepo 원본(VAULT 분류) + vault 양쪽 1개월 유지, drift 모니터링
-4. **Step 5 (monorepo 정리 + spec 정정)** —
- - VAULT 분류 원본 삭제 PR
- - `transition-design.md §이동 대상` 정정 (wiki/harness 행, adr/ 행)
- - CLAUDE.md/docs/agent/ 경로 참조 업데이트
+- 🔵 VAULT 9개 monorepo 원본 삭제 PR.
+- 🟡 ARCHIVE 2개 (`usage-log.md`, `backend-frontend-status.md`) 삭제.
+- `transition-design.md` 본문 정정:
+ - §이동 대상 (1차) 표에서 `wiki/harness`, `.planning/codebase/`, `adr/` 행 정정
+ - §실행 절차 STUB 패턴 언급 정정 (Step 1만 STUB, 나머지 미적용)
+- CLAUDE.md/`docs/agent/` 경로 변경 없음 (🟢/⚪ 모두 경로 그대로).
## 검증 메모
- 2026-05-19: 5/15 Step 1 이후 docs/ 변경 무 (wiki/tags.md 1건 외). 매핑 stale 없음.
-- wiki CLI 의존성 검증: `tools/wiki/lib/config.ts` SOT 확인 완료.
-- `.planning/codebase/` 의존성 검증: `CLAUDE.md` 직접 링크 8건 확인 완료.
+- 2026-05-19: wiki CLI 의존성 검증: `tools/wiki/lib/config.ts` SOT 확인 완료.
+- 2026-05-19: `.planning/codebase/` 의존성 검증: `CLAUDE.md` 직접 링크 8건 확인 완료.
+- 2026-05-21 grill-docs 재점검:
+ - vault repo (`decoded-docs`) 실측 — Sources/, Expenses/, daily standups, sprint S1 등 활성 워크스페이스로 진화 확인. spec 원안 가정(빈 마이그레이션 타겟)과 어긋남.
+ - 5-criteria 재적용 → `.planning/codebase/*` 5/5 monorepo, plans/specs 4/5 monorepo → vault 이동 대상에서 제외.
+ - 인접 spec(`personal-vault-claude-volt`, `telegram-bot-vault-integration`)은 본 마이그레이션과 독립 작업으로 분리 확인.
## 변경 로그
@@ -303,3 +293,9 @@ spec 명시: 🟢 **MONOREPO 유지.**
- Section N — `.planning/codebase/` STUB 패턴 (CLAUDE.md 의존성)
- Section I — plans/specs 완료 판정 재확정 메모 추가
- 집계 + 다음 단계 업데이트, REVIEW 카테고리 제거 (전부 확정)
+- 2026-05-21: grill-docs 재점검 반영 (Q1~Q5)
+ - Q1: vault 활성 워크스페이스 인식 — Step 3 scope 재설계
+ - Q3: Section N `.planning/codebase/*` STUB 패턴 폐기 → 🟢 MONOREPO 잔류
+ - Q4: Section I/K plans/specs/briefs/research/incidents/handoffs 전체 🟢 MONOREPO 잔류 (5-criteria 4/5 monorepo)
+ - Section A: post-centric, home-sections-feasibility → MONOREPO 정정
+ - Q5: Step 3 scope 9개 vault 복사로 축소, monorepo 변경 0건. `Archive/` 신설안 자연 폐기
From c25f33da7cede290dbb55e430d202c93102a18e5 Mon Sep 17 00:00:00 2001
From: thxforall <113906780+thxforall@users.noreply.github.com>
Date: Thu, 21 May 2026 12:33:34 +0900
Subject: [PATCH 4/4] =?UTF-8?q?fix(docs):=20vault=20stub=20frontmatter=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80=20=E2=80=94=20wiki-lint=20=ED=86=B5=EA=B3=BC?=
=?UTF-8?q?=20(refs=20#518)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Step 1 (PR #542 first commit `64a5a76`) 에서 ADR + architecture 본문을 vault
redirect stub으로 전환할 때 frontmatter도 함께 제거되어 wiki-lint MISSING_FRONTMATTER
실패. 6개 stub에 minimal frontmatter 추가:
- docs/adr/ADR-0001-ai-dev-boilerplate.md
- docs/adr/ADR-0002-llm-wiki-foundation.md
- docs/architecture/README.md
- docs/architecture/assets-project.md
- docs/architecture/data-pipeline.md
- docs/architecture/state-management.md
각 stub: owner=llm, status=deprecated (Step 5에서 삭제 예정),
tags 에 [obsidian, deprecated] 포함하여 wiki-lint 허용 어휘 준수.
ADR 의 title 콜론은 YAML parse 위해 큰따옴표 인용.
---
docs/adr/ADR-0001-ai-dev-boilerplate.md | 8 ++++++++
docs/adr/ADR-0002-llm-wiki-foundation.md | 8 ++++++++
docs/architecture/README.md | 8 ++++++++
docs/architecture/assets-project.md | 8 ++++++++
docs/architecture/data-pipeline.md | 8 ++++++++
docs/architecture/state-management.md | 8 ++++++++
6 files changed, 48 insertions(+)
diff --git a/docs/adr/ADR-0001-ai-dev-boilerplate.md b/docs/adr/ADR-0001-ai-dev-boilerplate.md
index 3d7f831d..9e52be4c 100644
--- a/docs/adr/ADR-0001-ai-dev-boilerplate.md
+++ b/docs/adr/ADR-0001-ai-dev-boilerplate.md
@@ -1,3 +1,11 @@
+---
+title: "ADR-0001: Multi-AI Development Boilerplate"
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, harness, obsidian, deprecated]
+---
+
# ADR-0001: Multi-AI Development Boilerplate
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
diff --git a/docs/adr/ADR-0002-llm-wiki-foundation.md b/docs/adr/ADR-0002-llm-wiki-foundation.md
index dbc43e8d..440fcb3a 100644
--- a/docs/adr/ADR-0002-llm-wiki-foundation.md
+++ b/docs/adr/ADR-0002-llm-wiki-foundation.md
@@ -1,3 +1,11 @@
+---
+title: "ADR-0002: LLM Wiki Foundation"
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, harness, obsidian, deprecated]
+---
+
# ADR-0002: LLM Wiki Foundation
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
diff --git a/docs/architecture/README.md b/docs/architecture/README.md
index 7feed864..aa1f8b31 100644
--- a/docs/architecture/README.md
+++ b/docs/architecture/README.md
@@ -1,3 +1,11 @@
+---
+title: System Architecture
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, obsidian, deprecated]
+---
+
# System Architecture
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
diff --git a/docs/architecture/assets-project.md b/docs/architecture/assets-project.md
index 5481d5d0..6999f903 100644
--- a/docs/architecture/assets-project.md
+++ b/docs/architecture/assets-project.md
@@ -1,3 +1,11 @@
+---
+title: Assets Supabase Project
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, db, obsidian, deprecated]
+---
+
# Assets Supabase Project
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
diff --git a/docs/architecture/data-pipeline.md b/docs/architecture/data-pipeline.md
index 91cfce2a..e759900f 100644
--- a/docs/architecture/data-pipeline.md
+++ b/docs/architecture/data-pipeline.md
@@ -1,3 +1,11 @@
+---
+title: Data Pipeline
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, db, obsidian, deprecated]
+---
+
# Data Pipeline
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**
diff --git a/docs/architecture/state-management.md b/docs/architecture/state-management.md
index 84232fb0..760c837d 100644
--- a/docs/architecture/state-management.md
+++ b/docs/architecture/state-management.md
@@ -1,3 +1,11 @@
+---
+title: State Management
+owner: llm
+status: deprecated
+updated: 2026-05-21
+tags: [architecture, ui, obsidian, deprecated]
+---
+
# State Management
> **이 문서는 [decoded-docs vault](https://github.com/decodedcorp/decoded-docs)로 이전되었습니다.**