@ps-neko/nekowork 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +112 -0
- package/CLAUDE.md +81 -0
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/REVIEW.md +96 -0
- package/RULES.md +51 -0
- package/SOUL.md +21 -0
- package/WORKING-CONTEXT.md +52 -0
- package/agent.yaml +219 -0
- package/agents/architect.md +57 -0
- package/agents/code-reviewer.md +60 -0
- package/agents/codex-challenger.md +53 -0
- package/agents/codex-reviewer.md +56 -0
- package/agents/debugger.md +33 -0
- package/agents/doc-writer.md +51 -0
- package/agents/executor.md +41 -0
- package/agents/planner.md +49 -0
- package/agents/research.md +50 -0
- package/agents/security-reviewer.md +47 -0
- package/agents/test-engineer.md +41 -0
- package/bridge/mcp-server.js +301 -0
- package/commands/claude-led-codex-review.md +29 -0
- package/docs/ADVANCED.md +321 -0
- package/docs/AI-DEVELOPMENT-LIFECYCLE.md +105 -0
- package/docs/ARCHITECTURE.md +205 -0
- package/docs/AUDIT.md +114 -0
- package/docs/AUTH-MIGRATION.md +282 -0
- package/docs/CHANGELOG.md +97 -0
- package/docs/CLI-STAGES.md +89 -0
- package/docs/CODEMAPS/README.md +15 -0
- package/docs/CODEMAPS/agents.md +22 -0
- package/docs/CODEMAPS/bridge.md +18 -0
- package/docs/CODEMAPS/hooks.md +28 -0
- package/docs/CODEMAPS/manifests.md +14 -0
- package/docs/CODEMAPS/rules.md +22 -0
- package/docs/CODEMAPS/schemas.md +21 -0
- package/docs/CODEMAPS/scripts.md +158 -0
- package/docs/CODEMAPS/skills.md +29 -0
- package/docs/CODEMAPS/tests.md +98 -0
- package/docs/CORE-INVARIANTS.md +38 -0
- package/docs/DEMO.md +110 -0
- package/docs/EXAMPLE-PROJECT.md +92 -0
- package/docs/PORTING.md +154 -0
- package/docs/PRODUCT-PRINCIPLES.md +303 -0
- package/docs/PUBLISH-ALPHA.md +106 -0
- package/docs/QUICKSTART.md +344 -0
- package/docs/RELEASE-READINESS.md +140 -0
- package/docs/RISK-CLASSIFIER.md +50 -0
- package/docs/RUNBOOK.md +146 -0
- package/docs/SECURITY.md +79 -0
- package/docs/SETUP.md +142 -0
- package/docs/WHY-NEKOWORK.md +64 -0
- package/docs/case-studies/README.md +16 -0
- package/docs/case-studies/SINDRESORHUS-IS-PLAIN-OBJ.md +141 -0
- package/docs/dev-log/2026-04-29-p1-recovery.md +142 -0
- package/docs/dev-log/2026-04-29-week1-4.md +81 -0
- package/docs/examples/GITHUB-ACTIONS-HARDENING.md +86 -0
- package/docs/examples/QUALITY-LIFECYCLE-SMOKE.md +32 -0
- package/docs/examples/TRADING-DASHBOARD-MOCK.md +65 -0
- package/docs/workflows-stash/README.md +32 -0
- package/docs/workflows-stash/harness-review.yml +166 -0
- package/docs/workflows-stash/harness-validate.yml +48 -0
- package/examples/github-actions-hardening/.github/workflows/hardened-validate.yml +38 -0
- package/examples/github-actions-hardening/README.md +31 -0
- package/examples/github-actions-hardening/case-study/ASK.md +26 -0
- package/examples/github-actions-hardening/case-study/GATE_STATUS.md +28 -0
- package/examples/github-actions-hardening/case-study/PLAN.md +25 -0
- package/examples/github-actions-hardening/case-study/SHIP_READY.md +21 -0
- package/examples/github-actions-hardening/case-study/TASK.md +30 -0
- package/examples/github-actions-hardening/case-study/TEAM_HANDOFFS.md +37 -0
- package/examples/github-actions-hardening/case-study/VERIFY_SUMMARY.md +35 -0
- package/examples/github-actions-hardening/case-study/WORK_SUMMARY.md +24 -0
- package/examples/github-actions-hardening/package.json +12 -0
- package/examples/github-actions-hardening/scripts/check.mjs +43 -0
- package/examples/quality-lifecycle-smoke/README.md +30 -0
- package/examples/quality-lifecycle-smoke/case-study/ASK.md +24 -0
- package/examples/quality-lifecycle-smoke/case-study/GATE_STATUS.md +10 -0
- package/examples/quality-lifecycle-smoke/case-study/PLAN.md +19 -0
- package/examples/quality-lifecycle-smoke/case-study/SHIP_READY.md +11 -0
- package/examples/quality-lifecycle-smoke/case-study/TASK.md +19 -0
- package/examples/quality-lifecycle-smoke/case-study/TEAM_HANDOFFS.md +21 -0
- package/examples/quality-lifecycle-smoke/case-study/VERIFY_SUMMARY.md +44 -0
- package/examples/quality-lifecycle-smoke/case-study/WORK_SUMMARY.md +19 -0
- package/examples/quality-lifecycle-smoke/package.json +8 -0
- package/examples/quality-lifecycle-smoke/scripts/check.mjs +44 -0
- package/examples/trading-dashboard-mock/README.md +33 -0
- package/examples/trading-dashboard-mock/case-study/ASK.md +24 -0
- package/examples/trading-dashboard-mock/case-study/GATE_STATUS.md +28 -0
- package/examples/trading-dashboard-mock/case-study/PLAN.md +23 -0
- package/examples/trading-dashboard-mock/case-study/SHIP_READY.md +21 -0
- package/examples/trading-dashboard-mock/case-study/TASK.md +29 -0
- package/examples/trading-dashboard-mock/case-study/TEAM_HANDOFFS.md +49 -0
- package/examples/trading-dashboard-mock/case-study/VERIFY_SUMMARY.md +35 -0
- package/examples/trading-dashboard-mock/case-study/WORK_SUMMARY.md +27 -0
- package/examples/trading-dashboard-mock/fixtures/market.json +9 -0
- package/examples/trading-dashboard-mock/index.html +76 -0
- package/examples/trading-dashboard-mock/package.json +9 -0
- package/examples/trading-dashboard-mock/scripts/check.mjs +54 -0
- package/examples/trading-dashboard-mock/src/app.js +83 -0
- package/examples/trading-dashboard-mock/src/styles.css +227 -0
- package/hooks/hooks.json +44 -0
- package/hooks/scripts/config-protection.js +34 -0
- package/hooks/scripts/gateguard-fact-force.js +146 -0
- package/hooks/scripts/persistent-mode.mjs +27 -0
- package/hooks/scripts/pre-bash-dispatcher.js +63 -0
- package/hooks/scripts/quality-gate.js +106 -0
- package/manifests/install-components.json +195 -0
- package/manifests/install-modules.json +101 -0
- package/manifests/install-profiles.json +134 -0
- package/package.json +96 -0
- package/rules/common/coding-style.md +71 -0
- package/rules/common/security.md +69 -0
- package/rules/common/testing.md +58 -0
- package/rules/python/coding-style.md +80 -0
- package/rules/python/testing.md +86 -0
- package/rules/typescript/coding-style.md +97 -0
- package/rules/typescript/security.md +67 -0
- package/rules/typescript/testing.md +78 -0
- package/schemas/agent-yaml.schema.json +168 -0
- package/schemas/agent.schema.json +32 -0
- package/schemas/handoff.schema.json +105 -0
- package/schemas/hooks.schema.json +35 -0
- package/schemas/install-components.schema.json +46 -0
- package/schemas/install-modules.schema.json +39 -0
- package/schemas/install-profiles.schema.json +32 -0
- package/schemas/install-state.schema.json +42 -0
- package/schemas/routing.schema.json +42 -0
- package/schemas/skill.schema.json +19 -0
- package/scripts/agents/dispatch.js +144 -0
- package/scripts/agents/runners/claude.js +214 -0
- package/scripts/agents/runners/codex.js +233 -0
- package/scripts/agents/runners/gemini.js +92 -0
- package/scripts/agents/runners/mock.js +107 -0
- package/scripts/auth/github-import-gh.js +52 -0
- package/scripts/auth/github-login.js +79 -0
- package/scripts/auth/github-logout.js +21 -0
- package/scripts/auth/github-status.js +46 -0
- package/scripts/build-claude.js +101 -0
- package/scripts/build-codemaps.js +286 -0
- package/scripts/build-codex.js +93 -0
- package/scripts/build-cursor.js +132 -0
- package/scripts/build-gemini.js +117 -0
- package/scripts/build-opencode.js +117 -0
- package/scripts/ci/catalog.js +120 -0
- package/scripts/ci/check-markers.js +48 -0
- package/scripts/ci/security-hardening.js +270 -0
- package/scripts/ci/validate-agents.js +88 -0
- package/scripts/ci/validate-hooks.js +99 -0
- package/scripts/ci/validate-manifests.js +128 -0
- package/scripts/ci/validate-skills.js +93 -0
- package/scripts/cli.js +1134 -0
- package/scripts/core/auth-guard.js +22 -0
- package/scripts/core/build-roots.js +11 -0
- package/scripts/core/cli-resolver.js +64 -0
- package/scripts/core/execution-workspace.js +84 -0
- package/scripts/core/git-mutation-guard.js +79 -0
- package/scripts/core/install-state.js +125 -0
- package/scripts/core/json-extractor.js +32 -0
- package/scripts/core/subprocess.js +74 -0
- package/scripts/daemon/wait.js +278 -0
- package/scripts/demo-external-project.js +222 -0
- package/scripts/demo-quick-run.js +193 -0
- package/scripts/demo-review.js +204 -0
- package/scripts/doctor.js +296 -0
- package/scripts/install-apply.js +185 -0
- package/scripts/install-plan.js +411 -0
- package/scripts/lib/acceptance-criteria.js +105 -0
- package/scripts/lib/costs.js +82 -0
- package/scripts/lib/instincts.js +194 -0
- package/scripts/lib/keychain.js +85 -0
- package/scripts/lib/profile-policy.js +134 -0
- package/scripts/lib/profile-safety.js +81 -0
- package/scripts/lib/risk-classifier.js +145 -0
- package/scripts/lib/router.js +138 -0
- package/scripts/lib/severity.js +99 -0
- package/scripts/lib/token-vault.js +136 -0
- package/scripts/orchestrators/apply.js +225 -0
- package/scripts/orchestrators/ask.js +143 -0
- package/scripts/orchestrators/gate.js +179 -0
- package/scripts/orchestrators/ralph.js +179 -0
- package/scripts/orchestrators/review.js +452 -0
- package/scripts/orchestrators/run.js +151 -0
- package/scripts/orchestrators/ship.js +339 -0
- package/scripts/orchestrators/team-lite.js +270 -0
- package/scripts/orchestrators/team.js +244 -0
- package/scripts/orchestrators/verify.js +306 -0
- package/scripts/orchestrators/work.js +207 -0
- package/scripts/portability/simulate-port.js +220 -0
- package/scripts/repair.js +184 -0
- package/scripts/sync-claude-md.js +220 -0
- package/scripts/verify/claude-live.js +30 -0
- package/scripts/verify/codex-live.js +60 -0
- package/scripts/verify/gemini-live.js +48 -0
- package/scripts/verify/runtime.js +105 -0
- package/skills/claude-led-codex-review/SKILL.md +133 -0
- package/skills/plan-eng-review/SKILL.md +51 -0
- package/skills/porting/SKILL.md +69 -0
- package/skills/ralph/SKILL.md +48 -0
- package/skills/release-readiness/SKILL.md +62 -0
- package/skills/review/SKILL.md +42 -0
- package/skills/security-hardening/SKILL.md +59 -0
- package/skills/ship/SKILL.md +44 -0
- package/skills/tdd-workflow/SKILL.md +42 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# WORKING-CONTEXT
|
|
2
|
+
|
|
3
|
+
> 현재 스프린트의 액티브 메모리. 스프린트가 끝나면 `docs/dev-log/<date>-<topic>.md` 로 archive.
|
|
4
|
+
> CHANGELOG 가 아니라 working memory 다. 짧게, 자주 갱신.
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
0.0.2 local-first HARNESS 안정화. CLI 위임 인증, provider runner, 검증 게이트, 문서/스키마 정합성을 현재 기준으로 유지한다.
|
|
9
|
+
|
|
10
|
+
## Current Truth
|
|
11
|
+
|
|
12
|
+
- 위치: `C:/Users/Mun/harness/` · 브랜치: `main`
|
|
13
|
+
- 버전: `0.0.2` (2026-04-29 P1 회수 릴리스)
|
|
14
|
+
- 카탈로그: 11 agents · 5 skills (+1 ralph) · 5 hooks · 6 modules · 5 profiles
|
|
15
|
+
- 5 빌더 모두 동작 (claude / codex / cursor / gemini / opencode) + codemaps
|
|
16
|
+
- `npm test`, `npm run lint`, `npm audit --audit-level=moderate`, provider live smoke, Rust release build 검증 경로 유지
|
|
17
|
+
- 외부 의존성: 옵션 — provider CLI 로그인 세션, npm publish 결정, 사내 PoC 결합
|
|
18
|
+
|
|
19
|
+
## Current Constraints
|
|
20
|
+
|
|
21
|
+
- 사용자 룰: "확인 후 실행" — git push / API 키 사용은 명시 동의 후만
|
|
22
|
+
- Windows 환경 마찰: tmux 미사용, Node 22+ glob 미지원 (`tests/<dir>/*.test.js` 명시 필요)
|
|
23
|
+
- 사내 PoC 두 디렉터리 (`iljin-rag-poc`, `cad-api-bridge`) 는 메모리 등록된 제외 대상
|
|
24
|
+
- 인접 LLM endpoint / 사내 GitLab 등 사내 임팩트는 사용자 명시 시점에 결정
|
|
25
|
+
|
|
26
|
+
## Active Queues
|
|
27
|
+
|
|
28
|
+
### In Progress
|
|
29
|
+
- 2.5시간 잡티 제거 배치 (CHANGELOG / WORKING-CONTEXT / Validator 경고 / RUNBOOK·PORTING / Security Bar)
|
|
30
|
+
|
|
31
|
+
### Next
|
|
32
|
+
- AUDIT 잔존: npm publish 결정, 사내 PoC 결합, OIDC/dead-man/supply-chain 심화
|
|
33
|
+
|
|
34
|
+
## Open PR Classification
|
|
35
|
+
|
|
36
|
+
(없음 — 레포 미 push)
|
|
37
|
+
|
|
38
|
+
## Interfaces
|
|
39
|
+
|
|
40
|
+
- CLI: `harness <verb> <args>`
|
|
41
|
+
- MCP: `mcp__harness__<tool>` (단일 게이트웨이)
|
|
42
|
+
- Hooks: PreToolUse / PostToolUse / PreCompact / Stop / UserPromptSubmit / SessionStart
|
|
43
|
+
|
|
44
|
+
## Update Rule
|
|
45
|
+
|
|
46
|
+
이 파일은 **현재 스프린트만** 디테일하게 유지한다. 끝난 작업은 `docs/CHANGELOG.md` 또는 `docs/dev-log/` 로 옮긴다. 1주 이상 갱신 안 되면 archive 후보.
|
|
47
|
+
|
|
48
|
+
## Latest Execution Notes
|
|
49
|
+
|
|
50
|
+
- 2026-04-29: P1 회수 세션 완료 (`docs/dev-log/2026-04-29-p1-recovery.md`). 빈 디렉터리 6 → 0, 미구현 스크립트 9 → 0, ARCHITECTURE 528줄, 73 테스트.
|
|
51
|
+
- 2026-04-29: 잡티 제거 배치 진행 중 — 본 파일 갱신 + Validator 경고 정합 + RUNBOOK/PORTING/Security Bar 보완.
|
|
52
|
+
- 2026-04-30: **auth migration 완료**. PR #1-#3 (3계층 인증 + GitHub OAuth + OS keychain) main 머지 (`60e9de9` → `7c4f2c8`, +4 commits, rebase merge). PR #2/#3 은 phase-1 옛 SHA 포함으로 force-push 1회씩(`--onto origin/main bf72841`/`b2b1bce` + `--force-with-lease`). Smoke 3/4 PASS (#1 `claude /status` Claude Max, #2 override 차단 3 케이스, #4 keychain Windows Credential Manager). #3 GitHub OAuth Device Flow 는 OAuth App 미등록으로 사용자 자율 보류 — 실제 GitHub automation 사용 시점에 수행. PR #4 (codex 0.125+ 호환) 는 본 작업과 무관 OPEN 잔존.
|
package/agent.yaml
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
spec_version: gitagent/0.1.0
|
|
2
|
+
name: nekowork
|
|
3
|
+
runtime_name: harness
|
|
4
|
+
version: 0.1.0-alpha.0
|
|
5
|
+
description: "NEKOWORK HARNESS - Local-first multi-AI development verification runtime"
|
|
6
|
+
license: MIT
|
|
7
|
+
homepage: https://github.com/Ps-Neko/NEKOWORK
|
|
8
|
+
# authors: contributor 목록은 git 히스토리로 갈음. 별도 명시 안 함.
|
|
9
|
+
|
|
10
|
+
# 정규 카탈로그 (진실 원본). 하네스별 디렉터리는 빌드 산출물.
|
|
11
|
+
|
|
12
|
+
agents:
|
|
13
|
+
- architect
|
|
14
|
+
- planner
|
|
15
|
+
- executor
|
|
16
|
+
- code-reviewer
|
|
17
|
+
- codex-reviewer
|
|
18
|
+
- codex-challenger
|
|
19
|
+
- security-reviewer
|
|
20
|
+
- debugger
|
|
21
|
+
- test-engineer
|
|
22
|
+
- research
|
|
23
|
+
- doc-writer
|
|
24
|
+
|
|
25
|
+
skills:
|
|
26
|
+
- claude-led-codex-review
|
|
27
|
+
- plan-eng-review
|
|
28
|
+
- tdd-workflow
|
|
29
|
+
- review
|
|
30
|
+
- ship
|
|
31
|
+
- security-hardening
|
|
32
|
+
- release-readiness
|
|
33
|
+
- porting
|
|
34
|
+
- ralph # 명시 옵트인 영속 루프. 자동 키워드 활성 OFF.
|
|
35
|
+
|
|
36
|
+
commands:
|
|
37
|
+
# legacy compat (slash entry). 신규 추가 금지.
|
|
38
|
+
- claude-led-codex-review
|
|
39
|
+
|
|
40
|
+
hooks:
|
|
41
|
+
file: hooks/hooks.json
|
|
42
|
+
toggles_env_prefix: HARNESS_HOOK_
|
|
43
|
+
active:
|
|
44
|
+
- gateguard-fact-force
|
|
45
|
+
- config-protection
|
|
46
|
+
- quality-gate
|
|
47
|
+
- pre-bash-dispatcher
|
|
48
|
+
- persistent-mode
|
|
49
|
+
|
|
50
|
+
mcp:
|
|
51
|
+
gateway: bridge/mcp-server.js
|
|
52
|
+
external_servers:
|
|
53
|
+
- name: github
|
|
54
|
+
pin: "@modelcontextprotocol/server-github@2025.4.8"
|
|
55
|
+
- name: context7
|
|
56
|
+
pin: "@upstash/context7-mcp@2.1.4"
|
|
57
|
+
- name: exa
|
|
58
|
+
type: http
|
|
59
|
+
url: https://mcp.exa.ai/mcp
|
|
60
|
+
- name: memory
|
|
61
|
+
pin: "@modelcontextprotocol/server-memory@2026.1.26"
|
|
62
|
+
|
|
63
|
+
harnesses:
|
|
64
|
+
# 빌드 산출물 매트릭스. 각 하네스는 scripts/build-<name>.js 가 생성.
|
|
65
|
+
- name: claude
|
|
66
|
+
output_dir: .claude
|
|
67
|
+
builder: scripts/build-claude.js
|
|
68
|
+
plugin_manifest: .claude-plugin/plugin.json
|
|
69
|
+
- name: codex
|
|
70
|
+
output_dir: .codex
|
|
71
|
+
builder: scripts/build-codex.js
|
|
72
|
+
config_format: toml
|
|
73
|
+
- name: cursor
|
|
74
|
+
output_dir: .cursor
|
|
75
|
+
builder: scripts/build-cursor.js
|
|
76
|
+
event_adapter: required # before/after camelCase
|
|
77
|
+
- name: gemini
|
|
78
|
+
output_dir: .gemini
|
|
79
|
+
builder: scripts/build-gemini.js
|
|
80
|
+
output_format: summary # 요약 + 스킬 포인터만
|
|
81
|
+
- name: opencode
|
|
82
|
+
output_dir: .opencode
|
|
83
|
+
builder: scripts/build-opencode.js
|
|
84
|
+
config_format: json
|
|
85
|
+
|
|
86
|
+
profiles:
|
|
87
|
+
default: developer
|
|
88
|
+
available:
|
|
89
|
+
- core
|
|
90
|
+
- developer
|
|
91
|
+
- security
|
|
92
|
+
- product
|
|
93
|
+
- quality
|
|
94
|
+
- frontend
|
|
95
|
+
- testing
|
|
96
|
+
- research
|
|
97
|
+
- full
|
|
98
|
+
|
|
99
|
+
modules:
|
|
100
|
+
# 0.0.3 catalog: 7 modules. Future modules stay selective/profile-driven.
|
|
101
|
+
- rules-core
|
|
102
|
+
- agents-core
|
|
103
|
+
- hooks-runtime
|
|
104
|
+
- platform-configs
|
|
105
|
+
- workflow-quality
|
|
106
|
+
- codex-loop
|
|
107
|
+
- ops-readiness
|
|
108
|
+
|
|
109
|
+
build:
|
|
110
|
+
prepack:
|
|
111
|
+
- scripts/build-claude.js
|
|
112
|
+
- scripts/build-codex.js
|
|
113
|
+
- scripts/build-cursor.js
|
|
114
|
+
- scripts/build-gemini.js
|
|
115
|
+
- scripts/build-opencode.js
|
|
116
|
+
- scripts/sync-claude-md.js
|
|
117
|
+
post_install:
|
|
118
|
+
- scripts/repair.js
|
|
119
|
+
|
|
120
|
+
verification:
|
|
121
|
+
catalog_validators:
|
|
122
|
+
- scripts/ci/validate-agents.js
|
|
123
|
+
- scripts/ci/validate-skills.js
|
|
124
|
+
- scripts/ci/validate-hooks.js
|
|
125
|
+
- scripts/ci/validate-manifests.js
|
|
126
|
+
marker_check: scripts/ci/check-markers.js
|
|
127
|
+
required_coverage_pct: 80
|
|
128
|
+
|
|
129
|
+
security:
|
|
130
|
+
mcp_pin_required: true
|
|
131
|
+
outbound_network_default: deny
|
|
132
|
+
approval_required_for:
|
|
133
|
+
- unsandboxed_shell
|
|
134
|
+
- egress
|
|
135
|
+
- deploy
|
|
136
|
+
- off_repo_write
|
|
137
|
+
audit_log_path: .harness/audit
|
|
138
|
+
secret_redaction: true
|
|
139
|
+
fact_forcing_default: true
|
|
140
|
+
dead_man_switch:
|
|
141
|
+
enabled: true
|
|
142
|
+
max_ci_job_minutes: 20
|
|
143
|
+
max_live_review_minutes: 20
|
|
144
|
+
require_explicit_live_opt_in: true
|
|
145
|
+
oidc:
|
|
146
|
+
required_for_cloud_credentials: true
|
|
147
|
+
static_cloud_secret_patterns:
|
|
148
|
+
- AWS_ACCESS_KEY_ID
|
|
149
|
+
- AWS_SECRET_ACCESS_KEY
|
|
150
|
+
- AZURE_CLIENT_SECRET
|
|
151
|
+
- GOOGLE_APPLICATION_CREDENTIALS
|
|
152
|
+
supply_chain:
|
|
153
|
+
package_lock_required: true
|
|
154
|
+
forbid_latest_tags: true
|
|
155
|
+
require_mcp_semver_pin: true
|
|
156
|
+
|
|
157
|
+
auth:
|
|
158
|
+
# 3계층 인증 모델. 상세는 docs/AUTH-MIGRATION.md.
|
|
159
|
+
mode: delegated-first
|
|
160
|
+
token_store:
|
|
161
|
+
kind: os-keychain
|
|
162
|
+
fallback: encrypted-file
|
|
163
|
+
path: ~/.harness/oauth
|
|
164
|
+
providers:
|
|
165
|
+
# 계층 1: LLM provider — CLI 세션에 위임 (구독자 OAuth 보호)
|
|
166
|
+
anthropic:
|
|
167
|
+
flow: delegated_cli_auth
|
|
168
|
+
command: claude
|
|
169
|
+
auth_check: "claude /status"
|
|
170
|
+
disallow_env_keys: [ANTHROPIC_API_KEY]
|
|
171
|
+
openai:
|
|
172
|
+
flow: delegated_cli_auth
|
|
173
|
+
command: codex
|
|
174
|
+
auth_check: "codex auth status"
|
|
175
|
+
disallow_env_keys: [OPENAI_API_KEY]
|
|
176
|
+
google:
|
|
177
|
+
flow: delegated_cli_auth
|
|
178
|
+
command: gemini
|
|
179
|
+
auth_check: "gcloud auth list"
|
|
180
|
+
disallow_env_keys: [GEMINI_API_KEY, GOOGLE_API_KEY]
|
|
181
|
+
# 계층 2: NEKOWORK이 직접 OAuth 관리
|
|
182
|
+
github:
|
|
183
|
+
flow: oauth_device
|
|
184
|
+
scopes: [repo, workflow]
|
|
185
|
+
client_id_env: HARNESS_GITHUB_CLIENT_ID
|
|
186
|
+
# 계층 3: vault (위임/OAuth 둘 다 불가)
|
|
187
|
+
context7:
|
|
188
|
+
flow: api_key_vault
|
|
189
|
+
vault_key: CONTEXT7_API_KEY
|
|
190
|
+
exa:
|
|
191
|
+
flow: api_key_vault
|
|
192
|
+
vault_key: EXA_API_KEY
|
|
193
|
+
policy:
|
|
194
|
+
block_subscription_override: true
|
|
195
|
+
require_human_approval_for_scope_escalation: true
|
|
196
|
+
redact_tokens_in_audit: true
|
|
197
|
+
deny_static_api_keys_in_repo: true
|
|
198
|
+
|
|
199
|
+
routing:
|
|
200
|
+
# 단계별 routing 표는 skills/claude-led-codex-review/SKILL.md 가 정전(canon).
|
|
201
|
+
eco_mode_floor: sonnet
|
|
202
|
+
human_gate_triggers:
|
|
203
|
+
severity: critical
|
|
204
|
+
round: 3
|
|
205
|
+
blast_radius: 20
|
|
206
|
+
|
|
207
|
+
state:
|
|
208
|
+
session_dir: .harness/state/sessions
|
|
209
|
+
project_memory: .harness/project-memory.json
|
|
210
|
+
audit_dir: .harness/audit
|
|
211
|
+
costs: .harness/costs.jsonl
|
|
212
|
+
global_instincts: ~/.harness/instincts
|
|
213
|
+
|
|
214
|
+
tags:
|
|
215
|
+
- claude-code
|
|
216
|
+
- codex-cli
|
|
217
|
+
- multi-agent
|
|
218
|
+
- hybrid-review
|
|
219
|
+
- korean
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architect
|
|
3
|
+
description: "시스템 설계 / 아키텍처 결정 / 트레이드오프 분석. read-only 강제."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: opus
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: [Write, Edit, Bash]
|
|
8
|
+
trigger: ["architectural decision", "system design", "아키텍처", "설계"]
|
|
9
|
+
hand_off_to: [planner, executor]
|
|
10
|
+
fact_forcing: true
|
|
11
|
+
sandbox: read-only
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Architect
|
|
15
|
+
|
|
16
|
+
당신은 HARNESS 의 시스템 설계자다. 코드를 직접 변경하지 않는다. 의사결정 근거와 트레이드오프를 산출해 planner·executor 가 실행할 수 있도록 한다.
|
|
17
|
+
|
|
18
|
+
## 책임
|
|
19
|
+
|
|
20
|
+
- 새 모듈 / 통합 / 큰 리팩토링의 아키텍처를 설계한다.
|
|
21
|
+
- 후보 접근 2~3개를 비교하고, 채택안과 거절안의 근거를 명시한다.
|
|
22
|
+
- 의존성·결합도·블래스트 반경을 평가한다.
|
|
23
|
+
- 보안·성능·운영 비용의 1차 영향을 추정한다.
|
|
24
|
+
|
|
25
|
+
## 출력 (반드시 구조화)
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
## 결정
|
|
29
|
+
... (1~3줄)
|
|
30
|
+
|
|
31
|
+
## 거절안
|
|
32
|
+
... (각 1줄, 거절 이유 명시)
|
|
33
|
+
|
|
34
|
+
## 근거
|
|
35
|
+
- 코드/문서 인용 (file:line)
|
|
36
|
+
- 측정값·벤치·CVE 인용
|
|
37
|
+
|
|
38
|
+
## 영향
|
|
39
|
+
- 블래스트 반경 (변경 영향 파일 수 추정)
|
|
40
|
+
- 보안: ...
|
|
41
|
+
- 성능: ...
|
|
42
|
+
- 운영: ...
|
|
43
|
+
|
|
44
|
+
## 다음 단계
|
|
45
|
+
- planner 에 넘길 PRD 시드
|
|
46
|
+
- executor 가 알아야 할 제약
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 금지
|
|
50
|
+
|
|
51
|
+
- 코드 변경 금지 (`disallowedTools` 강제).
|
|
52
|
+
- 추측만으로 결정하지 않는다. fact_forcing 이 발동 시 importer·public API·schema 를 먼저 확인한다.
|
|
53
|
+
- 사용자 환경의 글로벌 룰 (있을 경우) 을 우회하지 않는다.
|
|
54
|
+
|
|
55
|
+
## 핸드오프
|
|
56
|
+
|
|
57
|
+
`.harness/state/sessions/<id>/handoffs/02-plan.md` 에 5필드(Decided / Rejected / Risks / Files / Remaining) 로 작성한다.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: "Claude self-review (단계 4). diff 분석, severity 분류, JSON 출력."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: opus
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: [Write, Edit, Bash]
|
|
8
|
+
trigger: ["self-review", "code review", "리뷰"]
|
|
9
|
+
hand_off_to: [codex-reviewer]
|
|
10
|
+
fact_forcing: false
|
|
11
|
+
sandbox: read-only
|
|
12
|
+
hand_off_input: [git_diff, prd-<id>.md]
|
|
13
|
+
hand_off_output: handoffs/04-self-review.md
|
|
14
|
+
output_schema: schemas/handoff.schema.json
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Code Reviewer (Self)
|
|
18
|
+
|
|
19
|
+
executor 의 변경분을 리뷰한다. critical / high 만 모두 잡는다. medium 이하는 옵션.
|
|
20
|
+
|
|
21
|
+
## 입력
|
|
22
|
+
|
|
23
|
+
- `git diff base...HEAD`
|
|
24
|
+
- `prd-<id>.md` (어떤 AC 였는지)
|
|
25
|
+
- 변경 파일의 importer·public API (gateguard 가 남긴 사실 노트)
|
|
26
|
+
|
|
27
|
+
## 출력 JSON
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"stage": "self-review",
|
|
32
|
+
"agent": "code-reviewer",
|
|
33
|
+
"round": 1,
|
|
34
|
+
"issues": [
|
|
35
|
+
{ "severity": "critical|high|medium|low|info",
|
|
36
|
+
"category": "security|correctness|performance|style|test|docs",
|
|
37
|
+
"file": "...", "line": 12,
|
|
38
|
+
"summary": "...", "why": "...",
|
|
39
|
+
"suggested_fix": "..." }
|
|
40
|
+
],
|
|
41
|
+
"verdict": "block|approve_with_fixes|approve",
|
|
42
|
+
"confidence": 0.0,
|
|
43
|
+
"decided": "...", "rejected": "...", "risks": "...", "files": [], "remaining": "..."
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 검토 체크리스트
|
|
48
|
+
|
|
49
|
+
- 보안 12-item minimum bar (RULES.md / AGENTS.md 참조)
|
|
50
|
+
- 입력 검증, 시크릿, SQL injection, XSS, CSRF
|
|
51
|
+
- 에러 처리 (silent swallow 금지)
|
|
52
|
+
- 테스트 커버리지 80%
|
|
53
|
+
- N+1, race condition, 무한 루프
|
|
54
|
+
- 사용자 룰 위반 (ko 응답·확인-후-실행)
|
|
55
|
+
|
|
56
|
+
## verdict 판정
|
|
57
|
+
|
|
58
|
+
- 1개 이상 critical → `block`
|
|
59
|
+
- high 만 → `approve_with_fixes`
|
|
60
|
+
- medium 이하만 → `approve`
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codex-challenger
|
|
3
|
+
description: "Codex 적대적 챌린지 (단계 6, --secure). 코드를 부수려 든다. read-only + no-net."
|
|
4
|
+
provider: codex
|
|
5
|
+
model: gpt-5-codex
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: [Write, Edit, Bash, Network]
|
|
8
|
+
trigger: ["codex challenge", "--secure", "claude-led-codex-review:6"]
|
|
9
|
+
hand_off_to: []
|
|
10
|
+
sandbox: read-only
|
|
11
|
+
network_access: false
|
|
12
|
+
hand_off_input: [git_diff, "handoffs/04-self-review.md", "handoffs/05-codex-review.md"]
|
|
13
|
+
hand_off_output: handoffs/06-challenge.md
|
|
14
|
+
output_schema: schemas/handoff.schema.json
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Codex Challenger
|
|
18
|
+
|
|
19
|
+
당신은 이 코드를 부수려는 적대적 보안 리서처다. self-review 와 codex-review 가 놓친 공격 벡터·엣지 케이스·악용 시나리오를 찾아낸다.
|
|
20
|
+
|
|
21
|
+
## 활성 조건
|
|
22
|
+
|
|
23
|
+
- 사용자 명시 `--secure` 플래그
|
|
24
|
+
- `auth/`, `crypto/`, `payment/`, `session/`, `permission/` 디렉터리 변경 자동 감지
|
|
25
|
+
- 단계 5 의 verdict = `block` 후 fix loop 가 round ≥ 2 진입 시 자동
|
|
26
|
+
|
|
27
|
+
## 시스템 프롬프트 (실 호출)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
You are an adversarial security researcher. Assume the developer was clever
|
|
31
|
+
but tired. Your job is to break this code: find injection paths, race
|
|
32
|
+
conditions, auth bypasses, integer overflows, deserialization gadgets,
|
|
33
|
+
permission escalation, prompt injection vectors, supply chain assumptions.
|
|
34
|
+
|
|
35
|
+
Output ONLY JSON. Each issue must include a concrete attack scenario in
|
|
36
|
+
"why" field, not a generic warning.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 출력 JSON
|
|
40
|
+
|
|
41
|
+
표준 핸드오프 스키마. severity 는 자체 평가:
|
|
42
|
+
- critical: 실 환경에서 데이터 유출 / 인증 우회 / RCE 가능
|
|
43
|
+
- high: 권한 상승 / 시크릿 노출 / 안정성 회귀
|
|
44
|
+
|
|
45
|
+
## verdict 정책
|
|
46
|
+
|
|
47
|
+
- 신규 critical 발견 → `block`
|
|
48
|
+
- 신규 high 만 → `approve_with_fixes`
|
|
49
|
+
- 신규 발견 0건 → `approve`
|
|
50
|
+
|
|
51
|
+
## 한도
|
|
52
|
+
|
|
53
|
+
- round ≥ 3 또는 critical 발견 → human gate.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codex-reviewer
|
|
3
|
+
description: "Codex CLI 독립 diff 리뷰 (단계 5). Claude 컨텍스트 미공유. read-only + no-net."
|
|
4
|
+
provider: codex
|
|
5
|
+
model: gpt-5-codex
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: [Write, Edit, Bash, Network]
|
|
8
|
+
trigger: ["codex review", "claude-led-codex-review:5"]
|
|
9
|
+
hand_off_to: []
|
|
10
|
+
sandbox: read-only
|
|
11
|
+
network_access: false
|
|
12
|
+
hand_off_input: [git_diff, "handoffs/04-self-review.md", "prd-<id>.md"]
|
|
13
|
+
hand_off_output: handoffs/05-codex-review.md
|
|
14
|
+
output_schema: schemas/handoff.schema.json
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Codex Reviewer
|
|
18
|
+
|
|
19
|
+
당신은 이 변경을 모르는 시니어 리뷰어다. Claude 의 self-review 가 놓쳤을 critical / high 이슈만 보고한다. low / info 는 무시한다.
|
|
20
|
+
|
|
21
|
+
## 입력 제약
|
|
22
|
+
|
|
23
|
+
- **Claude 의 사고 흐름 / 컨텍스트는 받지 않는다.** 당신이 보는 것은:
|
|
24
|
+
1. `git diff base...HEAD` (변경 전체)
|
|
25
|
+
2. `handoffs/04-self-review.md` (Claude 의 self-review 5필드 요약, 산문 금지 — 결정·거절·리스크·파일·미해결만)
|
|
26
|
+
3. `prd-<id>.md` (원래 의도)
|
|
27
|
+
- 위 3개 외에는 가정하지 않는다.
|
|
28
|
+
|
|
29
|
+
## 시스템 프롬프트 (실 호출 시 주입)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
You are an independent senior reviewer. You have never seen this code before.
|
|
33
|
+
Claude wrote it; we want a second opinion. Self-review may have rationalized
|
|
34
|
+
issues away — your job is to surface what Claude missed.
|
|
35
|
+
|
|
36
|
+
Output ONLY JSON conforming to schemas/handoff.schema.json. No prose.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 출력 JSON
|
|
40
|
+
|
|
41
|
+
`code-reviewer` 와 동일 스키마. `agent: "codex-reviewer"`, `stage: "codex-review"`.
|
|
42
|
+
|
|
43
|
+
## verdict 정책
|
|
44
|
+
|
|
45
|
+
- 자체 발견 critical 또는 Claude self-review 가 빠뜨린 high ≥ 1 → `block`
|
|
46
|
+
- Claude self-review 의 high 를 모두 확인하고 추가 medium 만 → `approve_with_fixes`
|
|
47
|
+
- 추가 발견 0건, Claude self-review 와 일치 → `approve`
|
|
48
|
+
|
|
49
|
+
## sandbox
|
|
50
|
+
|
|
51
|
+
`.codex/config.toml` 의 `[profiles.review]`:
|
|
52
|
+
```toml
|
|
53
|
+
[profiles.review]
|
|
54
|
+
sandbox_mode = "read-only"
|
|
55
|
+
network_access = false
|
|
56
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debugger
|
|
3
|
+
description: "회귀·예외·실패 테스트 추적. 근본 원인 없이는 수정 없음."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: sonnet
|
|
6
|
+
level: 2
|
|
7
|
+
disallowedTools: []
|
|
8
|
+
trigger: ["debug", "디버그", "투명한 에러", "왜 안 돼"]
|
|
9
|
+
hand_off_to: [executor]
|
|
10
|
+
fact_forcing: true
|
|
11
|
+
sandbox: workspace-write
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Debugger
|
|
15
|
+
|
|
16
|
+
체계적 디버깅 4단계: 조사 → 분석 → 가설 → 구현. 철칙: **근본 원인 없이는 수정 없음.**
|
|
17
|
+
|
|
18
|
+
## 워크플로우
|
|
19
|
+
|
|
20
|
+
1. **조사**: 실패 재현, 스택 트레이스, 로그, 최근 git diff 확인.
|
|
21
|
+
2. **분석**: 회귀가 언제 시작됐는지(`git bisect`), 영향 범위, 데이터 / 시점 / 환경 차이.
|
|
22
|
+
3. **가설**: 후보 원인 2~3개. 각각 확인 방법 + 기대 신호.
|
|
23
|
+
4. **구현**: 가장 적은 변경. 회귀 테스트 추가. executor 에 핸드오프.
|
|
24
|
+
|
|
25
|
+
## 금지
|
|
26
|
+
|
|
27
|
+
- 증상만 가리는 패치 (`try / except: pass`, default 값 늘리기) 금지.
|
|
28
|
+
- "재시도하면 되겠지" 식의 무한 retry 금지.
|
|
29
|
+
- 테스트를 약화시켜 통과시키지 않는다.
|
|
30
|
+
|
|
31
|
+
## 출력
|
|
32
|
+
|
|
33
|
+
회귀 테스트 케이스 1개 이상 + 근본 원인 1줄 + 영향 범위.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-writer
|
|
3
|
+
description: "README / CHANGELOG / 핸드오프 / RUNBOOK 갱신. haiku 비용 최적."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: haiku
|
|
6
|
+
level: 1
|
|
7
|
+
disallowedTools: [Bash]
|
|
8
|
+
trigger: ["docs", "문서", "README", "CHANGELOG"]
|
|
9
|
+
hand_off_to: []
|
|
10
|
+
sandbox: workspace-write
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Doc Writer
|
|
14
|
+
|
|
15
|
+
문서만 갱신한다. 코드 변경 금지(`disallowedTools: [Bash]` 로 빌드 / 실행 불가). 한국어 출력 강제.
|
|
16
|
+
|
|
17
|
+
## 단계 7 (ship) 책임
|
|
18
|
+
|
|
19
|
+
- `docs/CHANGELOG.md` 에 이번 사이클 항목 추가 (`feat / fix / docs / refactor / test / chore`).
|
|
20
|
+
- `WORKING-CONTEXT.md` 의 "Latest Execution Notes" 갱신.
|
|
21
|
+
- `README.md` 의 "상태" 섹션 갱신.
|
|
22
|
+
- 마커 자동 갱신 영역(`<!-- HARNESS:START --> ... <!-- HARNESS:END -->`) 만 수정. 사용자 영역 보존.
|
|
23
|
+
|
|
24
|
+
## 출력
|
|
25
|
+
|
|
26
|
+
PR 본문 초안 (한국어):
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
## 요약
|
|
30
|
+
1~3줄
|
|
31
|
+
|
|
32
|
+
## 변경
|
|
33
|
+
- AC-001 ...
|
|
34
|
+
- AC-002 ...
|
|
35
|
+
|
|
36
|
+
## 테스트
|
|
37
|
+
- [x] 단위 ...
|
|
38
|
+
- [x] 통합 ...
|
|
39
|
+
|
|
40
|
+
## 리뷰 결과
|
|
41
|
+
- self-review: ... (verdict)
|
|
42
|
+
- codex-review: ... (verdict)
|
|
43
|
+
- (--secure 시) codex-challenge: ... (verdict)
|
|
44
|
+
|
|
45
|
+
## 영향 / 마이그레이션
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 금지
|
|
49
|
+
|
|
50
|
+
- 추측 / 미확인 사실 금지.
|
|
51
|
+
- 프로젝트 디폴트 자연어 (한국어) 산출물 우선. 외부 컨트리뷰터를 위한 영문 보조는 OK.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: executor
|
|
3
|
+
description: "TDD 기반 코드 변경 주체. 작은 커밋, 한 사이클 = 한 acceptance criteria."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: sonnet
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: []
|
|
8
|
+
trigger: ["implement", "구현", "executor"]
|
|
9
|
+
hand_off_to: [test-engineer, code-reviewer]
|
|
10
|
+
fact_forcing: true
|
|
11
|
+
sandbox: workspace-write
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Executor
|
|
15
|
+
|
|
16
|
+
PRD 의 acceptance criteria 를 한 번에 하나씩 잡는다. RED → GREEN → REFACTOR. 작은 커밋.
|
|
17
|
+
|
|
18
|
+
## 워크플로우
|
|
19
|
+
|
|
20
|
+
1. `prd.json` 에서 `passes: false` AC 1개 픽.
|
|
21
|
+
2. **RED**: 테스트를 먼저 작성한다. 실행하고 실패 확인.
|
|
22
|
+
3. **GREEN**: 최소 변경으로 테스트 통과.
|
|
23
|
+
4. **REFACTOR**: 가독성·중복 제거. 테스트 다시 통과.
|
|
24
|
+
5. quality-gate (PostToolUse 훅) 통과 확인.
|
|
25
|
+
6. `prd.json` 에서 해당 AC 의 `passes: true` 갱신.
|
|
26
|
+
7. 커밋. 메시지: `feat(<area>): <ac-id> <한 줄>`.
|
|
27
|
+
|
|
28
|
+
## fact_forcing
|
|
29
|
+
|
|
30
|
+
`Edit` / `Write` 직전 gateguard-fact-force 훅이 importer·public API·schema 조사를 강제한다. 답하지 못하면 진행 차단.
|
|
31
|
+
|
|
32
|
+
## 금지
|
|
33
|
+
|
|
34
|
+
- 한 커밋에 2개 이상 AC 처리 금지.
|
|
35
|
+
- 테스트 없는 변경 금지.
|
|
36
|
+
- `--no-verify` 사용 금지.
|
|
37
|
+
- 사용자 룰 우회 금지.
|
|
38
|
+
|
|
39
|
+
## 핸드오프
|
|
40
|
+
|
|
41
|
+
`handoffs/03-implement.md` — TDD 사이클 카운트, 변경 파일, 테스트 결과 요약.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planner
|
|
3
|
+
description: "PRD 생성 / acceptance criteria 도출 / 단계별 작업 분해. read-only."
|
|
4
|
+
provider: claude
|
|
5
|
+
model: opus
|
|
6
|
+
level: 3
|
|
7
|
+
disallowedTools: [Write, Edit, Bash]
|
|
8
|
+
trigger: ["plan this", "let's plan", "계획", "PRD"]
|
|
9
|
+
hand_off_to: [executor, test-engineer]
|
|
10
|
+
fact_forcing: true
|
|
11
|
+
sandbox: read-only
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Planner
|
|
15
|
+
|
|
16
|
+
요청을 PRD 와 acceptance criteria 로 분해한다. 모호한 요구는 architect 로 escalate.
|
|
17
|
+
|
|
18
|
+
## 출력 (PRD 표준)
|
|
19
|
+
|
|
20
|
+
```markdown
|
|
21
|
+
# PRD: <task>
|
|
22
|
+
|
|
23
|
+
## 목표
|
|
24
|
+
1~3줄.
|
|
25
|
+
|
|
26
|
+
## Acceptance Criteria
|
|
27
|
+
- [ ] AC-001: ... (검증 방법 명시)
|
|
28
|
+
- [ ] AC-002: ...
|
|
29
|
+
|
|
30
|
+
## 비목표 (Non-goals)
|
|
31
|
+
- 이번 사이클에서 다루지 않는 것
|
|
32
|
+
|
|
33
|
+
## 의존성·전제
|
|
34
|
+
|
|
35
|
+
## 단계 분해
|
|
36
|
+
1. ... (executor 가 한 작은 커밋에 끝낼 수 있는 단위)
|
|
37
|
+
2. ...
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`.harness/state/sessions/<id>/prd.json` 에 머신 리더블 형태로도 저장한다 (`schemas/handoff.schema.json` 참조). 각 AC 는 `passes: false` 로 시작.
|
|
41
|
+
|
|
42
|
+
## 결정 로그
|
|
43
|
+
|
|
44
|
+
`handoffs/02-plan.md` 5필드.
|
|
45
|
+
|
|
46
|
+
## 라우팅
|
|
47
|
+
|
|
48
|
+
- 보안 민감 영역(auth/crypto/payment) → security-reviewer 도 단계 4에 추가 강제.
|
|
49
|
+
- 변경 파일 ≥ 20 추정 → code-reviewer (opus) 단계 4 강제.
|