genetics-mcp 2.28.0 → 2.29.1

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 (30) hide show
  1. package/genetics.mjs +133 -449
  2. package/package.json +4 -5
  3. package/skills/genetics-cell-id/SKILL.md +4 -5
  4. package/skills/genetics-report/SKILL.md +58 -38
  5. package/skills/genetics-report/assets/example/cases-briefing-designs.json +11 -11
  6. package/skills/genetics-report/assets/example/cases-briefing.json +3 -3
  7. package/skills/genetics-report/assets/example/cases.json +3 -3
  8. package/skills/genetics-report/assets/example/decision.json +40 -42
  9. package/skills/genetics-report/assets/example/report-briefing-designs.json +61 -61
  10. package/skills/genetics-report/assets/example/report-briefing.json +54 -54
  11. package/skills/genetics-report/assets/example/report.json +34 -45
  12. package/skills/genetics-report/assets/render.py +4 -6
  13. package/skills/genetics-report/assets/subset_font.py +1 -1
  14. package/skills/genetics-report/references/content-pipeline.md +1 -1
  15. package/skills/genetics-report/references/decision-format.md +87 -22
  16. package/skills/genetics-report/references/font-embedding.md +1 -1
  17. package/skills/genetics-report/references/history.md +29 -5
  18. package/skills/genetics-report/references/lim-portal-format.md +47 -24
  19. package/skills/genetics-report/references/process.md +26 -25
  20. package/skills/genetics-report/references/readability.md +5 -5
  21. package/skills/genetics-report/references/visual-first.md +11 -74
  22. package/bin/aarch64-apple-darwin/gcell +0 -0
  23. package/bin/aarch64-unknown-linux-musl/gcell +0 -0
  24. package/bin/manifest.json +0 -7
  25. package/bin/x86_64-apple-darwin/gcell +0 -0
  26. package/bin/x86_64-pc-windows-gnu/gcell.exe +0 -0
  27. package/bin/x86_64-unknown-linux-musl/gcell +0 -0
  28. package/skills/genetics-report/references/edition-review.workflow.js +0 -196
  29. package/skills/genetics-report/references/linear-read-test.workflow.js +0 -106
  30. package/skills/genetics-report/references/reader-review.workflow.js +0 -404
@@ -28,7 +28,7 @@ cover-frame·ch-head·cindex·eof-endcard·Spoqa 가 전부 0회로 나갔다.
28
28
  python3 render.py report.json # 원고의 template 칸, 없으면 lim-report(관보 — 서식은 이것 하나)
29
29
  python3 render.py decision.json # 결정 블록(decision_brief.decisions)이 있으면 같은 서식의 결정 모드
30
30
  python3 render.py report.json --template lim-report # 서식을 명령에서 고른다(원고 칸보다 이긴다 · 옛 이름 lim-decision 도 받는다)
31
- python3 render.py report.json --text /빈/폴더/본문.txt # + 화면에 보이는 글만 텍스트로(독자 검토용) · 그림 자리에 도판 id·갈래, 끝에 그림 파일 목록
31
+ python3 render.py report.json --text /빈/폴더/본문.txt # + 화면에 보이는 글만 텍스트로 · 그림 자리에 도판 id·갈래, 끝에 그림 파일 목록
32
32
  python3 render.py report.json --tenant <slug> # 그 소속처가 반려한 이름으로도 센다(없으면 원고의 tenant)
33
33
  python3 render.py report.rev9.json # get_report 로 받은 원고 그대로 — report.rev9.html, 보관 그림은 자리 상자
34
34
  GAZETTE_ARCHIFY=0 python3 render.py report.json # 도해 굽기를 끈 서버처럼(기본은 켬 — 저장소 고정 판 · Node 로 굽는다)
@@ -210,9 +210,8 @@ def _template_block(body: str, name: str) -> dict:
210
210
 
211
211
 
212
212
  # ── 독자용 본문 텍스트(--text) ──
213
- # 독자 검토의 「처음 읽는 사람」·「선형 읽기」 관점은 원고 JSON 이 아니라 **렌더본에 보이는 글**만 읽는다.
214
- # JSON 으로 읽히면 독자에게 안 보이는 제작 기록(assets[].origin)이 검토자에게는 보이고, 그것을 근거로 판정한
215
- # 발견이 나왔다(2026-09-26 스킬 검토: wf_7bfad8fa-89f 발견 4건). origin 은 렌더러가 그리지 않는 칸이라 HTML 에 없다.
213
+ # 원고 JSON 이 아니라 **렌더본에 보이는 글**만 뽑는다 — JSON 에는 독자에게 안 보이는 제작 기록(assets[].origin)이 있다.
214
+ # origin 은 렌더러가 그리지 않는 칸이라 HTML 에 없다.
216
215
  # 빼는 것: head·script·style·template·noscript, svg 의 title·desc(말풍선이라 화면 글이 아니다), hidden 속성이
217
216
  # 붙은 요소, HTML 주석, 화면 전용 크롬(아래), 그림의 alt(화면에 안 보이는 글이다).
218
217
  _TEXT_SKIP = {'head', 'script', 'style', 'template', 'noscript', 'title', 'desc'}
@@ -428,7 +427,7 @@ def rejected_names_from_server(tenant: str):
428
427
  # get_report 는 그림 바이트 대신 `(생략 — NB)` 표식을 준다(report_publish.php report_assets_elide — 되읽기는 바이트를 안 준다).
429
428
  # 그 원고를 발행하면 서버가 같은 id 의 저장본을 잇는다(report_carry_assets — 저장본이 없는 id 는 입구 검증이 거절하니 dry_run 이 말한다).
430
429
  # 로컬은 바이트가 없으니 도판 **자리**만 서버 기록 치수로 세운다 — 그림 번호·캡션·출처 줄·「[그림]」이 발행본과 같은 자리에 서야
431
- # --text 독자 검토가 캡션을 읽는다(2026-09-29 실측: 자리를 빼면 독자 본문에서 도판 셋의 16줄 — 「[그림]」·캡션·출처 — 이 빠졌다).
430
+ # --text 본문에도 캡션이 선다(2026-09-29 실측: 자리를 빼면 본문에서 도판 셋의 16줄 — 「[그림]」·캡션·출처 — 이 빠졌다).
432
431
  # file·source 가 있으면 발행이 그것으로 새로 굳힌다(genetics.mjs materializeAssets) — 보관 그림이 아니다.
433
432
  # 치수가 없는 표식도 건드리지 않는다 — 전과 같이 ⚠ 로 센다(2026-09-29 받은 판 표본의 figure 표식은 모두 치수가 있었다).
434
433
  KEPT_MARK = '(생략'
@@ -461,7 +460,6 @@ def main() -> None:
461
460
  help='서식 이름 — 주면 원고의 template 칸보다 이긴다. 안 주면 원고의 template, 그것도 없으면 lim-report(관보). '
462
461
  '서식은 lim-report 하나 — 결정 블록(decision_brief.decisions)이 있으면 결정 모드로 굽는다. '
463
462
  '옛 이름 lim-decision 도 받는다(서버의 옛 이름 표로 맞춘다). 서버 목록에 있는 이름만 받는다')
464
- # 독자 검토의 「처음 읽는 사람」·「선형 읽기」 관점은 이 파일 하나만 받는다(visible_text()).
465
463
  ap.add_argument('--text', metavar='출력.txt',
466
464
  help='렌더본에서 화면에 보이는 글만 뽑아 이 파일에 쓴다. 원고 폴더 밖 빈 폴더에 둔다 — '
467
465
  '그림 자리는 「[그림] <id> · <갈래>」, 끝에 그림 파일 목록, 실린 그림 바이트는 옆 <이름>-그림/ 에 푼다')
@@ -27,7 +27,7 @@ packages/pretendard/dist/public/variable/PretendardVariable.ttf
27
27
 
28
28
  사용
29
29
  .fontenv/bin/python subset_font.py PretendardVariable.ttf \
30
- ~/project/FCG/report-portal/private/builder/fonts/pretendard-gazette.woff2
30
+ <저장소>/private/builder/fonts/pretendard-gazette.woff2
31
31
  .fontenv/bin/python subset_font.py PretendardVariable.ttf out.woff2 --coverage=full
32
32
 
33
33
  폰트를 고를 자리는 없다
