Blog
spec-kitspec-driven-developmentarchitecturetask-breakdownclaude-codeai

[Spec Kit ⑤] Plan & Tasks — 기술 설계와 작업 분해

명세는 무엇·왜를 고정했습니다. 이제 /speckit.plan으로 어떻게(기술 스택·아키텍처)를 설계하고, /speckit.tasks로 의존성 순서가 있는 작업 목록을 만든 뒤, /speckit.analyze로 spec·plan·tasks의 정합성을 교차검증합니다.

Data Dynamics2026年6月15日28 min read
This post is not yet translated. The original Korean version is shown below.

4부에서 우리는 dq-monitor(실시간 데이터 품질 모니터링 서비스)의 명세를 쓰고, /speckit.clarify로 빈틈을 메웠습니다. 이제 spec.md에는 무엇을·왜 만드는지가 기술 스택 없이 또렷하게 적혀 있습니다. 하지만 명세만으로는 코드 한 줄 나오지 않습니다. "신선도를 감시한다"는 요구사항과 "Kafka 컨슈머가 5초마다 lag를 폴링한다"는 구현 사이에는 큰 강이 있습니다. 이 글은 그 강을 건너는 두 개의 다리 — /speckit.plan(기술 설계)과 /speckit.tasks(작업 분해) — 그리고 건넌 뒤 다리가 튼튼한지 확인하는 /speckit.analyze(정합성 게이트)에 대한 이야기입니다.

이 글에서 배우는 것

  • /speckit.plan이 spec.md + constitution.md를 읽어 기술 스택과 아키텍처를 설계하는 방식
  • plan 단계가 함께 토해내는 보조 산출물 — data-model.md, contracts/, research.md, quickstart.md
  • /speckit.tasks가 계획을 의존성 순서가 있는 작업 목록(tasks.md)으로 분해하는 법
  • /speckit.analyze가 spec·plan·tasks 사이의 모순·누락·미추적을 잡아내는 교차검증 게이트
  • 명료화 전에 계획하기, 검증 불가능한 거친 작업, analyze 건너뛰기 같은 흔한 함정

이 글은 Spec Kit 시리즈 5부입니다. 4부에서 명세가 완성됐다는 전제로 진행하며, 다음 6부 Implement & Converge에서 이 작업 목록을 실제 코드로 바꿉니다.


1. 워크플로에서 Plan의 위치 — "무엇"에서 "어떻게"로

Spec Kit의 흐름을 다시 떠올려 봅시다. Constitution → Specify → Clarify → Plan → Tasks → Analyze → Implement → Converge. 우리는 지금 한가운데, "무엇/왜"의 영역에서 "어떻게"의 영역으로 넘어가는 변곡점에 서 있습니다.

이 경계는 SDD에서 의도적으로 그어진 선입니다.

명세(spec) 영역계획(plan) 영역
무엇을, 왜 (요구사항·유저 스토리)어떻게 (기술 스택·아키텍처)
기술 중립적 — DB도, 언어도 언급 안 함기술 결정 — PostgreSQL, Python, Kafka 명시
비개발자도 검토 가능엔지니어가 검토하는 설계 문서
바뀌어도 구현 전체가 흔들리지 않음바뀌면 작업·코드가 연쇄적으로 바뀜

왜 굳이 나누나? 명세에 "PostgreSQL을 쓴다"고 박아 두면, 나중에 "사실 우리는 시계열이 많아 TimescaleDB가 맞다"는 판단이 들어도 요구사항 문서까지 같이 뜯어고쳐야 합니다. 무엇과 어떻게를 분리하면, 어떻게는 자유롭게 바꾸되 무엇은 고정된 채로 남습니다. 이것이 SDD가 "명세를 진실의 원천"으로 둘 수 있는 구조적 이유입니다.


2. /speckit.plan — 기술 설계를 끌어내기

/speckit.plan은 두 개의 입력을 읽습니다. spec.md(무엇/왜)와 constitution.md(프로젝트를 관통하는 원칙). 그리고 그 둘을 만족하는 기술 구현 계획specs/001-dq-monitor/plan.md에 씁니다.

여기서 처음으로 기술 스택이 등장합니다. 명세 단계에서 의도적으로 비워 뒀던 칸을, 이제 채웁니다.

2.1 현실적인 plan 프롬프트

