genetics-mcp 2.25.0 → 2.27.0

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 (37) hide show
  1. package/NATIVE-CODEX-SESSION.md +182 -0
  2. package/bin/aarch64-apple-darwin/gcell +0 -0
  3. package/bin/aarch64-unknown-linux-musl/gcell +0 -0
  4. package/bin/manifest.json +5 -5
  5. package/bin/x86_64-apple-darwin/gcell +0 -0
  6. package/bin/x86_64-pc-windows-gnu/gcell.exe +0 -0
  7. package/bin/x86_64-unknown-linux-musl/gcell +0 -0
  8. package/codex-session-cli.mjs +82 -0
  9. package/codex-session.mjs +353 -0
  10. package/genetics.mjs +1865 -228
  11. package/package.json +5 -2
  12. package/skills/gazette-report/SKILL.md +11 -1
  13. package/skills/gazette-report/scripts/tone.mjs +45 -9
  14. package/skills/gazette-report/scripts/tone.test.mjs +70 -0
  15. package/skills/genetics-cell-id/SKILL.md +73 -54
  16. package/skills/genetics-define/SKILL.md +34 -1
  17. package/skills/genetics-report/SKILL.md +68 -70
  18. package/skills/genetics-report/assets/example/cases-briefing-designs.json +15 -5
  19. package/skills/genetics-report/assets/example/cases-briefing.json +14 -5
  20. package/skills/genetics-report/assets/example/cases.json +25 -9
  21. package/skills/genetics-report/assets/example/decision.json +313 -0
  22. package/skills/genetics-report/assets/example/report-briefing-designs.json +2 -2
  23. package/skills/genetics-report/assets/example/report-briefing.json +1 -1
  24. package/skills/genetics-report/assets/example/report.json +65 -21
  25. package/skills/genetics-report/assets/render.py +204 -52
  26. package/skills/genetics-report/references/content-pipeline.md +9 -10
  27. package/skills/genetics-report/references/decision-format.md +112 -0
  28. package/skills/genetics-report/references/diagrams.md +52 -94
  29. package/skills/genetics-report/references/edition-review.workflow.js +81 -31
  30. package/skills/genetics-report/references/history.md +35 -0
  31. package/skills/genetics-report/references/lim-portal-format.md +120 -253
  32. package/skills/genetics-report/references/linear-read-test.workflow.js +33 -10
  33. package/skills/genetics-report/references/process.md +34 -27
  34. package/skills/genetics-report/references/readability.md +9 -8
  35. package/skills/genetics-report/references/reader-review.workflow.js +167 -25
  36. package/skills/genetics-report/references/visual-first.md +54 -42
  37. package/skills/genetics-report/assets/diagram.mjs +0 -208
@@ -10,7 +10,7 @@ description: |
10
10
  - "고객이 우리가 뭘 했는지 모른다, 정리해서 보내야 한다"
11
11
  - "검수 요청 문서 만들어줘" / "장애 사후 보고서 / 릴리스 노트를 고객용으로"
12
12
  - "기술보고서/인수인계/온보딩 문서/포스트모템 만들어줘" (→ PART 구성으로 푼다)
13
- - "조사한 걸 정리해서 할지 말지 정하게 해줘" / "R&D 브리핑 / 기술 도입 검토서 / 결정 요청서" (→ 결정한다 모드)
13
+ - "조사한 걸 정리해서 할지 말지 정하게 해줘" / "R&D 브리핑 / 기술 도입 검토서 / 결정 요청서" (→ 결정 블록 — 결정마다 한 장)
14
14
  내용 설계(독자 정의 → 등급 → 고객 언어 치환 → 주어별 문체 전환)가 본체이고, 전달은 둘 중 하나입니다:
15
15
  Lim MCP 발행(서버 렌더, 링크 공유) 또는 단일 HTML(같은 관보 서식·폰트 임베드).
16
16
  서식은 **한국 정부간행물(관보) 문서 문법**입니다 — 표지·발행 이력·차례·활용법·요약·PART 간지·
@@ -37,29 +37,30 @@ version: "4.0.0"
37
37
  ## 작업 체크리스트 — 단계 번호의 정본
38
38
 
39
39
  밟는 순서는 이 표 한 장이다. 이 스킬의 「N단계」는 모두 이 표의 번호다 — 단계마다 무엇을 쓰고 판단하는지는 `references/process.md`.
40
- 행을 건너뛰면 그 행의 산출물이 없다는 뜻이다. 못 밟았으면 까닭을 핸드오프에 적는다. 「집행자」가 「사람」인 행은 기계가 막지 않는다.
40
+ 행을 건너뛰면 그 행의 산출물이 없다는 뜻이다. 못 밟았으면 까닭을 핸드오프와 공개·교체 승인 물음에 적는다(10단계 행) — 「간단히」는 분량 지시이지 단계 면제가 아니다. 「집행자」가 「사람」인 행은 기계가 막지 않는다.
41
41
 
42
42
  | 단계 | 산출물 | 돌릴 명령 | 통과 기준 | 집행자 | 사용자에게 묻는 것 |
43
43
  |---|---|---|---|---|---|
44
- | 0 독자 | 독자 문장 1줄 + 할 일 목록(작업 메모) · 이름 대응표 `names.md`(작업 폴더, 발행 안 함 — 0단계 물음 5) | — | 누가 · 무엇을 하나 · 무엇을 언제까지 정하나가 문장으로 섬 · 원고에서 부를 대상마다 독자 화면·문서의 이름이 섬(새 개념이면 「원래 이름 없음」) | 사람 — 사용자 확인 | **반드시** 0단계 물음 1~3 · FCG 의견을 낼지 · 자료에서 못 찾은 독자 쪽 이름(물음 5) |
44
+ | 0 독자 | 독자 문장 1줄 + 할 일 목록(작업 메모) · 이름 대응표 `names.md` · 증거 계획 `evidence.md`(둘 다 작업 폴더, 발행 안 함 — 0단계 물음 5·6) | — | 누가 · 무엇을 하나 · 무엇을 언제까지 정하나가 문장으로 섬 · 원고에서 부를 대상마다 독자 화면·문서의 이름이 섬(새 개념이면 「원래 이름 없음」) · 관찰 주장마다 보여 줄 것 · 찍는 사람 · 필요한 접근이 섬 | 사람 — 사용자 확인 | **반드시** 0단계 물음 1~3 · 「결정 요청으로 낼까요, 보고로 낼까요」 · FCG 의견을 낼지 · 자료에서 못 찾은 독자 쪽 이름(물음 5) · 모자란 접근(물음 6) |
45
45
  | 0a 결정 장부 | 작업 폴더 `decisions.json`(발행 안 함) | — | 원고에 「정해진 것」으로 쓸 항마다 결정권 · 정한 주체 · 기록 · 확인 여부가 참 | 사람 눈 · 독자 검토 facts 관점(`args.decisions`) | 0단계 물음 4 — 미확인 항을 한 번에 |
46
46
  | 0.5 시각 설계 | 절마다 시각 장치 · 예시 한 명 · 용어 잠금 표 | — | 0.5단계 표 1~6행이 정해짐 | 사람 눈 · 렌더러 ⚠(`lim-portal-format.md` 「10-1. 시각 우선 관문」) | 화면 변화가 따르면 도안으로 결재받을지 |
47
- | 1·2 자료·건 | `cases.json` | — | 건마다 다섯 칸 · 근거 없는 칸은 「[미확인]」(사용자에게 되물을 칸 — 발행 전 0) | 서버 발행 검증(그룹 정합) · 사람 | 원자료 범위 · 고객이 아는 참조 · 「[미확인]」 칸 |
47
+ | 1·2 자료·건 | `cases.json` | — | 건마다 다섯 칸 · 근거 없는 칸은 「[미확인]」(사용자에게 되물을 칸 — 발행 전 0) · 확인 방법마다 볼 자리와 우리가 본 때·환경(안 본 결과는 `remaining`) | 서버 발행 검증(그룹 정합) · `gazette.py` `evidence_scan()` ⚠(볼 자리) · 사람 | 원자료 범위 · 고객이 아는 참조 · 「[미확인]」 칸 |
48
48
  | 3 등급 | `grades` · 건별 `grade` | — | 4단 이하 · 최약 등급이 기본 | 사람 | 등급 이름·개수 |
49
- | 4~6 원고 | `report.json` · 코드 작업을 녹이면 원고 밖 상태 표(반드시 지키는 것 3) | — | 요약 근거 · 요지 칸 수(4~6단계) · 절마다 `marg` | 서버 요약 근거 게이트(거절) · 사람 | 공통 원인이 실재하는가 |
49
+ | 4~6 원고 | `report.json` · 코드 작업을 녹이면 원고 밖 상태 표(반드시 지키는 것 3) | — | 요약 근거 · 요지 칸 수(4~6단계) · 절마다 `marg` — 결정 모드는 결정 블록 `decision_brief`(`references/decision-format.md`) | 서버 요약 근거 게이트(거절) · 결정 블록은 서버 뼈대 검증(거절) · 사람 | 공통 원인이 실재하는가 |
50
50
  | 6 도판 굽기 | 도판 HTML → PNG · `plates.json` | `node assets/figure.mjs --batch plates.json --report report.json` · 두 칸 비교는 `shot.mjs --after` → `pair.mjs` | exit 0(✗0 · 합계 2,400,000B 안) | `figure.mjs` R0~R10·R13 · `pair.mjs` · 칩 문구의 뜻은 사람 눈 | — |
51
- | 7 로컬 렌더 | 단일 HTML | `python3 assets/render.py report.json`(소속처 문서면 `--tenant <slug>` — 원고에 `tenant` 가 있으면 생략) | ⚠0 · `forbid` 적중 0 · 단일 HTML 로 전달할 판이면 「보관 그림 N장」 줄 0(그 HTML 은 그림 자리가 상자인 검토본 — 원고에 `out` 이 있으면 그 줄이 ⚠ 로 선다) | `gazette.py` `text_scan()`·`brief_checks()`·`tally_scan()` · `build.py guard()` · `render.py kept_stand_ins()` | — |
52
- | 7 dry_run | 경고 목록 | `publish_report`/`update_report` 에 `dry_run: true` | 작성자가 고칠 수 있는 ⚠0 — 못 없애는 경고는 까닭을 핸드오프에 | `report_publish.php report_build_checked()`(렌더러·입고·그림·문체 · 금칙어는 `report_publish.php report_forbid_warnings()`) · `update_report` 는 `comments.php comment_anchor_forecast()`(회신 핀 자리) · 경고 기준선 대조는 사람 | — |
53
- | 7 독자 검토 | 렌더본 텍스트(원고 폴더 밖 빈 폴더) · 워크플로 결과(`merged`·`questions`·`dropped`·`jumps`·`names` — 판 갱신 검토는 `kept`·`refuted`·`weak`·`unverified`) | `python3 assets/render.py report.json --text <원고 폴더 밖 빈 폴더>/본문.txt` → `references/reader-review.workflow.js`(`args.text` 필수, 0.5단계 7행) · 구조를 안 바꾼 낱말 손질 판은 `references/edition-review.workflow.js`(역시 `args.text`) | 사실 틀림 반영 · 선형 읽기 뜀(`jumps`) 가운데 심각도 3 이상 0건 · 만든 이름(`names`) 0건 — 못 없앤 것은 까닭을 핸드오프에 · 결과 머리 「검토 미완」 없음(있으면 다시 돌림) · 「⚠ 도판 N장 미열람」 없음 — 다만 미열람·「서버 보관」 줄에 찍힌 id 가 모두 원고에서 `data` 가 「(생략 — NB)」 표식인 장이면, 사람이 열람 주소에서 그 장을 열어 보고 id 를 핸드오프에 적으면 통과다(그 밖의 미열람은 다시 돌린다) · 반영 뒤 로컬 렌더·dry_run 다시 | 워크플로 관점 + JS 거름 · `questions`·`dropped`·`refuted`·`rx`(처방 다시) 는 사람 | `questions[]` |
51
+ | 7 로컬 렌더 | 단일 HTML | `python3 assets/render.py report.json`(소속처 문서면 `--tenant <slug>` — 원고에 `tenant` 가 있으면 생략) | ⚠0 · `forbid` 적중 0 · 단일 HTML 로 전달할 판이면 「보관 그림 N장」 줄 0(그 HTML 은 그림 자리가 상자인 검토본 — 원고에 `out` 이 있으면 그 줄이 ⚠ 로 선다) | `gazette.py` `text_scan()`·`brief_checks()`·`tally_scan()`·`evidence_scan()` · `build.py guard()` · `render.py kept_stand_ins()` | — |
52
+ | 7 dry_run | 경고 목록 | `publish_report`/`update_report` 에 `dry_run: true` | 작성자가 고칠 수 있는 ⚠0 — 못 없애는 경고는 까닭을 핸드오프에(10단계 행) | `report_publish.php report_build_checked()`(렌더러·입고·그림·문체 · 금칙어는 `report_publish.php report_forbid_warnings()`) · `update_report` 는 `comments.php comment_anchor_forecast()`(회신 핀 자리) · 경고 기준선 대조는 사람 | — |
53
+ | 7 독자 검토 | 렌더본 텍스트(원고 폴더 밖 빈 폴더) · 워크플로 결과(`merged`·`questions`·`dropped`·`jumps`·`names` — 판 갱신 검토는 `kept`·`refuted`·`weak`·`unverified`) | `python3 assets/render.py report.json --text <원고 폴더 밖 빈 폴더>/본문.txt` → `references/reader-review.workflow.js`(`args.text` 필수 · `args.evidence_plan` 에 0단계 `<작업 폴더>/evidence.md`, 0.5단계 7행) · 구조를 안 바꾼 낱말 손질 판은 `references/edition-review.workflow.js`(역시 `args.text`) | 사실 틀림 반영 · 선형 읽기 뜀(`jumps`) 가운데 심각도 3 이상 0건 · 만든 이름(`names`) 0건 · 증거 없는 관찰 주장 `judgement.evidence_missing` 0 — 못 없앤 것은 까닭을 핸드오프에(10단계 행) · 결과 머리 「검토 미완」 없음(있으면 다시 돌림) · 「⚠ 도판 N장 미열람」 없음 — 다만 미열람·「서버 보관」 줄에 찍힌 id 가 모두 원고에서 `data` 가 「(생략 — NB)」 표식인 장이면, 사람이 열람 주소에서 그 장을 열어 보고 id 를 핸드오프에 적으면 통과다(그 밖의 미열람은 다시 돌린다) · 반영 뒤 로컬 렌더·dry_run 다시 | 워크플로 관점 + JS 거름 · `questions`·`dropped`·`refuted`·`rx`(처방 다시) 는 사람 | `questions[]` |
54
+ | 7 독자 검토(결정 모드) | 결정 장마다 작성자 한 문장 ↔ 독자 한 문장 · 갈린 자리 | 같은 렌더본 → `references/reader-review.workflow.js`(`args.mode: "decision"` · `args.intents`) | 공개 문서마다 원고를 모르는 독자 한 번, 점수 없이 막힌 자리만 — 갈린 자리와 고친 것, 원고에서 지운 사실의 차분을 사용자 보고에 싣는다(관점 아홉·뜀 0·이름 0 은 결정 모드의 완료 조건이 아니다) | 워크플로 독자 한 번 · 갈린 자리를 칸 이름으로 옮기는 것은 사람 | — |
54
55
  | 7 조판 검사 | 검사기 출력 | `gazette-report` 검사기 8종(단일 HTML 전달일 때) | 각 0건 · **표본 수를 함께 본다**(0표본 통과는 통과가 아니다) | 검사기 — 실행법은 `gazette-report` 스킬 | — |