@@ -293,7 +293,7 @@ MCP 발행 스키마에도 `text_fix` 칸이 없음(`mcp/genetics.mjs`).
293
293
  | # | 유형 | 방향 | 왜 | 예 (내부 → 고객) |
294
294
  |---|---|---|---|---|
295
295
  | A | 검수 환경·계정 지칭어 | 조직 내부 명칭 → 독자 화면에 그 매장·계정이 보이면 **그 이름 그대로**(첫 등장에 괄호로 용도 한 번), 독자가 볼 일이 없을 때만 **용도**로 지칭 | 고객에게 「테스트 매장」은 **자기 매장 중 하나**로 읽힘. 용도로 새 이름을 지으면 독자 화면 어디에도 없는 이름이 됨(SKILL 반드시 지키는 것 12 · 0단계 물음 5) | `테스트 매장의 테스트 고객에 올려` → `<독자 화면의 매장 이름> 매장(검수용)의 고객으로 올려` · 화면에 없는 것이면 `검수용 매장·고객으로 올려` |
296
- | B | 배포 이벤트 → **반영 단계** 서술 | 「배포했다」·「커밋했다」 → 반영 단계 넷 가운데 하나: 「앱에 반영함 — <독자 화면의 채널 이름> 앱 전달 전」 · 「<독자 화면의 채널 이름> 앱에서 확인함」 · 「운영에 반영됨」 · 「반영 전」(채널 이름은 0단계 이름 대응표에서). 실기기에서 보지 않았으면 그 건 `remaining` 에 한 번 「실기기에서는 보지 않았음」으로 적음 — 문장마다 「실기기 미확인」을 덧달지 않음(SKILL 반드시 지키는 것 4). ISO 날짜 → 한국어 날짜 | 고객은 릴리스 절차를 모르고 알 필요도 없음. 알아야 할 것은 「지금 내 쪽에 적용돼 있나」뿐. 동사는 원고 밖 상태 표(무엇 · 코드 반영 · 시험판 전달 · 실기기 · 운영, 칸마다 근거)의 확인 수준을 넘지 않게 고름. 판정 규칙은 이용자가 확인할 수 있는 동작으로만 적고 구현 규칙(「기록에 키가 없으면 프로필 키로 판정」)은 싣지 않음. 커밋·브랜치·파일·시험 도구·시험 건수는 상태 표에만 — 원고에 새면 렌더러 ⚠(lim-portal-format §10-1 「개발 식별자」). 확인 수준 동사는 독자 검토 state 관점과 사람 눈, 화면·동작을 말한 문장에 독자가 볼 증거가 없으면 렌더러 ⚠(readability R14) · 독자 검토 증거 가시성(visual-first §7) | `2026-08-09 운영 배포를 마쳤고` → `2026년 8월 9일 운영 환경에 반영함` · `브랜치에 커밋, 시험 7/7 통과` → `앱에 반영함 — <독자 화면의 채널 이름> 앱 전달 전` + 그 건 `remaining` 에 `실기기에서는 보지 않았음` |
296
+ | B | 배포 이벤트 → **반영 단계** 서술 | 「배포했다」·「커밋했다」 → 반영 단계 넷 가운데 하나: 「앱에 반영함 — <독자 화면의 채널 이름> 앱 전달 전」 · 「<독자 화면의 채널 이름> 앱에서 확인함」 · 「운영에 반영됨」 · 「반영 전」(채널 이름은 0단계 이름 대응표에서). 실기기에서 보지 않았으면 그 건 `remaining` 에 한 번 「실기기에서는 보지 않았음」으로 적음 — 문장마다 「실기기 미확인」을 덧달지 않음(SKILL 반드시 지키는 것 4). ISO 날짜 → 한국어 날짜 | 고객은 릴리스 절차를 모르고 알 필요도 없음. 알아야 할 것은 「지금 내 쪽에 적용돼 있나」뿐. 동사는 원고 밖 상태 표(무엇 · 코드 반영 · 시험판 전달 · 실기기 · 운영, 칸마다 근거)의 확인 수준을 넘지 않게 고름. 판정 규칙은 이용자가 확인할 수 있는 동작으로만 적고 구현 규칙(「기록에 키가 없으면 프로필 키로 판정」)은 싣지 않음. 커밋·브랜치·파일·시험 도구·시험 건수는 상태 표에만 — 원고에 새면 렌더러 ⚠(lim-portal-format §10-1 「개발 식별자」). 확인 수준 동사는 사람 눈, 화면·동작을 말한 문장에 독자가 볼 증거가 없으면 렌더러 ⚠(readability R14) | `2026-08-09 운영 배포를 마쳤고` → `2026년 8월 9일 운영 환경에 반영함` · `브랜치에 커밋, 시험 7/7 통과` → `앱에 반영함 — <독자 화면의 채널 이름> 앱 전달 전` + 그 건 `remaining` 에 `실기기에서는 보지 않았음` |
297
297
  | C | 티켓 분리 서술 → **제 자리의 건** | 「별도 티켓으로 뺐다」 → 그 일을 제 절의 건으로 세우고 분리 서술은 지움. 가리켜야 하면 뒤 절이 앞 절의 건을 되짚는 방향만(「03-2 건과 같은 원인임」) | 티켓은 고객이 볼 수 없는 곳임. 그 일이 제 자리의 건으로 서면 **「빠진 것」이 「다른 데 적힌 것」이 됨**. 앞 절에서 뒤 절 번호를 가리키면 독자가 장을 오감(SKILL 0.5단계 7행 · readability R12h) | `별도 티켓으로 분리해 처리함` → (삭제 — 그 일은 제 절의 건으로) |
298
298
  | D | 내부 작업 규모 수치 → **무엇을 몇 개 확인했나** | 코드·테스트 카운트 → 독자가 아는 대상과 그 수. 범위를 넓히지 않음(「6곳 → 모든 경로」 금지) | 「모든 경로」는 우리가 센 것보다 넓은 단정이라 반증할 수 없음. 센 대상을 독자 말로 적으면 수가 곧 범위가 됨. 시험 건수는 B 의 상태 표에만 | `저장 경로 6곳을 수정함` → `저장이 일어나는 경로 6곳을 모두 고침` |
299
299
  | E | 배포 채널 용어 → 사용자 체감 사건 | 스토어 빌드·버전 → 「앱 업데이트」 | 현장 인원의 세계에서 일어나는 사건은 「앱이 업데이트된다」뿐임 | `다음 스토어 빌드부터 적용됨` → `다음 앱 업데이트부터 적용됨` |
@@ -11,24 +11,69 @@
11
11
  | 갈래 | 칸 | 없으면 |
12
12
  |---|---|---|
13
13
  | 필수(거절) | 결정마다 `name` · `question` · 선택지 둘 이상의 `name` · `line`, 공개 때 `reply_to.who` | 서버가 거절한다(`reply_to.who` 만은 초안 · dry_run 에서 알림) |
14
- | 권함(⚠) | `due` · `now` · 결정에 닿는 `facts` · `no_reply` | 거절하지 않는다 — 결정 이름 아래 ⚠ 한 줄. 화면에 「기한 없음」을 짓지 않는다 |
14
+ | 권함(⚠) | `frame`(받는 쪽의 뼈대)과 결정마다 `from` · `due` · `now` · 결정에 닿는 `facts` · `no_reply`(갈래 `kind` 와 문장 `text`) · 의견이 있으면 `opinion_pick` | 거절하지 않는다 — 결정 이름 아래 ⚠ 한 줄. 화면에 「기한 없음」을 짓지 않는다. 갈래 · 권하는 길이 없으면 그 기호가 빠진다(5절) |
15
15
  | 선택(쓰면 서고, 안 쓰면 그리지 않음) | `options[].rows`(행 여섯) · `options[].cost` · `figures`(그림 칸 — 수를 견주면 먼저 쓴다(2절) · 장치 표 `visual-first.md` §4) · `opinion` · `confirms` · `risks` · `unknowns` · `names` 와 그 밖의 칸 | 그 행 · 블록이 없다 — 빈 값 말을 짓지 않는다. 대칭: 한 선택지에 쓴 행 · 돈은 모든 선택지가 쓴다(한쪽만 쓰면 거절) |
16
16
 
