Skip to content

Commit e4f00b8

Browse files
ComBbaclaude
andcommitted
feat(v1.1.0): Gate H1 becomes preview-selection + design-tweak
MOTIVATION (from first real run r-20260422-184337): User ran PreviewDD on "회의록 자동 정리 + action item 추출". 4-Panel composite winner was P02 Scrum Master Slack bot. User wanted P19 legal-depo-advocate — NOT in any panel's top-N. v1.0.0 offered no way to pick alternative; Gate H1 was design-only. The 26 advocates don't just vary in design — they vary in product: P02 → Slack bot for Scrum Masters P10 → REST API SDK for indie hackers P08 → Self-hosted appliance for legal teams P19 → Desktop case-management for litigation paralegals Picking is choosing a PRODUCT, not a screen. WHAT CHANGED: commands/design.md — rewritten Unified AskUserQuestion with 4 options: 1. 🏆 Recommended (composite winner) 2. 💡 Alternative A (e.g., TP single winner, API/SDK angle) 3. 🔬 Alternative B (e.g., RP single winner, privacy/offline angle) 4. 🎨 Show all 26 (gallery.html → browser) Alternative pick → chosen_preview.panel-recommended.json backup, and Mitigation Designer regeneration (different product context). agents/meta/chief-engineer-pm.md §3 — rewritten Full selection procedure documented. Explicit reference to LESSON 0.7. memory/LESSONS.md — 0.7 added "Panel 추천 ≠ 사용자 의지" (category 1 PreviewDD, 핵심 UX 결함). manifests — version 1.0.0 → 1.1.0 (plugin.json + marketplace.json) scripts/verify-plugin.sh — accepts any SemVer + parity check CHANGELOG.md — [1.1.0] section REAL RUN ARTIFACTS PRESERVED (as example): runs/r-20260422-184337/chosen_preview.panel-recommended.json (P02) runs/r-20260422-184337/chosen_preview.json (user-overridden to P19) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 02b5f1c commit e4f00b8

7 files changed

