@simplysm/sd-claude 14.0.57 → 14.0.58
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/claude/references/sd-simplysm-v14/angular/ui-data/sd-crud-list.md +99 -1
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +20 -0
- package/claude/references/sd-simplysm-v14/sd-claude/assets.md +1 -1
- package/claude/rules/sd-claude-rules.md +2 -2
- package/claude/rules/sd-response-format.md +1 -0
- package/claude/settings.json +0 -2
- package/claude/skills/sd-check/SKILL.md +3 -3
- package/claude/skills/{sd-inner-clarify → sd-clarify}/SKILL.md +24 -23
- package/claude/skills/sd-commit/SKILL.md +3 -11
- package/claude/skills/sd-debug/SKILL.md +1 -1
- package/claude/skills/sd-deliverable/SKILL.md +1 -1
- package/claude/skills/sd-dev/SKILL.md +1 -7
- package/claude/skills/sd-plan/SKILL.md +132 -77
- package/claude/skills/sd-prompt/SKILL.md +2 -2
- package/claude/skills/sd-refactor/SKILL.md +2 -2
- package/claude/skills/sd-review/SKILL.md +4 -4
- package/claude/skills/sd-tdd/SKILL.md +2 -3
- package/claude/skills/sd-wbs/SKILL.md +109 -55
- package/package.json +1 -1
|
@@ -182,7 +182,7 @@ viewType에 따라 렌더링 위치가 달라진다:
|
|
|
182
182
|
| `item` | `TItem` | 현재 행 항목 (명시적 이름) |
|
|
183
183
|
| `index` | `number` | 행 인덱스 |
|
|
184
184
|
| `depth` | `number` | 트리 데이터의 중첩 깊이 |
|
|
185
|
-
| `edit` | `boolean` | 현재 행이 편집 모드인지 여부. 행 클릭(또는 더블클릭) 시 `true`가 된다. `SdTextfield`의 `[readonly]`에 `!edit`을 바인딩하여 인라인 편집을 구현한다. |
|
|
185
|
+
| `edit` | `boolean` | 현재 행이 편집 모드인지 여부. 행 클릭(또는 더블클릭) 시 `true`가 된다. `SdTextfield`의 `[readonly]`에 `!edit`을 바인딩하여 인라인 편집을 구현한다. **`SdSelect`/`SdSharedDataSelect`/`SdCheckbox`/`SdButton`류는 `readonly` 입력 자체가 없으며 클릭 한 번에 즉시 동작하므로 `let-edit`을 받지 않고 `[disabled]="!canEdit()"`만 사용한다 (자세한 내용은 [`sd-sheet.md`](./sd-sheet.md)의 "컨트롤별 `edit` 모드 처리" 표 참조).** |
|
|
186
186
|
|
|
187
187
|
```html
|
|
188
188
|
<!-- 읽기 전용 셀 -->
|
|
@@ -592,6 +592,88 @@ export class CustomerList implements SdSelectModal<number> {
|
|
|
592
592
|
</sd-crud-list>
|
|
593
593
|
```
|
|
594
594
|
|
|
595
|
+
## Usage: 외부 input(초기 필터)을 받는 모달
|
|
596
|
+
|
|
597
|
+
`SdSelectModal`로도 사용되면서 동시에 페이지 라우팅으로도 진입 가능한 컴포넌트는, 호출자가 `inputs`로 강제 주입하는 초기 필터(`includeCustomerIds`, `includeGoodsIds`, `excludeIds` 등)와 사용자가 화면에서 변경하는 `filter`/`lastFilter`가 같은 키를 공유한다. 이때 effect를 **두 개로 분리**해야 한다.
|
|
598
|
+
|
|
599
|
+
### ✅ 권장: input 동기화와 검색 트리거를 분리
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
constructor() {
|
|
603
|
+
// effect 1: 외부 input → filter/lastFilter 단방향 동기화 (input 변경 시만 트리거)
|
|
604
|
+
effect(() => {
|
|
605
|
+
const cIds = this.includeCustomerIds() ?? [];
|
|
606
|
+
const gIds = this.includeGoodsIds() ?? [];
|
|
607
|
+
const xIds = this.excludeIds() ?? [];
|
|
608
|
+
|
|
609
|
+
untracked(() => {
|
|
610
|
+
this.filter.update((f) => ({
|
|
611
|
+
...f,
|
|
612
|
+
includeCustomerIds: cIds,
|
|
613
|
+
includeGoodsIds: gIds,
|
|
614
|
+
excludeIds: xIds,
|
|
615
|
+
}));
|
|
616
|
+
this.lastFilter.set({ ...this.filter() });
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
// effect 2: lastFilter/page/sortingDefs → 검색 (사용자 onFilterSubmit/페이지 이동/정렬 시 트리거)
|
|
621
|
+
effect(() => {
|
|
622
|
+
if (!this.perms().includes("use") || !this.ready()) {
|
|
623
|
+
this.initialized.set(true);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
this.lastFilter();
|
|
628
|
+
this.page();
|
|
629
|
+
this.sortingDefs();
|
|
630
|
+
|
|
631
|
+
void untracked(async () => {
|
|
632
|
+
this.busyCount.update((v) => v + 1);
|
|
633
|
+
await this._sdToast.try(async () => {
|
|
634
|
+
await this._refresh();
|
|
635
|
+
});
|
|
636
|
+
this.busyCount.update((v) => v - 1);
|
|
637
|
+
this.initialized.set(true);
|
|
638
|
+
});
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
- effect 1은 **input signal에만 의존**. 페이지 모드(input 미전달)에서는 init 1회만 실행되고 이후 트리거되지 않으므로, 사용자가 화면에서 바꾼 `filter`/`lastFilter`를 덮어쓰지 않는다.
|
|
644
|
+
- effect 2는 **lastFilter/page/sortingDefs에만 의존**. `onFilterSubmit()`이 `lastFilter.set` 하면 검색이 자동 실행된다.
|
|
645
|
+
- 모달 모드에서 호출자가 inputs를 한 번만 전달하므로, 모달이 열린 동안 effect 1이 재트리거되지 않아 모달 내 사용자 변경도 보존된다.
|
|
646
|
+
|
|
647
|
+
### ❌ 안티패턴: 한 effect에서 input vs lastFilter 비교 후 reset
|
|
648
|
+
|
|
649
|
+
```typescript
|
|
650
|
+
constructor() {
|
|
651
|
+
effect(() => {
|
|
652
|
+
if (!this.perms().includes("use") || !this.ready()) { /* ... */ return; }
|
|
653
|
+
|
|
654
|
+
const cIds = this.includeCustomerIds() ?? []; // 페이지 모드: 항상 []
|
|
655
|
+
const lf = this.lastFilter(); // 사용자 검색 직후: [123]
|
|
656
|
+
if (!obj.equal(cIds, lf.includeCustomerIds)) { // ❌ input과 lastFilter 비교
|
|
657
|
+
untracked(() => {
|
|
658
|
+
this.filter.update((f) => ({ ...f, includeCustomerIds: cIds }));
|
|
659
|
+
this.lastFilter.set({ ...this.filter() }); // ❌ 사용자 변경을 [] 로 덮어씀
|
|
660
|
+
this.page.set(0);
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
this.lastFilter();
|
|
665
|
+
this.page();
|
|
666
|
+
this.sortingDefs();
|
|
667
|
+
|
|
668
|
+
void untracked(async () => { await this._refresh(); });
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
- 사용자가 화면에서 필터를 변경하고 `onFilterSubmit()` 호출 → `lastFilter.set([123])` → 이 effect 재실행 → `cIds=[]`와 `lastFilter=[123]`이 다르다고 판단 → `filter`/`lastFilter`를 `[]`로 reset → `_refresh()`는 빈 필터로 검색.
|
|
674
|
+
- 결과: 페이지 모드에서 필터가 항상 빈 배열로 동작하는 것처럼 보임 (필터 미적용).
|
|
675
|
+
- 외부 input은 "외부에서 명령적 reset"의 트리거여야 하며, 사용자 변경(`lastFilter`)과 동등 비교의 기준이 되어선 안 된다.
|
|
676
|
+
|
|
595
677
|
## Anti-patterns
|
|
596
678
|
|
|
597
679
|
```html
|
|
@@ -620,4 +702,20 @@ export class CustomerList implements SdSelectModal<number> {
|
|
|
620
702
|
<!-- ❌ cell 템플릿에서 items 시그널 호출을 빠뜨리지 않는다 -->
|
|
621
703
|
<ng-template [cell]="[]" let-item="item"> <!-- ❌ 타입 추론 불가 -->
|
|
622
704
|
<ng-template [cell]="items()" let-item="item"> <!-- ✅ -->
|
|
705
|
+
|
|
706
|
+
<!-- ❌ select류 컨트롤에 [readonly]="!edit"을 바인딩하지 않는다 -->
|
|
707
|
+
<sd-select [readonly]="!edit" ...>
|
|
708
|
+
<!-- → typecheck 에러: Can't bind to 'readOnly' since it isn't a known property of 'sd-select' -->
|
|
709
|
+
|
|
710
|
+
<!-- ❌ 위 에러를 회피하려고 disabled에 !edit을 합치지 않는다 -->
|
|
711
|
+
<!-- (select는 즉시 변경 컨트롤이라 edit 모드 분기가 의미 없고, -->
|
|
712
|
+
<!-- 값 표시 행에서도 disabled로 회색 처리되어 권한 없음 시각과 혼동됨) -->
|
|
713
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
714
|
+
<sd-select [disabled]="!canEdit() || !edit" ...>
|
|
715
|
+
</ng-template>
|
|
716
|
+
|
|
717
|
+
<!-- ✅ select류는 edit 모드 분기 없음. let-edit 안 받고 disabled는 권한만 -->
|
|
718
|
+
<ng-template [cell]="items()" let-item="item">
|
|
719
|
+
<sd-select [disabled]="!canEdit()" ...> <!-- ✅ -->
|
|
720
|
+
</ng-template>
|
|
623
721
|
```
|
|
@@ -111,6 +111,33 @@ class SdSheetColumnCellTemplate<T> {
|
|
|
111
111
|
- **일반 텍스트**: `<div class="p-xs-sm">` 로 감싸 기본 패딩 적용
|
|
112
112
|
- **컨트롤 삽입**: 반드시 `[inset]="true"` + `[size]="'sm'"` 지정
|
|
113
113
|
|
|
114
|
+
**컨트롤별 `edit` 모드 처리** — `SdSheetCellContext.edit`은 셀이 편집 진입 모드인지 여부(행 클릭/더블클릭으로 활성)다. 컨트롤 종류에 따라 처리가 다르다:
|
|
115
|
+
|
|
116
|
+
| 컨트롤 | `[disabled]` | `[readonly]` | `let-edit="edit"` |
|
|
117
|
+
|--------|-------------|-------------|---------------------|
|
|
118
|
+
| `SdTextfield` (text/number/date 등) | `!canEdit()` | `!edit` | 받음 |
|
|
119
|
+
| `SdSelect` / `SdSharedDataSelect` | `!canEdit()` | (사용 안 함) | **받지 않음** |
|
|
120
|
+
| `SdCheckbox` | `!canEdit()` | (사용 안 함) | 받지 않음 |
|
|
121
|
+
| `SdButton` | `!canEdit()` | (사용 안 함) | 받지 않음 |
|
|
122
|
+
|
|
123
|
+
`readonly`는 "값은 보이되 편집 진입을 막는다", `disabled`는 "회색 + 비활성"이라 의미·시각이 다르다. textfield 류는 둘을 분리해 인라인 편집(읽기 모드 → 클릭 → 편집 모드) UX를 구현한다.
|
|
124
|
+
|
|
125
|
+
select·체크박스·버튼류는 클릭 한 번으로 즉시 동작하는 컨트롤이라 `edit` 모드 분기 자체가 의미 없다. `let-edit="edit"`을 받지 않고 `[disabled]`는 권한(`!canEdit()`)만 반영한다.
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<!-- ❌ select류 컨트롤에서 disabled에 !edit을 합치지 않는다 -->
|
|
129
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
130
|
+
<sd-select [disabled]="!canEdit() || !edit" ...>
|
|
131
|
+
</ng-template>
|
|
132
|
+
|
|
133
|
+
<!-- ✅ select는 edit 모드 분기 없음. let-edit 안 받고 disabled는 권한만 -->
|
|
134
|
+
<ng-template [cell]="items()" let-item="item">
|
|
135
|
+
<sd-select [disabled]="!canEdit()" ...>
|
|
136
|
+
</ng-template>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
> **주의**: `SdSelect`/`SdSharedDataSelect`/`SdCheckbox`/`SdButton`은 `readonly` 입력을 **제공하지 않는다**. `[readonly]="!edit"`을 바인딩하면 typecheck 에러(`Can't bind to 'readOnly' since it isn't a known property of 'sd-...'`)가 발생한다. textfield 패턴(`disabled`/`readonly` 분리)을 select류에 그대로 적용하지 말 것.
|
|
140
|
+
|
|
114
141
|
### `SdSheetCellContext`
|
|
115
142
|
|
|
116
143
|
```typescript
|
|
@@ -45,6 +45,26 @@ class SdSelect<T, M extends keyof SelectModeValue<T>> {
|
|
|
45
45
|
|
|
46
46
|
**스타일 적용**: `contentClass`/`contentStyle`은 트리거 영역(선택값 텍스트와 드롭다운 화살표가 함께 놓인 박스)에만 적용된다.
|
|
47
47
|
|
|
48
|
+
## 빈 값(`undefined`) 항목 표시 권장 패턴
|
|
49
|
+
|
|
50
|
+
`SdSelect`에서 `[value]="undefined"` 항목은 일반 항목과 시각적으로 구분되도록 라벨을 회색으로 처리한다. 사용자가 "값 없음"을 즉시 인지하고 의미 있는 값과 혼동하지 않도록 한다.
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<sd-select [(value)]="item.weekOffset" (valueChange)="mark(items)">
|
|
54
|
+
<sd-select-item [value]="undefined">
|
|
55
|
+
<span class="tx-theme-gray-default">미지정</span>
|
|
56
|
+
</sd-select-item>
|
|
57
|
+
<sd-select-item [value]="0">+0주</sd-select-item>
|
|
58
|
+
<sd-select-item [value]="1">+1주</sd-select-item>
|
|
59
|
+
<sd-select-item [value]="2">+2주</sd-select-item>
|
|
60
|
+
</sd-select>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- `tx-theme-gray-default`은 `@simplysm/angular`의 회색 텍스트 토큰이다.
|
|
64
|
+
- 본 패턴은 **single 모드 한정**이다 — 필터의 "전체"(모든 옵션 포함), nullable 컬럼의 "미지정" 등 single 모드의 빈 값 라벨에 적용한다.
|
|
65
|
+
- multi 모드는 `hideSelectAll` 옵션으로 "전체 선택"이 자체 제공되므로 별도 `[value]="undefined"` 항목을 두지 않는다.
|
|
66
|
+
- `placeholder` 만으로는 사용자가 한 번 값을 선택한 뒤 빈 값으로 복귀할 수 없으므로, `[value]="undefined"` 항목을 명시하고 라벨에 회색을 적용하는 것이 권장 패턴이다.
|
|
67
|
+
|
|
48
68
|
## Related Types
|
|
49
69
|
|
|
50
70
|
### `SdSelectItem`
|
|
@@ -40,7 +40,7 @@ claude/
|
|
|
40
40
|
| `sd-deliverable/` | sd-deliverable | 매뉴얼/SIT 문서 생성 |
|
|
41
41
|
| `sd-dev/` | sd-dev | 통합 개발 오케스트레이터 (요구명세 → TDD → 리뷰) |
|
|
42
42
|
| `sd-doc-extract/` | sd-doc-extract | 문서 파일 텍스트/이미지 추출 (Python) |
|
|
43
|
-
| `sd-
|
|
43
|
+
| `sd-clarify/` | sd-clarify | (내부 전용) 명확성 분류·근거 탐색·명확화 질문 |
|
|
44
44
|
| `sd-issue/` | sd-issue | GitHub 이슈 생성 |
|
|
45
45
|
| `sd-outlook/` | sd-outlook | Outlook 메일 검색/다운로드 (Python) |
|
|
46
46
|
| `sd-plan/` | sd-plan | 요구명세/구현계획 작성 |
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
# 대화 규칙
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- 모든 요청에 대해 항상 깊이 생각 할 것.
|
|
12
12
|
- 내장 도구 적극 활용 (Read/Grep/Glob/Bash/WebFetch/WebSearch/Skill/TaskCreate 등)
|
|
13
|
-
- 사용자 요청의 의도가 불명확할 때는 `/sd-
|
|
13
|
+
- 사용자 요청의 의도가 불명확할 때는 `/sd-clarify` 스킬을 호출하여 명확화.
|
|
14
14
|
- 맥락에 맞는 용어 사용
|
|
15
15
|
- 업무 기능·요구사항 논의 → 업무 용어 (사용자가 화면에서 뭘 하는지)
|
|
16
16
|
- DB 스키마 설계 → 테이블·컬럼명
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- 불릿 우선: 항목이 2개 이상이거나 병렬 구조면 산문 대신 불릿 리스트 사용. 3줄 이상 텍스트가 이어지면 빈 줄 또는 리스트로 끊는다.
|
|
13
13
|
- 표 활용: 대비·비교·다축 평가는 표(table)로 정돈. 정렬·가시성 우수.
|
|
14
14
|
- 코드블록 활용: 명령어 1줄 이상, 코드 인용, 파일 내용 발췌, 변경 전후 본문은 fenced code block으로 분리.
|
|
15
|
+
- 꼬리 요약: 응답이 30줄 이상이면 마지막에 가로선 분리 후 `## 요약` 헤더 + 핵심 불릿 3~5개를 출력한다. 30줄 미만이면 출력 금지.
|
|
15
16
|
|
|
16
17
|
## 색상 활용 (Claude Code 터미널 기준)
|
|
17
18
|
|
package/claude/settings.json
CHANGED
|
@@ -121,13 +121,13 @@ typecheck 명령어를 실행한다. (`출력 캡처 규칙`에 따라 파일로
|
|
|
121
121
|
- **테스트 데이터 갱신 누락**: snapshot/expected/golden 출력만 달라진 경우 변경 의도 확인 후 해당 테스트 데이터 수정.
|
|
122
122
|
- **무관한 기존 실패**: `에러 처리 범위`에 따라 조용히 스킵.
|
|
123
123
|
- **원인 특정 불가**: 에스컬레이션 규칙에 따라 즉시 보고.
|
|
124
|
-
6. 1차 분류 결과와 근거 전체를 `/sd-
|
|
125
|
-
7. `/sd-
|
|
124
|
+
6. 1차 분류 결과와 근거 전체를 `/sd-clarify`로 전달하여 분류와 처리 방향의 명확성을 판정한다. sd-check가 자체 판단으로 명확한 항목을 제외하고 보내지 않는다.
|
|
125
|
+
7. `/sd-clarify`가 분류와 처리 방향을 명확하다고 판정하면 즉시 처리한다:
|
|
126
126
|
- **구현 버그가 명확함**: 코드 수정.
|
|
127
127
|
- **테스트 변경 누락이 명확함**: 테스트, fixture, expected/golden 수정.
|
|
128
128
|
- **테스트 데이터 갱신 누락이 명확함**: snapshot/expected/golden 수정.
|
|
129
129
|
- **무관한 기존 실패가 명확함**: `에러 처리 범위`에 따라 조용히 스킵.
|
|
130
|
-
8. `/sd-
|
|
130
|
+
8. `/sd-clarify`가 1%라도 불확실하다고 판정하면 처리하지 않는다. 사용자에게 분류 근거와 처리 방향을 확인받고 승인된 처리만 실행한다.
|
|
131
131
|
|
|
132
132
|
**NEVER: 테스트를 통과시키기 위해 현재 세션의 의도된 코드 변경을 예전 동작으로 되돌리지 않는다.** 코드 롤백성 수정은 실패 원인이 구현 버그로 확정된 경우에만 허용한다. "테스트가 기존 값을 기대한다"는 사실만으로 구현 버그를 확정할 수 없다.
|
|
133
133
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: sd-
|
|
3
|
-
description:
|
|
2
|
+
name: sd-clarify
|
|
3
|
+
description: 명확성 분류·근거 탐색·재분류·명확화 질문 프로세스. 타 스킬내에서 호출되거나, 사용자 요청이 불명확할때 사용된다.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# sd-
|
|
6
|
+
# sd-clarify: 명확화 프로세스
|
|
7
7
|
|
|
8
8
|
정보의 명확성 판단 및 불명확한 정보를 명확화 하고자 할 때 적용한다.
|
|
9
9
|
파악한 정보를 확실성 수준별로 분류하고, 불명확한 항목은 사용자에게 질문하여 해소한다.
|
|
@@ -21,13 +21,13 @@ description: (내부 전용) 명확성 분류·근거 탐색·재분류·명확
|
|
|
21
21
|
|
|
22
22
|
## Step 2: 근거 탐색 (질문 전 필수)
|
|
23
23
|
|
|
24
|
-
**CRITICAL: Medium/Low/ASSUMED로 분류된 모든 항목은 사용자에게 질문하기 전에 반드시 근거를 탐색한다.**
|
|
24
|
+
**CRITICAL: Medium/Low/ASSUMED로 분류된 모든 항목은 사용자에게 질문하기 전에 반드시 근거를 한번 더 탐색한다.**
|
|
25
25
|
|
|
26
26
|
근거 출처는 항목의 성격에 따라 결정한다. 컨텍스트 회수와 타겟 탐색 중 어느 한쪽으로 미리 편향시키지 않는다.
|
|
27
27
|
|
|
28
28
|
### 2-1. 컨텍스트 회수
|
|
29
29
|
|
|
30
|
-
지금까지 누적된 맥락 전체에서 근거를 찾는다.
|
|
30
|
+
지금까지 누적된 맥락 전체에서 근거를 찾는다.
|
|
31
31
|
|
|
32
32
|
- **사용자 메시지** — 현재/이전 턴의 지시, 인용, 예시, 제약
|
|
33
33
|
- **호출자에게서 받은 인자** — 이 스킬을 부른 상위 스킬(sd-plan/sd-wbs 등)이 전달한 정보
|
|
@@ -40,8 +40,8 @@ description: (내부 전용) 명확성 분류·근거 탐색·재분류·명확
|
|
|
40
40
|
|
|
41
41
|
- **타겟 코드베이스** — Grep/Read/Glob으로 동일/유사 패턴. **다음 항목은 코드베이스 탐색 필수(컨텍스트 회수로 종결 금지):** UI 컴포넌트 구조·레이아웃·생김새, 메뉴/네비게이션 분할, 라우팅 구조, 도메인 엔터티 구조, 네이밍 컨벤션, 디렉토리 구조
|
|
42
42
|
- **참조 문서** — `.claude/references/**`, CLAUDE.md 등 프로젝트 문서
|
|
43
|
-
- **사용자가 제공한 원본 자료** — 첨부 문서·파일·경로를 끝까지 확인 (키워드 검색만으로 종결 금지)
|
|
44
|
-
- **공식 문서** — 외부
|
|
43
|
+
- **사용자가 제공한 원본 자료** — 첨부 문서·파일·경로를 끝까지 확인 (완독. 키워드 검색만으로 종결 금지)
|
|
44
|
+
- **공식 문서** — 외부 라이브러리/프레임워크의 공식 문서
|
|
45
45
|
|
|
46
46
|
### 실패 시그널 (Step 3 진입 전 자가 검증)
|
|
47
47
|
|
|
@@ -50,7 +50,7 @@ description: (내부 전용) 명확성 분류·근거 탐색·재분류·명확
|
|
|
50
50
|
- 찾음: `{파일/문서}:{라인/페이지/섹션}` + 인용·요약
|
|
51
51
|
- 못 찾음: 어디를 봤는지(회수한 맥락 + 탐색한 소스) 명시
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
"어차피 모를 것"이라는 판단으로 건너뛰는 것은 **금지(NEVER)**.
|
|
54
54
|
|
|
55
55
|
## Step 3: 재분류
|
|
56
56
|
|
|
@@ -61,9 +61,21 @@ description: (내부 전용) 명확성 분류·근거 탐색·재분류·명확
|
|
|
61
61
|
|
|
62
62
|
## Step 4: 재분류 보고 (필수)
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
최종 분류 결과를 **표 형태로 사용자에게 출력**한다.
|
|
65
65
|
|
|
66
|
-
###
|
|
66
|
+
### 표 출력
|
|
67
|
+
|
|
68
|
+
| 항목 | 1차 분류 | 탐색 위치 | 인용/요약 | 재분류 |
|
|
69
|
+
| ----------- | -------- | ------------------------- | --------------- | -------- |
|
|
70
|
+
| (정보 항목) | ASSUMED | 원본.docx p.3 / foo.ts:42 | "..." 또는 요약 | VERIFIED |
|
|
71
|
+
|
|
72
|
+
- **탐색 위치**는 파일경로:라인번호, 문서명:페이지/섹션, 메일 식별자, 회의록 발화자:시점 등 **구체 좌표**로 명시한다. "전체 검토", "문서 봄", "전반적으로 확인" 같은 추상 보고는 **금지(NEVER)**.
|
|
73
|
+
- **인용/요약**은 위 "인용 형식" 규칙을 따른다. 인용이 비어 있으면 해당 항목은 ASSUMED 유지(승격 금지).
|
|
74
|
+
- **근거 없음**으로 남기려면 (a) 어떤 키워드/구간을 봤는지, (b) 어떤 자료의 어떤 부분에서 부재를 확인했는지를 두 줄 이상 구체 명시한다. "탐색했으나 근거 없음" 한 줄로 종결하면 위반.
|
|
75
|
+
- 비정형 자료(메일, 회의 대본, 메시지 본문)가 호출자(sd-wbs 등)에서 보고되었는데 표에 해당 자료 인용이 1건도 없으면, 끝까지 읽지 않은 신호로 간주하여 Step 2로 되돌아간다.
|
|
76
|
+
- 보고 직후, 질문 대상이 남아 있으면 Step 5로 진행한다.
|
|
77
|
+
|
|
78
|
+
#### 인용 형식
|
|
67
79
|
|
|
68
80
|
표의 "인용/요약" 칼럼에 사용한다.
|
|
69
81
|
|
|
@@ -74,20 +86,9 @@ description: (내부 전용) 명확성 분류·근거 탐색·재분류·명확
|
|
|
74
86
|
- 메시지 본문: `사용자 메시지 ({n}번째 턴) — "..."`
|
|
75
87
|
- 인용은 1~2문장으로 의미가 드러나야 한다. 좌표만 적고 인용을 생략하는 것은 **금지**.
|
|
76
88
|
|
|
77
|
-
### 표 출력
|
|
78
|
-
|
|
79
|
-
| 항목 | 1차 분류 | 탐색 위치 | 인용/요약 | 재분류 |
|
|
80
|
-
|------|---------|----------|----------|--------|
|
|
81
|
-
| (정보 항목) | ASSUMED | 원본.docx p.3 / foo.ts:42 | "..." 또는 요약 | VERIFIED |
|
|
82
|
-
|
|
83
|
-
- **탐색 위치**는 파일경로:라인번호, 문서명:페이지/섹션, 메일 식별자, 회의록 발화자:시점 등 **구체 좌표**로 명시한다. "전체 검토", "문서 봄", "전반적으로 확인" 같은 추상 보고는 **금지(NEVER)**.
|
|
84
|
-
- **인용/요약**은 위 "인용 형식" 규칙을 따른다. 인용이 비어 있으면 해당 항목은 ASSUMED 유지(승격 금지).
|
|
85
|
-
- **근거 없음**으로 남기려면 (a) 어떤 키워드/구간을 봤는지, (b) 어떤 자료의 어떤 부분에서 부재를 확인했는지를 두 줄 이상 구체 명시한다. "탐색했으나 근거 없음" 한 줄로 종결하면 위반.
|
|
86
|
-
- 비정형 자료(메일, 회의 대본, 메시지 본문)가 호출자(sd-wbs 등)에서 보고되었는데 표에 해당 자료 인용이 1건도 없으면, 끝까지 읽지 않은 신호로 간주하여 Step 2로 되돌아간다.
|
|
87
|
-
- 보고 직후, 질문 대상이 남아 있으면 Step 5로 진행한다.
|
|
88
|
-
|
|
89
89
|
## Step 5: 명확화 질문
|
|
90
90
|
|
|
91
|
-
재분류 후에도 **INFERRED Medium/Low** 또는 **ASSUMED**로 남은 항목은 **MUST**
|
|
91
|
+
재분류 후에도 **INFERRED Medium/Low** 또는 **ASSUMED**로 남은 항목은 **MUST** 사용자에게 질문한다.
|
|
92
92
|
|
|
93
|
+
- 질문 방법: @.claude/rules/sd-options.md
|
|
93
94
|
- VERIFIED와 INFERRED High는 명확한 것으로 본다.
|
|
@@ -9,20 +9,12 @@ model: haiku
|
|
|
9
9
|
## 프로세스
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
Step 1: 스테이징
|
|
12
|
+
Step 1: 스테이징 → Step 2: Diff 분석 → Step 3: 메시지 작성 → Step 4: 커밋
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
## Step 1: 스테이징
|
|
15
|
+
## Step 1: 스테이징
|
|
16
16
|
|
|
17
|
-
모든
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
mkdir -p .tmp && git add -A && git diff --staged > ".tmp/$(date +%y%m%d%H%M%S)_commit.txt"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
파일이 비어있으면 스테이징된 변경사항이 없는 것이다. 사용자에게 알리고 중단한다.
|
|
24
|
-
|
|
25
|
-
생성된 파일을 Read하여 전체 변경 내역을 확인한다.
|
|
17
|
+
`git add -A`로 모든 변경을 스테이징한다 (sd-commit은 전체 단일 커밋 정책이므로 "관련 파일만 add" 권고를 의도적으로 오버라이드).
|
|
26
18
|
|
|
27
19
|
## Step 2: Diff 분석
|
|
28
20
|
|
|
@@ -106,7 +106,7 @@ LLM 디버깅의 주요 실패 모드와 차단 룰.
|
|
|
106
106
|
- **최근 변경** — 언제부터 발생했는지, 관련 커밋
|
|
107
107
|
- **출처** — GitHub 이슈에서 시작된 경우 `owner/repo#N` 형식. 그 외에는 `direct`
|
|
108
108
|
|
|
109
|
-
누락 항목이 있으면 `/sd-
|
|
109
|
+
누락 항목이 있으면 `/sd-clarify` 스킬을 호출하여 명확화한다.
|
|
110
110
|
|
|
111
111
|
## Phase 2: 재현 & 최소화
|
|
112
112
|
|
|
@@ -18,7 +18,6 @@ sd-wbs → sd-plan → sd-tdd → sd-check → sd-review를 순차 진행하는
|
|
|
18
18
|
| wbs 경로만 (추가 요청 있음) | → Step 2 (sd-wbs 업데이트) |
|
|
19
19
|
| wbs + Feature 번호 | → Step 3 (sd-plan) |
|
|
20
20
|
| Feature 문서 경로 | → Step 4 (sd-tdd). Slice 체크박스(`[x]`/`[ ]`)를 확인하여 진행 상태를 복원한다 |
|
|
21
|
-
| `/sd-review`가 전달한 확정 이슈 목록 | → Step 3 (sd-plan: 리뷰 수정 Feature 문서 생성) |
|
|
22
21
|
| 그 외 (자연어 요청, 참고자료 등) | → Step 2 (sd-wbs) |
|
|
23
22
|
|
|
24
23
|
## Step 2: sd-wbs
|
|
@@ -31,12 +30,7 @@ sd-wbs → sd-plan → sd-tdd → sd-check → sd-review를 순차 진행하는
|
|
|
31
30
|
## Step 3: sd-plan
|
|
32
31
|
|
|
33
32
|
`/sd-plan` 스킬을 즉시 수행한다. 완료 후 사용자 확인 없이 즉시 Step 4로 진행한다.
|
|
34
|
-
|
|
35
|
-
`/sd-review`가 전달한 확정 이슈 목록으로 시작한 경우:
|
|
36
|
-
|
|
37
|
-
- `/sd-wbs`를 수행하지 않는다.
|
|
38
|
-
- 확정 이슈 목록 전체를 하나의 리뷰 수정 Feature로 보고 `/sd-plan`을 즉시 수행한다.
|
|
39
|
-
- 이슈별 또는 근본 원인별 작업 단위는 WBS Feature가 아니라 Feature 문서의 Slice로 나눈다.
|
|
33
|
+
단, Feature 문서의 Scenario 수가 10개를 초과하면 Step 4를 중단하고 `/sd-dev {Feature파일경로}`로 새 세션에서 진행하도록 안내한다.
|
|
40
34
|
|
|
41
35
|
## Step 4: sd-tdd
|
|
42
36
|
|
|
@@ -7,43 +7,9 @@ description: Feature의 요구명세와 구현계획을 작성하는 스킬. "
|
|
|
7
7
|
|
|
8
8
|
Feature 하나를 대상으로, WBS에서 확정된 고객 중심 What을 개발자 중심의 구현 가능한 명세와 구현계획(How)으로 변환한다.
|
|
9
9
|
|
|
10
|
-
## 공통 규칙
|
|
11
|
-
|
|
12
|
-
### WBS와 sd-plan의 역할 경계
|
|
13
|
-
|
|
14
|
-
WBS는 고객 중심으로 **무엇을 만들어야 하는지(What)** 를 확정한 source of truth이다.
|
|
15
|
-
sd-plan은 개발자 중심으로 **어떻게 만들지(How)** 를 결정한다.
|
|
16
|
-
|
|
17
|
-
- sd-plan은 WBS에 없는 고객 동작, 업무 규칙, 정책, 예외 흐름을 새로 추가하지 않는다.
|
|
18
|
-
- sd-plan에서 고객 중심 미확정 사항을 발견하면 기술 질문으로 처리하지 않는다.
|
|
19
|
-
- 고객 중심 미확정 사항은 WBS 수정 대상으로 되돌리고, Feature 문서 생성과 구현계획 작성을 중단한다.
|
|
20
|
-
- sd-plan에서 사용자에게 질문할 수 있는 항목은 기술 설계, 기존 코드 패턴 적용, 구현 구조, 테스트 분해처럼 How에 속하는 결정이다.
|
|
21
|
-
|
|
22
|
-
### 정확성 우선 원칙
|
|
23
|
-
|
|
24
|
-
부정확한 진행보다 과한 검증, 질문, 중단을 우선한다.
|
|
25
|
-
|
|
26
|
-
- **NEVER: 근거 없는 설계 결정 금지.** 모든 설계 결정은 `WBS`, `사용자 답변`, `기준 코드`, `프로젝트 문서` 중 하나 이상의 근거를 가져야 한다.
|
|
27
|
-
- **NEVER: 임시 가정 진행 금지.** 고객 동작, 업무 규칙, 정책, 예외 흐름, 수치, 권한, 상태, 기간, 열거값은 추정해서 확정 사항처럼 기록하지 않는다.
|
|
28
|
-
- **MUST: 확정/미확정/설계 결정을 분리한다.** Feature 문서에는 확정 사항, 미확정/WBS 되돌림 사항, 기술 설계 결정을 서로 다른 섹션으로 기록한다.
|
|
29
|
-
- **MUST: 추정은 최종 결정으로 남기지 않는다.** 추정이 필요한 항목은 미확정으로 분류하고, 고객 중심 항목이면 WBS 되돌림 절차로, How 항목이면 명확화 질문으로 처리한다.
|
|
30
|
-
- **MUST: 사용자 답변의 구체 정보 보존.** 사용자가 답한 수치, 열거 항목, 정책, 예외 조건, 상태, 권한, 기간은 원문 의미를 유지해 Feature 문서에 근거와 함께 기록한다.
|
|
31
|
-
|
|
32
|
-
### 범위 겹침
|
|
33
|
-
|
|
34
|
-
어느 단계에서든 현재 Feature 범위가 다른 Feature 영역과 겹치는 것을 발견하면, 사용자에게 확인 후 조정한다.
|
|
35
|
-
|
|
36
|
-
예: Feature 1.1 "사용자 인증"의 범위에 "권한 기반 접근 제어"가 있고 Feature 1.2가 "권한 관리"라면, "권한 기반 접근 제어"는 Feature 1.2로 이관이 적절할 수 있다.
|
|
37
|
-
|
|
38
10
|
## Step 1: 입력 확인
|
|
39
11
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- wbs 문서 경로 + Feature 번호
|
|
43
|
-
- `/sd-review`가 전달한 확정 이슈 목록
|
|
44
|
-
|
|
45
|
-
wbs 문서 경로와 Feature 번호가 없더라도 `/sd-review` 전달 입력이면 종료하지 않고 Feature 문서 생성을 진행한다.
|
|
46
|
-
그 외 입력이면 `/sd-wbs`를 안내하고 종료한다.
|
|
12
|
+
`wbs 문서 경로 + Feature 번호`가 입력되지 않으면, `/sd-wbs`를 안내하고 종료한다.
|
|
47
13
|
|
|
48
14
|
## Step 2: Feature 분석
|
|
49
15
|
|
|
@@ -51,22 +17,31 @@ wbs 문서 경로와 Feature 번호가 없더라도 `/sd-review` 전달 입력
|
|
|
51
17
|
|
|
52
18
|
wbs의 범위/경계를 기반으로 세분화하여 재분석한다. WBS의 고객 동작과 업무 규칙은 확정된 입력으로 취급한다.
|
|
53
19
|
|
|
54
|
-
- **범위**: wbs의 세부 기능을
|
|
20
|
+
- **범위**: wbs의 세부 기능을 구체적 동작 수준으로 빠짐없이 재나열. WBS에 없는 고객 동작은 추가하지 않는다.
|
|
55
21
|
- **경계**: wbs의 경계를 확인하고, 모호한 부분을 구체화.
|
|
56
22
|
- **근거**: 범위의 출처. 참조 파일/자료 경로가 있으면 기록.
|
|
57
23
|
|
|
58
|
-
|
|
24
|
+
모든 항목은 `/sd-clarify`스킬을 호출하여 명확화 한다.
|
|
25
|
+
|
|
26
|
+
## 다른 Feature와 범위가 겹칠경우
|
|
59
27
|
|
|
60
|
-
|
|
61
|
-
2. `/sd-inner-clarify`로 확정 질문을 수행한다. 확정될 때까지 반복한다.
|
|
62
|
-
3. 확정되면 WBS 문서를 먼저 수정하고 즉시 종료한다. 사용자가 다시 `/sd-dev {wbs경로} {Feature번호}`를 실행해야 한다.
|
|
28
|
+
어느 단계에서든 현재 Feature 범위가 다른 Feature 영역과 겹치는 것을 발견하면, `@.claude/rules/sd-options.md`의 규칙에 따라 사용자에게 확인 후 조정한다.
|
|
63
29
|
|
|
64
|
-
|
|
30
|
+
### 예시
|
|
31
|
+
|
|
32
|
+
Feature 1.1 "사용자 인증"의 범위에 "권한 기반 접근 제어"가 있고 Feature 1.2가 "권한 관리"라면, 다음과 같은 선택지가 있을 수 있다.
|
|
33
|
+
|
|
34
|
+
- "권한 기반 접근 제어"는 Feature 1.2로 이관
|
|
35
|
+
- "권한 기반 접근 제어"는 Feautre 1.1a로, 사용자 인증을 Feature 1.1b로 분할
|
|
36
|
+
- 수행안함
|
|
37
|
+
|
|
38
|
+
수행안함인경우 다음단계로 진행하고, 그 외의 경우 WBS 문서를 수정하고 즉시 종료한다.
|
|
65
39
|
|
|
66
40
|
### 세부 기능 5개 초과 시
|
|
67
41
|
|
|
68
|
-
세부 기능
|
|
69
|
-
|
|
42
|
+
세부 기능 7개 초과 시 SPIDR(Spike / Path / Interface / Data / Rule) 축으로 Feature 분리안을 `@.claude/rules/sd-options.md`의 규칙에 따라 제시한다.
|
|
43
|
+
|
|
44
|
+
- 분리 수락 시 wbs 문서를 수정하고 즉시 종료한다.
|
|
70
45
|
|
|
71
46
|
### 2-2. Rule / Example / Question
|
|
72
47
|
|
|
@@ -74,25 +49,25 @@ WBS에 없는 고객 동작, 업무 규칙, 정책, 예외 흐름이 필요하
|
|
|
74
49
|
|
|
75
50
|
- **Rule**: WBS에서 확정된 업무 규칙 (검증 조건, 제약, 정책)
|
|
76
51
|
- **Example**: Rule의 구체 사례 (입력 → 기대 결과)
|
|
77
|
-
- **Question**: 구현계획 수립에 필요한
|
|
52
|
+
- **Question**: 구현계획 수립에 필요한 불확실성.
|
|
78
53
|
|
|
79
|
-
Rule과 Example은 반드시 확정 근거를 가져야 한다. 근거가 없는 Rule/Example은 작성하지 않고
|
|
54
|
+
Rule과 Example은 반드시 확정 근거를 가져야 한다. 근거가 없는 Rule/Example은 작성하지 않고 Question으로 분류한다.
|
|
80
55
|
|
|
81
|
-
Question 도출 기법 — Feature 성격에 맞게
|
|
82
|
-
도출된 빈칸이 고객 동작/업무 규칙/정책/예외 흐름이면 2-1의 WBS 되돌림 절차로 처리하고, 구현 방식에 관한 빈칸만 기술적 Question으로 남긴다.
|
|
56
|
+
Question 도출 기법 — Feature 성격에 맞게 하나 이상 선택하고, 적용 기법명을 표기한다.
|
|
83
57
|
|
|
84
|
-
| 기법
|
|
85
|
-
|
|
86
|
-
| **Decision Table** | 조건 조합이 있을 때
|
|
87
|
-
| **Boundary Value Analysis** | 숫자/범위가 있을 때
|
|
88
|
-
| **Equivalence Partitioning** | 입력 분류가 있을 때
|
|
89
|
-
| **State Transition** | 상태가 있는 Feature | 상태 x 이벤트 나열 → 미정의 전이를
|
|
90
|
-
| **Perspective-Based Reading** | 최종 검토 시 | 테스터/개발자/사용자 관점 검토 → 빠진 것을
|
|
58
|
+
| 기법 | 적용 시점 | 방법 |
|
|
59
|
+
| ----------------------------- | ------------------- | ------------------------------------------------------------ |
|
|
60
|
+
| **Decision Table** | 조건 조합이 있을 때 | 조건 조합 나열 → 빈 칸을Question으로 분류 |
|
|
61
|
+
| **Boundary Value Analysis** | 숫자/범위가 있을 때 | 경계값 강제 → 미정의 경계를 Question으로 분류 |
|
|
62
|
+
| **Equivalence Partitioning** | 입력 분류가 있을 때 | 입력 분류 나열 → 미정의 분류를 Question으로 분류 |
|
|
63
|
+
| **State Transition** | 상태가 있는 Feature | 상태 x 이벤트 나열 → 미정의 전이를 Question으로 분류 |
|
|
64
|
+
| **Perspective-Based Reading** | 최종 검토 시 | 테스터/개발자/사용자 관점 검토 → 빠진 것을 Question으로 분류 |
|
|
91
65
|
|
|
92
66
|
형식 — Rule별 그룹화, `[근거: ...]` 태그:
|
|
93
67
|
|
|
94
68
|
```markdown
|
|
95
69
|
### Rule: 제목은 필수 [근거: wbs "태스크 생성 시 제목 필수"]
|
|
70
|
+
|
|
96
71
|
- Example: 제목 입력 → 저장 성공
|
|
97
72
|
- Example: 제목 비움 → 에러
|
|
98
73
|
- Question: 기존 입력 컴포넌트의 maxLength 처리 패턴?
|
|
@@ -100,10 +75,10 @@ Question 도출 기법 — Feature 성격에 맞게 **하나 이상** 선택하
|
|
|
100
75
|
|
|
101
76
|
### 2-3. 명확화
|
|
102
77
|
|
|
103
|
-
|
|
104
|
-
답변에 따라 Rule/Example/Question을 갱신하며, 모든 Question이 해소될 때까지
|
|
78
|
+
`@.claude/rules/sd-options.md`의 규칙에 따라 Question 불명확성을 명확화한다.
|
|
79
|
+
답변에 따라 Rule/Example/Question을 갱신하며, 모든 Question이 해소될 때까지 반복한다. (추가 Question 발생 가능)
|
|
80
|
+
|
|
105
81
|
- **나쁜 예:** "예약 기능 포함이 결정됨 → 예약 세부규칙(대기열 정책, 미대출 시 자동취소 기간)도 확정" — 기능 포함 여부와 세부 수치/규칙은 별개다. 세부사항은 별도로 분류·질문한다.
|
|
106
|
-
- **나쁜 예:** "WBS에 제목 최대 길이가 없으니 sd-plan에서 100자로 결정" — 고객/업무 규칙이므로 WBS 되돌림 절차로 처리한다.
|
|
107
82
|
|
|
108
83
|
해소된 기술 결정사항은 `### 설계 결정` 테이블에 기록 (D1, D2, ... 순번 부여)
|
|
109
84
|
각 설계 결정은 `결정사항`, `선택`, `근거 유형`, `근거`를 기록한다. 근거 유형은 `WBS`, `사용자 답변`, `기준 코드`, `프로젝트 문서` 중 하나 이상이어야 한다.
|
|
@@ -133,6 +108,7 @@ Feature: {번호} {이름}
|
|
|
133
108
|
코드베이스에서 이 Feature와 **가장 유사한 기존 기능**을 찾는다. 유사 기능이란 동일한 도메인, 비슷한 CRUD 패턴, 유사한 UI 흐름 등을 공유하는 기능이다.
|
|
134
109
|
|
|
135
110
|
탐색 대상:
|
|
111
|
+
|
|
136
112
|
- 관련 엔티티/모델 구조
|
|
137
113
|
- 기존 API 엔드포인트 및 패턴
|
|
138
114
|
- UI 컴포넌트 구조, **레이아웃·생김새 (HTML 골격, CSS 클래스 네이밍, 컨트롤 배치, 스타일 토큰)**, 라우팅
|
|
@@ -146,15 +122,18 @@ Feature: {번호} {이름}
|
|
|
146
122
|
|
|
147
123
|
```markdown
|
|
148
124
|
### 기준 코드
|
|
125
|
+
|
|
149
126
|
(이 Feature 구현 시 따라야 할 기존 코드 패턴)
|
|
150
127
|
|
|
151
128
|
#### 유사 기능: {기능명}
|
|
129
|
+
|
|
152
130
|
- 엔티티: `src/models/xxx.ts:15` — {구조 요약}
|
|
153
131
|
- API: `src/services/xxx-service.ts:42` — {패턴 요약}
|
|
154
132
|
- UI: `src/views/xxx.component.ts:10` — {구조 요약}
|
|
155
133
|
- 테스트: `tests/xxx.spec.ts:5` — {패턴 요약}
|
|
156
134
|
|
|
157
135
|
#### 프로젝트 컨벤션
|
|
136
|
+
|
|
158
137
|
- 네이밍 (파일·클래스·함수·변수): {관찰된 패턴} [근거: `파일경로:라인번호`]
|
|
159
138
|
- 디렉토리 구조 / 파일 배치: {관찰된 패턴} [근거: `파일경로:라인번호`]
|
|
160
139
|
- 에러 처리: {관찰된 패턴} [근거: `파일경로:라인번호`]
|
|
@@ -186,30 +165,42 @@ Feature: {번호} {이름}
|
|
|
186
165
|
|
|
187
166
|
```markdown
|
|
188
167
|
### 배경
|
|
168
|
+
|
|
189
169
|
(이 Feature를 구현하는 기술적 맥락. 기준 코드의 관련 구조 인용)
|
|
170
|
+
|
|
190
171
|
### 목표
|
|
172
|
+
|
|
191
173
|
- 기술적 목표 [근거: Rule "..."]
|
|
174
|
+
|
|
192
175
|
### 비목표
|
|
176
|
+
|
|
193
177
|
- 의도적 제외 항목 [근거: wbs 경계 "..."]
|
|
178
|
+
|
|
194
179
|
### 설계
|
|
180
|
+
|
|
195
181
|
- API, 엔티티, 검증 규칙, UI 구조 등 [근거: Rule "..." 처리를 위해, 기준 코드 `파일경로:라인번호` 패턴 준수]
|
|
182
|
+
|
|
196
183
|
### 대안 검토
|
|
184
|
+
|
|
197
185
|
(고려했으나 선택하지 않은 접근 방식과 그 이유. 기존 패턴과 다른 방식을 제안할 경우 필수)
|
|
198
186
|
```
|
|
199
187
|
|
|
200
188
|
### Vertical Slicing
|
|
201
189
|
|
|
202
190
|
Gherkin Scenarios를 구현 단위(Slice)로 분할한다.
|
|
191
|
+
|
|
203
192
|
- 구현 규모(코드 변경량·복잡도) 기준 (Rule과 1:1 아님)
|
|
204
193
|
- 각 Slice에 Scenario 매핑 (1:N)
|
|
205
194
|
- Slice 간 의존 관계로 순서 결정
|
|
206
195
|
|
|
207
196
|
```markdown
|
|
208
197
|
#### [ ] Slice 1: (제목)
|
|
198
|
+
|
|
209
199
|
- **구현 내용:** (요약)
|
|
210
200
|
- **Scenarios:** ...
|
|
211
201
|
|
|
212
202
|
#### [ ] Slice 2: (제목)
|
|
203
|
+
|
|
213
204
|
- **의존:** Slice 1
|
|
214
205
|
- **구현 내용:** (요약)
|
|
215
206
|
- **Scenarios:** ...
|
|
@@ -224,48 +215,112 @@ Gherkin Scenarios를 구현 단위(Slice)로 분할한다.
|
|
|
224
215
|
# Feature {번호} {이름}
|
|
225
216
|
|
|
226
217
|
## 참조 자료
|
|
227
|
-
- WBS: @{wbs 문서 상대경로}
|
|
228
|
-
{수집한 구체적 정보 — 참조 파일 경로는 `@path` 형태로 기록}
|
|
229
|
-
|
|
230
|
-
## 확정/미확정 구분
|
|
231
218
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
### 미확정/WBS 되돌림
|
|
236
|
-
- 없음
|
|
219
|
+
- WBS: @{wbs 문서 상대경로}
|
|
220
|
+
{수집한 구체적 정보 — 참조 파일 경로는 `@path` 형태로 기록}
|
|
237
221
|
|
|
238
222
|
## 기준 코드
|
|
223
|
+
|
|
239
224
|
{Step 4에서 작성한 기준 코드 섹션}
|
|
240
225
|
|
|
241
226
|
### 설계 결정
|
|
242
|
-
|
|
227
|
+
|
|
228
|
+
| # | 결정사항 | 선택 | 근거 |
|
|
243
229
|
|
|
244
230
|
## 요구명세
|
|
231
|
+
|
|
245
232
|
{Gherkin}
|
|
246
233
|
|
|
247
234
|
## 구현계획
|
|
235
|
+
|
|
248
236
|
{Tech Design + Slicing}
|
|
249
237
|
```
|
|
250
238
|
|
|
251
|
-
## Step 7: 정보
|
|
239
|
+
## Step 7: 격리 검증 (정보 유실·누락 점검)
|
|
240
|
+
|
|
241
|
+
문서 작성 후, 작성자 편향 제거와 정보 유실 차단을 위해 메인 세션과 분리된 subagent로 격리 검증을 수행한다.
|
|
242
|
+
|
|
243
|
+
### 검증 호출
|
|
244
|
+
|
|
245
|
+
`Agent` tool로 `subagent_type: "general-purpose"`, `model: "haiku"`를 호출한다.
|
|
246
|
+
|
|
247
|
+
subagent에 전달할 입력:
|
|
248
|
+
|
|
249
|
+
- **Feature 문서 절대 경로** — Step 6에서 작성한 검증 대상
|
|
250
|
+
- **WBS 문서 절대 경로** — Step 1에서 받은 WBS
|
|
251
|
+
- **사용자 초기 요청 메시지 본문** — 프롬프트에 인라인 삽입 (sd-plan 호출 시 함께 받은 모든 컨텍스트 원문)
|
|
252
|
+
|
|
253
|
+
사용자 명확화 답변·결정사항은 Feature 문서의 `### 설계 결정` 표와 `[근거: ...]` 태그에 반영되어 있으므로 별도 전달하지 않는다.
|
|
254
|
+
|
|
255
|
+
subagent에 부여할 제약: "보고만 수행. Feature 문서를 수정하지 말 것."
|
|
256
|
+
|
|
257
|
+
### subagent 프롬프트에 포함할 검증 가이드
|
|
252
258
|
|
|
253
|
-
|
|
259
|
+
#### 검증 항목 (8가지 모두 수행)
|
|
254
260
|
|
|
255
|
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
+
1. **대화 정보 ↔ 문서 매핑 (정량 매핑 표 + 의역 변형 검출)**
|
|
262
|
+
- 사용자 초기 요청에 포함된 구체적 정보(수치·열거값·업무 규칙·제약·정책·예외·상태 전이·권한·기간·시간대·경계값·오류 동작·참조 경로)가 Feature 문서의 `참조 자료`·`### 설계 결정`·`Rule`·`Example`·`Gherkin`·`구현계획` 중 한 곳 이상에 반영되었는가?
|
|
263
|
+
- **정량 매핑 표 작성**: `원본 표현` / `출처(메시지 위치)` / `Feature 문서 반영 위치` / `Feature 문서 표현`. 반영 위치가 비어 있으면 누락 항목.
|
|
264
|
+
- **의역 변형 검출**: 원문이 구체적인데 Feature 문서가 추상화된 사례 (예: 원문 "최대 100건" → 문서 "다수 항목", 원문 "월요일 오전 9시" → 문서 "주 1회").
|
|
265
|
+
|
|
266
|
+
2. **WBS ↔ Feature 역추적성**
|
|
267
|
+
WBS의 해당 Feature 세부기능·경계 항목 각각이 Feature 문서의 `요구명세` 또는 `구현계획`에 매핑되어 있는가?
|
|
268
|
+
|
|
269
|
+
3. **Example ↔ Scenario 매핑**
|
|
270
|
+
`Rule:` 하위 모든 Example이 Gherkin `Scenario:`로 1:1 매핑되는가?
|
|
271
|
+
|
|
272
|
+
4. **설계 결정 번호 무결성**
|
|
273
|
+
`### 설계 결정` 표의 D1..Dn 일련번호에 누락·중복·역순이 없는가?
|
|
274
|
+
|
|
275
|
+
5. **Slice 의존성 실재 검증**
|
|
276
|
+
각 Slice의 `의존:` 항목이 같은 문서에 실제 존재하는 Slice 번호를 가리키는가?
|
|
277
|
+
|
|
278
|
+
6. **추상 표현 검출**
|
|
279
|
+
Feature 문서 본문에 `TBD|추후|적절히|기본(?:값)?|일반적으로|통상|아마|추정|등등` 표현이 잔존하는가? (예시·인용·정규식 본문 제외)
|
|
280
|
+
|
|
281
|
+
7. **근거 태그 누락**
|
|
282
|
+
`Rule:`, `Example:`, `### 설계 결정` 행, `### 설계` 항목, Slice 항목 각각에 `[근거: ...]` 또는 등가 태그가 있는가?
|
|
283
|
+
|
|
284
|
+
8. **참조 경로 실재 검증**
|
|
285
|
+
문서에 인용된 `파일경로:라인번호`, `@path` 형태의 경로가 실제 파일 시스템에 존재하는가? (Read/Glob 도구로 확인. 라인번호는 파일 라인 수 이내인지만 확인)
|
|
286
|
+
|
|
287
|
+
#### 완독 의무
|
|
288
|
+
|
|
289
|
+
사용자 초기 요청 메시지·WBS 문서·Feature 문서는 끝까지 읽는다. 키워드 검색만으로 종결하지 않는다.
|
|
290
|
+
|
|
291
|
+
#### 출력 포맷
|
|
292
|
+
|
|
293
|
+
subagent는 다음 구조의 보고서를 작성한다.
|
|
294
|
+
|
|
295
|
+
- **요약 표** — 8개 항목 각각 PASS/FAIL
|
|
296
|
+
- **정량 매핑 표** (항목 1) — 컬럼: `원본 표현` / `출처` / `Feature 문서 위치` / `Feature 문서 표현`. 반영 위치가 비어 있으면 누락 항목.
|
|
297
|
+
- **항목별 FAIL 상세**
|
|
298
|
+
- 항목 1: 누락 / 의역 변형 의심 — `[출처] 원문: "..." → 권장 반영 위치: Feature 섹션·라인`
|
|
299
|
+
- 항목 2: WBS 미매핑 — `[WBS 위치] 항목: "..." → Feature 문서 미반영`
|
|
300
|
+
- 항목 3: Example 미매핑 — `Rule "..." Example "..." → Scenario 없음`
|
|
301
|
+
- 항목 4: 번호 결함 — `D# 누락/중복/역순 위치`
|
|
302
|
+
- 항목 5: Slice 의존 무효 — `Slice N: 의존 "M" 실재 안 함`
|
|
303
|
+
- 항목 6: 추상 표현 잔존 — `Feature 문서 라인 N: "..."`
|
|
304
|
+
- 항목 7: 근거 태그 누락 — `Feature 문서 라인 N: "..."`
|
|
305
|
+
- 항목 8: 참조 경로 무효 — `Feature 문서 라인 N: "경로:라인" → 실재 안 함`
|
|
306
|
+
|
|
307
|
+
### 메인의 결과 처리
|
|
308
|
+
|
|
309
|
+
1. subagent 보고서의 **각 FAIL 항목**에 대해 `/sd-clarify`로 사용자에게 명확화 질문한다.
|
|
310
|
+
- 결정 대상: 반영 여부 / 반영 위치 / 표현 정확도
|
|
311
|
+
- 답변에 따라 Feature 문서를 메인이 직접 수정한다.
|
|
312
|
+
2. 모든 명확화·반영이 끝나면 동일 subagent를 재호출하여 모든 항목 PASS를 확인한 후 Feature 문서 최종 저장.
|
|
313
|
+
|
|
314
|
+
**CRITICAL: 각 Slice는 sd-tdd로 구현되므로, 절대(NEVER) Feature 문서에 누락이 있어서는 안됨**
|
|
261
315
|
|
|
262
316
|
## Step 8: 역방향 피드백
|
|
263
317
|
|
|
264
318
|
wbs 문서에 변경/발견 사항을 반드시 반영한다. 누락/불일치 수정을 생략하지 않는다.
|
|
319
|
+
|
|
265
320
|
- 범위 축소/확대, 경계 재조정, Feature 간 범위 이관 등 고객 중심 What에 해당하는 변경만 반영한다.
|
|
266
321
|
- API 형태, DB 구조, UI 컴포넌트 구조, 테스트 Slice 같은 How 결정은 WBS에 기록하지 않고 Feature 문서의 `### 설계 결정`과 `## 구현계획`에만 기록한다.
|
|
267
|
-
문서 간 정합성을 유지하고 변경 사유를 명확히 작성한다.
|
|
268
|
-
역방향 피드백의 목적은, 새로운 세션에서 다른 작업을 수행할때 이 세션의 결정사항을 잊지 않고 이어서 하기 위함이다.
|
|
322
|
+
문서 간 정합성을 유지하고 변경 사유를 명확히 작성한다.
|
|
323
|
+
역방향 피드백의 목적은, 새로운 세션에서 다른 작업을 수행할때 이 세션의 결정사항을 잊지 않고 이어서 하기 위함이다.
|
|
269
324
|
|
|
270
325
|
## Step 9: 다음 단계 안내
|
|
271
326
|
|
|
@@ -34,7 +34,7 @@ Step 1~5는 장기 프로세스이다. 스킬 시작 시점에 각 Step을 `Task
|
|
|
34
34
|
- **입력**: 무엇을 받는가
|
|
35
35
|
- **출력**: 무엇을 내놓는가
|
|
36
36
|
|
|
37
|
-
`/sd-
|
|
37
|
+
`/sd-clarify` 스킬을 호출하여 명확화한다.
|
|
38
38
|
|
|
39
39
|
## Step 2: Eval 시나리오 정의
|
|
40
40
|
|
|
@@ -215,7 +215,7 @@ Judge 보고서의 개선 제안에 대해:
|
|
|
215
215
|
- B의 세부 절차는 B 스킬 원문 참조 또는 호출로 대체한다
|
|
216
216
|
- B 호출이 depth 제한을 초과하면 호출 구조 자체를 사용자에게 선택지로 제시한다
|
|
217
217
|
|
|
218
|
-
발견된 Prompt Smell에 대해 `/sd-
|
|
218
|
+
발견된 Prompt Smell에 대해 `/sd-clarify` 스킬을 호출하여 진행여부와 방법을 명확화하여 수정한다.
|
|
219
219
|
위임 경계 침범을 리포트할 때는 호출자 스킬, 호출 대상 스킬, 호출자에 복제된 대상 스킬 책임, 남길 계약 정보, 제거·이동할 세부 절차를 포함한다.
|
|
220
220
|
|
|
221
221
|
### Regression Guard
|
|
@@ -16,7 +16,7 @@ sd-refactor는 "구조 개선 방향 제안"(패키지/아키텍처 수준)에
|
|
|
16
16
|
- **린터/타입체커 영역**: 타입 누락, `any` 사용, 미사용 변수, 코드 스타일
|
|
17
17
|
- **거짓 양성**: 프레임워크가 요구하는 패턴, 프로젝트 컨벤션에 의한 의도적 구조
|
|
18
18
|
|
|
19
|
-
이슈가 의도된 설계인지 불확실하거나, 제안이 기존 기능의 동작 변경을 수반하는 경우 `/sd-
|
|
19
|
+
이슈가 의도된 설계인지 불확실하거나, 제안이 기존 기능의 동작 변경을 수반하는 경우 `/sd-clarify` 스킬을 호출하여 명확화한다. 사용자 확인 없이 기능 변경을 리포트에 포함하지 않는다.
|
|
20
20
|
|
|
21
21
|
## Step 1: 대상 결정
|
|
22
22
|
|
|
@@ -95,7 +95,7 @@ Step 3에서 탐지된 이슈를 사용자에게 제시하기 전에 거짓 양
|
|
|
95
95
|
각 이슈에 대해:
|
|
96
96
|
1. **코드 재대조**: 해당 위치의 코드를 Read 도구로 **반드시 다시 읽고**, 이슈가 실제로 존재하는지 확인한다. 거짓 양성으로 판단된 이슈는 제거한다.
|
|
97
97
|
2. **중복 이슈 병합**: 동일 근본 원인에서 파생된 이슈를 하나로 병합한다.
|
|
98
|
-
3. **명확화 판단**: 코드 주석·변수명 등에 의도적 설계를 시사하는 표현("의도적", "팀 규칙", "컨벤션" 등)이 있는 경우, 해당 이슈를 제외하기 전에 반드시 `/sd-
|
|
98
|
+
3. **명확화 판단**: 코드 주석·변수명 등에 의도적 설계를 시사하는 표현("의도적", "팀 규칙", "컨벤션" 등)이 있는 경우, 해당 이슈를 제외하기 전에 반드시 `/sd-clarify` 스킬을 호출하여 분류를 수행한다. 코드 주석만으로는 VERIFIED가 아니며, CLAUDE.md나 공식 문서에 근거가 없으면 INFERRED Medium 이하로 분류한다.
|
|
99
99
|
|
|
100
100
|
검증을 통과한 이슈만 Step 5로 진행한다.
|
|
101
101
|
|
|
@@ -13,7 +13,7 @@ description: 정적 분석이 잡지 못하는 관점(로직 버그, 일관성,
|
|
|
13
13
|
- `review.md` 같은 별도 리뷰 파일을 생성하지 않는다.
|
|
14
14
|
- 확정 이슈 목록은 대화 맥락으로 `/sd-dev`에 전달한다.
|
|
15
15
|
- `/sd-dev`의 마지막 단계에서 호출된 경우, 기존 `/sd-dev` 실행은 `/sd-review` 호출 시점에 종료된 것으로 본다.
|
|
16
|
-
- 이슈 여부가 명확하지 않으면 `/sd-
|
|
16
|
+
- 이슈 여부가 명확하지 않으면 `/sd-clarify`로 명확화하고, 해소되지 않은 항목은 확정 이슈로 넘기지 않는다.
|
|
17
17
|
|
|
18
18
|
## Step 1: 대상 결정
|
|
19
19
|
|
|
@@ -154,8 +154,8 @@ Step 3에서 탐지된 이슈를 하나씩 순회하며, 해당 위치의 코드
|
|
|
154
154
|
|
|
155
155
|
## Step 5: 남은 이슈 명확화
|
|
156
156
|
|
|
157
|
-
Step 4를 통과한 이슈를 최종 이슈로 확정하기 전에 `/sd-
|
|
158
|
-
명확성 분류, 근거 탐색, 재분류 보고, 사용자 질문 여부는 `/sd-
|
|
157
|
+
Step 4를 통과한 이슈를 최종 이슈로 확정하기 전에 `/sd-clarify`에 전달한다.
|
|
158
|
+
명확성 분류, 근거 탐색, 재분류 보고, 사용자 질문 여부는 `/sd-clarify`의 기준을 따른다.
|
|
159
159
|
|
|
160
160
|
### 전달 내용
|
|
161
161
|
|
|
@@ -167,7 +167,7 @@ Step 4를 통과한 이슈를 최종 이슈로 확정하기 전에 `/sd-inner-cl
|
|
|
167
167
|
- Severity 후보: Critical / Medium / Low
|
|
168
168
|
- Step 4에서 확인한 검증 근거와 남은 불확실성
|
|
169
169
|
|
|
170
|
-
`/sd-
|
|
170
|
+
`/sd-clarify` 결과 사용자가 제외하기로 선택한 이슈는 Step 6 최종 이슈 목록에서 제거한다.
|
|
171
171
|
이슈 여부가 해소되지 않은 항목이 남아 있으면 Step 6으로 진행하지 않는다.
|
|
172
172
|
|
|
173
173
|
## Step 6: 이슈 정리
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-tdd
|
|
3
3
|
description: 구현계획(plan) 기반으로 TDD 개발하는 스킬
|
|
4
|
-
effort: medium
|
|
5
4
|
---
|
|
6
5
|
|
|
7
6
|
# sd-tdd: TDD 개발
|
|
@@ -64,7 +63,7 @@ Feature 문서 및 WBS 문서의 `## 참조 자료` 섹션 및 그 하위섹션
|
|
|
64
63
|
|
|
65
64
|
### 1-3. 문서 정합성 확인
|
|
66
65
|
|
|
67
|
-
요구명세의 각 Scenario에서 참조하는 기능·메서드를 구현계획과 대조한다. 다음과 같은 불명확한 부분이 있으면 `/sd-
|
|
66
|
+
요구명세의 각 Scenario에서 참조하는 기능·메서드를 구현계획과 대조한다. 다음과 같은 불명확한 부분이 있으면 `/sd-clarify` 스킬을 호출하여 명확화한다:
|
|
68
67
|
|
|
69
68
|
- Scenario가 참조하는 메서드/기능이 구현계획의 Slice에 등장하지 않음
|
|
70
69
|
- 요구명세의 용어와 구현계획의 용어가 서로 다름 (동일 개념을 다른 이름으로 지칭)
|
|
@@ -110,7 +109,7 @@ Acceptance Test는 Feature의 **외부 계약**을 도메인 언어로 검증한
|
|
|
110
109
|
- **스펙 충돌**: 이번 Feature의 요구명세와 다른 동작을 기대 → 스펙에 맞게 선수정
|
|
111
110
|
- **실제 버그**: 기존 구현의 버그를 미검증 → 이번 Feature 범위 내면 수정, 범위 밖이면 사용자에게 보고 후 판단
|
|
112
111
|
- **무관**: 이번 Scenario와 무관한 동작 검증 → 건드리지 않음
|
|
113
|
-
3. 판단이 모호하면 `/sd-
|
|
112
|
+
3. 판단이 모호하면 `/sd-clarify`로 명확화한다.
|
|
114
113
|
4. 선수정이 끝난 뒤 새 Acceptance Test 작성으로 진행한다.
|
|
115
114
|
|
|
116
115
|
#### Gherkin Scenario 변환
|
|
@@ -8,6 +8,35 @@ description: 프로젝트 요구사항을 Feature 단위로 분해하는 스킬.
|
|
|
8
8
|
WBS는 고객 중심으로 **무엇을 만들어야 하는지(What)** 를 확정하는 산출물이다.
|
|
9
9
|
Feature 범위에는 이후 `/sd-dev`가 바로 시작되어도 해석이 갈리지 않는 고객 동작과 업무 규칙만 남긴다.
|
|
10
10
|
|
|
11
|
+
## What/How 경계
|
|
12
|
+
|
|
13
|
+
비즈니스 요구사항(What)에 대해 분석한다.
|
|
14
|
+
|
|
15
|
+
- 기술적 구현 방법(How) — 인증 방식, 통신 프로토콜, 프레임워크, 아키텍처 패턴 등에 대한 결정은 이 단계의 범위가 아니다.
|
|
16
|
+
- `/sd-clarify` 스킬을 호출하여 명확화한다.
|
|
17
|
+
|
|
18
|
+
### What/How 분류 규칙 (CRITICAL)
|
|
19
|
+
|
|
20
|
+
**다음 항목은 sd-wbs에서 반드시 확정한다 — sd-plan으로 위임 금지(NEVER):**
|
|
21
|
+
|
|
22
|
+
- 고객/사용자 동작, 업무 규칙, 정책, 예외 흐름
|
|
23
|
+
- 수치(최대/최소/기본값/허용 범위), 기간, 시간대, 경계값
|
|
24
|
+
- 권한, 역할, 상태, 상태 전이, 열거값(enum 후보)
|
|
25
|
+
- 화면/플로우의 분기 조건과 결과
|
|
26
|
+
- 기능 포함 여부 자체
|
|
27
|
+
|
|
28
|
+
**다음 항목은 sd-plan에서 결정한다 — sd-wbs에서 묻지 않는다:**
|
|
29
|
+
|
|
30
|
+
- 인증 방식, 통신 프로토콜, 프레임워크, 아키텍처 패턴
|
|
31
|
+
- DB 종류, API 형태, 컴포넌트 구조, 테스트 분해
|
|
32
|
+
- 라이브러리 선택, 의존성 주입, import 패턴
|
|
33
|
+
|
|
34
|
+
**분류가 모호하면 What으로 분류한다 (default = sd-wbs 확정 대상).**
|
|
35
|
+
|
|
36
|
+
- "plan에서 결정될 것 같다"는 자체 판단으로 위임 금지(NEVER).
|
|
37
|
+
- "어차피 sd-plan이 WBS 미확정/누락을 되돌릴 것이다"는 안전망 의존 금지(NEVER). 그 절차는 sd-wbs의 누락을 잡는 백업이지, sd-wbs의 책임을 다음 단계로 떠넘기는 경로가 아니다.
|
|
38
|
+
- 모호한 항목은 `/sd-clarify`로 사용자에게 직접 질문하여 What/How를 확정한다.
|
|
39
|
+
|
|
11
40
|
## Step 1: 요구사항 수집
|
|
12
41
|
|
|
13
42
|
사용자가 제공한 요구사항에 대한 분석을 시작한다.
|
|
@@ -20,8 +49,6 @@ Feature 번호 변경이 필요한 경우 기존 번호 → 새 번호 매핑과
|
|
|
20
49
|
|
|
21
50
|
### 원본 완독 보고 (CRITICAL)
|
|
22
51
|
|
|
23
|
-
`/sd-inner-clarify`를 호출하기 **전에 반드시** 다음 보고를 출력한다. 보고 없이 명확화 단계로 진입하는 것은 **금지(NEVER)**.
|
|
24
|
-
|
|
25
52
|
**[원본 분석 보고]** 형식:
|
|
26
53
|
|
|
27
54
|
- 자료 1: `{파일경로 또는 메시지 영역}` ({분량: 페이지/라인/메일 통수 등}) — 완독 여부: [완독 | 부분({읽지 못한 구간})]. 핵심 발화/구절 요약: ...
|
|
@@ -33,53 +60,24 @@ Feature 번호 변경이 필요한 경우 기존 번호 → 새 번호 매핑과
|
|
|
33
60
|
- **메일 thread**: 모든 통수를 명시하고 각각 읽었음을 확인한다. 발신자/수신자/제목/일시를 식별 가능하게 적는다.
|
|
34
61
|
- **회의 대본**: 발화자 단위로 핵심 결정·요구를 추출한다. "전체 봄"으로 종결하면 위반.
|
|
35
62
|
- **분량 명시**: 각 자료의 페이지/라인/통수 등 분량을 객관 수치로 출력하여 부분 독해를 표면화한다.
|
|
36
|
-
- **부분 독해 금지**: "부분"으로 보고된 자료가 있으면 추가 읽기를 수행하여 완독 상태로 전환한다. 부분 상태로 `/sd-
|
|
63
|
+
- **부분 독해 금지**: "부분"으로 보고된 자료가 있으면 추가 읽기를 수행하여 완독 상태로 전환한다. 부분 상태로 `/sd-clarify` 진입 금지.
|
|
37
64
|
- **사용자 메시지 본문 포함**: 메시지에 직접 붙여넣어진 요구사항·예시·제약도 자료로 취급하여 보고에 포함한다.
|
|
38
65
|
|
|
39
|
-
이 보고가 출력된 뒤에만 `/sd-inner-clarify` 스킬을 호출하여 명확화한다.
|
|
40
|
-
|
|
41
66
|
## Step 2: Impact Mapping
|
|
42
67
|
|
|
43
68
|
Impact Mapping 트리(Goal → Actor → Impact → Deliverable)를 구축한다.
|
|
44
69
|
|
|
45
|
-
### What/How 경계
|
|
46
|
-
|
|
47
|
-
비즈니스 요구사항(What)에 대한 분석만 한다.
|
|
48
|
-
|
|
49
|
-
- 기술적 구현 방법(How) — 인증 방식, 통신 프로토콜, 프레임워크, 아키텍처 패턴 등 — 에 대한 결정은 분석 단계에서 하지 않는다.
|
|
50
|
-
- `/sd-inner-clarify` 스킬을 호출하여 명확화한다.
|
|
51
|
-
|
|
52
|
-
#### What/How 분류 규칙 (CRITICAL)
|
|
53
|
-
|
|
54
|
-
**다음 항목은 sd-wbs에서 반드시 확정한다 — sd-plan으로 위임 금지(NEVER):**
|
|
55
|
-
|
|
56
|
-
- 고객/사용자 동작, 업무 규칙, 정책, 예외 흐름
|
|
57
|
-
- 수치(최대/최소/기본값/허용 범위), 기간, 시간대, 경계값
|
|
58
|
-
- 권한, 역할, 상태, 상태 전이, 열거값(enum 후보)
|
|
59
|
-
- 화면/플로우의 분기 조건과 결과
|
|
60
|
-
- 기능 포함 여부 자체
|
|
61
|
-
|
|
62
|
-
**다음 항목은 sd-plan에서 결정한다 — sd-wbs에서 묻지 않는다:**
|
|
63
|
-
|
|
64
|
-
- 인증 방식, 통신 프로토콜, 프레임워크, 아키텍처 패턴
|
|
65
|
-
- DB 종류, API 형태, 컴포넌트 구조, 테스트 분해
|
|
66
|
-
- 라이브러리 선택, 의존성 주입, import 패턴
|
|
67
|
-
|
|
68
|
-
**분류가 모호하면 What으로 분류한다 (default = sd-wbs 확정 대상).**
|
|
69
|
-
|
|
70
|
-
- "plan에서 결정될 것 같다"는 자체 판단으로 위임 금지(NEVER).
|
|
71
|
-
- "어차피 sd-plan이 WBS 미확정/누락을 되돌릴 것이다"는 안전망 의존 금지(NEVER). 그 절차는 sd-wbs의 누락을 잡는 백업이지, sd-wbs의 책임을 다음 단계로 떠넘기는 경로가 아니다.
|
|
72
|
-
- 모호한 항목은 `/sd-inner-clarify`로 사용자에게 직접 질문하여 What/How를 확정한다.
|
|
73
|
-
|
|
74
70
|
### 명확화 항목
|
|
75
71
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
|
|
|
82
|
-
|
|
|
72
|
+
모든 항목은 `/sd-clarify`스킬을 호출하여 명확화 한다.
|
|
73
|
+
|
|
74
|
+
| 질문 | 도출 요소 |
|
|
75
|
+
| ------------------------------------- | -------------------- |
|
|
76
|
+
| Q1. "왜 만드나?" 반복 | Goal (측정 가능하게) |
|
|
77
|
+
| Q2. "누가 쓰나? 누가 영향받나?" | Actor |
|
|
78
|
+
| Q3. "그 사람 행동이 어떻게 바뀌어야?" | Impact (행동 변화) |
|
|
79
|
+
| Q4. "가장 단순하게 뭘 만들면?" | Deliverable |
|
|
80
|
+
| Q5. "뭘 빼나?" | 제외 사항 |
|
|
83
81
|
|
|
84
82
|
**나쁜예:**
|
|
85
83
|
|
|
@@ -188,14 +186,14 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 **기능*
|
|
|
188
186
|
- **나쁜 예:** 검색 기능
|
|
189
187
|
- **나쁜 예:** 도서 목록 개선
|
|
190
188
|
|
|
191
|
-
항목별 근거가 없는 범위는 Feature에 포함하지 않는다. 필요해 보이지만 근거가 없으면 `/sd-
|
|
189
|
+
항목별 근거가 없는 범위는 Feature에 포함하지 않는다. 필요해 보이지만 근거가 없으면 `/sd-clarify`로 포함 여부를 질문한다.
|
|
192
190
|
|
|
193
191
|
### 미확정 요구 처리 규칙
|
|
194
192
|
|
|
195
193
|
**CRITICAL: Feature 범위에는 구현자가 바로 `/sd-dev`로 들어가도 해석이 갈리지 않는 확정된 고객 동작과 업무 규칙만 남긴다.**
|
|
196
194
|
|
|
197
195
|
- WBS Feature 안에는 "후속 확정", "보류", "추후 결정", "협의 필요" 같은 미확정 usecase를 넣지 않는다.
|
|
198
|
-
- 원문에 미확정이라고 적힌 고객 요구, 업무 규칙, 정책, 예외 흐름은 WBS 작성 시점에 `/sd-
|
|
196
|
+
- 원문에 미확정이라고 적힌 고객 요구, 업무 규칙, 정책, 예외 흐름은 WBS 작성 시점에 `/sd-clarify`로 질문하여 **확정될 때까지 반복**한다. 추정 진행이나 "추후 결정" fallback은 금지(NEVER).
|
|
199
197
|
- 사용자가 명시적으로 "포함 안 함"으로 결정한 항목만 "제외 사항"에 기재한다.
|
|
200
198
|
- Feature의 범위 항목은 완료 판정 가능한 사용자 동작으로만 작성하고, 각 항목에 출처를 남긴다.
|
|
201
199
|
- 기술 구현 방식(API 형태, DB 구조, 프레임워크, 테스트 분해 등)은 WBS에서 결정하지 않는다. 해당 결정은 `/sd-plan`에서 다룬다.
|
|
@@ -218,7 +216,8 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 **기능*
|
|
|
218
216
|
|
|
219
217
|
---
|
|
220
218
|
|
|
221
|
-
각 Feature의 세부 사항을 분류하고 `/sd-
|
|
219
|
+
각 Feature의 세부 사항을 분류하고 `/sd-clarify` 스킬을 호출하여 불명확한 부분을 명확화한다.
|
|
220
|
+
|
|
222
221
|
- **나쁜 예:** "예약 기능 포함이 결정됨 → 예약 세부규칙(대기열 정책, 미대출 시 자동취소 기간)도 확정" — 기능 포함 여부와 세부 수치/규칙은 별개다. 세부사항은 별도로 분류·질문한다.
|
|
223
222
|
|
|
224
223
|
### Feature-Deliverable 역추적 강제 규칙
|
|
@@ -228,7 +227,7 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 **기능*
|
|
|
228
227
|
Feature를 작성하다가 "이건 시스템 동작상 당연히 필요하다"는 판단이 드는데 Impact Mapping Deliverable로 역추적 불가한 경우(예: 사용자 계정 관리, 권한 설정, 로그, 알림 설정 등 Impact Mapping에는 없지만 실행에 필요해 보이는 기능):
|
|
229
228
|
|
|
230
229
|
1. **절대 혼자 추가하지 않는다(NEVER).** "당연히 필요하다"는 추측으로 Feature를 임의 추가하거나 제외 사항에 자체 결정을 기재하는 것은 금지.
|
|
231
|
-
2. **반드시 `/sd-
|
|
230
|
+
2. **반드시 `/sd-clarify`를 호출**하여 해당 기능을 포함할지 질문한다. 질문 형식:
|
|
232
231
|
- 결정 대상: "{기능명}"을 시스템에 포함할지
|
|
233
232
|
- 선택지: 포함 / 미포함 / 수행 안 함
|
|
234
233
|
3. **포함으로 결정되면** Step 2로 돌아가 Impact Mapping에 해당 Deliverable을 먼저 추가한 뒤, Feature를 작성한다.
|
|
@@ -251,11 +250,11 @@ Feature를 작성하다가 "이건 시스템 동작상 당연히 필요하다"
|
|
|
251
250
|
4. **Feature 독립성 (단일 책임)** — 한 Feature의 이름과 실제 범위가 일치하는지 확인한다. 이름에 드러나지 않는 일을 몰래 수행하면 분리한다.
|
|
252
251
|
5. **병합 규칙 준수** — Step 3 "Feature 병합 규칙"의 기계적 판정 규칙을 위반하는 Feature가 없는지 확인한다.
|
|
253
252
|
6. **범위 항목의 검증 가능성** — 각 세부 기능이 완료 판정 가능한 구체적 표현인지 확인한다. "개선한다", "최적화한다" 같은 모호한 표현은 구체 동작으로 재작성한다.
|
|
254
|
-
7. **미확정 요구 제거** — "후속 확정", "보류", "추후 결정", "협의 필요" 같은 표현이 Feature 범위/경계/근거에 남아 있으면 `/sd-
|
|
255
|
-
8. **범위 항목별 근거 확인** — 모든 범위 항목 끝에 `(근거: ...)`가 있는지 확인한다. 근거가 없는 항목은 `/sd-
|
|
253
|
+
7. **미확정 요구 제거** — "후속 확정", "보류", "추후 결정", "협의 필요" 같은 표현이 Feature 범위/경계/근거에 남아 있으면 `/sd-clarify`로 확정 질문을 수행하여 모두 확정 처리한다.
|
|
254
|
+
8. **범위 항목별 근거 확인** — 모든 범위 항목 끝에 `(근거: ...)`가 있는지 확인한다. 근거가 없는 항목은 `/sd-clarify`로 확정 처리한다.
|
|
256
255
|
9. **plan 위임 차단** — Feature 범위/경계/근거에 "plan에서 결정", "구현 시 결정", "추후 결정", "협의 필요", "별도 확정" 같은 표현이나 sd-plan으로 위임 대기 중인 항목이 남아 있는지 점검한다. 발견 시 다음 절차를 수행한다.
|
|
257
256
|
- Step 2 "What/How 분류 규칙"에 따라 해당 항목의 영역을 재분류한다.
|
|
258
|
-
- **What으로 분류되면** `/sd-
|
|
257
|
+
- **What으로 분류되면** `/sd-clarify`로 확정 질문을 강제하고, 답변을 받아 Feature 범위에 반영한다.
|
|
259
258
|
- **How로 분류되면** 해당 항목을 Feature 범위에서 제거하고, 경계 또는 근거에 "sd-plan에서 결정"임을 명시한다.
|
|
260
259
|
- **"plan으로 미루기" 표현을 그대로 남기는 것은 금지(NEVER).**
|
|
261
260
|
|
|
@@ -341,16 +340,71 @@ Feature를 작성하다가 "이건 시스템 동작상 당연히 필요하다"
|
|
|
341
340
|
|
|
342
341
|
- 사용자가 명시적으로 "포함 안 함"으로 결정한 항목과 Impact Mapping에서 Goal에 연결되지 않는 기능을 나열한다.
|
|
343
342
|
- 각 항목은 `제외 항목 — 사유: ... / 출처: ... / 재검토 조건: ...` 형식으로 작성한다.
|
|
344
|
-
- 사유에는 Goal 미연결, 사용자 명시적 제외, 범위 초과 중 하나를 사용한다. "미확정"은 사유로 사용하지 않는다 (미확정은 `/sd-
|
|
343
|
+
- 사유에는 Goal 미연결, 사용자 명시적 제외, 범위 초과 중 하나를 사용한다. "미확정"은 사유로 사용하지 않는다 (미확정은 `/sd-clarify`로 반드시 확정 처리).
|
|
344
|
+
|
|
345
|
+
## Step 6: 격리 검증 (정보 유실·누락 점검)
|
|
346
|
+
|
|
347
|
+
문서 작성 후, 작성자 편향 제거와 정보 유실 차단을 위해 메인 세션과 분리된 subagent로 격리 검증을 수행한다.
|
|
348
|
+
|
|
349
|
+
### 검증 호출
|
|
350
|
+
|
|
351
|
+
`Agent` tool로 `subagent_type: "general-purpose"`, `model: "haiku"`를 호출한다.
|
|
352
|
+
|
|
353
|
+
subagent에 전달할 입력:
|
|
354
|
+
|
|
355
|
+
- **wbs.md 절대 경로** — 검증 대상
|
|
356
|
+
- **원본 자료 절대 경로 목록** — 첨부 파일(docx/xlsx/pdf 등). `/sd-doc-extract`로 추출된 파일이 있으면 함께 전달.
|
|
357
|
+
- **사용자 초기 요청 메시지 본문** — 프롬프트에 인라인 삽입
|
|
358
|
+
|
|
359
|
+
사용자 명확화 답변·결정사항은 wbs.md의 `근거:` 필드와 "제외 사항"에 반영되어 있으므로 별도 전달하지 않는다.
|
|
360
|
+
|
|
361
|
+
subagent에 부여할 제약: "보고만 수행. wbs.md를 수정하지 말 것."
|
|
362
|
+
|
|
363
|
+
### subagent 프롬프트에 포함할 검증 가이드
|
|
364
|
+
|
|
365
|
+
#### 검증 항목 (4가지 모두 수행)
|
|
366
|
+
|
|
367
|
+
1. **분류별 누락 점검** — 원본 자료에서 카테고리별로 사실 항목을 추출하고 wbs.md 반영 여부 점검
|
|
368
|
+
- 수치 (최대/최소/기본값/허용 범위, 기간, 시간대, 경계값)
|
|
369
|
+
- 열거값 (상태, 권한, 역할, 옵션 후보)
|
|
370
|
+
- 업무 규칙·정책
|
|
371
|
+
- 제약 조건
|
|
372
|
+
- 권한·역할 (Actor 단위)
|
|
373
|
+
- 상태 전이
|
|
374
|
+
- 예외 흐름·분기 조건
|
|
375
|
+
- 참조 자료 경로 + 확인 목적
|
|
376
|
+
|
|
377
|
+
2. **정량 매핑 표** — 원본 사실 항목을 1:1로 wbs.md 위치(Feature 번호:범위 항목 또는 프로젝트 개요)에 매핑
|
|
378
|
+
|
|
379
|
+
3. **양방향 커버리지**
|
|
380
|
+
- 원본 → wbs: 원본에 있는데 wbs.md에 없는 항목 (누락)
|
|
381
|
+
- wbs → 원본: wbs.md에 있는데 원본/근거에서 추적 불가한 항목 (근거 없는 추가)
|
|
382
|
+
|
|
383
|
+
4. **의역 변형 검출** — 원문이 구체적인데 wbs.md가 추상화된 사례
|
|
384
|
+
- 예: 원문 "최대 100건" → wbs "다수 항목" (정보 손실)
|
|
385
|
+
- 예: 원문 "월요일 오전 9시" → wbs "주 1회" (정보 손실)
|
|
386
|
+
|
|
387
|
+
#### 완독 의무
|
|
388
|
+
|
|
389
|
+
원본 자료(첨부 파일·인라인 요청 메시지)는 끝까지 읽는다. 키워드 검색만으로 종결하지 않는다.
|
|
390
|
+
|
|
391
|
+
#### 출력 포맷
|
|
392
|
+
|
|
393
|
+
subagent는 다음 구조의 보고서를 작성한다.
|
|
345
394
|
|
|
346
|
-
|
|
395
|
+
- **요약** — 원본 항목 수 / 매핑된 항목 / 누락 / 근거 없는 추가 / 의역 변형 의심 (각 정수)
|
|
396
|
+
- **정량 매핑 표** — 컬럼: `원본 표현` / `출처(자료명·위치)` / `wbs.md 반영 위치` / `wbs 표현`. 반영 위치가 비어 있으면 누락 항목.
|
|
397
|
+
- **누락 항목 목록** — `[출처] 원문: "..." → 권장 반영 위치: Feature X.Y 범위 / 프로젝트 개요 등`
|
|
398
|
+
- **근거 없는 추가 항목 목록** — `[wbs 위치] 표현: "..." → 검토 사유`
|
|
399
|
+
- **의역 변형 의심 항목 목록** — `원문 "..." → wbs "..." → 손실 추정: ...`
|
|
347
400
|
|
|
348
|
-
|
|
401
|
+
### 메인의 결과 처리
|
|
349
402
|
|
|
350
|
-
|
|
351
|
-
-
|
|
352
|
-
-
|
|
353
|
-
|
|
403
|
+
1. subagent 보고서의 **누락·근거 없는 추가·의역 변형** 각 항목에 대해 `/sd-clarify`로 사용자에게 명확화 질문한다.
|
|
404
|
+
- 결정 대상: 반영 여부 / 위치 / 표현 정확도
|
|
405
|
+
- 답변에 따라 wbs.md 수정
|
|
406
|
+
2. **기존 WBS 수정 사례 별도 점검** (격리 검증과 무관, 메인 직접 수행): 체크박스 상태(`[ ]`/`[x]`), Feature 번호, 사용자 메모, 제외 사항이 임의 초기화·삭제되지 않았는지 확인한다.
|
|
407
|
+
3. 모든 명확화·반영이 끝나면 wbs.md 최종 저장.
|
|
354
408
|
|
|
355
409
|
**CRITICAL: 각 Feature는 새 세션에서 진행되므로, 절대(NEVER) WBS 문서에 누락이 있어서는 안됨**
|
|
356
410
|
|