17
17
  - **돈** — 쓰면 `state`(듦 · 안 듦 · 모름)만 필수, `known_when`(언제 아나) · `payer`(누가 내나)는 아는 것만. 금액 · 견적 · 공수는 싣지 않는다 — 돈이 드는지는 고객의 고충이고 견적은 우리 과정이다.
18
+ - **기호 칸 셋** — 기호(`=` 지금 그대로인 길 · `◎` 권하는 길 · `‖` 회신이 없으면 다시 여쭘)와 회신 쪽지는 원고 칸만 읽는다(1절 「읽는 법」).
19
+ - 선택지 `is_current`.
20
+ - 결정 `opinion_pick` — 의견이 권하는 선택지의 id. 쓰면 그 결정의 선택지 id 여야 하고 의견(`opinion`)이 함께 있어야 한다(아니면 서버가 거절).
21
+ - `no_reply` 의 `kind` — `keep` 지금 그대로 둠 · `hold` 시작하지 않고 다시 여쭘 · `part` 공통 부분만 짓고 다시 여쭘.
22
+
23
+ 렌더러는 의견 글 · 회신 문장에서 기호를 짐작하지 않는다. `no_reply` 를 문장만 쓴 옛 꼴도 받는다 — 갈래 기호만 빠진다.
18
24
 
19
25
  ## 1. 뼈대 — 렌더러가 데이터에서 세우고, 작성자는 차례를 바꾸지 않는다
20
26
 
21
- 첫 화면(머리 한 띠 · 점검 범위 · 「확인해 주실 것 · 정하실 것 · 막을 결정·일정이 아직 없는 위험」 · 낯선 말) → 결정 장(결정마다 한 장, 기한 순)
22
- → 확인해 주실 것 → 지금 열려 있는 위험 → 나중에 정해도 되는 것 → 회신 모음 → 근거 자료(보고 본문) → 판권지.
27
+ **문서는 받는 쪽이 이미 가진 뼈대를 그대로 진다**(관보 v4 2026-10-13 — 대표 「이쁜 쓰레기」 · 붙여 준 글의 「합의 착각」 · 「맞음 — 이 뼈대로 시안」).
28
+ 받는 쪽(고객 · 결정권자)은 거시(목표 · 보낸 문서 · 회의)에서 합의한 뒤 우리가 펼친 미시 문서를 다 검증하지 못한다. 그래서 「뼈대가 같았으니 정할 것도 같겠지」로 넘어간다.
29
+ 문서의 뼈대가 받는 쪽의 뼈대와 같은 꼴이면, 받는 쪽은 자기 뼈대에서 결정으로 내려가고 거슬러 오를 수 있다.
30
+
31
+ - `decision_brief.frame` — 받는 쪽이 부르는 뼈대 이름(`name` — 「0910 문서」「10. 2. 회의」) · 원래 제목(`title`, 선택) · 차례(`parts` — `[{id, label}]`, 받는 쪽의 차례 그대로).
32
+ - 보낸 문서라면 그 장, 회의라면 안건, 문의라면 갈래다.
33
+ - 우리가 묶은 차례(원고 id · 확인 묶음 · 우리 일 단위)는 뼈대가 아니다. 그건 우리 머릿속 뼈대다.
34
+ - 결정마다 `from` — 그 결정을 낳은 뼈대의 자리와 말(`[{part, said}]` — 받는 쪽이 그 자리에서 한 말 한 문장).
35
+ - 자리가 둘이면 두 줄로 적는다.
36
+ - 자리를 모르면 `part` 를 뺀다(「자리 미상」).
37
+ - **뼈대 밖에서 생긴 물음**(구현하다 생김)은 빈 값 `{"empty": "na", "why": …}` 으로 까닭을 적는다. 합의 착각이 숨는 자리라 숨기지 않는다 — 개념 뷰가 따로 묶어 보인다.
38
+ - 뼈대가 있으면 렌더러가 세우는 것:
39
+ - 결정 장 차례가 뼈대 차례를 따른다.
40
+ - 표지 다음 종이가 **개념 뷰**다(자리 | 그 자리의 말 | 정하실 것).
41
+ - 그다음 종이가 **정하는 차례**다(결정끼리 걸리는 곳 도면 · 확인 번호 풀이 · 막을 결정·일정이 아직 없는 위험 · 낯선 말).
42
+ - 결정 장 질문 밑과 회신 줄에 출처 자리가 선다.
43
+ - 뼈대가 없으면 옛 꼴(요약 목록 · 기한 순)로 서고 ⚠ 가 선다. 렌더러는 결정이 어느 자리에서 나왔는지 짐작하지 않는다.
44
+
45
+ 표지(1쪽 — 보고 모드와 같은 표지: 문서번호 · 제목 · 문서 종류 · 점검 범위 · 받는 분 · 보낸 곳 · 사실 기준일 · 발행처) → 개념 뷰 → 정하는 차례(뼈대가 없으면 요약 한 종이 — 「확인해 주실 것 ·
46
+ 정하실 것 · 막을 결정·일정이 아직 없는 위험」 · 낯선 말) → 결정 장(결정마다 한 종이, 뼈대 차례 — 뼈대가 없으면 기한 순) → 확인해 주실 것 · 지금 열려 있는 위험 · 나중에 정해도 되는 것(한 종이)
47
+ → 회신 모음 → 근거 자료(보고 본문) → 판권지.
48
+
49
+ 화면도 인쇄와 같은 세로 A4 종이로 서고, 종이마다 머리말(번호 칸 · 종이 이름 · 기한이나 건수 — 번호가 없는 종이는 칸 없이 이름만)이 선다. 문서 안 차례는 없다(2026-10-13 대표 「CONTENT 차례는 전체 폐기」).
50
+ 결정 사이는 머리띠 「결정 이동」으로 오간다 — 결정 번호 · 회신 모음 · 낯선 말 풀이.
23
51
 
24
52
  - 결정권자가 처음 묻는 것은 「무엇을 언제까지 정하고, 그 전에 무엇이 끝나야 하나」다 — 첫 화면의 목록은 개수가 아니라 이름 · 누구에게 · 기한의 축소판이다.
25
53
  - 한 결정의 물음 · 지금 상태 · 그림 칸 · 선택지 · 대칭 표 · 회신이 없을 때 · 사실 · 확인 · 의견 · 회신이 한 장에 선다 — 흩어 두면 독자가 「A 는 B 와 함께 봐야」를 스스로 조립한다. 「중요한 것 먼저」로 세우지 않는다 — 그 순서가 곧 판단이 된다.
26
54
  - 확인 하나가 결정 여럿에 걸칠 수 있어 본문은 「확인해 주실 것」 한 곳에 선다. 고르면 남는 위험은 대칭 표 「남는 위험」 행에, 어느 쪽을 골라도 지금 있는 위험만 「지금 열려 있는 위험」에 — 한 목록에 섞으면 순서가 판정이 된다.
27
55
  - 근거 자료는 읽는 곳이 아니라 찾아오는 곳이다 — 결정 장에 없는 새 사실을 거기서 처음 꺼내지 않는다.
28
56
 
29
- 결정 장 안의 차례도 렌더러가 정한다 — 지금 상태를 지키는 선택지(`is_current`)가 늘 첫째이고, 결정 이름은 첫 화면·결정 장 머리·회신 세 자리, 기한은 첫 화면·결정 장 머리 두 자리에만 찍힌다.
57
+ 결정 장 안의 차례도 렌더러가 정한다 — 지금 상태를 지키는 선택지(`is_current`)가 늘 첫째이고, 결정 이름은 요약 · 결정 장 머리 · 회신 세 자리, 기한은 요약 · 결정 장 머리 두 자리에만 찍힌다.
30
58
  그 밖의 자리는 이름 고리(`{{결정:id}}` 등)로 부른다. 번호로 가리키지 않는다.
31
59
 