55
56
  | 7 사람 눈 | — | 인쇄 미리보기까지 연다 | `references/process.md` 「7단계 — 검수」 사람의 눈 표 | 사람 | — |
56
- | 8 초안 발행·수정 | 초안 링크 · 고친 판이면 받은 판 JSON 과 `edits.json`(작업 폴더, 발행 안 함) | 새 문서 `publish_report` · 고치면 8단계 「수정 절차」 | 같은 링크 · `patch.py --freeze` 가 `edits.json` 을 씀(받은 판 사본에 두 번째 바꿈 0) · 교체와 그 앞 dry_run 에 받은 판의 `body_rev`(`get_report` 머리줄 값)를 실음 · 사람이 고친 초안을 모르고 덮지 않음 | `patch.py`(옛 값이 다르면 멈춤 · 굳힐 때 멱등 검사) · `update_report` 의 `body_rev` 잠금(받은 뒤 본문 판이 바뀌었으면 서버 409) · 편집기에 저장만 된 사람 초안은 판을 안 올려 잠금에 안 걸림 — 목록의 「덮음」을 사람이 본다 | 사람이 고친 초안이면 덮어도 되는가 |
57
+ | 8 초안 발행·수정 | 초안 링크 · 고친 판이면 받은 판 JSON 과 `edits.json`(작업 폴더, 발행 안 함) | 새 문서 `publish_report` · 고치면 8단계 「수정 절차」 | 같은 링크 · `patch.py --freeze` 가 `edits.json` 을 씀(받은 판 사본에 두 번째 바꿈 0) · 교체와 그 앞 dry_run 에 받은 판의 `body_rev`(`get_report` 머리줄 값)를 실음 · 사람이 고친 초안을 모르고 덮지 않음 | `patch.py`(옛 값이 다르면 멈춤 · 굳힐 때 멱등 검사) · `update_report` 의 `body_rev` 잠금(받은 뒤 본문 판이 바뀌었으면 서버 409) · 편집기에 저장만 된 사람 초안은 판을 안 올려 잠금에 안 걸림 — 목록의 「덮음」을 사람이 본다 | 사람이 고친 초안이면 덮어도 되는가 · 교체 승인(10단계 행) |
57
58
  | 9 발행 뒤 대조 | 블록 목록 · 고친 판이면 되읽은 JSON(`body_rev` 를 파일 이름에) | `get_report(id, outline: true)` · `get_report(id)` | `aside.marg` 수 = 절 수 · 옛 서식 블록 0 · 빈 블록 0 | 사람(블록 목록을 읽음) — 대조 기계 없음 | — |
58
- | 9 열람 확인 | 캡처 | 열람 주소를 연다 | 칩·굵게·링크가 원문 글자가 아니라 서식으로 섬 · 도판 쌍·판단 절이 섬 | 사람 눈 — 못 열면 까닭을 핸드오프에 | — |
59
- | 9a 첨삭 메모 반영 | 반영된 판 · 닫힌 메모 · 까닭을 단 답글 | `list_reports` → `list_notes` → 8단계 「수정 절차」 → `resolve_note`·`reply_note`(9a단계) | 미반영 메모 0 — 남은 것은 전부 답글로 까닭이 달림 | 사람이 메모를 닮 · 서버는 미반영 수만 셈(`open_notes`, 우리 팀에게만) | 사람이 「메모 해놨다」고 할 때만 돈다 — 무엇을 고칠지 되묻지 않음 |
59
+ | 9 열람 확인 | 캡처 | 열람 주소를 연다 | 칩·굵게·링크가 원문 글자가 아니라 서식으로 섬 · 도판 쌍·판단 절이 섬 | 사람 눈 — 못 열면 까닭을 핸드오프에(10단계 행) | — |
60
+ | 9a 첨삭 메모 반영 | 반영된 판 · 닫힌 메모 · 까닭을 단 답글 | `list_reports` → `list_notes` → 8단계 「수정 절차」 → `resolve_note`·`reply_note`(9a단계) | 미반영 메모 0 — 남은 것은 전부 답글로 까닭이 달림 | 사람이 메모를 닮 · 서버는 미반영 수만 셈(`open_notes`, 우리 팀에게만) | 사람이 「메모 해놨다」고 할 때만 돈다 — 무엇을 고칠지 되묻지 않음 · 증빙을 찍는 데 모자란 접근은 청함 |
60
61
  | 9b 검토 회신 반영 | 회신마다 「어느 물음의 답인가」 대조 · 반영된 판 · 반영 표시 | **개정 전에** `list_notes(id)`(검토 회신이 본문과 함께 실린다) → 8단계 「수정 절차」로 반영 → `resolve_note(id, reply, rev)`(9b단계) | 열린 회신 0 — 남은 것은 사람에게 넘긴 까닭이 있음 · 원고에 「회신 없음」이라고 쓴 자리가 회신과 어긋나지 않음 | 서버는 열린 회신 수(`open_replies`)를 목록·되읽기·교체 응답에 싣고, 열린 회신의 문장이 바뀌면 교체 경고로 말함 · 본문 읽기와 대조는 사람·에이전트 | 고객에게 보이는 답글 문안(에이전트는 달지 않는다) |
61
62
  | 10 공개 직전 날짜 | 받은 판 JSON 과 `edits.json`(날짜 세 칸) | 8단계 「수정 절차」로 한 번 — 받은 판에서 날짜 세 칸만 고쳐 `body_rev` 를 실어 교체(날짜만 고치는 이 판은 독자 검토·판 갱신 검토 없이 로컬 렌더·dry_run 만) | 작성일 세 자리가 한 값이고 공개하는 날(3c) | `gazette.py` `date_scan()` ⚠(세 자리가 다르면) · 공개하는 날인지는 사람 | 공개일 |
62
- | 10 공개 | 공개된 링크 | `release_report(id)` | 사용자 승인 | 사람(승인 행위) | **반드시** 공개 승인 |
63
+ | 10 공개 | 공개된 링크 | `release_report(id)` | 사용자 승인 — 공개·교체 승인을 묻거나 공개해도 되는지 답할 때 이 판에서 건너뛴 단계(0단계 사용자 확인 · 독자 검토 · 열람 확인 등)와 증거 없는 관찰 주장 수(로컬 렌더 ⚠ 「화면을 말했는데 …」의 N곳 — 포털 dry_run 은 렌더러 운영 반영 뒤부터)를 싣는다 | 사람(승인 행위) — 실렸는지 대조하는 기계는 없음 | **반드시** 공개 승인 |
63
64
 
64
65
  ## 렌더러는 레포에 하나뿐이다
65
66
 
@@ -71,7 +72,7 @@ version: "4.0.0"
71
72
 
72
73
  | 경로 | 언제 | 방법 |
73
74
  |---|---|---|
74
- | **Lim 포털 발행 · 관보 문서 문법** (고객사에 나가는 정식 문서) | 링크로 열람시키는 검수·보고 문서 | `publish_report` — **서식은 서버가 정한다**(고를 인자가 없다) → **`references/lim-portal-format.md` 필독** |
75
+ | **Lim 포털 발행 · 관보 문서 문법** (고객사에 나가는 정식 문서) | 링크로 열람시키는 검수·보고 문서 | `publish_report` — 서식은 `lim-report` 하나(`template` 은 안 적는다). 원고에 결정 블록(`decision_brief.decisions`)이 있으면 결정 모드(**`references/decision-format.md`**), 없으면 보고 모드(**`references/lim-portal-format.md` 필독**) |
75
76
  | 단일 HTML 파일 | 메일 첨부·사내망 열람·Lim 밖 고객 — 링크를 못 여는 상대 | `assets/render.py` — **레포 렌더러를 부른다**(사본 없음). 같은 관보 서식으로 나간다. 외부 리소스 0, 폰트 임베드 |
76
77
 
77
78
  > **도구 이름은 접두사 없이 적는다.** 실제로는 `mcp__<설정키>__publish_report` 로 보이는데,
@@ -103,15 +104,15 @@ version: "4.0.0"
103
104
  `~하여 주시기 바랍니다 / ~부탁드립니다 / ~하겠습니다` 로 맺는다. 자세한 것은 아래 5·5a.
104
105
  경어체 `습니다|십시오|합니다|입니다|됩니다|주세요` 0건은 **요청 자리 밖에만** 거는 기준이다.
105
106
  - ⚠ **톤 게이트는 경고이지 거절이 아니다.** `report_tone.php report_tone_warnings()` 가 `dry_run` 경고로 셀 뿐 발행을 막지 않는다.
106
- 서버는 `open_items` 본문·`cta`·판권지 `note`·`asks` 절 여백 주석과 「」 인용을 안 세고, 로컬 `tone.mjs` 는 요청 자리 가운데 넷(판단 항목 본문·`cta`·요청 PART 의 PART I 간지·판권지 회신 안내)과 「」 인용을 뺀다(2026-09-26 — 읽는 법 요청 한 줄은 센다).
107
- 그래서 남는 경어체 경고 가운데 서버의 PART I 간지 문장(PART I 이 요청·결정 PART 일 때)과 두 경로의 읽는 법 요청 한 줄은 **의도된 것이므로 고치지 않는다** — 경과·원리 PART 의 간지에서 나면 개조식으로 고친다.
107
+ 서버와 로컬 `tone.mjs` 는 같은 요청 자리 넷(판단 항목 본문·`cta`·판권지 회신 안내·요청 PART 의 PART I 간지 도입문·물음)과 「」 인용을 빼고 센다(2026-09-29 — 요청 절 여백 주석·PART 제목은 센다). 결정 모드의 요청 자리는 확인의 `ask`·`steps` · 「고객 쪽이 하실 일」 칸 · 회신 줄 · 판권지 회신 안내다(렌더본의 `data-zone="ask"`).
108
+ 읽는 법(`guide`)의 요청 한 줄만 자리로 못 가려 두 경로 모두 센다 — 그 한 줄의 경어체 경고는 **의도이므로 고치지 않는다.** 간지에서 나면 요청 PART I 이 아닌 간지이니 개조식으로 고친다.
108
109
  이 경고를 하드 규칙으로 오인해 종결을 비튼 것이 **거듭된 반려의 원인**이다(경위: `references/history.md` §5).
109
110
  - `tenant` 는 키가 가리키는 고객사와 일치해야 한다(오발행 방지 가드). 값은 소속처 slug 우선·이름 폴백 — 8단계의 `slug` 는 **보고서** slug 라 다른 것이다.
110
111
  - `sections[].kind` 는 `summary|status|cases|asks|note` 다섯 가지뿐 — 그 밖의 값은 절이 통째로 사라지므로 서버가 거절한다.
111
112
  - `cases[].grade` 는 `grades` 에 정의된 이름이어야 한다.
112
113
  - **`update_report` 는 같은 주소를 덮어쓴다** — 이미 고객에게 나간 링크가 새 내용을 가리키므로, 발행 후 수정은 재발행이 아니라 update 로 한다. 기존 문서는 `list_reports`/`get_report` 로 받아 고쳐 되돌려 보낸다.
