# P3-A 설계 — 프롬프트/skill 분리 **구조 인프라** (3층 모델: 정체성 / 절차 / 문맥) > 리뷰 로드맵 P3, **P3-A(구조 인프라)** 범위. 선행: P1(venture-bootstrap)·P2(design-direction) 완료·master 머지. > 관련 SoT: `org-os/00-role-registry/role-working-methods.yaml`, `.claude/hooks/gen_agents.py`, `.claude/skills/`. > **P3-A 완료 ≠ method 품질 완료.** P3-A는 "절차가 누락 없이 정확한 역할에게 도달하는 구조"만 보장한다. 절차 자체를 전문가급 업무 계약으로 만드는 것은 **P3-B(Role Method Contract Hardening, §17)** 소관이며 별도 사이클로 이어진다. 이 분리는 P4 벤치마크가 "구조 이동"과 "방법론 강화"의 품질 효과를 구분해 측정하게 한다. ## 1. 문제와 목표 (BLUF) **bottom-line:** 에이전트 카드(`.claude/agents/*.md`)가 **정체성(Who am I)**과 **실무 절차(How I work)**를 한 파일에 뒤섞어 담고, 절차가 카드마다 **중복 삽입**된다. 이를 3층으로 분리한다 — **agent=정체성·경계**, **skill=절차**, **context-package=현재 과제**. 절차는 `role-working-methods.yaml`(유일 편집 SoT)에서 **역할별 method-skill로 생성**하고, 카드는 얇은 spine + skill 참조만 남긴다. **범위는 구조 이동으로 한정**(P3-A) — 절차 문장을 재작성·심화하지 않는다(그건 P3-B). **decision-needed:** 사용자 spec 승인 → 구현 계획(writing-plans) → SDD. **approver: 사용자(theorose49).** **confidence:** High(E3) — 중복은 실측됨: 72/72 카드에 `## 일하는 방식` 인라인 embed, 총 5044줄. 한 역할 method가 워커 카드 + family router 카드에 각각 박히고(fan-out), collapse family는 멤버 전원 method를 1카드에 인라인. design 역할은 method embed + craft-block + design-craft SKILL.md = 3중 중복. **risks:** (a) subagent가 `skills:` frontmatter를 auto-load 못 하면 절차 유실 → 카드 spine hedge + Phase 0 실측으로 방어. (b) 절차 내용이 바뀌면 P4 벤치마크에서 품질 회귀로 잡힘 — P3는 **내용 불변 구조 이동**(품질 중립)으로 스코프 고정. (c) skill 참조 무결성 게이트가 현재 **전무** → 새 게이트로 채움. **evidence:** `gen_agents.py:87-106`(wm_block), `des-prod.md:30-46`(3중 중복 실물), `lint_refs.py`·`doctor.py` grep(skill 검사 0건), 75 agent-bound 역할 == 75 working-method(1:1, 누락/고아 0). **핵심 목표(측정 가능):** 1. 절차의 **인라인 중복 제거**: router·collapse·워커에서 full method embed 삭제. 카드 = 정체성 + 얇은 spine + skill 참조. 2. **SoT 단일화**: `role-working-methods.yaml` 1곳만 사람이 편집. method-skill은 생성물(gen). 3. **무결성 강제 신설**: 모든 `skills:` 참조 실존 + 고아 skill 0 + 생성물 drift 0 (doctor/lint 게이트). 4. **품질 중립**: 같은 절차 내용이 skill로 에이전트에 도달. 에이전트 개수(72)·역할(75)·상태머신·validator 계약 불변. ## 2. 3층 모델 | 층 | 무엇 | 어디 | 안정성 | P3 변화 | |---|---|---|---|---| | **정체성 (Who am I)** | 관점·시야·책임·evidence-basis·경계(exclusions)·협업역할·**하네스 출력계약(불변식)** | `.claude/agents/*.md` (생성물) | 역할당 안정 | 카드에 유지(정체성은 작다). 절차 embed 제거, spine로 축약 | | **절차 (How I work)** | 단계별 실무 절차·프레임워크·체크리스트·입출력·도구순서·실패패턴·자기검증·handoff | `.claude/skills/generated/-method/SKILL.md` (생성물) + 공용 `.claude/skills//`(수제) | 방법론 진화 시 갱신 | **신설** — YAML서 생성 | | **문맥 (What now)** | mode/tier/lens/objective/must-read/task-boundaries/design-brief | `context_package.py`가 spawn마다 컴파일 (`context-package-spec.yaml`) | 과제당 | 변화 없음(이미 존재) | **불변 원칙:** 정체성은 카드에 눈앞에 둔다(경계·출력계약은 절대 숨기지 않는다). 절차는 skill로 재사용·버전관리한다. 문맥은 런타임에 주입한다. ## 3. SoT & 생성 파이프라인 ``` role-working-methods.yaml ← 유일 편집 SoT (사람이 고치는 유일 파일, 75역할) │ gen_method_skills.py (신설, gen_agents 자매) ▼ .claude/skills/generated/-method/SKILL.md ← 생성물 75개 (편집 금지, 헤더 경고 + drift 게이트) │ method-skill-registry.yaml ← role→method-skill(+capability-skills), family→policy 매핑 (신설, 수제 SoT) │ gen_agents.py (개정: wm_block embed → spine + skills: frontmatter) ▼ .claude/agents/*.md ← 생성물 72개 (정체성 + 얇은 spine + skills 참조) ``` - **`role-working-methods.yaml`**: 기존 필드(working-method/key-frameworks/evidence-they-use/sources) 불변 + **optional `self-check` 필드 additive 신설**(역할 고유 검증 문항, 하위호환 — 없으면 skill에 self-check 섹션 생략). 유일하게 사람이 편집하는 절차 원천. - **`gen_method_skills.py`(신설)**: 각 agent-bound 역할(75) → 1 method-skill SKILL.md 생성. `--check`로 drift 검증(파일 안 씀). `gen_agents.py`와 동일한 생성물 패턴(수기편집 금지). - **`method-skill-registry.yaml`(신설, 수제)**: 어느 역할이 어느 method-skill + 공용 capability-skill을 쓰는지, family별 협업정책. 기존 `gen_agents.py`에 하드코딩된 `CRAFT`/`SKILLS_FM`/`IMPL_FAMILIES` dict를 이 registry로 **흡수·단일화**. - **`gen_agents.py`(개정)**: `wm_block`(full embed) 제거 → `method_spine`(얇은 유도 블록) + registry 기반 `skills:` frontmatter 방출. **생성물 편집 금지 강제:** 생성 skill·에이전트 상단에 `` 헤더. doctor가 `--check`로 drift(수기 편집)를 실패 처리. ## 4. `method-skill-registry.yaml` 스키마 ```yaml # method-skill-registry — role→skill 배선의 단일 정본(SoT). # gen_method_skills 가 method-skill 을 생성하고, gen_agents 가 이 파일로 skills: frontmatter 를 방출한다. method-skill-registry: version: 1 generated-dir: .claude/skills/generated # 생성 method-skill 위치 규약(Phase 0 확정) method-skill-suffix: -method # = skill name # ── 역할별: 생성 method-skill(고유 절차) + 공용 capability-skill(수제 전문기법) ── roles: DES-PROD: { method-skill: des-prod-method, capability-skills: [design-craft] } DES-PLATFORM: { method-skill: des-platform-method, capability-skills: [design-craft] } DES-INTERNAL: { method-skill: des-internal-method, capability-skills: [design-craft] } DES-VISUAL: { method-skill: des-visual-method, capability-skills: [design-craft] } DOC-VISUAL: { method-skill: doc-visual-method, capability-skills: [design-craft, diagram-craft] } ARCH-TECH: { method-skill: arch-tech-method, capability-skills: [] } # … 75역할 전부 (method-skill 은 관례상 -method 이지만 명시로 둔다 = 오타 조기검출) # ── family별: 협업정책 + family 수준 공용 skill (멤버 method-skill 은 member-role-ids 에서 파생) ── families: FAM-DESIGN: { policy: fan-out, lead: DES-DIRECTOR, capability-skills: [] } FAM-ENG-BACKEND: { policy: collapse, capability-skills: [build-loop] } FAM-ENG-FRONTEND: { policy: collapse, capability-skills: [build-loop] } FAM-ENG-SPECIAL: { policy: collapse, capability-skills: [build-loop] } FAM-PLATFORM-INFRA: { policy: collapse, capability-skills: [build-loop] } FAM-QA: { policy: collapse, capability-skills: [] } FAM-OPS-DELIVERY: { policy: collapse, capability-skills: [] } FAM-ORCH: { policy: n/a, capability-skills: [] } # fan-out-split(router+워커)·단일멤버 fan-out 도 명시(정책 대조용) ``` **설계 결정:** - `capability-skills`(design-craft/build-loop/diagram-craft)는 registry의 SoT가 된다 — `gen_agents.py`의 `CRAFT`/`SKILLS_FM`/`IMPL_FAMILIES` 하드코딩 dict를 대체. 한 곳에서만 배선(#10 tools-matrix와 같은 철학). - family의 **멤버 method-skill은 파생**(`member-role-ids` → 각 `roles[rid].method-skill`) — registry에 재나열 안 함(DRY). - registry 키(role-id·family-id)는 실존 검증(오타로 정본이 조용히 무시되는 것 방지 — `gen_agents.py:60-63`와 동일 패턴). ## 5. 생성 method-skill(SKILL.md) 구조 `gen_method_skills.py`가 역할 `R`의 `role-working-methods.yaml` 엔트리에서 생성: ```markdown --- name: des-prod-method description: "Use when working AS the 프로덕트 디자이너 (DES-PROD) role — the step-by-step working method, frameworks, evidence types, and self-check for this role. Auto-loaded via the des-prod agent's skills: frontmatter." generated-from: role-working-methods.yaml#DES-PROD --- # DES-PROD 실무 절차 (일하는 방식) ## 절차 (working-method) - 먼저 design-brief를 세운다(design-brief-spec): … - Double Diamond로 진행한다: … - … ## 주요 프레임워크 - design-brief (제약>묘사) … - Double Diamond … ## 판단 근거 자료 (evidence) - user research · 행동 데이터 … ## 참고 출처 - https://… ## 자기검증 (self-check) — 역할 고유 검증만 (선택·optional) - 사용자 행동 근거 없이 시각 취향으로 결정하지 않았나? - 핵심 흐름과 예외 상태를 모두 설계했나? - generic한 "modern/clean" 표현으로 방향을 대체하지 않았나? ``` - **본문 = `role-working-methods.yaml`의 working-method/key-frameworks/evidence/sources를 그대로 옮긴 것**(내용 불변 — §14 비목표). 즉 `wm_block`이 카드에 넣던 텍스트가 skill로 이동. - `description`은 **skill 자동선택 신호**(Claude Code가 skill 매칭에 사용) — 역할명 + "working AS this role"로 생성. 사람이 쓰는 게 아니라 **파생**(role-profiles의 role-name + perspective 첫 문장). - **self-check는 역할 고유 검증만 담는다 — 공통 하네스 불변식(고유관점/비종합/근거+반증/실물≠요약)을 재복제하지 않는다.** 이유: (a) 공통 불변식은 카드의 전용 계약 섹션(§7)에 이미 가시이므로 skill에 넣으면 재중복. (b) skill이 auto-load 실패하면 skill 내부 self-check도 함께 사라지므로, skill에 공통 불변식을 넣는 건 "auto-load 실패 hedge"가 되지도 않는다(가시 hedge는 카드 계약 섹션이 담당). - self-check는 **optional `self-check` 필드**(role-working-methods.yaml에 additive 신설, §3)에서 렌더. 필드 없는 역할은 self-check 섹션 생략(P3는 75개를 backfill하지 않음 — 내용 중립, §14). design 역할 등 exemplar만 우선 작성 가능. ## 6. 에이전트 카드 변화 — 협업역할별 3정책 (Decision C) 기존 4개 생성 경로가 정책에 1:1 대응한다. ### 6.1 워커 (`build_role_agent`, 43개) — 자기 method-skill - frontmatter: `skills: [<자기 method-skill>, ]` (registry `roles[rid]`). - 본문: 기존 `## 일하는 방식` full embed **삭제** → `## 핵심 작업 방법`(§7 spine) 삽입. 나머지(관점·시야·책임·evidence-basis·Fan-out 워커 계약·When invoked·Output contract) **유지**. - design 워커의 `craft_block`(design-craft 인라인 리마인더)은 **capability-skill 참조로 대체**(design-craft가 이미 skills:에 있음 → 본문 리마인더는 spine 1줄로 축약, 중복 제거). ### 6.2 synthesis lead (`build_lead_agent`, 3개: CONSULT-EM·DOC-LEAD·DES-DIRECTOR) — 자기 수렴 method만 - frontmatter: `skills: [, ]`. **멤버 method-skill 없음**. - 본문: lead 자신의 관점·수렴 method spine + Synthesis-lead 계약(FRAME/SYNTHESIZE, storyline) **유지**. 멤버 절차는 담지 않음(멤버는 각자 skill 로드). "멤버 보고서 원본 필독·평균 금지·dissent 보존"은 계약에 유지. ### 6.3 router (`build_router_agent`, 10개) — 멤버 method 전부 제거, pointer만 - frontmatter: `skills: []`만. **멤버 method-skill·자기 method 없음**(router는 일을 직접 안 함). - 본문: 기존 멤버 전원 `## 일하는 방식` embed **삭제** → **member→method-skill pointer table**로 대체: ``` ## fan-out 멤버 → method-skill - DES-PROD (agent: des-prod, skill: des-prod-method) - DES-PLATFORM (agent: des-platform, skill: des-platform-method) - … ``` Router 계약(정상경로 fan-out / 단독경로 role-by-role / conflicts 보존)은 **유지**. 단독경로는 "각 멤버 skill을 이름으로 로드해 역할별 분석"으로 문구 갱신. - 멤버 관점·시야·책임(`## 대표 역할별 관점·시야·책임`)은 **유지**(라우팅 판단 근거 = 정체성이지 절차 아님). 삭제되는 건 절차(method)뿐. ### 6.4 family agent (`build_agent`, 16개: 6 collapse + 9 단일멤버 fan-out + FAM-ORCH) — 실제 수행자, method 유지 - 이 경로는 **실제 작업 수행자**(collapse는 멤버 전원 일을 1 에이전트가, 단일멤버 fan-out은 그 1명 일을). 멤버 method를 완전히 제거하면 수행 능력이 사라진다(사용자 Decision C 명시). - frontmatter: `skills: [<멤버 method-skill union>, ]`. 멤버 method-skill을 `member-role-ids`에서 파생해 전부 로드. - 본문: 기존 멤버 전원 full embed **삭제** → §7 spine(멤버 프레임워크 요지 + "전체 절차는 각 멤버 method-skill") + collapse 계약(설계 Accepted 확인) 유지. 멤버 관점·시야·책임 유지. - FAM-ORCH(policy n/a)는 자기 1멤버(OPS-ORCH) method-skill 로드. **요약 표:** | 경로 | 개수 | 자기 method | 멤버 method | frontmatter skills | |---|---|---|---|---| | 워커 | 43 | ✅ spine+skill | — | 자기 method-skill + capability | | lead | 3 | ✅ spine+skill | ❌ | 자기 method-skill + capability | | router | 10 | ❌(수행 안 함) | ❌ pointer만 | family capability만 | | family agent | 16 | ✅(=멤버) | ✅ union 로드 | 멤버 method-skill union + capability | ## 7. 카드 method-spine (파생 규칙) + 유지되는 하네스 불변식 **spine = 카드에 남는 얇은 절차 잔여 — 역할-파생만(신규 중복 금지).** `role-working-methods.yaml`에서 **파생**(사람이 75역할 spine을 손으로 안 씀 — YAGNI·DRY): ``` ## 핵심 작업 방법 (전체 절차는 skill) - 핵심 접근: - 주요 프레임워크: - **전체 실무 절차·체크리스트·자기검증·handoff는 `` skill을 따른다. skill 미적재 시 작업 시작 금지.** ``` - spine은 **역할 파생 3줄만**(essence 1줄 + top3 프레임워크 **이름만** + skill pointer/load-guard). 카드가 역할별로 구별되고 라우팅·선택에 도움. - **프레임워크는 이름만**(예: `Double Diamond, JTBD, Design Brief`) — 정의·단계·사용법은 skill 본문에서만. spine에 설명을 넣으면 skill과 재중복. - **공통 불변식(고유 관점만/비종합/근거+반증/실물≠요약)은 spine에 재나열하지 않는다** — 이미 카드의 전용 섹션(`## When invoked`·`## Fan-out 워커 계약`·`## Output contract`)에 가시로 유지되므로(§6서 유지 명시), spine이 다시 나열하면 P3의 dedup 목표와 모순된다. 사용자 Decision B("하네스 불변식은 카드에 계속 가시")는 **기존 전용 섹션 유지로 충족**된다 — 새 중복을 만들지 않고. - **auto-load 실패 hedge = 카드의 전용 계약 섹션(항상 가시) + spine load-guard("skill 미적재 시 시작 금지")** 2중. skill 내부 self-check는 hedge가 아니다(skill이 안 실리면 그 self-check도 사라짐) — 그래서 skill self-check에는 공통 불변식을 넣지 않는다(§5). - 분량: spine ~3줄(현 embed ~25줄 대비 ~88% 축소). router/family는 멤버 수만큼 pointer 줄이 늘지만 여전히 full embed보다 작다. **카드에 계속 가시로 남는 하네스 불변식(절대 skill로 숨기지 않음):** - `## Output contract (hook이 강제)`: report-header(BLUF) 필수, evidence 없는 confidence:High 금지, E4/E5 실존 아티팩트, **primary-artifacts 분리(#9)**, MD 손수 금지, external side-effect 기본 금지. → **전부 유지**(이건 절차가 아니라 하네스 계약). - `## When invoked` 진입 규약(context-package 확인, must-read/forbidden-context). → 유지. - 이유: 이들은 validator(`validate_report`)·guard(`guard_tools`)가 강제하는 계약이므로 에이전트 눈앞에 항상 있어야 한다. ## 8. `gen_agents.py` 변경 1. **로드**: `load_method_registry()` 신설 — `method-skill-registry.yaml` 읽어 `roles`/`families` 맵. 키 실존 검증(오타 조기검출). 2. **`wm_block` 제거** → `method_spine(rid_or_members, ...)` 신설: §7 규칙으로 spine 텍스트 생성(essence 1줄 + top3 프레임워크 **이름만** + skill pointer/load-guard). **공통 불변식 재나열 안 함**. 3. **`skills_fm_line` 개정**: 기존 하드코딩(`SKILLS_FM`/`IMPL_FAMILIES`) 제거 → registry에서 파생. - 워커/lead: `[roles[rid].method-skill] + roles[rid].capability-skills`. - router: `families[fid].capability-skills`만. - family agent: `dedup(멤버들 method-skill) + families[fid].capability-skills`. 4. **`craft_block` 축소**: design 역할 인라인 리마인더 → spine 1줄 + capability-skill 참조(design-craft가 skills:에 이미 있음). D2-우선 등 핵심 self-check 1줄만 잔류(중복 제거). 5. **router 본문**: 멤버 method embed → member→method-skill pointer table. 6. **검증(assert) 개정**: `## 일하는 방식` 존재 assert(605-606) → `## 핵심 작업 방법`(spine) + `skills:` frontmatter 존재 assert. 개수 계약(72/43/3/16/10) 불변. ## 9. 무결성 강제 (신설 게이트 — 현재 전무) **`doctor.py` `check_method_skill_wiring()` 신설:** 1. **완전성**: agent-bound 역할(75) 전부 registry `roles`에 있고 각자 `method-skill` 지정. 2. **실존**: registry가 가리키는 모든 method-skill이 `generated-dir`에 SKILL.md로 실존. 모든 capability-skill이 수제 skill로 실존. 3. **참조 해소**: 모든 `.claude/agents/*.md`의 `skills:` frontmatter 항목이 실존 SKILL.md로 해소. 4. **고아 0**: `generated-dir`의 모든 SKILL.md가 registry role에 매핑(1:1). 남는 생성물 없음(75==75==75). 5. **drift 0**: `gen_method_skills.py --check` 통과(생성물이 현 YAML과 일치 — 수기 편집·stale 검출). `gen_agents.py --check`도 동일. 6. **키 정합**: registry `roles`/`families` 키 ⊆ roles.yaml / capability-families.yaml. **`lint_refs.py` 확장:** 에이전트 `skills:` 참조 → SKILL.md 해소 무결성(참조 그래프 린트에 편입). 커맨드→agent 참조와 동형. **Phase 0 실측(§10)** 후 배선. `run_all.py`(CI 진입점)에 자동 편입. ## 10. skill 발견·auto-load 리스크 & Phase 0 **load-bearing 가정:** subagent가 `.claude/skills/generated/-method/SKILL.md`(중첩 디렉터리)를 `skills:` frontmatter로 auto-load한다. - **근거(부분):** 플러그인 skill이 `.../skills//SKILL.md` 중첩으로 발견됨(현재 사용 중). 기존 프로젝트 skill 3종은 flat `.claude/skills//`. - **Phase 0(구현 첫 태스크, 게이트):** 생성 skill 1개를 `.claude/skills/generated/probe-method/`에 두고 throwaway 에이전트 `skills:[probe-method]`로 **실제 subagent 로드 확인**. - 발견되면: `generated/` 중첩 레이아웃 확정(사용자 선호). - 발견 안 되면: flat `.claude/skills/-method/`로 폴백(검증된 패턴, 이름 규약 `*-method`로 그룹화). registry `generated-dir` 한 줄만 바꾸면 전 파이프라인 대응. - **hedge:** 발견 여부와 무관하게 카드 spine + skill self-check에 공통 불변식이 중복 가시 → auto-load 실패해도 역할이 빈 껍데기가 되지 않음(사용자 Decision B). 이건 belt-and-suspenders이지 회귀가 아니다. ## 11. 하위호환·마이그레이션 - **기존 skill 3종 유지**: design-craft·diagram-craft·build-loop는 수제 capability-skill로 그대로. registry가 이들을 참조(하드코딩 dict 흡수). - **기존 테스트 갱신**(회귀 아님, 계약 이동): - `test_enforcement.py:605-606`, `909-915`: `## 일하는 방식` embed assert → spine + `skills:` 참조 assert. `skills:[design-craft]` 유지 확인(capability-skill로). - `test_p1_build.py`: build-loop skill 존재·참조 — 유지(registry 경유로 변경만). - `gen_agents.py` 내부 assert(§8.6). - **커맨드·hook 무영향**: state_engine·validate_report·context_package·render_report 등은 카드 본문 텍스트에 의존하지 않음(계약은 `.report.yaml`·SoT yaml). 카드 재구성은 이들과 독립. - **역순 안전**: gen_method_skills → gen_agents 순으로만 생성(skill이 먼저 실존해야 카드가 참조). doctor가 순서 위반(참조는 있는데 skill 없음)을 실패 처리. ## 12. 하네스 정합성 (불변 유지) - 에이전트 개수 **72 불변**(43 워커 + 3 lead + 16 family + 10 router). 역할 **75 불변**. - 상태머신·전이·condition-catalog·validator·guard·evidence-ledger·token-ledger·kpi 전부 **무영향**. - 신규 산출물: `gen_method_skills.py`, `method-skill-registry.yaml`, `.claude/skills/generated/*/SKILL.md`(75), doctor/lint 게이트, 테스트. - gen 재생성 흐름에 편입: `role-profiles`/`capability-families` 변경 후 `gen_agents` 재실행 → 이제 `gen_method_skills`도 함께(문서·CLAUDE.md 검증 섹션 갱신). ## 13. 테스트 계획 (`test_p3_*.py`, ~standalone check() 컨벤션) 1. **gen_method_skills 완전성**: 75 역할 → 75 SKILL.md, 각 frontmatter(name/description/generated-from) 유효. 2. **내용 불변(품질중립)**: 생성 skill 본문이 YAML의 working-method/frameworks/evidence를 손실 없이 포함(핵심 문장 부분일치). 3. **--check drift**: 생성 후 재-check 통과. 수기 1글자 변조 → --check 실패(감지). 4. **registry 완전성·키 정합**: 75 역할 전부 매핑, 키 ⊆ roles/families, 오타 키 → assert. 5. **gen_agents 방출**: 워커 카드에 `skills:[]` + `## 핵심 작업 방법` 있고 `## 일하는 방식` full embed 없음. 6. **spine 얇음·중복금지**: spine에 공통 불변식 문장(고유관점/비종합/근거+반증/실물≠요약) 재나열 **없음**. 프레임워크는 이름만(정의 문장 없음). essence 1줄만. 7. **skill self-check 정책**: 생성 skill의 self-check 섹션에 공통 불변식 문장 **없음**(역할 고유 검증만). `self-check` YAML 필드 없는 역할은 self-check 섹션 생략. 8. **router 정책**: router 카드에 멤버 method embed 없음, member→method-skill pointer table 있음, `skills:`에 멤버 method 없음. 9. **lead 정책**: lead 카드에 멤버 method 없음, 자기 method-skill만. 10. **collapse/family 정책**: family agent `skills:`에 멤버 method-skill union 있음(수행능력 보존). 11. **capability-skill 흡수**: des-prod `skills:`에 design-craft, IMPL family에 build-loop — registry 경유로 유지. 12. **하네스 불변식 잔류**: 모든 카드에 Output contract(primary-artifacts·report-header)·When invoked·협업 계약 유지(공통 불변식의 유일 가시 지점). 13. **doctor 게이트**: 정상 → OK. method-skill 삭제 → FAIL(실존). registry에서 역할 제거 → FAIL(완전성). 고아 skill 추가 → FAIL. skills: 깨진 참조 → FAIL. 14. **lint_refs**: 깨진 skills: 참조 검출. 15. **개수 계약**: 72 agents·75 skills 회귀 검출. 16. **run_all 통합**: 전체 green. ## 14. 비목표 (스코프 고정) - **절차 내용 변경 금지**: working-method 문장을 다시 쓰거나 개선하지 않는다 — **위치만 이동**(카드 embed → skill). 품질 변화는 P4 벤치마크가 별도 검증. P3-A는 구조적·품질중립. - **method 품질 강화는 P3-B**: 절차 완전성 검사·decision-rules·alternatives-policy·output-artifacts·handoff-contract·prohibited-shortcuts·execution-trace는 P3-A 범위 밖 — §17 후속. - **self-check 75개 backfill 금지**: `self-check`는 optional 필드. P3-A는 전 역할에 self-check를 채워 넣지 않는다(내용 생성 = 중립성 위반). 필드가 있는 역할만 렌더, exemplar(design 역할 등)만 우선 작성 가능. - **상태머신/validator/guard 계약 변경 금지**. - **수제 클러스터 skill 금지**: 역할별 생성(사용자 Decision A) — 유사역할 평균화 방지. - **에이전트 개수·역할 수 변경 금지**. - **P4(벤치마크)·설계외 리팩터 금지**: skill 발견 폴백(§10) 외 런타임 동작 변경 없음. ## 15. 열린 결정 (사용자 리뷰서 확정됨) 1. **카드 spine 구성**: ✅ **확정** — 역할별 `working-method[0]`(essence) + 프레임워크 **이름 최대 3개** + method-skill pointer/load-guard로만. 공통 하네스 불변식은 기존 When invoked·협업 계약·Output contract 섹션에 유지, spine·생성 skill에 재복제 안 함(§7). 2. **skill self-check**: ✅ **확정** — 역할 고유 검증만. optional `self-check` YAML 필드에서 렌더, 없으면 생략. 공통 불변식 재복제 금지(§5). 3. **method-skill `name` 규약**: `-method`(예 `des-prod-method`). role-id에 특수문자 없으므로 안전. registry에 명시(파생 아님 — 오타 검출). 4. **generated-dir 레이아웃**: `.claude/skills/generated/`(사용자 선호) vs flat 폴백 — **Phase 0가 실측 후 확정**(§10). 5. **collapse family skill 폭증 우려**: FAM-ENG-BACKEND(6멤버)는 6 method-skill + build-loop = 7 skill auto-load. 기존엔 6멤버 method가 다 인라인이었으므로 **로드량 중립 이상**(on-demand). 문제되면 family-공통 method-skill로 합치는 건 향후(P3 범위 밖). ## 16. 구현 체크리스트 (writing-plans가 TDD 태스크로 분해) - [ ] **Phase 0**: skill 발견·auto-load 실측 → generated-dir 레이아웃 확정(§10). - [ ] `role-working-methods.yaml`에 optional `self-check` 필드 스키마 추가(additive) + design exemplar 몇 개(§3,§5). - [ ] `method-skill-registry.yaml` 작성(75 역할 + family 정책, capability-skill 흡수)(§4). - [ ] `gen_method_skills.py`(생성 + --check drift, self-check optional 렌더)(§3,§5). - [ ] 75 method-skill 생성·커밋(생성물)(§5). - [ ] `gen_agents.py` 개정: wm_block→method_spine(공통불변식 재나열 안 함·프레임워크 이름만), skills: registry 파생, router pointer, craft_block 축소, assert 갱신(§6,§7,§8). - [ ] 72 에이전트 재생성(§6). - [ ] `doctor.py check_method_skill_wiring` + `lint_refs.py` skill 참조(§9). - [ ] `test_p3_*.py` 16종(§13). - [ ] 기존 테스트 갱신(§11). - [ ] CLAUDE.md·검증 섹션·gen 흐름 문서 갱신(§12). - [ ] `run_all.py` green + doctor OK 재확인. ## 17. 후속 로드맵 — P3-B(Role Method Contract Hardening) + P4 구분 P3-A는 **기반 공사**다. 단독으로 끝나면 "기존의 평균적 절차를 더 깔끔하게 배포하는 시스템"에 머문다. 사용자가 원하는 강한 결과(디자인 등)를 위해선 절차 자체를 실행·검증 가능한 **업무 계약**으로 만드는 P3-B가 이어져야 한다. 여기 스코프만 캡처(설계는 별도 brainstorm→spec→plan 사이클). **핵심 원리 — 공통 품질과 역할별 사고의 분리(평균화 방지):** - **공통 품질 = validator/report-schema가 강제**(75역할에 복제 금지): 근거 없는 결론 금지, 대안 비교 필수, 반대논거·dissent 필수, required-artifact 누락 차단, handoff 대상·입력 명시, 생략 단계+사유 기록. - **역할별 사고 = method-skill이 제공**: 무엇을 어떤 순서로 분석하나, 어떤 자료를 근거로, 어떤 판단규칙, 어떤 전문 산출물, 다음 역할에 무엇을 넘기나, 이 역할의 흔한 오류. **P3-B ①: `role-working-methods.yaml` 스키마 확장** (flat 문장목록 → 실행 계약): ```yaml role-working-methods: DES-PROD: purpose: ; triggers: ; non-goals: required-inputs: [product-decision, direction-input-brief, user-research, constraints] workflow: - id: brief objective: ; actions: []; required-output: ; completion-gate: [] - id: references # …단계별 decision-rules: []; evidence-policy: {}; alternatives-policy: {} output-artifacts: []; handoff-contract: {}; prohibited-shortcuts: [] escalation-conditions: []; self-check: [] ``` gen_method_skills가 이 계약을 skill 본문(입력→단계→단계별 산출물→완료게이트→판단규칙→근거→대안·반증→금지→handoff→자기검증)으로 렌더. **P3-B ②: 역할별 차별화(디자인 예시 — design-craft 수준):** 같은 디자인군도 평균화 금지. - DES-PROD: brief→reference(3–6 named+anti-reference)→constraint-matrix→token-semantics→decision-record, prohibited-shortcuts(brief 없이 토큰부터/색값만 바꾼 대안/MVP 이유로 상태설계 생략). - DES-PLATFORM: token 계층·component boundary·state model·variant explosion·composition·governance·migration·deprecation. - DES-VISUAL: visual thesis·form language·typographic character·signature element·material·motion grammar·anti-reference·generic-risk. - DES-DIRECTOR: 발산 프레이밍·독립안 비교·수렴기준·평균금지·locked-invariant·dissent·critique 종합. **P3-B ③: 실행 강제(존재≠수행):** standard/heavy 보고서에 `method-execution` trace(skill-id·sha256·completed-phases·skipped-phases+사유·decisions[alternatives-considered]·handoff artifacts). validator: required phase 누락→Hard Fail, 생략+사유없음→Hard Fail, 대안 필요한데 1개→Hard Fail, 근거참조 없음→Hard Fail/confidence cap, handoff artifact 누락→다음 stage 진입 차단. **light tier는 경량 적용**, standard/heavy만 full trace(과도 비용 회피). **P4 벤치마크 3단 비교(반드시 분리):** Baseline vs **P3-A(구조 이동)** vs **P3-B(방법론 강화)**. 그래야 "skill 분리 자체가 품질을 떨어뜨렸나"와 "method 강화가 실제 품질을 올렸나"를 독립적으로 판정.