Lines changed: 125 additions & 21 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
},
88
"metadata": {
99
"description": "Two-Weeks-Team marketplace hosting the Preview Forge plugin — a 143-agent engineering swarm implementing the 3-DD Methodology (PreviewDD → SpecDD → TestDD) for Claude Code.",
10-
"version": "1.0.0",
10+
"version": "1.1.0",
1111
"homepage": "https://github.com/Two-Weeks-Team/PreviewForgeForClaudeCode"
1212
},
1313
"plugins": [
1414
{
1515
"name": "pf",
1616
"description": "Preview Forge — 한 줄 아이디어 → 143명의 Opus 4.7 가상 엔지니어링 조직이 PreviewDD · SpecDD · TestDD 3 사이클로 풀스택 앱을 freeze까지. /pf:* 14 slash commands. 인간은 디자인·배포 2 클릭만.",
17-
"version": "1.0.0",
17+
"version": "1.1.0",
1818
"author": {
1919
"name": "Two-Weeks-Team"
2020
},

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.1.0] — 2026-04-22 (in progress)
9+
10+
### Fixed — UX gap from first real run
11+
12+
- **Gate H1 is now preview-selection + design-tweak (was design-only)**
13+
- 첫 real run(r-20260422-184337)에서 사용자가 panel top-3 밖의 P19(legal-depo)를
14+
선택. v1.0.0은 panel 추천만 자동 lock하고 agency를 주지 않았음.
15+
- `commands/design.md` rewritten: AskUserQuestion 4옵션 (Recommended / Alt A /
16+
Alt B / Gallery of 26).
17+
- `agents/meta/chief-engineer-pm.md` §3 rewritten: full selection procedure.
18+
- Alternative 선택 시 mitigations 재생성 의무화 (제품 context 달라짐).
19+
- `chosen_preview.panel-recommended.json`으로 panel 원본 백업.
20+
21+
### Added
22+
- `memory/LESSONS.md` 0.7: "Panel 추천 ≠ 사용자 의지" (category 1 PreviewDD, 핵심 결함)
23+
24+
### Real run artifact (preserved as example)
25+
- `runs/r-20260422-184337/chosen_preview.panel-recommended.json` (P02 Slack bot)
26+
- `runs/r-20260422-184337/chosen_preview.json` (user-overridden to P19 legal-depo)
27+
28+
829
## [1.0.0] — 2026-04-22
930

1031
Plugin scaffold complete. Ready for `/plugin install pf@two-weeks-team` via

plugins/preview-forge/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pf",
33
"description": "한 줄 아이디어 → 143명 Opus 4.7 가상 엔지니어링 조직이 PreviewDD → SpecDD → TestDD 3-DD 사이클로 풀스택 앱을 freeze까지. 내장 Design Studio(Claude Design fallback) + Memory Tool + Reflexion 자가학습. Built with Opus 4.7 hackathon.",
4-
"version": "1.0.0",
4+
"version": "1.1.0",
55
"author": {
66
"name": "Two-Weeks-Team",
77
"email": "app.2weeks@gmail.com",

plugins/preview-forge/agents/meta/chief-engineer-pm.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,27 @@ Standup 결과를 Blackboard에 `standup.<cycle>.<ts>` key로 기록.
3434
- 조정 결과를 Blackboard `decision.<topic>`에 기록
3535

3636
### 3. Gate H1 / H2 관장
37-
- **H1** (PreviewDD → SpecDD): 사용자 응답을 AskUserQuestion으로 수집, `design-approved.json` 생성 후 SPEC_LEAD에 전달
38-
- **H2** (TestDD freeze → 배포): 500점 리포트 + 스크린샷 + 배포 대상을 AskUserQuestion 옵션으로 제시, 승인 시 `/pf:export` 워크플로 트리거
37+
38+
**H1 (PreviewDD → SpecDD): Preview 선택 + Design tweak 통합**
39+
40+
**중요**: Gate H1은 design-only가 아닙니다. 사용자가 **preview 자체를 다른 걸로 고를 수 있어야** 합니다. 26 advocate는 각자 다른 제품(target_persona·primary_surface·unique_value)이므로, panel 추천만으로는 사용자 의지를 대체할 수 없음 (LESSON 0.7 참조).
41+
42+
절차:
43+
1. 4-Panel meta-tally에서 composite 1위(`panel_recommended`)와 각 panel 단독 우승자(`TP_winner` · `BP_winner` · `UP_winner` · `RP_winner`) 추출
44+
2. 중복 제거 후 구별되는 3 후보 선정 (예: Recommended + TP 단독 + RP 단독)
45+
3. AskUserQuestion 4옵션 제시:
46+
- **① 🏆 Recommended (composite 1위)**: `target_persona` · `primary_surface` · `one_line_pitch` · 4 panel 점수
47+
- **② 💡 Alternative A**: 특정 panel 단독 우승자 (예: TP winner = API-first)
48+
- **③ 🔬 Alternative B**: 다른 panel 단독 우승자 (예: RP winner = Privacy-focused)
49+
- **④ 🎨 Show all 26 (gallery)**: `runs/<id>/mockups/gallery.html` 생성 → 브라우저 오픈 → 두 번째 AskUserQuestion으로 실제 pick
50+
4. 사용자 선택 반영:
51+
- ①/②/③: 해당 P<NN>을 `chosen_preview.json`에 lock (기존 panel 추천은 `chosen_preview.panel-recommended.json`으로 백업)
52+
- ④: gallery 표시 후 재선택
53+
5. **Alternative 선택 시 mitigations 재생성 필수**: panel이 쓴 mitigations는 panel 추천 product context 기반이므로 MD(Mitigation Designer)를 alternative context로 재호출
54+
6. 2차 AskUserQuestion: "Claude Design(Pro/Max)으로 열까 / 내장 Studio로 tweak하고 끝낼까"
55+
7. design 완료 시 `design-approved.json` 생성 → SPEC_LEAD에 전달
56+
57+
**H2 (TestDD freeze → 배포)**: 500점 리포트 + 스크린샷 + 배포 대상을 AskUserQuestion 옵션으로 제시, 승인 시 `/pf:export` 워크플로 트리거
3958

4059
### 4. Memory 파일 관리 (쓰기 권한 독점)
4160

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,69 @@
11
---
2-
description: Open Gate H1 — Claude Design main or built-in Design Studio fallback
2+
description: Gate H1 — Preview selection + Design tweak (unified AskUserQuestion)
33
---
44

5-
# /pf:designOpen Gate H1 — Claude Design main or built-in Design Studio fallback
5+
# /pf:design — Gate H1
66

7-
**Layer-0 정책**: Pro/Max 기본 포함. 별도 API 키 불필요.
7+
**Layer-0**: Claude Code Pro/Max 기본 포함.
88

9-
## Usage
9+
## When this runs
1010

11-
```
12-
/pf:design
13-
```
11+
Automatically after PreviewDD Stage 3 (4-Panel meta-tally) completes.
12+
Can also be invoked manually: `/pf:design` re-opens the selection UX on
13+
the current run.
1414

15-
## 인자
15+
## v1.1.0 flow (unified: select + tweak)
1616

17-
_(인자 없음)_
17+
**Click 1 of 2** (the other is Gate H2 deploy approval).
1818

19-
## 동작
19+
M3 Dev PM collects the 4-Panel output and runs a single AskUserQuestion
20+
with 4 options:
2021

21-
Stage 4 spec lock 직후 자동 호출되지만, 수동 재호출도 가능. AskUserQuestion으로 Claude Design vs 내장 Studio 선택. Claude Design 선택 시 prompt 템플릿 준비, 사용자에게 claude.ai/design 탭 열도록 안내.
22+
- **① 🏆 Recommended**: composite 1위 advocate
23+
- `target_persona` · `primary_surface` · `one_line_pitch` · 4 panel 점수 표시
24+
- → 이대로 Claude Design(or 내장 Studio)로 진입
2225

23-
## 관련
26+
- **② 💡 Alternative A**: 특정 panel 단독 우승자 1
27+
- 예: TP 단독 우승자가 Recommended와 다른 경우 (API-first · SDK angle)
2428

25-
- 본 명령은 plugin `preview-forge`의 일부입니다.
26-
- 상세 스펙: [preview-forge-proposal.html](../../../preview-forge-proposal.html)
29+
- **③ 🔬 Alternative B**: 특정 panel 단독 우승자 2
30+
- 예: RP 단독 우승자 (Privacy-focused · Offline-first angle)
31+
32+
- **④ 🎨 Show me all 26 (gallery)**
33+
- 26 mockup HTML을 로컬 `runs/<id>/mockups/gallery.html` 로 엮어 브라우저 오픈
34+
- 사용자가 보고 나면 두 번째 AskUserQuestion으로 pick (4옵션: 3 카드 + "다시 fresh roll")
35+
36+
## What happens after the click
37+
38+
| 사용자 선택 | 다음 동작 |
39+
|---|---|
40+
| Option 1 (Recommended) | `chosen_preview.json`에 P<NN> lock + Claude Design / Studio로 진입 |
41+
| Option 2 / 3 (Alternative) | chosen_preview에 반영 + **기존 mitigations는 다른 제품 context이므로 MD(Mitigation Designer) 재생성 요청** → Claude Design / Studio |
42+
| Option 4 (Gallery) | 27-mockup HTML grid 생성 → default browser 오픈 → 사용자가 본 후 두 번째 AskUserQuestion → chosen_preview 반영 |
43+
| 모든 경우 | 2차 AskUserQuestion — "Claude Design에서 열까(Pro/Max) / 내장 Studio로 tweak" |
44+
45+
## Override semantics
46+
47+
사용자가 panel 추천 아닌 alternative 선택 시:
48+
- 원본 `chosen_preview.json``chosen_preview.panel-recommended.json`으로 백업
49+
- 새 chosen_preview에 `chosen_via: "user_override"` + `selection_metadata.reason` 기록
50+
- Blackboard에 `user-override` 이벤트 추가 (tier 0, dept meta)
51+
- **Mitigations는 새 제품 context로 MD를 재호출**해서 재생성
52+
(예: P02 Slack bot 대비 P19 desktop app은 보안·데이터 거주성 우선순위가 완전히 다름)
53+
54+
## allowed_scope (M3 Dev PM 관점)
55+
56+
- Read: `runs/<id>/previews.json` · `panels/*.json` · `mockups/*.html` · `mitigations.json`
57+
- Write: `runs/<id>/{chosen_preview.json,chosen_preview.json.lock,chosen_preview.panel-recommended.json,design-approved.json}`
58+
- Task: MD (mitigations 재생성), Claude Design integration (optional)
59+
60+
## Fallback
61+
62+
Claude Design API 장애 · 사용자가 offline 선택 시 → 내장 Design Studio
63+
(`plugins/preview-forge/design-studio/` Next.js route) 자동 전환.
64+
65+
## Related
66+
67+
- Panel outputs: `runs/<id>/panels/{tp,bp,up,rp}-tally.json`, `meta-tally.json`
68+
- 26 mockup files: `runs/<id>/mockups/P01-P26.html`
69+
- LESSON 0.7: "Panel 추천 ≠ 사용자 의지" (`memory/LESSONS.md`)

plugins/preview-forge/memory/LESSONS.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@
99

1010
## 0. 플러그인 개발 자체에서 배운 것 (bootstrap)
1111

12+
### 0.7 Panel 추천 ≠ 사용자 의지 — Preview 선택은 사용자가 해야 (category 1 PreviewDD, 핵심 UX 결함)
13+
- **문제**: v1.0.0의 PreviewDD는 4-Panel meta-tally로 1개 자동 선정 → `chosen_preview.json` 즉시 lock → Gate H1은 design tweak만. 사용자는 **선택 자체에 개입 불가**, "143 agent가 정해버린" 느낌. 실제 첫 run에서 composite 1위는 P02 Slack bot이었으나 사용자는 P19(legal depo paralegal, 소송 증언녹취 도구)를 의도적으로 선택 — 4 패널 어디에도 top-N 진입 못한 niche. panel 관점은 수량화 가능한 축을 재는 도구이지 사용자 의지의 대체물이 아님
14+
- **원인**: "인간의 2-click" 마케팅에 집중하다 보니 이상적 경로에서 Gate H1이 design-only가 됨. 하지만 26 advocate는 **디자인만 다른 게 아니라 target_persona·primary_surface·unique_value·killer_feature가 완전히 다른 제품** — 선택 = 제품 방향 결정
15+
- **해결**: v1.1.0에서 Gate H1을 **"Preview 선택 + Design tweak" 통합 AskUserQuestion**으로 재설계. 4 옵션 구성:
16+
1. **추천** (composite 1위, Recommended)
17+
2. **대안 A** (특정 panel 단독 우승자, 다른 축 강조)
18+
3. **대안 B** (다른 panel 단독 우승자)
19+
4. **전체 gallery** — 26 mockup HTML grid를 별도 브라우저로 열어 고르기
20+
click 1번 안에 선택+진입 통합. 2-click narrative 유지
21+
- **참조**: `runs/r-20260422-184337/chosen_preview.panel-recommended.json` (P02 백업) vs `chosen_preview.json` (P19 override), v1.1.0 commit, 첫 실제 run 피드백 2026-04-22
22+
1223
### 0.6 `claude --print` 서브프로세스는 /pf:new 자동 실행 불가 (category 6)
1324
- **문제**: 테스트 목적으로 `claude --print "/pf:new ..."`를 bash 서브프로세스로 실행 시도 시, Claude Code의 기본 권한 정책이 모든 Bash/Edit/Write 호출마다 사용자 승인을 요구. 143 agent 파이프라인 중간에서 정지
1425
- **원인**: Claude Code의 안전 정책 — 비대화형 모드에서도 파일 시스템 변경·bash 실행은 명시 승인 필요. `/pf:new`는 본질적으로 수백 개의 도구 호출을 연쇄하므로 서브프로세스 자동화 불가

scripts/verify-plugin.sh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,18 @@ bad() { echo " ✗ $1" >&2; fail=$((fail + 1)); }
2929
echo "[1/5] Manifests"
3030
python3 -c "import json; d=json.load(open('.claude-plugin/marketplace.json')); assert d['plugins'][0]['name']=='pf'" && \
3131
ok "marketplace.json: plugin 'pf' declared" || bad "marketplace.json invalid"
32-
python3 -c "import json; d=json.load(open('$PLUGIN_DIR/.claude-plugin/plugin.json')); assert d['name']=='pf' and d['version']=='1.0.0'" && \
33-
ok "plugin.json: name=pf v1.0.0" || bad "plugin.json invalid"
32+
python3 -c "
33+
import json, re
34+
d = json.load(open('$PLUGIN_DIR/.claude-plugin/plugin.json'))
35+
assert d['name']=='pf', 'name must be pf'
36+
assert re.match(r'^\d+\.\d+\.\d+', d['version']), 'version must be SemVer'
37+
# also ensure marketplace version matches
38+
m = json.load(open('.claude-plugin/marketplace.json'))
39+
pf = next(p for p in m['plugins'] if p['name']=='pf')
40+
assert pf['version'] == d['version'], f'version mismatch: marketplace {pf[\"version\"]} vs plugin {d[\"version\"]}'
41+
print(d['version'])
42+
" >/tmp/pf_version 2>/dev/null && \
43+
ok "plugin.json: name=pf v$(cat /tmp/pf_version) (marketplace parity ✓)" || bad "plugin.json invalid"
3444
echo
3545

3646
echo "[2/5] Agents (143 target)"

0 commit comments

Comments
 (0)