Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
> `harness-team summary --write`로만 갱신한다.
> - **D6**: 작업 산출물에는 별도 컨텍스트의 **read-only 검증자**를 붙일 수 있다 — 검증자는 반박만 하고
> 고치지 않으며, 반영은 작성 세션이 재현·판별한 뒤 단일 스레드로 한다(절차는 harness-review 명령 문서).
> - **D7**: OpenCode·Gemini는 하네스 멤버에서 제외했다.

### 리뷰 프로토콜
중요한 변경(새 기능, 아키텍처, 복잡한 리팩토링, 보안, 스키마/API) 완료 후
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@

## [Unreleased]

### Changed
- **결정 로그 분리 + D11 범위 헌장** (task `decision-log-split`). 소비자에게 배포하는 `templates/docs/decisions.md`에는
팀 운영 결정(D2·D4·D5·D6)만 남기고, 플러그인 결정(D7–D10)과 새 **D11**(강제는 PR의 task 문서뿐, 사이클은 제공)은
이 저장소의 `docs/decisions.md`에만 둔다. `doctor`의 결정 로그 확인 헤딩도 D2·D4·D5·D6으로 줄였다 — 확인 대상이 줄어드는
방향이라 소비자에게 새 경고는 없다. 소비자 `AGENTS.md` 결정 규범에서 D7 줄을 뺐다(관리 절 변경이라 원할 때 `init --yes`로 받는다).
사이클 정의·결정 전문은 `docs/harness-cycle.md`.

### Removed
- **개인 도구 흔적 정리** (task `remove-personal-tool-refs`). 메인테이너 개인 도구의 문서를 팀 하네스에서 뺐다:
`docs/ao-worker-rules.md`(AO 워커 규칙)와 `docs/harness-fleet-guide.html`(Orca·firstmate 크루 가이드), 그리고 이를 가리키던
Expand Down
2 changes: 1 addition & 1 deletion commands/harness-migrate.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ argument-hint: [--yes] [--adopt-reviews] [--target <dir>]
refresh는 설치본의 바이트가 **하네스가 실제로 배포한 적 있는 버전**(sha256 테이블)과 일치할 때만
갱신한다. 사용자가 편집한 파일은 "customized"로 보고 **절대 덮지 않고** 경고만 남긴다.
`docs/` seed(`README.md`·`decisions.md`)는 설치 후 팀 저작물이라 refresh 대상이 아니다.
낡은 설치본이 있으면 `harness-team doctor`가 경고로 알려 준다 — 근거는 `docs/decisions.md` D8.
낡은 설치본이 있으면 `harness-team doctor`가 경고로 알려 준다 — 근거는 플러그인 저장소 `docs/decisions.md` D8.

**리뷰 증거 채택은 옵트인이다(`--adopt-reviews`).** 0.37.0 이후 `verify: required`의 정본은 meta의
`reviews[]`이고, 그 키가 없는 구 task는 종전대로 artifact 마커로 판정한다. 이 플래그는 열린 구 task를
Expand Down
2 changes: 1 addition & 1 deletion commands/harness-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Raw slash-command 인수:
탐지해 첫 가용 엔진을 쓴다. claude는 Claude Code 환경에서 항상 존재하므로
이 체인은 어느 머신에서든 리뷰어를 보장한다. vendor 분리 리뷰어(codex)를
우선하고, 컨텍스트 분리만 제공하는 claude가 마지막이다(엔진 표의 한계 참조).
Gemini는 하네스 멤버가 아니다(`docs/decisions.md` D7) — 필요하면 `custom`으로 등록한다.
Gemini는 하네스 멤버가 아니다(플러그인 저장소 `docs/decisions.md` D7) — 필요하면 `custom`으로 등록한다.
`custom`은 체인에 포함되지 않는다 — 명시 호출 전용이다.

2. **Scope 결정** — `git status --short`가 dirty면 working tree 전체가 리뷰 대상이다.
Expand Down
56 changes: 54 additions & 2 deletions docs/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ AI 팀 운영 규범의 근거와 이력. `AGENTS.md`의 역할·프로토콜
요약한 것이며, 전문(배경·근거·재평가 조건)은 이 파일이 정본이다.
새 결정은 번호를 이어 아래에 append 한다 — 규범이 바뀌면 `AGENTS.md`의 요약도 함께 갱신한다.

> 상류 출처: D2·D4·D5·D6·D7은 team-harness 플러그인 기본값의 결정 이력이다(bd-makers/team-harness).
> 프로젝트 고유 결정은 그 아래에 이어서 기록한다.
> 이 파일은 **플러그인 저장소의 결정 로그**다. 소비자에게 배포되는 `templates/docs/decisions.md`에는
> 팀 운영 결정(D2·D4·D5·D6)만 같은 문장으로 들어 있고, D7 이후는 플러그인 결정이라 이 저장소에만 둔다(D11).

## D2 (2026-06-11) — drive/리뷰어 역할 분리

Expand Down Expand Up @@ -188,3 +188,55 @@ user 영역이 비었을 때만 제거한다.

**AGENTS.md 규범 목록에 넣지 않은 이유**: D9와 같다 — 에이전트가 매 세션 지킬 규칙이 아니라 현 구조를
유지하는 **닫힌 결정**이다. `doctor`의 eager 계층 주석이 이 결정을 가리킨다.

## D11 (2026-10-05) — 범위 헌장: 강제는 PR의 task 문서뿐, 사이클은 제공한다

