# 품질 심사 — company-haness README (20260720-rewrite) - **판정: NEEDS_FIX** - 가중 점수: **82 / 100** (통과 기준 80) - Hard gate: **실패** — `architecture-mismatch` - 미해결 차단 항목: critical 1건, major 1건 - 재개 지점(권고): `FACTS_EXTRACTED` 문장은 잘 편집돼 있고 정직성 요구도 대부분 지켰다. 그런데 다이어그램이 정본 계약과 다른 구조를 보여주고 본문이 그것을 보정하지 않아, 거버넌스 통제 하나에서 독자가 잘못된 결론에 도달한다. 글의 문제가 아니라 사실 추출의 구멍이며, 그래서 점수는 높은데 통과하지 못한다. ## 차원 점수 | 차원 | 가중치 | 점수 | 기여 | 한 줄 근거 | |---|---|---|---|---| | project-specificity | 25 | 5 | 25 | 첫 문단부터 수치·경로가 이 저장소에만 해당한다 | | reader-journey | 20 | 4 | 16 | 순서는 brief와 일치하나 개요가 분석 provenance로 무겁다 | | technical-explanation | 20 | 3 | 12 | 기제 설명은 강하나 wave의 사람 승인 기제가 통째로 빠졌다 | | task-usability | 15 | 5 | 15 | 전제조건·기대 출력·종료 코드·검증 수준이 모두 붙어 있다 | | prose-clarity | 15 | 4 | 12 | 번역투·홍보어 없음. 계약 키 표기만 일관되지 않다 | | visual-judgment | 5 | 2 | 2 | 포함 판단은 옳으나 위임받은 비교축에서 틀렸다 | | **합계** | **100** | | **82** | | `prose-clarity` 4로 한국어 PASS 하한(4)은 충족한다. `visual-judgment` 2는 차원 최소치(3)에 미달한다. ## 독자 시뮬레이션 | 시뮬레이션 | 결과 | 요지 | |---|---|---| | 30초 | PASS | 정의(L6), 존재 이유(L6-8), 독자 표(L12-16)가 추론 없이 답을 준다 | | 5분 | PASS | 가치·실행·구조·한계 네 항목 모두 확인 가능. 단 wave 독자는 승인 게이트를 오해한 채 끝난다 | | 기여자 | PASS | 원본·생성물 경계(L288, L336), 재생성·재검증 명령(L559-562), 정본 링크가 모두 있다 | ## Hard gate | 게이트 | 결과 | |---|---| | unsupported-high-risk-claim | 통과 — 우위 주장을 반복해 부정한다(L482, L501, L526) | | unrunnable-command-presented-as-verified | 통과 — 명령 5개에 등급 표기, 미실행 1개를 명시(L67, L409) | | wrong-module-description | 통과 | | architecture-mismatch | **실패 — R-001** | | invalid-link | 통과 — verification.json path 18/18, anchor 1/1 | | secret-leak | 통과 — 비밀 값 없음, 절대 개인 경로 없음 | | protected-content-modified | 해당 없음 (bootstrap, protected-sections 비어 있음) | | prompt-injection-accepted | 통과 — 저장소 내용을 지시가 아닌 데이터로 다뤘다 | ## 발견 사항 | id | 심각도 | 분류 | 절 | 요지 | 라우팅 | |---|---|---|---|---|---| | R-001 | critical | architecture-mismatch | workflows | wave 종단 전이의 사람 승인 게이트 누락 | `FACTS_EXTRACTED` | | R-002 | major | prose-clarity | operating-model | 계약 키 인라인 코드 표기 불일치 | `README_DRAFTED` | | R-003 | minor | prose-clarity | workflow-wave-light | 절 제목의 plan 식별자 코드 미표기 | `README_DRAFTED` | | R-004 | minor | verification-honesty | operating-model | 강제 기제가 검증 수준 없이 현재형 단정 | `README_DRAFTED` | | R-005 | minor | verification-honesty | bench-cascade | 예산 게이트가 exit 3 사실을 누락 | `README_DRAFTED` | | R-006 | minor | reader-journey | overview | 개요가 분석 provenance로 과부하 | `README_DRAFTED` | | R-007 | minor | claim-integrity | operating-model | 비교 프레이밍 문장에 claim-id·근거 없음 | `README_DRAFTED` | ### R-001 (critical) — wave 경로가 사람 승인 없이 릴리스되는 것처럼 보인다 다이어그램은 cascade의 `acceptance -> released`에 `human-gate 사람 승인 필요` 노드를 그리고, wave의 동일한 `acceptance -> released`에는 아무 노드도 두지 않는다(L140 대 L149-150). 네 경로를 나란히 놓고 비교시키는 그림이므로 이 비대칭은 생략이 아니라 암시로 읽힌다. 본문도 보정하지 않는다. wave·light 절(L227-237)은 단계·명령·tier·종단 상태를 열거하면서 exit gate를 한 번도 언급하지 않고, L124는 "사람 승인은 plan의 exit gate 조건으로 박혀 있습니다"라고 일반화한 뒤 cascade만 예로 들어 나머지는 다르다는 인상을 남긴다. 결과적으로 독자는 같은 질문에 대해 서로 반대 방향의 근거 없는 신호를 두 개 받는다. 근본 원인은 사실 추출이다. `F-WORKFLOW-CASCADE`는 `release-exit-gates`를 기록했지만 `F-WORKFLOW-WAVE-LIGHT`는 같은 정본 파일에서 stage별 `exit-gate`를 추출하지 않았고, 그 공백이 `visual-plan.yaml`의 avoid 규칙("wave·light 경로에 근거 없는 human-gate 노드를 추가하기")으로 굳어져 다이어그램까지 전파됐다. Visual Planner는 주어진 사실 안에서 옳게 판단했다. **심사자 관찰(사실 정의 아님)** — 정본 `org-os/06-agent-work/workflow-contracts.yaml`의 `wave.acceptance` 행에는 cascade와 동일한 세 조건 exit-gate가 기재돼 있다. 따라서 이것은 근거 부재가 아니라 추출 누락일 가능성이 높다. `FACTS_EXTRACTED`에서 wave·light 전 stage의 exit-gate를 재추출해 확정한 뒤 다이어그램과 본문을 함께 고쳐야 한다. ### R-002 (major) — 계약 키를 인라인 코드로 표기하라 영문 용어를 한국어로 옮기라는 지적이 아니다. 이 용어들은 저장소 YAML 계약의 실제 키이므로 번역하면 README와 코드의 대응이 깨진다. 요구하는 수정은 표기이며, 같은 문서가 L105와 L124에서 이미 동일 성격의 값을 코드로 쓰고 있어 내부 불일치다. **코드로 바꿀 것 —** L27 `capability` `artifact kind` `bundle` `exit gate` / L28 `gate fact` `artifact kind` `option count` `evidence grade` / L29 `family` `collapse` `fan-out` / L30 `fan-out` `subagent` / L31 `evidence ledger` `receipt` / L338 `worker` `fan-out` `collapse concrete` `direct single-member` `synthesis lead` `family resolver` `router`. **한국어로 바꿀 것 —** L28 `caller`(앞 문장이 이미 "호출자"라 중복), L48 hook·validator·test → 훅·검증기·테스트, L445 push·pull request, L32 defense-in-depth → "심층 방어"(원어 1회 병기). **그대로 둘 것 —** Bradley-Terry, Elo, Chrome, Chromium, Marp, SHA-256, JSON Schema, Python, PyYAML, Node.js, D2, Claude Code. ## 정직성 요구 확인 이 재작성의 존재 이유였던 다섯 항목은 모두 이행됐다. | 요구 | 결과 | 위치 | |---|---|---| | 워킹 트리 대 HEAD 범위 고지(추적 72 대 워킹 트리 101) | 이행 | L18-20, L411, L540 | | 검증 신뢰 등급 3단계 | 이행 — 3등급은 "해당 사례 없음"으로 비워 둠 | L465-475 | | 도구의 존재와 측정의 발생 분리 | 이행 — "측정 도구는 만들어져 있고, 측정은 거의 이뤄지지 않았습니다" | L482 | | 8개 중 6개 exit 3 stub과 파일럿 부재 | 이행 | L512-516 | | 골든 벤치마크 동률이 우위를 입증하지 않음 | 이행 | L499-501 | `must-exclude` 3항도 위반이 없다. 우위·성능 주장 없음, 비밀 값 없음, 절대 개인 경로 없음 (`hyeonworks`는 저장소 상대 워크스페이스 디렉터리명이다). 남은 정직성 흠은 두 개이며 모두 minor다. 강제 기제 서술에 검증 수준이 붙지 않았고(R-004), 예산 게이트 문장이 exit 3 사실을 빠뜨렸다(R-005). ## 문체 경고 판단 (경고 53건, 오류 0건) **결론: 일괄 면제도 아니고 일괄 수정도 아니다. 두 지점만 고치면 된다.** 밀도 경고 51건의 상당수는 저장소 YAML 계약의 실제 키를 가리킨다. 이것을 한국어로 번역하면 README와 코드의 대응이 끊어지므로 번역은 오답이다. 그러나 그것은 "그대로 두라"는 근거가 아니라 "인라인 코드로 표시하라"는 근거다. `korean-reader-prose.md`가 파일·모듈·API·상태 값·제품명을 인라인 코드로 쓰라고 이미 정해 두었고, 이 문서 자체가 L105·L124에서는 그 규칙을 지키고 있다. 지금 상태에서 독자는 어떤 문자열이 grep할 식별자이고 어떤 것이 일반명사인지 구분할 수 없다. 이것이 독자를 실제로 방해하는가 — 문서 전체로는 아니고, 두 지점에서는 그렇다. 운영 원리 L27-32는 6개 원칙 중 5개가 연속 경고이며 문서의 개념 모델이 놓인 자리다. L338은 한 문장에 맨 영문 토큰이 11개로, 어느 것이 카드 종류의 리터럴 값인지 모르면 해석되지 않는다. 그래서 이 두 곳만 major로 요구하고(R-002), 나머지 밀도 경고는 같은 원칙을 적용하면 함께 해소된다. `KO-ENGLISH-HEADING` 2건도 번역 대상이 아니다. `wave`·`light`·`design-direction`은 plan 식별자이므로 코드 표기가 답이다(R-003). `KO-VAGUE-BENEFIT` 1건(P-044, L526)은 **오탐**이다. 해당 문장은 추상적 효용이 아니라 "통계적 우월성을 확정하지 않는다"는 구체적 부정 단서이며, 이 문서에서 가장 정직한 문장 축에 든다. 수정을 요구하지 않는다. 문체 자체는 좋다. 되어지다·~에 의해서·~에 있어서 같은 번역투 0건, 작성 과정 설명 0건, 홍보성 수식어 0건이고 종결어미가 기계적으로 반복되지 않는다. `prose-clarity`를 4로 둔 이유이며, 남은 결함은 문장력이 아니라 표기 일관성이다. ## 재작업 순서 (권고) 1. `FACTS_EXTRACTED` — wave·light 전 stage의 exit-gate를 정본에서 재추출한다 (R-001). 2. `VISUALS_PLANNED` — 재추출 결과에 맞춰 avoid 규칙과 wave 경로 노드를 갱신한다 (R-001). 3. `README_DRAFTED` — wave 절에 exit gate를 서술하고, R-002~R-007을 함께 처리한다. 라우팅은 권고이며 실제 재개 지점은 엔진이 발견 항목에서 다시 계산한다.