113
114
  - **그림 계약**: `update_report` 에서 `assets` 를 **빼고** 보내면 서버가 저장된 그림을 그대로 유지한다 — 캡션·출처 줄·alt 같은 도판 글 칸도 저장값 그대로다. 글 칸을 고쳤으면 `assets` 를 `get_report` 표식째 목록으로 보낸다(서버가 id 로 바이트를 잇고 글 칸은 보낸 값을 쓴다). 전부 지우려면 `assets: []` 를 명시하고 `sections[].plates`·`chapters[].asset` 에서도 그 id 를 빼야 한다 — 가리키는 곳이 없는 id 는 422. 한 장만 바꾸려면 그 id 에 새 `source`/`file`, 나머지는 `get_report` 가 준 표식 그대로.
114
- - 초안 상태로 올려 두고 다듬어도 발행은 막히지 않는다. 단 초안 `update_report` 도 **본문 판(`body_rev`)** 을 올리고 사용자가 그 판을 읽으므로 **독자 검토를 통과한 본문 판만 올린다** — 다듬는 중간 판은 로컬 렌더·dry_run 으로 본다. 사용자가 「바로 반영」을 지시하면 먼저 올리고 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(2026-09-15 사용자 결정).
115
+ - 초안 상태로 올려 두고 다듬어도 발행은 막히지 않는다. 단 초안 `update_report` 도 **본문 판(`body_rev`)** 을 올리고 사용자가 그 판을 읽으므로 **독자 검토를 통과한 본문 판만 올린다** — 다듬는 중간 판은 로컬 렌더·dry_run 으로 본다. 사용자가 「바로 반영」을 지시하면 먼저 올리고 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(2026-09-15 사용자 결정 · 10단계 행).
115
116
  **발행 이력 행(`history`)은 다른 것이다** — 공개 전 수정은 이력 행을 만들지 않는다(3c).
116
117
  - 내용 설계 규칙(아래 0~3단계, 고객 언어 치환, 카피 게이트)은 **전달 경로와 무관하게 동일하게** 적용된다 — 서버가 렌더한다고 해서 원고 품질 단계를 건너뛰지 않는다.
117
118
 
@@ -125,9 +126,9 @@ version: "4.0.0"
125
126
  | 고객본 / 내부본 분리 | 내부 메모를 남겨 두고도 고객본에서는 빠진 채로 내보낸다 |
126
127
  | 조판 검사 8종 통과 필수 | 대비 미달·빠진 블록·용어 유출은 **눈으로 못 잡는다** |
127
128
 
128
- ## 세 가지 독자 — 뼈대는 하나다
129
+ ## 세 가지 독자 — 서식은 하나, 모드는 원고가 정한다
129
130
 
130
- 서식은 하나뿐이므로 **뼈대를 바꾸지 않는다.** 바뀌는 것은 PART 를 무엇으로 가르느냐,
131
+ 서식은 `lim-report` 하나다 — 원고에 결정 블록(`decision_brief.decisions`)이 있으면 결정 모드(결정마다 한 장), 없으면 보고 모드(뼈대 고정, **바꾸지 않는다**). 보고 모드에서 바뀌는 것은 PART 를 무엇으로 가르느냐,
131
132
  그리고 **그 독자에게 말을 걸 때 어떤 종결로 맺느냐**다(5a) — 독자가 사람이면 요청 자리는
132
133
  하십시오체다. 문체를 독자와 무관한 상수로 두었다가 말투 반려를 여섯 번 받았다(`references/history.md` §5).
133
134
 
@@ -135,20 +136,15 @@ version: "4.0.0"
135
136
  |---|---|---|
136
137
  | 판정한다 (검수·회신·결재) | 요청 / 경과 / 잔여 | `asks` → `summary` → `status` → `cases` → `note` |
137
138
  | **배운다** (유지보수·인수·온보딩·사후분석) | 원리 / 붕괴와 처방 / 적용과 남은 것 | 같은 다섯 kind 를 그 순서로 쓴다 |
138
- | **결정한다** (도입 여부·옵션 선택·예산·일정) | 결정 / 근거 / 이행 | `asks`(결정 물음 + 둘째 할 일이 있으면 「… 확인 요청」) → `summary` → `note`(선택지 전치 행렬) → `cases` → `note`(FCG 의견 표 한 장 — 절 이름에 「의견」을 넣는다, W1 이 세지 않는 조건. 다른 절·건 행 이름에는 「의견」을 쓰지 않는다) → `note`(바꾸는 길의 위험) → `note`(회신 뒤 일정) |
139
+ | **결정한다** (도입 여부·옵션 선택·예산·일정) | 결정 블록 — 결정 모드로 결정마다 한 장, 뼈대는 렌더러가 정함(`references/decision-format.md`) | 근거 자료 절만 `note`·`cases` |
139
140
 
140
141
  **회신·결정이 없는 정황 공유 보고는 판정한다 뼈대에서 요청 PART 만 뺀다.** PART 는 「경과 / 남은 것」이고,
141
142
  요지·대조표·건은 경과 PART 하나에 함께 선다(`references/process.md` 「PART 를 먼저 가른다」).
142
143
  절의 성격(시각표·원인·앞날)으로 PART 를 새로 짓지 않는다 — 「경과 / 원인」으로 가르면 같은 건이 두 PART 에 문장만 바꿔 선다(경위: `references/history.md` §9).
143
144
  독자가 결정권자면 `status` 대조표를 빼고 요약면 상태 막대만 남긴다(`references/process.md` 「이 답에서 곧바로 정해지는 것」).
144
145
 
145
- 결정한다 모드에 「하지 않기로 한 것」 절은 **따로 두지 않는다** — 선택지 표의 「정할 자리」·「다시 볼 때」 행이
146
- 그 몫을 한다(반드시 지키는 것 10). FCG 의견은 절 하나, 표 한 장이 전부다 — 다른 절·열·제목에 배지 않는다.
147
-
148
- **결정 문서와 R&D 블로그 글은 다른 물건이다.** 블로그 글은 「이런 걸 해 봤고 이런 걸 배웠다」로 끝나고 독자가
149
- 할 일이 없다. 브리핑은 **결정 요청(무엇을 언제까지)·복수의 선택지(그대로 두는 길 포함)·근거 등급·성숙도·기한**이
150
- 추가된다 — 이 다섯이 없으면 문서가 아무리 두꺼워도 블로그 글이다. 정부 R&D 최종보고서·군 결정문(BLUF)·
151
- 영국 정부 Submissions 가 공통으로 요구하는 것이 이 다섯이다(`references/lim-portal-format.md` §12.7b).
146
+ 결정 블록의 FCG 의견은 결정마다 `opinion` 칸 하나다 — 첫 화면·제목·표는 그 칸을 읽지 않는다. 옛 결정 브리핑(결정 블록 전 보고 모드)을 고칠 때만 의견 절 한 자리.
147
+ **결정 문서와 R&D 블로그 글은 다른 물건이다** — 블로그 글은 독자가 할 일이 없다. 결정 블록은 결정마다 이름 · 물음 · 선택지 둘 이상(이름 · 한 줄)이 없으면 서버가 거절한다(기한은 권함 — 없으면 ⚠).
152
148
 
153
149
  `kind:"lesson"` 같은 것은 **없다.** 서버가 발행 단계에서 거절한다.
154
150
  가르치는 문서도 다섯 kind 로 푼다 — 자세한 것은 `references/lim-portal-format.md` §12.
@@ -167,20 +163,22 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
167
163
 
168
164
  ## 0단계 — 독자를 먼저 못 박는다 (건너뛰지 말 것)
169
165
 
170
- **이 스킬에서 반드시 사용자에게 확인해야 하는 것은 이 단계와 공개 승인(10단계) 둘이다.** 나머지는 스스로 판단해도 된다.
166
+ **이 스킬에서 반드시 사용자에게 확인해야 하는 것은 이 단계와 공개 승인(10단계) 둘이다.** 나머지는 스스로 판단해도 된다 — 증거를 찍는 데 모자란 접근은 청할 거리다(물음 6).
171
167
 
172
168
  물어볼 것:
173
169
 
174
170
  1. **이 문서를 누가 읽는가** — 고객사 검수 담당? 결정권자? 실무 매장 인원?
175
171
  2. **읽고 나서 무엇을 해야 하는가** — 확인만? 판단해서 회신? 결재?
176
172
  3. **읽고 나서 무엇을 결정하는가** — 선택지는 무엇이고, 선택지마다 무엇이 달라지는가, **언제까지** 정해야 하는가.
177
- **FCG 의견을 낼지는 따로 묻는다** — 내면 한 절 한 자리.
178
- (「결정한다」 모드에서는 필수. 답이 「특별히 결정할 것은 없다」면 그 문서는 브리핑이 아니라 보고다.)
173
+ 답에 정할 것이 기한과 함께 있으면 결정 블록(`decision_brief.decisions`)을 쓴다 — 문서가 결정 모드로 선다. 「특별히 결정할 것은 없다」면 보고다.
174
+ 사용자 확인에 한 줄을 넣는다 — 「결정 요청으로 낼까요, 보고로 낼까요」. **FCG 의견을 낼지는 따로 묻는다** — 내면 결정마다 `opinion` 칸 하나.
179
175
  4. **이미 정해진 것은 무엇이고, 누가·어디서 정했는가** — 작업 폴더 `decisions.json`(발행 안 함)에 항 · 내용 · 결정권(고객/FCG) · 정한 주체 ·
180
176
  기록(회신 원문·회의록·결정문의 이름과 날짜) · 사용자 확인 여부를 적는다(체크리스트 0a). 미확인 항은 원고에 쓰기 전에 **한 번에** 묻는다. 쓰는 법은 3b 「결정 주체」.
181
177
  5. **원고에서 부를 대상마다 독자가 보는 이름은 무엇인가** — 판·환경·인스턴스·설정·요금·문서처럼 우리가 작업하며 부르던 이름마다, 독자가 자기 화면·콘솔·계약서·원본 문서에서 보는 글자를 찾는다.
182
178
  작업 폴더 이름 대응표 `names.md`(발행 안 함)에 「우리가 부르던 이름 / 독자 화면·문서의 이름 / 그 이름이 보이는 자리」 세 열로 적고, 자료에서 못 찾은 것만 **한 번에** 묻는다.
183
179
  원고의 이름과 0.5단계 용어 잠금 표의 이름 열은 이 표의 둘째 열에서만 가져온다. 둘째 열이 빈 새 개념만 설명형으로 부르고 「원래 이름 없음」이라 적는다(반드시 지키는 것 12).
180
+ 6. **독자가 믿어야 할 관찰 주장(화면·흐름·화면 문구·동작)마다 무엇을 보여 주는가** — 「보여 줄 것(캡처·녹화·원문·센 대상이 있는 표) / 누가 찍나 / 필요한 접근(계정·기기·창·메일함·자동 조작 허락)」을 작업 폴더 `evidence.md`(발행 안 함)에 표로 적고, 모자란 접근은 원고를 쓰기 전에 대화창에서 **한 번에** 청한다.
181
+ 「X 하면 항상 Y」 같은 구조 주장은 관찰 하나로 단정하지 않는다 — 팀 지식(`search_cases`)을 먼저 뒤지고 코드 분기로 확인한다.
184
182
 
185
183
  독자가 정해지면 나머지가 전부 따라 정해진다. 같은 사실이 이렇게 갈린다.
186
184
 
@@ -189,7 +187,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
189
187
 
190
188
  | 내부 기록 | 고객 문서(주어가 우리·사물 · 개조식) |
191
189
  |---|---|
192
- | "저장 경로 6곳을 수정" | "저장이 일어나는 모든 경로를 수정**함**" |
190
+ | "저장 경로 6곳을 수정" | "저장이 일어나는 경로 6곳을 모두 고**침**" — 범위를 넓히지 않는다(content-pipeline 치환 D) |
193
191
  | "2026-08-09 운영 배포 완료" | "2026년 8월 9일 운영 환경에 반영**됨**" |
194
192
  | "별도 티켓으로 분리" | (그 일을 제 자리의 건으로 세우고 이 문장은 **지움** — 앞 절에서 뒤 절 건 번호를 가리키지 않는다, 0.5단계 7행) |
195
193
  | "회귀 테스트 2건 추가" | "같은 문제가 다시 나타나면 걸러지도록 상시 점검 **적용**" |
@@ -215,11 +213,11 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
215
213
  | 1 | **한 장 이야기** | 문제 → 원인 → 해법(지금 상태 포함) → 정할 것. 칸 수가 아니라 이야기 순서다 — 요지 칸 수는 4~6단계 「요지」 한 곳이 정본. 다루는 일의 **사건 경과** 표 한 장을 1절에 둔다(이 문서의 판 이력은 `history` — 3c) |
216
214
  | 2 | **예시 한 명** | 실존 이용자 하나의 실제 숫자로 문서 전체를 관통시킨다(같은 사람이 그림·표·건에 반복) |