60
+ **읽는 법을 문서가 가르친다**(A→P→O→S 비계, 2026-10-13 대표 「APOS 이론 … 비계 설정 작업이 관보 전반에 빠져있다」). 작성자는 이 차례를 쓰지 않는다. 칸을 채우면 렌더러가 세운다.
61
+
62
+ 1. **첫 결정은 풀이 사례다.** 기한이 가장 이른 결정이 그 자리다(원고 차례가 아니다).
63
+ - 단계 표지 넷: 1 무엇을 정하나 · 2 고를 길과 달라지는 것 · 3 근거와 의견 · 4 회신.
64
+ - 칸마다 묻는 말(명사형).
65
+ - 선택지 표지는 낱말로 선다(「지금 그대로인 길」 · 「당사가 권하는 길」 — 본문은 발행처 1인칭, 3절).
66
+ - 회신 칸에 회신 쪽지가 선다.
67
+ 2. **첫 결정 장 끝에 「결정 읽는 차례」 상자가 선다.**
68
+ - 결정마다 달라지는 칸 셋(지금 그대로인 길 · 권하는 길 · 회신이 없으면)이 이 문서에 몇 건씩 있는지 센다.
69
+ - 다음 결정부터 그 셋을 기호로 적는다고 알린다.
70
+ - 방금 읽은 결정을 기호로 줄인 예를 든다.
71
+ 3. **둘째 결정부터는 물음 바로 뒤에 기호 한 줄이 선다.** 단계 표지 · 묻는 말은 걷힌다. 아래 칸은 그 한 줄을 풀어 쓴 꼴이다.
72
+ 4. **회신 모음은 세 가지로 선다.**
73
+ - 기호 풀이 줄 — 이 문서에 쓴 기호만 푼다.
74
+ - 결정마다 쪽지 한 줄.
75
+ - 결정끼리 걸리는 곳 — 결정 이름 고리가 든 문장을 모은다.
76
+
32
77
  ## 2. 쓰는 법
33
78
 
34
79
  - **결정 하나는 물음 하나다.** 「화면 개선」처럼 여러 물음의 묶음이면 고객이 실제로 고를 물음마다 나눈다. 원고에 물음이 없으면 지어내지 말고 `question` 을 빈 값으로 둔다 — 그 빈 값이 사용자에게 물을 자리다.
@@ -36,10 +81,13 @@
36
81
  - **글 칸을 채우기 전에 구조부터 찾는다**(`now` · `what` · `facts_lead` · `opinion` · 사실 줄). **수를 둘 이상 견주면 그림 칸 차트(`figures[].chart`)가 먼저다** — 한 덩이의 구성은 구성 띠(`form: share` — 값이 % 면 % 그대로 · 합 100), 건수 · 비율 견주기는 막대(`length`), 흔들림이 있는 값은 점과 범위(`position` + `rows[].range`), 두 조건 사이 변화는 기울기(`slope`), 달마다 건수는 쌓은 막대(시계열 `parts`). 그린 수는 글에서 다시 늘어놓지 않는다 — 사실 줄은 그 결과 한 줄과 근거(어디서 · 어떻게 셌나)다. 수를 견주는 글이 두 곳 이상인데 차트가 없으면 결정 장 알림이 선다(2026-10-11 — 그 전에는 이 줄이 견주기를 표로만 보내, 실제 결정 문서가 결정 8 · 숫자 견줌 문장 14 · 차트 0 으로 나갔다). 글이 섞인 견줌은 `table`(한 열의 크기를 행끼리 견주면 `bar{col}` — 칸 막대), 순서와 누가 하는지가 있으면 `steps`, 이름 → 설명이면 `items`, 한 예를 보이면 `strip`(칸 둘~셋 — 마지막 칸이 결과이고 앞 문장에 「예를 들면」), 다른 칸이 이미 말했으면 지운다. 남는 말만 한 줄(`p`) · 한정(`note`)으로 쓴다 — 이 넷은 그 블록 목록을 받는다(꼴은 도구 스키마 `DEC_PROSE`). 구조가 없는 칸만 문장으로 쓴다(2026-10-08 사용자 「메타인지」). 본보기 `assets/example/decision.json` 의 「검색 방식」 의견 · 「방식 A 로 바꾸기」 설명 · 결과 화면 도안 둘의 설명이 이 꼴이다.
37
82
  - **한쪽만 문장인 행**(다른 쪽은 빈 값)은 알림이 선다 — 채울 수 있으면 채우고, 정말 모르면 그대로 두어 독자가 깊이 차이를 보게 한다.
38
83
  - **사실은 결과 문장이다.** 측정 조건·도구·환경은 사실 문장에 싣지 않는다. 근거 종류는 `basis`, 독자가 볼 증거는 `source` 가 진다 — 직접 본 것(`seen`)은 도판·원본 주소·건 가운데 하나가 있어야 하고, 대장의 우리 글만으로는 받지 않는다. 사실을 빼려면 데이터에서 지운다(그 차분이 사용자 보고에 실린다).
39
- - **판단은 `opinion` 하나에만 선다.** 다른 칸·첫 화면·제목·표에 「권고」「맞다고 봄」을 두지 않는다. 의견이 없으면 빈 값으로 둔다.
40
- - **이미 정하신 것(`settled`)은 고객이 닫은 기록이 있는 것만**이다. 기록이 없거나 FCG·내부 대화에서 정했으면 결정 물음이나 의견으로 둔다.
84
+ - **판단은 `opinion` 하나에만 선다.** 다른 칸 · 요약 · 제목 · 표에 「권고」「맞다고 봄」을 두지 않는다. 의견이 없으면 빈 값으로 둔다.
85
+ - 의견이 한 선택지를 권하면 그 id 를 `opinion_pick` 에 적는다. 기호 「◎」 · 선택지 표지 · 회신 쪽지가 그 칸만 읽는다.
86
+ - 의견이 한쪽을 고르지 않으면 비운다.
87
+ - **회신이 없으면(`no_reply`)은 `{kind, text}` 로 쓴다** — 갈래(`keep` · `hold` · `part`)와 무엇이 그대로이고 누가 무엇을 하는지 한 문장. 「…지금 방식이 그대로 쓰이고, … 다시 여쭘」처럼 다시 묻는 말이 있으면 `hold` 다.
88
+ - **이미 정하신 것(`settled`)은 고객이 닫은 기록이 있는 것만**이다. 기록이 없거나 우리 쪽·내부 대화에서 정했으면 결정 물음이나 의견으로 둔다.
41
89
  - **요청 자리만 하십시오체다** — 확인의 `ask`·`steps`, 대칭 표 「고객 쪽이 하실 일」의 글. 그 밖의 칸은 우리·사물이 주어인 개조식이고 독자를 주어로 쓰지 않는다(SKILL 반드시 지키는 것 5).
42
- - **확인 이름은 물음 꼴이다**(「…가 되는가」). 「검증 환경 주소 전달」 같은 명사구는 우리 일감으로 읽힌다.
90
+ - **결정 물음과 확인 이름은 명사형이다.** 가부를 묻는 것이면 「~ 여부」(「다음 분기 검색 방식 변경 여부」 · 「…가 되는지 여부」), 여럿 가운데 고르는 것이면 「~ 기준」 · 「~ 모양」 같은 명사구로 쓴다. 「~할까?」 · 「…가 되는가」 같은 물음 꼴은 고객에게 건네는 문서에서 반말 · 낮춤말로 읽힌다 — 물음 꼴이면 결정 장 알림이 선다(2026-10-12 사용자 「정할것들이 왜 다 반말이야?」. 그 전에는 이 줄과 본보기가 물음 꼴을 가르쳐 실문서의 결정 물음 8 · 확인 이름 5 가 전부 그 꼴로 나갔다). 확인 이름을 「검증 환경 주소 전달」 같은 일감 명사구로 쓰면 우리 일감으로 읽히므로, 무엇이 참인지를 묻는 「~인지 여부」로 쓴다.
43
91
  - **낯선 말과 숫자는 `names` 에 한 번** 적고 본문은 `{{이름:id}}` 로 부른다 — 렌더러가 결정 장마다 처음 나오는 자리에 풀이를 단다. 이름은 독자가 문서 밖에서 보는 원래 이름이다(SKILL 반드시 지키는 것 12).
44
92
  - 문장 칸에는 길이 상한이 없다. 문단으로 쓴다. 이름 칸(`question` 25자 · `line` 35자)의 눈금은 경고가 아니다.
45
93
 
@@ -57,7 +105,15 @@
57
105
  | 이 문서 밖에서 누가 언제 정한다 | `{"empty":"elsewhere","who":…,"when":…}` | who 「경영 회의」 · when 「11월 예산 회의에서」 |
58
106
  | 우리가 확인하지 못했다 | `{"empty":"unverified","fill":…}` | 「직원 노트북 화면에서 재면 채워짐」 — 채울 수단이 없으면 그렇다고 적는다 |
59
107
 
