genetics-mcp 2.18.0 → 2.18.2

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.
Files changed (27) hide show
  1. package/bin/aarch64-apple-darwin/gcell +0 -0
  2. package/bin/manifest.json +2 -2
  3. package/bin/x86_64-apple-darwin/gcell +0 -0
  4. package/package.json +1 -1
  5. package/skills/genetics-report/SKILL.md +143 -134
  6. package/skills/genetics-report/assets/example/cases-briefing-designs.json +34 -0
  7. package/skills/genetics-report/assets/example/cases-briefing.json +4 -2
  8. package/skills/genetics-report/assets/example/plate-pair-after.png +0 -0
  9. package/skills/genetics-report/assets/example/plate-pair-before.png +0 -0
  10. package/skills/genetics-report/assets/example/plate-pair.html +25 -0
  11. package/skills/genetics-report/assets/example/report-briefing-designs.json +744 -0
  12. package/skills/genetics-report/assets/example/report-briefing.json +30 -24
  13. package/skills/genetics-report/assets/example/report.json +4 -4
  14. package/skills/genetics-report/assets/figure.mjs +390 -63
  15. package/skills/genetics-report/assets/mockshot.mjs +3 -2
  16. package/skills/genetics-report/assets/pair.mjs +138 -0
  17. package/skills/genetics-report/assets/shot.mjs +87 -19
  18. package/skills/genetics-report/references/content-pipeline.md +34 -33
  19. package/skills/genetics-report/references/edition-review.workflow.js +49 -0
  20. package/skills/genetics-report/references/history.md +121 -0
  21. package/skills/genetics-report/references/illustrations.md +16 -12
  22. package/skills/genetics-report/references/lim-portal-format.md +179 -93
  23. package/skills/genetics-report/references/linear-read-test.workflow.js +47 -0
  24. package/skills/genetics-report/references/process.md +141 -91
  25. package/skills/genetics-report/references/readability.md +46 -23
  26. package/skills/genetics-report/references/reader-review.workflow.js +157 -29
  27. package/skills/genetics-report/references/visual-first.md +95 -34
@@ -1,6 +1,6 @@
1
1
  # 시각 우선 집필 공식 — 글보다 먼저 정한다
2
2
 
3
- > 근거 사례(2026-09-08, 앳플리 체중 조절 권장량 검수 보고 4차): 같은 날 세 번 반려됨.
3
+ > 근거 사례(2026-09-08, 고객사 검수 보고): 같은 날 세 번 반려됨.
4
4
  > ① 「글만 적어서는 이해가 어려움. 사진이나 그림 자료가 함께 있으면 좋겠음. 내가 이해를 하고 있어도
5
5
  > 네가 쓴 글은 내 이해를 혼란스럽게 하고 있음」 → 개념도 2장 + 실제 화면 캡처 1장을 붙이자 「잘했어.
6
6
  > 이렇게 보고서가 되어야 해. 글은 직관적이고 흐름을 이해하기 쉽게, 보충 설명은 그림 같은 시각 자료로」
@@ -16,10 +16,11 @@
16
16
  판단을 에이전트에게 두지 않고 렌더러가 센다(`lim-portal-format.md` §10-1). 여기는 그 앞, 원고를
17
17
  쓰기 전에 정할 것의 순서다.
18
18
 
19
- ## 1. 한 장 이야기 — 요약면 다섯 칸의 순서
19
+ ## 1. 한 장 이야기 — 요지의 이야기 순서
20
20
 
21
- 문제 → 원인 → 해법 → 지금 상태 → 정할 것. `summary[]` 다섯 항목을 이 순서로 쓰고, 1절에
21
+ 문제 → 원인 → 해법(지금 상태 포함) → 정할 것. 이것은 **칸 수가 아니라 이야기 순서**이고 **검수·보고판**의 것이다 — 결정 문서판의 순서·칸 수·문단 모양은 SKILL 4~6단계 한 곳이 정본이다. `summary[]` 를 이 순서로 쓰고, 1절에
22
22
  「사건 경과」 표(날짜 · 일어난 일 · 상태 칩) 한 장을 둔다 — 다루는 일의 경과이지 이 문서의 판 이력이 아니다(판 이력은 `history`, SKILL 3b). 신입은 여기서 멈춰도 문서를 안 것이다.
23
+ 집행자: 독자 검토 「구조」 관점(readability R12g) · 사람 눈.
23
24
 