217
215
  | 3 | **용어 잠금 표** | 같은 낱말이 두 값을 가리키면 그 자리에서 문서가 죽는다. 뜻이 갈리는 낱말은 표 한 장으로 값·정의·보이는 자리를 박는다. **이름 열은 0단계 이름 대응표(물음 5)의 독자 화면·문서 이름에서만 가져온다** — 표에 정의했다고 작업하며 지은 이름이 독자의 말이 되지는 않는다(경위: `references/history.md` §16). 장치 이름(건 행 `labels` 값)은 절 이름·부제·표 열·캡션에 다시 쓰지 않고, 선택지 기호(A·B·C)는 한 목록에만 붙인다. **이 스킬이 선택지를 부르는 「길」·「바꾸면/그대로 두면」도 장치 이름이다** — 원고에서는 선택지를 그것이 실제로 무엇인지(고객이 부르는 이름)로 부르고, 물건을 비유로 부르지 않는다(반드시 지키는 것 12). 집행자: `gazette.py` `text_scan()` ⚠(건 행 이름 충돌·선택지 기호 충돌·「길」) · 독자 검토 first-time 관점(한 낱말 두 값) · 뜻이 같은지·비유인지는 사람 눈 |
218
- | 4 | **절마다 시각 장치 먼저** | 개념은 그림, 실제 화면은 번호 표식 캡처, 견주기는 표, 「A 면 B」는 흐름도(원인 사슬은 `flow.mode:"cause"`), 분포는 막대 차트, **시간에 따른 값은 시계열**(`charts[].kind:"series"`), **공식 문서·회신 문구는 원문 인용**(`quotes`), **구조·흐름·순서·상태는 Archify 도해**(`diagrams`, `references/diagrams.md`). 글은 그 옆 3줄. 도판 층 R0~R10·R13 은 `figure.mjs`(비교 컷은 `shot.mjs --after` → `pair.mjs`), 글 층 R11 은 렌더러 ⚠ — 값은 `references/readability.md` 「1. 규칙표」 한 곳(경위: `references/history.md` §3) |
219
- | 5 | **판단 요청** | 요청은 **고객이 고를 물음**이다 — 제목은 물음, 본문 첫 문장은 기한과 두 길의 이름, 결과는 한눈표 **한 곳에만** 대칭으로. 모양·선택지 대칭 불변식·화면 도안 절차는 `references/visual-first.md` §5 와 `lim-portal-format.md` §12.3b. 집행자: `gazette.py` `brief_checks()` ⚠(기한·동일값 열) · ⚠ W1(권고 낱말) · 선택지 사이 대칭은 독자 검토 figures 관점 · 도안 유무는 **없음 — 사람의 눈**(`references/process.md` 7단계 표) |
220
- | 5a | **원본 확인** | 주장·그림마다 원본을 **댈 수 있어야** 한다. 출처 줄은 위치 한 구절(`references/readability.md` R12e — 우리 도안은 비움), 원본 이름·찾을 낱말은 건(`source_url`·`how_to_check`)이나 부록에, 제작 메타는 `origin` 으로(11번). 집행자: 독자 검토 source 관점(누를 수 있는 원본) · facts 관점(앱 동작·내부 수치·결정 주체) · `gazette.py` ⚠ W2 · `text_scan()` 제작 메타 ⚠ — 그 밖은 사람 눈 |
216
+ | 4 | **절마다 시각 장치 먼저** | <!-- 장치 목록에서 굽는 글 «skill-row» — 손으로 고치지 않는다: python3 tools/contract-devices.py --write -->내용 모양이 장치를 고른다 — 구조는 구성도·도판(개념도), 흐름은 흐름도·절차도·데이터 흐름도, 순서는 순서도, 상태는 상태 변화도, 변화는 두 판 비교·도판(두 컷 비교), 분포는 막대 차트, 시간에 따른 값은 시계열, 견주기는 표·점 차트, 원문은 원문 인용·도판, 화면은 도판·화면 녹화. 둘 수 있는 칸 · 서버 조건 · 한도 · 만드는 법은 `references/visual-first.md` §4 장치 표(정본 `private/builder/devices.py`). 글은 그 옆 3줄<!-- /장치 목록 «skill-row» --> |
217
+ | 5 | **판단 요청** | 결정 요청은 결정 블록의 칸(물음·기한·선택지·대칭 표)이 진다 — `references/decision-format.md`. 보고 모드의 판단 항목(검수 확인 요청)은 제목 「~ 요청」 · 본문 첫 문장 기한(5a) · 모양은 `references/visual-first.md` §5. 화면이 바뀌는 결정은 어느 모드든 도안까지(같은 §5 「화면 도안」). 집행자: `gazette.py` `brief_checks()` ⚠(기한) · ⚠ W1(권고 낱말) · 도안 유무는 **없음 — 사람의 눈**(`references/process.md` 7단계 표) |
218
+ | 5a | **원본·증거 확인** | 주장·그림마다 원본을 **댈 수 있어야** 한다. 화면·흐름·화면 문구·동작을 말하는 문장(관찰 주장)은 **독자가 문서 안에서 볼 증거**를 그 건·절에 둔다 — 실제 캡처·녹화·원문 인용·외부 문서(센 대상이 있는 표는 수·대조 결과의 증거 — 화면 주장은 표만으로 받치지 않는다). 도안(「— 도안」·「— 재현」·「실제 화면 아님」, AI 로 만든 합성 그림)은 설명이지 증거가 아니고, 「— 합성」(실제 캡처 + 옮겨 적은 글자)은 증거다. 없으면 찍어 싣거나, 우리가 안 본 것이면 `remaining` 으로 옮긴다 — 「화면 미확인」「코드상」 같은 헤지 낱말과 확인 방법 끝 「…에서 봄」은 증거가 아니다. 출처 줄은 위치 한 구절(우리 도안은 비움 — 캡처는 8b), 원본 이름·찾을 낱말은 건(`source_url`·`how_to_check`)이나 부록에, 제작 메타는 `origin` 으로(`references/readability.md` R12e·R14 · 11번). 집행자: `gazette.py` `evidence_scan()` ⚠ · `gazette.py` `plate_scan()` ⚠(작은 캡처) · 독자 검토 evidence 관점 · source 관점(누를 수 있는 원본) · facts 관점(앱 동작·내부 수치·결정 주체) · `gazette.py` ⚠ W2 · `text_scan()` 제작 메타 ⚠ — 그 밖은 사람 눈 |
221
219
  | 6 | **표기** | 인라인 표기(`**굵게**`·`==강조==`·`{{ok|칩}}`·`[글자](주소)`·**맨 주소**)와 절·PART 의 `tone`, 차트 행 `tone`, 건의 `source_url`, 요약면 `notice.state`. 그림 가리킴은 손으로 번호를 치지 않고 `{{그림:<assets id>}}` 토큰으로(번호·조사를 렌더러가 셈 — `lim-portal-format.md` §11-6). 색은 뜻으로(`lim-portal-format.md` 「11-6. 인라인 표기」) |
222
- | 7 | **독자 검토** | 발행 전 `references/reader-review.workflow.js` — 관점 여덟(상태 표 `args.state` 를 주면 아홉). 「처음 읽는 사람」·「선형 읽기」 두 관점은 렌더본 텍스트 하나만 받는다(`args.text` — `python3 assets/render.py report.json --text <원고 폴더 밖 빈 폴더>/본문.txt`) — 결정 장부·최신 지적·핸드오프를 먼저 받은 검토자는 처음 읽는 사람이 아니다(경위: `references/history.md` §18). **Verify 를 통과한 발견만 반영한다 — 검토자 주장도 틀린다.** 반영 순서는 사실 틀림 → 구조(합치기·빼기) → 나머지. **빼기가 포인터를 남기면 안 된다** — 「N절을 보라」「건 §n.n」「부록에 있다」로 대신하면 독자가 장을 오가는 시험지가 된다. 낱말·규칙·예시 선언은 **첫 등장 자리에서 한 구절**, 뒤 절의 번호·표 이름·§ 는 앞 절에서 쓰지 않는다(요약 근거는 `refs[]` 로). 선형 읽기 관점의 **뜀 지점(`jumps`) 0 이 목표**이고, 문서가 붙인 이름(`names` — 정의가 있어도 발견)도 0 이 목표다(실측은 `references/linear-read-test.workflow.js`, 독자 셋+결정권자). 관점·인자·JS 거름 규칙은 `references/visual-first.md` §7. 집행자: 워크플로 관점 + JS 거름 · 뒤 절 번호는 렌더러 ⚠ 「앞 절이 뒤 절을 가리키는 곳」(`gazette.py text_scan` W5 · readability R12h) · 정의 위치와 `questions`·`dropped` 는 사람 눈(경위: `references/history.md` §9·§12). **낱말만 고친 판도 검토 없이 내지 않는다** — 변경 자리만 보는 `references/edition-review.workflow.js`(세 관점 + 반박)로 돌린다. 렌더러 경고 0 만 보고 낸 15판이 다음 판 8자리 손질을 낳았다(2026-09-15). 사용자가 「바로 반영」을 지시하면 먼저 내고 이 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(같은 날 사용자 결정) |
220
+ | 7 | **독자 검토** | 결정 모드는 체크리스트 「7 독자 검토(결정 모드)」 행 한 번이 전부다. 그 밖은 발행 전 `references/reader-review.workflow.js` — 관점 아홉(상태 표 `args.state` 를 주면 열). 「처음 읽는 사람」·「선형 읽기」 두 관점은 렌더본 텍스트 하나만 받는다(`args.text` — `python3 assets/render.py report.json --text <원고 폴더 밖 빈 폴더>/본문.txt`) — 결정 장부·최신 지적·핸드오프를 먼저 받은 검토자는 처음 읽는 사람이 아니다(경위: `references/history.md` §18). **Verify 를 통과한 발견만 반영한다 — 검토자 주장도 틀린다.** 반영 순서는 사실 틀림 → 구조(합치기·빼기) → 나머지. **빼기가 포인터를 남기면 안 된다** — 「N절을 보라」「건 §n.n」「부록에 있다」로 대신하면 독자가 장을 오가는 시험지가 된다. 낱말·규칙·예시 선언은 **첫 등장 자리에서 한 구절**, 뒤 절의 번호·표 이름·§ 는 앞 절에서 쓰지 않는다(요약 근거는 `refs[]` 로). 선형 읽기 관점의 **뜀 지점(`jumps`) 0 이 목표**이고, 문서가 붙인 이름(`names` — 정의가 있어도 발견)도 0 이 목표다(실측은 `references/linear-read-test.workflow.js`, 독자 셋+결정권자). 관점·인자·JS 거름 규칙은 `references/visual-first.md` §7. 집행자: 워크플로 관점 + JS 거름 · 뒤 절 번호는 렌더러 ⚠ 「앞 절이 뒤 절을 가리키는 곳」(`gazette.py text_scan` W5 · readability R12h) · 정의 위치와 `questions`·`dropped` 는 사람 눈(경위: `references/history.md` §9·§12). **낱말만 고친 판도 검토 없이 내지 않는다** — 변경 자리만 보는 `references/edition-review.workflow.js`(세 관점 + 반박)로 돌린다. 렌더러 경고 0 만 보고 낸 15판이 다음 판 8자리 손질을 낳았다(2026-09-15). 사용자가 「바로 반영」을 지시하면 먼저 내고 이 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(같은 날 사용자 결정 · 10단계 행) |
223
221
  | 8 | **실물 확인** | 발행할 때마다 체크리스트 9단계 두 행 — 블록 목록 대조와 열람 주소 열기. 집행자: 사람 — 발행 뒤 대조 기계는 아직 없다 |
224
222
 
225
223
  상세와 도판 예산(장당 300KB · 합계 2,400KB), 그림 만드는 법, 반려 사례는 `references/visual-first.md`.
@@ -229,8 +227,8 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
229
227
  ### 1·2단계 — 자료 모으기 → `cases.json`
230
228
 
231
229
  건별로 **증상 · 원인 · 조치 · 확인 방법 · 확인 요청** 다섯 칸을 채운다. **다섯 칸의 주어는 우리·사물·화면이다** — 독자가 할 일은 이 칸에 쓰지 않고 요청 절에 둔다(반드시 지키는 것 5).
232
- `확인 방법`은 **고객이 자기 화면에서 볼 수 있는 결과**다 — 어디를 열면 무엇이 보이는지를 사실로 적는다(「주문서를 저장하면 목록에 새로고침 없이 바로 보임」). 이게 없으면 검수 요청이 아니라 통보다.
233
- `확인 요청`(`remaining`)은 **아직 닫히지 않은 것**만 적는다 — 무엇이 아직 미확인·미결인지와 운영에 아직 안 나간 우리 작업(`references/content-pipeline.md` §1.1). 독자의 판단이 필요하면 그 사실만 적고(「기준 수치는 미정」) 부탁은 요청 절 항으로 세운다. 없으면 비운다.
230
+ `확인 방법`은 **독자가 그 결과를 볼 자리 + 우리가 그것을 본 때·환경**이다. 볼 자리는 이 문서의 그림·영상·원문 인용(`{{그림:id}}`·`quotes`)이나 독자 자기 화면(어디를 열면)이고, 동사는 우리가 본 수준까지다(본보기 04-1 「주문서를 작성해 저장하면 새로고침 없이 그 주문이 목록 첫 줄에 나타남({{그림:order-saved}}), 8. 23. 운영 관리자 웹에서 봄」). 이게 없으면 검수 요청이 아니라 통보다. 볼 자리가 독자 자기 화면뿐이면 렌더러 ⚠ 는 남고 그 수는 승인 물음에 싣는다(10단계 행).
231
+ `확인 요청`(`remaining` — 렌더본 건 행 머리 「미결」, 렌더러 경고의 「남은 것 칸」)은 **아직 닫히지 않은 것**만 적는다 — 무엇이 아직 미확인·미결인지와 운영에 아직 안 나간 우리 작업(`references/content-pipeline.md` §1.1). 우리가 안 본 결과는 확인 방법에 쓰지 않고 여기에만 둔다 — 같은 건에 단정과 「안 봄」이 함께 서면 독자는 단정을 읽는다. 독자의 판단이 필요하면 그 사실만 적고(「기준 수치는 미정」) 부탁은 요청 절 항으로 세운다. 없으면 비운다.
234
232
 
