8.0 KiB
P1 Tranche 3 — 단일 상태머신 엔진 (#7 + #13)
status: approved follows: 2026-07-10-p1-structural-quality-design.md applies-to-version: company-haness @ fix/p0-execution-integrity date: 2026-07-10
목표
state-transition-rules.yaml를 실제 실행·강제하는 엔진을 만들고(#13), wave·cascade를 그 엔진 위의
preset plan으로 통합한다(#7). 현재 wave(progress.yaml)·cascade(collaboration-map)·상태규칙(미실행)이 분리돼 있다.
사용자 승인: 리뷰 권고대로 실행 순서를 ground(discovery)→decide(converge)로 교정한다(anchoring 제거).
통합 workflow-stage 어휘 (SSOT)
하나의 stage 어휘로 wave/cascade 이중 어휘를 대체한다:
intake → discovery → decide → design → spec → build → verification → acceptance → released → closed
(+ blocked: 어느 stage에서든 진입 가능한 사이드 상태)
discovery(구 GROUND): 문제·시장·사용자·경쟁·재무 근거 접지 + option-set 산출(결정 아님).decide(converge): C-Level이 discovery의 근거+옵션을 읽고 하나로 수렴 → ExecutiveDecisionPacket.spec=구 DETAIL,build=구 implementation,acceptance=review/release-acceptance.- 각 stage 내부의 개별 산출물은 여전히 document-state(Draft/Review/Approved/Closed), 부모-자식 수용 1건은 review-state(Submitted-for-Review/Accepted/Changes-Requested/Blocked)를 가진다(기존 유지).
상태 전이 (state-transition-rules.yaml에 workflow-stage 전이로 추가 — E1)
각 전이 = {from, to, allowed-by, required-conditions, forbidden-if?, tier-modifiers}:
intake → discovery: decision-brief-presentdiscovery → decide: grounding-evidence-present, option-set-present (≥2 옵션)decide → design: decision-packet-accepted (review-state Accepted), evidence_grade_min(tier)design → spec: design-acceptedspec → build: spec-accepted AND design-to-build-contract.must-read-designs 전부 Accepted (collaboration-map 참조 — 핵심 게이트)build → verification: completion-record-presentverification → acceptance: quality_gate_status=Passed, blocker_open=falseacceptance → released: release_acceptance_status=Approved, unresolved_critical_risks=false, human-gate(heavy)* → blocked: blocked-report-present, resume-condition-presentblocked → <resume>: resume-condition-satisfied, human-instruction-applied-if-neededreleased → closed: — 기존 document-state/review-state 전이(현 파일 내용)는 보존한다. tier-modifiers는 governance-tiers.yaml가 SSOT(참조).
구성요소
① state_engine.py (신규 hook — E1 소유)
state-transition-rules.yaml(SSOT) +governance-tiers.yaml(tier) +collaboration-map.yaml(design-to-build-contract) +execution-plans.yaml(plan)를 읽는다.- import API(예외 없이 값 반환):
current_stage(wf) -> strallowed_next(wf) -> [str]can_transition(wf, to, ctx=None) -> (bool, [unmet_reason])— required-conditions/forbidden-if/tier 검사. 조건 평가는 워크플로 원장 + 보고서(evidence-grade via validate_report/receipt) + acceptance_log(review-state) + collaboration-map(must-read-designs Accepted)에서 파생.transition(wf, to, evidence, actor) -> (ok, [reason])— 통과 시 원장 stage 갱신 + append-only 전이 이벤트(acceptance_log 메커니즘 재사용,<state_dir>/<wf>/state-events.jsonl).
- CLI:
state_engine.py current|allowed|check|transition --workflow <wf> [--to <stage>] .... - guard 모드:
state_engine.py guard --workflow <wf> --to <stage>→ 커맨드가 진입 시 호출, exit 2면 커맨드가 전이 거부(선행조건 미충족 사유 출력). workspace 미설정/원장 없음은 fail-safe(명확 메시지). - 절대 pipeline crash 금지(P0 hook 규율): 예외는 안전값으로 degrade.
② 통합 워크플로 원장 (E2 소유)
- 경로:
<state_dir>/<wf-id>/workflow.yaml— 하나의 wf-id에:workflow-id, stage(SSOT), plan(cascade|wave|light), tier, mode, artifacts:[{path, document-state, review-state}], progress:{round, is_progress_being_made, stall_count, next, governance_limits}. - wave의
progress.yaml필드를progress:하위로 흡수(하위호환: plan-wave/run-wave가 이 원장을 읽고 쓴다). 원장 생성/갱신 helper(workflow_ledger.py또는 state_engine의 일부).
③ execution-plans.yaml (신규 — E1 소유)
named plan = stage 순서(같은 state graph 위):
plans:
cascade: [intake, discovery, decide, design, spec, build, verification, acceptance, released]
wave: [intake, plan, run, verification, acceptance, released] # plan/run = Magentic 루프(run은 stage 반복)
light: [intake, run, verification, acceptance]
cascade는 별도 시스템이 아니라 이 plan. mid-start = 선행 stage의 gating 산출물이 존재하면 그 stage로 진입(엔진이 검증).
④ 커맨드 통합 (E2 소유)
- 각 cascade/wave 커맨드(ground/decide/design/spec/build/plan-wave/run-wave/review-output/release-check)가 진입 시
state_engine guard를 호출해 현재 stage 유효성+전이 선행조건을 확인하고, 미충족이면 거부(BlockedReport). 종료 시state_engine transition으로 stage 전진. /build는 design-to-build-contract must-read-designs가 Accepted 아니면 엔진이 거부(현재 프롬프트 문구 → 실제 강제).- 커맨드는 workflow-id를 명시적으로 받는다(없으면 새 wf 발급).
- 순서 교정:
/ground(discovery: 근거+option-set) →/decide(converge: 옵션→결정). ground.md/decide.md 재프레이밍. divergent /decide는 per-lens 옵션 평가 → CEO converge.
⑤ #7 모순 제거 (E2 소유)
- collaboration-map.yaml
cascade-phases에 GROUND/discovery 단계 추가(현재 누락) + DECIDE를 그 뒤로. - README/CLAUDE.md의 "항상 /ceo-intake" → "새 워크플로=ceo-intake; 기존 wf-id는 중간 stage 재개"(문서는 P1 close에서 오케스트레이터가 반영).
- 경량 경로(plan-wave 없이 run-wave)도
lightplan으로 정식화.
빌드 분할 (순차 — E2가 E1 API에 의존)
E1 — 코어 엔진 (한 subagent)
소유: .claude/hooks/state_engine.py(신규), org-os/00-role-registry/state-transition-rules.yaml(workflow-stage 전이 추가), org-os/06-agent-work/execution-plans.yaml(신규), .claude/tests/test_state_engine.py(신규).
수용: 엔진이 전이 규칙을 로드·강제; spec→build가 must-read-designs 미Accepted면 거부; discovery→decide 옵션셋 없으면 거부; heavy acceptance→released human-gate; CLI/guard 동작; 전이 이벤트 append-only; workspace 미설정 fail-safe. test_enforcement 편집 금지(깨지면 보고).
E2 — 통합·커맨드 배선 (E1 이후 한 subagent)
소유: 통합 원장 helper, 커맨드 9개(ground/decide/design/spec/build/plan-wave/run-wave/review-output/release-check), collaboration-map.yaml(GROUND 추가+순서), .claude/tests/test_p1_cascade.py(신규).
수용: 커맨드가 state_engine guard/transition 호출; cascade 순서 ground→decide; /build design 미승인 거부; wave progress가 통합 원장 사용; mid-start 검증; 기존 커맨드 계속 동작. test_enforcement 편집 금지(collaboration-map "cascade has DECIDE/DESIGN/BUILD"·"family-ids exist"·"6 edges"는 유지, 깨지면 보고).
공유 규칙
- P0/P1 계약(report-header·receipt·workspace 강제·70 agents·context_package·불변보고서·acceptance_log) 불변.
test_enforcement.py편집 금지 — 새 테스트는 새 파일. 깨진 assertion은 오케스트레이터가 한 곳에서 반영.- git commit/branch 금지. workspace 필요 시 ORGOS_WORKSPACE=_sandbox.
- 끝에 doctor + 전체 suite green 유지.
종료 처리(오케스트레이터)
E1·E2 각각 직접 재현 검증 → 깨진 test_enforcement 반영 → doctor + 전체 suite → CLAUDE.md/README 정직성(상태엔진·순서교정·plan) → settings.json 유지 → 커밋(사용자 승인 시).