계획 단계의 프롬프트는 "마음대로 설계해"가 아니라, 제약과 선호를 명시한 가이드레일을 주는 것이 좋습니다. 에이전트는 비어 있는 결정일수록 그럴듯하지만 근거 없는 선택을 합니다.

/speckit.plan
 
dq-monitor는 데이터 파이프라인의 신선도·정합성·이상치를 감시하는
백엔드 서비스다. UI는 이번 범위 밖이며 REST API와 알림까지만 만든다.
 
기술 제약/선호:
- 언어: Python 3.12 (팀 표준, 데이터 라이브러리 생태계)
- 입력: 파이프라인 실행 이벤트는 Kafka 토픽으로 들어온다
- 상태/메타데이터: PostgreSQL (체크 정의·실행 이력·알림 기록)
- 알림: 우선 Slack Incoming Webhook 하나만 지원, 추후 확장 가능하게
- 배포: 컨테이너 단일 이미지, 외부 의존은 Kafka·PostgreSQL뿐
- constitution의 "관측 가능성 우선" 원칙에 따라 구조화 로깅·메트릭 노출
 
아키텍처는 헌법의 모듈 경계 원칙을 따르고, 이상치 탐지 방식은
초기엔 단순/설명가능한 것으로 시작한다(연구 산출물에 근거를 남길 것).

핵심은 헌법을 명시적으로 호출한 부분입니다. 3부에서 세운 constitution에 "관측 가능성 우선", "모듈 경계", "설명 가능한 단순함부터" 같은 원칙이 있다면, plan은 그 원칙들을 설계 결정으로 번역해야 합니다. 에이전트가 이를 자동으로 읽지만, 프롬프트에서 한 번 더 짚어 주면 일관성이 올라갑니다.

2.2 plan.md가 결정하는 것 — dq-monitor 스택

에이전트가 만들어 내는 plan.md는 결정과 그 근거를 함께 담습니다. 근거 없는 스택 목록은 나중에 누구도 바꿀 수 없는 미신이 됩니다. dq-monitor의 경우 다음과 같은 결정이 나올 만합니다.

영역선택근거(요약)
언어/런타임Python 3.12팀 표준, 데이터 검증·통계 라이브러리 생태계, 헌법의 "팀 친숙도 우선"
이벤트 입력Kafka (confluent-kafka)파이프라인 이벤트가 이미 Kafka로 흐름, at-least-once 소비로 충분
상태 저장소PostgreSQL 16체크 정의·이력·알림의 관계형 모델이 자연스럽고 트랜잭션 필요
체크 엔진인프로세스 룰 평가기초기 규모에선 별도 워커 불필요, 모듈 경계로 분리해 추후 추출 가능
이상치 탐지롤링 통계 기반(z-score / IQR)설명 가능·디버깅 용이, 헌법의 "설명 가능한 단순함부터"
알림Slack Incoming Webhook단일 채널로 시작, Notifier 인터페이스로 추상화해 확장 대비
APIFastAPI + UvicornOpenAPI 자동 생성으로 contracts와 동기화 쉬움
관측성구조화 로깅(JSON) + /metrics(Prometheus)헌법의 "관측 가능성 우선"

단순함을 변명이 아니라 결정으로 남기기. "이상치 탐지를 ML로 안 하고 z-score로 한다"는 선택은 게으름이 아니라 결정입니다. 근거(설명 가능성, 운영 비용, 초기 데이터 부족)를 research.md에 남기면, 6개월 뒤 "왜 ML 안 썼냐"는 질문에 코드가 아니라 문서가 답합니다.

2.3 plan.md 발췌 — 아키텍처 개요

plan.md 본문에는 보통 다음과 같은 구성 요소 다이어그램과 데이터 흐름이 들어갑니다.

## Architecture Overview
 
dq-monitor는 4개의 내부 모듈로 구성된 단일 서비스다.
 
1. **Ingest** — Kafka 컨슈머. 파이프라인 실행 이벤트를 수신해
   정규화한 뒤 Check Engine에 전달.
2. **Check Engine** — 이벤트에 매칭되는 Check 정의를 조회하고
   규칙(freshness/consistency/anomaly)을 평가해 CheckResult를 생성.
3. **Alert Router** — FAIL 상태의 CheckResult를 받아 알림 정책에 따라
   Notifier(현재 Slack)로 라우팅. 중복 억제(dedup) 윈도우 적용.