235
233
  → 필드 정의와 작성 규칙: `references/content-pipeline.md`
236
234
 
@@ -265,7 +263,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
265
263
 
266
264
  ### 4~6단계 — 뼈대 쓰기 → `report.json`
267
265
 
268
- **관보 골격은 순서가 정해져 있다.** 바꾸지 않는다.
266
+ **관보 골격은 순서가 정해져 있다.** 바꾸지 않는다. 결정 모드는 이 단계 대신 `references/decision-format.md` — PART·여백 주석·요약면이 없다.
269
267
 
270
268
  ```
271
269
  표지 → 발행 이력 → 차례 → 이 문서 읽는 법 → 요약
@@ -280,16 +278,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
280
278
  3. 여러 건을 관통하는 공통 원인
281
279
  4. 요청 절에 무엇이 남았는가 — 항 이름과 기한(부탁 문장은 요청 절이 가진다)
282
280
 
283
- 「결정한다」판은 **4~6문단**이다 — 결정권자가 첫 화면에서 yes/no 를 고를 수 있어야 한다. **순서의 정본은 여기 한 곳이다**(`references/visual-first.md` §1 의 이야기 순서는 검수·보고판의 것).
284
- 아래 넷이 뼈대다. 앞선 결정·화면 규격·실측 같은 **배경 문단**은 1 앞에 올 수 있고, 4(결정 뒤)는 1 문단의 `body` 로 붙일 수 있다.
285
- 2(선택지 편익·비용)는 그 절에 선택지 비교 행렬이 있으면 배경 문단이 대신한다 — 요지에서 표를 옮겨 적지 않는다(R12c). 본보기가 그 모양이다(`assets/example/report-briefing-designs.json`).
286
- 결정에 직접 닿는 문단만 `body`(세 문장 안)를 쓰고, 근거 문단은 `lead` 한 줄 + `refs` 로 두고 `body` 를 비운다 — 본문은 건이 가진다(readability R12g).
287
- 집행자: 독자 검토 structure 관점 · 사람 눈 — 기계 없음.
288
-
289
- 1. 무엇을 **언제까지** 결정해야 하는가 — 「무엇을 언제까지」 그 한 줄은 요약면 현황 줄(`notice`)의 몫이다
290
- 2. 검토한 선택지와 각각의 편익·비용·불확실성
291
- 3. **확인한 사실과 근거 등급**(권고 없음 — FCG 의견은 별도 절 한 자리)
292
- 4. 결정 뒤 이어지는 것(누가·무엇을·언제)
281
+ 결정 모드는 요약을 받지 않는다 — 첫 화면은 렌더러가 `decisions`·`confirms`·`risks` 로 세운다.
293
282
 
294
283
  그리고 **절마다 여백 주석 세 줄**을 쓴다. 이것이 안 채워지면 두 단 본문이 한 단으로
295
284
  서고, 문서는 「문서처럼 꾸민 웹페이지」로 되돌아간다.
@@ -321,7 +310,7 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
321
310
  빠지면 ⚠ 로 소리 내어 센다. `marg` 가 비었다는 경고를 못 보고 넘기면 두 단이 한 단으로 선다.
322
311
 
323
312
  **기본은 초안이다.** 도구가 `publish` 를 참으로 주지 않는 한 고객에게 안 보인다.
324
- 공개 직전 날짜를 맞춘 뒤(3c) `release_report(id)` 로 연다 — 그것이 사람의 승인 행위다(체크리스트 10단계).
313
+ 공개 직전 날짜를 맞춘 뒤(3c) `release_report(id)` 로 연다 — 그것이 사람의 승인 행위다(체크리스트 10단계 행).
325
314
 
326
315
  **수정 절차** — 올라 있는 판에서 출발한다. **같은 링크가 새 내용을 가리킨다.**
327
316
 
@@ -358,7 +347,7 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
358
347
 
359
348
  ### 9a단계 — 첨삭 메모 반영: 「메모 해놨다」를 들으면
360
349
 
361
- 사람은 초안을 읽으면서 머리 도구줄 **「첨삭 메모」**로 자리를 집어 고칠 곳을 적는다. 우리 팀(admin·editor)만 달고 보며, **고객에게는 공개 뒤에도 안 보인다**(검토 회신 핀과 다른 점). 사람이 「메모 해놨다」「첨삭 달아 놨다」고 하면 아래 순서로 반영한다 — **무엇을 고칠지 대화창에서 되묻지 않는다.** 메모가 이미 말한다.
350
+ 사람은 초안을 읽으면서 머리 도구줄 **「첨삭 메모」**로 자리를 집어 고칠 곳을 적는다. 우리 팀(admin·editor)만 달고 보며, **고객에게는 공개 뒤에도 안 보인다**(검토 회신 핀과 다른 점). 사람이 「메모 해놨다」「첨삭 달아 놨다」고 하면 아래 순서로 반영한다 — **무엇을 고칠지 대화창에서 되묻지 않는다.** 메모가 이미 말한다. 다만 증빙을 찍는 데 모자란 접근·권한은 대화창에서 청한다(6행).
362
351
 
363
352
  | 순서 | 도구 | 할 일 |
364
353
  |---|---|---|
@@ -366,8 +355,8 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
366
355
  | 2 | `list_notes(id)` | 미반영 메모를 읽는다. `anchor.path`(예 `case:k7m2p9/fix`)가 **고칠 칸**, `anchor.quote_exact` 가 사람이 **본 글**이다. 답글은 사람이 덧붙인 설명이다 |
367
356
  | 3 | 8단계 「수정 절차」 1~5 | 받은 판을 받아 두고, 메모마다 고칠 칸을 draft 에 적어 `--freeze` 로 굳혀 새 판을 만들고, 로컬 렌더 · dry_run(받은 판의 `body_rev` 를 실어) · 판 갱신 검토까지 돈다 |
368
357
  | 4 | 8단계 「수정 절차」 6 | 메모를 모두 반영한 판을 **한 번에** `update_report(body_rev: …)` 로 보낸다. `uid` 는 받은 값 그대로 남는다(`patch.py` 는 고친 칸만 바꾼다) — 흘리면 메모가 자리를 잃는다. 초안은 초안 그대로 남는다 |
369
- | 5 | `resolve_note(id, note, rev)` | **고친 뒤에만.** 반영이 실린 `body_rev` 를 함께 준다. 먼저 부르면 미반영 목록에서 빠져 다시 안 보인다 |
370
- | 6 | `reply_note(id, note, body)` | 못 고치거나 다르게 본 메모는 **닫지 말고** 그 메모에 이유를 답글로 단다 |
358
+ | 5 | `resolve_note(id, note, rev)` | **고친 뒤에만.** 반영이 실린 `body_rev` 를 함께 준다. 먼저 부르면 미반영 목록에서 빠져 다시 안 보인다. 증빙(화면·영상·근거)을 요구한 메모는 실물이 실린 판에서만 닫는다 — 도해·설명을 더한 판으로 닫지 않는다 |
359
+ | 6 | `reply_note(id, note, body)` | 못 고치거나 다르게 본 메모는 **닫지 말고** 그 메모에 이유를 답글로 단다. 못 찍은 증빙이면 「못 함」 답글 전에 필요한 접근을 대화창에서 청한다(0단계 물음 6) |
371
360
  | 7 | `remember_case`·`remember_decision`(메모가 반려일 때) | 반려를 팀 기억에 남길 때 「스킬 반영: `references/history.md` §n / 미반영(까닭)」 한 줄을 함께 적는다. 반려가 작업하며 지은 이름을 짚었으면 그 이름과 독자 화면의 원래 이름을 그 반려 결정(`remember_decision`)의 `rejected_names` 칸에 `{name, use}` 로 적는다(흔한 낱말이면 함께 설 낱말을 `near` 에) — 같은 소속처의 발행·모의 발행·로컬 렌더가 그 목록으로 센다. 확인은 `list_rejected_names`. 운영 반영 확인 전(2026-09-26) — 서버 배포 전에는 이 칸이 안 적힌다(응답이 「이 서버는 아직 그 칸을 모른다」고 말한다) |
372
361
 
373
362
  `anchor_state` 가 `unmoored`·`reparented` 면 문서가 바뀌어 자리를 잃은 메모다 — `quote_exact` 로 본문에서 찾아 고치고, 못 찾으면 답글로 묻는다. 끝나면 사람에게 **한 줄로** 알린다: 반영 N건 · 답글로 되물은 N건 · 문서 링크.
@@ -421,17 +410,15 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
421
410
 
422
411
  | 파일 | 역할 |
423
412
  |---|---|
424
- | `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지 마라. `--text <출력.txt>` 는 렌더가 성공한 뒤 화면에 보이는 글만 화면 순서대로 텍스트로 뽑는다(그림 자리 「[그림]」 · 표 칸 「 \| 」 · `origin`·alt·스크립트 없음) — 독자 검토의 입력이고, 원고 폴더 안에 쓰면 ⚠ 가 뜬다. `get_report` 로 받은 원고도 그대로 굽는다(받을 때는 `mcp-call.mjs --json` — 머리줄이 붙으면 못 읽는다) — `out` 이 없으면 원고 이름 옆 `.html` 로 쓰고, 도판(figure) 표식은 서버 기록 치수의 자리 상자로 그린다(`render.py kept_stand_ins()` — ⚠ 대신 「보관 그림 N장」 한 줄, 그 HTML 은 검토본). 로고 표식은 표지에서 고객사 이름 활자로 선다. 원고에 `out` 이 있으면(작성 원고 — 전달 경로) 그 한 줄은 ⚠ 로 선다. `--tenant <slug>`(없으면 원고의 `tenant`)는 그 소속처가 반려한 이름을 옆 `mcp-call.mjs` 로 MCP `list_rejected_names` 를 불러 받아 함께 센다 — 못 받으면 ⚠ 한 줄을 내고 반려 이름만 빼고 굽는다(`references/lim-portal-format.md` §10-1) |
413
+ | `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지 마라. `render.py --text <출력.txt>` 는 렌더가 성공한 뒤 화면에 보이는 글만 화면 순서대로 텍스트로 뽑는다(그림 자리 「[그림] <id> · <갈래>」 · 글 끝 「[그림 파일]」 목록 — 실린 바이트는 옆 `<이름>-그림/` 에 풀림 · 표 칸 「 \| 」 · `origin`·alt·스크립트 없음) — 독자 검토의 입력이고, 원고 폴더 안에 쓰면 ⚠ 가 뜬다. `get_report` 로 받은 원고도 그대로 굽는다(받을 때는 `mcp-call.mjs --json` — 머리줄이 붙으면 못 읽는다) — `out` 이 없으면 원고 이름 옆 `.html` 로 쓰고, 도판(figure) 표식은 서버 기록 치수의 자리 상자로 그린다(`render.py kept_stand_ins()` — ⚠ 대신 「보관 그림 N장」 한 줄, 그 HTML 은 검토본). 로고 표식은 표지에서 고객사 이름 활자로 선다. 원고에 `out` 이 있으면(작성 원고 — 전달 경로) 그 한 줄은 ⚠ 로 선다. `--tenant <slug>`(없으면 원고의 `tenant`)는 그 소속처가 반려한 이름을 옆 `mcp-call.mjs` 로 MCP `list_rejected_names` 를 불러 받아 함께 센다 — 못 받으면 ⚠ 한 줄을 내고 반려 이름만 빼고 굽는다(`references/lim-portal-format.md` §10-1) |
425
414
  | `assets/patch.py` | 원고 **부분 고치기(멱등)** — `python3 assets/patch.py report.json edits.json`. 회차마다 고치는 파이썬을 새로 짓지 말고 **데이터(edits.json)만** 남긴다. op 일곱: `set`·`replace`·`drop_rows`·`remove_row`·`append_row`·`insert_row`·`forbid`(칸과 뜻은 머리 주석 op 표). 표 줄은 번호 대신 첫 칸 글자로 가리킨다 — `rows[label=…]` 는 앞 op 가 줄을 끼우거나 빼도 같은 줄을 찾고, 그 글자인 줄이 하나가 아니면 멈춘다(2026-09-30 — 9/29 수정 판에서 통째로 바꾼 표 여섯을 줄 op 로 다시 써도 공개본과 같았다). 그 줄의 **첫 칸을 바꾸는** 편집은 `[label=…]` 로 적지 않고 번호 경로로 적는다 — 첫 실행 뒤 그 글자가 없어져 두 번째 실행이 줄을 못 찾으므로 돌리기 전에 멈춘다. 배열 원소는 `assets[id=…]` 처럼 `id` 로도 가리키고(끝자리여도 된다), 없는 칸은 만들지 않고 멈춘다. 두 번 돌려 「바꿈 0」이 계약이고, 값이 `old` 도 `new` 도 아니면 **멈춘다**(그 사이 누가 고쳤다는 뜻). `set` 의 `old` 는 손으로 옮기지 않는다 — draft 에 `new` 만 적고 `python3 assets/patch.py <받은 판> draft.json --freeze edits.json` 이 받은 판에서 채운다. 받은 판 사본에 두 번 돌려 첫째 건너뜀 0 · 둘째 바꿈 0 일 때만 OUT 을 쓰고, 줄을 끼우거나 뺀 표의 칸을 번호로 가리키는 `old` 없는 `set` 은 굳히지 않으며(`[label=…]` 로 가리킨다), 적용에 `old` 없는 `set` 이 오면 멈춘다. 편집이 도판 칸(`assets…`)을 고치면 「교체 인자에 assets 를 표식째 싣는다」를 알린다(`patch.py freeze()` — 2026-09-29 수정 판에서 긴 표 행의 `old` 를 스크래치 스크립트로 채웠던 자리). 회차 스크립트가 쌓여 고객사 문서 폴더가 플랫폼이 되던 것을 멈추려고 들였다(2026-09-22 — 한 폴더 2,563줄·다른 폴더 4,285줄 실측) |
426
- | `assets/xlsx-plate.py` | 스프레드시트 칸을 **근거 도판**으로 — `python3 assets/xlsx-plate.py 파일.xlsx 시트 B40:E48 out.png --html wrap.html`. 원본은 읽기만 하고 사본에서 인쇄 범위를 잘라 LibreOffice → PDF → PNG. ⚠ **LibreOffice 가 시스템 폰트를 못 보는 기계가 있다** — 그때 한글만 빠진 그림이 조용히 나가므로, 렌더 뒤 PDF 에 한글이 실렸는지 스스로 확인하고 없으면 멈춘다(2026-09-22 macOS 실측). 나온 PNG 는 감싸개 HTML 로 `figure.mjs` 관문을 지나야 도판이 된다 |
427
415
  | `assets/subset_font.py` | 폰트 서브셋 생성 (보통 실행 불필요) |
428
- | `assets/example/report.json` · `cases.json` | 관보 필드를 전부 채운 본보기. 새 문서는 여기서 베낀다 |
429
- | `assets/diagram.mjs` | Archify 도해를 관보 `diagrams[].svg` 로 굳힌다 — `render <type> <ir.json> <out.svg> --wide --min-text 16 --tight`(Archify deliver → 계산된 스타일을 속성으로 → 클래스·스크립트·애니메이션 걷음 → 작은 글자 키움·빈 띠 조임·겹침 측정) · `export <html> <out.svg>` · `inspect <svg>`. 렌더러와 같은 잣대(바이트 250KB · viewBox · 표시 글자 15px)로 재고 ✗ 면 exit 3. Archify 자체는 동봉하지 않는다(`references/diagrams.md` §1) |
430
- | `assets/figure.mjs` · `shot.mjs` · `mockshot.mjs` · `pair.mjs` | 도판 도구 — 도판 HTML 을 굽고 가독성·틀 문법 관문(R0~R10·R13)을 잰다, `--batch plates.json` 은 일괄 판정과 예산 합계, `--spec` 은 계약 상수(`figure.mjs`) · 웹 화면을 검정 원 번호 표식과 함께 찍고 `--after` 로 블록을 숨긴 전후 두 장을 같은 구간으로 찍는다(`shot.mjs`) · 고객 앱 화면 도안을 2배 밀도로 찍는다(`mockshot.mjs`, `references/visual-first.md` 「화면 도안」) · 전후 두 컷을 좌우 같은 틀·같은 배율로 조립하고 판정까지 찍는다(`pair.mjs`, 본보기 `assets/example/plate-pair.html`) |
416
+ | `assets/example/report.json` · `cases.json` | 관보 필드를 전부 채운 본보기. 새 문서는 여기서 베낀다 — 본보기의 캡처는 가상 고객사의 가상 화면이고, 실제 문서에는 실물 캡처를 싣는다 |
417
+ | `assets/figure.mjs` · `shot.mjs` · `pair.mjs` · `mockshot.mjs` · `xlsx-plate.py` | 도판을 만드는 도구 — 무엇을 언제 쓰는지와 문서에서 말해도 되는 옵션은 장치 표(`references/visual-first.md` §4 — 정본 `private/builder/devices.py`), 도판 규칙의 값은 `references/readability.md` §1. 계약 상수는 `figure.mjs --spec` 이 낸다. `xlsx-plate.py` 는 원본을 읽기만 하고 사본에서 인쇄 범위를 잘라 굽는다 — LibreOffice 가 한글 폰트를 못 보는 기계에서는 PDF 에 한글이 없음을 재고 멈춘다(2026-09-22 macOS 실측) |
431
418
  | `references/linear-read-test.workflow.js` | 선형 읽기 **실측** — 처음 읽는 사람 셋 + 결정권자가 앞에서 뒤로 한 번 읽으며 뛰어야 하는 자리를 전부 센다(`args: {text, file, reader, round}` — `text`(필수)는 `render.py --text` 로 뽑은 렌더본 텍스트이고 읽는 넷은 이 파일 하나만 읽는다. `file`(필수)은 그 렌더본을 뽑은 `report.json` 이고 렌더본이 원고보다 새로운지 재는 데만 쓴다 — 읽는 넷에게는 주지 않는다. 둘 중 하나가 없거나 렌더본이 비었거나 원고보다 오래되면 읽기 전에 멈춘다. 재측정은 `round` 를 바꿔야 캐시를 안 탄다). 뜀 0 이 목표. 독자 검토(`reader-review.workflow.js`)의 linear 관점이 같은 읽기를 하나로 한다 |
432
419
  | `references/edition-review.workflow.js` | **판 갱신 검토** — 구조는 그대로이고 낱말·출처 줄·여백 주석만 고친 판의 **변경 자리**(`assets/patch.py` 의 편집 목록 `edits.json` — 옛 `edit-N.py` 의 put/sub 호출도 받는다)를 규칙 대조·사실 대조로, 새 판 렌더본 전체를 선형 독자로 읽고 심각도 3 이상은 진단과 처방을 따로 반박한다(`args: {file, backup, edits, doc, text}`, 편집 스크립트면 `edits` 대신 `edit_script` · `patch` 는 편집 목록을 굳힌 그 patch.py 의 경로(기본 스킬 설치본 — 없거나, 그 목록을 못 읽는 판이거나, 새 판에 편집이 아직 적용돼 있지 않으면 시작 전 검사에서 멈춘다) · `canon` 은 수치 편집을 대조할 정본을 가리키는 한 줄(안 주면 검토자가 `doc` 글·`handoff` 에서 찾고, 어디에도 없으면 「정본 없음」으로 적는다) · `renderer` 는 규칙 관점과 반박이 읽을 렌더러 — 결과 `kept`(진단이 거짓 아님, 처방이 규칙에 걸리면 `rx`)·`refuted`(진단 거짓)·`weak`·`unverified`(상한 밖·검증 실패), 실패가 있으면 `head` 「검토 미완」). 사실 관점이 백업↔새 판 JSON diff 에 바뀐 자리가 모두 기록에 있는지(줄 수가 아니라 자리로) 검산한다 — 편집 목록이면 백업 사본에 `patch.py` 를 적용한 결과가 새 판과 같은지와 수치를 바꾼 편집 전부, 편집 스크립트면 수치 무변경. 구조가 바뀐 판은 `reader-review.workflow.js`. 낱말 손질 판을 검토 없이 발행하자 다음 판 8자리 손질이 생겼다(2026-09-15) |
433
- | `assets/example/report-briefing.json` · `cases-briefing.json` | 「결정한다(R&D 브리핑)」 모드 본보기 — 물음 제목 · 두 길 대칭 한눈표 · 선택지 전치 행렬 · FCG 의견 표 한 장 · 바꾸는 길의 위험 · 고른 길별 일정 · `cta` 기본 `[]` |
434
- | `assets/example/report-briefing-designs.json` · `cases-briefing-designs.json` | 「결정한다」 도안 결재형 본보기 — 세 길 · 전폭 선택지 도판(자리 표시) · 조건표 · 선택지마다 한 행인 의견 표 · 판단 항목 둘(물음 + 「… 확인 요청」) · 확인 프로필 표(`references/lim-portal-format.md` §12.3b) |
420
+ | `assets/example/decision.json` | 결정 블록 본보기(결정 모드) — 지어낸 예시 고객사의 결정 둘(선택지 둘·확인·위험 크기 / 선택지 셋·결정 뒤 확인) |
421
+ | `assets/example/report-briefing*.json` · `cases-briefing*.json` | 옛 결정 브리핑(결정 블록 전 보고 모드) — 이미 나간 문서를 고칠 때만 본다, 새 결정 문서에 베끼지 않는다(렌더러 바이트 시험 자료라 지우지 않는다) |
435
422
  | 폰트 | **레포** `private/builder/fonts/pretendard-gazette.woff2` — 가변 1면 |
436
423
 
437
424
  **스킬에는 렌더러도 스타일시트도 검사기도 없다.** 셋 다 레포와 `gazette-report` 스킬에 있고,
@@ -447,7 +434,8 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
447
434
  2. **`§` 같은 기호를 본문에 노출하지 않는다.** 원고에서는 참조 마커로 쓰되 렌더에서 지운다(빌드가 처리).
448
435
  3. **개발 절차 서술을 빼거나 고쳐 쓴다.** 배포·티켓 분리·테스트 추가·설계 검토안은 고객의 관심사가 아니다.
449
436
  **코드 작업을 녹일 때**는 원고를 쓰기 전에 원고 밖 상태 표(무엇 · 코드 반영 · 시험판 전달 · 실기기 · 운영, 칸마다 근거)를 만들고, 문서의 동사는 그 표의 확인 수준을 넘지 않게 고른다(`references/content-pipeline.md` 「4.2 치환 유형」).
450
- 커밋·브랜치·파일·시험 도구·시험 건수는 그 표에만 둔다. 원고에 새면 `gazette.py` `text_scan()` 개발 식별자 ⚠, 확인 수준을 넘는 동사는 독자 검토 state 관점(`args.state`)과 사람 눈.
437
+ 공수·견적·측정 방법(조건·도구)도 싣지 않는다 — 고객의 고충이 아니라 우리 과정이다(돈은 드는지·언제 아는지·누가 내는지만, `references/decision-format.md` 2절).
438
+ 커밋·브랜치·파일·시험 도구·시험 건수는 그 표에만 둔다 — 다만 어디서 봤는지(화면에서 봄 · 운영 서버에 물어봄 · 시험으로 봄 · 코드로 봄)는 문장에 남긴다(치환 G). 원고에 새면 `gazette.py` `text_scan()` 개발 식별자 ⚠, 확인 수준을 넘는 동사는 독자 검토 state 관점(`args.state`)과 사람 눈.
451
439
  3b. **회차 서술을 본문 절에 두지 않는다.** 「이번 회차에 추가함」·「이번 회차 미확인 사항」은
452
440
  우리 작업 순서이지 그 절의 내용이 아니다. 고객은 이 문서를 **처음 읽는 사람**이고,
453
441
  그에게 필요한 것은 무엇이 적혀 있느냐이지 우리가 언제 적었느냐가 아니다.
@@ -466,7 +454,8 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
466
454
  3c. **공개 전 수정은 판이 아니다.** `history` 는 공개할 판 한 행(「최초 발행」)이고, `meta` 의 작성 · 판권지 작성 · `history` 마지막 `date` 는 **한 값**이며 공개하는 날로 맞춘다(체크리스트 10단계 — 공개 직전 8단계 「수정 절차」로 한 번).
467
455
  공개 뒤 내용이 바뀐 update 에만 `history` 행을 더한다. 문서 밖 결정의 날짜는 본문에 적지 않는다. `cover_date` 는 요약면 「기준」 날짜(수치의 기준일)라 이 셋과 대조하지 않는다.
468
456
  집행자: `gazette.py` `date_scan()` ⚠ — 세 자리를 년·월·일로 견줘 다르면 센다(두 경로 · `lim-portal-format.md` §10-1). 공개하는 날인지와 `history` 행 수는 사람(체크리스트 행) · 공개 때 날짜 안내(`release_report`)는 아직 기계가 없다(경위: `references/history.md` §12).
469
- 4. **확인 못 한 범위를 반드시 적는다.** 감추면 다음 보고서까지 못 믿게 된다.
457
+ 4. **확인 못 한 범위를 반드시 적는다 — 그 건의 `remaining` 에 한 번.** 감추면 다음 보고서까지 못 믿게 된다.
458
+ 그 결과를 확인 방법에서 단정하지 않고(1·2단계), 칸마다 「미확인」「코드상」을 덧달지도 않는다 — 해명서로 읽힌다.
470
459
  5. **톤은 주어와 자리가 함께 정한다.** 요청 자리 밖에는 주어가 우리·사물·화면인 문장만 쓰고 개조식 `~함 / ~했음 / ~임` 으로 맺는다.
471
460
  **독자가 주어인 문장 — 독자가 할 일 — 은 요청 자리에만 두고, 요청 자리는 사실을 말하는 문장까지 모두 하십시오체로 맺는다.** 요청 자리는 요청 절(`cta`·`open_items`)·PART I 간지(PART I 이 요청·결정 PART 일 때)·판권지의 회신 안내,
472
461
  그리고 요청 절 항을 부탁하는 읽는 법(`guide`) 한 줄(「시험판 확인은 확인 프로필 표의 네 경우로 부탁드립니다」 꼴)이다(2026-09-15 사용자 결정) — 항을 가리키기만 하는 사실 줄은 요청 자리가 아니다. 그 밖의 칸 — 건의 다섯 칸·요약·절 도입문·여백 주석·문단·표·부록 — 에는
@@ -475,14 +464,14 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
475
464
  **까닭은 하나다.** 명사형 종결(`-ㅁ/-음`)은 한국어 상대높임 등급 밖이라 청자 높임이 0 이다. 주어가 사물이면 기록체지만, 독자가 주어면
476
465
  명령·떠넘김으로 읽힌다 — 반려된 「회신 필요」「주시면 됨」「부탁드림」「~을 보라」「~할 것」「~해야 함」「~몫임」은 모두 이 한 꼴이다(경위: `references/history.md` §5).
477
466
  관보 원전(행정안전부·KISA 지침서)은 위에서 아래로 지시하는 문서라 이 꼴이 제 말투다. 우리 독자는 아래가 아니라 결정권자다 — **조판만 가져오고 말투는 가져오지 않는다.**
478
- 이름(제목·표 머리·라벨의 명사구 — 「고객사가 정할 것」「회신이 필요한 것 4가지」)은 문장이 아니고, 물음(여백 주석 Why·PART 물음·판단 항목의 물음 제목)은 독자의 목소리로 묻는 것이라 명령이 아니다 — 둘 다 그대로 둔다.
467
+ 이름(제목·표 머리·라벨의 명사구 — 「고객사가 정할 것」「회신이 필요한 것 4가지」)은 문장이 아니고, 물음(여백 주석 Why·PART 물음·판단 항목의 물음 제목)은 독자의 목소리로 묻는 것이라 명령이 아니다 — 둘 다 그대로 둔다. 확인 방법 끝의 「8. 23. 운영 관리자 웹에서 봄」도 우리가 주어인 기록이다.
479
468
  사물이 주어여도 판정만 던지는 계사문(「순서는 다른 항목 뒤임」)은 무성의하게 읽힌다 — 우리 행위 동사로 적는다(「다른 항목을 마친 뒤 착수함」).
480
469
  5a. **요청 자리의 꼴** — 모든 문장이 종결까지 존댓말이다(사실 문장도 「…나올 수 있습니다」). 다른 칸에서는 맨 오른쪽 열처럼 사실로 적는다.
481
470
 
482
471
  | 독자가 할 일 | 쓰지 않는다 | 요청 자리 | 다른 칸(사실) |
483
472
  |---|---|---|---|
484
473
  | 제목 | ~해 주셔야 함 · 서술문 제목 · ~하시겠습니까? | 검수·보고는 **~ 요청** + 기한 괄호, 결정은 **물음**(「…할 것인가」 — 기한은 본문 첫 문장, 0.5단계 5행) | — |
485
- | 확인 | 열어 볼 것 · 보면 됨 · ~인지 확인 · 확인 필요 | 확인해 **주시기 바랍니다** | 확인 방법: 「목록을 열면 1초 안에 뜸」 |
474
+ | 확인 | 열어 볼 것 · 보면 됨 · ~인지 확인 · 확인 필요 | 확인해 **주시기 바랍니다** | 확인 방법: 「그 주문이 목록 첫 줄에 나타남({{그림:order-saved}}), 8. 23. 운영 관리자 웹에서 봄」 |
486
475
  | 조건 부탁 | 알려 주시면 맞출 예정 · 보시면 확인됨(가장 많이 샌 꼴) | 알려 주시면 **맞추겠습니다** | 확인 요청: 「기준은 대조 결과를 받은 뒤 맞출 예정」 |
487
476
  | 회신·결정 | 회신 필요 · 주시면 됨 · 정해야 함 · 부탁드**림** · ~몫임 | 회신 **부탁드립니다** · 정해 주시면 **반영하겠습니다** | 확인 요청: 「기준 수치는 미정」 |
488
477
  | 문의 | 업체에 물어야 함 | 업체에 한도를 확인해 **주시기 바랍니다** | 확인 요청: 「그 시스템의 한도는 미확인」 |
@@ -501,7 +490,8 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
501
490
  (`.sn { display:block; padding-left:1em; text-indent:-1em }`).
502
491
  적용은 `gazette-report` 의 `scripts/sentbreak.py --apply`, 검사는 `tone.mjs`.
503
492
  ⚠ 라벨-값 양식 행·차례 항목·상태 칩에는 적용하지 않는다 — 산문만이다.
504
- 6. **절마다 여백 주석 세 줄(`marg`)을 채운다.** 그것이 두 단 본문의 본체다.
493
+ 결정 모드의 문장 칸은 문단으로 선다 — 문장 표식은 남고 표시만 인라인이다. `tone.mjs` S1 은 그 산문에서 늘 통과하므로 그 통과는 아무것도 뜻하지 않는다. 그 몫은 처음 읽는 독자가 진다.
494
+ 6. **절마다 여백 주석 세 줄(`marg`)을 채운다.** 그것이 두 단 본문의 본체다(결정 모드에는 여백 주석이 없다).
505
495
  다만 **채우려고 넣으면 안 넣느니만 못하다** — 독자가 실제로 던질 질문이어야 한다.
506
496
  7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예: 요약·건 「이 버튼을 누르면 고객에게 알림톡이 실제로 나감」, 요청 절 「…실제로 나갑니다」)
507
497
  8. **포털이 이미 주는 것을 문서 안에 만들지 않는다.** 검토 회신(댓글)·핵심 요약·진척률 바·상단 바는
@@ -513,13 +503,16 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
513
503
  수단을 잃는다 — 신뢰는 한계를 남김없이 적어서가 아니라 보여 줘서 생긴다.
514
504
  `role: figure` · `provider: user-provided` · `origin`(누가 제공했는지 — **비우면 거절된다**)
515
505
  으로 두고 `file` 에 로컬 절대경로를 주면
516
- 화질을 계단으로 내려 예산(장당 300,000B) 안에 앉힌다. `sections[].plates` 에 id 를
506
+ 화질을 계단으로 내려 예산(장당 300,000B) 안에 앉힌다. `sections[].plates`(건이 둘 이상인 절이면 그 건의 `plates` — 14번)에 id 를
517
507
  적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의 종료일」) —
518
508
  「…을 보라」 같은 해라체 명령은 어디에도 없다(반드시 지키는 것 12 · 렌더러 ⚠) —
519
509
  본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
510
+ 캡션 끝에는 증거 범위 한 구절(「… · 운영 관리자 웹 · 8. 23. 촬영」·「… · 알림 문구는 옮겨 적음 — 합성」), 출처 줄은 「화면 이름 · 날짜」(「부록 N」을 붙이지 않는다), 제작 도구·배율·자르기 좌표는 `origin` 에만(`references/readability.md` R12e).
511
+ 칩 `verdict` 「직접 확인」은 외부 원본에만 — 우리가 그린 도해·도판에 달면 우리가 직접 해 본 것으로 읽힌다(`references/lim-portal-format.md` §11-5).
520
512
  다만 `hero`·`chapter`·`eof` 는 자리가 없다. 표지의 빈
521
513
  마당은 미완성이 아니라 문법이고, 문서는 판권지로 닫는다(꼬리 카드가 없다).
522
- 도해가 필요하면 내용에서 도출된 것만 CSS·인라인 SVG 로.
514
+ 도해는 내용에서 도출된 것만, 설계 데이터로 — 렌더러가 굽는다(`references/diagrams.md`).
515
+ 집행자: ⚠ W2(출처 줄) · 증거는 0.5단계 5a행 — 캡션 꼬리가 실제 환경과 맞는지는 사람 눈.
523
516
  9. **이 스킬에 특정 고객사의 도메인 지식을 적지 않는다.** 다음 문서는 다른 업종·다른 테넌트다.
524
517
  스킬은 **어떻게 할지**만 정하고 **무엇을 쓸지**는 그 문서의 데이터가 정한다.
525
518
 
@@ -540,7 +533,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
540
533
  결정권이 고객에게 있는 문서에서 그 자리는 「하지 않기로 한 것」 절이 아니라 선택지 표의 「정할 자리」·「다시 볼 때」 행이다.
541
534
  - 나쁜 소식 앞에 **상대가 이미 잘 둔 것 한 문장**. 위로가 아니라 기준점이다 — 그 다음 문장의 기준이 된다.
542
535
  - 「해야 합니다」를 쓰지 않는다. **결정권이 고객에게 있는 문서에서는 「하지 않기로 함」「권고함」「기각」도 쓰지 않는다** —
543
- 선택은 상대에게 둔다. FCG 의견은 별도 절 한 자리에만(세 가지 독자 표·4~6단계, 경위: `references/history.md` §7).
536
+ 선택은 상대에게 둔다. FCG 의견은 결정 블록의 `opinion` 칸 하나에만 — 옛 결정 브리핑을 고칠 때만 의견 절 한 자리(경위: `references/history.md` §7).
544
537
  - 구체적인 값(지역명·회사명·제품명)은 스킬이 아니라 **그 문서의 `forbid`** 로 막는다(9번).
545
538
  기계가 잡는 것은 「조건·이유 없이 부정으로 끝난 문장」까지다(`tone.mjs` 단독 부정 종결). **주어가 사람·조직·
546
539
  국가인지는 기계가 못 본다** — 사람의 눈 검수 표에 그 행이 있다(`references/process.md` 7단계).
@@ -572,7 +565,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
572
565
  경계: 그 사건 범위 안의 조언(심사에 넘긴 시험 계정을 「외부에 알려진 것으로 봄」)은 남긴다.
573
566
  집행자: `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 자격증명 명사와 노출 경로·동사(메신저·메일·평문·오갔·보냈…)가 한 문장 30자 안에 같이 선 곳만. 명사 하나(「비밀번호 재설정」)는 안 셈 ·
