genetics-mcp 2.19.0 → 2.19.3

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.
Binary file
package/bin/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "aarch64-apple-darwin": "ec2d90a78e0a53f1cb2c8cd135b6a9df7f35f346a36433c39bbe1567c42b9732",
3
- "aarch64-unknown-linux-musl": "b2c9a9d24ccf792830fb44a9b7d46bc55a5a8aace95c8d1b845aae344492ab3b",
4
- "x86_64-apple-darwin": "e4c2c4cd885a4f8abc0906413021c579ab2863665894a30206c95933b7adf239",
5
- "x86_64-unknown-linux-musl": "3b2d7ef96fa7a0035d3490547c11de42c979a3e84010b759ddc3aa958635af08"
2
+ "aarch64-apple-darwin": "da31e8bb907f94f973f392bb7bbab5e1a709e20dfb1057b0aa22d7ec04ee0f19",
3
+ "aarch64-unknown-linux-musl": "ddfcf176622b2bd4618d96ae85f5ab368c55c76ddd32bcdeb86c0573648d293c",
4
+ "x86_64-apple-darwin": "dbd72945d95d228c9face00c2f7287575829fae3802b87c69f765edd0d1c625d",
5
+ "x86_64-unknown-linux-musl": "eb4029a33c87b9e0d0d789a6c116a0335d6d772f5137beb69a0be334942ba1cd"
6
6
  }