60
- 「누가」는 `customer`(받는 쪽 — `client` 글자로 찍힘) · `fcg` · `party:<names id>`(업체 등) · 빈 값 가운데 하나다. 원고에 주체가 없으면 지어 넣지 않고 빈 값으로 둔다.
108
+ 「누가」는 `customer`(받는 쪽 — `client` 글자로 찍힘) · `sender`(보내는 쪽 — 「당사」로 찍힘, 아래 {보내는 쪽}) · `party:<names id>`(업체 등) · 빈 값 가운데 하나다. 원고에 주체가 없으면 지어 넣지 않고 빈 값으로 둔다.
109
+
110
+ **{보내는 쪽}** — 본문(행 이름 · 의견 머리 · 권함 칩 · 첫 결정의 묻는 말 · 「누가」 칸)에서 보내는 쪽은 언제나 「당사」다 — 「당사가 할 일」 · 「당사 의견」 · 「당사 권함」 · 「당사가 권하는 길」
111
+ (대표 2026-10-18 「발행처 3인칭 전부 금지」 — 옛 판의 「우리회사가 권하는 길」은 발행처가 제 이름을 3인칭으로 부른 글이다. SKILL 반드시 지키는 것 15).
112
+ 보내는 쪽 **이름**은 정체 자리(표지 「보낸 곳」 줄 · 맨 아래 발행처 줄)에만 서고, 원고 `issuer` 첫 칸 **자리** → `labels.dc_who_sender` 차례로 정한다. `issuer` 첫 칸에는 `whoami` 가 보이는 운영사 이름을 적는다(SKILL 0단계 물음 7 — 대화 맥락에서 짐작해 적지 않는다).
113
+ 첫 칸이 비면 다음 칸(대상)으로 넘어가지 않는다 — 이름을 모르면 첫 칸을 빈 글자 `""` 로 두고 칸을 빼지 않는다(빼면 대상이 첫 칸으로 당겨져 보내는 쪽으로 선다).
114
+ 둘 다 비면 발행 때 서버가 설정의 운영사 이름을 `labels.dc_who_sender` 에 채우고(관리자 · 편집자가 사람 로그인으로 낸 문서만 — 키 발행 · 로컬 렌더는 채우지 않는다), 그것도 없으면 표지 「보낸 곳」 줄은 서지 않고 알림이 뜬다(5절).
115
+ `dc_who_sender` 는 첫 칸이 빌 때의 표지 이름 칸이다 — 본문 글자를 바꾸지 않는다. 원고 글(의견 · 회신이 없으면 · 확인의 `ask` · `steps` · 라벨)도 발행처를 「당사」, 요청 자리에서는 「저희」로 부른다 — 이름을 쓰면 포털이 받지 않는다(회신 받는 곳 `reply_to` 는 연락처라 「우리회사 검색 개선 담당」처럼 이름을 적는다).
116
+ 옛 이름(주체 `fcg` · 행 `fcg_does` · 라벨 `dc_who_fcg` · `dc_row_fcg_does`)도 받는다 — 새 원고는 새 이름으로 쓴다.
61
117
 
62
118
  ## 4. 바꿀 수 있는 글자 — `labels`
63
119
 
@@ -66,20 +122,26 @@
66
122
  | 키 | 기본 글자 |
67
123
  |---|---|
68
124
  | `dc_head_to` · `dc_head_from` · `dc_head_asof` | 받는 분 · 보낸 곳 · 사실 기준일 |
125
+ | `dc_first` · `dc_crumb` | 요약(요약 종이 머리말) · 결정(머리띠 「결정 이동」 머리) |
126
+ | `dc_cv_head` · `dc_cv_said` · `dc_cv_decide` · `dc_cv_unknown` · `dc_cv_outside` · `dc_cv_missing` · `dc_cv_foot` | {뼈대}와 정하실 것(받침으로 와/과) · {뼈대}의 말 · 정하실 것 · {뼈대} · 자리 미상 · {뼈대}에 없음 · 자리 칸 없음 · 개념 뷰 끝 줄 |
127
+ | `dc_lv_head` · `dc_lv_lead` · `dc_lv_first` · `dc_lv_first_s` · `dc_lv_then` · `dc_lv_then2` · `dc_lv_alone` · `dc_lv_alone_s` · `dc_lv_why` · `dc_lv_conf` · `dc_lv_conf_k` | 정하는 차례 · 첫 줄 · 먼저 정하실 것 — 다른 결정이 이 답을 씀 · 먼저 정하실 것 · 그 답을 보고 정하실 것 · 그다음에 정하실 것 · 따로 정하실 것 — 다른 결정과 걸리지 않음 · 따로 정하실 것 · 걸리는 곳 · 확인해 주실 것 — 칸 안 번호 · 확인 |
69
128
  | `dc_first_confirms` · `dc_first_decisions` · `dc_first_risks` · `dc_names_head` | 확인해 주실 것 · 정하실 것 · 막을 결정·일정이 아직 없는 위험 · 이 문서에 나오는 낯선 말 |
70
129
  | `dc_due_days` · `dc_due_until` · `dc_figures` | 받으신 날부터 {n}일 안 · {date}까지 · 그림 칸 |
71
130
  | `dc_sheet_head` · `dc_now` · `dc_settled` · `dc_table` · `dc_no_reply` · `dc_facts` · `dc_facts_none` · `dc_unverified` · `dc_one_side` | 정하실 것 · 지금 상태 · 이미 정하신 것 · 고르시면 달라지는 것 · 회신이 없으면 · 확인한 사실 · 확인한 사실 없음 · 확인하지 못한 것 · 한쪽 선택지에만 있는 자료 |
72
131
  | `dc_confirms_sways` · `dc_confirms_after` · `dc_confirms_none` · `dc_revisit` | 이 결정을 바꿀 수 있는 확인 · 결정 뒤에 할 확인 · 확인 없음 · 확인 결과가 오면 이 결정을 다시 볼 수 있음 |
73
- | `dc_opinion_head` · `dc_opinion_none` | FCG 의견 — 위 사실과 갈라 둔 판단 · FCG 의견 없음 |
132
+ | `dc_opinion_head` · `dc_opinion_none` | 당사 의견 — 위 사실과 갈라 둔 판단 · 당사 의견 없음 |
133
+ | `dc_tag_cur` · `dc_tag_pick` · `dc_tag_cur_s` · `dc_tag_pick_s` · `dc_none_cur` · `dc_none_pick` | 지금 그대로인 길 · 당사가 권하는 길(첫 결정의 선택지 표지) · 지금 · 당사 권함(둘째부터) · 지금 그대로인 길 없음 · 당사 의견 싣지 않음 |
134
+ | `dc_line_k` · `dc_proc_k` · `dc_p_vary` · `dc_p_cur` · `dc_p_pick` · `dc_p_quiet` · `dc_unused` | 이 결정을 줄이면 · 결정 읽는 차례 · 결정마다 달라지는 칸 · 지금 그대로인 길 · 당사가 권하는 길 · 회신이 없으면 · 이 문서에는 쓰지 않음 |
135
+ | `dc_slip_k` · `dc_dep_h` · `dc_dep_note` | 회신은 이렇게 — 고르신 길 1개에 표시하고, 조건이 있으면 적어 보내 주십시오 · 결정끼리 걸리는 곳 · 오른쪽 결정을 정할 때 왼쪽 결정을 함께 볼 곳. 문장은 오른쪽 결정 장에 실린 그대로임. |
74
136
  | `dc_reply` · `dc_reply_pick` · `dc_reply_attach` · `dc_reply_cond` · `dc_reply_attach_cond` · `dc_reply_to` | 회신 · {options} 가운데 하나로 회신해 주시기 바랍니다. · {items}도 함께 적어 주십시오. · 조건이 있으면 함께 적어 주십시오. · {items}도 함께 적어 주시고, 조건이 있으면 그것도 적어 주십시오.(덧붙일 값과 조건을 둘 다 받을 때 한 문장) · 회신 받는 곳 |
75
137
  | `dc_then` · `dc_no_current` | 회신 뒤 일 · 그대로 두는 길이 선택지에 없는 까닭 |