4. **API** — 체크 CRUD, 결과/알림 조회를 노출하는 REST 레이어.
 
모든 모듈은 PostgreSQL을 공유 상태 저장소로 사용하며,
모듈 간 직접 호출은 명시적 인터페이스를 통해서만 한다(헌법: 모듈 경계).

3. plan 단계의 보조 산출물

/speckit.planplan.md 하나만 내놓지 않습니다. 계획을 검증 가능한 형태로 펼치는 보조 산출물들을 specs/001-dq-monitor/ 아래에 함께 생성합니다. 이 산출물들이야말로 다음 단계(tasks)가 추측 없이 작업을 뽑아낼 수 있는 재료입니다.

specs/001-dq-monitor/
├── spec.md            # (4부) 무엇/왜
├── clarifications.md  # (4부) 명료화 Q&A
├── plan.md            # 기술 설계 — 어떻게
├── data-model.md      # 엔티티·스키마
├── contracts/
│   └── api-spec.json  # REST 계약
├── research.md        # 기술 조사·트레이드오프
└── quickstart.md      # 셋업·검증 절차

3.1 data-model.md — 엔티티와 스키마

명세의 명사들("파이프라인", "체크", "알림")이 여기서 처음으로 테이블이 됩니다.

## Entities
 
| 엔티티 | 설명 | 핵심 필드 |
|---|---|---|
| Pipeline | 감시 대상 데이터 파이프라인 | id, name, owner, sla_minutes |
| Check | 한 파이프라인에 걸린 품질 규칙 | id, pipeline_id, type, params(jsonb), enabled |
| CheckResult | 한 번의 체크 평가 결과 | id, check_id, status, observed(jsonb), evaluated_at |
| Alert | FAIL 결과에서 파생된 알림 | id, check_result_id, channel, sent_at, dedup_key |
 
- Check.type ∈ { freshness, consistency, anomaly }
- CheckResult.status ∈ { PASS, FAIL, ERROR }
- Alert.dedup_key = hash(check_id, day-bucket) — 동일 체크 1일 1알림 억제

스키마 일부는 DDL로 못박아 두면 작업 단계에서 모호함이 사라집니다.

CREATE TABLE check_result (
    id           BIGSERIAL PRIMARY KEY,
    check_id     BIGINT NOT NULL REFERENCES check_def(id),
    status       TEXT   NOT NULL CHECK (status IN ('PASS','FAIL','ERROR')),
    observed     JSONB  NOT NULL,
    evaluated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_check_result_check_time ON check_result (check_id, evaluated_at DESC);

3.2 contracts/api-spec.json — REST 계약

API의 모양을 코드보다 먼저 못박습니다. 이 계약은 나중에 테스트 작업의 기준점이 됩니다(계약 위반 = 테스트 실패).

{
  "openapi": "3.1.0",
  "info": { "title": "dq-monitor API", "version": "0.1.0" },
  "paths": {
    "/checks": {
      "post": {
        "summary": "체크 정의 생성",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/CheckCreate" }
            }
          }
        },
        "responses": {
          "201": { "description": "생성됨" },
          "422": { "description": "유효성 오류" }
        }
      }
    },
    "/alerts": {
      "get": {
        "summary": "알림 목록 조회",
        "parameters": [
          { "name": "since", "in": "query", "schema": { "type": "string", "format": "date-time" } },
          { "name": "status", "in": "query", "schema": { "type": "string", "enum": ["FAIL", "ERROR"] } }
        ],
        "responses": { "200": { "description": "알림 배열" } }
      }
    }
  },
  "components": {
    "schemas": {
      "CheckCreate": {
        "type": "object",
        "required": ["pipeline_id", "type", "params"],
        "properties": {
          "pipeline_id": { "type": "integer" },
          "type": { "type": "string", "enum": ["freshness", "consistency", "anomaly"] },
          "params": { "type": "object" }
        }
      }
    }
  }
}

3.3 research.md — 기술 조사와 트레이드오프

plan에서 내린 "단순한 통계 기반 이상치 탐지" 결정의 근거를 남기는 곳입니다. 결정의 대안과 기각 이유를 적는 것이 핵심입니다.

## 이상치 탐지 방식 선택
 