574
567
  「우리 실수」 일반(「늦게 알았음」 류)은 **없음 — 사람 눈 · 독자 검토 decider 관점**(경위: `references/history.md` §14).
575
- 14. **건이 둘 이상인 절의 표·도판·인용은 절이 아니라 그 건에 묶는다** — `cases[].tables`·`plates`·`quotes`(`references/lim-portal-format.md` §11-10).
568
+ 14. **건이 둘 이상인 절의 표·도판·인용은 절이 아니라 그 건에 묶는다** — `cases[].tables`·`plates`·`quotes`(`references/lim-portal-format.md` §11-10). 결정 장의 근거는 `facts[].source` 가 진다(결정 모드).
576
569
  절 칸에 두면 렌더러가 건 목록 **뒤**에 한꺼번에 세워, 독자는 건 다섯을 글로만 읽고 나서 표 다섯·그림 넷을 만나고 어느 건의 근거인지는 캡션 글자로만 잇는다.
577
570
  절 칸은 절 전체에 걸치는 근거(조치 전후 대조표)만. 전폭 도판은 건 안에 못 서니 절에 둔다(건에 두면 ⚠).
578
571
  집행자: 렌더러 `gazette.py` `case_evidence()` — 자리를 만들 뿐 「절에 둔 것이 사실은 한 건의 것」인지는 **사람 눈**(경위: `references/history.md` §15).