24
25
  ```json
25
26
  {"label":"Decide","lead":"정식 배포 전에 정할 것은 5항, 나머지는 차기임.",
@@ -29,29 +30,42 @@
29
30
  ## 2. 예시 한 명 — 문서 전체를 한 사람의 숫자로 관통
30
31
 
31
32
  실존 이용자 하나(번호·측정일·실제 값)를 골라 그림·표·흐름도·건·판단 항목이 **같은 숫자**를 되풀이하게
32
- 한다. 독자는 숫자 하나를 기억하고 그 숫자가 어디로 흘러가는지 따라간다. 앳플리 4차의 1388741(여 159cm ·
33
- 9월 4일 63.3kg · 체지방 14.4 · 기준 체중 57.3 · 적정 체중 62.0 · 조절 −1.3)이 그 예다.
33
+ 한다. 독자는 숫자 하나를 기억하고 그 숫자가 어디로 흘러가는지 따라간다. 예시 이용자 한 명의 값 한 벌(성별·키 · 측정일 ·
34
+ 측정값 · 산식이 낸 값 · 화면 칸의 값)이 문서 끝까지 같은 숫자로 흐르는 것이 그 모양이다(값은 그 문서의 몫이고 스킬에 적지 않는다).
34
35
  되풀이는 **자리마다 다른 물음**에 답할 때만이다 — 같은 물음(무엇이 빠졌나·얼마였나)에 그림·요지·표·건이 같은 숫자로 답하면
35
36
  되풀이다(readability R12f·R12g). 셈은 한 자리(표 또는 요약면 수치)에 두고 다른 자리는 그곳을 가리킨다.
36
37
  이름은 가린다(캡처의 닉네임 칸은 `shot.mjs --mask`).
37
38
 
38
39
  ## 3. 용어 잠금 표 — 같은 낱말이 두 값을 가리키면 거기서 죽는다
39
40
 
40
- 검토 워크플로가 첫째로 잡은 것이 이것이었다: 「적정 체중」이 한 절에서는 키 기준 57.3, 다른 절에서는
41
- 결과지 칸 62.0 을 가리켰다. 뜻이 갈리는 낱말은 **판단 요청 절에** 표 한 장으로 박는다 —
41
+ 검토 워크플로가 첫째로 잡은 것이 이것이었다: 같은 값 이름이 한 절에서는 산식이 낸 값, 다른 절에서는
42
+ 결과지 칸의 값을 가리켰다. 뜻이 갈리는 낱말은 **판단 요청 절이나 용어 부록에** 표 한 장으로 박는다 —
42
43
  열: 이름 · 값(예시 한 명) · 어떻게 정해지나 · 어디에 보이나. 산식 안의 값과 화면 칸 이름은 다른 낱말을 쓴다.
43
44
 
45
+ 잠그는 것은 값 이름만이 아니다.
46
+ - **장치 이름** — `labels` 로 바꾼 건 행 이름(물음·관찰·판단·재현 방법)은 다른 절의 이름·부제·표 열·캡션에 다시 쓰지 않는다.
47
+ 건 행 「판단」과 의견 표 열 「판단」이 함께 서면 독자는 둘을 같은 것으로 읽는다 — 의견 절의 낱말은 「의견」이다.
48
+ - **선택지 기호** — A·B·C 는 **한 목록에만** 붙인다. 도안 셋에 A·B·C 를 붙였으면 다른 표의 길 넷에는 기호 대신 이름을 쓴다.
49
+ 같은 선택지는 한눈표·선택지 비교·의견 표·도판 칩·캡션에서 같은 이름·같은 순서로 부른다(`lim-portal-format.md` §12.3b 대칭 불변식).
50
+
51
+ 집행자: `gazette.py text_scan()` ⚠ — 건 행 이름이 다른 절 부제·표 제목·열에 서는 곳, 선택지 기호 하나에 이름이 둘인 곳(표의 열 머리·행 첫 칸만,
52
+ 산문은 안 봄) · 한 낱말이 두 값인지(뜻)는 독자 검토 「처음 읽는 사람」 관점과 사람 눈.
53
+
44
54
  ## 4. 절마다 시각 장치를 먼저 정한다
45
55
 
46
56
  | 말하려는 것 | 장치 | 만드는 법 |
47
57
  |---|---|---|
48
- | 개념·원리(왜 갈리나) | 개념도(비트맵) | HTML 한 장을 **표시 폭 그대로(760px, 전폭 1030px)** 쓰고 `assets/figure.mjs` 로 굽는다(배율 auto → 1400px 출력). 라벨 17px 이상·값 23px 굵게·행간 1.5·뜻 색 3·그림 안 문장 0 — 규칙표는 `references/readability.md` |
49
- | 실제 화면의 확인 자리 | 번호 표식 캡처 | `assets/shot.mjs` — 페이지 안에 ①②③ 배지를 얹은 채 요소를 찍는다. 이름은 `--mask` |
58
+ | 개념·원리(왜 갈리나) | 개념도(비트맵) | HTML 한 장을 **표시 폭 그대로**(본문 단·전폭 폭은 `references/readability.md` §1 머리) 쓰고 `assets/figure.mjs` 로 굽는다(배율 auto). 글자·행간·뜻 색·그림 안 문장의 값과 그리는 순서는 readability §1·§3 |
59
+ | 실제 화면의 확인 자리 | 번호 표식 캡처 | `assets/shot.mjs` — 페이지 안에 ①②③ 배지를 얹은 채 요소를 찍는다. 이름은 `--mask`. 번호 표식 캡처는 비교 컷이 아니다 — 틀 안 글자 0(R13b)의 원 번호 한 글자 예외에 기댄다. 원 번호는 **읽는 순서만**, 대상의 이름은 틀 위 칩으로(원 번호를 이름표로 쓰지 않는다). 배지는 `shot.mjs` 기본 검정 원(R13c) |
50
60
  | 여러 항목을 축으로 견주기 | 표(`tables`) | 칸은 짧게(20자·5열 이상 12자), 수는 `align:"r"`. 상태 칩 `{{ok|보통}}`(문법 lim-portal-format §11-6) |
51
61
  | 「A 가 되면 B 가 되고 C 가 된다」 | 흐름도(`flow`) | 4열 고정. 판단 절에는 「정하면 어느 길로」 관문 흐름도 |
52
62
  | 분포·비중 | 막대 차트(`charts`) | 행마다 `tone` 으로 뜻 색. 두 축 비교는 `toggle` |
53
63
  | 사건 경과·타임라인 | 표 | 날짜 · 일어난 일 · 상태 또는 건 번호. **일어난 일만** 적고 까닭·기제·금액 판정은 건이 가진다 — 건 절에서 같은 사건을 열만 바꿔 다시 세우지 않는다 |
54
- | **화면이 바뀌는 선택지**(비표시·제거·추가·이동) | 「그대로 두면 · 지금」 / 「바꾸면 · 재현」 두 컷 한 쌍 | 실제 화면 캡처에 바뀔 자리를 **검정** 테두리로, 뒤 컷은 그 자리를 실제로 빼고(아래 내용이 올라온 채) 빈 자리를 **회색 점선**으로 찍는다. 두 컷의 이름표는 **같은 모양**(앞 「그대로 두면 · 지금」, 뒤 「바꾸면 · 재현」), 문구는 「예시」라 적는다. **빨강·초록은 이용자 상태를 나르는 그림에만** — 선택지 두 컷에 칠하면 색이 두 길의 옳고 그름을 먼저 판정한다(실사례 2026-09-11, 고객사 결정 브리핑 「답정너 틀」 반려). 여러 항이 같은 자리를 가리키면 라벨을 「세 항 공통」으로 — 항 번호를 패널에 나눠 붙이면 독자는 항마다 자리가 다르다고 읽는다(2026-09-08 「비표시하면 어떤 게 비표시된다는 건지 UI 도 없다」 반려, 독자 시험 3/3 오독). 집행자: 없음 — 사람의 눈(readability.md §2) |
64
+ | **화면이 바뀌는 선택지**(비표시·제거·추가·이동) | 「그대로 두면 · 지금」 / 「바꾸면 · 재현」 두 컷 한 쌍(좌우) | `shot.mjs --hide … --after … --geom` 으로 전후를 찍고(뒤 컷은 그 자리를 실제로 빼 아래 내용이 올라온 채) `pair.mjs` 로 조립한다 — 좌표를 손으로 옮기지 않는다. 앞 컷은 바뀔 자리를 **검정** 실선, 뒤 컷은 빈 자리를 **회색 점선**. 두 컷은 **좌우 같은 틀·같은 배율·같은 윗선** — 짧은 쪽은 흰 여백, 늘리거나 따로 잘라 맞추지 않는다. 빈 자리에 글자를 얹지 않는다(회색 점선이 말한다). 이름표 칩은 같은 모양, 문구는 기본 「그대로 두면」/「바꾸면」, 한눈표가 없으면 캡션의 이름. 값은 readability R13. 예시 값·재현이라는 사실은 도판 HTML 머리 주석과 `origin` 에만 적는다(보이는 자리에는 캡션 한 낱말, R12e). **빨강·초록은 이용자 상태를 나르는 그림에만** — 선택지 두 컷에 칠하면 색이 두 길의 옳고 그름을 먼저 판정한다(실사례 2026-09-11, 고객사 결정 브리핑 「답정너 틀」 반려). 여러 항이 같은 자리를 가리키면 칩을 「세 항 공통」으로 — 항 번호를 패널에 나눠 붙이면 독자는 항마다 자리가 다르다고 읽는다(2026-09-08 반려, 독자 시험 3/3 오독). 집행자: `figure.mjs` R13a~d(배치·틀 안 글자·표식 색·칩) · `pair.mjs`(규격을 코드가 씀) · 칩 문구의 뜻과 도판 사이 대칭은 독자 검토 「도판」 관점과 사람 눈 |
65
+
66
+ 도판 HTML 머리 주석은 그림 번호가 아니라 `assets[].id` 로 적는다 — 번호는 자리가 매기고 도판을 옮기면 바뀐다. 본문에서 그림을 가리킬 때도
67
+ 번호를 손으로 적지 않고 `{{그림:<id>}}` 토큰으로 쓴다(문법·번호 순서는 `lim-portal-format.md` §11-1·§11-6).
68
+ ⚠ 토큰은 **운영 반영 확인 전**이다 — 배포 뒤 열람 DOM 에서 `a.ref[href^="#fig-"]` 를 세어 확인하기 전에 쓰면 고객 화면에 글자로 찍힌다(§11-6).
55
69
 
56
70
  글은 장치 옆 **3줄(220자) 안**. 표의 숫자를 문장으로 되풀이하지 않는다 — 검토가 잡은 둘째 결함이었다
57
71
  (제8절 문단 8개가 표 3개를 문장으로 반복). 산문에 참조 번호(6.6 · 2.12a)를 넣지 않는다 — 번호는 표·건·항목의 몫이다.
@@ -59,25 +73,33 @@
59
73
  ### 판독 — 도판은 열람 화면(본문 단 760px)에서 재고, 잣대는 글자 크기 하나가 아니다 (2026-09-08 · 09-09 반려)
60
74
 
61
75
  880px 로 그린 합성 그림이 9.5~12.5px 로 떠 반려됐고(9/8), 14px 게이트를 통과한 그림이 「가독성에 하자」로 다시 반려됐다(9/9 —
62
- 라벨 15px·행간 1.3·라벨 간격 2px·띠 대비 1.2:1·뜻 색 5·그림 안 문단 150자·1x 손실 인코딩). **값의 정본은 `references/readability.md` §1
63
- 규칙표(R1~R11)** 이고 `figure.mjs` 가 그 표를 그대로 센다 — 여기서는 되풀이하지 않는다. 그리는 순서는 그 문서 §3.
76
+ 라벨 15px·행간 1.3·라벨 간격 2px·띠 대비 1.2:1·뜻 색 5·그림 안 문단 150자·1x 손실 인코딩). 2026-09-14 에는 글자를 통과한
77
+ 비교 컷이 위아래로 쌓이고 틀 안에 글자를 얹은 채 「A/B 대칭으로 보여줘야 되는 거 아님?」으로 반려됐다. **값의 정본은 `references/readability.md` §1
78
+ 규칙표** 이고, 도판 층(R0~R10·R13 — 캡처 틀 문법 포함)은 `figure.mjs` 가, 글 층(R11·R12)은 렌더러 `text_scan()` 이 그 표를 그대로 센다 — 여기서는 되풀이하지 않는다. 그리는 순서는 그 문서 §3.
64
79
 
65
80
  ### 도판 예산
66
81
 
67
- 장당 80,000B · 합계 400,000B(WebP q78, 긴 변 1400px). 개념도는 1000~1200px 폭·색 3개면 40~55KB.
82
+ 상한은 서버 거절 조건이다(장당·합계 — `lim-portal-format.md` §9, 인코딩은 §11-1 「도형과 실촬 화면은 인코딩이 갈린다」).
68
83
  실제 화면 캡처는 필요한 요소만(전체 페이지 금지). 넘치면 **중복 증거 도판을 빼고 부록 자료 목록에 사유를 적는다**
69
- — 앳플리 4차에서 InBody 570 p.23(같은 주장을 970 p.12 가 담음)과 Lancet Figure 2(본문 근거 표에는 남김)를 그렇게 뺐다.
70
- 접수 화면 캡처는 1000px 로 줄여도 읽힌다.
84
+ — 같은 주장을 다른 자료가 이미 담은 도판(예: 같은 수치를 싣는 두 기종 매뉴얼 가운데 한 쪽), 본문 근거 표에 이미 남긴 논문 그림이 뺄 첫째다.
85
+ 합계는 `figure.mjs --batch plates.json --report report.json` 이 센다(장별 판정·provider·크기·누계, 90% 에서 ⚠) — 발행 거절로 알지 않는다.
71
86
 
72
87
  ## 5. 판단 요청 — 6항 이상이면 산문으로 못 고른다
73
88
 
74
89
  - **한눈표**: 항 · 지금 · 그대로 두면 · 바꾸면 — 두 길의 결과(이용자에게 보이는 변화)를 **대칭**으로 같은 칸 모양에.
75
90
  「FCG 권고」 열은 두지 않는다 — 한 길의 결과만 있는 열도 같다(실사례 2026-09-11, 고객사 결정 브리핑 「답정너 틀」 반려).
91
+ 길이 셋 이상(도안 결재형)이면 행이 선택지, 열이 **이용자가 보는 것**(모양 · 누르면 · 넘기면 · 앱의 선례)이다. 편익·해악·불확실성은
92
+ 선택지 비교 행렬 한 곳에만 둔다 — 같은 행을 두 표에 세우지 않는다(readability R12c).
93
+ **모든 행이 같은 값인 열은 열로 두지 않고 ※ 주석 한 줄로** — 선택지를 가르지 못하는 열이다.
94
+ - **대칭은 표 한 장이 아니라 문서 전체의 불변식**이다 — 선택지의 이름·수·순서가 한눈표·선택지 비교·FCG 의견 표·도판 칩·조건표에서 같고,
95
+ 선택지마다 같은 잣대로 채운다(`lim-portal-format.md` §12.3b 「선택지 대칭 불변식」).
76
96
  - **관문 흐름도**: 단계 · 정할 것 · 지금 상태 · 정하면 — 「바꾼다」가 하나라도 있으면 어느 길로 가는지.
77
97
  - 제목은 물음. 본문은 네 문장 안: 첫 문장은 기한과 두 길 이름 → 길마다 달라지는 것 → 근거 절(readability R12b). FCG 의견은 **한 절 한 자리**에만(낼지는 따로 묻는다) — 항마다 「권고안은 …」을 되풀이하지 않는다. 요청 문장은 완전한 높임(SKILL 5a).
78
- - 기한은 날짜로 적는다(「2026년 10월까지」) — 「배포 전」·「차기」만 적으면 기한 ⚠ 가 뜬다.
98
+ - 기한은 날짜나 수가 붙은 상대 기한으로 적는다(「2026년 10월까지」·「받으신 뒤 7일 안」) — 「배포 전까지」·「차기」만 적으면 기한 ⚠ 가 뜬다.
79
99
  - 항이 이용자 화면을 바꾸면(팝업·안내·칸의 유무) 글과 표만으로 묻지 않는다 — 아래 「화면 도안」 절의 도안까지 붙인다.
80
- - 집행자: 한눈표·흐름도의 유무는 렌더러 ⚠(lim-portal-format §10-1 「판단 요청 N항이 산문으로만 섭니다」) · 권고 낱말은 `gazette.py` ⚠ W1 · 열 구성(대칭인가)은 없음 — 사람의 눈(SKILL 「카피 게이트」).
100
+ - 집행자: 한눈표·흐름도의 유무는 렌더러 ⚠(lim-portal-format §10-1 「판단 요청 N항이 산문으로만 섭니다」) · 권고 낱말은 `gazette.py` ⚠ W1 ·
101
+ 결정 요청 절 표의 동일값 열은 `gazette.py` `brief_checks()` ⚠ · 선택지 기호 충돌은 `text_scan()` ⚠ · 대칭(같은 잣대·같은 틀·같은 순서)은
102
+ 독자 검토 「도판」 관점과 사람의 눈(SKILL 「카피 게이트」).
81
103
 
82
104
  ### 화면 도안 — 결정 요청이 이용자 화면의 변화를 낳으면 도안까지 (2026-09-11)
83
105
 
@@ -89,16 +111,18 @@
89
111
  | 순서 | 무엇 | 어떻게 |
90
112
  |---|---|---|
91
113
  | 1 | 규격 실측 | 고객 앱 소스에서 옮긴다 — 색 토큰 SSOT(예 `styles/global.ts` colors) · 표준 모달·안내 카드·CTA·시트의 수치 · 문구 목록의 낱말과 맺음 빈도(「닉네임」인가 「이름」인가, 「~해 주세요」인가). 추정하지 않는다 |
92
- | 2 | 도안 HTML | 화면 폭(휴대폰 375 CSS px)으로 그린다. 값·이름은 예시라고 주석에 적고, 배경이 자리 표시면 그렇게 적는다 |
93
- | 3 | 2배 PNG | `assets/mockshot.mjs <도안.html> <out.png>` — 요소를 2배 밀도로 찍는다(figure.mjs 와 같은 playwright-core·크롬) |
94
- | 4 | 관보 도판 | 도판 HTML 에 `<img>` 로 앉힌다. **전폭**(`assets[].wide: true`, 1030px) 두 칸 485px 이면 앱 12px 글자가 15.5px 로 R1 을 넘는다. 760 단 1장이면 배율 1.42 이상(12 → 17px). 표시 높이 702px 안 — 긴 화면은 위·아래 크롭 두 칸 |
95
- | 5 | 관문 | `figure.mjs --wide --img-text <화면의 가장 작은 글자 px> --img-dpr 2` ✗ 0. 전폭의 ⚠ R8 밀도 1.36 은 서버 긴 변 1400px 상한 때문이라 고정값이다 |
96
- | 6 | 원고 | 도안 표(도안 · 모양 · 누르면 · 앱의 선례 · 바꿀 것) · 문구 출처 표 · 뜨는 조건 표 · 기존 화면 흐름(번호 표식) · 「안내를 띄울 자리」 조사 건. 권고는 FCG 의견 절 한 곳에만(§5) |
97
- | 7 | 합성(선택) | Higgsfield `gpt_image_2` 에 도안 PNG 를 참조 그림(role image)으로 주면 한글 UI 글자를 보존한 채 손·기기 합성이 된다(2k·high 2 credits). 크기 감 그림 1장만, `provider: user-provided`, origin 에 「합성」 명시, 출처 줄 `source_text` 에 바탕 도안의 자리(「도안은 그림 1-2 · 규격은 건 §4.8」처럼 그림 번호·건 §)를 적는다 — W2 가 원본 위치를 센다. 크롭으로 `--img-text` 를 넘긴다 |
114
+ | 2 | 도안 HTML | 화면 폭(휴대폰 375 CSS px)으로 그린다. 값·이름이 예시인지, 배경이 자리 표시인지는 도안 HTML 머리 주석과 `origin` 에만 적는다 — 출처 줄·캡션에 올리지 않는다(readability R12e). 머리 주석은 그림 번호가 아니라 `assets[].id` 로 가리킨다 |
115
+ | 3 | 2배 PNG | `assets/mockshot.mjs <도안.html> <out.png>` — 요소를 2배 밀도로 찍는다(figure.mjs 와 같은 playwright-core·크롬). 전후 두 장은 `shot.mjs --hide … --after … --geom`, 같은 구간은 `--clip`. 원본 PDF·캡처 크롭은 도판 HTML 틀(overflow·img 오프셋)이나 `shot.mjs --clip` 으로 한다 — 외부 크롭 도구는 백지를 낸 적이 있다(R0b). `data-dpr` 은 mockshot·shot 2, 실기기 캡처는 기기 배율, PDF 추출 이미지면 1 |
116
+ | 4 | 관보 도판 | 도판 HTML 에 `<img data-dpr data-min-text>` 로 앉힌다. 두 칸이면 `pair.mjs` 가 **R13a 칸 폭**으로 짠다 — 전폭(`assets[].wide: true`) 두 칸이 본문 단 한 장보다 앱의 작은 글자를 크게 세운다(판정은 R1c). 표시 높이는 R9 안 — 긴 화면은 윗부분·아랫부분 크롭을 **좌우 두 칸**으로. 길이 여럿이면 길마다 같은 촬영 규격·같은 틀(R13a) |
117
+ | 5 | 관문 | `figure.mjs`(전폭이면 `--wide`) ✗ 0 — 밀도·최소 글자는 img 의 `data-dpr`·`data-min-text` 가 정본이고 없으면 ✗ R1c. 여러 장이면 `figure.mjs --batch` 매니페스트 한 번으로(인자를 셸 변수에 담지 않는다, readability §3). 도안 img 는 `data-dpr` 2, 실기기 캡처는 기기 배율, `data-min-text` 는 화면의 가장 작은 글자 CSS px |
118
+ | 6 | 원고 | 도안 표(도안 · 모양 · 누르면 · 앱의 선례 — 이용자가 보는 것만, §5) · 뜨는 조건 표 · 기존 화면 흐름(번호 표식) · 「안내를 띄울 자리」 조사 건. 문구 출처 표는 **독자에게 문구 수정을 청할 때만** 둔다. 조건표는 각 행을 **모든 선택지 도안과 앱 코드에 대조**한다 — 선택지마다 값이 다르면 행을 갈라 쓰고, 대조 없이 「공통」이라 적지 않는다. 화면 동작(막는다·다시 뜬다)은 코드에서 확인한 것만 적는다. 권고는 FCG 의견 절 한 곳에만(§5) |
119
+ | 7 | 합성(선택) | Higgsfield `gpt_image_2` 에 도안 PNG 를 참조 그림(role image)으로 주면 한글 UI 글자를 보존한 채 손·기기 합성이 된다(2k·high 2 credits). **크기 감을 보이는 보조 그림 1장** — 선택지 도판들 뒤, 그 절 맨 끝에 두고 선택지 도판보다 앞·크게 두지 않는다. `provider: user-provided`, 「합성」은 캡션 한 낱말(칩 옆 설명)과 `origin` 에, 출처 줄은 건 § 한 구절(W2 가 원본 위치를 센다). 칩은 도안 이름 그대로. 합성한 한 길이 FCG 의견이 권하는 길과 같으면 그림이 답을 먼저 말하므로 캡션에 목적(크기 감)을 밝히거나 뺀다. `data-dpr`·`data-min-text` 로 R1c 를 넘긴다 |
98
120
  | 8 | 반출 | Figma 는 MCP 인증이 있을 때만. 없으면 HTML 원본 경로를 문서 origin 과 핸드오프에 적고 반출은 사람 몫으로 남긴다 |
99
121
 
100
- 집행자: 없음 — 사람의 눈(process.md 7단계 표 「결정 요청에 화면 변화가 있는데 도안이 없다」). 실행 사례와 도판 넷의 실물 경로는
101
- genetics(lim) 사례 「결정 요청에 화면 변화가 따르면 고객 디자인 시스템 도안까지」에 있다.
122
+ 집행자: 도판 규격은 `figure.mjs`(R0·R0b·R1c·R13) · `pair.mjs` · 도안 사이 대칭·합성 자리·조건표와 도안의 대조는 독자 검토 「도판」 관점 ·
123
+ 도안이 있는지는 사람의 눈(process.md 7단계 표 「결정 요청에 화면 변화가 있는데 도안이 없다」). 도안 결재형 본보기는
124
+ `assets/example/report-briefing-designs.json`(세 길 · 전폭 도판 자리 · 합성 한 장 · 조건표 · 확인 요청 · 확인 프로필 — 값은 전부 자리 표시).
125
+ 실행 사례와 도판 넷의 실물 경로는 genetics(lim) 사례 「결정 요청에 화면 변화가 따르면 고객 디자인 시스템 도안까지」에 있다.
102
126
 
103
127
  ## 6. 표기 — 색은 뜻으로
104
128
 
@@ -106,19 +130,56 @@ genetics(lim) 사례 「결정 요청에 화면 변화가 따르면 고객 디
106
130
  톤 다섯: ok(끝났거나 정상) · wait(사람 판단 대기) · bad(이용자에게 나쁜 상태·오류) · info(참고) · muted(범위 밖·처리 완료).
107
131
  문단 절반이 굵으면 굵기가 위계를 못 나른다 — 절마다 한둘. 문법과 렌더는 `lim-portal-format.md` §11-6.
108
132
 
109
- ## 7. 독자 검토 — 발행 전에 다섯 관점으로 읽힌다
133
+ ## 7. 독자 검토 — 발행 전에 여덟 관점(처음 읽는 사람·결정권자·정보 디자이너·원본 대조·구조·선형 읽기·도판·사실 대조 — 상태 표를 주면 상태 대조까지 아홉)으로 읽히고, 반박 검증으로 거른다
110
134
 
111
- `references/reader-review.workflow.js` 를 Workflow 도구로 돌린다(`args: {file: <report.json 절대경로>, reader: "<독자 한 줄>", example: "<예시 한 명 한 줄>"}`).
112
- 처음 읽는 사람 · 결정권자 · 정보 디자이너 · 원본 대조 · 구조 다섯 에이전트가 원고를 읽고 「어디서 막히나 / 글로 고치면 / 그림으로 바꾸면」을
113
- severity 로 내고, 합치기 에이전트가 상위 10개로 줄인다. 앳플리 4차에서 이 검토가 용어 충돌·수치 불일치·
114
- 참조 오류(6.6 링크의 이용자 번호)·반올림 설명 오류를 잡았다 — 작성자는 못 본 것들이다.
115
- 구조 관점은 2026-09-12 에 더했다 — 네 관점 발견 55개가 「경과 / 원인」 두 PART 의 겹침을 한 건도 짚지 못했고,
116
- 더하기 처방(표·문장 추가)을 반영하자 겹침이 오히려 커졌다. 그래서 합치기는 구조 발견(PART·절 합치기·빼기)을 맨 앞에 두고,
117
- 구조 발견과 부딪히는 더하기 처방은 버린다.
135
+ `references/reader-review.workflow.js` 를 Workflow 도구로 돌린다. 배열·객체 인자는 JSON 값 그대로 넘긴다(문자열로 싸면 한 덩어리가 된다).
136
+
137
+ ```
138
+ { file: "<report.json 절대경로>",
139
+ reader: "<독자 한 줄 — 할 일이 둘이면 둘 다>", example: "<예시 한 명 한 줄>", bitmapBudget: 3,
140
+ scratch: "<측정 스크립트·풀어낸 도판을 둘 스크래치 절대경로>", plates: "<도판 HTML·PNG 작업 폴더(선택)>",
141
+ locked: ["<정해진 것 한 줄>", …], latest: "<사용자 최신 지적 원문>",
142
+ sources: [{ name, path, kind: "code|doc|pdf" }, …],
143
+ decisions: "<0단계 결정 장부 decisions.json 경로(선택)>", state: "<코드 작업 상태 표 경로(선택)>" }
144
+ ```
145
+
146
+ `sources` 는 문서마다 달라서 스킬에 경로를 적지 않는다. `state` 를 주면 여덟째 관점이 켜진다.
147
+
148
+ | 관점 | 보는 것 | 경계 |
149
+ |---|---|---|
150
+ | first-time 처음 읽는 사람 | 정의 없는 용어 · 앞 절 의존 · 한 낱말 두 값 · 긴 문단 · 산문 참조 번호 | — |
151
+ | decider 결정권자 | 판단 요청이 3초에 읽히나(물음·두 길·기한) · 수치/링크/건수 어긋남 · 답정너 틀 · **할 일마다** 표지 `meta`·현황 줄·읽는 법 첫 물음에 서나(빠지면 severity 4) · 요약면 수치 칸끼리 겹치는 집합인가 | — |
152
+ | visual 정보 디자이너 | 그림이면 한 번에 보일 곳 · 표 숫자를 되풀이하는 문단 | — |
153
+ | source 원본 대조 | 고객이 누를 수 있는 원본(`source_url`·출처 줄 주소·쪽·본문 링크)과 인용의 일치 | 앱 동작은 판정하지 않는다(facts 몫) — 다른 문서에 없다고 거짓이라 하지 않는다 |
154
+ | structure 구조 | PART 물음 ↔ 절 내용 · PART 사이 되풀이 · 요지·읽는 법 물음이 건의 관찰·판단을 바꿔 말한 곳(문장 쌍 전수) · 요지의 이야기 순서와 칸 수, 근거 문단 `body` 비움 | 처방은 빼기로 |
155
+ | figures 도판 | readability R13·§4 를 읽고 `assets[].file` PNG 를 **Read 로 연다**. 같은 이름 `.html` 이 있으면 머리 주석·CSS 를 읽는다. 두 칸이면 틀 윗선·아랫선 y 를 재어 px 차를 evidence 에. 짚을 곳 — R13 위반 · 틀 잘림(윗선 여백 0 포함) · 선택지 도안 가운데 하나만 합성·실사·크게·먼저 · 그림↔본문 반박 · 캡션 「왼쪽은…」 불일치 · 칩 이름과 캡션·표 이름 불일치 | 캡션·alt 만으로 판정하지 않는다. 서버 보관 도판은 `get_report` data URI 를 scratch 에 풀어 연다. 못 연 도판은 `unopened` 에 |
156
+ | facts 사실 대조 | FCG 내부 1차 자료로 수치를 다시 계산 · 앱 동작은 `kind:"code"` 파일:줄로만 · 결정의 주체·자리·시점은 결정 장부·`locked` 와 대조 | 판정 못 하면 미확인 |
157
+ | state 상태 대조(`state` 있을 때) | 「반영·적용·고침·보이지 않음·빠짐」 같은 완료형 문장마다 상태 표의 확인 수준(코드·시험판·실기기·운영) | — |
158
+
159
+ 단계.
160
+ 1. **Read** — 관점마다 발견 8~14개. 발견마다 `where · problem · severity · class`(사실틀림|구조|읽기|시각|묻기) `· evidence`(연 것·잰 것, 짐작이면 「추정 — 」) `· rewrite · visual`. 재서 통과한 것은 `passed[]` 에 둔다.
161
+ 2. **Verify** — severity ≥ 3 가운데 사실틀림 먼저, 그다음 severity 순으로 최대 12건. 같은 순위 안에서는 **관점마다 돌아가며** 뽑는다(뒤 관점이 상한 밖으로 밀리지 않게). 발견마다 반박 에이전트가 원본을 직접 열어
162
+ `verdict`(참|부분|거짓|미확인)·`finding_basis`(확인|추정)·`touches_locked`·`noise_kind`(없음|제작|날짜경로|판이력)를 판정한다.
163
+ 원본 위치 한 구절이 빠진 것은 노이즈가 아니다(SKILL 0.5단계 5a). severity < 3·상한 초과·검증 실패는 반영하지 않고 `raw.unverified` 로 간다.
164
+ 3. **JS 거름**(결정적) — 거짓 · 정해진 것을 되돌림 · 노이즈 처방 · 근거가 추정뿐 → `dropped[]`(사유 포함, 사람이 되살릴 수 있게). 묻기 → `questions[]`. 사실틀림은 **참·부분**일 때만 독립 항목(미확인이면 합치는 쪽으로 가 「(미확인)」이 붙는다).
165
+ 버림이 0 이면 log 에 「버림 0 — 표본 3건 재반박 권함」.
166
+ 4. **Merge** — 나머지를 같은 자리끼리 합쳐 severity 합산 상위 10. 비트맵 예산을 지키고, 더하기 처방과 structure 의 빼기 처방이 부딪히면 빼기가 이긴다.
167
+
168
+ 돌아오는 것: `{ merged: { findings[], overall }, questions[], passed[], dropped[], raw: { reads, verdicts, unverified } }`.
169
+ `merged.findings` 앞에는 **참·부분으로 판정된** 사실 틀림이 합치지 않은 독립 항목으로 서고 개수 제한 밖이다. 못 연 도판이 있으면 `overall` 머리 줄이 「⚠ 도판 N장 미열람(id…)」 — 그 도판은 사람이 연다.
170
+
171
+ **Verify 를 통과한 발견만 반영한다 — 검토자 주장도 틀린다.** 정해진 것을 되돌리거나 제작 방식·결정 날짜·판 이력을 더하라는 처방은 받지 않는다.
172
+ 반영 순서는 사실 틀림 → 구조 발견(PART·절 합치기·빼기) → 나머지.
173
+
174
+ 경위 셋. 고객사 검수 보고(2026-09-08)에서 이 검토가 용어 충돌·수치 불일치·참조 오류·반올림 설명 오류를 잡았다 — 작성자는 못 본 것들이다.
175
+ 구조 관점은 2026-09-12 — 네 관점 발견 55개가 「경과 / 원인」 두 PART 의 겹침을 한 건도 짚지 못했고, 더하기 처방을 반영하자 겹침이 커졌다.
176
+ 도판·사실 대조 관점과 Verify 는 2026-09-14 — 캡션만 읽은 검토가 틀 대칭 결함을 0건 짚었고, 검토자의 틀린 주장·정해진 것 되돌리기·노이즈 처방이
177
+ 거르지 않은 채 작성자에게 올라갔다.
118
178
 
119
179
  ## 8. 실물 확인 — dry_run 경고 0 이 목표, 그 다음은 눈
120
180
 
121
- 1. 로컬 `render.py` 와 `update_report(dry_run: true)` — §10-1 경고가 0 이 될 때까지 원고를 고친다(요청 자리의 경어체 경고는 의도).
181
+ 1. 로컬 `render.py` 와 `update_report(dry_run: true)` — 통과 기준(`lim-portal-format.md` §10 「통과 = 작성자 몫 ⚠0」)이 될 때까지 원고를 고친다.
182
+ 단 경고가 규칙의 뜻과 어긋나는 자리를 짚으면(남의 문서 절 번호를 이 문서의 뒤 절로 세는 것처럼) 원고를 깎지 않는다 — 오탐으로 판정해 렌더러를 고치고 대조군 시험을 둔다. 그 수리가 운영에 오르기 전이면 번호 대신 이름으로 위치를 살린다. 렌더러·서버 관문이 운영보다 앞선 동안 옛 규칙이 내는 경고는 `lim-portal-format.md` §10 통과 기준 표의 행으로 넘긴다.
122
183
  2. 발행 뒤 **열람 주소를 실제로 연다**(Cursor 인앱 브라우저 `iab` 나 헤드리스 크롬). 그림 수·이미지 로드 수·표·흐름도·차트 수를 세고
123
184
  판단 절과 그림 절을 캡처로 본다. 「구조 확인 outline」은 블록이 섰는지만 말하지 보이는지는 말하지 않는다.
124
185
  3. 큰 원고(70KB 이상)는 채팅에 붙여넣지 말고 MCP 서버를 자식으로 띄워 파일 인자로 보낸다