genetics-mcp 2.9.0 → 2.9.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.
- package/bin/aarch64-apple-darwin/gcell +0 -0
- package/bin/aarch64-unknown-linux-musl/gcell +0 -0
- package/bin/manifest.json +4 -4
- package/bin/x86_64-apple-darwin/gcell +0 -0
- package/bin/x86_64-unknown-linux-musl/gcell +0 -0
- package/genetics.mjs +171 -18
- package/package.json +1 -1
- package/skills/genetics-cell-id/SKILL.md +186 -0
- package/skills/genetics-report/SKILL.md +212 -93
- package/skills/genetics-report/assets/example/cases.json +19 -22
- package/skills/genetics-report/assets/example/report.json +198 -53
- package/skills/genetics-report/assets/render.py +21 -10
- package/skills/genetics-report/assets/subset_font.py +24 -8
- package/skills/genetics-report/references/content-pipeline.md +316 -733
- package/skills/genetics-report/references/design-system.md +20 -723
- package/skills/genetics-report/references/font-embedding.md +132 -108
- package/skills/genetics-report/references/illustrations.md +20 -462
- package/skills/genetics-report/references/lim-portal-format.md +623 -185
- package/skills/genetics-report/references/process.md +414 -403
- package/skills/genetics-report/references/qa.md +28 -712
- package/skills/genetics-report/assets/generate-illustrations.py +0 -159
- package/skills/genetics-report/assets/qa.py +0 -198
- package/skills/genetics-report/assets/visual-baseline.py +0 -459
- package/skills/genetics-report/references/textbook-mode.md +0 -111
- package/skills/genetics-report/references/wysiwyg.md +0 -751
|
@@ -8,11 +8,14 @@ description: |
|
|
|
8
8
|
- "수정 내역을 케이스별로 정리해서 문서로 만들어줘"
|
|
9
9
|
- "고객이 우리가 뭘 했는지 모른다, 정리해서 보내야 한다"
|
|
10
10
|
- "검수 요청 문서 만들어줘" / "장애 사후 보고서 / 릴리스 노트를 고객용으로"
|
|
11
|
-
- "기술보고서/인수인계/온보딩 문서/포스트모템 만들어줘" (→
|
|
12
|
-
내용 설계(독자 정의 → 등급 → 고객 언어 치환)가 본체이고, 전달은 둘 중 하나입니다:
|
|
13
|
-
Lim MCP 발행(서버 렌더, 링크 공유) 또는 단일 HTML(
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
- "기술보고서/인수인계/온보딩 문서/포스트모템 만들어줘" (→ PART 구성으로 푼다)
|
|
12
|
+
내용 설계(독자 정의 → 등급 → 고객 언어 치환 → 개조식 전환)가 본체이고, 전달은 둘 중 하나입니다:
|
|
13
|
+
Lim MCP 발행(서버 렌더, 링크 공유) 또는 단일 HTML(같은 관보 서식·폰트 임베드).
|
|
14
|
+
서식은 **한국 정부간행물(관보) 문서 문법**입니다 — 표지·발행 이력·차례·활용법·요약·PART 간지·
|
|
15
|
+
두 단 본문(여백 주석)·부록·판권지로 서고, 인쇄하면 실제 A4 페이지가 나옵니다.
|
|
16
|
+
[책임 경계] vs gazette-report: 저 스킬=조판 규칙의 원전(활자·괘선·인쇄·검사기), 이 스킬=그 문법을 포털 데이터로 채우는 법과 내용 설계.
|
|
17
|
+
[책임 경계] vs moai-officer:doc-pptx: 저 스킬=발표용 .pptx 파일, 이 스킬=읽고 검수하는 문서.
|
|
18
|
+
version: "4.0.0"
|
|
16
19
|
---
|
|
17
20
|
|
|
18
21
|
# Lim 보고서 생성 (genetics-report)
|
|
@@ -39,8 +42,8 @@ version: "2.0.0"
|
|
|
39
42
|
|
|
40
43
|
| 경로 | 언제 | 방법 |
|
|
41
44
|
|---|---|---|
|
|
42
|
-
| **Lim 포털 발행 ·
|
|
43
|
-
| 단일 HTML 파일 | 메일 첨부·사내망 열람·Lim 밖
|
|
45
|
+
| **Lim 포털 발행 · 관보 문서 문법** (고객사에 나가는 정식 문서) | 링크로 열람시키는 검수·보고 문서 | `publish_report` — **서식은 서버가 정한다**(고를 인자가 없다) → **`references/lim-portal-format.md` 필독** |
|
|
46
|
+
| 단일 HTML 파일 | 메일 첨부·사내망 열람·Lim 밖 고객 — 링크를 못 여는 상대 | `assets/render.py` — **레포 렌더러를 부른다**(사본 없음). 같은 관보 서식으로 나간다. 외부 리소스 0, 폰트 임베드 |
|
|
44
47
|
|
|
45
48
|
> **도구 이름은 접두사 없이 적는다.** 실제로는 `mcp__<설정키>__publish_report` 로 보이는데,
|
|
46
49
|
> 그 `<설정키>` 는 **사람이 MCP 를 붙일 때 정한 값**이라 기계마다 다르다. 여기 박아 두면
|
|
@@ -48,12 +51,25 @@ version: "2.0.0"
|
|
|
48
51
|
> 때마다 「없는 도구를 부르는 스킬」이 남의 기계로 배급된다(2026-08-20 개명 때 드러난 자리).
|
|
49
52
|
> 도구 목록은 어차피 보이니 **목록에서 그 이름을 찾아 부른다.**
|
|
50
53
|
|
|
51
|
-
>
|
|
52
|
-
>
|
|
53
|
-
>
|
|
54
|
-
>
|
|
54
|
+
> **포털 서식은 관보(정부간행물) 문서 문법이다** (2026-08-24 전환).
|
|
55
|
+
> 표지 · 발행 이력 · 차례 · 이 문서 읽는 법 · 요약 · PART 간지 · 절(두 단 + 여백 주석) ·
|
|
56
|
+
> 부록 · 판권지로 서고, 인쇄하면 실제 A4 페이지가 나온다.
|
|
57
|
+
>
|
|
58
|
+
> **가구만 채우면 반려된다.** 셋이 본체다 —
|
|
59
|
+
> ① `sections[].marg`(여백 주석 Why/Key Point/Advice) ② `parts`(PART 층위) ③ **개조식 톤**.
|
|
60
|
+
> 없어도 발행은 되지만 렌더러가 ⚠ 로 세므로 `dry_run` 경고를 반드시 읽는다.
|
|
61
|
+
>
|
|
62
|
+
> **비트맵은 두 자리에 실린다** — `logo`(표지 고객사 마크)와 `figure`(절 본문 도판).
|
|
63
|
+
> 도판은 관보의 그림 문법으로 서고(그림 번호·캡션·출처), `sections[].plates` 에 그 id 를
|
|
64
|
+
> 적어야 자리가 생긴다. 직접 촬영한 화면은 `assets[].file` 에 **로컬 절대경로**를 준다 —
|
|
65
|
+
> MCP 가 읽어 규격대로 굳혀 보낸다(바이트를 도구 인자로 싣지 않는 것은 `source` 와 같다).
|
|
66
|
+
> `hero`·`chapter`·`eof` 는 여전히 자리가 없다.
|
|
67
|
+
> 요약 근거(`§n.n`)가 없으면 서버가 발행을 거절하는 것은 그대로다.
|
|
68
|
+
> 자세한 것은 `references/lim-portal-format.md`. 조판 규칙 원전은 `gazette-report` 스킬.
|
|
55
69
|
|
|
56
70
|
**Lim 발행 규칙** (어겨도 서버가 거부하지만, 알고 시작할 것):
|
|
71
|
+
- **톤은 개조식이다** — `~함 / ~했음 / ~필요 / ~한 상황`. `~합니다 / ~해 주세요` 아님.
|
|
72
|
+
본문에 `습니다|십시오|합니다|입니다|됩니다|주세요` 가 **0건**이어야 한다.
|
|
57
73
|
- `tenant` 는 키가 가리키는 고객사와 일치해야 한다(오발행 방지 가드).
|
|
58
74
|
- `sections[].kind` 는 `summary|status|cases|asks|note` 다섯 가지뿐 — 그 밖의 값은 절이 통째로 사라지므로 서버가 거절한다.
|
|
59
75
|
- `cases[].grade` 는 `grades` 에 정의된 이름이어야 한다.
|
|
@@ -66,26 +82,32 @@ version: "2.0.0"
|
|
|
66
82
|
| 성질 | 이유 |
|
|
67
83
|
|---|---|
|
|
68
84
|
| 단일 HTML · 외부 리소스 0 | 메일 첨부·사내망 열람이 목적이다. CDN 은 방화벽·오프라인에서 죽는다 |
|
|
69
|
-
| 한글 폰트 임베드 (
|
|
70
|
-
| 문서 안에
|
|
85
|
+
| 한글 폰트 임베드 (409KB) | 고객 PC 에 Pretendard 가 없으면 맑은 고딕으로 떨어져 인상이 통째로 달라진다 |
|
|
86
|
+
| 문서 안에 스크립트 0 | 열람 CSP 가 막는다. 편집기도 없다 — 문구를 고치려면 `report.json` 을 고쳐 다시 굽는다 |
|
|
71
87
|
| 고객본 / 내부본 분리 | 내부 메모를 남겨 두고도 고객본에서는 빠진 채로 내보낸다 |
|
|
72
|
-
|
|
|
88
|
+
| 조판 검사 8종 통과 필수 | 대비 미달·빠진 블록·용어 유출은 **눈으로 못 잡는다** |
|
|
73
89
|
|
|
74
|
-
## 두 가지
|
|
90
|
+
## 두 가지 독자 — 뼈대는 하나다
|
|
75
91
|
|
|
76
|
-
|
|
77
|
-
|---|---|---|---|
|
|
78
|
-
| 판정한다 (검수·회신·결재) | 검수 보고서 | 요약 → 등급·판정표 → 건별 카드 → 확인 요청 | 이 문서 아래 전체 |
|
|
79
|
-
| **배운다** (유지보수·인수·온보딩·사후분석) | **교과서** | 학습목표 → 원리 → 붕괴(예제 풀이) → 처방 → 적용 → 연습 → 부록 대장 | `references/textbook-mode.md` **필독** |
|
|
92
|
+
서식은 하나뿐이므로 **뼈대를 바꾸지 않는다.** 바뀌는 것은 PART 를 무엇으로 가르느냐다.
|
|
80
93
|
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
| 독자의 일 | PART 를 무엇으로 가르나 | 절의 kind |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| 판정한다 (검수·회신·결재) | 요청 / 경과 / 잔여 | `asks` → `summary` → `status` → `cases` → `note` |
|
|
97
|
+
| **배운다** (유지보수·인수·온보딩·사후분석) | 원리 / 붕괴와 처방 / 적용과 남은 것 | 같은 다섯 kind 를 그 순서로 쓴다 |
|
|
98
|
+
|
|
99
|
+
`kind:"lesson"` 같은 것은 **없다.** 서버가 발행 단계에서 거절한다.
|
|
100
|
+
가르치는 문서도 다섯 kind 로 푼다 — 자세한 것은 `references/lim-portal-format.md` §12.
|
|
101
|
+
|
|
102
|
+
가르치는 문서에서 검수 뼈대에 스타일만 입히는 것은 반려된 실패 사례다.
|
|
103
|
+
**부분마다 좋아졌는데 전체는 그대로였다** — 심슨의 역설이다.
|
|
104
|
+
독자 정의(0단계) 직후 PART 구성부터 정하고, **절 구성이 확정되기 전에 문구를 다듬지 않는다.**
|
|
83
105
|
|
|
84
106
|
## 트리거 키워드
|
|
85
107
|
|
|
86
108
|
Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청, 처리 현황, 릴리스 노트,
|
|
87
109
|
사후 보고, 납품 보고, QC 보고, 이슈 정리, 대응 결과, 제안서 수준 문서, **기술보고서,
|
|
88
|
-
인수인계, 온보딩 문서, 포스트모템, "다음 사람이 읽고 이해해야 하는 문서"**
|
|
110
|
+
인수인계, 온보딩 문서, 포스트모템, "다음 사람이 읽고 이해해야 하는 문서"**
|
|
89
111
|
|
|
90
112
|
---
|
|
91
113
|
|
|
@@ -100,15 +122,20 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
100
122
|
|
|
101
123
|
독자가 정해지면 나머지가 전부 따라 정해진다. 같은 사실이 이렇게 갈린다.
|
|
102
124
|
|
|
103
|
-
|
|
125
|
+
**두 가지를 동시에 바꾼다** — 내부 용어를 고객 용어로, 그리고 문체를 개조식으로.
|
|
126
|
+
|
|
127
|
+
| 내부 기록 | 고객 문서(개조식) |
|
|
104
128
|
|---|---|
|
|
105
|
-
| "저장 경로 6곳을 수정" | "저장이 일어나는 모든 경로를
|
|
106
|
-
| "2026-08-09 운영 배포 완료" | "2026년 8월 9일 운영 환경에
|
|
107
|
-
| "별도 티켓으로 분리" | "
|
|
108
|
-
| "회귀 테스트 2건 추가" | "같은 문제가 다시 나타나면
|
|
109
|
-
| "RN 앱 토큰 부활 경합" | "로그아웃 직후 이전 로그인 상태로 되돌아가던
|
|
129
|
+
| "저장 경로 6곳을 수정" | "저장이 일어나는 모든 경로를 수정**함**" |
|
|
130
|
+
| "2026-08-09 운영 배포 완료" | "2026년 8월 9일 운영 환경에 반영**됨**" |
|
|
131
|
+
| "별도 티켓으로 분리" | "04-3에 따로 정리**함**" |
|
|
132
|
+
| "회귀 테스트 2건 추가" | "같은 문제가 다시 나타나면 걸러지도록 상시 점검 **적용**" |
|
|
133
|
+
| "RN 앱 토큰 부활 경합" | "로그아웃 직후 이전 로그인 상태로 되돌아가던 **상황**" |
|
|
134
|
+
| "인증서를 설치해 주셔야 합니다" | "인증서 설치 **필요**" |
|
|
110
135
|
| 티켓 번호 `1217296144360763` | (싣지 않는다. 고객이 아는 참조는 본인이 제보한 원본 링크뿐) |
|
|
111
136
|
|
|
137
|
+
문체를 안 바꾸면 관보 문법 위에서 겉돈다 — **낱말이 아니라 조판의 문제**이고, 검수기가 센다.
|
|
138
|
+
|
|
112
139
|
독자를 안 정하고 만들면 개발 로그에 색만 칠한 물건이 나온다. 실제로 그렇게 한 번 만들었고,
|
|
113
140
|
"개발팀 내부적인 작업 시나리오까지 섞어서 보고서로 보내고 있다"는 지적을 받았다.
|
|
114
141
|
|
|
@@ -140,58 +167,125 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
140
167
|
|
|
141
168
|
**확인 못 한 것을 확인한 것처럼 쓰지 않는다.** 등급이 낮아 보이는 게 싫어서 올리면, 나중에 그 한 건이 문서 전체의 신뢰를 깎는다.
|
|
142
169
|
|
|
143
|
-
### 3.
|
|
170
|
+
### 3. 색은 고르지 않는다 — 뜻으로 정해진다
|
|
144
171
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
|
149
|
-
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
172
|
+
**포털 발행에는 팔레트 인자가 없다.** 관보 서식은 자기 색 체계를 통째로 갖고,
|
|
173
|
+
장 색은 그 절이 무엇인가로 정해진다(`sections[].tone`).
|
|
174
|
+
|
|
175
|
+
| tone | 뜻 | 기본으로 붙는 kind |
|
|
176
|
+
|---|---|---|
|
|
177
|
+
| `you` | 독자 몫 | `asks` |
|
|
178
|
+
| `deep` | 요지 | `summary` |
|
|
179
|
+
| `neutral` | 허브 — 상태에 안 속함 | `status` |
|
|
180
|
+
| `done` | 끝난 것 | `cases` |
|
|
181
|
+
| `wait` | 대기 | — |
|
|
182
|
+
| `hold` | 유보 — 색 없이 파선 | `note` |
|
|
154
183
|
|
|
155
|
-
|
|
156
|
-
|
|
184
|
+
생략하면 `kind` 가 정한다. **원전 PDF 의 파스텔을 베끼지 마라** — 색은 그 문서가 이미
|
|
185
|
+
쓰는 상태색을 승격한 것이지 옮겨 온 팔레트가 아니다.
|
|
157
186
|
|
|
158
|
-
|
|
187
|
+
팔레트 층은 **존재하지 않는다.** 서버가 팔레트 유도기를 지문에서 뺐고
|
|
188
|
+
(`report_publish.php`), 렌더러도 `styles(..., tokens=False)` 로 부른다 — 유도 토큰이
|
|
189
|
+
문서에 안 실린다. 고를 자리가 없으니 고르려 하지 마라.
|
|
159
190
|
|
|
160
191
|
### 4. 뼈대 쓰기 → `report.json`
|
|
161
192
|
|
|
162
|
-
|
|
163
|
-
|
|
193
|
+
**관보 골격은 순서가 정해져 있다.** 바꾸지 않는다.
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
표지 → 발행 이력 → 차례 → 이 문서 읽는 법 → 요약
|
|
197
|
+
→ PART 간지 → 절(간지 + 두 단 본문) → … → 부록 → 판권지
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
절은 다섯 kind 로 쓴다(`summary`·`status`·`cases`·`asks`·`note`).
|
|
201
|
+
요약면의 요지는 **4칸**으로 쓴다 — 검수자가 첫 화면에서 판단을 끝낼 수 있어야 한다.
|
|
164
202
|
|
|
165
203
|
1. 접수한 것은 어떻게 됐는가
|
|
166
204
|
2. 우리가 추가로 찾은 것 중 중요한 것
|
|
167
|
-
3. 여러 건을 관통하는 공통 원인
|
|
205
|
+
3. 여러 건을 관통하는 공통 원인
|
|
168
206
|
4. 상대가 무엇을 하면 되는가
|
|
169
207
|
|
|
208
|
+
그리고 **절마다 여백 주석 세 줄**을 쓴다. 이것이 안 채워지면 두 단 본문이 한 단으로
|
|
209
|
+
서고, 문서는 「문서처럼 꾸민 웹페이지」로 되돌아간다.
|
|
210
|
+
|
|
211
|
+
- `marg.why` — 그 절을 **왜** 읽는가. 독자가 실제로 던질 질문 그대로
|
|
212
|
+
- `marg.key` — 이 절에서 하나만 가져간다면 그것
|
|
213
|
+
- `marg.advice` — 어디를 참조해야 하는지
|
|
214
|
+
|
|
215
|
+
**번호는 데이터가 아니라 자리가 정한다.** `sections[].no`·`id` 를 적어도 렌더러가 안 읽고
|
|
216
|
+
배열 순서로 `ch`·앵커를 만든다(`gazette.py:794·811`). 찍히는 것은 `label` 하나다.
|
|
217
|
+
`summary` 의 `§n.n` 은 서버가 `groups[].no` 로 검사하므로 **`groups[].no` 를 그 절의 자리와
|
|
218
|
+
같게** 맞춘다 — 어긋나면 게이트는 통과하고 링크가 헛짚는다.
|
|
219
|
+
|
|
220
|
+
**등급은 4단 이하.** 5번째부터 최약 표식으로 눌린다(`gazette.py:751-762`).
|
|
221
|
+
그리고 `cases` 가 비면 `summary` 를 못 쓴다 — 근거 게이트가 전 문단을 거절한다.
|
|
222
|
+
|
|
223
|
+
→ 칸 하나하나: `references/lim-portal-format.md`
|
|
224
|
+
|
|
170
225
|
### 5. 전달 — Lim 발행 (기본 경로)
|
|
171
226
|
|
|
172
227
|
report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
173
|
-
(스키마가 곧 이 스킬의 데이터 모델이다 — `tenant`·`slug`
|
|
228
|
+
(스키마가 곧 이 스킬의 데이터 모델이다 — `tenant`·`slug` 필수).
|
|
174
229
|
서버가 렌더하므로 **HTML 을 만들지 않는다.**
|
|
175
230
|
|
|
176
|
-
|
|
231
|
+
**`dry_run: true` 로 먼저 태우고 `warnings` 를 읽는다.** 그것이 실질적 유일한 품질 관문이다.
|
|
232
|
+
서버는 「빈 칸」을 안 막는다 — 막는 것은 **조용히 사라지는 것**뿐이고, 관보의 본체가
|
|
233
|
+
빠지면 ⚠ 로 소리 내어 센다. `marg` 가 비었다는 경고를 못 보고 넘기면 두 단이 한 단으로 선다.
|
|
234
|
+
|
|
235
|
+
**기본은 초안이다.** 도구가 `publish` 를 참으로 주지 않는 한 고객에게 안 보인다.
|
|
236
|
+
확인한 뒤 `release_report(id)` 로 연다 — 그것이 사람의 승인 행위다.
|
|
237
|
+
|
|
177
238
|
수정은 `get_report` → 데이터 수정 → `update_report` — **같은 링크가 새 내용을 가리킨다.**
|
|
178
239
|
|
|
179
|
-
### 5
|
|
240
|
+
### 5-1. 발행 뒤 판정 — 블록 목록으로 본다
|
|
241
|
+
|
|
242
|
+
브라우저를 안 열고 「무엇을 냈는가」를 확인하는 창구는 `get_report(id, outline: true)` 다.
|
|
243
|
+
|
|
244
|
+
| 블록 목록에 보이면 | 판정 |
|
|
245
|
+
|---|---|
|
|
246
|
+
| `header.cover` · `section.hist` · `nav.toc` · `section.guide` · `section.pt` · `aside.marg` · `div.colophon` | 관보 |
|
|
247
|
+
| `figure.eof-endcard` | **옛 서식** — 관보는 꼬리 카드를 안 붙인다 |
|
|
248
|
+
|
|
249
|
+
`aside.marg` 개수가 **절 수와 같아야 한다.** 모자라면 그만큼의 절이 한 단으로 서 있다.
|
|
250
|
+
|
|
251
|
+
⚠ **머리줄의 `절 0 · 건 0 · 장 0 · 그림 0` 은 정상값이다.** MCP 요약 줄이 옛 서식 클래스
|
|
252
|
+
(`h2.sec`·`.case`·`.ch-open`·`<img>`)만 세는데 관보는 그중 무엇도 안 쓴다. 실측(예시 문서):
|
|
253
|
+
전부 0 이면서 실제로는 `ask` 1 · `sheet` 2 · `board` 1 이었다. **0 을 「비었다」로 읽지 마라.**
|
|
254
|
+
|
|
255
|
+
### 5′. 전달 — 단일 HTML (Lim 밖 고객·메일 첨부)
|
|
180
256
|
|
|
181
257
|
```bash
|
|
182
258
|
python3 ~/.claude/skills/genetics-report/assets/render.py report.json
|
|
183
|
-
# 브랜드 서식으로:
|
|
184
|
-
python3 ~/.claude/skills/genetics-report/assets/render.py report.json --template lim-report
|
|
185
|
-
python3 ~/.claude/skills/genetics-report/assets/qa.py report.json # 실패 0 이어야 통과
|
|
186
259
|
```
|
|
187
260
|
|
|
261
|
+
**`build.py` 를 직접 부르지 마라.** `render.py` 가 서버 등록부에서 서식을 읽어
|
|
262
|
+
render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가 실리고, 스타일이 없는 문서가
|
|
263
|
+
대비 검사를 그냥 통과해 **거짓 초록**이 된다.
|
|
264
|
+
`report.json` 에 `css`·`render`·`palette` 를 적을 필요가 없다 — 적으면 서버와 갈린다.
|
|
265
|
+
|
|
188
266
|
자동 검수가 통과해도 **반드시 브라우저로 열어 본다.** 자동 검수는 "안 보이는 결함"을 잡고,
|
|
189
267
|
눈은 "보이는 결함"을 잡는다. 실제로 자동 검수를 다 통과한 문서에서 눈으로만 잡힌 것들:
|
|
190
|
-
안 보이는 배지, 빈 목록 항목, 한국어 낱말 중간
|
|
191
|
-
→ 검수 항목 전체: `references/qa.md`
|
|
268
|
+
안 보이는 배지, 빈 목록 항목, 한국어 낱말 중간 줄바꿈.
|
|
192
269
|
|
|
193
270
|
파일 하나를 그대로 보낸다. 상대는 더블클릭만 하면 된다.
|
|
194
|
-
|
|
271
|
+
|
|
272
|
+
### 5″. 조판 검사 — `gazette-report` 스킬의 8종
|
|
273
|
+
|
|
274
|
+
| 검사기 | 무엇을 잡는가 |
|
|
275
|
+
|---|---|
|
|
276
|
+
| `kcheck.mjs` | 대비(알파·조상 opacity 합성) · 제목 레벨 · 표 접근명 · 앵커 · 7폭 넘침 |
|
|
277
|
+
| `read.mjs` | 한글 자폭 실측 글자/줄 · 행간 · 본문 대비 |
|
|
278
|
+
| `tone.mjs` | 경어체 잔존 · 늘어짐 지표 · **한 문장 한 줄** |
|
|
279
|
+
| `fontchk.mjs` | 렌더된 활자 크기·굵기 분포 |
|
|
280
|
+
| `flexcheck.mjs` | flex/grid 안에서 문장이 토막 나는 곳 |
|
|
281
|
+
| `cssaudit.sh` | 활자 스케일 · 간격 격자 · 표 마감 · 미봉책 |
|
|
282
|
+
| `pdfcheck.sh` | 실제 PDF 쪽 구조 |
|
|
283
|
+
| `contentdiff.sh` | 조판이 본문·id·앵커를 바꿨는지 |
|
|
284
|
+
|
|
285
|
+
실행법은 `gazette-report` 스킬에 있다. 여기 두 벌로 두지 않는다.
|
|
286
|
+
|
|
287
|
+
**0표본 통과는 통과가 아니다.** 표본 수를 함께 본다.
|
|
288
|
+
그리고 **폰트가 큰 문서는 두 번 재라** — 409KB 폰트 적재 경합으로 첫 실행이 오탐을 낸다(실측).
|
|
195
289
|
|
|
196
290
|
---
|
|
197
291
|
|
|
@@ -199,13 +293,13 @@ python3 ~/.claude/skills/genetics-report/assets/qa.py report.json # 실패 0
|
|
|
199
293
|
|
|
200
294
|
| 파일 | 역할 |
|
|
201
295
|
|---|---|
|
|
202
|
-
| `assets/render.py` | `report.json` → 단일 HTML.
|
|
203
|
-
| `assets/palette.py` | 팔레트 6색 → 대비 보장 CSS 토큰 유도. 단독 실행하면 전 팔레트 감사 |
|
|
204
|
-
| `assets/report.css` | 구조 스타일시트. 색 토큰은 선언하지 않는다 |
|
|
205
|
-
| `assets/editor.js` / `editor.css` | 위지윅 편집 레이어 |
|
|
206
|
-
| `assets/qa.py` | 자동 검수 |
|
|
296
|
+
| `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지 마라 |
|
|
207
297
|
| `assets/subset_font.py` | 폰트 서브셋 생성 (보통 실행 불필요) |
|
|
208
|
-
|
|
|
298
|
+
| `assets/example/report.json` · `cases.json` | 관보 필드를 전부 채운 본보기. 새 문서는 여기서 베낀다 |
|
|
299
|
+
| 폰트 | **레포** `private/builder/fonts/pretendard-gazette.woff2` — 가변 1면 |
|
|
300
|
+
|
|
301
|
+
**스킬에는 렌더러도 스타일시트도 검사기도 없다.** 셋 다 레포와 `gazette-report` 스킬에 있고,
|
|
302
|
+
여기 사본을 두면 레포만 자라 조용히 갈린다 — 위 「렌더러는 레포에 하나뿐이다」.
|
|
209
303
|
|
|
210
304
|
새 프로젝트에서 손대는 파일은 **`report.json` 과 `cases.json` 둘뿐**이다.
|
|
211
305
|
|
|
@@ -217,25 +311,46 @@ python3 ~/.claude/skills/genetics-report/assets/qa.py report.json # 실패 0
|
|
|
217
311
|
2. **`§` 같은 기호를 본문에 노출하지 않는다.** 원고에서는 참조 마커로 쓰되 렌더에서 지운다(빌드가 처리).
|
|
218
312
|
3. **개발 절차 서술을 빼거나 고쳐 쓴다.** 배포·티켓 분리·테스트 추가·설계 검토안은 고객의 관심사가 아니다.
|
|
219
313
|
4. **확인 못 한 범위를 반드시 적는다.** 감추면 다음 보고서까지 못 믿게 된다.
|
|
220
|
-
5.
|
|
221
|
-
|
|
314
|
+
5. **개조식으로 쓴다.** `~함 / ~했음 / ~필요 / ~한 상황`. 본문에
|
|
315
|
+
`습니다|십시오|합니다|입니다|됩니다|주세요` 가 0건이어야 한다. 문체를 안 바꾸면
|
|
316
|
+
관보 문법 위에서 겉돈다 — 낱말이 아니라 **조판**의 문제다.
|
|
317
|
+
5b. **한글은 마침표에서 줄을 바꾼다.** 문장을 이어 붙인 한글 문단은 개조식으로 고쳐도
|
|
318
|
+
여전히 기계가 쓴 글로 읽힌다. **줄만 바꾸면 부족하다** — 실측(문장 296개)에서 26%가
|
|
319
|
+
글줄 폭을 넘어 접혔고 좁은 단은 54%였다. 접히면 둘째 줄과 다음 문장을 구별할 수 없다.
|
|
320
|
+
그래서 문장마다 블록으로 세우고 이어지는 줄만 내어쓴다
|
|
321
|
+
(`.sn { display:block; padding-left:1em; text-indent:-1em }`).
|
|
322
|
+
적용은 `gazette-report` 의 `scripts/sentbreak.py --apply`, 검사는 `tone.mjs`.
|
|
323
|
+
⚠ 라벨-값 양식 행·차례 항목·상태 칩에는 적용하지 않는다 — 산문만이다.
|
|
324
|
+
6. **절마다 여백 주석 세 줄(`marg`)을 채운다.** 그것이 두 단 본문의 본체다.
|
|
325
|
+
다만 **채우려고 넣으면 안 넣느니만 못하다** — 독자가 실제로 던질 질문이어야 한다.
|
|
222
326
|
7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예: "이 버튼은 실제로 고객에게 알림톡이 나갑니다")
|
|
223
327
|
8. **포털이 이미 주는 것을 문서 안에 만들지 않는다.** 검토 회신(댓글)·핵심 요약·진척률 바·상단 바는
|
|
224
328
|
포털 셸이 문서 **둘레**에 놓는다. 문서에 「댓글로 알려 주세요」를 쓰거나 요약 팝업을 흉내 내면
|
|
225
|
-
같은 것이 두 번 있게 된다 — `references/lim-portal-format.md`
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
329
|
+
같은 것이 두 번 있게 된다 — `references/lim-portal-format.md` 9절.
|
|
330
|
+
같은 이유로 **문서 안에 스크립트가 없다**(열람 CSP). 머리띠는 「지금 어디인가」를
|
|
331
|
+
주장하지 않는다 — 알 수 없는 것을 적으면 거짓말이라서다.
|
|
332
|
+
8b. **근거 화면은 싣는다.** 검수 보고에서 확인 화면을 못 실으면 그 문서는 「보여 주는」
|
|
333
|
+
수단을 잃는다 — 신뢰는 한계를 남김없이 적어서가 아니라 보여 줘서 생긴다.
|
|
334
|
+
`role: figure` · `provider: user-provided` · `origin`(누가 제공했는지 — **비우면 거절된다**)
|
|
335
|
+
으로 두고 `file` 에 로컬 절대경로를 주면
|
|
336
|
+
화질을 계단으로 내려 예산(장당 80,000B) 안에 앉힌다. `sections[].plates` 에 id 를
|
|
337
|
+
적어야 자리가 선다. 캡션은 **이 화면에서 무엇을 보라는 것인지**를 적는다 —
|
|
338
|
+
본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
|
|
339
|
+
다만 `hero`·`chapter`·`eof` 는 자리가 없다. 표지의 빈
|
|
340
|
+
마당은 미완성이 아니라 문법이고, 문서는 판권지로 닫는다(꼬리 카드가 없다).
|
|
341
|
+
도해가 필요하면 내용에서 도출된 것만 CSS·인라인 SVG 로.
|
|
342
|
+
9. **이 스킬에 특정 고객사의 도메인 지식을 적지 않는다.** 다음 문서는 다른 업종·다른 테넌트다.
|
|
343
|
+
스킬은 **어떻게 할지**만 정하고 **무엇을 쓸지**는 그 문서의 데이터가 정한다.
|
|
344
|
+
|
|
345
|
+
| 스킬에 적는 것 | 그 문서(`report.json`)에 적는 것 |
|
|
230
346
|
|---|---|
|
|
231
|
-
|
|
|
232
|
-
|
|
|
233
|
-
|
|
|
347
|
+
| 절 구성의 **형식**, 여백 주석의 **구조**, 검수 **절차** | 절 제목, 건별 사실, 확인 요청 |
|
|
348
|
+
| 「독자가 실제로 던질 질문을 적어라」는 **규칙** | 그 질문들 |
|
|
349
|
+
| 등급을 **가르는 기준** | 어느 건이 어느 등급인가 |
|
|
234
350
|
|
|
235
|
-
실패 사례(2026-08-17):
|
|
236
|
-
|
|
237
|
-
**전량
|
|
238
|
-
색·밴드·아이콘은 전부 **팔레트와 그 문서에서** 온다.
|
|
351
|
+
실패 사례(2026-08-17): 스킬 표에 체중계·팔근육 같은 특정 업종 아이콘을 적어 두었고,
|
|
352
|
+
검수기에는 그 테넌트의 강조색 hex 를 상수로 박아 두었다. 강조색이 다른 테넌트에서
|
|
353
|
+
**전량 오판정**했다. 스킬에 값을 박으면 다음 고객에서 터진다.
|
|
239
354
|
|
|
240
355
|
## 흔한 실패 모드
|
|
241
356
|
|
|
@@ -244,11 +359,14 @@ python3 ~/.claude/skills/genetics-report/assets/qa.py report.json # 실패 0
|
|
|
244
359
|
| "플랫하게 해달라" → 밋밋해짐 | 그림자를 없애랬더니 색면까지 없앰 | 플랫은 깊이(그림자·베벨)를 없애는 것이지 **색면을 없애는 게 아니다** |
|
|
245
360
|
| 색을 칠했는데도 안 읽힘 | 산문이 한 덩어리 | 열거는 번호를 세우고 긴 산문은 두 문장씩 끊는다 (빌드가 처리) |
|
|
246
361
|
| "웹앱 같다" | 목차를 본문 위에 얹음 | 목차는 **옆으로** 뺀다. 좌측 고정 내비 |
|
|
247
|
-
| 강조색이 흐릿하다 | 팔레트 보조색을 글자로 씀 | 2.25:1 이다. `--accent-mid`(3:1) / `--accent-ink`(4.5:1) 를 쓴다 |
|
|
248
362
|
| 낱말이 한가운데서 갈라짐 | `word-break` 기본값 | `word-break:keep-all` (구조 CSS 에 이미 있음) |
|
|
249
363
|
| 인용문이 문장 중간에서 잘림 | 근거를 자동 발췌 | 발췌 인용을 **아예 넣지 않는다.** 조치 본문에 이미 있다 |
|
|
250
|
-
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | `
|
|
251
|
-
|
|
|
364
|
+
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | **사람이 원고에서 고친다.** ⚠ `text_fix` 는 관보 경로에서 **안 돈다**(`build_gazette` 가 안 부른다 — 실측: 치환 0회). `forbid` 는 로컬 렌더에서만 살고 포털 발행은 입구에서 깎아 낸다(`report_publish.php:76`) |
|
|
365
|
+
| `forbid` 가 멀쩡한 문장을 막는다 | **한국어에는 낱말 경계가 없다** — `머지` 가 「**나**머지 절은」을 잡는다. `\b` 도 전방탐색도 안 듣는다(뒤에 공백이 오니까) | **앞**을 막는다: `(?<!나)머지`. 앞 글자로 갈리는 것이라 후방탐색이 답이다 |
|
|
366
|
+
| 두 단이 한 단으로 선다 | `marg` 를 안 채웠다 | `dry_run` 이 ⚠ 로 세어 준다. **경고를 읽어라** |
|
|
367
|
+
| 발행했는데 옛 서식이 나온다 | 관보 필드를 하나도 안 실었다 | 실측(2026-08-24): v2 최상위 16종 중 **0종**·절 키 11종 중 **0종** 사용. `assets/example/report.json` 을 베껴 시작한다 |
|
|
368
|
+
| 검사기가 전부 초록인데 문서가 허옇다 | `build.py` 를 직접 불러 **스타일시트가 안 실렸다.** 색이 없으니 대비가 자동 통과 | `render.py` 를 쓴다. 0표본 통과를 통과로 읽지 않는다 |
|
|
369
|
+
| 문장이 이어 붙어 기계 글로 읽힌다 | 개조식으로 바꿔도 조판이 그대로 | 한글은 **한 문장 한 줄**. `gazette-report` 의 `sentbreak.py --apply` |
|
|
252
370
|
|
|
253
371
|
## 카피 게이트
|
|
254
372
|
|
|
@@ -262,29 +380,30 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
|
|
|
262
380
|
|
|
263
381
|
## 폰트
|
|
264
382
|
|
|
265
|
-
|
|
266
|
-
|
|
383
|
+
**폰트를 고를 자리가 없다.** 서식이 정한다 — `report.json` 에 `font` 를 적어도
|
|
384
|
+
두 경로 모두에서 버려진다(로컬은 `render.py:157-158` 이 블록째 교체, 포털은
|
|
385
|
+
`report_publish.php` 가 깎아 낸다). 그래서 `font.embed: false` 도 **안 먹는다.**
|
|
386
|
+
|
|
387
|
+
지금 실리는 것: `pretendard-gazette.woff2` · **409,044B** · 가변 **wght 300–700** · 1면 ·
|
|
388
|
+
KS X 1001 완성형 2,350자. 관보 서식이 `--w-light: 300` 을 쓰므로 400 부터 자르면
|
|
389
|
+
표지 둘째 행과 간지 로마숫자가 눌린다.
|
|
267
390
|
|
|
268
|
-
|
|
391
|
+
바꿀 이유가 생기면 그것은 **서버 등록부를 고치는 일**이다 → `references/font-embedding.md`.
|
|
269
392
|
|
|
270
393
|
## 상세 레퍼런스
|
|
271
394
|
|
|
272
395
|
| 파일 | 로드 조건 |
|
|
273
396
|
|---|---|
|
|
274
|
-
| `references/
|
|
275
|
-
| `references/
|
|
276
|
-
| `references/
|
|
277
|
-
| `references/content-pipeline.md` | 1·4단계 — 데이터 모델, 절 번호, 한국어 조판 규칙, 고객 언어 치환 |
|
|
278
|
-
| `references/design-system.md` | 3단계 — 토큰 역할, 아키타입→HTML 매핑, 팔레트 교체 |
|
|
279
|
-
| `references/wysiwyg.md` | 편집기를 붙이거나 마크업을 바꿀 때 — 마크업 계약 |
|
|
280
|
-
| `references/qa.md` | 6단계 — 자동·시각 검수 전체 목록 |
|
|
397
|
+
| `references/process.md` | **작업 순서 전체** — 0~8단계. 문서를 만들기 시작할 때 먼저 읽는다 |
|
|
398
|
+
| `references/lim-portal-format.md` | **포털 발행할 때** — 관보 골격·여백 주석·PART·톤·요약 근거 게이트·운영 제약 |
|
|
399
|
+
| `references/content-pipeline.md` | 데이터 모델 전수 — 절 `kind` 5종, 등급, 한국어 조판 규칙, 고객 언어 치환 |
|
|
281
400
|
| `references/font-embedding.md` | 폰트를 바꾸거나 커버리지를 조정할 때 |
|
|
401
|
+
| `gazette-report` 스킬 (별도) | 조판 규칙의 원전 — 활자 스케일·괘선·인쇄 페이지 문법·검사기 8종 |
|
|
282
402
|
|
|
283
|
-
|
|
403
|
+
### 묘비 — 읽고 **따르지 마라**
|
|
284
404
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
- 팔레트
|
|
289
|
-
|
|
290
|
-
- 카피 게이트의 "조사·체언 종결" 규칙을 목차·제목에서 완화한다
|
|
405
|
+
| 파일 | 왜 남겨 두었나 |
|
|
406
|
+
|---|---|
|
|
407
|
+
| `references/illustrations.md` | `assets[].brief` 를 주면 **서버가 진짜로 그린다** — 크레딧이 타고 렌더러가 버린다(`gazette.py:878-887`). 위험이 실재해서 남긴다 |
|
|
408
|
+
| `references/design-system.md` | 팔레트 층이 없어졌다. 토큰을 고르려 들면 서버와 갈린다 |
|
|
409
|
+
| `references/qa.md` | 검수기가 `gazette-report` 로 옮겨 갔다. 여기 목록은 옛 검사기다 |
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
[
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"remaining": "목록 위에 표시되는 총 건수는 예전 데이터 때문에 실제보다 몇 건 많게 나올 수 있습니다. 목록 내용 자체는 정상입니다.",
|
|
22
|
-
"source_url": ""
|
|
23
|
-
}
|
|
2
|
+
{
|
|
3
|
+
"group": "reported",
|
|
4
|
+
"title": "주문서를 저장해도 목록에 반영되지 않던 상황",
|
|
5
|
+
"grade": "운영 환경 확인",
|
|
6
|
+
"symptom": "주문서를 작성하고 저장을 눌러도 목록으로 돌아오면 그 주문이 보이지 않던 상황. 새로고침을 한 번 더 하면 나타났음.",
|
|
7
|
+
"cause": "저장이 끝나기 전에 목록을 다시 불러오고 있어, 저장 직전 상태가 화면에 남았음.",
|
|
8
|
+
"fix": "저장이 끝난 뒤에 목록을 불러오도록 순서를 바꿈. 운영 환경에서 주문서를 실제로 작성·저장해 목록에 바로 나타나는 것까지 확인함.",
|
|
9
|
+
"how_to_check": "주문서를 하나 작성해 저장하고 목록으로 돌아와 볼 것. 새로고침 없이 바로 보이면 정상임."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"group": "own",
|
|
13
|
+
"title": "목록이 500건을 넘으면 첫 화면이 느려지던 상황",
|
|
14
|
+
"grade": "실데이터 대조",
|
|
15
|
+
"symptom": "주문이 많은 지점에서 목록 첫 화면이 뜨기까지 10초 넘게 걸리던 상황.",
|
|
16
|
+
"cause": "목록을 그릴 때마다 전체 항목을 훑고 있었음. 건수가 늘수록 시간이 비례해 늘어남.",
|
|
17
|
+
"fix": "자주 쓰는 조회 조건에 조회 색인을 걸어 필요한 만큼만 읽도록 바꿈. 운영 데이터를 건별로 대조해 결과가 같은 것을 확인함.",
|
|
18
|
+
"how_to_check": "주문이 가장 많은 지점의 목록을 열어 볼 것. 첫 화면이 1초 안에 뜨면 정상임.",
|
|
19
|
+
"remaining": "목록 위 총 건수가 예전 데이터 때문에 실제보다 몇 건 많게 나올 수 있는 상황. 실제 수치와 대조해 알려 주시면 기준을 맞출 예정."
|
|
20
|
+
}
|
|
24
21
|
]
|