Files
company-haness/docs/superpowers/plans/2026-07-05-collaboration-efficiency-overlay.md
T

749 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
status: historical-snapshot
applies-to-version: "registry 62 roles / 26 families / 11 lenses (이 계획 실행 시점)"
superseded-by: "현재 정본 registry 73 roles / 28 families / 12 lenses — org-os/00-role-registry/*"
exclude-from: [must-read, default-search]
note: "구현 완료된 과거 계획. 본문의 62/26/11 수치는 당시 스냅샷이며 현재 정본은 org-os 레지스트리다(finding #20)."
---
# 협업 효율화 + 다양성 보존 오버레이 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Org OS에 발산/수렴 모드 × 경량/표준/중대 티어 × 11개 불가침 렌즈로 이뤄진 협업 오버레이를 명세 파일로 추가해, 협업 handoff 비용을 낮추면서 관점 다양성을 구조적으로 보존한다.
**Architecture:** 가산적 오버레이 — `org-os` 아래 5개 신규 YAML을 추가하고 기존 4개 파일에는 참조 필드/규칙만 덧붙인다. 코드·실행체(.claude)는 만들지 않는다. 각 파일은 단일 관심사만 담고 id/참조로만 연결된다.
**Tech Stack:** YAML 명세, 검증은 python3 + pyyaml(설치 확인됨 6.0.1)로 임시(비커밋) 스크립트를 scratchpad에서 실행. Markdown 문서.
## Global Constraints
- 기준 스펙: `docs/superpowers/specs/2026-07-05-collaboration-efficiency-design.md` (모든 값의 단일 원천).
- 범위: **명세만.** `.claude/*`, MCP, hook, 영구 validator 스크립트 생성 금지(후속 라운드).
- 기존 62개 role을 삭제/추가하지 않는다. `roles.yaml`은 참조 분류체계로 보존한다.
- 기존 파일 변경은 **참조 추가뿐** — 기존 rigor(특히 High/Critical→인간, Approved 조건)의 의미를 제거하지 않는다. **TIER-HEAVY == 오늘 동작.**
- 신규/수정 YAML은 모두 `python3 -c "import yaml,sys; yaml.safe_load(open(f))"`로 파싱되어야 한다.
- 모든 참조 id(role-id/family-id/lens-id)는 실제 정의에 존재해야 한다(orphan 0).
- 고정 id 집합(대소문자·하이픈 정확히 준수):
- 렌즈 11개: `LENS-VALUE, LENS-TECH, LENS-PRODUCT, LENS-FINANCE, LENS-OPS, LENS-INTEGRATION, LENS-SECURITY, LENS-LEGAL, LENS-CUSTOMER, LENS-REVENUE, LENS-CONTRARIAN`
- 패밀리 26개: `FAM-CEO, FAM-ORCH, FAM-CTO, FAM-CPO, FAM-CFO, FAM-COO, FAM-CPTO, FAM-VPENG, FAM-PRODUCT-MGMT, FAM-UX-RESEARCH, FAM-DESIGN, FAM-STRATEGY, FAM-ENG-FRONTEND, FAM-ENG-BACKEND, FAM-ENG-SPECIAL, FAM-PLATFORM-INFRA, FAM-ARCHITECTURE-TECH, FAM-ARCHITECTURE-BIZ, FAM-DATA, FAM-QA, FAM-SECURITY, FAM-OPS-DELIVERY, FAM-GTM-GROWTH, FAM-GTM-SALES, FAM-REVOPS, FAM-LEGAL`
- 티어 3개: `light, standard, heavy` / 모드 2개: `divergent, converge`
---
## File Structure
| 파일 | 책임 | 신규/수정 |
|---|---|---|
| `org-os/00-role-registry/capability-families.yaml` | 62 role → 26 패밀리 매핑 | 신규 (Task 1) |
| `org-os/00-role-registry/lens-registry.yaml` | 11 렌즈 정의 + 렌즈↔패밀리 | 신규 (Task 2) |
| `org-os/06-agent-work/governance-tiers.yaml` | 위험→티어 파생 + 티어별 요구 | 신규 (Task 3) |
| `org-os/06-agent-work/execution-policy.yaml` | 파이프라인·병렬감사·재적재 제어 | 신규 (Task 4) |
| `org-os/06-agent-work/collaboration-modes.yaml` | 발산/수렴 실행형태 | 신규 (Task 5) |
| `org-os/00-role-registry/role-selection-scorecard.yaml` | mode/tier/lens 필드·규칙 | 수정 (Task 6) |
| `org-os/06-agent-work/context-package-spec.yaml` | mode/tier/lens 필드 | 수정 (Task 6) |
| `org-os/00-role-registry/state-transition-rules.yaml` | 상태어휘 정합 + tier-modifiers | 수정 (Task 7) |
| `org-os/README.md` | 신규 파일 등재 + 03-products 정리 | 수정 (Task 8) |
의존 순서: Task 1(families) → Task 2(lenses, families 참조) → Task 3,4(독립) → Task 5(lenses·execution 참조) → Task 6,7(기존 파일) → Task 8(README + 통합 게이트).
---
## Task 0: 리포지토리 준비
**Files:** 없음 (환경 초기화)
- [ ] **Step 1: git 저장소 초기화**
Run:
```bash
cd /home/donghyeon/dev/company-haness
git init && git add -A && git commit -m "chore: baseline org-os spec before collaboration overlay"
```
Expected: `Initialized empty Git repository ...` 후 baseline 커밋 생성. (이미 repo면 `git init`은 무해.)
- [ ] **Step 2: pyyaml 확인**
Run: `python3 -c "import yaml; print(yaml.__version__)"`
Expected: `6.0.1` (또는 임의 버전 출력). 실패 시 `pip install pyyaml`.
- [ ] **Step 3: 검증 헬퍼 위치 확인 (scratchpad, 비커밋)**
Run: `mkdir -p /tmp/orgos-verify && echo ok`
Expected: `ok`. 이후 모든 검증 python은 이 경로에 임시 저장하며 **repo에 커밋하지 않는다**.
---
## Task 1: capability-families.yaml (62 → 26 패밀리)
**Files:**
- Create: `org-os/00-role-registry/capability-families.yaml`
- Verify(temp): `/tmp/orgos-verify/check_families.py`
**Interfaces:**
- Consumes: `org-os/00-role-registry/roles.yaml` (role-id 집합)
- Produces: `family-id` 26개 + 각 패밀리의 `member-role-ids`, `carries-lenses`, `audit-capable` — Task 2/5/6에서 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_families.py`:
```python
import yaml, sys
ROOT = "/home/donghyeon/dev/company-haness/org-os/00-role-registry"
roles = yaml.safe_load(open(f"{ROOT}/roles.yaml"))
role_ids = {r["role-id"] for r in roles["role-registry"]["roles"]}
fam = yaml.safe_load(open(f"{ROOT}/capability-families.yaml"))
families = fam["capability-families"]["families"]
mapped = [rid for f in families for rid in f["member-role-ids"]]
assert len(families) == 26, f"expected 26 families, got {len(families)}"
assert len(mapped) == len(set(mapped)), "duplicate role in families"
assert set(mapped) == role_ids, f"mismatch: missing={role_ids-set(mapped)} extra={set(mapped)-role_ids}"
print("OK families:", len(families), "roles:", len(mapped))
```
Run: `python3 /tmp/orgos-verify/check_families.py`
Expected: FAIL — `FileNotFoundError: capability-families.yaml`.
- [ ] **Step 2: 파일 작성**
Create `org-os/00-role-registry/capability-families.yaml`:
```yaml
capability-families:
version: 1
purpose: >
62개 참조 role(roles.yaml)을 실제 인스턴스화·라우팅 단위인 26개 패밀리로 묶는다.
같은 렌즈/역량을 공유하는 role만 한 패밀리로 묶으며, 서로 다른 렌즈는 병합하지 않는다.
source-of-roles: org-os/00-role-registry/roles.yaml
reference-taxonomy-preserved: true
family-count: 26
role-count-covered: 62
rules:
- 모든 role-id는 정확히 하나의 패밀리에 속한다(중복·누락 금지).
- 서로 다른 lens를 carry하는 role은 같은 패밀리로 병합하지 않는다(lens-registry R1).
- audit-capable=true 패밀리만 감사/검증 역할로 배정할 수 있다.
- 임원 8개 패밀리는 각자 distinct 렌즈라 통합하지 않는다(다양성 보존).
families:
- { family-id: FAM-CEO, member-role-ids: [EXEC-CEO], carries-lenses: [LENS-VALUE], audit-capable: false, default-team-types: [Leadership], instantiation-priority: mvp }
- { family-id: FAM-ORCH, member-role-ids: [OPS-ORCH], carries-lenses: [], audit-capable: false, default-team-types: [Operations], instantiation-priority: mvp }
- { family-id: FAM-CTO, member-role-ids: [EXEC-CTO], carries-lenses: [LENS-TECH], audit-capable: false, default-team-types: [Leadership, Platform], instantiation-priority: mvp }
- { family-id: FAM-CPO, member-role-ids: [EXEC-CPO], carries-lenses: [LENS-PRODUCT], audit-capable: false, default-team-types: [Leadership, Stream-aligned], instantiation-priority: mvp }
- { family-id: FAM-CFO, member-role-ids: [EXEC-CFO], carries-lenses: [LENS-FINANCE], audit-capable: false, default-team-types: [Leadership, Enabling], instantiation-priority: mvp }
- { family-id: FAM-COO, member-role-ids: [EXEC-COO], carries-lenses: [LENS-OPS], audit-capable: false, default-team-types: [Leadership, Enabling], instantiation-priority: standard }
- { family-id: FAM-CPTO, member-role-ids: [EXEC-CPTO], carries-lenses: [LENS-INTEGRATION], audit-capable: false, default-team-types: [Leadership], instantiation-priority: standard }
- { family-id: FAM-VPENG, member-role-ids: [EXEC-VPENG], carries-lenses: [LENS-TECH], audit-capable: true, default-team-types: [Leadership, Enabling], instantiation-priority: mvp }
- { family-id: FAM-PRODUCT-MGMT, member-role-ids: [PROD-PM, PROD-PO, PROD-TPO, PROD-PPO], carries-lenses: [LENS-PRODUCT], audit-capable: false, default-team-types: [Stream-aligned, Complicated Subsystem, Platform], instantiation-priority: mvp }
- { family-id: FAM-UX-RESEARCH, member-role-ids: [UX-RESEARCHER, DATA-ANALYST], carries-lenses: [LENS-CUSTOMER], audit-capable: false, default-team-types: [Enabling, Stream-aligned], instantiation-priority: standard }
- { family-id: FAM-DESIGN, member-role-ids: [DES-PROD, DES-PLATFORM, DES-INTERNAL], carries-lenses: [LENS-CUSTOMER], audit-capable: false, default-team-types: [Stream-aligned, Platform], instantiation-priority: standard }
- { family-id: FAM-STRATEGY, member-role-ids: [STR-ANALYST], carries-lenses: [LENS-VALUE, LENS-FINANCE], audit-capable: false, default-team-types: [Enabling], instantiation-priority: standard }
- { family-id: FAM-ENG-FRONTEND, member-role-ids: [ENG-FE, ENG-FEPLAT, ENG-FEUX], carries-lenses: [LENS-TECH], audit-capable: false, default-team-types: [Stream-aligned, Platform], instantiation-priority: mvp }
- { family-id: FAM-ENG-BACKEND, member-role-ids: [ENG-BE, ENG-BEGEN, ENG-PRODSERVER, ENG-PLATSERVER, ENG-PRODUCTMINDED, ENG-SW], carries-lenses: [LENS-TECH], audit-capable: false, default-team-types: [Stream-aligned, Platform], instantiation-priority: mvp }
- { family-id: FAM-ENG-SPECIAL, member-role-ids: [ENG-DESKTOP, ENG-PRODCHAPTER], carries-lenses: [LENS-TECH], audit-capable: false, default-team-types: [Complicated Subsystem, Platform], instantiation-priority: later }
- { family-id: FAM-PLATFORM-INFRA, member-role-ids: [INFRA-DEV, INFRA-PLATFORM, INFRA-DEVOPS, SRE, SEC-DEVSECOPS], carries-lenses: [LENS-TECH, LENS-SECURITY], audit-capable: true, default-team-types: [Platform], instantiation-priority: standard }
- { family-id: FAM-ARCHITECTURE-TECH, member-role-ids: [ARCH-EA, ARCH-SOLUTION, ARCH-APP, ARCH-TECH, ARCH-IT, ARCH-SYSANALYST, ARCH-SWAT], carries-lenses: [LENS-TECH], audit-capable: true, default-team-types: [Complicated Subsystem, Enabling, Platform], instantiation-priority: standard }
- { family-id: FAM-ARCHITECTURE-BIZ, member-role-ids: [ARCH-BA, ARCH-BIZANALYST], carries-lenses: [LENS-OPS, LENS-VALUE], audit-capable: false, default-team-types: [Enabling], instantiation-priority: later }
- { family-id: FAM-DATA, member-role-ids: [ARCH-DATA, DATA-ENGINEER, DATA-BIGDATA], carries-lenses: [LENS-TECH], audit-capable: false, default-team-types: [Platform, Complicated Subsystem], instantiation-priority: standard }
- { family-id: FAM-QA, member-role-ids: [QA], carries-lenses: [], audit-capable: true, default-team-types: [Enabling, Stream-aligned], instantiation-priority: mvp }
- { family-id: FAM-SECURITY, member-role-ids: [SEC-ENGINEER, SEC-APPSEC, SEC-CHAMPION], carries-lenses: [LENS-SECURITY], audit-capable: true, default-team-types: [Enabling, Complicated Subsystem, Stream-aligned], instantiation-priority: standard }
- { family-id: FAM-OPS-DELIVERY, member-role-ids: [OPS-CH, OPS-CREW], carries-lenses: [LENS-OPS, LENS-CUSTOMER], audit-capable: false, default-team-types: [Stream-aligned], instantiation-priority: later }
- { family-id: FAM-GTM-GROWTH, member-role-ids: [GTM-GROWTHPM, GTM-DEMANDGEN, GTM-PMM, GTM-CI], carries-lenses: [LENS-REVENUE], audit-capable: false, default-team-types: [GTM Revenue, Stream-aligned, Enabling], instantiation-priority: standard }
- { family-id: FAM-GTM-SALES, member-role-ids: [GTM-SALES, GTM-CS, GTM-PARTNER], carries-lenses: [LENS-REVENUE, LENS-CUSTOMER], audit-capable: false, default-team-types: [GTM Revenue, Stream-aligned], instantiation-priority: standard }
- { family-id: FAM-REVOPS, member-role-ids: [GTM-REVOPS, GTM-PRICING], carries-lenses: [LENS-REVENUE, LENS-FINANCE], audit-capable: false, default-team-types: [GTM Revenue, Platform, Enabling], instantiation-priority: mvp }
- { family-id: FAM-LEGAL, member-role-ids: [GTM-LEGAL], carries-lenses: [LENS-LEGAL], audit-capable: true, default-team-types: [GTM Revenue, Enabling], instantiation-priority: standard }
```
- [ ] **Step 3: 검증 통과 확인**
Run: `python3 /tmp/orgos-verify/check_families.py`
Expected: PASS — `OK families: 26 roles: 62`
- [ ] **Step 4: 커밋**
```bash
git add org-os/00-role-registry/capability-families.yaml
git commit -m "feat(org-os): add capability-families overlay (62 roles -> 26 families)"
```
---
## Task 2: lens-registry.yaml (11 불가침 렌즈)
**Files:**
- Create: `org-os/00-role-registry/lens-registry.yaml`
- Verify(temp): `/tmp/orgos-verify/check_lenses.py`
**Interfaces:**
- Consumes: Task 1의 `capability-families.yaml` (`carries-lenses` 역방향)
- Produces: `lens-id` 11개 + 각 렌즈 `carrier-families` — Task 5/6에서 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_lenses.py`:
```python
import yaml
ROOT = "/home/donghyeon/dev/company-haness/org-os/00-role-registry"
fam = yaml.safe_load(open(f"{ROOT}/capability-families.yaml"))["capability-families"]["families"]
lens = yaml.safe_load(open(f"{ROOT}/lens-registry.yaml"))["lens-registry"]
lenses = {l["lens-id"]: l for l in lens["lenses"]}
fam_ids = {f["family-id"] for f in fam}
# invert families -> lens -> carriers
inv = {}
for f in fam:
for L in f["carries-lenses"]:
inv.setdefault(L, set()).add(f["family-id"])
assert len(lenses) == 11, f"expected 11 lenses, got {len(lenses)}"
for lid, l in lenses.items():
carriers = set(l.get("carrier-families", []))
# LENS-CONTRARIAN is rotation-based: allowed to be empty/special
if lid == "LENS-CONTRARIAN":
continue
assert carriers, f"{lid} has no carrier"
assert carriers <= fam_ids, f"{lid} carriers not in families: {carriers-fam_ids}"
assert carriers == inv.get(lid, set()), f"{lid} carrier mismatch: registry={carriers} families={inv.get(lid)}"
print("OK lenses:", len(lenses))
```
Run: `python3 /tmp/orgos-verify/check_lenses.py`
Expected: FAIL — `FileNotFoundError: lens-registry.yaml`.
- [ ] **Step 2: 파일 작성**
Create `org-os/00-role-registry/lens-registry.yaml`:
```yaml
lens-registry:
version: 1
purpose: >
서로 구별되는 11개 평가 렌즈를 다양성의 바닥으로 고정한다.
다양성은 렌즈 수에서 나오며 role headcount가 아니다. 효율화(패밀리 통합)는 이 바닥을 줄이지 않는다.
source-document: org-os/00-role-registry/team-topology-map.yaml (executive-balance)
rules:
- R1. 패밀리 통합 시 서로 다른 lens는 절대 병합 금지. 같은 lens의 중복 role만 합친다.
- R2. divergent 모드는 tier별 최소 렌즈 수 이상을 병렬로 커버해야 한다.
- R3. converge 모드(특히 heavy)는 렌즈 의견을 하나로 뭉치지 말고 트레이드오프째 노출한다.
- R4. LENS-CONTRARIAN 담당 패밀리는 해당 옵션을 작성한 패밀리와 달라야 한다(이해상충 방지).
lenses:
- { lens-id: LENS-VALUE, name: 장기가치, question: 장기 회사가치·포트폴리오 적합성?, carrier-families: [FAM-CEO, FAM-STRATEGY, FAM-ARCHITECTURE-BIZ], primary: FAM-CEO }
- { lens-id: LENS-TECH, name: 기술, question: 아키텍처·안정성·확장성·기술부채?, carrier-families: [FAM-CTO, FAM-VPENG, FAM-ENG-FRONTEND, FAM-ENG-BACKEND, FAM-ENG-SPECIAL, FAM-PLATFORM-INFRA, FAM-ARCHITECTURE-TECH, FAM-DATA], primary: FAM-CTO }
- { lens-id: LENS-PRODUCT, name: 제품, question: 고객문제·제품가치·로드맵·P/L?, carrier-families: [FAM-CPO, FAM-PRODUCT-MGMT], primary: FAM-CPO }
- { lens-id: LENS-FINANCE, name: 재무, question: 비용·ROI·자본효율·기회비용?, carrier-families: [FAM-CFO, FAM-STRATEGY, FAM-REVOPS], primary: FAM-CFO }
- { lens-id: LENS-OPS, name: 운영, question: 운영타당성·프로세스·지원부담?, carrier-families: [FAM-COO, FAM-OPS-DELIVERY, FAM-ARCHITECTURE-BIZ], primary: FAM-COO }
- { lens-id: LENS-INTEGRATION, name: 제품기술통합, question: 제품-기술 통합·충돌 감소?, carrier-families: [FAM-CPTO], primary: FAM-CPTO }
- { lens-id: LENS-SECURITY, name: 보안, question: 위협·shift-left·데이터 무결성?, carrier-families: [FAM-SECURITY, FAM-PLATFORM-INFRA], primary: FAM-SECURITY }
- { lens-id: LENS-LEGAL, name: 법무, question: 계약·컴플라이언스·프라이버시?, carrier-families: [FAM-LEGAL], primary: FAM-LEGAL }
- { lens-id: LENS-CUSTOMER, name: 고객, question: 사용자 리서치·고객의 소리·경험?, carrier-families: [FAM-UX-RESEARCH, FAM-DESIGN, FAM-GTM-SALES, FAM-OPS-DELIVERY], primary: FAM-UX-RESEARCH }
- { lens-id: LENS-REVENUE, name: 매출, question: 매출영향·GTM motion·lead-to-cash?, carrier-families: [FAM-REVOPS, FAM-GTM-GROWTH, FAM-GTM-SALES], primary: FAM-REVOPS }
- { lens-id: LENS-CONTRARIAN, name: 역발상, question: 이걸 하지 말아야 할 이유·무엇이 깨지나?, carrier-families: [], carrier-policy: rotation-any-audit-capable-non-authoring-family, primary: null }
```
- [ ] **Step 3: 검증 통과 확인**
Run: `python3 /tmp/orgos-verify/check_lenses.py`
Expected: PASS — `OK lenses: 11`
- [ ] **Step 4: 커밋**
```bash
git add org-os/00-role-registry/lens-registry.yaml
git commit -m "feat(org-os): add lens-registry overlay (11 inviolable lenses)"
```
---
## Task 3: governance-tiers.yaml (경량/표준/중대 티어)
**Files:**
- Create: `org-os/06-agent-work/governance-tiers.yaml`
- Verify(temp): `/tmp/orgos-verify/check_tiers.py`
**Interfaces:**
- Produces: `tiers.{light,standard,heavy}` + `derivation` — Task 5/7에서 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_tiers.py`:
```python
import yaml
P = "/home/donghyeon/dev/company-haness/org-os/06-agent-work/governance-tiers.yaml"
g = yaml.safe_load(open(P))["governance-tiers"]
tiers = g["tiers"]
assert set(tiers) == {"light", "standard", "heavy"}, f"tiers={set(tiers)}"
for t in tiers.values():
assert "converge" in t and "divergent" in t, "tier missing converge/divergent"
assert g["derivation"]["rule"]["base"]["High"] == "heavy"
assert g["derivation"]["rule"]["base"]["Critical"] == "heavy"
hg = tiers["heavy"]["converge"]["human-gate"]["human-decider-when"]
assert "risk-High-or-Critical" in hg and "blast-production-customer-revenue" in hg
print("OK tiers:", list(tiers))
```
Run: `python3 /tmp/orgos-verify/check_tiers.py`
Expected: FAIL — `FileNotFoundError`.
- [ ] **Step 2: 파일 작성**
Create `org-os/06-agent-work/governance-tiers.yaml`:
```yaml
governance-tiers:
version: 1
purpose: 위험도에 비례해 협업 의식의 무게를 조절한다. HEAVY는 기존 DRAI 동작과 동일.
backward-compatibility: >
TIER-HEAVY == 기존 drai-matrix + state-transition Approved 조건. 기존 High/Critical 경로는 자동으로 HEAVY.
derivation:
inputs:
risk-level: [Low, Med, High, Critical]
reversibility: [two-way-door, one-way-door]
blast-radius: [single-role, cross-team, production-customer-revenue]
rule:
base: { Low: light, Med: standard, High: heavy, Critical: heavy }
modifiers:
- { if: reversibility-is-one-way-door, effect: bump-up-one-level }
- { if: blast-radius-is-cross-team, effect: bump-up-one-level }
hard-floor:
- { if: blast-radius-is-production-customer-revenue, effect: min-tier-heavy }
cap: heavy
no-auto-downgrade-below: base
human-can-escalate-up: true
examples:
- { risk: Low, reversibility: one-way-door, blast: single-role, result: standard }
- { risk: Med, reversibility: one-way-door, blast: cross-team, result: heavy }
- { risk: Low, reversibility: two-way-door, blast: single-role, result: light }
tiers:
light:
converge:
deciders: [owner-role-agent]
reviewers: 1
auditors: 0
auditor-added-when: [security, legal, privacy]
evidence-grade-min: E2
human: not-required
divergent: { min-distinct-lenses: 3, contrarian-required: false, synthesis: 1 }
wave-execution: pipeline
standard:
converge:
deciders: [decider-role-agent]
recommenders: parallel
auditors: 1
evidence-grade-min: E3
human: informed-non-blocking
divergent: { min-distinct-lenses: 5, contrarian-required: true, synthesis: 1 }
wave-execution: pipeline
heavy:
converge:
drai: full-per-drai-matrix
audit-fanout: { min-independent-verifiers: 3, kill-on: majority-refute }
evidence-grade-min: E3
unresolved-critical-risks: false
human-gate:
human-decider-when: [risk-High-or-Critical, blast-production-customer-revenue]
else: { decider: EXEC-CEO, human: informed-non-blocking }
divergent: { min-distinct-lenses: all-relevant, contrarian-required: true, synthesis: tradeoff-matrix }
wave-execution: pipeline-with-barrier-at-synthesis
```
- [ ] **Step 3: 검증 통과 확인**
Run: `python3 /tmp/orgos-verify/check_tiers.py`
Expected: PASS — `OK tiers: ['light', 'standard', 'heavy']`
- [ ] **Step 4: 커밋**
```bash
git add org-os/06-agent-work/governance-tiers.yaml
git commit -m "feat(org-os): add governance-tiers overlay (light/standard/heavy)"
```
---
## Task 4: execution-policy.yaml (파이프라인·병렬감사)
**Files:**
- Create: `org-os/06-agent-work/execution-policy.yaml`
- Verify(temp): `/tmp/orgos-verify/check_exec.py`
**Interfaces:**
- Produces: `pipeline-default`, `parallel-audit-fanout`, `re-hydration-control` — Task 5에서 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_exec.py`:
```python
import yaml
P = "/home/donghyeon/dev/company-haness/org-os/06-agent-work/execution-policy.yaml"
e = yaml.safe_load(open(P))["execution-policy"]
assert e["pipeline-default"] is True
assert e["parallel-audit-fanout"]["min-independent-verifiers"] >= 3
assert e["wave"]["semantics"] == "concurrency-cap-not-barrier"
assert "divergent-synthesis" in e["barrier-allowed-only-when"]
print("OK execution-policy")
```
Run: `python3 /tmp/orgos-verify/check_exec.py`
Expected: FAIL — `FileNotFoundError`.
- [ ] **Step 2: 파일 작성**
Create `org-os/06-agent-work/execution-policy.yaml`:
```yaml
execution-policy:
version: 1
purpose: wave를 배리어가 아닌 파이프라인으로 실행하고, 감사를 병렬화하며, 재적재 비용을 통제한다.
pipeline-default: true
barrier-allowed-only-when:
- divergent-synthesis
- dedup-across-all-findings
- early-exit-on-zero
- cross-item-comparison-required
wave:
max-concurrent-role-agents: 5
semantics: concurrency-cap-not-barrier
note: scorecard의 wave-size 5는 동시성 상한이며 wave 완료를 기다리는 배리어가 아니다.
parallel-audit-fanout:
applies-to-tier: heavy
min-independent-verifiers: 3
verifier-prompt-stance: refute
verifier-lens-diversity: required
kill-on: majority-refute
on-kill: set-state-Blocked
verifier-independence:
rule: 검증자 패밀리는 자기 패밀리가 작성한 산출물을 검증할 수 없다
source: roles.yaml independent-audit-policy 이해상충 규칙과 정합
re-hydration-control:
pass-forward: structured-summary-and-evidence-links-only
forbid: raw-logs
enforce: org-os/06-agent-work/context-package-spec.yaml compression-policy
```
- [ ] **Step 3: 검증 통과 확인**
Run: `python3 /tmp/orgos-verify/check_exec.py`
Expected: PASS — `OK execution-policy`
- [ ] **Step 4: 커밋**
```bash
git add org-os/06-agent-work/execution-policy.yaml
git commit -m "feat(org-os): add execution-policy overlay (pipeline + parallel audit)"
```
---
## Task 5: collaboration-modes.yaml (발산/수렴)
**Files:**
- Create: `org-os/06-agent-work/collaboration-modes.yaml`
- Verify(temp): `/tmp/orgos-verify/check_modes.py`
**Interfaces:**
- Consumes: Task 2(lens-registry), Task 3(governance-tiers), Task 4(execution-policy)
- Produces: `modes.{divergent,converge}` — Task 6에서 scorecard가 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_modes.py`:
```python
import yaml
P = "/home/donghyeon/dev/company-haness/org-os/06-agent-work/collaboration-modes.yaml"
m = yaml.safe_load(open(P))["collaboration-modes"]
assert set(m["modes"]) == {"divergent", "converge"}, f"modes={set(m['modes'])}"
assert m["mode-selection"]["declared-at"] == "intake"
d = m["modes"]["divergent"]
assert d["synthesis"]["must-not"], "divergent synthesis must forbid merging/deciding"
assert d["barrier"] == "allowed"
print("OK modes:", list(m["modes"]))
```
Run: `python3 /tmp/orgos-verify/check_modes.py`
Expected: FAIL — `FileNotFoundError`.
- [ ] **Step 2: 파일 작성**
Create `org-os/06-agent-work/collaboration-modes.yaml`:
```yaml
collaboration-modes:
version: 1
purpose: 발산(아이디어 생성)과 수렴(결정·승인)을 분리해 각각 최적 실행형태로 돌린다.
mode-selection:
declared-at: intake
declared-by: EXEC-CEO
values: [divergent, converge]
default: converge
modes:
divergent:
goal: 다양한 옵션·아이디어 생성
mechanism: per-lens-parallel-fanout
fanout:
assign: 각 에이전트에 서로 다른 lens와 divergent-framing 부여
source-of-lenses: org-os/00-role-registry/lens-registry.yaml
min-distinct-lenses: from-governance-tiers
contrarian: LENS-CONTRARIAN 포함(티어 규칙에 따름), 옵션 작성 패밀리와 다른 패밀리가 담당
synthesis:
role: 합성 에이전트 1명
must: 옵션 수집·정리, 렌즈별 트레이드오프 노출
must-not: 단일 추천으로 병합하거나 결정하기
barrier: allowed
output: option-set (옵션별 lens 트레이드오프)
converge:
goal: 책임소재 있는 결정·승인
mechanism: tier-weighted-DRAI
execution: { recommenders: parallel, auditors: parallel-when-heavy, decider: consumes }
output: decision-record (선택 옵션 + 인정된 트레이드오프 + dissent 기록)
rule: High/Critical → 인간 decider (governance-tiers human-gate 준수)
two-phase:
divergent-then-converge:
when: 사용자가 아이디어 후 결정을 함께 원할 때
execution: pipeline (발산 option-set → 수렴 입력)
```
- [ ] **Step 3: 검증 통과 확인**
Run: `python3 /tmp/orgos-verify/check_modes.py`
Expected: PASS — `OK modes: ['divergent', 'converge']`
- [ ] **Step 4: 커밋**
```bash
git add org-os/06-agent-work/collaboration-modes.yaml
git commit -m "feat(org-os): add collaboration-modes overlay (divergent/converge)"
```
---
## Task 6: scorecard + context-package 참조 배선
**Files:**
- Modify: `org-os/00-role-registry/role-selection-scorecard.yaml`
- Modify: `org-os/06-agent-work/context-package-spec.yaml`
- Verify(temp): `/tmp/orgos-verify/check_wiring.py`
**Interfaces:**
- Consumes: Task 3(tier), Task 5(mode), Task 2(lens)
- Produces: scorecard output-template의 `mode/tier/assigned-lens/lens-coverage`, context-package의 동일 필드.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_wiring.py`:
```python
import yaml
R = "/home/donghyeon/dev/company-haness/org-os"
sc = yaml.safe_load(open(f"{R}/00-role-registry/role-selection-scorecard.yaml"))["role-selection-scorecard"]
ot = sc["output-template"]
for k in ["mode", "tier", "assigned-lens", "lens-coverage"]:
assert k in ot, f"scorecard output-template missing {k}"
hr = "\n".join(sc["hard-rules"])
assert "mode" in hr and "tier" in hr and "lens" in hr, "scorecard hard-rules missing mode/tier/lens rule"
cp = yaml.safe_load(open(f"{R}/06-agent-work/context-package-spec.yaml"))["context-package-spec"]
for k in ["mode", "tier", "assigned-lens", "divergent-framing"]:
assert k in cp["schema"], f"context-package schema missing {k}"
print("OK wiring")
```
Run: `python3 /tmp/orgos-verify/check_wiring.py`
Expected: FAIL — `AssertionError: scorecard output-template missing mode`.
- [ ] **Step 2: scorecard output-template에 필드 추가**
`org-os/00-role-registry/role-selection-scorecard.yaml``output-template:` 블록에서 마지막 `reason:` 줄 아래에 다음을 같은 들여쓰기로 추가:
```yaml
mode: divergent / converge
tier: light / standard / heavy
assigned-lens:
lens-coverage:
```
- [ ] **Step 3: scorecard hard-rules에 규칙 추가**
같은 파일의 `hard-rules:` 리스트 끝에 다음 3개 항목 추가(기존 항목과 같은 `- ` 들여쓰기):
```yaml
- A workflow must declare mode and tier before the first execution wave.
- Divergent mode must cover at least the tier's min-distinct-lenses in parallel (governance-tiers).
- Converge heavy must expose lens tradeoffs and must not merge distinct lenses into one recommendation.
```
- [ ] **Step 4: context-package-spec schema에 필드 추가**
`org-os/06-agent-work/context-package-spec.yaml``schema:` 블록에서 `task-id:` 아래(또는 `objective:` 위)에 다음을 같은 들여쓰기로 추가:
```yaml
mode: divergent / converge
tier: light / standard / heavy
assigned-lens:
divergent-framing:
```
그리고 같은 파일의 `required-fields:` 리스트에 `- mode`, `- tier` 두 줄을 추가.
- [ ] **Step 5: 두 파일 파싱 + 검증 통과 확인**
Run:
```bash
python3 -c "import yaml; yaml.safe_load(open('org-os/00-role-registry/role-selection-scorecard.yaml')); yaml.safe_load(open('org-os/06-agent-work/context-package-spec.yaml')); print('parse ok')"
python3 /tmp/orgos-verify/check_wiring.py
```
Expected: `parse ok` 다음 `OK wiring`
- [ ] **Step 6: 커밋**
```bash
git add org-os/00-role-registry/role-selection-scorecard.yaml org-os/06-agent-work/context-package-spec.yaml
git commit -m "feat(org-os): wire mode/tier/lens into scorecard and context-package"
```
---
## Task 7: state-transition-rules 정합 배선
**Files:**
- Modify: `org-os/00-role-registry/state-transition-rules.yaml`
- Verify(temp): `/tmp/orgos-verify/check_states.py`
**Interfaces:**
- Consumes: Task 3(governance-tiers, tier-modifiers 단일 원천)
- Produces: `state-vocabulary-map`, `tier-modifiers` — hook 구현(후속 라운드)이 참조.
- [ ] **Step 1: 실패하는 검증 작성**
Create `/tmp/orgos-verify/check_states.py`:
```python
import yaml
P = "/home/donghyeon/dev/company-haness/org-os/00-role-registry/state-transition-rules.yaml"
s = yaml.safe_load(open(P))["state-transition-rules"]
svm = s["state-vocabulary-map"]
assert svm["source-of-truth"] == "workflow-stage"
for k in ["workflow-stage", "document-state", "review-state"]:
assert k in svm, f"missing {k}"
assert "light" in s["tier-modifiers"] and "heavy" in s["tier-modifiers"]
print("OK states")
```
Run: `python3 /tmp/orgos-verify/check_states.py`
Expected: FAIL — `KeyError: 'state-vocabulary-map'`.
- [ ] **Step 2: state-vocabulary-map + tier-modifiers 블록 추가**
`org-os/00-role-registry/state-transition-rules.yaml`의 최상위(`transitions:` 블록 아래, 같은 `state-transition-rules:` 자식 들여쓰기 2칸)에 다음을 추가:
```yaml
state-vocabulary-map:
source-of-truth: workflow-stage
workflow-stage: [intake, discovery, design, review, implementation, verification, release, blocked, closed]
document-state: [Draft, Review, Approved, Closed]
review-state: [Submitted-for-Review, Accepted, Changes-Requested, Blocked]
mapping:
- workflow-stage가 워크플로우의 단일 원천이다.
- 각 stage 내부에서 개별 산출물은 document-state를, 부모-자식 수용 1건은 review-state를 가진다.
- hook은 document-state와 review-state를 전이시킨다.
- 해당 stage의 게이팅 문서가 Approved 또는 Accepted에 도달하면 workflow-stage가 전진한다.
tier-modifiers:
source-of-truth: org-os/06-agent-work/governance-tiers.yaml
light: { evidence-grade-min: E2, auditor-required: only-when-security-legal-privacy, human: not-required }
standard: { evidence-grade-min: E3, auditor-required: true, human: informed-non-blocking }
heavy: { evidence-grade-min: E3, auditor-required: parallel-fanout, human: gate-per-governance-tiers }
note: 실제 값의 단일 원천은 governance-tiers.yaml이며 여기는 상태전이 관점의 참조다. HEAVY는 기존 Approved 조건과 동일.
```
- [ ] **Step 3: 파싱 + 검증 통과 확인**
Run:
```bash
python3 -c "import yaml; yaml.safe_load(open('org-os/00-role-registry/state-transition-rules.yaml')); print('parse ok')"
python3 /tmp/orgos-verify/check_states.py
```
Expected: `parse ok` 다음 `OK states`
- [ ] **Step 4: 커밋**
```bash
git add org-os/00-role-registry/state-transition-rules.yaml
git commit -m "feat(org-os): reconcile state vocabularies and reference tier-modifiers"
```
---
## Task 8: README 등재 + 전체 통합 게이트
**Files:**
- Modify: `org-os/README.md`
- Verify(temp): `/tmp/orgos-verify/check_all.py`
**Interfaces:**
- Consumes: Task 17 모든 산출물. 최종 성공기준(스펙 §7) 게이트.
- [ ] **Step 1: 통합 검증 작성 (성공기준 1–6)**
Create `/tmp/orgos-verify/check_all.py`:
```python
import yaml, glob
R = "/home/donghyeon/dev/company-haness/org-os"
# parse all org-os yaml
for f in glob.glob(f"{R}/**/*.yaml", recursive=True):
yaml.safe_load(open(f))
roles = yaml.safe_load(open(f"{R}/00-role-registry/roles.yaml"))["role-registry"]["roles"]
role_ids = {r["role-id"] for r in roles}
fams = yaml.safe_load(open(f"{R}/00-role-registry/capability-families.yaml"))["capability-families"]["families"]
fam_ids = {f["family-id"] for f in fams}
lenses = yaml.safe_load(open(f"{R}/00-role-registry/lens-registry.yaml"))["lens-registry"]["lenses"]
lens_ids = {l["lens-id"] for l in lenses}
# 1: 62 roles mapped exactly once
mapped = [rid for f in fams for rid in f["member-role-ids"]]
assert set(mapped) == role_ids and len(mapped) == len(set(mapped)) == 62
# 2: family carries-lenses reference real lenses
for f in fams:
assert set(f["carries-lenses"]) <= lens_ids, f"{f['family-id']} orphan lens"
# 3+5: every lens has >=1 carrier (except contrarian rotation) + carriers are real families
for l in lenses:
cf = set(l.get("carrier-families", []))
assert cf <= fam_ids, f"{l['lens-id']} orphan family {cf-fam_ids}"
if l["lens-id"] != "LENS-CONTRARIAN":
assert cf, f"{l['lens-id']} no carrier"
# 4: tier x mode all defined
g = yaml.safe_load(open(f"{R}/06-agent-work/governance-tiers.yaml"))["governance-tiers"]["tiers"]
assert set(g) == {"light","standard","heavy"}
for t in g.values(): assert "converge" in t and "divergent" in t
m = yaml.safe_load(open(f"{R}/06-agent-work/collaboration-modes.yaml"))["collaboration-modes"]["modes"]
assert set(m) == {"divergent","converge"}
# 6: heavy preserves human gate on High/Critical
hg = g["heavy"]["converge"]["human-gate"]["human-decider-when"]
assert "risk-High-or-Critical" in hg
print("OK ALL: 62 roles, 26 families,", len(lens_ids), "lenses, tiers", set(g), "modes", set(m))
```
Run: `python3 /tmp/orgos-verify/check_all.py`
Expected: 이 시점엔 README 미갱신이어도 통과해야 함(README는 검증 대상 아님). PASS — `OK ALL: 62 roles, 26 families, 11 lenses ...`. 실패 시 이전 Task로 돌아가 수정.
- [ ] **Step 2: README Directory Map 갱신**
`org-os/README.md`` ```text ... ``` ` 디렉토리 맵에서:
- `00-role-registry/` 항목 목록에 `lens-registry.yaml`, `capability-families.yaml` 두 줄 추가.
- `06-agent-work/` 항목 목록에 `collaboration-modes.yaml`, `governance-tiers.yaml`, `execution-policy.yaml` 세 줄 추가.
- [ ] **Step 3: README Rules 추가**
`## Rules` 목록 끝에 다음 3줄 추가:
```markdown
- `lens-registry.yaml`는 11개 불가침 평가 렌즈의 단일 원천이며, 다양성 바닥을 정의한다.
- 실제 인스턴스화·라우팅 단위는 `capability-families.yaml`의 26개 패밀리이고, `roles.yaml`의 62개 role은 참조 분류체계로 보존한다.
- 협업 실행은 `collaboration-modes.yaml`(발산/수렴) × `governance-tiers.yaml`(light/standard/heavy)로 결정하며, TIER-HEAVY는 기존 DRAI 동작과 동일하다.
```
- [ ] **Step 4: 03-products 드리프트 정리**
`## Directory Map``03-products/` 항목이 정본(`{product-id}/pr-faq.md·roadmap.md·metrics.md`)임을 유지하고, Rules 목록에 다음 한 줄 추가:
```markdown
- `03-products` 표기는 이 README의 `{product-id}/` 구조를 정본으로 한다(Claude Code 구성 명세 문서의 `03-products/README.md` 표기는 후속 라운드에 이에 맞춘다).
```
- [ ] **Step 5: 최종 파싱 + 통합 게이트 재확인**
Run:
```bash
python3 /tmp/orgos-verify/check_all.py
```
Expected: PASS — `OK ALL: 62 roles, 26 families, 11 lenses, tiers {'light','standard','heavy'} modes {'divergent','converge'}`
- [ ] **Step 6: 커밋**
```bash
git add org-os/README.md
git commit -m "docs(org-os): register overlay files and reconcile 03-products in README"
```
---
## Self-Review 결과 (작성자 점검)
- **Spec coverage:** 스펙 §3.1→Task2, §3.2→Task1, §3.3→Task5, §3.4→Task3, §3.5→Task4, §4.1→Task6, §4.2→Task6, §4.3→Task7, §4.4→Task8, §7 성공기준→Task8 게이트. 갭 없음.
- **Placeholder scan:** 각 신규 파일 전체 내용과 각 수정의 정확한 삽입 블록 포함. "TBD/적절히 처리" 없음.
- **Type consistency:** family-id 26개·lens-id 11개·tier 3개·mode 2개를 Global Constraints에 고정하고 전 Task가 동일 문자열 사용. check_all.py가 상호참조를 최종 검증.
## Notes
- 검증 python은 모두 `/tmp/orgos-verify/`의 임시 파일로 **repo에 커밋하지 않는다**(범위: 명세만). 영구 validator는 후속 라운드.
- 이 계획 완료 후 다음 라운드 입력: 스펙 §5의 흐름을 `.claude`(에이전트·command·hook)로 구현하는 thin vertical slice.