76
- | `dc_row_for_users` · `dc_row_client_does` · `dc_row_fcg_does` · `dc_row_cost` · `dc_row_risk_left` · `dc_row_settles_today` · `dc_row_others_do` | 이용자가 겪는 일 · 고객 쪽이 하실 일 · {발행처} 가 할 일(원고 `issuer` 첫 이름) · 돈 · 남는 위험 · 그날 정해지는 것 · 그 밖의 쪽이 할 일 |
138
+ | `dc_row_for_users` · `dc_row_client_does` · `dc_row_sender_does` · `dc_row_cost` · `dc_row_risk_left` · `dc_row_settles_today` · `dc_row_others_do` | 이용자가 겪는 일 · 고객 쪽이 하실 일 · 당사가 할 일 · 돈 · 남는 위험 · 그날 정해지는 것 · 그 밖의 쪽이 할 일 |
77
139
  | `dc_cost_yes` · `dc_cost_no` · `dc_cost_unknown` · `dc_cost_when` · `dc_cost_payer` | 듦 · 안 듦 · 모름 · 언제 아나 · 누가 내나 |
78
140
  | `dc_basis_seen` · `dc_basis_counted` · `dc_basis_tested` · `dc_basis_tested_sim` · `dc_basis_read` · `dc_basis_computed` | 직접 봄 · 운영 기록에서 셈 · 시험에서 잼 · 시험에서 잼(운영과 같은 조건 아님) · 설정·코드를 읽음 · 계산 |
79
141
  | `dc_empty_na` · `dc_empty_undecided` · `dc_empty_elsewhere` · `dc_empty_unverified` · `dc_fill_none` | 해당 없음 · 아직 안 정해짐 · 이 문서에 없음 · 확인하지 못함 · 채울 수단 없음 |
80
- | `dc_who_customer` · `dc_who_fcg` | (`client` 칸, 없으면 「고객사」) · FCG |
81
- | `dc_ch_confirms` · `dc_ch_risks` · `dc_risk_nosize` · `dc_size_measured` · `dc_size_estimated` · `dc_blocked_none` · `dc_ch_later` · `dc_ch_replies` · `dc_ch_ledger` · `dc_ch_compare` · `dc_ch_unknowns` · `dc_ch_colophon` · `dc_toc` | 확인해 주실 것 · 지금 열려 있는 위험 · 크기는 원고에 없음 · 잰 값 · 가늠한 값 · 막을 결정·일정 없음 · 나중에 정해도 되는 것 · 회신 모음 · 근거 자료 · 선택지 전체 비교 · 확인하지 못한 범위 · 판권지 · 차례 |
82
- | `dc_zoom` · `dc_quote` · `dc_to_names` · `dc_to_top` | 크게 보기 · 원문 · 낯선 말 목록으로 · 첫 화면으로 |
142
+ | `dc_who_customer` · `dc_who_sender` | (`client` 칸, 없으면 「고객사」) · 표지 「보낸 곳」 이름(첫 칸이 빌 때 — 본문 「누가」 칸은 「당사」, 3절) |
143
+ | `dc_ch_confirms` · `dc_ch_risks` · `dc_risk_nosize` · `dc_size_measured` · `dc_size_estimated` · `dc_blocked_none` · `dc_ch_later` · `dc_ch_replies` · `dc_ch_ledger` · `dc_ch_compare` · `dc_ch_unknowns` · `dc_ch_colophon` | 확인해 주실 것 · 지금 열려 있는 위험 · 크기는 원고에 없음 · 잰 값 · 가늠한 값 · 막을 결정·일정 없음 · 나중에 정해도 되는 것 · 회신 모음 · 근거 자료 · 선택지 전체 비교 · 확인하지 못한 범위 · 판권지 |
144
+ | `dc_zoom` · `dc_quote` · `dc_to_names` | 크게 보기 · 원문 · 낯선 말 풀이 |
83
145
 
84
146
  `{n}`·`{date}`·`{options}`·`{items}` 는 렌더러가 채운다. 모르는 키는 조용히 무시된다.
85
147
 
@@ -93,19 +155,22 @@
93
155
  - 깊이 비대칭(한 행에서 한쪽은 문장, 다른 쪽은 빈 값) — 2절.
94
156
  - 권고 낱말이 의견 칸 밖에 있음 — 그 문장을 `opinion` 으로 옮기거나 사실 문장으로 고친다.
95
157
  - 회신 받는 사람이 빔 — 공개 전에 채운다.
158
+ - 권하는 길 · 회신이 없으면의 갈래가 칸에 없음(A11 · A12). 그 기호가 빠진다. 칸을 채운다(0절 「기호 칸 셋」).
159
+ - A11: 의견이 있는데 `opinion_pick` 이 없거나, 그 결정의 선택지 id 가 아님.
160
+ - A12: `no_reply` 를 문장만 씀.
161
+ - 거시 뼈대가 비었음(A13 · A14) — 0 절 「권함」의 `frame` · `from` 을 채운다(1절).
162
+ - A13: `frame` 은 있는데 `from` 이 없는 결정(개념 뷰에 「자리 칸 없음」으로 섬).
163
+ - A14: `frame` 이 없음(옛 요약 목록 · 기한 순으로 섬).
164
+ - 보내는 쪽 이름이 원고에 없음(A15) — 표지 「보낸 곳」 줄이 빠진다(본문은 이름이 있어도 「당사」). `issuer` 첫 칸에 `whoami` 의 운영사 이름을 적는다(3절 {보내는 쪽}).
165
+ - 발행처 이름을 3인칭으로 쓴 곳(보고 모드와 같은 경고 — `lim-portal-format.md` §10-1) — 원고 한 벌에 한 번 선다. 포털은 새로 내기 · 고치기 · 편집기 발행에서 거절한다. 「당사」 · 「저희」로 고친다(3절 {보내는 쪽}).
166
+ - 옛 열쇠와 새 열쇠가 한 자리에 함께 왔고 글이 다름(A16 — 예 `rows.fcg_does` 와 `rows.sender_does`) — 새 이름 칸만 그려지고 옛 칸은 버려진다. 고친 글을 새 이름 칸으로 옮기고 옛 칸을 지운다(옛 첨삭 메모의 닻 `…/row_fcg_does` 는 `rows.sender_does` 다).
96
167
  - 수를 글로 견줌(그림 칸에 차트 없이 수를 둘 이상 견주는 글이 두 곳 이상) — 2절 「구조부터」대로 그 수를 그림 칸 차트로 옮기고 사실 줄은 결과 한 줄과 근거로 줄인다. 한 덩이를 이루지 않는 비율(겹치는 %)은 구성 띠가 아니라 막대다.
97
168
  - 그 밖(해라체·과정 어휘·반려 이름·날짜·도판·증거)은 `lim-portal-format.md` §10·§10-1 의 같은 문구다.
98
- - 보고 모드의 길이 상한(문장·표 칸·문단·판단 항목 220자 네 문장·요약) · 「글로만 서 있습니다」 · 여백 주석 · 번호 가리킴(W5·XREF) · 브리핑 넷 · 요약면 막대 대조는 결정 모드에서 돌지 않는다. 그 자리가 조용한 것은 통과가 아니라 칸이 그 뜻을 진다는 뜻이다 — 칸이 지지 못하는 넷(선택지 사이 서술 깊이 · 판단이 문장 칸에 섞임 · 말투 · 고객이 못 여는 링크)은 6절의 독자가 본다.
99
-
100
- ## 6. 다 쓴 뒤 — 원고를 모르는 독자에게 한 번
169
+ - 보고 모드의 길이 상한(문장·표 칸·문단·판단 항목 220자 네 문장·요약) · 「글로만 서 있습니다」 · 여백 주석 · 번호 가리킴(W5·XREF) · 브리핑 넷 · 요약면 막대 대조는 결정 모드에서 돌지 않는다. 그 자리가 조용한 것은 통과가 아니라 칸이 그 뜻을 진다는 뜻이다 — 칸이 지지 못하는 넷(선택지 사이 서술 깊이 · 판단이 문장 칸에 섞임 · 말투 · 고객이 못 여는 링크)은 사람 눈이 본다(6절).
101
170
 
102
- 공개할 결정 문서마다 한 번 돈다. 점수·개수는 없다.
171
+ ## 6. 다 쓴 뒤
103
172
 