### 후보
| 방식 | 장점 | 단점 |
|---|---|---|
| 롤링 z-score | 구현·설명 단순, 즉시 동작 | 분포 가정(정규성)에 민감 |
| IQR(사분위) | 이상점에 강건, 분포 가정 약함 | 윈도우 크기 튜닝 필요 |
| ML(예: Isolation Forest) | 복잡 패턴 포착 | 학습 데이터·운영 비용·설명성 부담 |
 
### 결정
초기에는 **IQR 기반**을 기본으로, z-score를 옵션으로 제공한다.
- 헌법 원칙 "설명 가능한 단순함부터"에 부합
- 운영 첫 단계에서 학습 데이터가 충분치 않음
- 추후 Check.type=anomaly의 params로 method를 받아 확장 여지를 남김
 
### 미해결
- 윈도우 크기 기본값(예: 직전 50개)은 quickstart의 샘플 데이터로 재검토.

3.4 quickstart.md — 셋업과 검증 절차

"이 계획대로 만들면 어떻게 띄우고 무엇으로 맞았는지 확인하는가"를 적습니다. 구현이 끝났을 때의 수용 기준 리허설이기도 합니다.

## Quickstart
 
### 1. 의존 서비스 기동
docker compose up -d kafka postgres
 
### 2. 마이그레이션 & 서비스 실행
make migrate
make run        # FastAPI(:8000) + Kafka 컨슈머 동시 기동
 
### 3. 스모크 검증
# 체크 생성
curl -X POST localhost:8000/checks -d '{"pipeline_id":1,"type":"freshness","params":{"sla_minutes":30}}'
# 지연 이벤트 주입 → FAIL → Slack 알림 도착 확인
make seed-stale-event
curl 'localhost:8000/alerts?status=FAIL'   # 방금 알림이 보여야 함

4. /speckit.tasks — 계획을 작업으로 분해하기

계획과 보조 산출물이 갖춰지면, /speckit.tasks가 이들을 읽어 실행 가능하고, 순서가 있고, 의존성을 아는 작업 목록을 tasks.md로 만듭니다.

좋은 작업 분해의 두 가지 성질은 이렇습니다.

  1. 검증 가능한 입자 크기. 각 작업은 "끝났는지 아닌지"를 명확히 판정할 수 있어야 합니다. "체크 엔진 구현"은 너무 큽니다. "freshness 규칙 평가 함수 + 단위 테스트"는 적당합니다.
  2. 의존성 인식 순서. 데이터 모델 없이 API를 짤 수 없고, 체크 엔진 없이 알림을 라우팅할 수 없습니다. 작업은 이 인과 순서를 따라야 합니다.

4.1 tasks.md 발췌 — 빌드 순서

dq-monitor의 자연스러운 빌드 순서는 스캐폴딩 → 데이터 모델 → 체크 엔진 → 알림 라우팅 → API → 테스트입니다. [P]는 선행 작업이 끝나면 서로 병렬 가능한 작업을 뜻합니다.

# Tasks: dq-monitor (001)
 
## Phase 0 — 스캐폴딩
- [ ] T001  프로젝트 구조·의존성·도커 컴포즈(Kafka/PostgreSQL) 셋업
- [ ] T002  구조화 로깅·설정 로더·/metrics 엔드포인트 골격 (헌법: 관측성)
 
## Phase 1 — 데이터 모델  (의존: T001)
- [ ] T003  data-model.md 기반 SQL 마이그레이션 작성(pipeline, check_def, check_result, alert)
- [ ] T004  ORM/리포지토리 계층 + 마이그레이션 적용 테스트
 
## Phase 2 — 체크 엔진  (의존: T004)
- [ ] T005  [P] freshness 규칙 평가기 + 단위 테스트
- [ ] T006  [P] consistency 규칙 평가기 + 단위 테스트
- [ ] T007  [P] anomaly(IQR) 규칙 평가기 + 단위 테스트 (research.md 근거)
- [ ] T008  CheckEngine 디스패처: 이벤트→매칭 체크→CheckResult 영속화
 
## Phase 3 — 입력 파이프라인  (의존: T008)
- [ ] T009  Kafka 컨슈머: 이벤트 수신·정규화·CheckEngine 호출 (at-least-once)
 
## Phase 4 — 알림 라우팅  (의존: T008)
- [ ] T010  Notifier 인터페이스 + SlackWebhookNotifier 구현
- [ ] T011  AlertRouter: FAIL 결과 라우팅 + dedup_key 중복 억제
 
