crumbs-spec 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -44,34 +44,35 @@ LLM Wiki에서는 원본/위키/스키마 분리, 인덱스 우선, 추가 전
44
44
  - **결정은 한 곳에.** 질문이 답을 얻으면 로그에 `decision` 항목을 남기고 문서는 날짜 링크 하나로 그 결정을 가리켜요.
45
45
  - **두 언어.** `crumbs.json`의 `lang`이 저장소 전체의 템플릿, 스킬, 메시지, AGENTS 블록 언어를 정해요. 기본값은 영어(`en`)이고 `ko`를 쓰면 한국어가 돼요.
46
46
 
47
- ## 실제로 써 보니 (한 번 실행, 자체 보고)
47
+ ## 처음 보는 코드에서도 맞게 쓸까요? (RealWorld 실험)
48
48
 
49
- 이 결과는 벤치마크가 아니라 일화로 읽어 주세요. 질문 18개로 한 번 돌린 결과이고 작성자가 채점했어요. 질문은 기존 스펙 체계에서 가져왔고, 두 대상의 규모도 달라요(문서 38개 대 약 127개). 원본 데이터는 비공개 저장소에서 나와 공개할 수 없어요. 로드맵의 예제 앱과 벤치마크 러너가 이 결과를 대신하기 위한 것이에요.
49
+ [RealWorld](https://github.com/realworld-apps/realworld) "Conduit" API를 구현한 공개 백엔드 두 개에 writer 스킬을 돌리고, 그 프로젝트의 공식 API 테스트로 문서를 채점했어요. 생성된 문서, 프롬프트, 정답지, 채점 행은 모두 [crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit)에 공개했어요.
50
50
 
51
- 실제 앱 저장소 세 영역(코드 약 4만 줄)을 기존 스펙 문서를 전혀 보여 주지 않고 crumbs-writer 스킬로 다시 썼어요. 그다음 기존 스펙 체계와 crumbs 체계에 같은 질문 18개를 던져 에이전트가 문서만 읽고 답하게 했어요.
51
+ - **준비.** 같은 API를 구현한 두 저장소를 커밋으로 고정했어요. [Nitro + Prisma](https://github.com/realworld-apps/nitro-prisma-zod-realworld-example-app)(TypeScript)와 [Django Ninja](https://github.com/c4ffein/realworld-django-ninja)(Python)예요. 구현체마다 Opus 5.5 에이전트 하나가 코드와 테스트만 보고 문서를 썼어요. 쓰는 동안 실험 저장소에는 공식 스펙 저장소가 없었고, 나중 커밋에서 추가했어요.
52
+ - **정답지.** 두 구현체가 고정해 둔 버전의 공식 Hurl 테스트에서 요청 하나를 한 행으로 삼았어요. 준비·정리 요청을 빼면 130행이에요.
53
+ - **채점.** 다른 모델(Sonnet 5.5)이 모든 행을 채점했어요. `correct`는 상태 코드와 검증하는 값을 문서가 모두 적은 경우, `partial`은 하나라도 빠진 경우, `wrong`은 문서가 반대로 적은 경우, `missing`은 다룬 문서가 없는 경우예요. 정책마다 코드와도 대조했어요.
52
54
 
53
- **제로 베이스에서 쓰는 데 든 비용** (에이전트 1개가 도메인 하나를 맡음, 병렬 3개)
54
-
55
- | 도메인 | 코드 범위 | 만든 문서 | 정책 (확정 / 미해결 질문) | 에이전트 토큰 | 작성 시간 |
56
- |---|---|---|---|---|---|
57
- | 결제 | 약 2만 줄 | 19개 | 100 (5 / 95) | 57만 | 1시간 7분 |
58
- | 뷰어 | 약 2만 3천 줄 | 40개 | 194 (29 / 165) | 85만 | 1시간 7분 |
59
- | 인증 | 약 1만 줄 | 35개 | 195 (64 / 131) | 79만 | 1시간 13분 |
60
-
61
- 작성 시간은 에이전트 전사의 타임스탬프에서 10분 넘게 비어 있던 대기 시간을 뺀 실제 작업 시간이에요. 세 도메인을 병렬로 돌려 1시간 15분쯤에 모두 끝났어요. 작성자가 결과를 직접 검토했을 때 지어낸 정책은 없었고, 기존 스펙과 코드가 달랐던 6곳은 코드대로 적었어요. 이 검토는 작성자가 했고 독립적으로 하지 않았어요. 그 뒤 사용자 흐름 단위로 다시 묶어 38개 문서가 됐어요.
55
+ | | Nitro + Prisma | Django Ninja |
56
+ |---|---|---|
57
+ | 저장소의 코드 / 테스트 | 약 1,400줄 / 단위 테스트 파일 2개 | 약 2,300줄 / 앱마다 엔드포인트 테스트 |
58
+ | 문서 / 정책 | 28 / 51 | 26 / 91 |
59
+ | 테스트로 확정된 정책 / 질문으로 남긴 정책 | 6 / 45 | 50 / 41 |
60
+ | 공식 테스트 행 정답 | **125 / 130** | **116 / 130** |
61
+ | 부분 / 오답 / 누락 | 5 / 0 / 0 | 14 / 0 / 0 |
62
+ | 지어낸 정책(코드에 없는 것) | 0 | 0 |
63
+ | 일부를 과장한 정책 | 1 | 6 |
64
+ | writer 토큰 / 걸린 시간 | 16.5만 / 2시간 40분 | 20.2만 / 2시간 47분 |
62
65
 
63
- **같은 질문 18개로 비교한 탐색 비용** (에이전트는 문서만 읽고 코드는 금지)
66
+ - **공식 테스트와 어긋난 문장도, 지어낸 정책도 없었어요.** 놓친 것은 모두 세부가 빠진 경우예요. Nitro의 부분 정답 5개는 문서가 다루지 않은 `null` 입력과 태그 순서예요. Django의 14개 중 12개는 질문 하나에서 나왔어요. 앱의 오류 처리기와 테스트가 401 응답 본문을 다르게 보여서 writer가 둘 다 적고 질문으로 남겼어요.
67
+ - **질문이 붙은 서술도 대부분 맞았어요.** 아직 `[needs confirmation]`이 붙은 서술만으로 정답 판정을 받은 행이 Nitro 12개, Django 32개예요. "지금은 이렇게 동작해요"에 질문을 붙이는 방식이 테스트가 증명하는 범위를 넘지 않으면서도 문서를 쓸모 있게 했어요.
68
+ - **테스트가 적으면 질문이 많아져요.** Nitro는 단위 테스트 파일이 2개뿐이라 정책 51개 중 45개가 질문으로 남았어요. 그중 29개는 공식 테스트가 답해 주는데, 관리자가 먼저 확정할 목록이 바로 이거예요.
69
+ - **공식 테스트가 다루지 않는 문제도 질문으로 올렸어요.** Django의 글 목록은 토큰을 읽지 않고 세션 사용자를 보고, `createUser` 명령은 마이그레이션에서 이름이 바뀐 필드로 사용자를 찾아요. Nitro 문서는 이메일 형식을 검사하지 않는다고도 그대로 적었는데, 공식 테스트의 더 새 버전은 이걸 검사해요.
64
70
 
65
- 정답 수는 crumbs가 적었지만(18개 중 15개 대 17개), 읽은 파일과 토큰은 더 적었어요.
71
+ 한계도 있어요. 구현체마다 한 번씩, writer 모델 하나로 돌렸어요. 채점자도 모델이라 작성자가 인용된 앵커가 모두 있는지 확인하고 일부 행을 직접 대조했어요. RealWorld는 널리 알려진 프로젝트라 저장소에 스펙이 없어도 writer가 학습 중에 봤을 수 있어요. 공식 테스트는 문서 내용의 일부만 검증해서, Nitro 정책 20개와 Django 정책 41개는 코드와만 대조했어요. Django 채점자는 의존성 버전을 고정하지 않고 코드를 실행했기 때문에 "일부 과장" 판정 중 몇 개는 라이브러리 버전에 따라 달라질 수 있어요.
66
72
 
67
- | | 기존 스펙 체계 | crumbs-spec |
68
- |---|---|---|
69
- | 정답 | 17 / 18 (부분 1) | 15 / 18 (부분 3) |
70
- | 읽은 파일 수 합계 | 70 (평균 3.9, 최대 8) | 64 (평균 3.6, 최대 6) |
71
- | 검색(grep)으로 떨어진 횟수 | 3 | 1 |
72
- | 토큰 합계 | 232만 | 189만 (−18%) |
73
+ ### 앞서 비공개 앱에서 돌린 결과 (일화)
73
74
 
74
- 기존 체계의 부분 정답은 소유 문서를 못 찾은 경우였고, crumbs의 부분 정답 3개는 모두 문서엔 3~5파일로 도달했는데 writer가 화면 수치·채널 분기 같은 세부를 버린 경우였어요. 그 원인에 대해 스킬 규칙("조건이 붙은 값은 버리지 않는다")을 추가했어요. 벤치마크는 다시 돌리지 않았어요. 질문이 기존 스펙에서 나와 기존 체계에 유리한 편향이 있다는 점은 감안해 주세요.
75
+ 이 실험 전에 비공개 앱의 세 영역(코드 약 4만 줄)을 다시 쓰고, 기존 스펙 체계와 crumbs에 같은 질문 18개를 문서만 보고 답하게 했어요. crumbs는 17개 대 15개로 정답이 적었지만 읽은 파일은 70개 대 64개, 토큰은 18% 적었어요. crumbs의 부분 정답 3개는 writer가 세부를 버린 경우여서 "조건이 붙은 값은 버리지 않는다" 규칙을 스킬에 넣었어요. 작성자가 채점했고, 질문은 기존 스펙에서 나왔고, 데이터는 공개할 수 없어서 일화로 읽어 주세요. 탐색 비용 비교는 아직 공개 코드에서 다시 돌리지 않았어요.
75
76
 
76
77
  ## 설치와 빠른 시작
77
78
 
@@ -111,7 +112,7 @@ npm에 [`crumbs-spec`](https://www.npmjs.com/package/crumbs-spec)으로 올라
111
112
  npx crumbs-spec init --spec-dir docs/crumbs --skills claude
112
113
  ```
113
114
 
114
- 2. **에이전트가 규칙을 읽게 해요.** Claude Code는 `CLAUDE.md`에 `@AGENTS.md` 한 줄이 있어야 crumbs 블록을 읽어요. 스킬은 `.claude/skills/`(Claude Code)와 `.agents/skills/`(Codex)에서 자동으로 찾아요.
115
+ 2. **에이전트가 규칙을 읽게 해요.** Codex와 Claude Code(v2.1.277 이상)는 `AGENTS.md`를 바로 읽어요. 다만 `CLAUDE.md`(또는 `.claude/CLAUDE.md`, `CLAUDE.local.md`)가 있는 저장소에서는 Claude Code가 그 파일만 읽으니, 거기에 `@AGENTS.md` 한 줄을 넣어 crumbs 블록을 가져와요. 이때 `init`이 안내를 출력해요. 스킬은 `.claude/skills/`(Claude Code)와 `.agents/skills/`(Codex)에서 자동으로 찾아요.
115
116
 
116
117
  3. **기존 문서는 옮기지 않아요.** writer는 코드와 테스트만 원본으로 삼고, 기존 위키·설계 메모·README는 사용자가 원본 자료로 지목하지 않는 한 읽지 않아요. 지금 코드와 맞는지 확인할 수 없기 때문이에요. 기존 문서 중 근거로 쓸 것(기획서, 계약서, 정책 결정 기록)은 `docs/raw/`에 복사해 두고 `crumbs-ingest`로 한 건씩 반영해요.
117
118
 
@@ -122,7 +123,7 @@ npm에 [`crumbs-spec`](https://www.npmjs.com/package/crumbs-spec)으로 올라
122
123
  도메인 디렉터리는 docs/crumbs/billing/이다. 확인하지 못한 정책은 질문으로 남기고 끝까지 해 줘.
123
124
  ```
124
125
 
125
- 5. **`check`를 CI에 걸어요.** 오류(끊어진 링크·앵커, 도달 불가 문서, 빠진 역링크, 없는 코드 경로, 정책 이름 중복)만 실패시키고 경고는 무시해요. 스펙 루트 안의 Markdown 가운데 아직 crumbs 문서가 아닌 것은 `crumbs.json`의 `exclude`에 넣어요. 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. 글롭 패턴은 없어요. 필수 절이 하나도 없는 문서는 `check`가 알려 줘요.
126
+ 5. **`check`를 CI에 걸어요.** 오류(아래 검사 규칙 표에서 error인 규칙)만 실패시키고 경고는 무시해요. 스펙 루트 안의 Markdown 가운데 아직 crumbs 문서가 아닌 것은 `crumbs.json`의 `exclude`에 넣어요. 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. 글롭 패턴은 없어요. 필수 절이 하나도 없는 문서는 `check`가 알려 줘요.
126
127
 
127
128
  6. **코드를 바꿀 때 문서를 같이 바꿔요.** AGENTS 블록이 "요청이 없어도 같은 변경에서 소유 문서를 갱신한다"를 에이전트에게 요구하니까, PR마다 `check`와 로그 항목이 함께 들어와요. 도메인이 하나씩 늘어나면서 인덱스가 채워져요.
128
129
 
@@ -176,47 +177,42 @@ docs/raw/ 계약서·기획 메모 같은 불변 원본
176
177
  | 확인 필요 사항 | `- [확인 필요] [정책 이름](#앵커) — 질문` |
177
178
  | 관련 문서 | 개요로 가는 링크와 이웃 문서. 역링크는 상호여야 해요 |
178
179
 
179
- 예시(`docs/specs/shopping/장바구니.md`):
180
+ 예시: [RealWorld 실험](#처음-보는-코드에서도-맞게-쓸까요-realworld-실험)에서 writer가 Nitro 코드로 만든 상세 문서를 고치지 않고 그대로 실었어요([원본](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md)). 이 저장소는 `lang: en`이라 제목이 영어예요. 아래 사용 예시 3에서 이 문서의 질문에 답하고 흐름도가 추가돼요.
180
181
 
181
182
  ````markdown
182
- # 장바구니
183
- <!-- ../index.md를 먼저 읽는다. 이 문서를 바꾼 뒤 ../log.md에 항목을 추가한다 -->
184
-
185
- ## 목적
186
- 사용자가 상품을 담고 수량을 바꾸고 비울 때까지의 흐름을 맡는다. 쿠폰 적용은 [쿠폰 할인](쿠폰-할인.md)이 맡는다.
187
-
188
- ## 현재 동작
189
- - 사용자가 같은 상품을 다시 담으면 앱은 수량을 더한다.
190
- - 수량이 99를 넘으면 앱은 "최대 99개까지 담을 수 있습니다." 안내를 보이고 담지 않는다.
191
-
192
- ## 흐름
193
- ```mermaid
194
- flowchart TD
195
- A["상품 담기"] --> B{"같은 상품이 있나"}
196
- B -->|예| C["수량 합산"]
197
- B -->|아니오| D["새 줄 추가"]
198
- C --> E{"99 초과"}
199
- E -->|예| F["안내 후 담지 않음"]
200
- ```
201
-
202
- ## 정책
203
- ### 수량 상한
204
- 장바구니 한 줄의 수량은 99 이하다.
205
-
206
- ### 최소 주문 금액
207
- 지금은 합계가 10,000원 미만이면 결제 버튼을 비활성화한다.
208
- [확인 필요] 10,000원이라는 기준의 근거는 무엇인가?
209
-
210
- ## 근거
211
- - `src/cart/cart.ts:12-48` — 담기와 수량 합산
212
- - `test/cart/cart.test.ts` — 수량 상한
213
-
214
- ## 확인 필요 사항
215
- - [확인 필요] [최소 주문 금액](#최소-주문-금액) — 10,000원이라는 기준의 근거는 무엇인가?
216
-
217
- ## 관련 문서
218
- - [쇼핑 개요](overview.md)
219
- - [쿠폰 할인](쿠폰-할인.md)
183
+ # Tag list
184
+ <!-- Read ../../index.md first. After changing this document, add an entry to ../../log.md -->
185
+
186
+ ## Purpose
187
+ This document owns GET /api/tags, which returns the most used tag names. How tags are attached to articles is owned by [Article creation](article-create.md#article-tag-name-handling). The endpoint allows anonymous viewers as described in [Authentication token](../authentication-token.md), and the list is the same for anonymous and signed-in viewers.
188
+
189
+ ## Current behavior
190
+ - The server considers only tags that at least one article uses.
191
+ - The server sorts those tags by the number of articles that use them, most used first.
192
+ - The server returns at most 10 tag names.
193
+ - The server responds with status 200 and {"tags": ["<name>"…]}.
194
+ - If no article uses a tag, the list is empty.
195
+
196
+ ## Flow
197
+ None
198
+
199
+ ## Policies
200
+ ### Popular tag list
201
+ The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first. The order of tags used by the same number of articles is not defined, and the list has no pagination. No test covers this rule.
202
+ [needs confirmation] What is the basis of the 10-tag limit, and what should order tags with the same usage count?
203
+
204
+ ## Evidence
205
+ - `server/routes/api/tags/index.get.ts` — selects tags used by at least one article, sorts them by usage and returns at most 10 names
206
+ - `prisma/schema.prisma` — unique tag names and the relation between tags and articles
207
+
208
+ ## Open questions
209
+ - [needs confirmation] [Popular tag list](#popular-tag-list) — What is the basis of the 10-tag limit, and what should order tags with the same usage count?
210
+
211
+ ## Related
212
+ - [Articles API overview](overview.md)
213
+ - [Article creation](article-create.md)
214
+ - [Article update](article-update.md)
215
+ - [Article deletion](article-delete.md)
220
216
  ````
221
217
 
222
218
  문서 본문은 간결한 `-한다`체로 써요. 개요의 `## 용어`는 별칭을 소유 정책으로 잇는 링크 목록이에요(`- 정액권(정액제) — [정액권 이용 중 판정](정액권.md#정액권-이용-중-판정)`). 정의만 있는 용어는 여기서 끝나고, 여러 흐름이 분기 축으로 쓰는 개념(채널, 재화, 회원 상태)만 `concepts/`에 소유 문서를 둬요.
@@ -234,13 +230,15 @@ npx crumbs-spec log add --kind <ingest|query|lint|drift|change|decision> "<제
234
230
  `check`의 출력은 `파일:줄 심각도 규칙: 메시지` 한 줄씩이고 마지막 줄이 요약이에요.
235
231
 
236
232
  ```
237
- docs/specs/shopping/장바구니.md:34 error broken-anchor: 앵커가 없음: 쿠폰-할인.md#적용-순서
238
- docs/specs/shopping/장바구니.md:20 warning open-question: 미해결 질문 1개
239
-
240
- crumbs check: 문서 4개, 오류 1개, 경고 1개
233
+ docs/specs/api/articles/tag-list.md:31 error broken-link: link target not found: ../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list
234
+ docs/specs/api/articles/article-delete.md:44 warning open-question: 1 open question(s)
235
+ …
236
+ crumbs check: 28 documents, 1 error, 20 warnings
241
237
  ```
242
238
 
243
- **지원하는 Markdown.** 제목은 ATX(`#`부터 `######`까지)만 인식하고 setext 제목(밑줄식)은 인식하지 않아요. 인라인 링크와 참조 링크(`[텍스트][라벨]`, `[라벨][]`와 `[라벨]: 경로` 정의)를 검사해요. `[라벨]`만 쓴 축약 참조는 링크가 아니에요. 제목 앵커는 github-slugger 방식이에요. 공백마다 `-`가 되고, `-`와 `_`를 뺀 문장부호는 지우며, 연속된 `-`는 합치지 않아요. 예를 들어 `### 수량 & 한도`는 `#수량--한도`가 돼요. 스펙 루트 아래의 심볼릭 링크 파일과 디렉터리도 따라가요. 근거 경로에는 `/`가 있어야 하며 저장소 루트의 파일은 `./package.json`처럼 써요. `:12`, `:12-48`, `:12:5`, `:12-48,60-70` 같은 줄 표기를 받아요. `exclude` 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. JSON 출력의 모든 항목에는 `line`이 있어요(더 나은 위치가 없으면 1).
239
+ 사용 예시 3에서 writer가 결정 링크를 고치기 전에 나온 출력이고, 나머지 경고 19개는 생략했어요. 이 저장소는 `lang: en`이라 메시지가 영어예요. `lang: ko`에서는 `링크 대상이 없음`, `미해결 질문 1개`, `crumbs check: 문서 28개, 오류 1개, 경고 20개`처럼 나와요.
240
+
241
+ **지원하는 Markdown.** 제목은 ATX(`#`부터 `######`까지)만 인식하고 setext 제목(밑줄식)은 인식하지 않아요. 인라인 링크와 참조 링크(`[텍스트][라벨]`, `[라벨][]`와 `[라벨]: 경로` 정의)를 검사해요. `[라벨]`만 쓴 축약 참조는 링크가 아니에요. 제목 앵커는 github-slugger 방식이에요. 공백마다 `-`가 되고, `-`와 `_`를 뺀 문장부호는 지우며, 연속된 `-`는 합치지 않아요. 예를 들어 `### 수량 & 한도`는 `#수량--한도`가 돼요. 스펙 루트 아래의 심볼릭 링크 파일과 디렉터리도 따라가요. 근거 경로는 `codeRoot`(기본값은 저장소 루트) 기준으로 해석하고, `rawDir` 아래 경로만 언제나 저장소 루트 기준으로 해석해요. 근거 경로에는 `/`가 있어야 하며 저장소 루트의 파일은 `./package.json`처럼 써요. `:12`, `:12-48`, `:12:5`, `:12-48,60-70` 같은 줄 표기를 받아요. `exclude` 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. JSON 출력의 모든 항목에는 `line`이 있어요(더 나은 위치가 없으면 1).
244
242
 
245
243
  ### 검사 규칙
246
244
 
@@ -265,32 +263,37 @@ crumbs check: 문서 4개, 오류 1개, 경고 1개
265
263
 
266
264
  ## 로그
267
265
 
268
- 로그는 한 곳(`docs/specs/log.md`)에 시간순으로 덧붙여요. 제목은 작업명이 아니라 **사용자 결과 한 문장**이고, 본문은 세 줄이에요.
266
+ 로그는 한 곳(`docs/specs/log.md`)에 시간순으로 덧붙여요. 제목은 작업명이 아니라 **사용자 결과 한 문장**이고, 본문은 세 줄이에요. 항목은 `log add`로 쓰고, 제목이나 본문에 `<!--`가 있으면 거부해요.
269
267
 
270
268
  ```bash
271
- npx crumbs-spec log add --kind change "장바구니 수량 상한을 99로 올림" \
272
- --body "결과: 한 줄에 99개까지 담을 수 있다. 이유: 요청 SHOP-42. 문서: [수량 상한](shopping/장바구니.md#수량-상한)"
269
+ npx crumbs-spec log add --kind change "<사용자 결과 한 문장>" \
270
+ --body "결과: <바뀐 것>. 이유: <까닭>. 문서: [<정책>](<도메인>/<문서>.md#<앵커>)"
273
271
  ```
274
272
 
275
- `log add`는 제목이나 본문에 `<!--`가 있으면 거부해요.
273
+ 사용 예시 5에서 남긴 항목이에요. 이 저장소는 `lang: en`이라 본문 머리가 `Result:`, `Reason:`, `Document:`예요.
276
274
 
277
- `[확인 필요]` 질문이 답을 얻으면 `decision` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크 하나를 둬요. 문서 안에 변경 이력을 두지 않는 대신 결정은 로그에 쌓이고 문서는 링크로만 가리켜요. 슬러그는 대괄호·`|`·쉼표·콜론을 빼므로, `|`가 있던 자리는 `--`가 돼요.
275
+ ```markdown
276
+ ## [2026-11-03] change | A malformed email on registration, login and account update is rejected with 422 and is invalid
277
+ Result: a malformed email on registration, login and account update gets status 422 with {"errors": {"email": ["is invalid"]}}; 3 api documents updated and 1 open question remains about accepted address forms. Reason: code change in server/schemas/user.schema.ts, reported by the user. Document: [Email format](api/users/registration.md#email-format)
278
+ ```
279
+
280
+ `[확인 필요]` 질문이 답을 얻으면 `decision` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크 하나를 둬요. 문서 안에 변경 이력을 두지 않는 대신 결정은 로그에 쌓이고 문서는 링크로만 가리켜요. 슬러그는 대괄호·`|`·쉼표·콜론을 빼므로, `|`가 있던 자리는 `--`가 돼요. 사용 예시 3에서 남긴 결정이에요.
278
281
 
279
282
  ```markdown
280
- ## [2026-11-02] decision | 최소 주문 금액: 10,000원은 배송비 정책에서 온 값이다
281
- 결과: 합계 10,000원 미만이면 결제 버튼이 비활성이다. 이유: 2026-11-02 기획 확인. 문서: [최소 주문 금액](shopping/장바구니.md#최소-주문-금액)
283
+ ## [2026-11-03] decision | Popular tag list: most used first stays, ties are undefined, 10 tags are cut after sorting, and every viewer gets the same unpaginated list
284
+ Result: GET /api/tags keeps the most-used-first order, leaves the order of equally used tags undefined, applies the 10-tag limit after sorting, and returns the same list without pagination to every viewer. Reason: answers from the maintainer; existing clients may rely on most-used-first and the limit keeps the tag sidebar short. Document: [Popular tag list](api/articles/tag-list.md#popular-tag-list)
282
285
  ```
283
286
 
284
287
  ```markdown
285
- ### 최소 주문 금액
286
- 합계가 10,000원 미만이면 결제 버튼을 비활성화한다. (결정: [2026-11-02](../log.md#2026-11-02-decision--최소-주문-금액-10000원은-배송비-정책에서-온-값이다))
288
+ ### Popular tag list
289
+ The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first, and the server applies the 10-tag limit after sorting. … (decision: [2026-11-03](../../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list))
287
290
  ```
288
291
 
289
292
  kind는 `ingest`(원본 자료 반영), `query`(답을 찾아 환류), `lint`, `drift`, `change`(문서 변경), `decision`(질문 확정)이에요.
290
293
 
291
294
  ## 스킬
292
295
 
293
- `init --skills`는 에이전트가 crumbs 문서를 다루는 절차를 `.claude/skills/<이름>/SKILL.md`(Claude Code)와 `.agents/skills/<이름>/SKILL.md`(Codex)에 설치해요. 기존 `SKILL.md`는 덮어쓰지 않으니 새 버전으로 바꾸려면 지우고 다시 설치해요. Claude Code는 `CLAUDE.md`에 `@AGENTS.md`가 있어야 crumbs 블록의 규칙을 읽어요.
296
+ `init --skills`는 에이전트가 crumbs 문서를 다루는 절차를 `.claude/skills/<이름>/SKILL.md`(Claude Code)와 `.agents/skills/<이름>/SKILL.md`(Codex)에 설치해요. 기존 `SKILL.md`는 덮어쓰지 않으니 새 버전으로 바꾸려면 지우고 다시 설치해요. Claude Code가 crumbs 블록을 언제 읽는지는 [기존 프로젝트에 추가하기](#기존-프로젝트에-추가하기) 2단계에 있어요.
294
297
 
295
298
  생성된 SKILL.md는 frontmatter 바로 뒤에 그것을 만든 crumbs-spec 버전을 적은 주석 한 줄을 둬요. 스킬과 템플릿은 패키지 버전을 따라요. 마이너 릴리스는 문구를 바꿀 수 있고 패치 릴리스는 바꾸지 않아요. 새 버전으로 올리려면 파일을 지우고 `init --skills`를 다시 실행해요.
296
299
 
@@ -303,52 +306,56 @@ kind는 `ingest`(원본 자료 반영), `query`(답을 찾아 환류), `lint`, `
303
306
 
304
307
  ## 사용 예시
305
308
 
309
+ 아래 예시는 모두 실험의 Nitro 백엔드로 crumbs-spec-conduit의 [`usage/`](https://github.com/Sienna94/crumbs-spec-conduit/tree/main/usage) 작업공간에서 실제로 돌린 결과예요. 예시 1은 실험의 Opus 5.5 writer예요. 예시 2~5는 요청문만 받은 Claude Sonnet 5.5 에이전트가 `AGENTS.md`를 읽고 스킬을 스스로 골랐고, 에이전트가 물은 것은 작성자가 관리자 입장에서 답했어요. 요청문은 실제로는 영어로 보냈고, 여기서는 요청문과 `check` 출력을 한국어로 옮겼어요. 작업공간이 `lang: en`이라 실제 문서에는 질문 표시와 절 이름이 영어로 들어가 있어요. 파일을 바꾼 예시는 하나씩 커밋으로 남겨 링크했어요.
310
+
306
311
  ### 1. 기존 코드를 처음 문서화해요
307
312
 
308
313
  ```
309
- src/cart/ 아래 코드를 crumbs-writer의 "기존 코드 문서화" 모드로 문서화해 줘.
310
- 도메인 디렉터리는 docs/specs/shopping/이고, 확인하지 못한 정책은 질문으로 남기고 끝까지 해 줘.
314
+ ../vendor/nitro 아래 코드를 crumbs-writer의 "기존 코드 문서화" 모드로 문서화해 줘.
315
+ 코드와 테스트만 근거로 삼고, 확인하지 못한 정책은 질문으로 남기고 끝까지 해 줘.
311
316
  ```
312
317
 
313
- 에이전트는 인덱스와 템플릿을 읽고, 진입점부터 코드와 테스트를 따라가며 `shopping/overview.md`와 상세 문서를 만들어요. 테스트가 확정하는 규칙은 정책으로, 코드에만 있는 규칙은 "지금은 …" 서술과 `[확인 필요]` 질문으로 적어요. 끝에 `check`를 돌려 오류를 없애고 로그를 남겨요.
318
+ 실험의 [writer 프롬프트](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/eval/prompts/writer.md)를 줄인 형태예요. writer는 라우트 처리기부터 코드를 따라가며 API를 하위 디렉터리 네 개로 나누고, 상세 문서 21개와 개요를 만들었어요. 저장소에 단위 테스트 파일이 2개뿐이라 테스트로 확정된 정책은 6개, `[확인 필요]` 질문은 45개였어요. 마지막에 `check`를 돌리고 로그를 남겼어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/572b0db)).
314
319
 
315
320
  ```
316
- crumbs check: 문서 5개, 오류 0개, 경고 3개
321
+ crumbs check: 문서 28개, 오류 0개, 경고 21개
317
322
  ```
318
323
 
319
- 경고 3개는 질문이 남은 문서 3개예요. 각 문서의 `확인 필요 사항` 절만 훑어도 무엇을 결정해야 하는지 알 수 있어요.
324
+ 경고 21개는 아직 질문이 남은 상세 문서 21개예요. 각 문서의 확인 필요 사항 절이 관리자가 정해야 할 목록이에요.
320
325
 
321
- ### 2. 코드 변경을 문서에 반영해요
326
+ ### 2. 답을 찾아요
322
327
 
323
328
  ```
324
- 장바구니 수량 상한을 99에서 199로 올렸어. 문서도 맞춰 줘.
329
+ GET /api/tags는 태그를 몇 개, 어떤 순서로 돌려줘?
325
330
  ```
326
331
 
327
- writer는 `grep -rl 'src/cart/cart.ts' docs/specs`로 근거에 그 경로를 적은 소유 문서를 찾고, "현재 동작"과 `### 수량 상한` 본문을 고치고, 흐름 도식의 값을 맞추고, 로그에 `change | 장바구니 수량 상한을 199로 올림`을 남겨요. 소유 문서가 둘로 보이면 멈추고 어느 쪽이 소유자인지 물어요.
332
+ finder는 색인 → API 개요 → 글 개요 → [tag-list.md](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md) 순서로 스펙 문서 4개만 읽고, 코드는 보지 않은 채 답했어요. 태그는 최대 10개이고, 많이 쓰인 순서이며, 글 하나 이상이 쓰는 태그만 나오고 페이지 나눔은 없다고요. 같은 개수인 태그의 순서와 10개 제한의 근거는 아직 `[확인 필요]` 질문이라는 점도 함께 알렸어요. 바뀐 파일은 없어요.
328
333
 
329
334
  ### 3. 모르는 정책은 묻고, 답은 결정으로 남겨요
330
335
 
331
336
  ```
332
- 쿠폰 중복 적용 규칙을 바꾸려고 해. 먼저 뭘 확인해야 하지?
337
+ 태그 목록의 정렬 방식을 바꾸고 싶어. 먼저 무엇을 확인해야 해?
333
338
  ```
334
339
 
335
- interview가 요청이 건드리는 정책을 나열하고, 코드·테스트·원본으로 확인된 것과 미확인인 것을 가른 뒤 미확인 정책을 질문으로 내요. 답하시면 writer가 정책을 확정 서술로 바꾸고 `decision` 로그와 결정 링크를 남겨요.
340
+ 질문 스킬은 요청이 건드리는 정책 8개를 찾아 코드로 확정된 3개를 표시하고, 나머지를 질문 7개로 만들었어요. "태그 목록이 GET /api/tags인지 글 안의 tagList인지"부터 "기존 클라이언트가 지금 순서에 기대는지"까지예요. 문서는 하나도 고치지 않고 멈췄어요. 답은 이랬어요. 대상은 GET /api/tags뿐이고, 많이 쓰인 순서를 유지하고, 같은 개수의 순서는 일부러 정하지 않으며, 10개 제한은 정렬 뒤에 그대로 적용해요. writer가 정책을 확정하고 `decision` 항목과 결정 링크를 남겼어요([로그](#로그) 참고). 그 과정에서 `check`가 두 가지를 잡았어요. 결정 링크가 `../../log.md`가 아니라 `../log.md`를 가리킨 것(`broken-link`), 그리고 현재 동작이 일곱 단계로 늘었는데 흐름도가 없는 것(`missing-flow`)이에요. 그래서 writer가 흐름도를 추가했어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/7b86052)).
336
341
 
337
342
  ### 4. 원본 자료를 반영해요
338
343
 
339
344
  ```
340
- docs/raw/coupon-policy-v3.pdf를 반영해 줘.
345
+ 상위 API 스펙이 바뀌었어. docs/raw/realworld-b8a37f1-validate-email-format.diff를 반영해 줘.
341
346
  ```
342
347
 
343
- ingest가 자료를 읽고 영향을 받는 문서를 인덱스·역링크·근거로 찾아 "바꿀 내용 목록"을 먼저 보여 줘요. 확인을 받은 뒤에만 소유 문서를 고치고 `ingest` 로그를 남겨요. 자동 병합은 하지 않아요.
348
+ 자료는 RealWorld 스펙에 이메일 형식 검사를 추가한 실제 상위 커밋이에요. 반영 스킬은 자료를 읽고 색인을 따라 회원가입·로그인·정보 수정 문서를 찾은 뒤, 자료의 주장 4개를 정리했어요. 그리고 충돌에서 멈췄어요. 자료는 형식이 틀린 이메일에 422 "is invalid"를 기대하는데, 문서와 코드는 형식을 검사하지 않는다고 해요. 자료와 코드 중 무엇을 따를지 물어서, 문서는 현재 동작을 설명하므로 코드를 따르기로 했어요. 스킬은 회원가입 문서에 이메일 형식 정책 하나를 두고 현재 동작과 상위 스펙을 인용한 질문을 적었어요. 로그인·정보 수정 문서에는 그 정책으로 가는 문장 하나씩만 넣고 `ingest` 항목을 남겼어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/130946a)). 변경 목록을 확인받기 전에는 아무것도 고치지 않았어요.
344
349
 
345
- ### 5. 답을 찾아요
350
+ ### 5. 코드 변경을 문서에 반영해요
346
351
 
347
352
  ```
348
- 장바구니에 몇 개까지 담을 수 있어?
353
+ 회원가입·로그인·정보 수정에 이메일 형식 검사를 추가했어
354
+ (server/schemas/user.schema.ts, 아직 커밋 전). 이제 형식이 틀린 이메일은
355
+ 422와 {"errors":{"email":["is invalid"]}}를 받아. 문서를 갱신해 줘.
349
356
  ```
350
357
 
351
- finder는 인덱스 → 쇼핑 개요 → 장바구니 문서 순으로 내려가 `### 수량 상한`을 출처로 답해요. 용어·개념 질문이면 `concepts/overview.md`의 용어 절을 먼저 봐요. 문서에 답이 없으면 "문서에 없음"과 가장 가까이 간 문서를 말해요.
358
+ writer는 `grep -rl 'user.schema' docs/specs`로 소유 문서를 찾았어요. 세 문서 모두 근거 절에 이 파일을 적어 두었기 때문이에요. 이메일 형식 정책을 확정 정책으로 고쳐 예시 4의 질문을 닫고, 로그인·정보 수정의 연결 문장과 흐름도 두 개를 고쳤어요. 코드만으로 정해지지 않는 것, 즉 어떤 주소를 유효로 볼지와 빈 이메일이 "is invalid"도 함께 보고하는지는 추측하지 않고 새 질문으로 남겼어요. 실제로 빈 이메일에는 두 메시지가 모두 나와요. 코드와 문서는 한 커밋이에요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/32fd2f3)).
352
359
 
353
360
  ### 6. CI에서 검사해요
354
361
 
@@ -384,7 +391,7 @@ jobs:
384
391
 
385
392
  ## 테스트와 호환성
386
393
 
387
- `npm test`는 CI에서 Linux와 macOS 위에서 node:test 케이스 80여 개를 돌려요(`.github/workflows/ci.yml` 참고). 변경 내역은 [CHANGELOG.md](CHANGELOG.md)에 있어요. 1.0 전에는 마이너 버전에서 검사 규칙, 템플릿, 스킬 문구가 바뀔 수 있고, 패치 버전은 버그만 고쳐요.
394
+ `npm test`는 CI에서 Linux와 macOS 위에서 node:test 테스트를 돌려요(`.github/workflows/ci.yml` 참고). 변경 내역은 [CHANGELOG.md](CHANGELOG.md)에 있어요. 1.0 전에는 마이너 버전에서 검사 규칙, 템플릿, 스킬 문구가 바뀔 수 있고, 패치 버전은 버그만 고쳐요.
388
395
 
389
396
  ## 로드맵
390
397
 
@@ -394,4 +401,4 @@ jobs:
394
401
  | 2 | 스킬 4종, `log add`, 흐름 절, 책임 단위 기준, 용어·개념 페이지, 결정 로그 | 완료 |
395
402
  | 3 | `crumbs reverse <path>` — 코드에서 초안 생성 명령(지금은 writer 스킬이 대신해요) | 예정 |
396
403
  | 4 | `crumbs drift --base <ref>` — diff로 근거가 바뀐 문서를 찾아요 | 예정 |
397
- | 5 | 예제 앱과 탐색 비용 벤치마크 러너 | 예정 |
404
+ | 5 | 공개 예제([crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit))와 탐색 비용 벤치마크 러너 | 예제 완료, 러너 예정 |
package/README.md CHANGED
@@ -44,34 +44,35 @@ From LLM Wiki we kept the raw/wiki/schema split, index-first navigation, the app
44
44
  - **Decisions in one place.** When a question gets its answer, a `decision` entry goes into the log and the document points at it with a single dated link.
45
45
  - **Two languages.** `lang` in `crumbs.json` selects the language of the templates, skills, messages and AGENTS block for the whole repository. It defaults to English (`en`); `ko` gives Korean. This README is the English guide.
46
46
 
47
- ## What happened when we used it (one run, self-reported)
47
+ ## Does it work on code it has never seen? (RealWorld experiment)
48
48
 
49
- Read this as an anecdote, not a benchmark. It was a single run with 18 questions, graded by the author, the questions were drawn from the existing spec system, the two corpora differ in size (38 documents against about 127), and the raw data comes from a private repository and cannot be published. The roadmap's example app and benchmark runner exist to replace it.
49
+ We ran the writer skill on two open-source backends of the [RealWorld](https://github.com/realworld-apps/realworld) "Conduit" API and graded the documents against the project's official API test suite. The generated documents, prompts, ground truth and every grading row are published in [crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit).
50
50
 
51
- We rewrote three areas of a real app repository (about 40,000 lines of code) with the crumbs-writer skill without showing it any existing spec document. Then we asked the same 18 questions of the existing spec system and the crumbs system and let an agent answer from documents only.
51
+ - **Setup.** Two pinned implementations of the same API: [Nitro + Prisma](https://github.com/realworld-apps/nitro-prisma-zod-realworld-example-app) (TypeScript) and [Django Ninja](https://github.com/c4ffein/realworld-django-ninja) (Python). One Opus 5.5 agent per implementation wrote the documents from code and tests only. The official spec repository was not in the experiment repository while they wrote; it was added in a later commit.
52
+ - **Ground truth.** Each request in the official Hurl suite, at the version both implementations pin, is one row: 130 rows after dropping setup and cleanup requests.
53
+ - **Grading.** A different model (Sonnet 5.5) graded every row. `correct` means the documents state the status and every essential asserted value, `partial` that one is left out, `wrong` that the documents contradict it, `missing` that no document covers it. It also checked every policy against the code.
52
54
 
53
- **Cost of writing from zero** (one agent per domain, three in parallel)
54
-
55
- | Domain | Code | Documents | Policies (confirmed / open questions) | Agent tokens | Writing time |
56
- |---|---|---|---|---|---|
57
- | Payment | ~20k lines | 19 | 100 (5 / 95) | 570k | 1 h 7 min |
58
- | Viewer | ~23k lines | 40 | 194 (29 / 165) | 850k | 1 h 7 min |
59
- | Auth | ~10k lines | 35 | 195 (64 / 131) | 790k | 1 h 13 min |
60
-
61
- Writing time is the actual working time from the agent transcripts' timestamps, excluding idle gaps longer than ten minutes. With the three domains in parallel everything finished in about 1 h 15 min. In our own review of the output we found no invented policy, and the six places where the existing spec disagreed with the code were written as the code behaves; that review was done by the author, not independently. The documents were later regrouped by user flow into 38.
55
+ | | Nitro + Prisma | Django Ninja |
56
+ |---|---|---|
57
+ | Code / tests in the repository | ~1,400 lines / 2 unit test files | ~2,300 lines / endpoint tests for each app |
58
+ | Documents / policies | 28 / 51 | 26 / 91 |
59
+ | Policies confirmed by tests / left as questions | 6 / 45 | 50 / 41 |
60
+ | Suite rows correct | **125 / 130** | **116 / 130** |
61
+ | Suite rows partial / wrong / missing | 5 / 0 / 0 | 14 / 0 / 0 |
62
+ | Invented policies (code does not do it) | 0 | 0 |
63
+ | Policies partly overstated | 1 | 6 |
64
+ | Writer tokens / wall time | 165k / 2 h 40 min | 202k / 2 h 47 min |
62
65
 
63
- **Navigation cost on the same 18 questions** (documents only; reading code was forbidden)
66
+ - **Nothing contradicted the suite and nothing was invented.** Every miss is a detail left out. Nitro's five partials are `null` inputs the documents never mention and the order of tags. Twelve of Django's fourteen come from one honest question: the app's error handler and its tests disagree on the 401 body, so the writer stated both and asked.
67
+ - **Statements under a question were mostly right.** 12 Nitro rows and 32 Django rows were graded correct on a statement still marked `[needs confirmation]`. "This is what it does now" plus a question kept the documents useful without claiming more than the tests prove.
68
+ - **Fewer tests, more questions.** Nitro has two unit test files, so 45 of its 51 policies stayed questions. The suite answers 29 of them, which is the list a maintainer would confirm first.
69
+ - **The writers raised what no suite row tests.** As questions: Django's article list ignores the token and reads the session user, and its `createUser` command looks users up by a field a migration renamed. The Nitro documents also say plainly that the email format is not checked, which a newer version of the suite does test.
64
70
 
65
- crumbs-spec answered fewer questions correctly (15 against 17) and read fewer files and tokens.
71
+ Limits: one run per implementation and one writer model. The grader is also a model; the author checked that every cited anchor exists and spot-checked rows. RealWorld is well known, so the writer may have seen it in training even without the spec in the repository. The suite asserts only part of what the documents say: 20 of Nitro's and 41 of Django's policies were checked against the code alone. The Django grader ran the code with unpinned dependencies, so some of its "partly" verdicts may depend on library versions.
66
72
 
67
- | | Existing spec system | crumbs-spec |
68
- |---|---|---|
69
- | Correct answers | 17 / 18 (1 partial) | 15 / 18 (3 partial) |
70
- | Files read in total | 70 (avg 3.9, max 8) | 64 (avg 3.6, max 6) |
71
- | Fell back to grep | 3 | 1 |
72
- | Tokens in total | 2.32M | 1.89M (−18%) |
73
+ ### An earlier run on a private app (anecdote)
73
74
 
74
- The existing system's partial answer came from failing to find the owning document; the three crumbs partials all reached the owning document in 3–5 files but the writer had dropped details such as screen numbers and channel branches. We added a skill rule for this ("do not drop values that carry a condition"); the benchmark has not been re-run. Note the bias: the questions were drawn from the existing specs, which favors the existing system.
75
+ Before this we rewrote three areas of a private app (about 40,000 lines) and asked the existing spec system and crumbs the same 18 questions, documents only. crumbs answered 15 against 17, read 64 files against 70 and used 18% fewer tokens. Its three partial answers were details the writer had dropped, which led to the skill rule "do not drop values that carry a condition". The author graded it, the questions came from the existing specs, and the data cannot be published, so read it as an anecdote. The navigation comparison has not been repeated on public code yet.
75
76
 
76
77
  ## Install and quick start
77
78
 
@@ -111,7 +112,7 @@ The order for a repository that already has code and documents. Start with one d
111
112
  npx crumbs-spec init --spec-dir docs/crumbs --skills claude
112
113
  ```
113
114
 
114
- 2. **Let the agent read the rules.** Claude Code only reads the crumbs block if `CLAUDE.md` contains the line `@AGENTS.md`. Skills are found automatically under `.claude/skills/` (Claude Code) and `.agents/skills/` (Codex).
115
+ 2. **Let the agent read the rules.** Codex and Claude Code (v2.1.277 or later) read `AGENTS.md` on their own. In a repository that also has a `CLAUDE.md` (or `.claude/CLAUDE.md` or `CLAUDE.local.md`), Claude Code reads only that file, so add the line `@AGENTS.md` to it to pull in the crumbs block. `init` prints a guide line in that case. Skills are found automatically under `.claude/skills/` (Claude Code) and `.agents/skills/` (Codex).
115
116
 
116
117
  3. **Do not migrate existing documents.** The writer treats code and tests as the only sources and does not read existing wikis, design notes or READMEs unless you name them as sources, because there is no way to know whether they still match the code. Copy the ones worth using as evidence (plans, contracts, decision records) into `docs/raw/` and ingest them one at a time with `crumbs-ingest`.
117
118
 
@@ -122,7 +123,7 @@ The order for a repository that already has code and documents. Start with one d
122
123
  The domain directory is docs/crumbs/billing/. Leave unconfirmed policies as questions and finish the whole thing.
123
124
  ```
124
125
 
125
- 5. **Put `check` in CI.** Fail only on errors (broken links and anchors, unreachable documents, missing backlinks, missing code paths, duplicate policy names) and ignore warnings. Markdown under the spec root that is not a crumbs document yet goes into `exclude` in `crumbs.json`: entries are paths relative to the spec root, an entry ending in `/` excludes that directory, there are no glob patterns, and `check` tells you when a document has none of the required sections.
126
+ 5. **Put `check` in CI.** Fail only on errors (every rule marked error in the check rules table below) and ignore warnings. Markdown under the spec root that is not a crumbs document yet goes into `exclude` in `crumbs.json`: entries are paths relative to the spec root, an entry ending in `/` excludes that directory, there are no glob patterns, and `check` tells you when a document has none of the required sections.
126
127
 
127
128
  6. **Change the document in the same change as the code.** The AGENTS block tells the agent to "update the owning document in the same change, even when nobody asked", so every PR brings `check` and a log entry with it. The index fills in as domains are added one by one.
128
129
 
@@ -176,47 +177,42 @@ The sections of a detail document are fixed. Headings follow `lang` (English by
176
177
  | Open questions | `- [needs confirmation] [policy name](#anchor) — question` |
177
178
  | Related | Link to the overview and neighboring documents; backlinks must be mutual |
178
179
 
179
- Example (`docs/specs/shopping/cart.md`):
180
+ Example: a detail document the writer produced from the Nitro code in [the RealWorld experiment](#does-it-work-on-code-it-has-never-seen-realworld-experiment), unedited ([source](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md)). Usage example 3 below answers its question and adds a flow diagram.
180
181
 
181
182
  ````markdown
182
- # Cart
183
- <!-- Read ../index.md first. After changing this document, add an entry to ../log.md -->
183
+ # Tag list
184
+ <!-- Read ../../index.md first. After changing this document, add an entry to ../../log.md -->
184
185
 
185
186
  ## Purpose
186
- Owns the flow from adding an item to changing its quantity and emptying the cart. Coupon application is owned by [Coupon discount](coupon-discount.md).
187
+ This document owns GET /api/tags, which returns the most used tag names. How tags are attached to articles is owned by [Article creation](article-create.md#article-tag-name-handling). The endpoint allows anonymous viewers as described in [Authentication token](../authentication-token.md), and the list is the same for anonymous and signed-in viewers.
187
188
 
188
189
  ## Current behavior
189
- - When the user adds the same item again, the app adds the quantities.
190
- - When the quantity would exceed 99, the app shows "You can add up to 99 of this item." and does not add it.
190
+ - The server considers only tags that at least one article uses.
191
+ - The server sorts those tags by the number of articles that use them, most used first.
192
+ - The server returns at most 10 tag names.
193
+ - The server responds with status 200 and {"tags": ["<name>"…]}.
194
+ - If no article uses a tag, the list is empty.
191
195
 
192
196
  ## Flow
193
- ```mermaid
194
- flowchart TD
195
- A["Add item"] --> B{"Already in cart?"}
196
- B -->|yes| C["Add quantities"]
197
- B -->|no| D["New line"]
198
- C --> E{"More than 99?"}
199
- E -->|yes| F["Show notice, do not add"]
200
- ```
197
+ None
201
198
 
202
199
  ## Policies
203
- ### Quantity cap
204
- A cart line holds at most 99 of one item.
205
-
206
- ### Minimum order amount
207
- Right now the checkout button is disabled when the total is under 10,000 KRW.
208
- [needs confirmation] Where does the 10,000 KRW threshold come from?
200
+ ### Popular tag list
201
+ The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first. The order of tags used by the same number of articles is not defined, and the list has no pagination. No test covers this rule.
202
+ [needs confirmation] What is the basis of the 10-tag limit, and what should order tags with the same usage count?
209
203
 
210
204
  ## Evidence
211
- - `src/cart/cart.ts:12-48` — adding and quantity merge
212
- - `test/cart/cart.test.ts` — quantity cap
205
+ - `server/routes/api/tags/index.get.ts` — selects tags used by at least one article, sorts them by usage and returns at most 10 names
206
+ - `prisma/schema.prisma` — unique tag names and the relation between tags and articles
213
207
 
214
208
  ## Open questions
215
- - [needs confirmation] [Minimum order amount](#minimum-order-amount) — Where does the 10,000 KRW threshold come from?
209
+ - [needs confirmation] [Popular tag list](#popular-tag-list) — What is the basis of the 10-tag limit, and what should order tags with the same usage count?
216
210
 
217
211
  ## Related
218
- - [Shopping overview](overview.md)
219
- - [Coupon discount](coupon-discount.md)
212
+ - [Articles API overview](overview.md)
213
+ - [Article creation](article-create.md)
214
+ - [Article update](article-update.md)
215
+ - [Article deletion](article-delete.md)
220
216
  ````
221
217
 
222
218
  The overview's "Terms" section is a list of aliases linked to the owning policy (`- Subscription pass(flat-rate pass) — [Pass active check](pass.md#pass-active-check)`). A term that is only a definition stops there; only concepts that several flows branch on (channel, currency, member state) get an owning document under `concepts/`.
@@ -234,13 +230,15 @@ Common options are `--root <dir>` (repository root, default: current directory),
234
230
  `check` prints one line per finding as `file:line severity rule: message`, and a summary last.
235
231
 
236
232
  ```
237
- docs/specs/shopping/cart.md:34 error broken-anchor: anchor not found: coupon-discount.md#application-order
238
- docs/specs/shopping/cart.md:20 warning open-question: 1 open question(s)
239
-
240
- crumbs check: 4 documents, 1 error, 1 warning
233
+ docs/specs/api/articles/tag-list.md:31 error broken-link: link target not found: ../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list
234
+ docs/specs/api/articles/article-delete.md:44 warning open-question: 1 open question(s)
235
+ …
236
+ crumbs check: 28 documents, 1 error, 20 warnings
241
237
  ```
242
238
 
243
- **Supported Markdown.** Headings must be ATX (`#` to `######`); setext headings are not recognized. Inline links and reference links (`[text][label]`, and `[label][]` with a `[label]: path` definition) are checked; a shortcut reference such as `[label]` alone is not a link. Heading anchors follow github-slugger: each space becomes `-`, punctuation other than `-` and `_` is dropped, and nothing is collapsed, so `### Quantity & limits` becomes `#quantity--limits`. Symlinked files and directories under the spec root are followed. An evidence path must contain a `/`, so a repository-root file is written `./package.json`; line suffixes such as `:12`, `:12-48`, `:12:5` and `:12-48,60-70` are accepted. Entries in `exclude` are paths relative to the spec root, and an entry ending in `/` excludes that directory. Every finding carries a `line` (1 when there is no better position), so JSON output always includes it.
239
+ This is the check from usage example 3 before the writer fixed its decision link; the other 19 warnings are left out.
240
+
241
+ **Supported Markdown.** Headings must be ATX (`#` to `######`); setext headings are not recognized. Inline links and reference links (`[text][label]`, and `[label][]` with a `[label]: path` definition) are checked; a shortcut reference such as `[label]` alone is not a link. Heading anchors follow github-slugger: each space becomes `-`, punctuation other than `-` and `_` is dropped, and nothing is collapsed, so `### Quantity & limits` becomes `#quantity--limits`. Symlinked files and directories under the spec root are followed. Evidence paths are resolved against `codeRoot` (the repository root by default), except paths under `rawDir`, which are always resolved against the repository root. An evidence path must contain a `/`, so a repository-root file is written `./package.json`; line suffixes such as `:12`, `:12-48`, `:12:5` and `:12-48,60-70` are accepted. Entries in `exclude` are paths relative to the spec root, and an entry ending in `/` excludes that directory. Every finding carries a `line` (1 when there is no better position), so JSON output always includes it.
244
242
 
245
243
  ### Check rules
246
244
 
@@ -265,32 +263,37 @@ crumbs check: 4 documents, 1 error, 1 warning
265
263
 
266
264
  ## Log
267
265
 
268
- The log is appended in one place (`docs/specs/log.md`) in chronological order. The title is **one sentence about the user outcome**, not the task name, and the body has three lines.
266
+ The log is appended in one place (`docs/specs/log.md`) in chronological order. The title is **one sentence about the user outcome**, not the task name, and the body has three lines. `log add` writes the entry and refuses titles or bodies that contain `<!--`.
269
267
 
270
268
  ```bash
271
- npx crumbs-spec log add --kind change "Cart quantity cap raised to 99" \
272
- --body "Result: a cart line holds up to 99. Reason: request SHOP-42. Document: [Quantity cap](shopping/cart.md#quantity-cap)"
269
+ npx crumbs-spec log add --kind change "<one sentence about the user outcome>" \
270
+ --body "Result: <what changed>. Reason: <why>. Document: [<policy>](<domain>/<document>.md#<anchor>)"
273
271
  ```
274
272
 
275
- `log add` refuses titles or bodies that contain `<!--`.
273
+ The entry written in usage example 5:
276
274
 
277
- When a `[needs confirmation]` question gets its answer, add a `decision` entry and put one decision link at the end of the confirmed policy. Instead of change-history tables inside documents, decisions accumulate in the log and documents only point at them. The slug drops the brackets, `|`, comma and colon, so the `|` leaves a double dash in the anchor.
275
+ ```markdown
276
+ ## [2026-11-03] change | A malformed email on registration, login and account update is rejected with 422 and is invalid
277
+ Result: a malformed email on registration, login and account update gets status 422 with {"errors": {"email": ["is invalid"]}}; 3 api documents updated and 1 open question remains about accepted address forms. Reason: code change in server/schemas/user.schema.ts, reported by the user. Document: [Email format](api/users/registration.md#email-format)
278
+ ```
279
+
280
+ When a `[needs confirmation]` question gets its answer, add a `decision` entry and put one decision link at the end of the confirmed policy. Instead of change-history tables inside documents, decisions accumulate in the log and documents only point at them. The slug drops the brackets, `|`, commas and colons, so the `|` leaves a double dash in the anchor. From usage example 3:
278
281
 
279
282
  ```markdown
280
- ## [2026-11-02] decision | Minimum order amount: 10,000 KRW comes from the shipping fee policy
281
- Result: the checkout button is disabled below 10,000 KRW. Reason: 2026-11-02 planning review. Document: [Minimum order amount](shopping/cart.md#minimum-order-amount)
283
+ ## [2026-11-03] decision | Popular tag list: most used first stays, ties are undefined, 10 tags are cut after sorting, and every viewer gets the same unpaginated list
284
+ Result: GET /api/tags keeps the most-used-first order, leaves the order of equally used tags undefined, applies the 10-tag limit after sorting, and returns the same list without pagination to every viewer. Reason: answers from the maintainer; existing clients may rely on most-used-first and the limit keeps the tag sidebar short. Document: [Popular tag list](api/articles/tag-list.md#popular-tag-list)
282
285
  ```
283
286
 
284
287
  ```markdown
285
- ### Minimum order amount
286
- The checkout button is disabled when the total is under 10,000 KRW. (decision: [2026-11-02](../log.md#2026-11-02-decision--minimum-order-amount-10000-krw-comes-from-the-shipping-fee-policy))
288
+ ### Popular tag list
289
+ The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first, and the server applies the 10-tag limit after sorting. … (decision: [2026-11-03](../../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list))
287
290
  ```
288
291
 
289
292
  The kinds are `ingest` (a source was applied), `query` (an answer fed back), `lint`, `drift`, `change` (a document changed) and `decision` (a question was settled).
290
293
 
291
294
  ## Skills
292
295
 
293
- `init --skills` installs the procedures an agent follows into `.claude/skills/<name>/SKILL.md` (Claude Code) and `.agents/skills/<name>/SKILL.md` (Codex). An existing `SKILL.md` is never overwritten; delete it and run `init --skills` again to upgrade. Claude Code reads the crumbs block only when `CLAUDE.md` contains `@AGENTS.md`.
296
+ `init --skills` installs the procedures an agent follows into `.claude/skills/<name>/SKILL.md` (Claude Code) and `.agents/skills/<name>/SKILL.md` (Codex). An existing `SKILL.md` is never overwritten; delete it and run `init --skills` again to upgrade. When Claude Code reads the crumbs block is described in step 2 of [Adding it to an existing project](#adding-it-to-an-existing-project).
294
297
 
295
298
  Each generated SKILL.md starts with a comment naming the crumbs-spec version that produced it. Skills and templates follow the package version: a minor release may change their text, a patch release does not. To upgrade, delete the file and run `init --skills` again.
296
299
 
@@ -303,52 +306,56 @@ Each generated SKILL.md starts with a comment naming the crumbs-spec version tha
303
306
 
304
307
  ## Usage examples
305
308
 
309
+ Every example below was actually run on the Nitro backend from the experiment, in the [`usage/`](https://github.com/Sienna94/crumbs-spec-conduit/tree/main/usage) workspace of crumbs-spec-conduit. Example 1 is the experiment's Opus 5.5 writer. Examples 2–5 are a Claude Sonnet 5.5 agent that got only the request, read `AGENTS.md` and picked the skill itself; the author answered its questions as the maintainer would. Each example that changed files is one commit, linked below.
310
+
306
311
  ### 1. Document existing code for the first time
307
312
 
308
313
  ```
309
- Document the code under src/cart/ with crumbs-writer in "document existing code" mode.
310
- The domain directory is docs/specs/shopping/. Leave unconfirmed policies as questions and finish the whole thing.
314
+ Document the code under ../vendor/nitro with crumbs-writer in "document existing code" mode,
315
+ from code and tests only. Leave unconfirmed policies as questions and finish the whole thing.
311
316
  ```
312
317
 
313
- The agent reads the index and templates, follows code and tests from the entry point, and produces `shopping/overview.md` plus the detail documents. Rules confirmed by tests become policies; rules that exist only in code become "right now …" statements with `[needs confirmation]` questions. It ends by running `check`, clearing errors and adding a log entry.
318
+ This is a shortened form of the experiment's [writer prompt](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/eval/prompts/writer.md). The writer followed the code from the route handlers, split the API into four subdirectories and produced 21 detail documents with their overviews. The repository has only two unit test files, so 6 policies came out confirmed by tests and 45 as `[needs confirmation]` questions. It ended with `check` and a log entry ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/572b0db)).
314
319
 
315
320
  ```
316
- crumbs check: 5 documents, 0 errors, 3 warnings
321
+ crumbs check: 28 documents, 0 errors, 21 warnings
317
322
  ```
318
323
 
319
- The three warnings are the three documents that still have open questions. Skimming their "Open questions" sections is enough to see what has to be decided.
324
+ The 21 warnings are the 21 detail documents that still have open questions. Their "Open questions" sections are the list of things the maintainer has to decide.
320
325
 
321
- ### 2. Reflect a code change
326
+ ### 2. Find an answer
322
327
 
323
328
  ```
324
- I raised the cart quantity limit from 99 to 199. Update the docs.
329
+ How many tags does GET /api/tags return, and in what order?
325
330
  ```
326
331
 
327
- The writer finds the owning document with `grep -rl 'src/cart/cart.ts' docs/specs` (the evidence section names the path), fixes the current-behavior section and the `### Quantity cap` policy, updates the value in the flow diagram, and logs `change | Cart quantity cap raised to 199`. If two documents look like owners it stops and asks which one is.
332
+ The finder went index → API overview → articles overview → [tag-list.md](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md), four spec documents and no code. It answered: at most 10 names, most used first, only tags that at least one article uses, no pagination. It also said that two points are still `[needs confirmation]`: the order of tags with the same count and the basis of the limit. No file changed.
328
333
 
329
334
  ### 3. Ask about what is unknown and record the answer as a decision
330
335
 
331
336
  ```
332
- I want to change the coupon stacking rule. What do I need to confirm first?
337
+ I want to change how the tag list is ordered. What do I need to confirm first?
333
338
  ```
334
339
 
335
- The interview skill lists the policies the request touches, separates those confirmed by code, tests or sources from those that are not, and turns the unconfirmed ones into questions. Once you answer, the writer rewrites the policy as confirmed and leaves a `decision` log entry and a decision link.
340
+ The interview skill listed the eight policies the request touches, marked three as confirmed by code, and turned the rest into seven questions, from "does 'tag list' mean GET /api/tags or the tagList inside articles" to "do existing clients depend on the current order". It stopped without editing anything. The answer: only GET /api/tags; keep most used first; ties stay undefined on purpose; the 10-tag limit stays and applies after sorting. The writer then confirmed the policy and added a `decision` entry and the decision link (see [Log](#log)). `check` caught two things on the way: the decision link pointed at `../log.md` instead of `../../log.md` (`broken-link`), and current behavior grew to seven steps without a diagram (`missing-flow`), so the writer added one ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/7b86052)).
336
341
 
337
342
  ### 4. Ingest a source document
338
343
 
339
344
  ```
340
- Apply docs/raw/coupon-policy-v3.pdf.
345
+ The upstream API spec changed. Apply docs/raw/realworld-b8a37f1-validate-email-format.diff.
341
346
  ```
342
347
 
343
- The ingest skill reads the source, finds the affected documents through the index, backlinks and evidence, and shows the list of intended changes first. Only after confirmation does it edit the owning documents and add an `ingest` entry. There is no automatic merge.
348
+ The source is the real upstream commit that added email-format validation to the RealWorld spec. The ingest skill read it, found the registration, login and account-update documents through the index and listed four claims. Then it stopped on a conflict: the source expects 422 "is invalid" for a malformed email, while the documents and the code say the format is not checked. Asked whether the source or the code wins, we chose the code, because documents describe current behavior. The skill wrote one `Email format` policy in the registration document with the current behavior and a question that cites the upstream spec, added one linking sentence to the login and update documents, and logged an `ingest` entry ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/130946a)). Nothing was edited before the change list was confirmed.
344
349
 
345
- ### 5. Find an answer
350
+ ### 5. Reflect a code change
346
351
 
347
352
  ```
348
- How many items can go into the cart?
353
+ I added email format validation to registration, login and account update
354
+ (server/schemas/user.schema.ts, not committed yet). A malformed email now gets 422
355
+ with {"errors":{"email":["is invalid"]}}. Update the docs.
349
356
  ```
350
357
 
351
- The finder goes index → shopping overview → cart document and answers with `### Quantity cap` as the source. For term or concept questions it checks the terms section of `concepts/overview.md` first. If the documents do not answer, it says "not in the documents" and names the closest one.
358
+ The writer found the owning document with `grep -rl 'user.schema' docs/specs`, since all three documents name that file under Evidence. It rewrote `Email format` as a confirmed policy, which closed the question from example 4, and updated the linking sentences in login and update and two flow diagrams. What the code did not settle, which addresses count as valid and whether a blank email also reports "is invalid", became a new question instead of a guess; a blank email does get both messages. The code and the documents are one commit ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/32fd2f3)).
352
359
 
353
360
  ### 6. Check in CI
354
361
 
@@ -394,6 +401,6 @@ Exit code 1 means there are errors. Warnings (`open-question`, `missing-flow` an
394
401
  | 2 | Four skills, `log add`, flow section, responsibility-size rules, terms and concept pages, decision log | done |
395
402
  | 3 | `crumbs reverse <path>` — a command that drafts from code (the writer skill does this today) | planned |
396
403
  | 4 | `crumbs drift --base <ref>` — finds documents whose evidence changed in a diff | planned |
397
- | 5 | Example app and a navigation-cost benchmark runner | planned |
404
+ | 5 | Public example ([crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit)) and a navigation-cost benchmark runner | example done, runner planned |
398
405
 
399
406
  The `lang` setting (`en` by default, `ko` for Korean) selects the language of the templates, skills and messages, so one repository uses one language.
package/dist/src/graph.js CHANGED
@@ -98,6 +98,11 @@ function dirsUpTo(start, specAbs) {
98
98
  }
99
99
  return out;
100
100
  }
101
+ // 원본 자료(rawDir 아래)는 코드가 아니므로 codeRoot가 아니라 저장소 루트 기준으로 해석한다.
102
+ function isUnderRawDir(path, rawDir) {
103
+ const normalized = path.replace(/^\.\//, '');
104
+ return normalized === rawDir || normalized.startsWith(`${rawDir}/`);
105
+ }
101
106
  export function buildGraph(root, config) {
102
107
  const specAbs = resolve(root, config.specDir);
103
108
  const indexAbs = join(specAbs, config.index);
@@ -145,7 +150,7 @@ export function buildGraph(root, config) {
145
150
  const evidencePaths = evidenceCandidates(scan, sections).map((candidate) => ({
146
151
  line: candidate.line,
147
152
  raw: candidate.raw,
148
- resolved: resolve(codeRootAbs, candidate.path),
153
+ resolved: resolve(isUnderRawDir(candidate.path, config.rawDir) ? root : codeRootAbs, candidate.path),
149
154
  }));
150
155
  const policies = sections
151
156
  .filter((section) => section.key === 'policies')
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"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"}
package/dist/src/init.js CHANGED
@@ -103,10 +103,10 @@ export function runInit(root, specDirOption, skillsOption, langOption) {
103
103
  out.push(m.updated('AGENTS.md'));
104
104
  else
105
105
  out.push(m.skipped('AGENTS.md'));
106
- // CLAUDE.md는 고치지 않고, 없거나 가져오기 줄이 없으면 안내한다.
107
- const claudeAbs = join(root, 'CLAUDE.md');
108
- if (!existsSync(claudeAbs) || !readFileSync(claudeAbs, 'utf8').includes('@AGENTS.md')) {
109
- out.push(m.claudeGuide);
106
+ // Claude Code는 CLAUDE.md가 있으면 AGENTS.md를 읽지 않는다. 고치지 않고, 가져오기 줄이 없을 때만 안내한다.
107
+ const claudeFiles = ['CLAUDE.md', '.claude/CLAUDE.md'].filter((file) => existsSync(join(root, file)));
108
+ if (claudeFiles.length > 0 && !claudeFiles.some((file) => readFileSync(join(root, file), 'utf8').includes('@AGENTS.md'))) {
109
+ out.push(m.claudeGuide(claudeFiles[0]));
110
110
  }
111
111
  out.push(m.next);
112
112
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
@@ -54,7 +54,7 @@ Example
54
54
  created: (path) => `created: ${path}`,
55
55
  updated: (path) => `updated: ${path}`,
56
56
  next: 'next: npx crumbs-spec check',
57
- claudeGuide: 'guide: add "@AGENTS.md" to CLAUDE.md so Claude Code reads the crumbs rules',
57
+ claudeGuide: (file) => `guide: Claude Code reads ${file} instead of AGENTS.md; add "@AGENTS.md" to ${file} so it reads the crumbs rules`,
58
58
  agentsMarkers: 'AGENTS.md: crumbs markers are not paired',
59
59
  rootMissing: (root) => `root directory not found: ${root}`,
60
60
  fileMissing: (where) => `crumbs.json not found in ${where}. Run "npx crumbs-spec init" first.`,
@@ -152,7 +152,7 @@ log add 옵션
152
152
  created: (path) => `생성: ${path}`,
153
153
  updated: (path) => `갱신: ${path}`,
154
154
  next: '다음: npx crumbs-spec check',
155
- claudeGuide: '안내: Claude Code가 crumbs 규칙을 읽도록 CLAUDE.md에 "@AGENTS.md"를 추가하세요',
155
+ claudeGuide: (file) => `안내: Claude Code는 ${file} 파일이 있으면 AGENTS.md를 읽지 않으니, ${file}에 "@AGENTS.md"를 추가하세요`,
156
156
  agentsMarkers: 'AGENTS.md: crumbs 표시가 짝이 맞지 않음',
157
157
  rootMissing: (root) => `저장소 루트 디렉터리를 찾을 수 없음: ${root}`,
158
158
  fileMissing: (where) => `${where}에 crumbs.json이 없음. 먼저 "npx crumbs-spec init"을 실행하세요.`,
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ function agentsBlockKo(p) {
18
18
  - 모든 정책은 정확히 하나의 상세 문서가 소유한다. 아무도 문서 갱신을 요청하지 않았더라도
19
19
  코드와 같은 변경에서 그 문서를 갱신한다.
20
20
  - 변경이 아니라 현재 동작을 설명한다. 변경 이력이나 요구사항 ID를 넣지 않는다.
21
- - 근거로 삼은 코드를 "근거" 절에 적는다. 링크는 양방향으로 유지한다: 상세 문서는 개요와
21
+ - 근거로 삼은 코드를 "근거" 절에 \`crumbs.json\`의 \`codeRoot\` 기준 경로로 적고, 원본 자료는 \`${p.rawDir}/<파일>\`로 적는다. 링크는 양방향으로 유지한다: 상세 문서는 개요와
22
22
  관련 문서로 링크하고, 그 문서들도 되돌아오는 링크를 둔다.
23
23
  - 코드·테스트·승인된 자료로 확인할 수 없는 정책은 \`[확인 필요]\`와 질문을 적는다.
24
24
  추측하지 않는다.
@@ -42,7 +42,7 @@ Rules when behavior changes:
42
42
  - Every policy is owned by exactly one detail document. Even if nobody asks you to update the document,
43
43
  update it in the same change as the code.
44
44
  - Describe the current behavior, not the change. Do not add change history or requirement IDs.
45
- - List the code you relied on in the "Evidence" section. Keep links in both directions: detail documents link to the overview
45
+ - List the code you relied on in the "Evidence" section, with paths relative to \`codeRoot\` in \`crumbs.json\`; cite source material as \`${p.rawDir}/<file>\`. Keep links in both directions: detail documents link to the overview
46
46
  and related documents, and those documents link back.
47
47
  - If code, tests, or approved material cannot confirm a policy, write \`[needs confirmation]\` and a question.
48
48
  Do not guess.
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/templates/agents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAShD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,IAAU;IACpD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;WAGb,CAAC,CAAC,OAAO;OACb,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,MAAM;;;;;;;;;;;;;6BAavB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;;EAI7C,UAAU,EAAE,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;8BAGM,CAAC,CAAC,OAAO;gBACvB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,yCAAyC,CAAC,CAAC,MAAM;;;;;;;;;;;;;4EAaT,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;EAG5F,UAAU,EAAE,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/templates/agents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAShD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,IAAU;IACpD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;WAGb,CAAC,CAAC,OAAO;OACb,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,MAAM;;;;;;;;;yEASqB,CAAC,CAAC,MAAM;;;;6BAIpD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;;EAI7C,UAAU,EAAE,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;8BAGM,CAAC,CAAC,OAAO;gBACvB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,yCAAyC,CAAC,CAAC,MAAM;;;;;;;;;6IASwD,CAAC,CAAC,MAAM;;;;4EAIzE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;EAG5F,UAAU,EAAE,CAAC;AACf,CAAC"}
@@ -51,7 +51,7 @@ A branch with two or more comparison axes, such as channel or state, goes in a t
51
51
  then write [needs confirmation] and the question on the next line>
52
52
 
53
53
  ## Evidence
54
- - \`<path/to/file.ext>\` — <what it implements> (the path must contain a "/"; write a root file as ./file)
54
+ - \`<path/to/file.ext>\` — <what it implements> (code paths are relative to codeRoot in crumbs.json and source material is written as ${p.rawDir}/<file>; the path must contain a "/"; write a root file as ./file)
55
55
 
56
56
  ## Open questions
57
57
  - [needs confirmation] [<policy name>](#<policy-anchor>) — <question that would change behavior or scope>
@@ -1 +1 @@
1
- {"version":3,"file":"en.js","sourceRoot":"","sources":["../../../src/templates/en.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;mDAOY,CAAC,CAAC,QAAQ;;;UAGnD,CAAC,CAAC,GAAG;CACd;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eAC3B,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;oBAgBnE,CAAC,CAAC,KAAK;CAC1B;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eACzB,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;wBAwB/D,CAAC,CAAC,QAAQ;CACjC;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;0EAG+B,CAAC,CAAC,OAAO;CAClF;CACA,CAAC"}
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../../src/templates/en.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;mDAOY,CAAC,CAAC,QAAQ;;;UAGnD,CAAC,CAAC,GAAG;CACd;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eAC3B,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;oBAgBnE,CAAC,CAAC,KAAK;CAC1B;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eACzB,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;wIAkBiD,CAAC,CAAC,MAAM;;;;;;wBAMxH,CAAC,CAAC,QAAQ;CACjC;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;0EAG+B,CAAC,CAAC,OAAO;CAClF;CACA,CAAC"}
@@ -50,7 +50,7 @@ export const ko = {
50
50
  다음 줄에 [확인 필요]와 질문을 적는다>
51
51
 
52
52
  ## 근거
53
- - \`<path/to/file.ext>\` — <구현하는 내용> (경로에는 /가 있어야 하며 루트 파일은 ./파일 로 쓴다)
53
+ - \`<path/to/file.ext>\` — <구현하는 내용> (코드 경로는 crumbs.json의 codeRoot 기준이고 원본 자료는 ${p.rawDir}/<파일>로 쓴다. 경로에는 /가 있어야 하며 루트 파일은 ./파일 로 쓴다)
54
54
 
55
55
  ## 확인 필요 사항
56
56
  - [확인 필요] [<정책 이름>](#<정책-앵커>) — <동작이나 범위를 바꾸는 질문>
@@ -1 +1 @@
1
- {"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/templates/ko.ts"],"names":[],"mappings":"AAQA,qDAAqD;AACrD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;oCAOH,CAAC,CAAC,QAAQ;;;SAGrC,CAAC,CAAC,GAAG;CACb;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAChC,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;gBAgBjC,CAAC,CAAC,KAAK;CACtB;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAC9B,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;eAwBlC,CAAC,CAAC,QAAQ;CACxB;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;iCAGV,CAAC,CAAC,OAAO;;CAEzC;CACA,CAAC"}
1
+ {"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/templates/ko.ts"],"names":[],"mappings":"AAQA,qDAAqD;AACrD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;oCAOH,CAAC,CAAC,QAAQ;;;SAGrC,CAAC,CAAC,GAAG;CACb;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAChC,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;gBAgBjC,CAAC,CAAC,KAAK;CACtB;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAC9B,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;iFAkBgC,CAAC,CAAC,MAAM;;;;;;eAM1E,CAAC,CAAC,QAAQ;CACxB;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;iCAGV,CAAC,CAAC,OAAO;;CAEzC;CACA,CAAC"}
@@ -13,7 +13,7 @@ Writes or updates a living spec document that explains one responsibility. The d
13
13
 
14
14
  1. \`${p.specDir}/${p.index}\`. Always read it first. It lists the domains and overview documents.
15
15
  2. The \`${p.overview}\` of the domain the request touches, then the detail documents and their "Related" sections.
16
- 3. \`crumbs.json\`. If \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, or \`headings\` differ from the defaults, use those values.
16
+ 3. \`crumbs.json\`. If \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, or \`headings\` differ from the defaults, use those values. Code and test paths under "Evidence" are relative to \`codeRoot\` (the repository root by default); source material under \`${p.rawDir}/\` is always written from the repository root.
17
17
  4. \`${p.specDir}/templates/detail.md\` and \`${p.specDir}/templates/overview.md\`. Start new documents from these templates.
18
18
 
19
19
  ## Choose a mode
@@ -29,7 +29,7 @@ Writes or updates a living spec document that explains one responsibility. The d
29
29
  2. If more than one document looks like the owner, stop and ask which one owns it. Do not write one policy in two documents.
30
30
  3. Rewrite "Current behavior" as the behavior after the change. Do not add historical narration such as "previously … now …", change dates, or requirement IDs. If the diagram or table under "Flow" holds that behavior, update it too.
31
31
  4. Under "Policies", edit the body of each changed policy, add a new policy as \`### policy name\`, and delete a policy that was removed. If a policy with the same name already exists in another document, that document owns it: edit it there and keep only a link in this document. A confirmed policy may end with one decision link, \`(decision: [YYYY-MM-DD](../${p.log}#<entry-anchor>))\`, after its last sentence. This is the only exception to the rule against change history. Do not write the reason or the source; the link text carries only the decision date. The entry anchor is the slug of the \`decision\` entry title (format in step 1 of "Document existing code").
32
- 5. Update the code and test paths under "Evidence" to match the changed code. Write each path as a backtick path relative to the repository root. If a line range is needed, append it like \`src/auth/session.ts:12-48\`. Attach only one range to each path; if one file has several ranges, list them on separate lines. A path must contain a "/"; write a repository-root file as \`./package.json\`.
32
+ 5. Update the code and test paths under "Evidence" to match the changed code. Write each path as a backtick path relative to \`codeRoot\` in \`crumbs.json\` (the repository root by default). If a line range is needed, append it like \`src/auth/session.ts:12-48\`. Attach only one range to each path; if one file has several ranges, list them on separate lines. A path must contain a "/"; write a repository-root file as \`./package.json\`.
33
33
  6. Do not describe a policy that code, tests, or material the user supplied does not confirm. Write it as \`[needs confirmation]\` and a question, in the format of step 5 of "Document existing code".
34
34
  7. Keep links in both directions. If you added a link to another detail document, add the link back under that document's "Related". If a document's title or scope changed, update its one-line entry in the overview's "Documents" and its line in the index.
35
35
  8. Add a log entry. The title is one sentence stating the user-visible result, not the task name. The body is written in the order \`Result:\`, \`Reason:\`, \`Document:\` and does not list files. If the same task touched several documents, group it into one entry per domain and give the count under \`Result:\`.
@@ -116,7 +116,7 @@ Finds an answer in the spec documents and answers with the source attached. As s
116
116
  3. Read "Documents" in that domain's \`${p.overview}\` and pick the detail document whose responsibility matches. If the question's wording appears as an alias under "Terms", the link on that line is the owning document.
117
117
  4. Read "Current behavior" and "Policies" in the detail document. If the policy's \`### heading\` is here, this document is the owner. Stop here.
118
118
  5. If not, follow the document's "Related" links one step only. If it is still not there, the question is not in the documents. Do not search every other domain; answer "not in the documents".
119
- 6. If the documents are silent and the user still wants an answer, read the code paths under "Evidence" and answer. State that the answer came from code.
119
+ 6. If the documents are silent and the user still wants an answer, read the code paths under "Evidence" (relative to \`codeRoot\` in \`crumbs.json\`) and answer. State that the answer came from code.
120
120
 
121
121
  ## How to answer
122
122
 
@@ -233,7 +233,7 @@ Applies one source file to the spec documents. The material is read only and is
233
233
  - From the "Related" section of each document you found, check one more step for documents the change carries to.
234
234
  4. Make the change list and show it. For each item, give the owning document, the section ("Current behavior" or \`### policy name\`), the current wording → the wording the material implies, and the part of the material that is the evidence. If the material conflicts with a current document, mark it as a conflict and ask which is right. If the material states a new policy that no document has, mark it "new" and propose which document should own it.
235
235
  5. Wait for confirmation. Do not change documents without it. If only some items are approved, reflect only the approved items.
236
- 6. Update the owning documents. Edit only one owning document per policy; in other documents keep only a link to that policy. When a question policy is confirmed, leave a \`decision\` entry and put a decision link at the end of the confirmed policy text (format in step 1 of crumbs-writer "Document existing code"). If the material confirms a value, write it as a statement; if the material is ambiguous, write it as a \`[needs confirmation]\` question (format in step 5 of crumbs-writer "Document existing code"). Cite the material in "Evidence" as a backtick path (\`${p.rawDir}/<file>\` — \`check\` confirms that it exists). If you need to point to a specific part of the material, give the page or section after \` — \`.
236
+ 6. Update the owning documents. Edit only one owning document per policy; in other documents keep only a link to that policy. When a question policy is confirmed, leave a \`decision\` entry and put a decision link at the end of the confirmed policy text (format in step 1 of crumbs-writer "Document existing code"). If the material confirms a value, write it as a statement; if the material is ambiguous, write it as a \`[needs confirmation]\` question (format in step 5 of crumbs-writer "Document existing code"). Cite the material in "Evidence" as a backtick path (\`${p.rawDir}/<file>\`, written from the repository root even when \`codeRoot\` is set — \`check\` confirms that it exists). If you need to point to a specific part of the material, give the page or section after \` — \`.
237
237
  7. If the scope changed, update the one-line entry in the overview's "Documents" and in the index. If you created a new document, follow steps 3 to 6 of crumbs-writer "Document existing code": start from the template and link it from the overview and the index.
238
238
  8. Add a log entry. Name the material file and the changed document in the body.
239
239
  \`npx crumbs-spec log add --kind ingest "<one sentence stating the user-visible result>" --body "Result: <changed user-visible result>. Reason: ${p.rawDir}/<file>. Document: [<policy name>](<domain>/<document>.md#<anchor>)"\`
@@ -1 +1 @@
1
- {"version":3,"file":"skills-en.js","sourceRoot":"","sources":["../../../src/templates/skills-en.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,kFAAkF;AAElF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;yFAE4C,CAAC,CAAC,OAAO;;;;;;;;;OAS3F,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;WAChB,CAAC,CAAC,QAAQ;;OAEd,CAAC,CAAC,OAAO,gCAAgC,CAAC,CAAC,OAAO;;;;;;;;;;;sLAW6H,CAAC,CAAC,OAAO,gEAAgE,CAAC,CAAC,OAAO,mFAAmF,CAAC,CAAC,OAAO;;;2WAGO,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;gIAiBhP,CAAC,CAAC,QAAQ;8JACoB,CAAC,CAAC,OAAO;wBAC/I,CAAC,CAAC,OAAO,ihBAAihB,CAAC,CAAC,QAAQ;kHAC1c,CAAC,CAAC,GAAG;;;0BAG7F,CAAC,CAAC,OAAO,4DAA4D,CAAC,CAAC,OAAO,sCAAsC,CAAC,CAAC,QAAQ;gCACxH,CAAC,CAAC,OAAO;0BACf,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;mJA0BgH,CAAC,CAAC,QAAQ,6CAA6C,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+DAA+D,CAAC,CAAC,KAAK;;;;;;;;;;;8BAWtQ,CAAC,CAAC,MAAM;;;;;;;;gEAQ0B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACjF,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;iFAEoC,CAAC,CAAC,OAAO;;;;;;;;;YAS9E,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+HAA+H,CAAC,CAAC,OAAO;+GACzD,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;yCACtG,CAAC,CAAC,QAAQ;;;;;;;8EAO2B,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCtF,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;YAWpC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,QAAQ;;;gDAGZ,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CvD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;wDAEW,CAAC,CAAC,MAAM;;;;;;;;;sFASsB,CAAC,CAAC,MAAM,kEAAkE,CAAC,CAAC,MAAM;;;gBAGxJ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,QAAQ;6EACU,CAAC,CAAC,OAAO;oIAC8C,CAAC,CAAC,OAAO;;;;2jBAI8a,CAAC,CAAC,MAAM;;;qJAG9a,CAAC,CAAC,MAAM;;;;;;;+CAO9G,CAAC,CAAC,MAAM;;;;;;CAMtD,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
1
+ {"version":3,"file":"skills-en.js","sourceRoot":"","sources":["../../../src/templates/skills-en.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,kFAAkF;AAElF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;yFAE4C,CAAC,CAAC,OAAO;;;;;;;;;OAS3F,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;WAChB,CAAC,CAAC,QAAQ;iQAC4O,CAAC,CAAC,MAAM;OAClQ,CAAC,CAAC,OAAO,gCAAgC,CAAC,CAAC,OAAO;;;;;;;;;;;sLAW6H,CAAC,CAAC,OAAO,gEAAgE,CAAC,CAAC,OAAO,mFAAmF,CAAC,CAAC,OAAO;;;2WAGO,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;gIAiBhP,CAAC,CAAC,QAAQ;8JACoB,CAAC,CAAC,OAAO;wBAC/I,CAAC,CAAC,OAAO,ihBAAihB,CAAC,CAAC,QAAQ;kHAC1c,CAAC,CAAC,GAAG;;;0BAG7F,CAAC,CAAC,OAAO,4DAA4D,CAAC,CAAC,OAAO,sCAAsC,CAAC,CAAC,QAAQ;gCACxH,CAAC,CAAC,OAAO;0BACf,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;mJA0BgH,CAAC,CAAC,QAAQ,6CAA6C,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+DAA+D,CAAC,CAAC,KAAK;;;;;;;;;;;8BAWtQ,CAAC,CAAC,MAAM;;;;;;;;gEAQ0B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACjF,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;iFAEoC,CAAC,CAAC,OAAO;;;;;;;;;YAS9E,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+HAA+H,CAAC,CAAC,OAAO;+GACzD,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;yCACtG,CAAC,CAAC,QAAQ;;;;;;;8EAO2B,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCtF,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;YAWpC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,QAAQ;;;gDAGZ,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CvD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;wDAEW,CAAC,CAAC,MAAM;;;;;;;;;sFASsB,CAAC,CAAC,MAAM,kEAAkE,CAAC,CAAC,MAAM;;;gBAGxJ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,QAAQ;6EACU,CAAC,CAAC,OAAO;oIAC8C,CAAC,CAAC,OAAO;;;;2jBAI8a,CAAC,CAAC,MAAM;;;qJAG9a,CAAC,CAAC,MAAM;;;;;;;+CAO9G,CAAC,CAAC,MAAM;;;;;;CAMtD,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
@@ -14,7 +14,7 @@ description: crumbs 스펙 문서(${p.specDir}/ 아래의 책임 문서)를 쓰
14
14
 
15
15
  1. \`${p.specDir}/${p.index}\`. 매번 먼저 읽는다. 도메인과 개요 문서의 목록이다.
16
16
  2. 요청이 건드리는 도메인의 \`${p.overview}\`, 그다음 상세 문서와 그 문서의 "관련 문서".
17
- 3. \`crumbs.json\`. \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, \`headings\`가 기본값과 다르면 그 값을 쓴다.
17
+ 3. \`crumbs.json\`. \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, \`headings\`가 기본값과 다르면 그 값을 쓴다. "근거"의 코드·테스트 경로는 \`codeRoot\`(기본값은 저장소 루트) 기준이고, \`${p.rawDir}/\` 아래 원본 자료는 언제나 저장소 루트 기준으로 쓴다.
18
18
  4. \`${p.specDir}/templates/detail.md\`와 \`${p.specDir}/templates/overview.md\`. 새 문서는 이 템플릿에서 시작한다.
19
19
 
20
20
  ## 모드 고르기
@@ -30,7 +30,7 @@ description: crumbs 스펙 문서(${p.specDir}/ 아래의 책임 문서)를 쓰
30
30
  2. 소유 문서가 둘 이상으로 보이면 멈추고 어느 문서가 소유자인지 묻는다. 정책 하나를 두 문서에 적지 않는다.
31
31
  3. "현재 동작"을 바뀐 뒤의 동작으로 고쳐 쓴다. "이전에는 … 지금은 …" 같은 이력 서술, 변경 날짜, 요구사항 ID를 넣지 않는다. "흐름"의 도식·표가 그 동작을 담고 있으면 같이 고친다.
32
32
  4. "정책"에서 바뀐 정책의 본문을 고치고, 새 정책은 \`### 정책 이름\`으로 더하고, 없어진 정책은 지운다. 같은 이름의 정책이 다른 문서에 이미 있으면 그 문서가 소유자이므로 거기서 고치고, 이 문서에는 링크만 둔다. 확정된 정책은 본문 마지막 문장 뒤에 결정 링크 \`(결정: [YYYY-MM-DD](../${p.log}#<항목 앵커>))\`를 하나 둘 수 있다. 이것이 변경 이력을 넣지 않는다는 규칙의 유일한 예외다. 이유와 원본은 적지 않고, 링크 글자에 결정 날짜만 쓴다. 항목 앵커는 \`decision\` 항목 제목의 슬러그다(형식은 "기존 코드 문서화" 1단계).
33
- 5. "근거"의 코드·테스트 경로를 바뀐 코드에 맞춘다. 경로는 저장소 루트 기준 백틱 경로로 적고, 줄 범위가 필요하면 \`src/auth/session.ts:12-48\`처럼 붙인다. 범위는 경로 하나에 하나만 붙이고, 한 파일에 범위가 여럿이면 줄을 나눠 적는다. 경로에는 \`/\`가 있어야 하며 루트 파일은 \`./package.json\`처럼 쓴다.
33
+ 5. "근거"의 코드·테스트 경로를 바뀐 코드에 맞춘다. 경로는 \`crumbs.json\`의 \`codeRoot\`(기본값은 저장소 루트) 기준 백틱 경로로 적고, 줄 범위가 필요하면 \`src/auth/session.ts:12-48\`처럼 붙인다. 범위는 경로 하나에 하나만 붙이고, 한 파일에 범위가 여럿이면 줄을 나눠 적는다. 경로에는 \`/\`가 있어야 하며 루트 파일은 \`./package.json\`처럼 쓴다.
34
34
  6. 코드·테스트·사용자가 준 자료로 확인되지 않은 정책은 서술하지 않고 "기존 코드 문서화" 5번 형식대로 \`[확인 필요]\`와 질문으로 적는다.
35
35
  7. 링크를 양방향으로 맞춘다. 다른 상세 문서로 링크를 더했으면 그 문서의 "관련 문서"에 되돌아오는 링크를 더한다. 문서 제목이나 범위가 바뀌었으면 개요의 "문서 목록" 한 줄과 인덱스의 한 줄을 고친다.
36
36
  8. 로그 항목을 추가한다. 제목은 작업명이 아니라 사용자 결과 한 문장이고, 본문은 \`결과:\`·\`이유:\`·\`문서:\` 순서로 쓰며 파일 목록은 적지 않는다. 같은 작업을 여러 문서에 반복했으면 도메인마다 한 항목으로 묶고 \`결과:\`에 수량을 적는다.
@@ -119,7 +119,7 @@ description: crumbs 스펙 문서(${p.specDir}/)에서 현재 동작과 정책
119
119
  3. 그 도메인의 \`${p.overview}\`에서 "문서 목록"을 읽고 책임이 맞는 상세 문서를 고른다. 질문의 표현이 "용어" 절의 별칭에 있으면 그 줄의 링크가 소유 문서다.
120
120
  4. 상세 문서의 "현재 동작"과 "정책"을 읽는다. 질문한 정책의 \`### 제목\`이 여기 있으면 이 문서가 소유자다. 여기서 멈춘다.
121
121
  5. 없으면 그 문서의 "관련 문서"를 한 단계만 따라간다. 그래도 없으면 질문은 문서에 없는 것이다. 다른 도메인을 모두 뒤지지 말고 "문서에 없음"으로 답한다.
122
- 6. 문서가 침묵하고 사용자가 원하면 "근거"의 코드 경로를 읽어 답한다. 이때 답이 코드에서 왔다고 밝힌다.
122
+ 6. 문서가 침묵하고 사용자가 원하면 "근거"의 코드 경로(\`crumbs.json\`의 \`codeRoot\` 기준)를 읽어 답한다. 이때 답이 코드에서 왔다고 밝힌다.
123
123
 
124
124
  ## 답하는 방식
125
125
 
@@ -238,7 +238,7 @@ description: ${p.rawDir}/ 아래에 새로 놓인 원본 자료(계약서, 기
238
238
  - 찾은 문서의 "관련 문서"에서 영향이 이어지는 문서를 한 단계 더 본다.
239
239
  4. 변경 목록을 만들어 보여 준다. 항목마다 소유 문서, 절("현재 동작" 또는 \`### 정책 이름\`), 지금 서술 → 자료에 따른 서술, 자료의 어느 부분이 근거인지를 적는다. 자료와 현재 문서가 충돌하면 충돌로 표시하고 어느 쪽이 맞는지 묻는다. 자료가 기존 문서에 없는 새 정책을 말하면 "신규"로 표시하고 어느 문서가 소유할지 제안한다.
240
240
  5. 확인을 기다린다. 확인 없이 문서를 바꾸지 않는다. 일부만 승인되면 승인된 항목만 반영한다.
241
- 6. 소유 문서를 갱신한다. 정책마다 소유 문서 하나만 고치고, 다른 문서에는 그 정책으로 가는 링크만 둔다. 질문 정책이 확정되면 \`decision\` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크를 둔다. 자료가 값을 확정하면 서술로 적고, 자료가 모호하면 \`[확인 필요]\` 질문으로 적는다(형식은 crumbs-writer "기존 코드 문서화" 5번). "근거"에 자료를 백틱 경로로 인용한다(\`${p.rawDir}/<파일>\` — \`check\`가 존재를 확인한다). 자료의 특정 부분을 가리켜야 하면 \` — \` 뒤에 쪽이나 절을 적는다.
241
+ 6. 소유 문서를 갱신한다. 정책마다 소유 문서 하나만 고치고, 다른 문서에는 그 정책으로 가는 링크만 둔다. 질문 정책이 확정되면 \`decision\` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크를 둔다. 자료가 값을 확정하면 서술로 적고, 자료가 모호하면 \`[확인 필요]\` 질문으로 적는다(형식은 crumbs-writer "기존 코드 문서화" 5번). "근거"에 자료를 백틱 경로로 인용한다(\`${p.rawDir}/<파일>\`, \`codeRoot\`를 바꿨어도 저장소 루트 기준 — \`check\`가 존재를 확인한다). 자료의 특정 부분을 가리켜야 하면 \` — \` 뒤에 쪽이나 절을 적는다.
242
242
  7. 범위가 바뀌었으면 개요의 "문서 목록" 한 줄과 인덱스의 한 줄을 고친다. 새 문서를 만들었으면 crumbs-writer의 "기존 코드 문서화" 3~6단계대로 템플릿에서 시작해 개요와 인덱스에 연결한다.
243
243
  8. 로그 항목을 추가한다. 본문에 자료 파일과 수정한 문서를 적는다.
244
244
  \`npx crumbs-spec log add --kind ingest "<사용자 결과 한 문장>" --body "결과: <바뀐 사용자 결과>. 이유: ${p.rawDir}/<파일>. 문서: [<정책 이름>](<도메인>/<문서>.md#<앵커>)"\`
@@ -1 +1 @@
1
- {"version":3,"file":"skills-ko.js","sourceRoot":"","sources":["../../../src/templates/skills-ko.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,uDAAuD;AAEvD,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;qBACN,CAAC,CAAC,QAAQ;;OAExB,CAAC,CAAC,OAAO,6BAA6B,CAAC,CAAC,OAAO;;;;;;;;;;;kFAW4B,CAAC,CAAC,OAAO,qCAAqC,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,OAAO;;;oLAGD,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;oEAiBrH,CAAC,CAAC,QAAQ;sEACR,CAAC,CAAC,OAAO;uIACwD,CAAC,CAAC,OAAO,kIAAkI,CAAC,CAAC,QAAQ;uEACrN,CAAC,CAAC,GAAG;;;kBAG1D,CAAC,CAAC,OAAO,wBAAwB,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,QAAQ;gBACzF,CAAC,CAAC,OAAO;SAChB,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2BT,CAAC,CAAC,QAAQ,6DAA6D,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iCAAiC,CAAC,CAAC,QAAQ,kDAAkD,CAAC,CAAC,KAAK;;;;;;;;;;;MAWlM,CAAC,CAAC,MAAM;;;;;;;;mCAQqB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACpD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,0DAA0D,CAAC,CAAC,OAAO;0BACpE,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;cAC5C,CAAC,CAAC,QAAQ;;;;;;;iCAOS,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCzC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;;OAYzC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,QAAQ;;;uBAGzC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C9B,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;eAE9B,CAAC,CAAC,MAAM;;;;;;;;;;iCAUU,CAAC,CAAC,MAAM,4CAA4C,CAAC,CAAC,MAAM;;;SAGpF,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,QAAQ;0CACX,CAAC,CAAC,OAAO;mEACgB,CAAC,CAAC,OAAO;;;;uOAI2J,CAAC,CAAC,MAAM;;;0FAGrJ,CAAC,CAAC,MAAM;;;;;;;MAO5F,CAAC,CAAC,MAAM;;;;;;CAMb,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
1
+ {"version":3,"file":"skills-ko.js","sourceRoot":"","sources":["../../../src/templates/skills-ko.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,uDAAuD;AAEvD,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;qBACN,CAAC,CAAC,QAAQ;yJAC0H,CAAC,CAAC,MAAM;OAC1J,CAAC,CAAC,OAAO,6BAA6B,CAAC,CAAC,OAAO;;;;;;;;;;;kFAW4B,CAAC,CAAC,OAAO,qCAAqC,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,OAAO;;;oLAGD,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;oEAiBrH,CAAC,CAAC,QAAQ;sEACR,CAAC,CAAC,OAAO;uIACwD,CAAC,CAAC,OAAO,kIAAkI,CAAC,CAAC,QAAQ;uEACrN,CAAC,CAAC,GAAG;;;kBAG1D,CAAC,CAAC,OAAO,wBAAwB,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,QAAQ;gBACzF,CAAC,CAAC,OAAO;SAChB,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2BT,CAAC,CAAC,QAAQ,6DAA6D,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iCAAiC,CAAC,CAAC,QAAQ,kDAAkD,CAAC,CAAC,KAAK;;;;;;;;;;;MAWlM,CAAC,CAAC,MAAM;;;;;;;;mCAQqB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACpD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,0DAA0D,CAAC,CAAC,OAAO;0BACpE,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;cAC5C,CAAC,CAAC,QAAQ;;;;;;;iCAOS,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCzC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;;OAYzC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,QAAQ;;;uBAGzC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C9B,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;eAE9B,CAAC,CAAC,MAAM;;;;;;;;;;iCAUU,CAAC,CAAC,MAAM,4CAA4C,CAAC,CAAC,MAAM;;;SAGpF,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,QAAQ;0CACX,CAAC,CAAC,OAAO;mEACgB,CAAC,CAAC,OAAO;;;;uOAI2J,CAAC,CAAC,MAAM;;;0FAGrJ,CAAC,CAAC,MAAM;;;;;;;MAO5F,CAAC,CAAC,MAAM;;;;;;CAMb,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crumbs-spec",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Living specs for coding agents: one owner per policy, a machine-checked link graph, and skills that write, find, ask and ingest.",
5
5
  "keywords": [
6
6
  "spec",
@@ -42,7 +42,7 @@
42
42
  "build": "tsc -p tsconfig.json",
43
43
  "prepare": "npm run build",
44
44
  "postbuild": "node -e \"require('fs').chmodSync('dist/src/cli.js', 0o755)\"",
45
- "test": "npm run build && node --test dist/test/",
45
+ "test": "npm run build && node --test dist/test/*.test.js",
46
46
  "prepublishOnly": "npm test"
47
47
  },
48
48
  "devDependencies": {