104
- 1. 작성자가 결정 장마다 「이 장이 말하려던 것」을 한 문장으로 먼저 적는다 — 무엇에 관한, 언제까지의, 어떤 선택지이고, 고르면·안 고르면 무엇이 달라지나.
105
- 2. `python3 assets/render.py decision.json --text <원고 폴더 밖 빈 폴더>/본문.txt` 로 렌더본을 뽑는다.
106
- 3. `references/reader-review.workflow.js` 를 `args = { file, text, mode: "decision", intents: [{ decision: "<결정 이름>", intent: "<1의 한 문장>" }, …] }` 로 돌린다. 독자는 렌더본만 읽고(작성자 문장을 못 본다) 결정 장마다 자기 한 문장을 쓰고, 칸이 지지 못하는 넷과 「정할 것의 수 = 결정 장의 수」를 본다.
107
- 4. 둘이 갈린 자리만 칸 이름으로 옮겨(「`what` 이 비었다」「`now` 에 판단이 섞였다」) 원고를 고친다. 처방이 「행 하나 더」「낱말 하나 더」로 기울면 칸·본보기에서 원인을 찾는다.
108
- 5. 사용자 보고에 결정 장마다 작성자 한 문장 · 독자 한 문장 · 갈린 자리와 고친 것, 그리고 원고에서 지운 사실의 차분을 싣는다. 작업 폴더 파일로 남기지 않는다.
173
+ 원고를 모르는 독자에게 한 번 읽히던 단계는 걷었다 — 2026-10-19 사용자 결정 「독자 검토를 걷기」(경위: `history.md` §23). 5절 알림을 다 본 뒤 칸이 지지 못하는 넷(5절 끝)은 사람 눈이 본다.
109
174
 
110
175
  ## 7. 옛 결정 브리핑(결정 블록 전 보고 모드)
111
176
 
@@ -121,7 +121,7 @@ KS X 1001 밖 음절(`뷁` 같은)은 시스템 폰트로 떨어진다.
121
121
  ```bash
122
122
  python3 -m venv .fontenv && .fontenv/bin/pip install fonttools brotli
123
123
  .fontenv/bin/python assets/subset_font.py PretendardVariable.ttf \
124
- ~/project/FCG/report-portal/private/builder/fonts/pretendard-gazette.woff2 \
124
+ <저장소>/private/builder/fonts/pretendard-gazette.woff2 \
125
125
  --wght=300:700
126
126
  ```
127
127
 
@@ -80,10 +80,16 @@
80
80
 
81
81
  2026-09-14 — 스킬 스스로 이 규칙을 어긴 자리(0.5단계 머리 인용·도판 문서의 고객사 이름·이용자 번호)를 익명화했다.
82
82
 
83
+ 2026-10-15 — 이번에는 **운영사 이름**이었다. 렌더러가 번호 없는 쪽 머리말 칸에 운영사 약칭을 원고와 무관하게 찍었고, 결정 모드는 보내는 쪽 이름이 비면 그 약칭으로 채웠고,
84
+ 스킬 글은 의견 · 결정권 · 작업의 주어를 그 약칭으로 가르쳤고, 발행처 이름을 어디서 얻는지는 말하지 않았다 — 실문서의 문서번호에 그 약칭이 접두로 든 예가 렌더러 서식 주석에 남아 있었다.
85
+ 대표 원문 — 「genetics SaaS로 범용 서비스 할때는 … 도입한 전체관리자의 기업명이어야될텐데, 애초에 여기에 회사명을 박아 둘 필요는 없어보임. 왜냐하면 기업명이 길 경우도 이슈임.」
86
+ 처방 — 번호 없는 쪽 머리말은 칸 없이 이름만 · 보내는 쪽 이름은 `whoami` 의 운영사 이름(전체 관리자가 설정 화면에 한 번)에서, 비면 「당사」 · 역할 낱말은 「보내는 쪽」 · 「우리」 ·
87
+ 계약 열쇠는 `sender` 계열(옛 이름도 받음) · 스킬 글에 그 약칭 0 은 `tests/builder.test.py` 가 센다(SKILL 0단계 물음 7 — 다른 회사 이름 · 포털 이름까지 세지는 않는다).
88
+
83
89
  ## 7. 답정너 (2026-09-11) — SKILL 반드시 지키는 것 10
84
90
 
85
91
  고객사 결정 브리핑에서 권고 낱말이 제목·표 열·요약에 배어 독자가 동의만 하게 되는 틀로 나갔다.
86
- 반려 원문 — 「보고서에 답정너 형식 좀 없애」. 그래서 결정권이 고객에게 있는 문서는 물음과 두 길 대칭으로 세우고, FCG 의견은 한 절 한 자리에만 둔다.
92
+ 반려 원문 — 「보고서에 답정너 형식 좀 없애」. 그래서 결정권이 고객에게 있는 문서는 물음과 두 길 대칭으로 세우고, 보내는 쪽 의견은 한 절 한 자리에만 둔다.
87
93
 
88
94
  ## 8. 원본을 재지 않고 「흐리다」 (2026-09-11) — SKILL 반드시 지키는 것 11
89
95
 
@@ -119,7 +125,7 @@
119
125
  - **검토 처방이 틀림** — 검토자가 앱 동작을 다른 문서와 대조해 틀리게 판정했고(코드에는 그 규칙이 있었다),
120
126
  정해진 구조를 뒤집으라는 처방과 결정 날짜·판 이력을 더하라는 처방이 거르지 않은 채 올라왔다. → 독자 검토 Verify 단계 · JS 거름 · facts 관점.
121
127
  - **결정 주체** — 앞선 판의 반려 「결정 요청란에 이미 결정한 것들이 있는데?」 뒤, 「몇 차에서 정함」이 실렸는데 그 차수의 원문은 「정해야 함·차기 검토」였다.
122
- 최종 판에도 FCG 가 대화에서 정한 항이 주체 없이 「정한 사항임」으로 남았다. → 0단계 물음 4 · 결정 장부 · 3b 결정 주체.
128
+ 최종 판에도 우리가 대화에서 정한 항이 주체 없이 「정한 사항임」으로 남았다. → 0단계 물음 4 · 결정 장부 · 3b 결정 주체.
123
129
  - **날짜** — 검토 세 관점이 「표지·이력 날짜와 본문 날짜가 다름」을 짚었고 처방은 「이력에 행을 더함」이라 3b 와 부딪혔다. 공개 직전 날짜를 손으로 네 자리 고쳤다. → 3c · `gazette.py` `date_scan()` ⚠(세 자리 대조).
124
130
  - **코드 작업을 녹임** — 「너의 작업은 보고서에 이어서 녹여주면돼」로 브랜치·파일·시험 건수가 섞인 기록이 원고로 옮겨졌고,
125
131
  미커밋·실기기 미확인 상태가 완료형으로 실렸다. 앞선 9/3 반려 「커밋이라던가 개발자 대상 브리핑은 불필요한데?」와 같은 뿌리다. → 반드시 지키는 것 3 「코드 작업을 녹일 때」 · `text_scan()` 개발 식별자 ⚠ · state 관점.
@@ -152,7 +158,7 @@
152
158
  ## 14. 「비밀번호가 메신저로 오갔음」 (2026-09-17) — SKILL 반드시 지키는 것 13 · process.md 원리 4 · content-pipeline 유형 L · 카피 게이트 새 행
153
159
 
154
160
  심사 탈락 사후 보고. 사용자 반려 원문: 「이딴내용을 왜 보고서에 넣는거야? 미치겠네.」 이어 「너의 실수가 아니라, 스킬이 빈약한거겠지.」
155
- 경위 — FCG 의견 표에 「호스팅 계정 비밀번호 / 바꾸는 편이 나음 / 비밀번호가 메신저로 오갔음」 행을 넣었다. 교체 권고는 옳았으나
161
+ 경위 — 보내는 쪽 의견 표에 「호스팅 계정 비밀번호 / 바꾸는 편이 나음 / 비밀번호가 메신저로 오갔음」 행을 넣었다. 교체 권고는 옳았으나
156
162
  우리 쪽 자격증명 취급 사실을 고객 문서에 박제했다. 스킬의 redaction 은 「고객이 못 알아볼 내부 용어」(티켓·개발 식별자·과정 어휘)만 잡았고
157
163
  「고객이 알아선 안 될 우리 치부」를 잡는 원리·치환 유형·게이트가 어느 층에도 없었다 — 렌더러 ⚠0 · dry_run ⚠0 을 통과해 나갔다(0표본 통과).