README의 자기 정의는 "멀티에이전트 설정·상태 하네스"였지만, 2026-10-05 재검토에서 구성과 범위가 그 정의를 벗어나 있음을
측정했다 — 하네스가 자기 자신을 migrate·진단·릴리스·문서화하는 코드가 약 25%, fix 커밋이 `task`·`doctor`·`migrate`
세 모듈에 집중, 품질 도구 실행까지 넓히는 변경(#119, 닫음). 메인테이너와의 대화로 정체성과 범위를 다시 정했다.
측정·대화·단계별 결정의 전문은 `docs/harness-cycle.md`가 정본이다.

**정체성**: 한 프로젝트의 팀원들에게 같은 개발 사이클(S0 셋업 → S8 지식화, 검토 지점 R1–R3)을 **제공**하는 하네스.
사람은 루프 안에 선다 — spec과 plan은 개발자가 직접 만들고, 구현 방식은 개발자마다 자유다.

**결정 — 강제하는 것(하나뿐)**: PR에 그 task의 문서를 담는다 — spec·plan·handoff·artifact, 그리고 다이어그램
(로직·구조 변화가 없으면 `harness-team diagram record --skipped "<사유>"`로 대신). 확인은 결정론적 검사 하나로 모으고
ship·git pre-push 훅·(원하는 팀의) CI가 같은 검사를 부른다. task 시작은 강제하지 않고(SessionStart nudge 유지),
종결 순서는 PR → 머지 → 기본 브랜치에서 `done`을 유지한다.

**결정 — 제공하는 것**: 사이클 게이트(R1 원천 문서 검토 · R2 시나리오 ↔ 증거 대조 · R3 코드 리뷰, 커밋 프리셋),
선택형 기본 루프(오케스트레이터는 S3부터, Claude·Codex 기본 기능만), 가로축(인계·팀 가시성·안전 가드·루프 건강·갱신 경로).
쓰든 말든 개발자 자유다.

**결정 — 소유하지 않는 것**
- **코드 안의 언어·도구별 로직** — 언어 지식은 프리셋 데이터로만 둔다. 훅·CLI에 언어 분기를 넣지 않는다.
- **구현 방식 강제**, **사이클 밖 편의 기능**(파일 배치 등), **서비스형 런타임 오케스트레이터**, OS·네트워크 격리.
- **개인 도구·서드파티 오케스트레이터 의존** — 메인테이너 개인 도구의 규칙·가이드·설정을 두지 않는다. 선택 동반 플러그인은
핀·라이선스·없을 때의 동작을 명시한 경우만 허용한다(현재 `diagram-design`).

**2차 장치 규칙**: 하네스의 다른 장치를 고치거나, 지키거나, 옮기거나, 보여 주기 위한 새 장치를 추가하기 전에 원래 장치를
빼거나 줄이는 안을 먼저 검토하고 기각 사유를 spec에 남긴다(D7 "고치는 것보다 빼는 것이 단순하다"의 일반화).

**신규 기능 판정 질문**(spec의 Ambiguity 게이트보다 먼저): ① 사이클의 어느 단계(또는 가로축)를 위한 것인가 — 답이 없으면 비범위.
② 언어·도구별 지식이 필요한가 — 그렇다면 프리셋으로. ③ 다른 하네스 장치의 결함·부작용 때문인가 — 그렇다면 2차 장치 규칙.

**의도적으로 유지 (재론하지 말 것)**
- 작은 수정도 full task다. 문서 대 코드 비율이 높은 것은 결함이 아니라 선택이다. task 폴더는 작업대이고, 머지 후 위키로 컴파일한다.
- `migrate`는 당겨 쓴다(pull) — 사용자가 필요할 때 해당 프로젝트에서 실행한다. 지원 창을 정책으로 두지 않고, 일회성 변환 단계가
유지비를 낼 때 지운다(그보다 오래된 설치본은 재 init).

**결정 로그 분리 (이 결정과 함께)**: 소비자에게 배포하는 `templates/docs/decisions.md`에는 팀 운영 결정(D2·D4·D5·D6)만 둔다.
D7 이후는 플러그인 결정이라 이 저장소에만 둔다. `doctor`의 확인 헤딩도 D2·D4·D5·D6으로 줄인다 — 확인 대상이 줄어드는 방향이라
소비자에게 새 경고는 생기지 않고, 이미 설치된 D7–D10 사본은 seed라 그대로 남는다(D8).

**기각한 대안**
- **헌장 없이 사례별 판단** — 매 PR이 국소적으로는 타당했고, 그 합계가 위 측정이다.
- **정량 예산(LOC 상한 등)** — 지표가 목표가 된다. 측정은 재평가 신호로만 쓴다.
- **처음부터 다시 작성** — 남길 것이 약 80%라 옮기는 비용이 크고, 마커 병합·Codex 주입 형식·D10 같은 비싸게 얻은 지식을 다시 겪는다.
- **`done` → PR로 순서 변경** — 머지 후 종결 절차·`remote-task.mjs`·done-on-main 안내 등 손볼 장치가 많다.
- **task 시작 강제**(쓰기 차단·pre-commit) — 경계가 애매하다. PR 시점의 문서 확인으로 충분하다.

**재평가 신호**: minor 릴리스마다 자기 관리 비중과 fix 집중 모듈을 다시 잰다. 나빠지면 이 헌장이 지켜지지 않고 있다는 뜻이다.

**AGENTS.md 규범 목록에 넣지 않은 이유**: 에이전트가 매 세션 지킬 규칙이 아니라 메인테이너가 기능을 받을지 정하는 기준이다.
eager 계층 예산 여유도 거의 없다(D9). 진입점은 이 로그와 `docs/harness-cycle.md`다.
Loading
Loading