## Phase 5 — API  (의존: T004, contracts/api-spec.json)
- [ ] T012  [P] POST /checks (CheckCreate 검증 → 201/422)
- [ ] T013  [P] GET /alerts (since·status 필터)
 
## Phase 6 — 통합 테스트  (의존: T009, T011, T013)
- [ ] T014  엔드투엔드: 지연 이벤트 주입→FAIL→Slack 알림 (quickstart 시나리오)
- [ ] T015  계약 테스트: api-spec.json 대비 응답 스키마 검증

이 표를 GFM 테이블로도 펼칠 수 있습니다 — 추적성을 명시하면 다음 단계(analyze)가 한결 쉬워집니다.

ID작업의존추적(요구사항/산출물)
T005freshness 평가기T004FR-2(신선도 감시), data-model
T007anomaly(IQR) 평가기T004FR-4(이상치 감시), research.md
T011AlertRouter + dedupT008FR-6(알림), data-model: Alert.dedup_key
T015계약 테스트T013contracts/api-spec.json

추적 가능성(traceability)이 핵심. 모든 작업은 어떤 요구사항이나 산출물로 거슬러 올라갈 수 있어야 합니다. 거슬러 올라갈 곳이 없는 작업은 "왜 하는지 모르는 일"이고, 작업이 없는 요구사항은 "구현되지 않을 약속"입니다. 다음 절의 analyze가 바로 이 둘을 잡습니다.


5. /speckit.analyze — 정합성·커버리지 교차검증

작업 목록까지 나왔지만, 아직 구현으로 넘어가면 안 됩니다. /speckit.analyzespec·plan·tasks 세 문서를 교차검증하는 품질 게이트입니다. 반드시 tasks 이후, implement 이전에 돌립니다 — 코드를 짜기 시작한 뒤에 빈틈을 발견하면 비용이 몇 배로 뜁니다.

analyze가 잡아내는 대표적 문제 유형은 셋입니다.

문제 유형의미예시
커버리지 누락요구사항에 대응하는 작업이 없음spec의 "ERROR 상태도 알림" 요구가 어떤 task에도 없음
미추적 작업어떤 요구사항으로도 거슬러 올라가지 않는 작업plan/spec에 없는 "이메일 알림" task가 등장
모순plan과 spec(또는 tasks)이 충돌spec은 "1일 1알림", plan은 "매 FAIL마다 알림"

5.1 analyze 리포트 예시

# Analyze Report — 001-dq-monitor
 
## ✅ 일치 (요약)
- FR-1·2·3·4(파이프라인/3종 체크) → T003~T008 로 커버
- 헌법 "관측 가능성 우선" → T002 로 반영
 
## ⚠️ 발견된 이슈
| # | 심각도 | 유형 | 내용 |
|---|---|---|---|
| 1 | HIGH | 커버리지 누락 | spec FR-7 "CheckResult.status=ERROR도 운영자에게 통지"에 대응하는 task 없음. AlertRouter(T011)는 FAIL만 라우팅. |
| 2 | MED | 모순 | spec은 "동일 체크 1일 1알림"(dedup=day-bucket)인데, plan.md Alert Router 절은 "중복 억제 윈도우"를 5분으로 기술. dedup 정의 불일치. |
| 3 | LOW | 미추적 작업 | T013의 GET /alerts에 `status` 필터가 있으나, spec에는 알림 필터 요구가 명시되지 않음(있으면 좋은 기능 vs 범위 외 판단 필요). |
 
## 권고
- 이슈 1: T011을 "FAIL+ERROR 라우팅"으로 확장하거나 신규 task 추가.
- 이슈 2: dedup 기준을 spec/plan/data-model 중 하나로 통일(day-bucket 권장).
- 이슈 3: spec에 알림 조회 요구를 추가하거나 task에서 필터 제거.

이슈 2가 analyze의 진가를 보여줍니다. data-model.md(dedup_key = day-bucket)와 plan.md(5분 윈도우)와 spec(1일 1알림)이 미묘하게 어긋나 있었습니다. 사람이 세 문서를 번갈아 읽으며 잡기 어려운 종류의 불일치를, analyze는 한 번에 드러냅니다. 이 단계 없이 구현에 들어갔다면, dedup 로직을 다 짠 뒤에야 "어, 기준이 뭐였지?"를 마주쳤을 겁니다.