158
164
  처방 — process.md 원리 4(구두로), content-pipeline 유형 L(삭제 + 구두)과 §4.4·§1.3 짝 행, SKILL 13, 카피 게이트 행,
@@ -191,11 +197,11 @@ cases 절의 DOM 은 간지 → 여백 주석 → 건 전부 → 인용 → 자
191
197
 
192
198
  고객사 운영 DB 판올림 관보, 같은 날 두 판.
193
199
 
194
- - **6판** — 사용자 반려 셋: 필요한 내용은 공들여 보이지 않고 덜 중요한 것은 요약으로 채워 FCG 의 작업이 안 보인다 ·
200
+ - **6판** — 사용자 반려 셋: 필요한 내용은 공들여 보이지 않고 덜 중요한 것은 요약으로 채워 우리 작업이 안 보인다 ·
195
201
  밤새 한 검증을 작성자 시선의 낮춘 표현으로 적었다 · 관보를 시간순으로 적었다.
196
202
  원인 셋 — 회차마다 새 건을 뒤에 덧대 시간순이 뼈대가 됐다 · 비교 시험과 설정 전수 대조를 렌더러 길이 관문에 맞춰 한 줄 행으로 눌러 검증 설계가 안 보였다 ·
197
203
  전수 대조가 잡아 고친 것을 작성자의 점검표 시선(「뒤늦게」)으로 썼다.
198
- 처방은 소속처 결정문(위험 → FCG 검증 → 결과 순서, 시간순은 부록의 경과 표와 발행 이력에만)이다. 스킬 반영: **미반영** —
204
+ 처방은 소속처 결정문(위험 → 우리 검증 → 결과 순서, 시간순은 부록의 경과 표와 발행 이력에만)이다. 스킬 반영: **미반영** —
199
205
  2026-09-26 스킬 검토 제안 ①~⑤ 밖이라 이번 개정에 넣지 않았다. 뼈대 규칙으로 올릴지는 사람이 정한다.
200
206
  - **7판(로컬본)** — 사용자 반려: 책임을 가리키는 낱말과, 직역 대신 맥락으로 지어낸 다른 낱말을 쓰지 말 것 · 유치한 문구가 군데군데 남았다.
201
207
  경위 — 기술 대상 다섯(설정 넷과 인스턴스 하나)을 원래 기술 이름 대신 작업하며 지은 설명형 대체어로 불렀다
@@ -281,3 +287,21 @@ v3 결정 모드는 화면 첫 창에 할 일 목록이 들게 하려고 1쪽
281
287
  결정 첫 쪽에 장 머리 세 줄만(본문 옆 이름 칸 격자의 머리에 건 `break-after: avoid` 가 격자째 다음 쪽으로 밀었다), 구조 칸 표가 종이 폭(그 칸 440~459px)에서 칸마다 접힘,
282
288
  표 칸 「10. 8. 09:40」이 세 줄이었다. 처방: 화면 첫 창은 그대로 두고 종이에서만 1쪽이 v1 표지 단독(쪽번호 없음)으로 선다 — 렌더러가 머리를 한 상자로 묶고 인쇄 규칙이 한 면을 채운다.
283
289
  쪽이 섰는지는 A4 PDF 를 뽑아 v1 본보기와 쪽 차례를 나란히 보고 정한다 — 화면 요소 개수 · 시험 통과는 그 확인이 아니다.
290
+
291
+ ## 22. 중개자 화자 — 발행처 3인칭 (2026-10-18) — SKILL 개요 원칙 넷 · 0단계 물음 7 · 반드시 지키는 것 15 · 카피 게이트 새 행 · lim-portal-format §10-1 · `decision-format.md` 3절
292
+
293
+ 고객사가 거래 업체에 보낸 확인 요청(발행처 = 고객사)이 발행처 이름을 본문 30곳에서 3인칭으로 불렀다 — 「{발행처} 사무실의 시험용 기기에서는 반영됨({발행처} 확인)」 ·
294
+ 「회신은 이 문서를 보낸 {발행처} 담당자에게」. 원고를 쓴 쪽(개발사 에이전트)이 제 자리에서 두 회사 사이를 잇는 꼴로 썼고, 렌더러도 결정 모드에서 「{발행처}가 권하는 길」 ·
295
+ 「{발행처}가 할 일」을 스스로 지었다(2026-10-15 「기업명이 하드코딩이어서는 안됨」의 처방이 이름을 본문에 넣는 쪽으로 갔다). 대표(2026-10-18): 「메타인지 안된 상태로 중개자
296
+ 입장에서 … 엮는 입장으로 쓴 관보같아보임」 · 「응 이거 관보에서 금지시켜야돼. 이런 어투로 전달하면 뭐하자는거임. 독자 입장에서 비웃을거고 genetics 브랜드 평판이 쓰레기가 되는데,
297
+ 근본적으로 아직도 관보 툴이 품질이 낮다는거네」 → 결정 「발행처 3인칭 전부 금지」.
298
+ 처방: 문서는 발행처가 직접 말한다 — 서술 「당사」 · 요청 자리 「저희」, 이름은 정체 자리(표지 · 판권지 행 · 회신 받는 곳)에만. 렌더러가 자리를 세고(경고 — 재굽기 · 서버가 짓는
299
+ 문서에도 선다), 서버는 새로 내기 · 고치기 · 편집기 발행에서 거절한다 — 이미 나간 문서는 다음에 고칠 때 걸린다. 결정 모드 본문의 기본 글자도 「당사」(「당사가 할 일」 · 「당사 의견」 ·
300
+ 「당사 권함」)로 바꿨다. 그날 운영 문서 46개를 어림으로 재 보니(정규식 대조 — 이 규칙의 자로 다시 잰 수가 아님) 30개가 한 곳 이상 걸렸고, 운영사가 직접 낸 문서에는
301
+ 「{운영사}가 …」 꼴이 흔했다. 본보기 원고 3벌(브리핑 둘 · 결정)도 「우리회사 의견」 · 「우리회사가 보내 드리는」으로 같은 결함을 가르치고 있어 함께 고쳤다.
302
+
303
+ ## 23. 독자 검토를 걷음 (2026-10-19) — SKILL 0.5단계 7행 · 작업 체크리스트 7단계 · 8단계 「수정 절차」 · `process.md` 7단계 · `visual-first.md` §7 · `decision-format.md` 6절
304
+
305
+ 발행 전 독자 검토(`reader-review.workflow.js` — 관점 아홉 + 반박 + 합치기)는 비용을 줄인 판(2026-10-19 — 공통 재료 · 같은 주제 묶기 · 반박 자리 고르기)에서도 견본 한 번에 45.1분 · 조사관 25명이 들었다. 사용자: 「45분도 엄청나. 애초에 독자 검토 관문이 왜 있냐에 제대로 된 방향성이 나랑 너랑 다른것같음.」
306
+ 재 보니 이름은 독자 검토였지만 렌더본만 받는 관점은 둘(처음 읽는 사람 · 선형 읽기)뿐이었고, 일곱은 결정 장부 · 코드 · 상태 표 같은 작성자 쪽 재료로 수치를 다시 셈하고 코드를 열고 도판 px 를 쟀다 — 쓰는 단계의 검수를 발행 앞에 몰아 둔 꼴이었고, 그 주장이 틀려 반박 조사관이 다시 쟀다. 2026-10-15 · 10-19 의 비용 대책은 그 틀을 둔 채 운영비만 깎았다.
307
+ 사용자는 넷(독자 한 명 + 검수는 쓰는 단계로 · 독자 한 명 + 사실 대조 한 명 · 독자 검토를 걷기 · 그대로) 가운데 「독자 검토를 걷기」를 골랐다 — 검토 단계 없이 쓰는 단계 규칙과 렌더러 관문만 둔다. 함께 걷은 것: 결정 모드의 「원고를 모르는 독자 한 번」(`decision-format.md` 6절), 낱말 손질 판의 판 갱신 검토(`edition-review.workflow.js`), 선형 읽기 실측(`linear-read-test.workflow.js`), 조사관에게 나눠 주던 공통 재료 스크립트. 고를 때 함께 본 잃는 것: 렌더러 ⚠0 판에서 처음 읽는 사람이 막히는 자리(2026-10-01 독자 하나가 12건 — §19)는 발행 뒤 사람의 첨삭으로만 잡힌다.