Binary file
Binary file
package/genetics.mjs CHANGED
@@ -580,7 +580,7 @@ const IMAGE_HOST_ALLOW = (() => {
580
580
 
581
581
  const IMAGE_MAX_DOWNLOAD = 8_000_000; // 원본 상한
582
582
  const IMAGE_TIMEOUT_MS = 15_000;
583
- const ASSET_MAX_ONE = 80_000; // 계약 §7 — 서버 상한과 같은 값
583
+ const ASSET_MAX_ONE = 300_000; // 계약 §7 — 서버 상한(REPORT_ASSET_MAX_ONE)과 같은 값
584
584
  const ASSET_LONG_EDGE = 1400; // 계약 §7 — hero·챕터의 긴 변
585
585
 
586
586
  function imageHostAllowed(url) {
@@ -1312,7 +1312,7 @@ const REPORT_DATA = {
1312
1312
  + '**직접 촬영한 화면은 `file` 에 로컬 절대경로를 준다** — role: figure · provider: user-provided '
1313
1313
  + '로 두면 화질을 계단으로 내려 예산 안에 앉힌다. 그 도판은 `sections[].plates` 에 id 를 적어야 자리가 생긴다. '
1314
1314
  + '크기와 형식은 인코딩 결과에서 읽으므로 선언하지 않는다. 전부 data: URI 로 문서에 박히며 '
1315
- + '(열람 CSP 가 외부 이미지를 막는다), 서버가 출처·매직바이트·예산(장당 80,000B·합계 400,000B)을 '
1315
+ + '(열람 CSP 가 외부 이미지를 막는다), 서버가 출처·매직바이트·예산(장당 300,000B·합계 2,400,000B)을 '
1316
1316
  + '다시 검증한다. **갱신(update_report)에서 이 칸을 빼면 저장된 그림이 유지되고, `[]` 면 지워진다** — '
1317
1317
  + 'plates 가 가리키는 그림이 없으면 422.',
1318
1318
  items: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genetics-mcp",
3
- "version": "2.19.0",
3
+ "version": "2.19.3",
4
4
  "description": "문서 포털 발행·세션 이식·사례 기억 MCP — 데이터를 주면 규격 문서가 나온다 (짝인 스킬 동봉)",
5
5
  "author": "주식회사 LIM (LIM Inc.)",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -41,7 +41,7 @@ version: "4.0.0"
41
41
  | 1·2 자료·건 | `cases.json` | — | 건마다 다섯 칸 · 근거 없는 칸은 「확인 필요」 | 서버 발행 검증(그룹 정합) · 사람 | 원자료 범위 · 고객이 아는 참조 · 「확인 필요」 칸 |
42
42
  | 3 등급 | `grades` · 건별 `grade` | — | 4단 이하 · 최약 등급이 기본 | 사람 | 등급 이름·개수 |
43
43
  | 4~6 원고 | `report.json` · 코드 작업을 녹이면 원고 밖 상태 표(반드시 지키는 것 3) | — | 요약 근거 · 요지 칸 수(4~6단계) · 절마다 `marg` | 서버 요약 근거 게이트(거절) · 사람 | 공통 원인이 실재하는가 |
44
- | 6 도판 굽기 | 도판 HTML → PNG · `plates.json` | `node assets/figure.mjs --batch plates.json --report report.json` · 두 칸 비교는 `shot.mjs --after` → `pair.mjs` | exit 0(✗0 · 합계 400,000B 안) | `figure.mjs` R0~R10·R13 · `pair.mjs` · 칩 문구의 뜻은 사람 눈 | — |
44
+ | 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` · 칩 문구의 뜻은 사람 눈 | — |
45
45
  | 7 로컬 렌더 | 단일 HTML | `python3 assets/render.py report.json` | ⚠0 · `forbid` 적중 0 | `gazette.py` `text_scan()`·`brief_checks()`·`tally_scan()` · `build.py guard()` | — |
46
46
  | 7 dry_run | 경고 목록 | `publish_report`/`update_report` 에 `dry_run: true` | 작성자가 고칠 수 있는 ⚠0 — 못 없애는 경고는 까닭을 핸드오프에 | `report_publish.php report_build_checked()`(렌더러·입고·그림·문체) · 경고 기준선 대조는 사람 | — |
47
47
  | 7 독자 검토 | 워크플로 결과(`merged`·`questions`·`dropped`) | `references/reader-review.workflow.js`(0.5단계 7행) · 구조를 안 바꾼 낱말 손질 판은 `references/edition-review.workflow.js`(결과 `kept`·`weak`) | 사실 틀림 반영 · 「⚠ 도판 N장 미열람」 없음 · 반영 뒤 로컬 렌더·dry_run 다시 | 워크플로 관점 + JS 거름 · `questions`·`dropped` 는 사람 | `questions[]` |
@@ -206,7 +206,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
206
206
  |---|---|---|
207
207
  | 1 | **한 장 이야기** | 문제 → 원인 → 해법(지금 상태 포함) → 정할 것. 칸 수가 아니라 이야기 순서다 — 요지 칸 수는 4~6단계 「요지」 한 곳이 정본. 다루는 일의 **사건 경과** 표 한 장을 1절에 둔다(이 문서의 판 이력은 `history` — 3c) |
208
208
  | 2 | **예시 한 명** | 실존 이용자 하나의 실제 숫자로 문서 전체를 관통시킨다(같은 사람이 그림·표·건에 반복) |
209
- | 3 | **용어 잠금 표** | 같은 낱말이 두 값을 가리키면 그 자리에서 문서가 죽는다. 뜻이 갈리는 낱말은 표 한 장으로 값·정의·보이는 자리를 박는다. 장치 이름(건 행 `labels` 값)은 절 이름·부제·표 열·캡션에 다시 쓰지 않고, 선택지 기호(A·B·C)는 한 목록에만 붙인다. 집행자: `gazette.py` `text_scan()` ⚠(건 행 이름 충돌·선택지 기호 충돌) · 독자 검토 first-time 관점(한 낱말 두 값) · 뜻이 같은지는 사람 눈 |
209
+ | 3 | **용어 잠금 표** | 같은 낱말이 두 값을 가리키면 그 자리에서 문서가 죽는다. 뜻이 갈리는 낱말은 표 한 장으로 값·정의·보이는 자리를 박는다. 장치 이름(건 행 `labels` 값)은 절 이름·부제·표 열·캡션에 다시 쓰지 않고, 선택지 기호(A·B·C)는 한 목록에만 붙인다. **이 스킬이 선택지를 부르는 「길」·「바꾸면/그대로 두면」도 장치 이름이다** — 원고에서는 선택지를 그것이 실제로 무엇인지(고객이 부르는 이름)로 부르고, 물건을 비유로 부르지 않는다(반드시 지키는 것 12). 집행자: `gazette.py` `text_scan()` ⚠(건 행 이름 충돌·선택지 기호 충돌·「길」) · 독자 검토 first-time 관점(한 낱말 두 값) · 뜻이 같은지·비유인지는 사람 눈 |
210
210
  | 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) |
211
211
  | 5 | **판단 요청** | 요청은 **고객이 고를 물음**이다 — 제목은 물음, 본문 첫 문장은 기한과 두 길의 이름, 결과는 한눈표 **한 곳에만** 대칭으로. 모양·선택지 대칭 불변식·화면 도안 절차는 `references/visual-first.md` §5 와 `lim-portal-format.md` §12.3b. 집행자: `gazette.py` `brief_checks()` ⚠(기한·동일값 열) · ⚠ W1(권고 낱말) · 선택지 사이 대칭은 독자 검토 figures 관점 · 도안 유무는 **없음 — 사람의 눈**(`references/process.md` 7단계 표) |
212
212
  | 5a | **원본 확인** | 주장·그림마다 원본을 **댈 수 있어야** 한다. 출처 줄은 위치 한 구절(`references/readability.md` R12e — 우리 도안은 비움), 원본 이름·찾을 낱말은 건(`source_url`·`how_to_check`)이나 부록에, 제작 메타는 `origin` 으로(11번). 집행자: 독자 검토 source 관점(누를 수 있는 원본) · facts 관점(앱 동작·내부 수치·결정 주체) · `gazette.py` ⚠ W2 · `text_scan()` 제작 메타 ⚠ — 그 밖은 사람 눈 |
@@ -214,7 +214,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
214
214
  | 7 | **독자 검토** | 발행 전 `references/reader-review.workflow.js` — 관점 여덟(상태 표 `args.state` 를 주면 아홉). **Verify 를 통과한 발견만 반영한다 — 검토자 주장도 틀린다.** 반영 순서는 사실 틀림 → 구조(합치기·빼기) → 나머지. **빼기가 포인터를 남기면 안 된다** — 「N절을 보라」「건 §n.n」「부록에 있다」로 대신하면 독자가 장을 오가는 시험지가 된다. 낱말·규칙·예시 선언은 **첫 등장 자리에서 한 구절**, 뒤 절의 번호·표 이름·§ 는 앞 절에서 쓰지 않는다(요약 근거는 `refs[]` 로). 선형 읽기 관점의 **뜀 지점(`jumps`) 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). 사용자가 「바로 반영」을 지시하면 먼저 내고 이 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(같은 날 사용자 결정) |
215
215
  | 8 | **실물 확인** | 발행할 때마다 체크리스트 9단계 두 행 — 블록 목록 대조와 열람 주소 열기. 집행자: 사람 — 발행 뒤 대조 기계는 아직 없다 |
216
216
 
217
- 상세와 도판 예산(장당 80KB · 합계 400KB), 그림 만드는 법, 반려 사례는 `references/visual-first.md`.
217
+ 상세와 도판 예산(장당 300KB · 합계 2,400KB), 그림 만드는 법, 반려 사례는 `references/visual-first.md`.
218
218
 
219
219
  ## 워크플로우
220
220
 
@@ -469,8 +469,9 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
469
469
  수단을 잃는다 — 신뢰는 한계를 남김없이 적어서가 아니라 보여 줘서 생긴다.
470
470
  `role: figure` · `provider: user-provided` · `origin`(누가 제공했는지 — **비우면 거절된다**)
471
471
  으로 두고 `file` 에 로컬 절대경로를 주면
472
- 화질을 계단으로 내려 예산(장당 80,000B) 안에 앉힌다. `sections[].plates` 에 id 를
473
- 적어야 자리가 선다. 캡션은 **이 화면에서 무엇을 보라는 것인지**를 적는다 —
472
+ 화질을 계단으로 내려 예산(장당 300,000B) 안에 앉힌다. `sections[].plates` 에 id 를
473
+ 적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의 종료일 참고」) —
474
+ 「…을 보라」 같은 해라체 명령은 어디에도 없다(반드시 지키는 것 12 · 렌더러 ⚠) —
474
475
  본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
475
476
  다만 `hero`·`chapter`·`eof` 는 자리가 없다. 표지의 빈
476
477
  마당은 미완성이 아니라 문법이고, 문서는 판권지로 닫는다(꼬리 카드가 없다).
@@ -505,6 +506,22 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
505
506
  고객이 눌러 열 수 없는 참조는 근거가 아니다(0.5단계 5a행).
506
507
  집행자: `references/reader-review.workflow.js` 「원본 대조」 관점(발행 전 독자 검토) · 도판 출처 줄의 원본 위치 누락은
507
508
  `gazette.py` ⚠ W2 · 앱 동작·내부 수치는 독자 검토 facts 관점 — 그 밖은 사람의 눈(경위: `references/history.md` §8).
509
+ 12. **물건은 이름으로 부른다 — 이 스킬의 장치 이름과 비유를 원고에 옮기지 않는다.** 이 문서가 선택지를 「길」(두 길·바꾸는 길·그대로 두는 길),
510
+ 상태를 「지금·그대로 두면·바꾸면」이라 부르는 것은 **스킬 안의 장치 이름**이다. 원고에서 선택지는 그것이 실제로 무엇인지 — 고객이 부르는 이름 —
511
+ 로 부른다(「복제본 전환」「직접 업그레이드」「현행 유지」). 「복제본 길」「그 자리 길」「고른 길별 일정」은 장치 이름을 줄여 만든 조어이고,
512
+ 「사진」(스냅샷)·「단추」(버튼)는 물건을 비유로 부른 것이다 — 둘 다 결정권자에게 뜻이 닿지 않는다.
513
+ 같은 버릇을 소설 연구가 잰 적이 있다: 감정을 이름으로 부르지 않고 몸으로만 보여 주는 비율이 사람 글 29 %, AI 글 8 %(StoryScope, arXiv 2604.03136 —
514
+ 소설 연구이므로 수치는 유추일 뿐, 규칙의 근거는 2026-09-17 반려다). 결정 문서는 직접 부르는 쪽이 맞다.
515
+ **공급사 용어도 같다** — AWS 의 Extended Support 를 「연장 지원료」로 직역하면 「지원해 주는 돈」으로 읽힌다(같은 날 반려). 요금·기능은 그것이 무엇인지로 부르고(「구버전 유지 요금」),
516
+ 공급사 이름은 첫 등장 자리나 용어표에 한 번만 붙인다. **이 스킬의 규칙 문장도 원고 말투가 아니다** — 캡션 규칙 「무엇을 보라는 것인지」를 베껴 캡션이 「…을 보라.」가 됐다.
517
+ 독자에게 말 거는 자리는 하십시오체, 기록 자리는 개조식이고, 해라체 명령은 어디에도 없다.
518
+ 집행자: `gazette.py` `text_scan()` ⚠ 「선택지를 「길」로 부른 곳」·「해라체 명령이 N곳」(두 경로 — ⚠ 운영 반영 확인 전) · 비유·조어·직역 일반은 **없음 — 사람의 눈**(경위: `references/history.md` §13).
519
+ 13. **우리 쪽 보안·운영 실수와 자격증명 취급 사실을 문서에 적지 않는다 — 구두로 전한다.**
520
+ 「비밀번호가 메신저로 오갔음」「키를 메일로 보냈음」은 교체 권고의 근거로 옳아도 고객 문서의 자리가 아니다 —
521
+ 박제되고 책임 소재를 글로 남긴다. 권고는 사용자에게 채팅으로만, 문서에는 그 사건의 원인·조치·확인만(`references/content-pipeline.md` 유형 L).
522
+ 경계: 그 사건 범위 안의 조언(심사에 넘긴 시험 계정을 「외부에 알려진 것으로 봄」)은 남긴다.
523
+ 집행자: `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 자격증명 명사와 노출 경로·동사(메신저·메일·평문·오갔·보냈…)가 한 문장 30자 안에 같이 선 곳만. 명사 하나(「비밀번호 재설정」)는 안 셈 ·
524
+ 「우리 실수」 일반(「늦게 알았음」 류)은 **없음 — 사람 눈 · 독자 검토 decider 관점**(경위: `references/history.md` §14).
508
525
 
509
526
  ## 흔한 실패 모드
510
527
 
@@ -539,6 +556,7 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
539
556
  | 학생 보고서투 · 완충어 · 근거 없는 총평 · 단독 부정 종결 | `tone.mjs` S1/S2 | 로컬 렌더 산출물 |
540
557
  | 금칙 값(고객사·지역·제품명·티켓) | `build.py` `forbid` | **로컬 렌더만** — 포털 발행은 `report_publish.php report_client_fields()` 가 깎아 낸다 |
541
558
  | 개발 식별자(3 — 대상 목록은 `lim-portal-format.md` §10-1) | `gazette.py` `text_scan()` ⚠ | **두 경로 다** |
559
+ | 자격증명 명사 + 노출 경로·동사 근접 · 우리 실수 서술(13번) | `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 명사 하나(「비밀번호 재설정」)는 안 셈 · 「우리 실수」 일반은 **없음 — 사람 눈** | **두 경로 다** |
542
560
  | 판단 항목·확인 요청에 기한 없음 · `asks` 절 없음 · 선택지 표에 근거 등급 없음 · `asks` 절 표의 동일값 열(브리핑) | `gazette.py` `brief_checks()` ⚠ | **두 경로 다** |
543
561
  | 본문 절의 회차 서술(「이번 회차…」) | `gazette.py` `round_talk_scan()` ⚠ | **두 경로 다** |
544
562
  | 본문의 진행 상태 어휘(정해짐·회신 대기·N판) · 개수로 상태를 세는 표 제목 · 주체 없는 결정 명사(3b) | `gazette.py` `text_scan()` 과정 어휘 ⚠ | **두 경로 다** |
@@ -546,6 +564,8 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
546
564
  | 권고 낱말(제목·표 열·절 이름·여백 주석·요약면)(10번) | `gazette.py` ⚠ **W1** — 이름에 「의견」이 든 절은 안 셈 | **두 경로 다** |
547
565
  | 고객·제3자 자료에서 낸 도판(`user-provided`)의 출처 줄에 원본 위치(쪽·행·주소·건 §) 누락(11번) | `gazette.py` ⚠ **W2** | **두 경로 다** |
548
566
  | 도판 출처 줄의 제작 설명·그림 번호 · 출처 줄 길이(0.5단계 5a행) | `gazette.py` `text_scan()` ⚠ — 캡션은 안 봄 | **두 경로 다** |
567
+ | 선택지를 「길」로 부른 곳(스킬 장치 이름의 유출, 12번) | `gazette.py` `text_scan()` ⚠ — 「막대 길이」「길게」는 안 세고 「어느 길이」·열 머리 「길」은 셈. 「사진」「단추」 같은 비유는 **없음 — 사람의 눈** | **두 경로 다**(⚠ 운영 반영 확인 전) |
568
+ | 해라체 명령(「…을 보라」「…하라」, 12번) | `gazette.py` `text_scan()` ⚠ — 「보라색」「정할 것」은 안 셈. 공급사 용어 직역(「지원료」)은 **없음 — 사람의 눈** | **두 경로 다**(⚠ 운영 반영 확인 전) |
549
569
  | 건 행 이름(`labels`) 낱말이 다른 절 부제·표 제목·열 머리에 다시 섬 · 선택지 기호 한 글자에 이름 둘(0.5단계 3행) | `gazette.py` `text_scan()` ⚠ · 뜻이 같은지는 사람 눈 | **두 경로 다** |
550
570
  | 그림·표 번호 가리킴 — 없는 번호 · 조사 · 서지 못한/서지 않는 칸의 토큰 · `plates` 순서(0.5단계 6행) | `gazette.py` `text_scan()`·`build()` ⚠ — 번호 셈은 `fig_order()` 한 곳 | **두 경로 다** |
551
571
  | 괄호 안 부연 · 흐름도 칸 `note` · 도판 캡션 문장 수(readability R11) | `gazette.py` `text_scan()` ⚠ — 한 줄 45자·요약·도입문 문장 수는 사람 눈 | **두 경로 다** |
@@ -4,13 +4,13 @@
4
4
  "lang": "ko",
5
5
  "doc_type": "R&D 브리핑",
6
6
  "title_tag": "자료 검색 방식 도입 검토 · 예시 고객사",
7
- "description": "새 검색 방식(방식 A)을 들일지 현행을 그대로 둘지 정하기 위한 브리핑. 두 길의 결과와 선택지 비교, 근거를 정리함",
7
+ "description": "새 검색 방식(방식 A)을 들일지 현행을 그대로 둘지 정하기 위한 브리핑. 두 선택지의 결과와 선택지 비교, 근거를 정리함",
8
8
  "doc_no": "LIM-2026-0827-02",
9
9
  "client": "예시 고객사",
10
10
  "kicker": "우리회사 · 예시 고객사",
11
11
  "title": "자료 검색 방식 도입 검토",
12
12
  "title_sub": "R&D 브리핑",
13
- "subtitle": "새 검색 방식(방식 A)을 들일지, 현행을 그대로 둘지 정하기 위한 문서임. 두 길의 결과와 근거를 같은 칸으로 견줌.",
13
+ "subtitle": "새 검색 방식(방식 A)을 들일지, 현행을 그대로 둘지 정하기 위한 문서임. 두 선택지의 결과와 근거를 같은 칸으로 견줌.",
14
14
  "cover_date": "2026. 8. 27.",
15
15
  "issuer": [
16
16
  "우리회사",
@@ -44,7 +44,7 @@
44
44
  {
45
45
  "no": 1,
46
46
  "date": "2026. 8. 27.",
47
- "note": "최초 발행. 두 달 검토의 결과와 두 길의 견줌을 정리함."
47
+ "note": "최초 발행. 두 달 검토의 결과와 두 선택지의 견줌을 정리함."
48
48
  }
49
49
  ],
50
50
  "guide": [
@@ -56,10 +56,10 @@
56
56
  ]
57
57
  },
58
58
  {
59
- "q": "두 길은 무엇이 다른가?",
59
+ "q": "두 선택지는 무엇이 다른가?",
60
60
  "a": [
61
61
  "01절 표 한 장에 지금 · 그대로 두면 · 바꾸면을 나란히 적음.",
62
- "같은 칸으로 견준 세 길은 03절."
62
+ "같은 칸으로 견준 세 선택지는 03절."
63
63
  ]
64
64
  },
65
65
  {
@@ -93,7 +93,7 @@
93
93
  {
94
94
  "value": "3",
95
95
  "unit": "가지",
96
- "label": "견준 길",
96
+ "label": "견준 선택지",
97
97
  "href": "#sec-3",
98
98
  "go": "03절로"
99
99
  },
@@ -137,19 +137,19 @@
137
137
  "no": "1",
138
138
  "title": "결정",
139
139
  "tone": "you",
140
- "lede": "정할 것 하나와 두 길의 결과, 검토의 요지.",
140
+ "lede": "정할 것 하나와 두 선택지의 결과, 검토의 요지.",
141
141
  "questions": [
142
142
  "무엇을 언제까지 정하는가?",
143
- "두 길은 무엇이 달라지는가?"
143
+ "두 선택지는 무엇이 달라지는가?"
144
144
  ]
145
145
  },
146
146
  {
147
147
  "no": "2",
148
148
  "title": "근거",
149
149
  "tone": "neutral",
150
- "lede": "세 길을 같은 칸으로 견준 표와 확인한 물음. 우리회사 의견은 근거 뒤 한 절에 따로 둠.",
150
+ "lede": "세 선택지를 같은 칸으로 견준 표와 확인한 물음. 우리회사 의견은 근거 뒤 한 절에 따로 둠.",
151
151
  "questions": [
152
- "세 길은 각각 무엇을 얻고 잃는가?",
152
+ "세 선택지는 각각 무엇을 얻고 잃는가?",
153
153
  "이 수치는 어떻게 다시 확인하는가?"
154
154
  ]
155
155
  },
@@ -178,15 +178,15 @@
178
178
  "part": "1",
179
179
  "short": "결정 요청",
180
180
  "sub": "회신이 필요한 1건",
181
- "lede": "방식 A 를 들일지, 현행을 그대로 둘지 한 가지. 두 길의 결과를 표 1-1 에 나란히 적음.",
181
+ "lede": "방식 A 를 들일지, 현행을 그대로 둘지 한 가지. 두 선택지의 결과를 표 1-1 에 나란히 적음.",
182
182
  "marg": {
183
183
  "why": "무엇을 정해 달라는 것인가?",
184
184
  "key": "방식 A 를 들일지, 그대로 둘지 하나.",
185
- "advice": "두 길의 결과는 표 1-1, 근거는 항목의 「근거」 단추."
185
+ "advice": "두 선택지의 결과는 표 1-1, 근거는 항목의 「근거」 단추."
186
186
  },
187
187
  "tables": [
188
188
  {
189
- "caption": "방식 A 도입의 두 길",
189
+ "caption": "방식 A 도입의 두 선택지",
190
190
  "cols": [
191
191
  "항",
192
192
  "지금",
@@ -225,7 +225,7 @@
225
225
  "계절성 주제 미검증"
226
226
  ]
227
227
  ],
228
- "note": "「바꾸면」 값은 실사용 질문 200개 실험과 석 달치 사용량 셈에서 나온 것임. 수신 측 작업은 바꾸는 길의 계절 주제 질문 표본 한 묶음뿐임."
228
+ "note": "「바꾸면」 값은 실사용 질문 200개 실험과 석 달치 사용량 셈에서 나온 것임. 수신 측 작업은 바꾸는 쪽의 계절 주제 질문 표본 한 묶음뿐임."
229
229
  }
230
230
  ]
231
231
  },
@@ -235,7 +235,7 @@
235
235
  "part": "1",
236
236
  "short": "요지",
237
237
  "sub": "두 달 검토로 확인한 네 가지",
238
- "lede": "두 달 검토로 확인한 사실 넷. 어느 길로 갈지는 01절 회신이 정함.",
238
+ "lede": "두 달 검토로 확인한 사실 넷. 어느 쪽으로 갈지는 01절 회신이 정함.",
239
239
  "marg": {
240
240
  "why": "두 달 검토로 무엇을 확인했는가?",
241
241
  "key": "정확도 이득은 실재하고, 비용은 약 1.4배임.",
@@ -248,16 +248,16 @@
248
248
  "part": "2",
249
249
  "tone": "neutral",
250
250
  "short": "선택지",
251
- "sub": "같은 칸으로 견준 세 길",
252
- "lede": "검토한 세 길을 같은 칸으로 견줌. 열이 길이고 행이 견줄 것이며, 어느 길이 맞는지 판정하는 열은 두지 않음.",
251
+ "sub": "같은 칸으로 견준 세 선택지",
252
+ "lede": "검토한 세 선택지를 같은 칸으로 견줌. 열이 선택지이고 행이 견줄 것이며, 어느 쪽이 맞는지 판정하는 열은 두지 않음.",
253
253
  "marg": {
254
- "why": "세 길은 각각 무엇을 얻고 잃는가?",
254
+ "why": "세 선택지는 각각 무엇을 얻고 잃는가?",
255
255
  "key": "방식 B 는 우리 자료 규모에서 정확도가 꺾인 사례가 있음.",
256
256
  "advice": "칸의 값은 실험·사용량 셈·타사 사례에서 옴. 등급의 뜻은 부록 1."
257
257
  },
258
258
  "tables": [
259
259
  {
260
- "caption": "세 길을 같은 칸으로",
260
+ "caption": "세 선택지를 같은 칸으로",
261
261
  "cols": [
262
262
  "견줄 것",
263
263
  "방식 A",
@@ -331,7 +331,7 @@
331
331
  "part": "2",
332
332
  "short": "확인",
333
333
  "sub": "물음 셋과 그 답",
334
- "lede": "세 길을 견줄 때 쓴 물음 셋과 그 답. 물음 · 관찰 · 판단 · 재현 방법 순서로 적음.",
334
+ "lede": "세 선택지를 견줄 때 쓴 물음 셋과 그 답. 물음 · 관찰 · 판단 · 재현 방법 순서로 적음.",
335
335
  "marg": {
336
336
  "why": "이 수치는 어떻게 나온 것인가?",
337
337
  "key": "핵심 두 건은 직접 실험·실데이터로 확인함.",
@@ -345,11 +345,11 @@
345
345
  "tone": "hold",
346
346
  "short": "의견",
347
347
  "sub": "사실과 갈라 둔 의견",
348
- "lede": "03·04절의 사실을 보고 우리회사가 맞다고 보는 길. 의견이며, 정하는 것은 01절 회신임.",
348
+ "lede": "03·04절의 사실을 보고 우리회사가 맞다고 보는 쪽. 의견이며, 정하는 것은 01절 회신임.",
349
349
  "marg": {
350
- "why": "우리회사는 어느 길이 맞다고 보는가?",
350
+ "why": "우리회사는 어느 쪽이 맞다고 보는가?",
351
351
  "key": "의견은 이 표 한 장에만 둠.",
352
- "advice": "회신 뒤 일정은 고른 길이 정함. 이 의견은 그 일정과 별개임."
352
+ "advice": "회신 뒤 일정은 고른 선택지가 정함. 이 의견은 그 일정과 별개임."
353
353
  },
354
354
  "tables": [
355
355
  {
@@ -390,7 +390,7 @@
390
390
  ]
391
391
  },
392
392
  {
393
- "name": "바꾸는 길의 위험",
393
+ "name": "바꾸는 쪽의 위험",
394
394
  "kind": "note",
395
395
  "part": "3",
396
396
  "tone": "wait",
@@ -449,9 +449,9 @@
449
449
  },
450
450
  "tables": [
451
451
  {
452
- "caption": "고른 길별 일정",
452
+ "caption": "고른 선택지별 일정",
453
453
  "cols": [
454
- "고른 길",
454
+ "고른 선택지",
455
455
  "누가",
456
456
  "무엇을 언제"
457
457
  ],
@@ -27,7 +27,7 @@ import { pathToFileURL, fileURLToPath } from 'node:url';
27
27
 
28
28
  // ── 계약 상수 — readability.md §1 · gazette.py PLATE_* · genetics.mjs ASSET_LONG_EDGE/ASSET_MAX_ONE · report_publish.php REPORT_ASSET_MAX_ALL 과 같은 값 ──
29
29
  const COLUMN = 760, WIDE = 1030, NARROW_COLUMN = 682, LONG_EDGE = 1400, VH_RATIO = 0.78, VH_BASE = 900;
30
- const BUDGET_ONE = 80000, BUDGET_ALL = 400000, BUDGET_WARN = 0.9;
30
+ const BUDGET_ONE = 300000, BUDGET_ALL = 2400000, BUDGET_WARN = 0.9;
31
31
  const DENSITY_MIN = 1.8; // R8 출력 px 폭 ÷ 표시 폭 — 하한은 min(이 값, LONG_EDGE ÷ 표시 폭) − 0.01 로 파생
32
32
  const SHOT_QUALITY_LADDER = [82, 72, 62, 52]; // genetics.mjs encodeShot 과 같은 사다리(--batch 예산 셈)
33
33
  // R13 비교 틀 — 칸 폭은 (표시 폭 − 좌우 여백×2 − 사이) ÷ 2 로 파생한다. 숫자를 문서에 되풀이하지 않는다.
@@ -88,6 +88,7 @@
88
88
  | 이슈 트래커 이름 | 같은 이유 | `forbid` 에 `[Aa]sana` 같은 패턴 |
89
89
  | 원본 티켓 제목 | 검색용 문자열이지 읽기용 문장이 아님 (5장) | `title` 을 처음부터 표제로 씀 |
90
90
  | 근거 수치 별도 필드 | `fix` 본문에 이미 녹아 있음. 중복 필드는 아무도 안 읽는데 채워야 하는 칸이 됨 | `fix` 안에 서술 |
91
+ | 자격증명이 오간 경로 · 우리 실수 | 고객 문서에 박제됨 — 권고는 구두로 (4.2 유형 L) | 렌더러 ⚠ 「자격증명 노출」 · 사람 눈 |
91
92
 
92
93
  > **이식 규칙.**
93
94
  > 새 프로젝트의 스키마는 **렌더러가 실제로 읽는 필드만**으로 정의함.
@@ -284,7 +285,7 @@ MCP 발행 스키마에도 `text_fix` 칸이 없음(`mcp/genetics.mjs`).
284
285
 
285
286
  ### 4.2 치환 유형 — 원고를 쓰면서 적용한다
286
287
 
287
- 내부 기록을 그대로 옮기면 걸리는 자리 열 가지임.
288
+ 내부 기록을 그대로 옮기면 걸리는 자리 열두 가지임.
288
289
  **여기는 기록 자리이므로 전부 개조식으로 적음.**
289
290
  요청 자리(`cta`·`open_items`·PART I 간지·판권지 회신 안내)는 이 표가 아니라 SKILL 5a 를 따름 —
290
291
  거기서는 하십시오체로 맺음. 문체 관문은 요청 자리를 빼고 셈(6.1).
@@ -302,6 +303,7 @@ MCP 발행 스키마에도 `text_fix` 칸이 없음(`mcp/genetics.mjs`).
302
303
  | I | 내부 관용어 → 중립 어휘 | 팀 은어 정규화 | 같은 개념을 두 이름으로 부르면 독자가 **다른 것으로** 읽음 | `자동 정리 방식` → `일괄 정리 방식` |
303
304
  | J | **삭제** | 설계 검토 이력·내부 잔여 정리는 서술 대상이 아님 | 채택되지 않은 대안은 **고객의 판단·행동을 바꾸지 않음.** 문서에 남으면 「아직 안 끝났다」로만 읽힘 | `처음 검토안 중 …은 제외함` → (통째로 삭제) |
304
305
  | K | 배제·무력 서술 → **조건 주어** + 원인·기준·재검토 시점 + 선택지 | 「[누구]는 할 수 없음/제외됨」 → 「[조건]이면 [기준] 때문에 [결과]. [재검토 시점]. 그동안은 [선택지]」 | 사람·조직·지역을 주어로 세운 부정은 배제 통보로 읽힘. 이유·선택지가 붙으면 같은 사실이 판단 근거로 읽힘(lim-portal-format §12.7b) | `[지역명] 은 라이선스에서 제외됨` → `[조건]에 해당하면 [라이선스 조항] 때문에 그 경로는 쓸 수 없음. 조항이 바뀌면 재검토. 그동안은 [대안 경로]` |
306
+ | L | **삭제 + 구두 전달** — 자사 실수·자격증명 취급 | 「비밀번호가 메신저로 오갔음」·「키를 메일로 보냈음」·「우리가 늦게 알았음」 → (통째로 삭제, 사용자에게 채팅으로만) | 고객 문서에 우리 실수를 적으면 박제되고 책임 소재가 글로 남음. 교체 권고는 맞아도 자리가 틀림(process.md 「같은 사실이 두 문서로 갈리는 지점」 원리 4). 그 사건 범위 안의 조언(심사에 넘긴 시험 계정을 「외부에 알려진 것으로 봄」)은 남김 | `호스팅 비밀번호 — 바꾸는 편이 나음 — 비밀번호가 메신저로 오갔음` → (행 삭제, 권고는 구두) |
305
307
 
306
308
  **경계선 둘.**
307
309
  K 는 **우리 근거의 약함을 지우라는 뜻이 아님** — 약한 근거는 등급을 달아 노출함(process.md 「같은 사실이 두 문서로 갈리는 지점」 원리 3). 지우는 것은 「독자의 무력함」 서술임.
@@ -350,6 +352,7 @@ AssertionError: 금지 표현 유출: 조회 색인 → ['조회 색인']
350
352
  | `자동 검증 \d건` | 유형 **D** 를 빠뜨림 |
351
353
  | `(은\|는\|을\|를) 제외(함\|됨\|했음\|했다\|한다\|하였음\|하였다)` · `지원(하지\|되지) 않음` | 유형 **K** 를 빠뜨림 — 조건 주어 없이 부정으로 끝난 문장(개조식 전이라 서술형 어미도 잡는다 — 8/18 반려 문구 「…을 제외했다」가 원형) |
352
354
  | 그 문서의 배제 대상 값(지역명·회사명·제품명) | 유형 **K** 의 값이 새어 들어옴 — 값은 스킬이 아니라 그 문서의 `forbid` 에 |
355
+ | 자격증명 명사 + 노출 경로·동사 근접(렌더러 `gazette.py` `text_scan()` 「자격증명 노출」 ⚠ — 두 경로 다) | 유형 **L** 을 빠뜨림 — 우리 쪽 자격증명 취급 사실이 새어 들어옴. 명사 하나(「비밀번호 재설정」)는 안 셈 |
353
356
 
354
357
  > **규칙: 치환 유형을 하나 정할 때마다, 그 유형이 없앴어야 할 낱말을 `forbid` 에 함께 등록한다.**
355
358
  > 짝이 없는 치환 규칙은 방어되지 않음.
@@ -9,7 +9,7 @@
9
9
  | | 도판 `plates`(PNG) | 도해 `diagrams`(인라인 SVG) |
10
10
  |---|---|---|
11
11
  | 글자 | 비트맵 — 확대하면 뭉개지고 검사기가 못 읽는다 | 활자 — 인쇄·확대에서 선명하고 문서의 Pretendard 를 물려받는다 |
12
- | 예산 | 장당 80KB · 합계 400KB | 장당 250KB(문서 크기에 직접 더해진다) |
12
+ | 예산 | 장당 300KB · 합계 2,400KB | 장당 250KB(문서 크기에 직접 더해진다) |
13
13
  | 만드는 법 | `figure.mjs` 로 굽는다 | `diagram.mjs render/export` 로 굳힌다 |
14
14
  | 언제 | 실제 화면 캡처 · 비트맵 원본 | 구조·흐름·순서·데이터 흐름·상태 전이 |
15
15
 
@@ -121,3 +121,32 @@
121
121
  → `text_scan` W5 「N차 … 제N절」 예외 · 16판이 표 이름(「두 계산식의 차이 실측」)으로 위치를 되살림. 표 번호 선참조(「표 7-1」)를 셀지는 미결.
122
122
  - **사용자 결정 둘(2026-09-15)** — 두 물음 「읽는 법에 확인 요청 한 줄을 둬도 되나」·「「바로 반영」 지시가 판 갱신 검토보다 앞서도 되나」에 둘 다 「응」.
123
123
  → SKILL 5a 요청 자리 목록·108행·0.5단계 7행 · process.md · lim-portal-format §10 경어체 행·§12.5b · genetics lim 결정 두 장.
124
+
125
+ ## 13. 「그 자리 길」「복제본 길」 (2026-09-17) — SKILL 반드시 지키는 것 12 · 0.5단계 3행 · 카피 게이트 새 행
126
+
127
+ 고객사 운영 DB 판올림 결정 브리핑(두 판). 사용자 반려 원문: 「"그 자리 길", "복제본 길" 이런 용어는 도데체 왜 쓰는거야?」
128
+ 경위 — 이 스킬이 선택지를 「길」이라 부르고(두 길·바꾸는 길·그대로 두는 길), 본보기 `report-briefing.json` 이 그 장치 이름을 표 제목·절 이름에
129
+ 그대로 실었다(「두 길의 결과」「바꾸는 길의 위험」「고른 길별 일정」 등 19곳). 작성자는 본보기를 베끼면서 「복제본으로 갈아타는 길」을 「복제본 길」로,
130
+ 「그 자리에서 올리는 길」을 「그 자리 길」로 줄였고, 같은 원고에서 스냅샷을 「사진」, 버튼을 「단추」라 불렀다.
131
+ 같은 날 사용자가 준 편집 스킬(Human Scope — StoryScope 논문 arXiv 2604.03136 의 소설 연구)에서 옮길 수 있는 항이 셋이었다:
132
+ 감정을 이름으로 부르지 않고 몸으로만 보여 줌(사람 29 % · AI 8 %) = 물건을 이름 대신 비유로 부름 · 장면이 보여 준 것을 서술자가 다시 말함(AI 77 % · 사람 52 %) =
133
+ 같은 결론을 다섯 자리에서 되풀이(R12f) · 깨달음으로 맺는 깔끔한 결말(AI 47 % · 사람 27 %) = 매 답을 「다음 행동」으로 닫음. 소설 연구라 수치는 유추이고,
134
+ 규칙의 근거는 반려 원문이다.
135
+ 처방 — 반드시 지키는 것 12(물건은 이름으로), 0.5단계 3행에 「스킬의 장치 이름도 장치 이름」, 본보기 JSON 의 「길」 19곳을 「선택지」·「쪽」으로 고침,
136
+ 렌더러 `text_scan()` 에 「선택지를 「길」로 부른 곳」 ⚠(RX_GIL — 「길이」「길게」「길다」 제외) 과 시험 2건.
137
+ 같은 날 두 번 더 — ① 발행 뒤 블록 목록에 「어느 길이」「지나는 길과」·열 머리 「길」이 남아 RX_GIL 을 넓힘(선택지를 세는 앞말 뒤의 「길이」·이든/과/와·칸 하나가 「길」).
138
+ ② 「지원료라는 단어가 요금을 지원해준다는 느낌으로 읽히지 않겠음?」·「"…7월 31일을 보라." 이거 싸가지 없지 않겠어?」 — AWS 의 Extended Support 를 「연장 지원료」로 직역한 것과,
139
+ 캡션 규칙 문장 「무엇을 보라는 것인지」를 캡션 말투로 베낀 것. 둘 다 스킬 문장의 유출이라 규칙 문장을 고쳤다(캡션 = 독자가 볼 자리, 명사형 · 공급사 용어는 그것이 무엇인지로) 하고
140
+ 렌더러에 해라체 명령 ⚠(RX_CMD) 과 시험 2건을 더했다. 공급사 용어 직역은 기계 없음 — 사람 눈.
141
+
142
+ ## 14. 「비밀번호가 메신저로 오갔음」 (2026-09-17) — SKILL 반드시 지키는 것 13 · process.md 원리 4 · content-pipeline 유형 L · 카피 게이트 새 행
143
+
144
+ 심사 탈락 사후 보고. 사용자 반려 원문: 「이딴내용을 왜 보고서에 넣는거야? 미치겠네.」 이어 「너의 실수가 아니라, 스킬이 빈약한거겠지.」
145
+ 경위 — FCG 의견 표에 「호스팅 계정 비밀번호 / 바꾸는 편이 나음 / 비밀번호가 메신저로 오갔음」 행을 넣었다. 교체 권고는 옳았으나
146
+ 우리 쪽 자격증명 취급 사실을 고객 문서에 박제했다. 스킬의 redaction 은 「고객이 못 알아볼 내부 용어」(티켓·개발 식별자·과정 어휘)만 잡았고
147
+ 「고객이 알아선 안 될 우리 치부」를 잡는 원리·치환 유형·게이트가 어느 층에도 없었다 — 렌더러 ⚠0 · dry_run ⚠0 을 통과해 나갔다(0표본 통과).
148
+ 처방 — process.md 원리 4(구두로), content-pipeline 유형 L(삭제 + 구두)과 §4.4·§1.3 짝 행, SKILL 13, 카피 게이트 행,
149
+ 렌더러 `RX_CRED`(자격증명 명사 + 노출 경로·동사가 한 문장 30자 안에 같이 선 곳만 — 명사 하나는 안 셈) ⚠ 과 §10-1 행, 시험 2건(★ + 대조군).
150
+ 실측(문장 11개): 노출 문장 4/4 잡음 · 정상 문장 6/7 통과 · 오탐 1(「메일 발송 기능이 계정 정보와 무관」 — 경고라 사람이 넘긴다).
151
+ 「우리 실수」 일반(「늦게 알았음」 류)은 기계가 못 재 사람 눈과 독자 검토 decider 관점에 둔다.
152
+ 운영 반영 확인(2026-09-17): 서버 배포(HEAD 2301f523) 뒤 운영 `dry_run` 탐침이 「자격증명 노출 서술이 1곳 … 「비밀번호가 메신저」」를 냈다 — 두 경로 다 산다. genetics-mcp 2.19.2 로 게시.
@@ -382,7 +382,7 @@ python3 assets/render.py <report.json>
382
382
  | `notice`·`colophon` 이 객체가 아님 | 같음 |
383
383
  | `cases[].source_url` 이 http(s) 가 아님 | 안 실린다. `javascript:` 를 겸해서 막는다 |
384
384
  | `assets[]` 의 모르는 `role`·`provider`, 매직바이트 불일치, data URI 아님 | 위조·무언의 소실 |
385
- | `assets[]` 크기 초과 — 장당 80,000B · 합계 400,000B | 서버가 못 견딘다 |
385
+ | `assets[]` 크기 초과 — 장당 300,000B · 합계 2,400,000B | 서버가 못 견딘다 |
386
386
 
387
387
  ## 10. 경고 조건 — 발행은 되지만 빠진다 (⚠)
388
388
 
@@ -472,8 +472,11 @@ python3 assets/render.py <report.json>
472
472
  | 앞 절이 뒤 절을 가리키는 곳이 %d개입니다(%s) — 낱말·규칙은 첫 등장 자리에서 풀고, 뒤 절이 앞 절을 되짚는 방향만 둡니다(readability R12h) | 절 i(배열 순서, 1부터)의 산문 — `sections[].name·sub·lede·paragraphs` · `tables[].caption·cols·rows·note` · `flow.caption·note`·`rows[].no`(건 좌표 꼴 `^§?\d{1,2}[-.]\d{1,2}$` 의 앞 숫자)·`cells[].text·note` · `marg(why/key/advice)` · 그 절이 `kind:"cases"` 면 같은 그룹 `cases[].symptom·cause·fix·how_to_check·remaining` · `kind:"asks"` 면 `cta[]`·`open_items[].title·body` · `sections[].plates` 가 가리키는 `assets[].caption·source_text` — 에서 정규식 `§\s*(\d+)\.\d+` 와 `(?<![\d.])(\d{1,2})절` 의 앞 숫자가 i 보다 큰 것을 센다. 「N차 … 제N절」(남의 문서의 절 번호, 예 「검수 보고 4차 제5절」)은 건너뛴다. `summary[].lead·body` 와 `refs[]` 는 세지 않는다 — 요약 근거 게이트(§8)가 `refs` 로 서고 「해당 절」·「근거」 단추가 되므로 뜀이 아니다. `%s` 는 자리와 걸린 낱말 최대 3개 | 낱말·규칙·예시 선언은 **첫 등장 자리에서 한 구절**로 풀고, 뒤 절 번호 대신 그 자리에서 뜻이 서는 말을 둔다. 근거 건은 `refs` 로만. 뒤 절이 앞 절을 되짚는 방향(05절에서 「03절 표」)은 둔다(readability R12h · SKILL 0.5단계 7행) |
473
473
  | 표 「%s」의 「%s」 열은 모든 행이 같습니다 — 차이를 못 나르는 열은 주석으로 | `doc_type` 에 「브리핑」 · `kind:"asks"` 절의 `tables[]` 가운데 행이 셋 이상인 표에서, 첫 열을 뺀 한 열이 모든 행에서 같은 값(빈 칸 아님)이다. asks 밖 절(일정 표 「누가」 열 등)·행 둘 이하·빈 칸뿐인 열은 안 센다 | 그 열을 빼고 ※ 주석 한 줄로(visual-first §5). 선택지를 가르는 열만 한눈표에 둔다(§12.3b 대칭 불변식) |
474
474
  | 건 행 이름 「%s」 낱말이 %d곳에도 쓰였습니다(%s) — 한 낱말은 한 장치에만, 다른 자리는 다른 낱말로 | 데이터가 준 `labels` 의 `symptom`·`cause`·`fix`·`check` 값이 `kind≠cases` 절의 `sub`·`tables[].caption`·`tables[].cols` 에 낱말로 선다(뒤에 조사 하나까지 같은 낱말 — 「판단력」·「판단이다」는 다른 낱말). 괄호 안은 자리 이름 최대 3개. `labels` 를 안 준 기본 이름·건 절 자신·절 이름·도입문·산문은 안 본다 | 의견 절의 열·부제는 「의견」으로(§3.5 · visual-first §3) |
475
+ | 선택지를 「길」로 부른 곳이 %d곳 있습니다(%s 「%s」 …) — 「길」은 스킬의 장치 이름입니다. 원고에서는 선택지를 그것이 실제로 무엇인지로 부릅니다 | 글자 자리 전부(과정 어휘와 같은 자리 — `history`·`labels`·`origin` 등 제외)에서 정규식 `RX_GIL`(gazette.py) — 「두 길의」「복제본 길」「고른 길별」「지나는 길과」, 앞말이 선택지를 세는 말인 「어느 길이」「두 길이」, 칸 하나가 「길」인 열 머리는 걸리고 「막대 길이」「길게」「길다」는 안 걸린다 | 선택지는 그것이 실제로 무엇인지(고객이 부르는 이름)로 — 「복제본 전환」「직접 업그레이드」「현행 유지」. 「길」은 스킬 문서 안의 장치 이름일 뿐이다(SKILL 반드시 지키는 것 12) |
476
+ | 해라체 명령이 %d곳 있습니다(%s 「%s」 …) — 독자에게 말 거는 자리는 하십시오체, 기록 자리는 개조식입니다. 캡션·확인 방법은 「… 참고」「…에서 확인」처럼 명사형으로 | 글자 자리 전부(「길」과 같은 자리)에서 정규식 `RX_CMD`(gazette.py) — 낱말 끝 「보라·하라·열라·누르라·찾으라·읽으라·두라·말라·가라·보시오·하시오」 뒤에 마침표·공백·닫는 따옴표가 오거나 글이 끝나면 센다. 「보라색」(한글이 이어짐)·「정할 것」(명사구)은 안 센다 | 캡션·확인 방법은 명사형(「… 참고」「…에서 확인」), 독자에게 말 거는 자리는 하십시오체(5a). 경위: 캡션 규칙 「무엇을 보라는 것인지」가 캡션이 됐다(2026-09-17) |
475
477
  | 선택지 기호 %s 에 이름이 %d개입니다(「%s」·「%s」) — 기호는 한 목록에만 붙이고 이름은 표마다 같게 | 모든 표에서 한 축(열 머리 줄, 또는 행 첫 칸 열)마다 `^([A-Z])[\s·:.)]+(\S.*)$` 꼴을 모으고, 그 축의 기호가 A 부터 차례(둘 이상)일 때만 선택지 정의로 친다. 문서 전체에서 한 글자에 이름이 둘 이상이면 센다(짧은 이름과 긴 이름이 갈린 것도). 산문(「방식 A」)·A 부터 차례가 아닌 축(부분을 가리키는 행)·괄호 부연 차이는 안 센다 | A·B·C 는 한 목록에만. 같은 선택지는 표마다 같은 이름(visual-first §3) |
476
478
  | 개발 식별자가 %d곳에 있습니다(%s) — 고객은 조회할 수 없습니다. 커밋·파일·도구·시험 건수는 원고 밖 상태 표에만 | 글자 자리 전부를 주소를 지운 뒤(부록 포함, `history`·`labels`·`origin`·`file`·`source_url`·`href`·`data` 와 `uid`·`id`·`plates`·`refs` 제외) 정규식으로 센다 — 16진 해시(a~f 와 숫자가 섞인 7~64자) · 코드 파일(`.ts`·`.tsx`·`.js`·`.jsx`·`.mjs`·`.py`·`.php`·`.kt`·`.swift`·`.java`) · `src/`·`lib/` · 개발 도구(`tsc`·`eslint`·`prettier`·`jest`·`pytest`·`playwright`·`git`) · `N/N 통과` · 커밋·브랜치·머지·풀 리퀘스트·스테이징. 괄호 안은 「자리 「낱말」」 최대 3개 | 확인 수준은 이용자가 확인할 수 있는 동작으로(content-pipeline §4.2 유형 B). 「나머지」·「머지않아」·「푸시 알림」·숫자만인 번호·날짜·본문 주소·대문자로 시작하는 제품 이름(「Node.js」)은 안 걸린다 |
479
+ | 자격증명 노출 서술이 %d곳에 있습니다(%s) — 우리 쪽 취급 사실은 문서가 아니라 구두로. 권고 문장만 남기고 경로 서술은 지웁니다 | 글자 자리 전부(개발 식별자와 같은 제외 칸)에서 자격증명 명사(비밀번호·패스워드·암호(「암호화」 제외)·접속/계정/로그인 정보·자격 증명·API/비밀/인증서 키·토큰)와 노출 경로·동사(메신저·카카오톡·카톡·채팅·문자·메일·이메일·슬랙·평문·공유·전달·주고받·오갔·보냈·받았·남겼)가 **한 문장 30자 안에 같이** 선 곳 | 그 문장을 지우고 권고(「교체 권장」)만 남긴다 — 취급 사실은 구두로. 「비밀번호 재설정 기능」·「암호화 키」·「푸시 알림이 문자로」처럼 명사 하나나 경로 하나만 선 문장은 안 걸린다 |
477
480
  | 없는 그림·표 번호를 %d곳에서 가리킵니다(%s) — 그림은 {{그림:id}} 로 가리키면 순서가 바뀌어도 따라갑니다 | 글자 자리의 `(그림·표) N-M`(이어 쓴 `· ~ ,` 번호까지 풀어서, `~` 는 같은 절이면 범위)이 렌더러의 번호 셈(§11-1 순서)에 없다. 「」 인용 안·`history`·`origin` 과 앞이 한글인 것(「지표 1-2」)은 건너뛴다 | 그림은 `{{그림:<id>}}` 토큰으로(§11-6). 다른 문서의 번호는 「」 로 인용 |
478
481
  | 번호 뒤 조사가 맞지 않는 곳이 %d개입니다(「%s」 → 「%s」) — 끝 숫자의 소리로 고르거나 {{그림:id\|은}} 으로 | 마지막 번호 뒤 조사(`으로·은·는·이·가·을·를·과·와·로`)가 끝 숫자의 받침과 어긋난다 — 받침 있음 0·1·3·6·7·8, 없음 2·4·5·9, 「으로」는 0·3·6 만 | 조사를 고치거나 `{{그림:id\|은}}` |
479
482
  | 그림 가리킴 토큰 %d곳이 번호로 서지 못합니다(%s) — plates 에 걸린 assets[].id 나 flow:<절 번호>, 조사는 은·이·을·과·으로 짝으로 | `{{그림:…}}` 의 id 가 번호 셈에 없거나(plates 에 안 걸림) 조사가 짝 밖이다. 토큰은 글자 그대로 남는다 | id 를 plates 에 걸거나 조사를 짝 안에서 |
@@ -591,14 +594,14 @@ CSS 로는 못 한다. 우측 판독부에 남는 것은 문서 전체의 사실
591
594
  | `deterministic` | **무손실** WebP | 평면 색과 선이라 무손실이 작고 선이 안 뭉갠다 |
592
595
  | `user-provided` | 화질 사다리 82 → 72 → 62 → 52 | 화면 캡처는 사진에 가까워 무손실이 예산을 몇 배로 넘긴다. 글자가 읽히는 것이 목적이라 `-sharp_yuv` 를 끝까지 유지한다 |
593
596
 
594
- 최저 화질에서도 장당 80,000B 를 넘으면 거절된다. 그때 줄일 것은 **화질이 아니라 담은 화면 수**다 —
597
+ 최저 화질에서도 장당 300,000B 를 넘으면 거절된다. 그때 줄일 것은 **화질이 아니라 담은 화면 수**다 —
595
598
  여러 장을 한 판에 몰아 넣으면 어차피 문서에서 글자가 안 읽힌다.
596
599
 
597
600
  ### 캡션에 무엇을 쓰는가
598
601
 
599
- **이 화면에서 무엇을 보라는 것인지**를 쓴다.
602
+ **이 화면에서 독자가 볼 자리**를 명사형으로 쓴다(「8.0 행의 두 날짜와 8.4 행의 종료일 참고」). 「…을 보라」 같은 해라체 명령은 어디에도 없다 — 렌더러가 ⚠ 로 센다.
600
603
  본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
601
- 그리고 `alt` 는 캡션의 사본이 아니다 — 캡션은 「무엇을 보라」이고 `alt` 는 「무엇이 보이는가」다.
604
+ 그리고 `alt` 는 캡션의 사본이 아니다 — 캡션은 「독자가 볼 자리」이고 `alt` 는 「무엇이 보이는가」다.
602
605
 
603
606
  ## 11-2. 흐름도 — 「A 가 되면 B 가 되고 C 가 된다」
604
607
 
@@ -665,7 +665,7 @@ MCP 가 찍는 요약 줄은 **옛 서식의 셈**만 읽는다(`genetics.mjs ou
665
665
  ## 같은 사실이 두 문서로 갈리는 지점
666
666
 
667
667
  내부 기록 ↔ 고객 문서 대조표는 SKILL.md 0단계에 있다.
668
- 여기서는 그 표를 만든 **원리 셋**만 적는다.
668
+ 여기서는 그 표를 만든 **원리 넷**만 적는다.
669
669
 
670
670
  1. **독자가 검증할 수 없는 참조는 싣지 않는다.**
671
671
  티켓 번호·내부 시스템명은 확인 수단이 없어 노이즈만 된다.
@@ -676,6 +676,11 @@ MCP 가 찍는 요약 줄은 **옛 서식의 셈**만 읽는다(`genetics.mjs ou
676
676
  최약 등급을 지우는 게 아니라 정의를 달아 보여준다.
677
677
  단서 — 노출하는 것은 **우리 근거의 약함**이지 독자의 무력함이 아니다.
678
678
  「당신은 못 한다 / 제외된다」는 문장은 이 원리의 적용이 아니라 배제 통보다. content-pipeline §4.2 유형 K 로 고쳐 쓴다.
679
+ 4. **우리 쪽 보안·운영 실수는 문서에 남기지 않는다 — 구두로 전한다.**
680
+ 자격증명(비밀번호·키·토큰·접속 정보)이 어떤 경로로 오갔는지, 우리가 무엇을 늦게 알았는지는
681
+ 「당신 문제가 어떻게 됐는가」가 아니라 「우리가 어떻게 실수했는가」다.
682
+ 교체 권고 자체는 옳아도 전달 경로가 틀리다 — 문서는 박제되고 책임 소재를 글로 남긴다. 권고는 사용자에게 채팅으로만.
683
+ 원리 3 과 가른다: 노출하는 것은 **우리 근거의 약함**이지 **우리 운영의 실수**가 아니다(경위: `history.md` §14).
679
684
 
680
685
  독자가 바뀌면 구조까지 바뀐다.
681
686
 
@@ -42,7 +42,7 @@
42
42
  | R11 본문·표 | 문단 사이 ≥ 1.5em · 한 줄 한글 14~45자 · 헤더 ≥ 본문 ×1.5 굵게 · 문단 ≤ 220자 · 산문 참조 번호 ≤ 3 | gazette.css 토큰 · gazette-report `read.mjs` · §10-1 | ⚠ |
43
43
  | R11a 문장 | **한 문장 ≤ 60자**(공백 제외). 관보는 한 문장을 한 줄로 세우므로 문장 길이가 곧 줄 길이 — 본문 단은 한 줄에 45자, 60자면 1.4줄. 판단 항목·건처럼 가장 많이 읽는 자리는 **45자 안**으로 써 한 줄에 세운다. 접히는 문장은 마침표에서 둘로 끊는다(실측: 고객사 결정 브리핑의 앞선 판에서 45~57자 문장 20개가 한 번씩 접혔음) | gazette.py `text_scan`(60자) · 45자는 사람 눈 | ⚠ |
44
44
  | R11b 표 칸 | 칸 ≤ **20자**(4열 이하) · ≤ **12자**(5열 이상) — 열 폭 130~180px 에서 두 줄. 설명은 ※ 주석·본문으로. 흐름도 칸 ≤ 20자·note ≤ 12자(칸 폭 200px), 조건은 note. 칸에 넣던 숫자 나열은 **행으로 푼다**(「A 구간 1,234 · B 구간 5,678 …」 한 칸 → 구간마다 한 행) | gazette.py `text_scan`(칸·흐름도 칸·note) · 숫자 나열은 사람 눈 | ⚠ |
45
- | R11c 도판 글 | 캡션 ≤ **60자** 한 문장(「무엇을 보라」만 — 문장 수도 센다) · 출처 줄 ≤ **40자**, 원본 위치 한 구절만(R12e) | gazette.py `text_scan` | ⚠ |
45
+ | R11c 도판 글 | 캡션 ≤ **60자** 한 문장(독자가 볼 자리만, 명사형 — 문장 수도 센다) · 출처 줄 ≤ **40자**, 원본 위치 한 구절만(R12e) | gazette.py `text_scan` | ⚠ |
46
46
  | R11d 요약면 | 현황 줄 ≤ **80자** 한두 문장 · 수치 칸 라벨 ≤ **16자**(이름표) · 요약 문단 본문 ≤ 160자 세 문장 | gazette.py `text_scan`(자수) · 문장 수는 사람 눈 | ⚠ |
47
47
  | R11e 절 머리 | 도입문 ≤ 90자 두 문장 · 여백 주석 why 30 · key 45 · advice 40자(19자/줄 단) | gazette.py `text_scan`(자수) · 도입문 문장 수는 사람 눈 | ⚠ |
48
48
  | R11f 판단 항목 | 본문 ≤ 220자 네 문장 — 첫 문장은 기한, 상세는 건으로 | gazette.py `text_scan`(자수 · 문장 수는 R12b) | ⚠ |
@@ -67,7 +67,7 @@
67
67
 
68
68
  - 색이 **뜻**에 맞는가 — 초록=정상·노랑=주의·빨강=위험처럼 독자가 이미 아는 뜻을 거스르지 않는가.
69
69
  - 색이 **선택지의 옳고 그름**을 판정하지 않는가 — 한 길만 빨강, 다른 길만 초록이면 그림이 답을 먼저 말한다. 빨강·초록은 이용자 상태를 나르는 그림에만.
70
- - 캡션이 「무엇을 보라」인가 — 그림이 이미 보여 주는 것을 되풀이하면 장식이다.
70
+ - 캡션이 독자가 볼 자리를 가리키는가 — 그림이 이미 보여 주는 것을 되풀이하면 장식이다. 「…을 보라」 같은 해라체 명령은 렌더러가 센다.
71
71
  - 라벨이 **자기 표식**을 가리키는가 — 기계는 거리만 잰다.
72
72
  - 한 그림에 **한 생각**인가 — 패널 둘까지.
73
73
  - 선택지 도판들이 **같은 잣대**인가 — 한 선택지만 합성·실사·크게·먼저가 아닌가, 칩 이름이 캡션·표의 이름과 같은가(R13d 의 뜻 쪽).
@@ -95,7 +95,7 @@ const MERGED = { type: 'object', properties: { findings: { type: 'array', items:
95
95
  required: ['ids', ...FINDING.required] } }, overall: { type: 'string' } }, required: ['findings', 'overall'] }
96
96
  const LENSES = [
97
97
  ['first-time', '처음 읽는 사람 — 배경을 모른다. 정의 없이 나오는 용어, 앞 절을 안 읽으면 못 따라가는 곳, 한 낱말이 두 값을 가리키는 곳, 문단이 길어 요지가 묻히는 곳, 산문 속 참조 번호 때문에 앞뒤로 오가야 하는 곳. 처방은 그 자리에서 이해되게 하는 것 — 낱말·규칙·예시 선언은 첫 등장 자리에서 한 구절(20자 안)로 풀고, 뒤 절의 번호·표 이름·§ 를 앞 절에서 쓰지 않는다(뒤 절이 앞 절을 되짚는 방향만). 「N절을 보라」「부록에 있다」는 처방이 아니다 — 그것이 시험지를 만든다(2026-09-14).'],
98
- ['decider', '결정권자 — 회신해야 한다. 판단 요청 각 항에서 「무엇을 고르는지(물음) / 두 길이 각각 무엇을 바꾸는지(그대로 두면 · 바꾸면) / 기한」이 3초 안에 읽히는지. 안 읽히는 항의 재구성안과, 항들을 한눈에 묶는 표·관문 흐름도. 수치·링크·건수가 절마다 어긋나는 곳(신뢰를 깨는 것). 권고가 제목·표 열·색(칩·톤)·요약면에 배어 독자가 동의만 하게 되는 틀(답정너)인지 — 배인 자리마다 짚고, 물음과 두 길 대칭으로 되돌린 재구성안. 그리고 둘을 더 본다: (1) 독자의 **할 일마다**(위 「독자」 줄의 할 일 목록) 그것이 표지 meta · 요약면 현황 줄(notice) · 읽는 법(guide) 첫 물음에 서는지 대조한다 — 한 자리라도 빠지면 severity 4 로 짚고 어느 자리에 무엇을 넣을지 rewrite 에 적는다(요청문이 아니라 사실문으로). (2) 요약면 수치 칸(stats)끼리 **겹치는 집합**인지 — 한 수가 다른 수에 포함되면(전체 건 수와 그중 일부) 하나를 빼거나 라벨에 관계를 드러내는(「그중 …」) 재구성안을 적는다.'],
98
+ ['decider', '결정권자 — 회신해야 한다. 판단 요청 각 항에서 「무엇을 고르는지(물음) / 두 길이 각각 무엇을 바꾸는지(그대로 두면 · 바꾸면) / 기한」이 3초 안에 읽히는지. 안 읽히는 항의 재구성안과, 항들을 한눈에 묶는 표·관문 흐름도. 수치·링크·건수가 절마다 어긋나는 곳(신뢰를 깨는 것). 권고가 제목·표 열·색(칩·톤)·요약면에 배어 독자가 동의만 하게 되는 틀(답정너)인지 — 배인 자리마다 짚고, 물음과 두 길 대칭으로 되돌린 재구성안. 그리고 둘을 더 본다: (1) 독자의 **할 일마다**(위 「독자」 줄의 할 일 목록) 그것이 표지 meta · 요약면 현황 줄(notice) · 읽는 법(guide) 첫 물음에 서는지 대조한다 — 한 자리라도 빠지면 severity 4 로 짚고 어느 자리에 무엇을 넣을지 rewrite 에 적는다(요청문이 아니라 사실문으로). (2) 요약면 수치 칸(stats)끼리 **겹치는 집합**인지 — 한 수가 다른 수에 포함되면(전체 건 수와 그중 일부) 하나를 빼거나 라벨에 관계를 드러내는(「그중 …」) 재구성안을 적는다. (3) 고객 자리에서 읽어 **우리를 어떻게 보이게 하는 문장**(자격증명이 오간 경로, 우리가 늦게 안 것, 우리 절차 미비)이 있으면 severity 4 로 짚고 rewrite 는 「그 문장 삭제, 권고만」 — 그 사건 범위 안의 조언은 남긴다.'],
99
99
  ['visual', '정보 디자이너 — 글로 설명하는데 그림이면 한 번에 보일 곳. 원리·갈림·타임라인·분포·자리별 상태. 각 그림의 축·칸·숫자·라벨을 구체로. 표의 숫자를 문장으로 되풀이하는 문단, 굵게·칩·톤을 둘 자리.'],
100
100
  ['source', '원본 대조 — 고객이 누를 수 있는 원본과 원고 인용의 일치를 본다. 원고가 가리키는 원본을 실제로 연다: 건 cases[].source_url, 도판 출처 줄 assets[].source_text 안의 주소·쪽, 부록 출처 목록과 본문 글자 안의 맨 주소·[글자](주소). assets[].origin 은 렌더되지 않는 제공자 기록이라 대조 대상이 아니다. 인용 문구·쪽(행)·값을 원문과 대조한다. 어긋나는 인용, 원문에 없는 문장, 쪽·절 번호 오기, 고객이 눌러도 안 열리는 링크를 발견으로(원고가 원문과 다르면 class 사실틀림). 「흐리다」「못 연다」는 주장은 원본 해상도로 재측정해(PDF 는 pdfimages -list 전체, 웹은 실제로 열어) 잰 값을 evidence 에 적고, 못 열었으면 「미확인」이라 적는다 — 짐작으로 판정하지 않는다. 앱 동작·내부 수치·결정의 주체는 facts 관점 몫이라 여기서 판정하지 않는다 — 다른 문서에 그 말이 없다고 앱 동작을 거짓이라 하지 않는다. rewrite 에는 원문 문구 그대로 + 원본 이름·쪽(행)·주소로 고친 출처 줄.'],
101
101
  ['structure', '구조 검토자 — parts[] 의 title·lede·questions 와 그 PART 에 속한 절(sections[].part)을 맞대어 읽는다. 짚을 곳: 앞 PART 의 요지 lead·marg.key·표 행이 뒤 PART 의 물음에 먼저 답하는 곳 / 같은 사실(시각·금액·건 제목·핵심 명제)이 두 PART 이상에 서는 곳 — 선 자리를 전부 세어 적는다 / 같은 건의 세 배율(summary·status·cases)이 asks 없이 서로 다른 PART 로 갈린 곳 / 두 절의 marg.key 가 낱말만 다르고 같은 명제인 곳 / 어느 PART 도 선언하지 않은 물음에 답하는 절 / 결정권자 독자인데 status 대조표가 건 제목을 한 번 더 세우는 곳 / 요지 문단(summary)·읽는 법(guide) 물음이 건의 관찰·판단을 바꿔 말한 곳 — 문장 쌍(요지·읽는 법 쪽 ↔ 건 쪽)으로 전수해 evidence 에 적는다. 요약면 수치·요지 lead 가 문서 전체를 줄여 말하는 것은 설계라 결함이 아니다 — 단 요지 문단이 건을 하나씩 옮겨 적으면 결함. 요지(summary)의 모양도 여기서 본다: 이야기 순서(문제 → 원인 → 해법 → 정할 것)대로 서는지, 결정 문서면 칸이 4~6문단인지, 결정에 직접 닿지 않는 **근거 문단의 body 가 비어 있는지**(lead 한 줄 + refs 만 — 본문은 건이 가진다). rewrite 에는 합칠 절·지울 문장을 적는다 — 더하기가 아니라 빼기로. 단 뺀 자리에 뒤 절 번호 포인터를 남기지 않는다: 그 자리에서 뜻이 서게 하는 한 구절(낱말 정의·조건 이름)은 남긴다.'],
@@ -47,6 +47,9 @@
47
47
  건 행 「판단」과 의견 표 열 「판단」이 함께 서면 독자는 둘을 같은 것으로 읽는다 — 의견 절의 낱말은 「의견」이다.
48
48
  - **선택지 기호** — A·B·C 는 **한 목록에만** 붙인다. 도안 셋에 A·B·C 를 붙였으면 다른 표의 길 넷에는 기호 대신 이름을 쓴다.
49
49
  같은 선택지는 한눈표·선택지 비교·의견 표·도판 칩·캡션에서 같은 이름·같은 순서로 부른다(`lim-portal-format.md` §12.3b 대칭 불변식).
50
+ - **스킬의 장치 이름** — 이 문서와 `lim-portal-format.md` 가 선택지를 「길」(두 길·바꾸는 길), 열을 「지금·그대로 두면·바꾸면」이라 부르는 것은
51
+ **집필자에게 하는 말**이지 원고의 낱말이 아니다. 원고에서 선택지는 고객이 부르는 이름(「복제본 전환」「직접 업그레이드」「현행 유지」)으로, 표 열 이름도
52
+ 그 이름으로 적는다. 「복제본 길」「고른 길별 일정」은 장치 이름의 유출이다(SKILL 반드시 지키는 것 12, 렌더러 ⚠ 「선택지를 「길」로 부른 곳」).
50
53
 
51
54
  집행자: `gazette.py text_scan()` ⚠ — 건 행 이름이 다른 절 부제·표 제목·열에 서는 곳, 선택지 기호 하나에 이름이 둘인 곳(표의 열 머리·행 첫 칸만,
52
55
  산문은 안 봄) · 한 낱말이 두 값인지(뜻)는 독자 검토 「처음 읽는 사람」 관점과 사람 눈.
@@ -1,25 +0,0 @@
1
- <!doctype html><meta charset="utf-8">
2
- <!-- pair.mjs 가 쓴 두 칸 비교 도판 — 손으로 고치지 말고 인자를 바꿔 다시 쓴다.
3
- layout column · 칸 350 · 사이 20 · 좌우 20 · 배율 1.34(원본 520px ÷ dpr 2) · 틀 높이 489
4
- left plate-pair-before.png 520×730 · right plate-pair-after.png 520×470 · crop-top 0 · mark 12,54,236,120 · seam 54 -->
5
- <style>
6
- body{margin:0;background:#fff;font-family:Pretendard,"Apple SD Gothic Neo","Noto Sans KR",sans-serif;color:#111}
7
- .wrap{width:760px;padding:16px 20px 20px;box-sizing:border-box;background:#fff;display:flex;gap:20px;align-items:flex-start}
8
- .col{width:350px;flex:none}
9
- .lab{font-size:17px;font-weight:700;height:28px;line-height:28px;margin:0 0 8px;display:flex;align-items:center;gap:10px;white-space:nowrap}
10
- .tag{display:inline-block;background:#e5e7eb;color:#111;font-size:15px;font-weight:700;line-height:24px;padding:0 10px;border-radius:2px;flex:none}
11
- .shot{position:relative;width:350px;height:491px;border:1px solid #bbb;border-radius:4px;overflow:hidden;box-sizing:border-box;background:#fff}
12
- .shot img{position:absolute;left:0;display:block;width:348px}
13
- .mark{position:absolute;border:3px solid #111;border-radius:6px;box-sizing:border-box}
14
- .seam{position:absolute;left:10px;right:10px;border-top:2px dashed #595959}
15
- </style>
16
- <div class="wrap">
17
- <div class="col">
18
- <p class="lab"><span class="tag">그대로 두면</span>카드가 보임</p>
19
- <div class="shot"><img src="plate-pair-before.png" alt="" data-dpr="2" data-min-text="13" style="top:0px"><div class="mark" style="left:16.06px;top:72.28px;width:315.88px;height:160.62px"></div></div>
20
- </div>
21
- <div class="col">
22
- <p class="lab"><span class="tag">바꾸면</span>카드가 빠지고 지표가 올라옴</p>
23
- <div class="shot"><img src="plate-pair-after.png" alt="" data-dpr="2" data-min-text="13" style="top:0px"><div class="seam" style="top:71.28px"></div></div>
24
- </div>
25
- </div>