@@ -602,6 +595,8 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
602
595
  「두 경로」는 dry_run 과 로컬 렌더다. 렌더러 경고 문구 원문·정규식 대상·탈출구는 `lim-portal-format.md` 「10. 경고 조건」·「10-1. 시각 우선 관문」 표 한 곳에만 둔다 — 이 표는 규칙 · 집행자 · 경로만 적는다.
603
596
  2026-09-26 부터 과정 어휘·「길」·해라체 경고는 자리를 5곳까지 짚고, 렌더러의 길이·참조 번호 셈은 원래 이름(ASCII 식별자·제품 이름과 그 판 번호)을 빼고 센다(`lim-portal-format.md` §10 · §10-1).
604
597
 
598
+ 결정 모드에서는 길이·참조 번호·한 문장 한 줄·브리핑(`brief_checks()`)·요약면 막대(`tally_scan()`)·건별 근거 칸 행이 돌지 않는다 — 그 모드의 알림은 `references/decision-format.md` 5절.
599
+
605
600
  | 규칙 | 집행자 | 어느 경로에서 |
606
601
  |---|---|---|
607
602
  | 대시 `—` 밀도 | `tone.mjs` S2(0.5/천자) | 로컬 렌더 산출물 |
@@ -613,11 +608,13 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
613
608
  | 개발 식별자(3 — 대상 목록은 `lim-portal-format.md` §10-1) | `gazette.py` `text_scan()` ⚠ | **두 경로 다** |