analyze는 고치지 않습니다. 드러냅니다. 발견된 이슈를 어떻게 해소할지(어느 문서를 진실로 삼을지)는 사람의 판단입니다. 보통은 명세 쪽으로 회귀해 spec을 진실의 원천으로 통일합니다.


6. 전체 흐름 한눈에 보기

지금까지의 단계가 어떤 입력에서 어떤 출력으로 흐르는지, 그리고 analyze가 어디서 게이트 역할을 하는지 정리하면 다음과 같습니다.

Loading diagram…

핵심은 화살표의 방향입니다. 모든 것은 spec.md + constitution.md에서 시작해 점점 구체화되고, analyze는 그 구체화 과정에서 새로 생긴 어긋남을 다시 위로 되돌립니다. 게이트를 통과해야만 구현으로 내려갑니다.


7. 흔한 함정

도구를 정직하게 쓰려면 함정도 알아야 합니다. plan/tasks 단계에서 반복적으로 보는 세 가지입니다.

함정 1 — 명료화 전에 계획하기

가장 비싼 실수입니다. 명세에 모호함이 남은 채로 /speckit.plan을 돌리면, 에이전트는 빈칸을 자기 마음대로 메우며 설계합니다. "신선도 기준이 30분인지 24시간인지"가 안 정해졌는데 plan은 임의의 값으로 아키텍처를 잡고, 그 위에 작업이 쌓이고, 코드가 올라갑니다. 잘못된 가정 위에 지은 탑은 높을수록 무너질 때 아픕니다. 4부의 /speckit.clarify가 plan보다 먼저인 이유가 이것입니다.

함정 2 — 검증할 수 없는 거친 작업

tasks.md에 "체크 엔진 만들기", "API 구현" 같은 한 줄짜리 거대 작업이 들어가면, 그 작업은 완료 판정이 불가능합니다. 완료 판정이 불가능한 작업은 진행률을 거짓말하게 만들고("80% 됐어요"가 영원히 80%), analyze가 추적성을 검사할 단위도 잃습니다. 작업의 적정 크기는 "한 사람이 반나절~하루에 끝내고, 끝났는지 테스트로 보일 수 있는" 정도입니다.

함정 3 — analyze 건너뛰기

"작업까지 나왔으니 바로 구현 가자"는 유혹이 큽니다. 하지만 analyze를 건너뛰면, 위에서 본 dedup 불일치 같은 문제를 구현 한복판에서 발견하게 됩니다. 그 시점엔 이미 잘못된 가정으로 짠 코드가 있어, 문서·코드를 양쪽으로 고쳐야 합니다. analyze는 30초~수 분이지만, 그것이 막아 주는 재작업은 몇 시간입니다. 게이트는 통행료가 아니라 보험입니다.

함정증상처방
명료화 전 계획plan에 근거 없는 임의값이 박힘clarify를 먼저, plan 프롬프트에 제약 명시
거친 작업진행률이 거짓말, 완료 판정 불가작업을 "테스트로 끝을 증명 가능한" 크기로
analyze 생략구현 중 문서 간 모순 발견tasks 직후 analyze를 의무 게이트로

마치며

이번 글에서 우리는 dq-monitor의 명세를 실행 가능한 설계도와 작업 목록으로 바꿨습니다. /speckit.plan이 기술 스택과 아키텍처를 끌어내고, data-model.md·contracts/·research.md·quickstart.md가 그 설계를 검증 가능한 형태로 펼쳤습니다. /speckit.tasks는 그것을 의존성 순서가 있는 작업으로 분해했고, /speckit.analyze는 세 문서 사이의 어긋남을 구현 전에 드러냈습니다.

이제 우리 손에는 번호가 붙은, 추적 가능한, 정합성이 검증된 작업 목록이 있습니다. 더 이상 "어디서부터 짤까"를 고민할 필요가 없습니다. 다음 6부 Implement & Converge에서는 /speckit.implement로 이 작업들을 순서대로 실제 코드로 바꾸고, GitHub 이슈와 연동하며, /speckit.converge로 산출물과 코드베이스를 대조해 빠진 일을 회수합니다. 드디어 명세가 동작하는 서비스가 되는 순간입니다.

참고 자료