--- name: epic-card description: This skill should be used when the user wants to open an epic in the Meissa Notion ProductTeam Card Table — triggers include "에픽 만들어줘", "Epic Card 생성", "노션에 에픽 파줘", "이 프로젝트 상위 카드 만들어줘", "여러 파트 걸친 업무 카드". Not for a single-team task card, QA bug reports, or tech debt entries. version: 0.1.0 --- # Epic Card ## Overview Meissa 노션 `ProductTeam Card Table`에 Epic Card를 만든다. Epic은 여러 파트나 여러 리포지토리에 걸친 상위 업무이고, 실제 실행 카드는 하위 Task로 붙는다. **골격은 노션 템플릿이 원본이고, 문체는 요청자의 과거 카드가 원본이다.** 이 문서에는 섹션 구조도 문체 규칙도 적지 않는다. 노션에서 템플릿이 바뀌면 스킬이 따라가야 하기 때문이다. 대신 어디서 무엇을 읽어올지를 적는다. ## 고정 상수 | 항목 | 값 | |---|---| | data source | `collection://1d82973c-1a5f-81e6-9728-000b3e3cb467` | | 템플릿 페이지 | `1d82973c-1a5f-81f4-b939-eb5f90befb91` | | 데이터베이스 페이지 | `1d82973c1a5f808e8f3aea022ba4dfc6` | 템플릿 페이지 ID는 내용을 편집해도 유지된다. fetch가 실패하면 데이터베이스 페이지를 fetch해 `` 블록에서 `Epic Card`를 이름으로 다시 찾는다. ## 절차 ### 1. 요청자 확인 `notion-fetch`에 `self`를 넘겨 사용자 ID를 얻는다. 이 값이 `Who` 기본값이자 참고 카드 필터 기준이다. ### 2. 템플릿 구조 읽기 템플릿 페이지를 fetch한다. ``의 heading과 회색 안내 문구가 이번 카드가 가져야 할 섹션 목록이다. 안내 문구는 그 섹션에 무엇을 쓸지 지시하므로 읽고 따르되 본문에 옮겨 적지 않는다. ### 3. 문체 참고 카드 수집 요청자가 최근에 만든 Epic을 찾는다. Epic은 하위 항목을 가진 카드로 식별한다. ```sql SELECT url, Subject, "Where", "하위 항목", "date:ETA:start", createdTime FROM "collection://1d82973c-1a5f-81e6-9728-000b3e3cb467" WHERE Who LIKE '%<사용자 ID>%' AND "하위 항목" IS NOT NULL ORDER BY createdTime DESC LIMIT 5 ``` 이 중 2~3건을 fetch해 본문을 읽고 관찰한다. - 작업 내역을 목표 한 줄로 열고 대상별로 묶는지 - 불릿 종결어미가 평서형인지 명사형인지 - 리포지토리나 파트를 인라인 코드로 표기하는지 - 일정을 본문에 남기는지 ETA 속성에만 두는지 - 관련 링크에 어떤 종류의 출처를 어떤 형식으로 적는지 관찰 결과를 그대로 새 카드에 적용한다. 참고 카드가 한 건도 없으면 `Who` 조건을 빼고 팀 전체 Epic으로 넓혀 조회한다. ### 4. 주제 참고 카드 수집 새 Epic 주제의 키워드로 `notion-search`를 돌린다. `data_source_url`에 위 data source를 넘겨 이 DB 안으로 한정한다. 작성자는 가리지 않는다. 선행 Epic이나 관련 카드가 나오면 관련 링크 섹션 후보로 삼는다. ### 5. 속성 확정 | 속성 | 규칙 | |---|---| | Subject | 사용자가 준 제목. 없으면 목표에서 한 줄로 뽑아 확인받는다 | | Where | 걸리는 파트를 모두. 사용자가 명시하지 않았으면 작업 내역에서 추론하고 확인받는다 | | Who | 요청자. 사용자가 참여자를 지정하면 `notion-get-users`로 ID를 찾아 함께 넣는다 | | Status | `TO-DO` | | ETA | **비워두지 않는다.** Epic은 기간이 있으므로 시작과 종료를 범위로 받는다. 사용자가 주지 않았으면 반드시 물어본다 | | Priority | 사용자가 지정한 경우만 | | OKR | 사용자가 지정한 경우만 | | Tag | 사용자가 지정한 경우만 | | Release | Epic에는 대개 걸지 않는다. 사용자가 지정한 경우만 | ### 6. 생성 `create-pages`에 `parent`를 data source로, `template_id`에 템플릿 페이지 ID를, `properties`에 5단계 결과를 넘긴다. `template_id`를 쓸 때는 `content`를 넘기지 않는다. 이어서 `update-page`의 `replace_content`로 본문을 작성한다. 노션 마크다운 문법이 확실하지 않으면 `notion-fetch`에 `notion://docs/enhanced-markdown-spec`을 넘겨 먼저 읽는다. ### 7. 하위 Task 제안 **기본은 Epic 카드 하나만 만드는 것이다.** 작업 내역이 둘 이상의 파트나 리포지토리로 갈리면, 그 경계를 그대로 하위 Task 후보로 제시하고 쪼갤지 한 번 묻는다. 승인받은 경우에만 하위 카드를 만든다. 하위 카드는 파트에 맞는 템플릿으로 만들고 `상위 항목`에 Epic URL을 넣는다. FE 카드는 `meissa-fe-workflow:fe-task-card` 스킬을 쓴다. ### 8. 보고 생성된 Epic URL과 채운 속성, 하위 카드를 만들었다면 그 목록을 요약해 알린다. ## 테스트 필요 범위 섹션은 QA가 읽는다 이 섹션의 독자는 코드를 보지 않는 QA다. 사용자가 화면에서 무엇을 해보고 무엇을 확인해야 하는지만 쓴다. - 쓴다: 어떤 화면에서 어떤 동작을 했을 때 무엇이 보여야 하는지, 어떤 기능에 회귀가 없어야 하는지 - 쓰지 않는다: 테스트 명령어, 테스트 파일 경로, 유닛 테스트 추가 여부, 린트와 빌드 게이트, 패키지 버전 확인 명령 - 검증 도구나 자동 테스트는 개발자의 작업이므로 필요하면 `작업 내역`에 적는다 - Epic에서는 변경 전후를 대비해 쓰면 QA가 무엇을 볼지 바로 안다. "~해야 한다. 지금은 ~다" 형태 ## 초안 확인이 필요한 때 - **바로 생성** — 사용자가 목표와 작업 내역을 직접 불러줬고 형식만 맞춘 경우 - **초안 먼저** — 코드베이스, PR, 설계 문서, 슬랙 스레드를 조사해 내용을 만들어낸 경우. 하위 Task를 함께 만드는 경우도 항상 여기 해당한다 ## 흔한 실수 | 실수 | 결과 | |---|---| | 데이터베이스 페이지를 통째로 fetch | 응답이 60KB를 넘어 토큰 한도를 초과하고 파일로 떨어진다. 템플릿 ID를 잃었을 때만 쓰고, 그때도 `` 블록만 잘라 읽는다 | | ETA를 비워둠 | 기본 Table 뷰가 ETA 이후만 표시하므로 카드가 뷰에서 사라진다 | | 묻지 않고 하위 Task를 쏟아냄 | 팀 DB에 실행되지 않을 카드가 쌓인다. 경계를 제시하고 승인을 받는다 | | 섹션 구조를 기억으로 작성 | 노션에서 템플릿이 바뀌면 틀린 구조가 된다. 매번 템플릿을 읽는다 | | 회색 안내 문구를 본문에 옮겨 적음 | 안내 문구는 작성자에게 주는 지시이지 카드 내용이 아니다 | | 관련 링크를 URL만 나열 | 어떤 출처이고 왜 참고하는지 한 줄이 없으면 나중에 아무도 열지 않는다 | | 링크 텍스트를 `[`로 시작 | `[[JP] 제목](url)` 형태는 마크다운 링크로 파싱되지 않고 대괄호가 그대로 남은 채 URL이 별도 멘션으로 떨어진다. 노션 카드 제목은 `[JP]` 같은 접두어를 자주 쓰므로 자주 밟는다. 링크 텍스트에서는 접두어의 대괄호를 벗겨 `[JP 제목](url)`으로 쓴다 |