614
609
  | 자격증명 명사 + 노출 경로·동사 근접 · 우리 실수 서술(13번) | `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 명사 하나(「비밀번호 재설정」)는 안 셈 · 「우리 실수」 일반은 **없음 — 사람 눈** | **두 경로 다** |
615
610
  | 판단 항목·확인 요청에 기한 없음 · `asks` 절 없음 · 선택지 표에 근거 등급 없음 · `asks` 절 표의 동일값 열(브리핑) | `gazette.py` `brief_checks()` ⚠ | **두 경로 다** |
611
+ | 요청 절 판단 항목에 기한과 선택지가 있는데 결정 블록이 없음(0단계 물음 3) | `gazette.py` `decision_hint()` ⚠ 「결정 블록으로 쓰면 결정 모드로 섭니다」 | **두 경로 다** |
616
612
  | 본문 절의 회차 서술(「이번 회차…」) | `gazette.py` `round_talk_scan()` ⚠ | **두 경로 다** |
617
613
  | 본문의 진행 상태 어휘(정해짐·회신 대기·N판) · 개수로 상태를 세는 표 제목 · 주체 없는 결정 명사(3b) | `gazette.py` `text_scan()` 과정 어휘 ⚠ | **두 경로 다** |
618
614
  | 결정권이 고객에게 있는 항을 기록 없이 사실로 씀(3b 결정 주체) | 독자 검토 facts 관점(`args.decisions`) · 사람 눈(0a) — 기계는 위 명사까지 | 발행 전 |
619
615
  | 권고 낱말(제목·표 열·절 이름·여백 주석·요약면)(10번) | `gazette.py` ⚠ **W1** — 이름에 「의견」이 든 절은 안 셈 | **두 경로 다** |
620
- | 고객·제3자 자료에서 낸 도판(`user-provided`)의 출처 줄에 원본 위치(쪽·행·주소·건 §) 누락(11번) | `gazette.py` ⚠ **W2** | **두 경로 다** |
616
+ | 고객·제3자 자료에서 낸 도판(`user-provided`)의 출처 줄에 원본 위치(쪽·행·주소·건 §, 캡처면 「화면 이름 · 날짜」) 누락(11번 · 8b) | `gazette.py` ⚠ **W2** | **두 경로 다** |
617
+ | 관찰 주장에 독자가 볼 실물 증거가 없음(0.5단계 5a행) | `gazette.py` `evidence_scan()` ⚠ — 나머지 집행자는 0.5단계 5a행 | **두 경로 다** — 포털 dry_run 은 렌더러 운영 반영 뒤 |
621
618
  | 도판 출처 줄의 제작 설명·그림 번호 · 출처 줄 길이(0.5단계 5a행) | `gazette.py` `text_scan()` ⚠ — 캡션은 안 봄 | **두 경로 다** |
622
619
  | 선택지를 「길」로 부른 곳(스킬 장치 이름의 유출, 12번) | `gazette.py` `text_scan()` ⚠ — 「막대 길이」「길게」는 안 세고 「어느 길이」·열 머리 「길」은 셈. 「사진」「단추」 같은 비유는 **없음 — 사람의 눈** | **두 경로 다** |
623
620
  | 해라체 명령(「…을 보라」「…하라」, 12번) | `gazette.py` `text_scan()` ⚠ — 「보라색」「정할 것」은 안 셈. 공급사 용어 직역(「지원료」)은 **없음 — 사람의 눈** | **두 경로 다** |
@@ -660,9 +657,10 @@ KS X 1001 완성형 2,350자. 관보 서식이 `--w-light: 300` 을 쓰므로 40
660
657
  |---|---|
661
658
  | `references/process.md` | **단계마다 무엇을 쓰고 판단하는가** — 0~10단계(번호의 정본은 위 「작업 체크리스트」). 문서를 만들기 시작할 때 먼저 읽는다 |
662
659
  | `references/history.md` | 규칙이 생긴 반려 경위·원문·실측 — 규칙이 아니다. 규칙 자리의 「(경위: §n)」이 가리킨다 |
663
- | `references/lim-portal-format.md` | **포털 발행할 때** — 관보 골격·여백 주석·PART·톤·요약 근거 게이트·운영 제약 |
660
+ | `references/decision-format.md` | **결정 블록을 쓸 때** — 칸(필수 · 권함 · 선택) · 빈 값 · `labels` · 알림 · 처음 읽는 독자 |
661
+ | `references/lim-portal-format.md` | **보고 모드 원고를 쓸 때** — 관보 골격·여백 주석·PART·톤·요약 근거 게이트·운영 제약 |
664
662
  | `references/content-pipeline.md` | 데이터 모델 전수 — 절 `kind` 5종, 등급, 한국어 조판 규칙, 고객 언어 치환 |
665
- | `references/diagrams.md` | **도해가 필요할 때** — Archify 설치 위치·IR 작성·굳히기(`diagram.mjs`)·가독성 잣대·관보에 앉히는 법 |
663
+ | `references/diagrams.md` | **도해가 필요할 때** — 설계 데이터를 쓰면 렌더러가 굽는다 · 종류별 한도 · 문서에 서는 것과 문서 밖 |
666
664
  | `references/font-embedding.md` | 폰트를 바꾸거나 커버리지를 조정할 때 |
667
665
  | `gazette-report` 스킬 (별도) | 조판 규칙의 원전 — 활자 스케일·괘선·인쇄 페이지 문법·검사기 8종 |
668
666
 
@@ -4,10 +4,20 @@
4
4
  "title": "세 도안은 앱에 이미 있는 모양을 따르는가",
5
5
  "grade": "코드·화면 확인",
6
6
  "symptom": "세 도안의 창·카드·띠가 이 앱에 이미 있는 모양과 같은 규격인가?",
7
- "cause": "앱의 색·글자 규격 목록과 기존 화면 셋을 대조함. 창은 결제 완료 창, 카드는 새 기능 소개 카드, 띠는 점검 안내 띠와 규격이 같음.",
7
+ "cause": "앱의 색·글자 규격 목록과 기존 화면 셋을 대조함. 창은 결제 완료 창, 카드는 새 기능 소개 카드, 띠는 점검 안내 띠와 규격이 같음(표 4-1).",
8
8
  "fix": "세 도안 모두 앱의 선례를 따름. 새로 그리는 것은 도안 C 의 밀어서 닫는 동작 하나임.",
9
- "how_to_check": "부록 2의 규격 목록을 기존 화면 셋과 나란히 열면 같은 값이 나옴.",
10
- "remaining": "선례 화면은 최신 앱에서만 대조함. 이전 앱의 모양은 대조 범위 밖임."
9
+ "how_to_check": "대조한 값은 표 4-1 에 있고, 8. 29. 최신 앱 코드의 규격 목록에서 옮겨 적음.",
10
+ "remaining": "선례 화면은 최신 앱에서만 대조함. 이전 앱의 모양은 대조 범위 밖임.",
11
+ "tables": [
12
+ { "caption": "세 도안이 따른 앱 선례의 규격",
13
+ "cols": ["도안", "앱의 선례", "글자 크기", "바탕색"],
14
+ "rows": [
15
+ ["도안 A 확인 창", "결제 완료 창", "16px", "흰색"],
16
+ ["도안 B 홈 카드", "새 기능 소개 카드", "15px", "옅은 회색"],
17
+ ["도안 C 상단 띠", "점검 안내 띠", "13px", "짙은 남색"]
18
+ ],
19
+ "note": "글자 크기와 바탕색은 도안과 선례가 같은 값임." }
20
+ ]
11
21
  },
12
22
  {
13
23
  "group": "evidence",
@@ -16,7 +26,7 @@
16
26
  "symptom": "설정을 바꾼 이용자에게 안내가 언제 뜨고, 닫은 뒤 다시 뜨는가?",
17
27
  "cause": "앱의 안내 표시 조건을 코드와 시험 계정 화면으로 대조함. 바꾼 뒤 7일 이하에서만 뜨고, 도안 A·B 는 닫으면 다시 안 뜸.",
18
28
  "fix": "도안 C 는 띠가 작아 한 번 더 띄우도록 그림. 나머지 조건은 세 도안을 하나씩 대조해 같음.",
19
- "how_to_check": "회신 뒤 일정 절의 확인 프로필 표의 네 경우를 시험 계정으로 만들면 표와 같은 화면이 나옴.",
29
+ "how_to_check": "뜨는 조건은 표 1-2 에 있음. 조건마다 8. 29. 앱 코드와 시험 계정 화면에서 대조함.",
20
30
  "remaining": "7일 경계는 기기 시각으로 셈. 시간대가 다른 기기는 대조 범위 밖임."
21
31
  },
22
32
  {
@@ -26,7 +36,7 @@
26
36
  "symptom": "도안 C 의 한 줄 띠 글자로 안내를 놓치지 않는가?",
27
37
  "cause": "공개된 타사 사례 넷을 대조함. 한 줄 띠 안내가 창 안내보다 놓쳤다는 문의가 많았다는 사례가 셋.",
28
38
  "fix": "세 도안 가운데 도안 C 가 놓칠 위험이 가장 큼. 이 앱에서 직접 잰 값은 아직 없음.",
29
- "how_to_check": "건 끝의 원본에서 사례 넷의 공개 원문을 열면 같은 표로 대조할 수 있음.",
39
+ "how_to_check": "사례 넷의 공개 원문은 건 끝의 원본에 있음. 원문 넷은 8. 28. 모두 읽어 대조함.",
30
40
  "remaining": "타사 사례라 이 앱 이용자와의 차이는 남음. 근거 등급이 한 단 낮은 이유임.",
31
41
  "source_url": "https://example.com/notice-banner-cases",
32
42
  "source_text": "타사 사례 넷의 공개 원문 목록"
@@ -4,10 +4,19 @@
4
4
  "title": "방식 A 가 현행보다 찾는 정확도를 올리는가",
5
5
  "grade": "직접 실험 확인",
6
6
  "symptom": "같은 질문 묶음에서 방식 A 가 현행보다 원하는 자료를 더 자주 찾아 주는가?",
7
- "cause": "실제 질문 200개를 두 방식에 같이 태움. 첫 화면 안에서 답을 찾은 비율이 현행 61%, 방식 A 82%.",
7
+ "cause": "실제 질문 200개를 두 방식에 같이 태움. 첫 화면 안에서 답을 찾은 비율이 현행 61%, 방식 A 82%(표 4-1).",
8
8
  "fix": "정확도 이득은 실재함. 다만 이득의 대부분은 질문이 길고 구체적일 때 남. 한 낱말 질문에서는 차이가 작음.",
9
- "how_to_check": "부록 4의 질문 묶음으로 검증 환경에서 같은 비교를 다시 돌리면 같은 구간의 수치가 나옴.",
10
- "remaining": "질문 묶음이 최근 석 달치 위주라 계절성 주제는 덜 들어 있음."
9
+ "how_to_check": "8. 12. 검증 환경에서 두 방식에 같이 태운 결과는 표 4-1, 질문 묶음은 부록 4에 있음.",
10
+ "remaining": "질문 묶음이 최근 석 달치 위주라 계절성 주제는 덜 들어 있음.",
11
+ "tables": [
12
+ { "caption": "같은 질문 200개를 두 방식에 태운 결과",
13
+ "cols": ["방식", "첫 화면 안에 찾음", "비율"],
14
+ "rows": [
15
+ ["현행", "122개", "61%"],
16
+ ["방식 A", "164개", "82%"]
17
+ ],
18
+ "note": "「첫 화면 안에 찾음」은 첫 화면 결과 안에 원하는 자료가 든 질문 수임." }
19
+ ]
11
20
  },
12
21
  {
13
22
  "group": "evidence",
@@ -16,7 +25,7 @@
16
25
  "symptom": "방식 A 를 붙이면 달마다 얼마가 더 들고, 사용량이 늘면 어떻게 되는가?",
17
26
  "cause": "석 달치 실제 사용량으로 비용을 셈함. 현행 대비 월 운영비가 약 1.4배. 사용량이 두 배로 늘면 격차가 1.6배까지 벌어짐.",
18
27
  "fix": "지금 사용량에서의 격차는 1.4배임. 격차가 커지는 급증 구간은 계약의 사용량 상한 조항으로 줄일 수 있음.",
19
- "how_to_check": "부록 4의 산식에 최신 월 사용량을 넣으면 같은 배수가 나옴.",
28
+ "how_to_check": "산식은 부록 4에 있고, 8. 20. 5월부터 7월까지의 실제 사용량을 넣어 셈.",
20
29
  "remaining": "내년 사용량 전망치는 추정임. 분기마다 실측으로 갱신할 예정."
21
30
  },
22
31
  {
@@ -26,7 +35,7 @@
26
35
  "symptom": "더 싼 방식 B 로도 같은 이득을 얻을 수 있지 않은가?",
27
36
  "cause": "타사 공개 사례 6건을 대조함. 방식 B 는 자료가 백만 건을 넘는 곳에서 정확도가 급락한 사례가 4건.",
28
37
  "fix": "우리 자료 규모는 그 문턱을 이미 넘었음. 규모가 절반 아래로 줄면 사례의 조건과 달라짐.",
29
- "how_to_check": "건 끝의 원본에서 사례 6건의 공개 원문을 열 수 있고, 규모·정확도 수치는 부록 4에 모아 둠.",
38
+ "how_to_check": "사례 6건의 공개 원문은 건 끝의 원본에, 규모·정확도 수치는 부록 4에 있음. 원문 6건은 8. 18. 모두 읽어 대조함.",
30
39
  "remaining": "타사 사례라 우리 자료 특성과의 차이는 남음. 직접 실험은 하지 않음(근거 등급이 한 단 낮은 이유임).",
31
40
  "source_url": "https://example.com/model-b-scale-cases",
32
41
  "source_text": "타사 사례 6건의 공개 원문 목록"