genetics-mcp 2.23.0 → 2.25.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.
- package/bin/aarch64-apple-darwin/gcell +0 -0
- package/bin/aarch64-unknown-linux-musl/gcell +0 -0
- package/bin/manifest.json +5 -5
- package/bin/x86_64-apple-darwin/gcell +0 -0
- package/bin/x86_64-pc-windows-gnu/gcell.exe +0 -0
- package/bin/x86_64-unknown-linux-musl/gcell +0 -0
- package/genetics.mjs +2068 -239
- package/package.json +2 -2
- package/skills/gazette-report/SKILL.md +11 -10
- package/skills/gazette-report/scripts/tone.mjs +17 -5
- package/skills/gazette-report/scripts/tone.test.mjs +15 -2
- package/skills/gazette-report/template/skeleton.html +10 -10
- package/skills/genetics-define/SKILL.md +2 -0
- package/skills/genetics-report/SKILL.md +123 -102
- package/skills/genetics-report/assets/example/cases-briefing.json +1 -1
- package/skills/genetics-report/assets/example/cases.json +3 -3
- package/skills/genetics-report/assets/example/report-briefing-designs.json +26 -26
- package/skills/genetics-report/assets/example/report-briefing.json +3 -3
- package/skills/genetics-report/assets/example/report.json +11 -11
- package/skills/genetics-report/assets/mcp-call.mjs +160 -0
- package/skills/genetics-report/assets/patch.py +411 -0
- package/skills/genetics-report/assets/render.py +223 -0
- package/skills/genetics-report/assets/xlsx-plate.py +203 -0
- package/skills/genetics-report/references/content-pipeline.md +26 -26
- package/skills/genetics-report/references/edition-review.workflow.js +120 -23
- package/skills/genetics-report/references/font-embedding.md +1 -1
- package/skills/genetics-report/references/history.md +76 -2
- package/skills/genetics-report/references/lim-portal-format.md +109 -48
- package/skills/genetics-report/references/linear-read-test.workflow.js +50 -14
- package/skills/genetics-report/references/process.md +54 -48
- package/skills/genetics-report/references/reader-review.workflow.js +118 -33
- package/skills/genetics-report/references/visual-first.md +34 -17
- package/skills/gazette-report/scripts/package-lock.json +0 -24
|
@@ -11,7 +11,7 @@ description: |
|
|
|
11
11
|
- "검수 요청 문서 만들어줘" / "장애 사후 보고서 / 릴리스 노트를 고객용으로"
|
|
12
12
|
- "기술보고서/인수인계/온보딩 문서/포스트모템 만들어줘" (→ PART 구성으로 푼다)
|
|
13
13
|
- "조사한 걸 정리해서 할지 말지 정하게 해줘" / "R&D 브리핑 / 기술 도입 검토서 / 결정 요청서" (→ 결정한다 모드)
|
|
14
|
-
내용 설계(독자 정의 → 등급 → 고객 언어 치환 →
|
|
14
|
+
내용 설계(독자 정의 → 등급 → 고객 언어 치환 → 주어별 문체 전환)가 본체이고, 전달은 둘 중 하나입니다:
|
|
15
15
|
Lim MCP 발행(서버 렌더, 링크 공유) 또는 단일 HTML(같은 관보 서식·폰트 임베드).
|
|
16
16
|
서식은 **한국 정부간행물(관보) 문서 문법**입니다 — 표지·발행 이력·차례·활용법·요약·PART 간지·
|
|
17
17
|
두 단 본문(여백 주석)·부록·판권지로 서고, 인쇄하면 실제 A4 페이지가 나옵니다.
|
|
@@ -28,6 +28,12 @@ version: "4.0.0"
|
|
|
28
28
|
이 둘은 같은 사실을 다루지만 완전히 다른 문서입니다. 이 스킬의 본체는
|
|
29
29
|
**무엇을 빼고 무엇을 고쳐 쓰는가**(내용 설계)이고, 전달 형태는 그 다음입니다.
|
|
30
30
|
|
|
31
|
+
독자에 대한 원칙 셋 — 규칙 자리는 따로 있고, 여기는 먼저 읽을 요지입니다(경위: `references/history.md` §16~§18).
|
|
32
|
+
|
|
33
|
+
1. **독자는 이 문서를 처음 읽습니다.** 우리 대화·회차·판·결정 경위를 모릅니다. 원고는 직전 판의 차분이 아니라 독자의 0 상태에서 씁니다(반드시 지키는 것 3b).
|
|
34
|
+
2. **대상은 독자가 문서 밖에서 보는 원래 이름으로 부릅니다** — 자기 화면·콘솔·계약서·원본 문서의 글자입니다. 작업하며 지은 이름은 문서 안에서 정의해도 쓰지 않습니다(반드시 지키는 것 12 · 0단계 물음 5).
|
|
35
|
+
3. **뜻은 그 자리에서 섭니다.** 낱말은 첫 등장 자리에서 풀고, 뒤 절 번호나 「N절 참고」로 독자를 오가게 하지 않습니다(0.5단계 7행).
|
|
36
|
+
|
|
31
37
|
## 작업 체크리스트 — 단계 번호의 정본
|
|
32
38
|
|
|
33
39
|
밟는 순서는 이 표 한 장이다. 이 스킬의 「N단계」는 모두 이 표의 번호다 — 단계마다 무엇을 쓰고 판단하는지는 `references/process.md`.
|
|
@@ -35,24 +41,24 @@ version: "4.0.0"
|
|
|
35
41
|
|
|
36
42
|
| 단계 | 산출물 | 돌릴 명령 | 통과 기준 | 집행자 | 사용자에게 묻는 것 |
|
|
37
43
|
|---|---|---|---|---|---|
|
|
38
|
-
| 0 독자 | 독자 문장 1줄 + 할 일 목록(작업 메모) | — | 누가 · 무엇을 하나 · 무엇을 언제까지 정하나가 문장으로 섬 | 사람 — 사용자 확인 | **반드시** 0단계 물음 1~3 · FCG 의견을 낼지 |
|
|
44
|
+
| 0 독자 | 독자 문장 1줄 + 할 일 목록(작업 메모) · 이름 대응표 `names.md`(작업 폴더, 발행 안 함 — 0단계 물음 5) | — | 누가 · 무엇을 하나 · 무엇을 언제까지 정하나가 문장으로 섬 · 원고에서 부를 대상마다 독자 화면·문서의 이름이 섬(새 개념이면 「원래 이름 없음」) | 사람 — 사용자 확인 | **반드시** 0단계 물음 1~3 · FCG 의견을 낼지 · 자료에서 못 찾은 독자 쪽 이름(물음 5) |
|
|
39
45
|
| 0a 결정 장부 | 작업 폴더 `decisions.json`(발행 안 함) | — | 원고에 「정해진 것」으로 쓸 항마다 결정권 · 정한 주체 · 기록 · 확인 여부가 참 | 사람 눈 · 독자 검토 facts 관점(`args.decisions`) | 0단계 물음 4 — 미확인 항을 한 번에 |
|
|
40
46
|
| 0.5 시각 설계 | 절마다 시각 장치 · 예시 한 명 · 용어 잠금 표 | — | 0.5단계 표 1~6행이 정해짐 | 사람 눈 · 렌더러 ⚠(`lim-portal-format.md` 「10-1. 시각 우선 관문」) | 화면 변화가 따르면 도안으로 결재받을지 |
|
|
41
|
-
| 1·2 자료·건 | `cases.json` | — | 건마다 다섯 칸 · 근거 없는 칸은
|
|
47
|
+
| 1·2 자료·건 | `cases.json` | — | 건마다 다섯 칸 · 근거 없는 칸은 「[미확인]」(사용자에게 되물을 칸 — 발행 전 0) | 서버 발행 검증(그룹 정합) · 사람 | 원자료 범위 · 고객이 아는 참조 · 「[미확인]」 칸 |
|
|
42
48
|
| 3 등급 | `grades` · 건별 `grade` | — | 4단 이하 · 최약 등급이 기본 | 사람 | 등급 이름·개수 |
|
|
43
49
|
| 4~6 원고 | `report.json` · 코드 작업을 녹이면 원고 밖 상태 표(반드시 지키는 것 3) | — | 요약 근거 · 요지 칸 수(4~6단계) · 절마다 `marg` | 서버 요약 근거 게이트(거절) · 사람 | 공통 원인이 실재하는가 |
|
|
44
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` · 칩 문구의 뜻은 사람 눈 | — |
|
|
45
|
-
| 7 로컬 렌더 | 단일 HTML | `python3 assets/render.py report.json` | ⚠0 · `forbid` 적중 0 | `gazette.py` `text_scan()`·`brief_checks()`·`tally_scan()` · `build.py guard()` | — |
|
|
46
|
-
| 7 dry_run | 경고 목록 | `publish_report`/`update_report` 에 `dry_run: true` | 작성자가 고칠 수 있는 ⚠0 — 못 없애는 경고는 까닭을 핸드오프에 | `report_publish.php report_build_checked()`(렌더러·입고·그림·문체) · `update_report` 는 `comments.php comment_anchor_forecast()`(회신 핀 자리) · 경고 기준선 대조는 사람 | — |
|
|
47
|
-
| 7 독자 검토 | 워크플로 결과(`merged`·`questions`·`dropped`) | `references/reader-review.workflow.js`(0.5단계 7행) · 구조를 안 바꾼 낱말 손질 판은 `references/edition-review.workflow.js`(
|
|
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[]` |
|
|
48
54
|
| 7 조판 검사 | 검사기 출력 | `gazette-report` 검사기 8종(단일 HTML 전달일 때) | 각 0건 · **표본 수를 함께 본다**(0표본 통과는 통과가 아니다) | 검사기 — 실행법은 `gazette-report` 스킬 | — |
|
|
49
55
|
| 7 사람 눈 | — | 인쇄 미리보기까지 연다 | `references/process.md` 「7단계 — 검수」 사람의 눈 표 | 사람 | — |
|
|
50
|
-
| 8 초안 발행·수정 | 초안 링크 | 새 문서 `publish_report` · 고치면 8단계 「수정 절차」 | 같은 링크 · 사람이 고친 초안을 모르고 덮지 않음 |
|
|
51
|
-
| 9 발행 뒤 대조 | 블록 목록 | `get_report(id, outline: true)` | `aside.marg` 수 = 절 수 · 옛 서식 블록 0 · 빈 블록 0 | 사람(블록 목록을 읽음) — 대조 기계 없음 | — |
|
|
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
|
+
| 9 발행 뒤 대조 | 블록 목록 · 고친 판이면 되읽은 JSON(`body_rev` 를 파일 이름에) | `get_report(id, outline: true)` · `get_report(id)` | `aside.marg` 수 = 절 수 · 옛 서식 블록 0 · 빈 블록 0 | 사람(블록 목록을 읽음) — 대조 기계 없음 | — |
|
|
52
58
|
| 9 열람 확인 | 캡처 | 열람 주소를 연다 | 칩·굵게·링크가 원문 글자가 아니라 서식으로 섬 · 도판 쌍·판단 절이 섬 | 사람 눈 — 못 열면 까닭을 핸드오프에 | — |
|
|
53
|
-
| 9a 첨삭 메모 반영 | 반영된 판 · 닫힌 메모 · 까닭을 단 답글 | `list_reports` → `list_notes` →
|
|
54
|
-
| 9b 검토 회신 반영 | 회신마다 「어느 물음의 답인가」 대조 · 반영된 판 · 반영 표시 | **개정 전에** `list_notes(id)`(검토 회신이 본문과 함께 실린다) →
|
|
55
|
-
| 10 공개 직전 날짜 | `
|
|
59
|
+
| 9a 첨삭 메모 반영 | 반영된 판 · 닫힌 메모 · 까닭을 단 답글 | `list_reports` → `list_notes` → 8단계 「수정 절차」 → `resolve_note`·`reply_note`(9a단계) | 미반영 메모 0 — 남은 것은 전부 답글로 까닭이 달림 | 사람이 메모를 닮 · 서버는 미반영 수만 셈(`open_notes`, 우리 팀에게만) | 사람이 「메모 해놨다」고 할 때만 돈다 — 무엇을 고칠지 되묻지 않음 |
|
|
60
|
+
| 9b 검토 회신 반영 | 회신마다 「어느 물음의 답인가」 대조 · 반영된 판 · 반영 표시 | **개정 전에** `list_notes(id)`(검토 회신이 본문과 함께 실린다) → 8단계 「수정 절차」로 반영 → `resolve_note(id, reply, rev)`(9b단계) | 열린 회신 0 — 남은 것은 사람에게 넘긴 까닭이 있음 · 원고에 「회신 없음」이라고 쓴 자리가 회신과 어긋나지 않음 | 서버는 열린 회신 수(`open_replies`)를 목록·되읽기·교체 응답에 싣고, 열린 회신의 문장이 바뀌면 교체 경고로 말함 · 본문 읽기와 대조는 사람·에이전트 | 고객에게 보이는 답글 문안(에이전트는 달지 않는다) |
|
|
61
|
+
| 10 공개 직전 날짜 | 받은 판 JSON 과 `edits.json`(날짜 세 칸) | 8단계 「수정 절차」로 한 번 — 받은 판에서 날짜 세 칸만 고쳐 `body_rev` 를 실어 교체(날짜만 고치는 이 판은 독자 검토·판 갱신 검토 없이 로컬 렌더·dry_run 만) | 작성일 세 자리가 한 값이고 공개하는 날(3c) | `gazette.py` `date_scan()` ⚠(세 자리가 다르면) · 공개하는 날인지는 사람 | 공개일 |
|
|
56
62
|
| 10 공개 | 공개된 링크 | `release_report(id)` | 사용자 승인 | 사람(승인 행위) | **반드시** 공개 승인 |
|
|
57
63
|
|
|
58
64
|
## 렌더러는 레포에 하나뿐이다
|
|
@@ -79,8 +85,8 @@ version: "4.0.0"
|
|
|
79
85
|
> 부록 · 판권지로 서고, 인쇄하면 실제 A4 페이지가 나온다.
|
|
80
86
|
>
|
|
81
87
|
> **가구만 채우면 반려된다.** 셋이 본체다 —
|
|
82
|
-
> ① `sections[].marg`(여백 주석 Why/Key Point/Advice) ② `parts`(PART 층위) ③
|
|
83
|
-
> (
|
|
88
|
+
> ① `sections[].marg`(여백 주석 Why/Key Point/Advice) ② `parts`(PART 층위) ③ **주어별 톤**
|
|
89
|
+
> (요청 자리 밖은 우리·사물이 주어인 개조식, 독자가 할 일은 요청 자리에만 — 요청 자리는 사실 문장까지 하십시오체 — 5·5a).
|
|
84
90
|
> 없어도 발행은 되지만 렌더러가 ⚠ 로 세므로 `dry_run` 경고를 반드시 읽는다.
|
|
85
91
|
>
|
|
86
92
|
> **비트맵은 두 자리에 실린다** — `logo`(표지 고객사 마크)와 `figure`(절 본문 도판).
|
|
@@ -92,23 +98,20 @@ version: "4.0.0"
|
|
|
92
98
|
> 자세한 것은 `references/lim-portal-format.md`. 조판 규칙 원전은 `gazette-report` 스킬.
|
|
93
99
|
|
|
94
100
|
**Lim 발행 규칙** (어겨도 서버가 거부하지만, 알고 시작할 것):
|
|
95
|
-
- **톤은 자리가
|
|
96
|
-
`~함 / ~했음 / ~임`.
|
|
97
|
-
`~하여 주시기 바랍니다 / ~부탁드립니다 /
|
|
98
|
-
경어체 `습니다|십시오|합니다|입니다|됩니다|주세요` 0건은
|
|
101
|
+
- **톤은 주어와 자리가 함께 정한다.** 요청 자리 밖에는 주어가 우리·사물·화면인 문장만 두고 개조식
|
|
102
|
+
`~함 / ~했음 / ~임`. **독자가 할 일은 요청 자리에만 두고, 요청 자리는 사실 문장까지 하십시오체**
|
|
103
|
+
`~하여 주시기 바랍니다 / ~부탁드립니다 / ~하겠습니다` 로 맺는다. 자세한 것은 아래 5·5a.
|
|
104
|
+
경어체 `습니다|십시오|합니다|입니다|됩니다|주세요` 0건은 **요청 자리 밖에만** 거는 기준이다.
|
|
99
105
|
- ⚠ **톤 게이트는 경고이지 거절이 아니다.** `report_tone.php report_tone_warnings()` 가 `dry_run` 경고로 셀 뿐 발행을 막지 않는다.
|
|
100
|
-
서버는
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
그래서 남는 경어체 경고 가운데 PART I 간지의 요청 문장(두 경로)과 로컬의 `cta`·판권지 회신 안내는 **의도된 것이므로 고치지 않는다**.
|
|
104
|
-
이 경고를 하드 규칙으로 오인해 종결을 비튼 것이 **네 번 반복된 반려의 원인**이다(경위: `references/history.md` §5).
|
|
106
|
+
서버는 `open_items` 본문·`cta`·판권지 `note`·`asks` 절 여백 주석과 「」 인용을 안 세고, 로컬 `tone.mjs` 는 요청 자리 가운데 넷(판단 항목 본문·`cta`·요청 PART 의 PART I 간지·판권지 회신 안내)과 「」 인용을 뺀다(2026-09-26 — 읽는 법 요청 한 줄은 센다).
|
|
107
|
+
그래서 남는 경어체 경고 가운데 서버의 PART I 간지 문장(PART I 이 요청·결정 PART 일 때)과 두 경로의 읽는 법 요청 한 줄은 **의도된 것이므로 고치지 않는다** — 경과·원리 PART 의 간지에서 나면 개조식으로 고친다.
|
|
108
|
+
이 경고를 하드 규칙으로 오인해 종결을 비튼 것이 **거듭된 반려의 원인**이다(경위: `references/history.md` §5).
|
|
105
109
|
- `tenant` 는 키가 가리키는 고객사와 일치해야 한다(오발행 방지 가드). 값은 소속처 slug 우선·이름 폴백 — 8단계의 `slug` 는 **보고서** slug 라 다른 것이다.
|
|
106
110
|
- `sections[].kind` 는 `summary|status|cases|asks|note` 다섯 가지뿐 — 그 밖의 값은 절이 통째로 사라지므로 서버가 거절한다.
|
|
107
111
|
- `cases[].grade` 는 `grades` 에 정의된 이름이어야 한다.
|
|
108
112
|
- **`update_report` 는 같은 주소를 덮어쓴다** — 이미 고객에게 나간 링크가 새 내용을 가리키므로, 발행 후 수정은 재발행이 아니라 update 로 한다. 기존 문서는 `list_reports`/`get_report` 로 받아 고쳐 되돌려 보낸다.
|
|
109
|
-
- **그림 계약**: `update_report` 에서 `assets` 를 **빼고** 보내면 서버가 저장된 그림을 그대로
|
|
113
|
+
- **그림 계약**: `update_report` 에서 `assets` 를 **빼고** 보내면 서버가 저장된 그림을 그대로 유지한다 — 캡션·출처 줄·alt 같은 도판 글 칸도 저장값 그대로다. 글 칸을 고쳤으면 `assets` 를 `get_report` 표식째 목록으로 보낸다(서버가 id 로 바이트를 잇고 글 칸은 보낸 값을 쓴다). 전부 지우려면 `assets: []` 를 명시하고 `sections[].plates`·`chapters[].asset` 에서도 그 id 를 빼야 한다 — 가리키는 곳이 없는 id 는 422. 한 장만 바꾸려면 그 id 에 새 `source`/`file`, 나머지는 `get_report` 가 준 표식 그대로.
|
|
110
114
|
- 초안 상태로 올려 두고 다듬어도 발행은 막히지 않는다. 단 초안 `update_report` 도 **본문 판(`body_rev`)** 을 올리고 사용자가 그 판을 읽으므로 **독자 검토를 통과한 본문 판만 올린다** — 다듬는 중간 판은 로컬 렌더·dry_run 으로 본다. 사용자가 「바로 반영」을 지시하면 먼저 올리고 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(2026-09-15 사용자 결정).
|
|
111
|
-
⚠ **운영 반영 확인 전 — 운영 서버는 초안에 `update_report` 를 보내면 그 순간 공개로 바꾼다**(저장된 공개일이 비었으면 오늘로 채운다, 수리는 레포 main 에만 있다). 배포 전까지 초안은 `dry_run` 으로만 다듬고, 굳은 뒤 `publish_report` 한 번 → 사람 확인 → `release_report`. 이미 썼으면 `list_reports` 대괄호가 「데이터로 발행된 문서」인지 보고 `unpublish_report(id)` 로 되돌린다 — 교체 응답 문구(「이미 나간 열람 링크가 그대로…」)는 초안에도 같아 그것만으로는 못 가른다. 결정 브리핑 한 편이 첫 교체로 공개돼 여러 판을 고치는 엿새 동안 열려 있었다(2026-09-09~15).
|
|
112
115
|
**발행 이력 행(`history`)은 다른 것이다** — 공개 전 수정은 이력 행을 만들지 않는다(3c).
|
|
113
116
|
- 내용 설계 규칙(아래 0~3단계, 고객 언어 치환, 카피 게이트)은 **전달 경로와 무관하게 동일하게** 적용된다 — 서버가 렌더한다고 해서 원고 품질 단계를 건너뛰지 않는다.
|
|
114
117
|
|
|
@@ -126,7 +129,7 @@ version: "4.0.0"
|
|
|
126
129
|
|
|
127
130
|
서식은 하나뿐이므로 **뼈대를 바꾸지 않는다.** 바뀌는 것은 PART 를 무엇으로 가르느냐,
|
|
128
131
|
그리고 **그 독자에게 말을 걸 때 어떤 종결로 맺느냐**다(5a) — 독자가 사람이면 요청 자리는
|
|
129
|
-
하십시오체다. 문체를 독자와 무관한 상수로 두었다가 말투 반려를
|
|
132
|
+
하십시오체다. 문체를 독자와 무관한 상수로 두었다가 말투 반려를 여섯 번 받았다(`references/history.md` §5).
|
|
130
133
|
|
|
131
134
|
| 독자의 일 | PART 를 무엇으로 가르나 | 절의 kind |
|
|
132
135
|
|---|---|---|
|
|
@@ -175,20 +178,23 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
175
178
|
(「결정한다」 모드에서는 필수. 답이 「특별히 결정할 것은 없다」면 그 문서는 브리핑이 아니라 보고다.)
|
|
176
179
|
4. **이미 정해진 것은 무엇이고, 누가·어디서 정했는가** — 작업 폴더 `decisions.json`(발행 안 함)에 항 · 내용 · 결정권(고객/FCG) · 정한 주체 ·
|
|
177
180
|
기록(회신 원문·회의록·결정문의 이름과 날짜) · 사용자 확인 여부를 적는다(체크리스트 0a). 미확인 항은 원고에 쓰기 전에 **한 번에** 묻는다. 쓰는 법은 3b 「결정 주체」.
|
|
181
|
+
5. **원고에서 부를 대상마다 독자가 보는 이름은 무엇인가** — 판·환경·인스턴스·설정·요금·문서처럼 우리가 작업하며 부르던 이름마다, 독자가 자기 화면·콘솔·계약서·원본 문서에서 보는 글자를 찾는다.
|
|
182
|
+
작업 폴더 이름 대응표 `names.md`(발행 안 함)에 「우리가 부르던 이름 / 독자 화면·문서의 이름 / 그 이름이 보이는 자리」 세 열로 적고, 자료에서 못 찾은 것만 **한 번에** 묻는다.
|
|
183
|
+
원고의 이름과 0.5단계 용어 잠금 표의 이름 열은 이 표의 둘째 열에서만 가져온다. 둘째 열이 빈 새 개념만 설명형으로 부르고 「원래 이름 없음」이라 적는다(반드시 지키는 것 12).
|
|
178
184
|
|
|
179
185
|
독자가 정해지면 나머지가 전부 따라 정해진다. 같은 사실이 이렇게 갈린다.
|
|
180
186
|
|
|
181
187
|
**두 가지를 동시에 바꾼다** — 내부 용어를 고객 용어로, 그리고 문체를 그 자리에 맞게.
|
|
182
|
-
아래는
|
|
188
|
+
아래는 **주어가 우리·사물인 문장**의 대응표다. 독자가 할 일은 5·5a 를 따른다.
|
|
183
189
|
|
|
184
|
-
| 내부 기록 | 고객 문서(
|
|
190
|
+
| 내부 기록 | 고객 문서(주어가 우리·사물 · 개조식) |
|
|
185
191
|
|---|---|
|
|
186
192
|
| "저장 경로 6곳을 수정" | "저장이 일어나는 모든 경로를 수정**함**" |
|
|
187
193
|
| "2026-08-09 운영 배포 완료" | "2026년 8월 9일 운영 환경에 반영**됨**" |
|
|
188
|
-
| "별도 티켓으로 분리" |
|
|
194
|
+
| "별도 티켓으로 분리" | (그 일을 제 자리의 건으로 세우고 이 문장은 **지움** — 앞 절에서 뒤 절 건 번호를 가리키지 않는다, 0.5단계 7행) |
|
|
189
195
|
| "회귀 테스트 2건 추가" | "같은 문제가 다시 나타나면 걸러지도록 상시 점검 **적용**" |
|
|
190
196
|
| "RN 앱 토큰 부활 경합" | "로그아웃 직후 이전 로그인 상태로 되돌아가던 **상황**" |
|
|
191
|
-
| "인증서를 설치해 주셔야 합니다" | "
|
|
197
|
+
| "인증서를 설치해 주셔야 합니다" | 독자가 할 일이라 개조식으로 옮기지 않는다 — 건에는 사실 "인증서가 없는 기기에서는 접속이 막**힘**", 부탁은 요청 절에 "인증서를 설치하여 주시기 **바랍니다**"(5) |
|
|
192
198
|
| 티켓 번호(16자리 숫자) | (싣지 않는다. 고객이 아는 참조는 본인이 제보한 원본 링크뿐) |
|
|
193
199
|
|
|
194
200
|
문체를 안 바꾸면 관보 문법 위에서 겉돈다 — **낱말이 아니라 조판의 문제**이고, 검수기가 센다.
|
|
@@ -208,12 +214,12 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
208
214
|
|---|---|---|
|
|
209
215
|
| 1 | **한 장 이야기** | 문제 → 원인 → 해법(지금 상태 포함) → 정할 것. 칸 수가 아니라 이야기 순서다 — 요지 칸 수는 4~6단계 「요지」 한 곳이 정본. 다루는 일의 **사건 경과** 표 한 장을 1절에 둔다(이 문서의 판 이력은 `history` — 3c) |
|
|
210
216
|
| 2 | **예시 한 명** | 실존 이용자 하나의 실제 숫자로 문서 전체를 관통시킨다(같은 사람이 그림·표·건에 반복) |
|
|
211
|
-
| 3 | **용어 잠금 표** | 같은 낱말이 두 값을 가리키면 그 자리에서 문서가 죽는다. 뜻이 갈리는 낱말은 표 한 장으로 값·정의·보이는 자리를 박는다. 장치 이름(건 행 `labels` 값)은 절 이름·부제·표 열·캡션에 다시 쓰지 않고, 선택지 기호(A·B·C)는 한 목록에만 붙인다. **이 스킬이 선택지를 부르는 「길」·「바꾸면/그대로 두면」도 장치 이름이다** — 원고에서는 선택지를 그것이 실제로 무엇인지(고객이 부르는 이름)로 부르고, 물건을 비유로 부르지 않는다(반드시 지키는 것 12). 집행자: `gazette.py` `text_scan()` ⚠(건 행 이름 충돌·선택지 기호 충돌·「길」) · 독자 검토 first-time 관점(한 낱말 두 값) · 뜻이 같은지·비유인지는 사람 눈 |
|
|
217
|
+
| 3 | **용어 잠금 표** | 같은 낱말이 두 값을 가리키면 그 자리에서 문서가 죽는다. 뜻이 갈리는 낱말은 표 한 장으로 값·정의·보이는 자리를 박는다. **이름 열은 0단계 이름 대응표(물음 5)의 독자 화면·문서 이름에서만 가져온다** — 표에 정의했다고 작업하며 지은 이름이 독자의 말이 되지는 않는다(경위: `references/history.md` §16). 장치 이름(건 행 `labels` 값)은 절 이름·부제·표 열·캡션에 다시 쓰지 않고, 선택지 기호(A·B·C)는 한 목록에만 붙인다. **이 스킬이 선택지를 부르는 「길」·「바꾸면/그대로 두면」도 장치 이름이다** — 원고에서는 선택지를 그것이 실제로 무엇인지(고객이 부르는 이름)로 부르고, 물건을 비유로 부르지 않는다(반드시 지키는 것 12). 집행자: `gazette.py` `text_scan()` ⚠(건 행 이름 충돌·선택지 기호 충돌·「길」) · 독자 검토 first-time 관점(한 낱말 두 값) · 뜻이 같은지·비유인지는 사람 눈 |
|
|
212
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) |
|
|
213
219
|
| 5 | **판단 요청** | 요청은 **고객이 고를 물음**이다 — 제목은 물음, 본문 첫 문장은 기한과 두 길의 이름, 결과는 한눈표 **한 곳에만** 대칭으로. 모양·선택지 대칭 불변식·화면 도안 절차는 `references/visual-first.md` §5 와 `lim-portal-format.md` §12.3b. 집행자: `gazette.py` `brief_checks()` ⚠(기한·동일값 열) · ⚠ W1(권고 낱말) · 선택지 사이 대칭은 독자 검토 figures 관점 · 도안 유무는 **없음 — 사람의 눈**(`references/process.md` 7단계 표) |
|
|
214
220
|
| 5a | **원본 확인** | 주장·그림마다 원본을 **댈 수 있어야** 한다. 출처 줄은 위치 한 구절(`references/readability.md` R12e — 우리 도안은 비움), 원본 이름·찾을 낱말은 건(`source_url`·`how_to_check`)이나 부록에, 제작 메타는 `origin` 으로(11번). 집행자: 독자 검토 source 관점(누를 수 있는 원본) · facts 관점(앱 동작·내부 수치·결정 주체) · `gazette.py` ⚠ W2 · `text_scan()` 제작 메타 ⚠ — 그 밖은 사람 눈 |
|
|
215
|
-
| 6 | **표기** | 인라인 표기(`**굵게**`·`==강조==`·`{{ok|칩}}`·`[글자](주소)`·**맨 주소**)와 절·PART 의 `tone`, 차트 행 `tone`, 건의 `source_url`, 요약면 `notice.state`. 그림 가리킴은 손으로 번호를 치지 않고 `{{그림:<assets id>}}` 토큰으로(번호·조사를 렌더러가 셈
|
|
216
|
-
| 7 | **독자 검토** | 발행 전 `references/reader-review.workflow.js` — 관점 여덟(상태 표 `args.state` 를 주면 아홉). **Verify 를 통과한 발견만 반영한다 — 검토자 주장도 틀린다.** 반영 순서는 사실 틀림 → 구조(합치기·빼기) → 나머지. **빼기가 포인터를 남기면 안 된다** — 「N절을 보라」「건 §n.n」「부록에 있다」로 대신하면 독자가 장을 오가는 시험지가 된다. 낱말·규칙·예시 선언은 **첫 등장 자리에서 한 구절**, 뒤 절의 번호·표 이름·§ 는 앞 절에서 쓰지 않는다(요약 근거는 `refs[]` 로). 선형 읽기 관점의 **뜀 지점(`jumps`) 0 이
|
|
221
|
+
| 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). 사용자가 「바로 반영」을 지시하면 먼저 내고 이 검토는 곧바로 뒤따라 돌려 다음 판에 반영한다(같은 날 사용자 결정) |
|
|
217
223
|
| 8 | **실물 확인** | 발행할 때마다 체크리스트 9단계 두 행 — 블록 목록 대조와 열람 주소 열기. 집행자: 사람 — 발행 뒤 대조 기계는 아직 없다 |
|
|
218
224
|
|
|
219
225
|
상세와 도판 예산(장당 300KB · 합계 2,400KB), 그림 만드는 법, 반려 사례는 `references/visual-first.md`.
|
|
@@ -222,9 +228,9 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
222
228
|
|
|
223
229
|
### 1·2단계 — 자료 모으기 → `cases.json`
|
|
224
230
|
|
|
225
|
-
건별로 **증상 · 원인 · 조치 · 확인 방법 · 확인 요청** 다섯 칸을 채운다.
|
|
226
|
-
`확인 방법`은 **고객이 자기 화면에서
|
|
227
|
-
`확인 요청`(`remaining`)은 **아직 닫히지 않은 것**만 적는다 —
|
|
231
|
+
건별로 **증상 · 원인 · 조치 · 확인 방법 · 확인 요청** 다섯 칸을 채운다. **다섯 칸의 주어는 우리·사물·화면이다** — 독자가 할 일은 이 칸에 쓰지 않고 요청 절에 둔다(반드시 지키는 것 5).
|
|
232
|
+
`확인 방법`은 **고객이 자기 화면에서 볼 수 있는 결과**다 — 어디를 열면 무엇이 보이는지를 사실로 적는다(「주문서를 저장하면 목록에 새로고침 없이 바로 보임」). 이게 없으면 검수 요청이 아니라 통보다.
|
|
233
|
+
`확인 요청`(`remaining`)은 **아직 닫히지 않은 것**만 적는다 — 무엇이 아직 미확인·미결인지와 운영에 아직 안 나간 우리 작업(`references/content-pipeline.md` §1.1). 독자의 판단이 필요하면 그 사실만 적고(「기준 수치는 미정」) 부탁은 요청 절 항으로 세운다. 없으면 비운다.
|
|
228
234
|
|
|
229
235
|
→ 필드 정의와 작성 규칙: `references/content-pipeline.md`
|
|
230
236
|
|
|
@@ -272,7 +278,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
272
278
|
1. 접수한 것은 어떻게 됐는가
|
|
273
279
|
2. 우리가 추가로 찾은 것 중 중요한 것
|
|
274
280
|
3. 여러 건을 관통하는 공통 원인
|
|
275
|
-
4.
|
|
281
|
+
4. 요청 절에 무엇이 남았는가 — 항 이름과 기한(부탁 문장은 요청 절이 가진다)
|
|
276
282
|
|
|
277
283
|
「결정한다」판은 **4~6문단**이다 — 결정권자가 첫 화면에서 yes/no 를 고를 수 있어야 한다. **순서의 정본은 여기 한 곳이다**(`references/visual-first.md` §1 의 이야기 순서는 검수·보고판의 것).
|
|
278
284
|
아래 넷이 뼈대다. 앞선 결정·화면 규격·실측 같은 **배경 문단**은 1 앞에 올 수 있고, 4(결정 뒤)는 1 문단의 `body` 로 붙일 수 있다.
|
|
@@ -290,7 +296,7 @@ Lim 보고서, Lim 에 올려줘, 고객 보고서, 수정 내역, 검수 요청
|
|
|
290
296
|
|
|
291
297
|
- `marg.why` — 그 절을 **왜** 읽는가. 독자가 실제로 던질 질문 그대로
|
|
292
298
|
- `marg.key` — 이 절에서 하나만 가져간다면 그것
|
|
293
|
-
- `marg.advice` —
|
|
299
|
+
- `marg.advice` — 더 볼 곳. 명사구(「03절 대조표」)나 사물이 주어인 단문(「판정 기준은 부록 1에 있음」) — 「~할 것」「~을 보라」「~ 참조」처럼 독자에게 시키지 않는다
|
|
294
300
|
|
|
295
301
|
**번호는 데이터가 아니라 자리가 정한다.** `sections[].no`·`id` 를 적어도 렌더러가 안 읽고
|
|
296
302
|
배열 순서로 `ch`·앵커를 만든다(`gazette.py Doc.build()`). 찍히는 것은 `label` 하나다.
|
|
@@ -314,13 +320,26 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
|
314
320
|
서버는 「빈 칸」을 안 막는다 — 막는 것은 **조용히 사라지는 것**뿐이고, 관보의 본체가
|
|
315
321
|
빠지면 ⚠ 로 소리 내어 센다. `marg` 가 비었다는 경고를 못 보고 넘기면 두 단이 한 단으로 선다.
|
|
316
322
|
|
|
317
|
-
**기본은 초안이다.** 도구가 `publish` 를 참으로 주지 않는 한 고객에게 안 보인다.
|
|
323
|
+
**기본은 초안이다.** 도구가 `publish` 를 참으로 주지 않는 한 고객에게 안 보인다.
|
|
318
324
|
공개 직전 날짜를 맞춘 뒤(3c) `release_report(id)` 로 연다 — 그것이 사람의 승인 행위다(체크리스트 10단계).
|
|
319
325
|
|
|
320
|
-
**수정 절차** —
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
326
|
+
**수정 절차** — 올라 있는 판에서 출발한다. **같은 링크가 새 내용을 가리킨다.**
|
|
327
|
+
|
|
328
|
+
1. `list_reports` 줄에 「덮음: …」(사람의 편집 초안·사람이 발행한 본문)이 있으면 덮기 전에 묻는다 — 문서 번호를 들었어도 이 목록으로 본다(`get_report` 머리는 사람의 편집 초안을 안 보인다). 받은 판은
|
|
329
|
+
`node assets/mcp-call.mjs --no-mail --json get_report '{"id":<id>,"tenant":"<slug>"}' <파일>` 로 작업 폴더에 받는다 — 파일에는 JSON 한 덩어리만 쓰고 머리·꼬리 줄은 화면에 보인다(`patch.py`·`render.py` 는 머리줄 붙은 파일을 못 읽는다). 파일 이름에 화면에 보인 `body_rev` 를 넣는다 — 그 머리줄 값이 「받은 판」이고, 파일 안 JSON 에는 판이 없다(옛 저장본에 `body_rev` 칸이 메아리로 남은 문서가 있어 되읽기가 떼고 준다). 지난 교체 뒤 되읽어 둔 판이 있어도 다시 받는다 — `body_rev` 는 내용이 같아도 오르니, 그 사이 누가 고쳤는지는 둔 판과 내용으로 견준다.
|
|
330
|
+
2. 고칠 자리를 draft 에 적는다 — `set` 은 `new` 만, `replace` 는 옛 조각·새 조각. `python3 assets/patch.py <1의 파일> draft.json --freeze edits.json` 이 `set` 의 `old` 를 1의 파일에서 채우고, 그 사본에 두 번 돌려 멱등일 때만 `edits.json` 을 쓴다. 새로 받은 판으로 굳히지 않는다.
|
|
331
|
+
3. 새 판은 1의 파일을 복사해 `python3 assets/patch.py <새 판> edits.json` 으로 만든다 — `patch.py` 는 준 파일을 제자리에서 고친다. 새 판 이름에 예상 판번호를 쓰지 않는다(`rev` 번호는 서버에서 받은 판에만).
|
|
332
|
+
4. `python3 assets/render.py <새 판> --text <원고 폴더 밖 빈 폴더>/본문.txt` 로 새 판을 그대로 굽는다(렌더 사본을 따로 짓지 않는다) — 보관 그림은 자리 상자로 서고 그 HTML 은 검토본이다. ⚠0 을 본다. 바꾸거나 더한 그림처럼 `file`·`source` 로 준 장은 로컬에서 「그림 바이트가 없습니다」 ⚠ 로 빠지고 그 캡션도 본문.txt 에서 빠진다 — 그 줄은 빼고 읽는다.
|
|
333
|
+
5. 교체 인자는 새 판으로 만든다. `patch.py` 가 「도판 칸을 고친 편집」을 알리지 않았으면 `assets` 를 뺀다(서버가 저장된 도판을 그대로 잇는다). 알렸으면(캡션·출처 줄·alt 를 고쳤거나 그림을 바꿈) `assets` 를 새 판 그대로 싣는다 —
|
|
334
|
+
표식은 표식째 두면 서버가 id 로 바이트를 잇고 글 칸은 보낸 값을 쓴다. 그림을 바꿀 장은 `set assets[id=…]` 에 객체를 통째로(`file` 포함) 준다(`file` 칸만 `set` 하면 없는 칸이라 멈춘다). 늘 싣지 않는 까닭: 목록으로 보내면 아직 그리는 중인 그림 자리가 처음부터 다시 걸린다.
|
|
335
|
+
→ `update_report(dry_run: true, body_rev: <받은 판>)` — 받은 뒤 본문 판이 바뀌었으면 여기서 409 다(6단계의 409 절차로). 「이 서버는 받은 판 잠금을 모릅니다」 줄이 나오면 교체가 판을 견주지 않는다는 뜻이니 교체 전에 사용자에게 알린다.
|
|
336
|
+
→ 판 갱신 검토(`edition-review.workflow.js` — `edits` 에 `edits.json`, `backup` 에 1의 파일, `file` 에 3의 새 판, `text` 에 4의 본문.txt, `patch` 에 2·3단계에서 쓴 그 `patch.py` 의 절대경로, 수치를 고친 판이면 `canon` 에 정본을 가리키는 한 줄 — 파일과 자리). 구조를 바꾼 판이면 독자 검토다.
|
|
337
|
+
6. 교체는 `update_report` 에 받은 판의 `body_rev` 를 실어 한다(1에서 머리줄에 보이고 파일 이름에 넣은 값 — 시험 실행이 알려 주는 「지금 판」이 아니다) — 받은 뒤 본문 판이 바뀌었으면(다른 교체 · 편집기 발행 · 그림이 앉아 다시 구운 것) 서버가 409 로 멈추고 아무것도 안 쓴다(2026-09-30 받은 판 잠금).
|
|
338
|
+
409 면 새로 받은 판을 1의 파일 자리에 두고(이름에 새 `body_rev`) `edits.json` 을 다시 적용해 3~5 를 다시 돈다(`backup` 도 그 판) — `set`·`replace` 자리는 남이 고쳤으면 멈추지만, 줄 op 는 남의 고침을 못 가린다(`drop_rows`·`remove_row` 는 라벨만 보고 남이 고친 행도 빼고, `append_row`·`insert_row` 는 남이 붙인 행 곁에 또 붙인다). 그래서 다시 적용하기 전에 옛 1의 파일과 새로 받은 판을 diff 해 그 표부터 본다.
|
|
339
|
+
교체되면 출력에 「본문 판 body_rev=N」(새 판)이 찍혔는지 본다 — 없으면 판을 견주지 않고 덮인 것이니(잠금을 모르는 옛 서버이거나, `body_rev` 인자를 모르는 옛 MCP 가 떠 있다) 되읽어 1의 파일과 견준다.
|
|
340
|
+
→ 9단계 두 행 → 되읽은 JSON 을 새 `body_rev` 로 둔다.
|
|
341
|
+
|
|
342
|
+
그림은 서버가 보관한다 — `assets` 를 빼고 보내면 그림도 도판 글 칸(캡션·출처 줄·alt)도 저장된 그대로, `assets: []` 면 삭제(plates 에서도 빼야 422 가 안 난다), 바꿀 장만 새 `source`/`file`(나머지는 표식 그대로).
|
|
324
343
|
|
|
325
344
|
### 9단계 — 발행 뒤 판정: 블록 목록으로 본다
|
|
326
345
|
|
|
@@ -343,12 +362,13 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
|
343
362
|
|
|
344
363
|
| 순서 | 도구 | 할 일 |
|
|
345
364
|
|---|---|---|
|
|
346
|
-
| 1 | `list_reports` | 줄 끝에 `첨삭 메모 N건 미반영` 이 붙은 문서를 찾는다. 문서 번호를
|
|
365
|
+
| 1 | `list_reports` | 줄 끝에 `첨삭 메모 N건 미반영` 이 붙은 문서를 찾는다. 문서 번호를 들었어도 그 줄의 「덮음: …」은 본다(사람의 편집 초안은 이 목록만 알린다) |
|
|
347
366
|
| 2 | `list_notes(id)` | 미반영 메모를 읽는다. `anchor.path`(예 `case:k7m2p9/fix`)가 **고칠 칸**, `anchor.quote_exact` 가 사람이 **본 글**이다. 답글은 사람이 덧붙인 설명이다 |
|
|
348
|
-
| 3 |
|
|
349
|
-
| 4 |
|
|
367
|
+
| 3 | 8단계 「수정 절차」 1~5 | 받은 판을 받아 두고, 메모마다 고칠 칸을 draft 에 적어 `--freeze` 로 굳혀 새 판을 만들고, 로컬 렌더 · dry_run(받은 판의 `body_rev` 를 실어) · 판 갱신 검토까지 돈다 |
|
|
368
|
+
| 4 | 8단계 「수정 절차」 6 | 메모를 모두 반영한 판을 **한 번에** `update_report(body_rev: …)` 로 보낸다. `uid` 는 받은 값 그대로 남는다(`patch.py` 는 고친 칸만 바꾼다) — 흘리면 메모가 자리를 잃는다. 초안은 초안 그대로 남는다 |
|
|
350
369
|
| 5 | `resolve_note(id, note, rev)` | **고친 뒤에만.** 반영이 실린 `body_rev` 를 함께 준다. 먼저 부르면 미반영 목록에서 빠져 다시 안 보인다 |
|
|
351
370
|
| 6 | `reply_note(id, note, body)` | 못 고치거나 다르게 본 메모는 **닫지 말고** 그 메모에 이유를 답글로 단다 |
|
|
371
|
+
| 7 | `remember_case`·`remember_decision`(메모가 반려일 때) | 반려를 팀 기억에 남길 때 「스킬 반영: `references/history.md` §n / 미반영(까닭)」 한 줄을 함께 적는다. 반려가 작업하며 지은 이름을 짚었으면 그 이름과 독자 화면의 원래 이름을 그 반려 결정(`remember_decision`)의 `rejected_names` 칸에 `{name, use}` 로 적는다(흔한 낱말이면 함께 설 낱말을 `near` 에) — 같은 소속처의 발행·모의 발행·로컬 렌더가 그 목록으로 센다. 확인은 `list_rejected_names`. 운영 반영 확인 전(2026-09-26) — 서버 배포 전에는 이 칸이 안 적힌다(응답이 「이 서버는 아직 그 칸을 모른다」고 말한다) |
|
|
352
372
|
|
|
353
373
|
`anchor_state` 가 `unmoored`·`reparented` 면 문서가 바뀌어 자리를 잃은 메모다 — `quote_exact` 로 본문에서 찾아 고치고, 못 찾으면 답글로 묻는다. 끝나면 사람에게 **한 줄로** 알린다: 반영 N건 · 답글로 되물은 N건 · 문서 링크.
|
|
354
374
|
|
|
@@ -360,8 +380,9 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
|
360
380
|
|---|---|---|
|
|
361
381
|
| 1 | `list_notes(id)` | 검토 회신이 **본문과 함께** 실린다. `[회신 N]` 줄의 자리(「판단 항 「…」」·건·절·도판)가 **어느 물음에 대한 말인지**, 그 아래가 누가(고객/우리) 무슨 말을 했는지다. 답글은 뿌리 밑에 붙는다 |
|
|
362
382
|
| 2 | (대조) | 회신마다 원고와 맞춰 본다 — 이미 답이 온 판단 항을 **열린 항으로 다시 묻고 있지 않은가**, 원고가 「회신에 언급이 없어 미결」이라고 쓴 자리가 회신과 어긋나지 않는가, 회신의 낱말과 정본(고객 문서)의 낱말이 갈리면 정본 낱말로 맞췄는가 |
|
|
363
|
-
| 3 | `
|
|
383
|
+
| 3 | 8단계 「수정 절차」 1~6 | 반영한다(받은 판 → draft · `--freeze` → 새 판 → 로컬 렌더 · dry_run(`body_rev` 를 실어) · 판 갱신 검토 → `update_report(body_rev: …)`). 답이 온 판단 항은 닫힌 항 표로 옮기고 출처에 회신 날짜를 적는다. 교체 경고의 「열린 검토 회신 …」 줄은 회신의 본문과 함께 온다 — 그 회신을 이 판이 반영한 것이면 그대로 발행한다 |
|
|
364
384
|
| 4 | `resolve_note(id, reply, rev)` | **반영한 뒤에만.** 표시해도 회신은 고객에게 그대로 보인다. 문서에 반영할 것이 없는 회신(인사·이미 답한 물음)도 읽었으면 표시한다 |
|
|
385
|
+
| 5 | `remember_case`·`remember_decision`(회신이 반려일 때) | 9a단계 7행과 같다 — 팀 기억에 「스킬 반영: `references/history.md` §n / 미반영(까닭)」 한 줄, 작업하며 지은 이름을 짚은 반려면 그 반려 결정의 `rejected_names` 칸에 그 이름과 원래 이름을 적는다 |
|
|
365
386
|
|
|
366
387
|
- **회신대로 고치면 그 회신이 집은 문장은 바뀐다. 그것이 정상이다**(열람 화면의 「원문이 바뀜」). 핀을 「제자리」로 돌리려고 발행 문장을 옛 표기로 되돌리지 않는다 — 실제로 그렇게 해서 렌더러 경고만 얹은 판이 있었다.
|
|
367
388
|
- **고객에게 보이는 답글은 에이전트가 달지 않는다.** 창구에 쓰는 길이 없다. 고객에게 할 말(「N차에 반영했습니다」)은 문안을 사람에게 넘기고, 사람이 포털에서 쓴다. 우리 팀끼리의 고칠 지시는 검토 회신이 아니라 첨삭 메모(9a)다.
|
|
@@ -382,6 +403,8 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
382
403
|
눈은 "보이는 결함"을 잡는다. 실제로 자동 검수를 다 통과한 문서에서 눈으로만 잡힌 것들:
|
|
383
404
|
안 보이는 배지, 빈 목록 항목, 한국어 낱말 중간 줄바꿈.
|
|
384
405
|
|
|
406
|
+
**보관 그림 상자가 있는 HTML 은 전달본이 아니다** — `render.py` 가 「보관 그림 N장」을 말했으면 그 파일은 검토본이다. 전달본은 그림 바이트(`data:`)가 실린 원고로 굽는다.
|
|
407
|
+
|
|
385
408
|
파일 하나를 그대로 보낸다. 상대는 더블클릭만 하면 된다.
|
|
386
409
|
|
|
387
410
|
### 7단계 — 조판 검사: `gazette-report` 스킬의 8종
|
|
@@ -398,13 +421,15 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
398
421
|
|
|
399
422
|
| 파일 | 역할 |
|
|
400
423
|
|---|---|
|
|
401
|
-
| `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지
|
|
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) |
|
|
425
|
+
| `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` 관문을 지나야 도판이 된다 |
|
|
402
427
|
| `assets/subset_font.py` | 폰트 서브셋 생성 (보통 실행 불필요) |
|
|
403
428
|
| `assets/example/report.json` · `cases.json` | 관보 필드를 전부 채운 본보기. 새 문서는 여기서 베낀다 |
|
|
404
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) |
|
|
405
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`) |
|
|
406
|
-
| `references/linear-read-test.workflow.js` | 선형 읽기 **실측** — 처음 읽는 사람 셋 + 결정권자가 앞에서 뒤로 한 번 읽으며 뛰어야 하는 자리를 전부 센다(`args: {file, reader, round}` — 재측정은 `round` 를 바꿔야 캐시를 안 탄다). 뜀 0 이 목표. 독자 검토(`reader-review.workflow.js`)의 linear 관점이 같은 읽기를 하나로 한다 |
|
|
407
|
-
| `references/edition-review.workflow.js` | **판 갱신 검토** — 구조는 그대로이고 낱말·출처 줄·여백 주석만 고친 판의 **변경 자리**(edit-N.py 의 put/sub
|
|
431
|
+
| `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
|
+
| `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) |
|
|
408
433
|
| `assets/example/report-briefing.json` · `cases-briefing.json` | 「결정한다(R&D 브리핑)」 모드 본보기 — 물음 제목 · 두 길 대칭 한눈표 · 선택지 전치 행렬 · FCG 의견 표 한 장 · 바꾸는 길의 위험 · 고른 길별 일정 · `cta` 기본 `[]` |
|
|
409
434
|
| `assets/example/report-briefing-designs.json` · `cases-briefing-designs.json` | 「결정한다」 도안 결재형 본보기 — 세 길 · 전폭 선택지 도판(자리 표시) · 조건표 · 선택지마다 한 행인 의견 표 · 판단 항목 둘(물음 + 「… 확인 요청」) · 확인 프로필 표(`references/lim-portal-format.md` §12.3b) |
|
|
410
435
|
| 폰트 | **레포** `private/builder/fonts/pretendard-gazette.woff2` — 가변 1면 |
|
|
@@ -433,55 +458,42 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
433
458
|
「~ 그대로(변화 없음)」. 독자는 앞 회차·회신·판을 모른다. 정해진 것은 **사실**로 요지(배경)에 적고,
|
|
434
459
|
결정 요청 절에는 **지금 열린 것만** 둔다. 회차의 자리는 `history` 하나. 원고는 직전 판의 차분이 아니라
|
|
435
460
|
**독자의 0 상태에서 다시 쓴다** — 판마다 「처음 읽는 사람이 이 절에서 무엇을 알아야 하나」를 다시 묻는다.
|
|
436
|
-
집행자: `gazette.py` `text_scan()` 과정 어휘 ⚠(`tests/builder.test.py`) ·
|
|
461
|
+
집행자: `gazette.py` `text_scan()` 과정 어휘 ⚠(`tests/builder.test.py`) · 대화 이력 낱말 ⚠(「앞서 합의한」「요청하신 대로」 — 2026-09-26) ·
|
|
437
462
|
`references/readability.md` R11h. 상태 열·「그대로(변화 없음)」는 기계가 못 본다 — 사람의 눈.
|
|
438
463
|
**결정 주체** — 결정권이 고객에게 있는 항은 고객이 정한 기록이 있고 그 항이 원문에서 실제로 닫혀 있을 때만(「정해야 함·차기」로 남아 있지 않을 때) 사실로 배경에 쓴다.
|
|
439
464
|
기록이 없거나 FCG·내부 대화에서 정했으면 사실로 쓰지 않고 결정 물음이나 FCG 의견 절로 둔다. FCG 권한 안의 작업 결정(작업 순서·일정)은 「FCG 작업」으로 사실 서술한다.
|
|
440
465
|
본문에는 결정 출처·날짜를 적지 않는다 — 확인은 결정 장부(0단계 물음 4)에서 한다. 집행자: 사람 눈(0a) · 독자 검토 facts 관점 · 주체 없는 결정 명사(「정한 사항」·「결정된 사항」·「결정임」)는 `text_scan()` 과정 어휘 ⚠.
|
|
441
|
-
3c. **공개 전 수정은 판이 아니다.** `history` 는 공개할 판 한 행(「최초 발행」)이고, `meta` 의 작성 · 판권지 작성 · `history` 마지막 `date` 는 **한 값**이며 공개하는 날로 맞춘다(체크리스트 10단계 — 공개 직전
|
|
466
|
+
3c. **공개 전 수정은 판이 아니다.** `history` 는 공개할 판 한 행(「최초 발행」)이고, `meta` 의 작성 · 판권지 작성 · `history` 마지막 `date` 는 **한 값**이며 공개하는 날로 맞춘다(체크리스트 10단계 — 공개 직전 8단계 「수정 절차」로 한 번).
|
|
442
467
|
공개 뒤 내용이 바뀐 update 에만 `history` 행을 더한다. 문서 밖 결정의 날짜는 본문에 적지 않는다. `cover_date` 는 요약면 「기준」 날짜(수치의 기준일)라 이 셋과 대조하지 않는다.
|
|
443
468
|
집행자: `gazette.py` `date_scan()` ⚠ — 세 자리를 년·월·일로 견줘 다르면 센다(두 경로 · `lim-portal-format.md` §10-1). 공개하는 날인지와 `history` 행 수는 사람(체크리스트 행) · 공개 때 날짜 안내(`release_report`)는 아직 기계가 없다(경위: `references/history.md` §12).
|
|
444
469
|
4. **확인 못 한 범위를 반드시 적는다.** 감추면 다음 보고서까지 못 믿게 된다.
|
|
445
|
-
5.
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
(
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
이름이지 명령이 아니다. 「자격이 필요함」처럼 주어가 사물인 「필요」도 그대로 둔다.
|
|
470
|
-
여기까지 높이면 표지 통계·색인 라벨이 말을 거는 문장이 되어 오히려 어색해진다.
|
|
471
|
-
정본은 genetics 결정문 `decisions/고객-문서-요청-자리는-하십시오체로-맺는다-명사형-종결은-하대로-읽힌다.md`(결정문 보관 소속처) —
|
|
470
|
+
5. **톤은 주어와 자리가 함께 정한다.** 요청 자리 밖에는 주어가 우리·사물·화면인 문장만 쓰고 개조식 `~함 / ~했음 / ~임` 으로 맺는다.
|
|
471
|
+
**독자가 주어인 문장 — 독자가 할 일 — 은 요청 자리에만 두고, 요청 자리는 사실을 말하는 문장까지 모두 하십시오체로 맺는다.** 요청 자리는 요청 절(`cta`·`open_items`)·PART I 간지(PART I 이 요청·결정 PART 일 때)·판권지의 회신 안내,
|
|
472
|
+
그리고 요청 절 항을 부탁하는 읽는 법(`guide`) 한 줄(「시험판 확인은 확인 프로필 표의 네 경우로 부탁드립니다」 꼴)이다(2026-09-15 사용자 결정) — 항을 가리키기만 하는 사실 줄은 요청 자리가 아니다. 그 밖의 칸 — 건의 다섯 칸·요약·절 도입문·여백 주석·문단·표·부록 — 에는
|
|
473
|
+
독자를 주어로 쓰지 않는다. 거기서 독자가 할 일이 생기면 사실만 남기고(「기준 수치는 미정」) 할 일은 요청 절 항으로 옮긴다.
|
|
474
|
+
경어체 `습니다|십시오|합니다|입니다|됩니다|주세요` 0건은 요청 자리 밖에만 거는 기준이다.
|
|
475
|
+
**까닭은 하나다.** 명사형 종결(`-ㅁ/-음`)은 한국어 상대높임 등급 밖이라 청자 높임이 0 이다. 주어가 사물이면 기록체지만, 독자가 주어면
|
|
476
|
+
명령·떠넘김으로 읽힌다 — 반려된 「회신 필요」「주시면 됨」「부탁드림」「~을 보라」「~할 것」「~해야 함」「~몫임」은 모두 이 한 꼴이다(경위: `references/history.md` §5).
|
|
477
|
+
관보 원전(행정안전부·KISA 지침서)은 위에서 아래로 지시하는 문서라 이 꼴이 제 말투다. 우리 독자는 아래가 아니라 결정권자다 — **조판만 가져오고 말투는 가져오지 않는다.**
|
|
478
|
+
이름(제목·표 머리·라벨의 명사구 — 「고객사가 정할 것」「회신이 필요한 것 4가지」)은 문장이 아니고, 물음(여백 주석 Why·PART 물음·판단 항목의 물음 제목)은 독자의 목소리로 묻는 것이라 명령이 아니다 — 둘 다 그대로 둔다.
|
|
479
|
+
사물이 주어여도 판정만 던지는 계사문(「순서는 다른 항목 뒤임」)은 무성의하게 읽힌다 — 우리 행위 동사로 적는다(「다른 항목을 마친 뒤 착수함」).
|
|
480
|
+
5a. **요청 자리의 꼴** — 모든 문장이 종결까지 존댓말이다(사실 문장도 「…나올 수 있습니다」). 다른 칸에서는 맨 오른쪽 열처럼 사실로 적는다.
|
|
481
|
+
|
|
482
|
+
| 독자가 할 일 | 쓰지 않는다 | 요청 자리 | 다른 칸(사실) |
|
|
483
|
+
|---|---|---|---|
|
|
484
|
+
| 제목 | ~해 주셔야 함 · 서술문 제목 · ~하시겠습니까? | 검수·보고는 **~ 요청** + 기한 괄호, 결정은 **물음**(「…할 것인가」 — 기한은 본문 첫 문장, 0.5단계 5행) | — |
|
|
485
|
+
| 확인 | 열어 볼 것 · 보면 됨 · ~인지 확인 · 확인 필요 | 확인해 **주시기 바랍니다** | 확인 방법: 「목록을 열면 1초 안에 뜸」 |
|
|
486
|
+
| 조건 부탁 | 알려 주시면 맞출 예정 · 보시면 확인됨(가장 많이 샌 꼴) | 알려 주시면 **맞추겠습니다** | 확인 요청: 「기준은 대조 결과를 받은 뒤 맞출 예정」 |
|
|
487
|
+
| 회신·결정 | 회신 필요 · 주시면 됨 · 정해야 함 · 부탁드**림** · ~몫임 | 회신 **부탁드립니다** · 정해 주시면 **반영하겠습니다** | 확인 요청: 「기준 수치는 미정」 |
|
|
488
|
+
| 문의 | 업체에 물어야 함 | 업체에 한도를 확인해 **주시기 바랍니다** | 확인 요청: 「그 시스템의 한도는 미확인」 |
|
|
489
|
+
| 참조 | 03절과 함께 읽을 것 · ~을 보라 | — | Advice: 「03절 대조표」 |
|
|
490
|
+
|
|
491
|
+
정본은 genetics 결정문 `decisions/고객-문서-톤은-주어가-정한다-독자가-할-일은-요청-자리에만-기록-칸은-사물화면이-주어.md`(2026-09-26)·
|
|
492
|
+
`decisions/고객-문서-요청-자리는-하십시오체로-맺는다-명사형-종결은-하대로-읽힌다.md`·
|
|
493
|
+
`decisions/고객-문서-보고-칸에는-요청문을-두지-않는다-요청은-요청-절에만.md`(그중 「요청은 요청 절에만」 부분 — 그 결정문의 「부탁드림」 처방과 앞 결정문 「…요청드림-부탁드림으로-맺는다」는 09-11 결정이 뒤집었다. 결정문 보관 소속처).
|
|
472
494
|
이 스킬은 패키지로 덮어써지므로 여기 적은 것은 사본이다.
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
⚠ **보고 칸에 요청문을 두지 마라**(셋째 반려 — 경위: `references/history.md` §5).
|
|
476
|
-
건의 `how_to_check`·`fix`·`remaining`, 절 `paragraphs`, `summary`, 읽는 법(`guide`)은 **보고 자리**다. 보고 칸은 사실과 계획만 —
|
|
477
|
-
「검수 기준. A가 됨. B가 뜸.」「셈법은 01절 ③ 회신에 따라 확정함」. 요청은 `asks` 절의
|
|
478
|
-
`open_items`·`cta` 와 PART I 간지에만 둔다. 계사 「~임」으로 끝나는 판정문
|
|
479
|
-
(「순서는 다른 항목 뒤임」)도 무성의하게 읽힌다 — 우리 행위 동사로 적는다(「다른 항목을 마친 뒤 착수함」).
|
|
480
|
-
출시 전 수정처럼 아직 안 나간 것도 `remaining` 에 적는다(칸의 뜻은 `references/content-pipeline.md` §1.1 한 곳) — 비어 있으면 대조표·일감이 완료로 센다. 집행자: **없음 — 사람 눈**.
|
|
481
|
-
집행자: `report_tone.php report_tone_warnings()`(dry_run) 「보고 칸에 요청문이 N곳 있습니다」 — `how_to_check` 의 **명령형·당위**(「확인 필요」·「주셔야 함」)만 센다. 「부탁드립니다」·「보시면 확인됨」 꼴 요청문과 그 밖의 칸은 **사람 눈** · `tone.mjs` 명령형.
|
|
482
|
-
정본: genetics `decisions/고객-문서-보고-칸에는-요청문을-두지-않는다-요청은-요청-절에만.md`(결정문 보관 소속처).
|
|
483
|
-
이 규칙은 **여전히 유효하다** — 5a 와 짝이다. 5a 가 요청 자리를 하십시오체로 올리는 만큼,
|
|
484
|
-
요청문이 보고 칸으로 새면 관보가 통째로 편지가 된다. **자리를 먼저 가르고, 그 다음 문체다.**
|
|
495
|
+
집행자: `report_tone.php report_tone_warnings()`(dry_run) 「보고 칸에 요청문이 N곳」(`how_to_check` 의 명령형·당위만) · `gazette.py` 「해라체 명령」 ⚠ · `tone.mjs` S1 —
|
|
496
|
+
**독자를 주어로 쓴 개조식 일반은 기계가 못 가른다. 사람 눈.**
|
|
485
497
|
5b. **한글은 마침표에서 줄을 바꾼다.** 문장을 이어 붙인 한글 문단은 개조식으로 고쳐도
|
|
486
498
|
여전히 기계가 쓴 글로 읽힌다. **줄만 바꾸면 부족하다** — 실측(문장 296개)에서 26%가
|
|
487
499
|
글줄 폭을 넘어 접혔고 좁은 단은 54%였다. 접히면 둘째 줄과 다음 문장을 구별할 수 없다.
|
|
@@ -491,7 +503,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
491
503
|
⚠ 라벨-값 양식 행·차례 항목·상태 칩에는 적용하지 않는다 — 산문만이다.
|
|
492
504
|
6. **절마다 여백 주석 세 줄(`marg`)을 채운다.** 그것이 두 단 본문의 본체다.
|
|
493
505
|
다만 **채우려고 넣으면 안 넣느니만 못하다** — 독자가 실제로 던질 질문이어야 한다.
|
|
494
|
-
7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예:
|
|
506
|
+
7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예: 요약·건 「이 버튼을 누르면 고객에게 알림톡이 실제로 나감」, 요청 절 「…실제로 나갑니다」)
|
|
495
507
|
8. **포털이 이미 주는 것을 문서 안에 만들지 않는다.** 검토 회신(댓글)·핵심 요약·진척률 바·상단 바는
|
|
496
508
|
포털 셸이 문서 **둘레**에 놓는다. 문서에 「댓글로 알려 주세요」를 쓰거나 요약 팝업을 흉내 내면
|
|
497
509
|
같은 것이 두 번 있게 된다 — `references/lim-portal-format.md` 9절.
|
|
@@ -502,7 +514,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
502
514
|
`role: figure` · `provider: user-provided` · `origin`(누가 제공했는지 — **비우면 거절된다**)
|
|
503
515
|
으로 두고 `file` 에 로컬 절대경로를 주면
|
|
504
516
|
화질을 계단으로 내려 예산(장당 300,000B) 안에 앉힌다. `sections[].plates` 에 id 를
|
|
505
|
-
적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의
|
|
517
|
+
적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의 종료일」) —
|
|
506
518
|
「…을 보라」 같은 해라체 명령은 어디에도 없다(반드시 지키는 것 12 · 렌더러 ⚠) —
|
|
507
519
|
본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
|
|
508
520
|
다만 `hero`·`chapter`·`eof` 는 자리가 없다. 표지의 빈
|
|
@@ -524,7 +536,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
524
536
|
거절은 그 효과가 대부분 사라진다 — `references/lim-portal-format.md` §12.7b).
|
|
525
537
|
- **주어는 조건**이다. 「[조건]이면 [기준] 때문에 [결과]」. 사람·조직·국가를 제외/미지원의 주어로 세우지 않는다.
|
|
526
538
|
- 부정 하나에 **원인·기준·재검토 시점·선택지** 넷을 붙인다. 넷 중 하나라도 없으면 그 부정은 아직 못 쓴다.
|
|
527
|
-
- 같은 부정을 여러 절에서 되풀이하지 않는다. 한 자리에 한 번,
|
|
539
|
+
- 같은 부정을 여러 절에서 되풀이하지 않는다. 한 자리에 한 번, 뒤 절은 그 자리를 되짚는다(앞 절이 뒤 절을 가리키지 않는다 — 0.5단계 7행) —
|
|
528
540
|
결정권이 고객에게 있는 문서에서 그 자리는 「하지 않기로 한 것」 절이 아니라 선택지 표의 「정할 자리」·「다시 볼 때」 행이다.
|
|
529
541
|
- 나쁜 소식 앞에 **상대가 이미 잘 둔 것 한 문장**. 위로가 아니라 기준점이다 — 그 다음 문장의 기준이 된다.
|
|
530
542
|
- 「해야 합니다」를 쓰지 않는다. **결정권이 고객에게 있는 문서에서는 「하지 않기로 함」「권고함」「기각」도 쓰지 않는다** —
|
|
@@ -544,10 +556,16 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
544
556
|
「사진」(스냅샷)·「단추」(버튼)는 물건을 비유로 부른 것이다 — 둘 다 결정권자에게 뜻이 닿지 않는다.
|
|
545
557
|
같은 버릇을 소설 연구가 잰 적이 있다: 감정을 이름으로 부르지 않고 몸으로만 보여 주는 비율이 사람 글 29 %, AI 글 8 %(StoryScope, arXiv 2604.03136 —
|
|
546
558
|
소설 연구이므로 수치는 유추일 뿐, 규칙의 근거는 2026-09-17 반려다). 결정 문서는 직접 부르는 쪽이 맞다.
|
|
547
|
-
**공급사 용어도 같다** — AWS 의 Extended Support 를 「연장 지원료」로 직역하면 「지원해 주는 돈」으로 읽힌다(같은 날 반려).
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
559
|
+
**공급사 용어도 같다** — AWS 의 Extended Support 를 「연장 지원료」로 직역하면 「지원해 주는 돈」으로 읽힌다(같은 날 반려).
|
|
560
|
+
**독자가 콘솔·화면·계약서에서 그 이름을 보면 원래 이름을 본명으로 쓰고 첫 등장에 괄호로 한 번 풀이한다**(「Extended Support(8.0 연장 지원 요금)」).
|
|
561
|
+
독자가 볼 일이 없는 이름일 때만 설명형으로 부른다 — 콘솔의 원래 설정 이름을 가린 설명형 이름이 반려됐다(2026-09-22).
|
|
562
|
+
**작업하면서 지은 이름은 문서 안에서 정의했어도 쓰지 않는다.** 판·환경·인스턴스·결정 번호에 우리가 붙인 이름(「예비판」「거울」「D1」)은
|
|
563
|
+
독자 화면의 글자, 날짜, 독자 쪽 문서 번호 순으로 고른 이름으로 바꾼다(0단계 물음 5 · 2026-09-21 반려). 렌더러 길이·참조 경고를 피하려고 원래 이름을 바꾸거나 줄이지 않는다 —
|
|
564
|
+
원래 이름은 길이·참조 번호로 세지 않는다(2026-09-26). **이 스킬의 규칙 문장도 원고 말투가 아니다** — 캡션 규칙 「무엇을 보라는 것인지」를 베껴 캡션이 「…을 보라.」가 됐다.
|
|
565
|
+
독자가 주어인 문장은 요청 자리에만 하십시오체로, 나머지는 우리·사물이 주어인 개조식이고, 해라체 명령은 어디에도 없다(5).
|
|
566
|
+
집행자: `gazette.py` `text_scan()` ⚠ 「선택지를 「길」로 부른 곳」·「해라체 명령이 N곳」(두 경로 — 운영 반영 확인 2026-09-17) ·
|
|
567
|
+
「책임 낱말 「탓」」·「대화 이력 낱말」·「소속처가 반려한 이름」(목록은 소속처 반려 결정의 `rejected_names` 칸 — 2026-09-26, 카피 게이트 표) ·
|
|
568
|
+
독자 검토 이름 물음(`names`) · 목록 밖의 비유·조어·직역 일반은 **없음 — 사람의 눈**(경위: `references/history.md` §13·§16·§17).
|
|
551
569
|
13. **우리 쪽 보안·운영 실수와 자격증명 취급 사실을 문서에 적지 않는다 — 구두로 전한다.**
|
|
552
570
|
「비밀번호가 메신저로 오갔음」「키를 메일로 보냈음」은 교체 권고의 근거로 옳아도 고객 문서의 자리가 아니다 —
|
|
553
571
|
박제되고 책임 소재를 글로 남긴다. 권고는 사용자에게 채팅으로만, 문서에는 그 사건의 원인·조치·확인만(`references/content-pipeline.md` 유형 L).
|
|
@@ -568,7 +586,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
568
586
|
| "웹앱 같다" | 목차를 본문 위에 얹음 | 목차는 **옆으로** 뺀다. 좌측 고정 내비 |
|
|
569
587
|
| 낱말이 한가운데서 갈라짐 | `word-break` 기본값 | `word-break:keep-all` (구조 CSS 에 이미 있음) |
|
|
570
588
|
| 인용문이 문장 중간에서 잘림 | 근거를 자동 발췌 | 발췌 인용을 **아예 넣지 않는다.** 조치 본문에 이미 있다 |
|
|
571
|
-
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | **사람이 원고에서 고친다.** ⚠ `text_fix` 는 관보 경로에서 **안 돈다**(`build_gazette` 가 안 부른다 — 실측: 치환 0회). `forbid` 는 로컬
|
|
589
|
+
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | **사람이 원고에서 고친다.** ⚠ `text_fix` 는 관보 경로에서 **안 돈다**(`build_gazette` 가 안 부른다 — 실측: 치환 0회). `forbid` 는 로컬 렌더에서는 걸리면 렌더를 멈추고(`build.py guard()`), 포털 발행에서는 `report_publish.php report_forbid_warnings()` 가 경고로 센다. 개발 식별자는 두 경로 다 `text_scan()` ⚠ 가 센다 |
|
|
572
590
|
| `forbid` 가 멀쩡한 문장을 막는다 | **한국어에는 낱말 경계가 없다** — `머지` 가 「**나**머지 절은」을 잡는다. `\b` 도 전방탐색도 안 듣는다(뒤에 공백이 오니까) | **앞**을 막는다: `(?<!나)머지`. 앞 글자로 갈리는 것이라 후방탐색이 답이다 |
|
|
573
591
|
| 두 단이 한 단으로 선다 | `marg` 를 안 채웠다 | `dry_run` 이 ⚠ 로 세어 준다. **경고를 읽어라** |
|
|
574
592
|
| 발행했는데 옛 서식이 나온다 | 관보 필드를 하나도 안 실었다 | 실측(2026-08-24): v2 최상위 16종 중 **0종**·절 키 11종 중 **0종** 사용. `assets/example/report.json` 을 베껴 시작한다 |
|
|
@@ -581,16 +599,17 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
|
|
|
581
599
|
**"A에서 B로" 전환 공식**은 이 문서에서도 그대로 금지다.
|
|
582
600
|
|
|
583
601
|
**집행자가 없는 규칙은 규칙이 아니다.** 규칙마다 누가 잡는지를 적고, **없으면 없음이라고 적는다**(경위: `references/history.md` §10).
|
|
584
|
-
「두 경로」는 dry_run 과 로컬
|
|
602
|
+
「두 경로」는 dry_run 과 로컬 렌더다. 렌더러 경고 문구 원문·정규식 대상·탈출구는 `lim-portal-format.md` 「10. 경고 조건」·「10-1. 시각 우선 관문」 표 한 곳에만 둔다 — 이 표는 규칙 · 집행자 · 경로만 적는다.
|
|
603
|
+
2026-09-26 부터 과정 어휘·「길」·해라체 경고는 자리를 5곳까지 짚고, 렌더러의 길이·참조 번호 셈은 원래 이름(ASCII 식별자·제품 이름과 그 판 번호)을 빼고 센다(`lim-portal-format.md` §10 · §10-1).
|
|
585
604
|
|
|
586
605
|
| 규칙 | 집행자 | 어느 경로에서 |
|
|
587
606
|
|---|---|---|
|
|
588
607
|
| 대시 `—` 밀도 | `tone.mjs` S2(0.5/천자) | 로컬 렌더 산출물 |
|
|
589
608
|
| 「A에서 B로」 전환 공식 | **없음** — 사람의 눈 검수(`process.md` 7단계 표) | — |
|
|
590
|
-
| 경어체 잔존(
|
|
591
|
-
|
|
|
609
|
+
| 경어체 잔존(요청 자리 밖) · 한 문장 한 줄 | `tone.mjs` S1 · `report_tone.php report_tone_warnings()` — 둘이 빼는 요청 자리는 「Lim 발행 규칙」 톤 줄(5 · 11) | 로컬 렌더 산출물 · dry_run |
|
|
610
|
+
| 독자를 주어로 쓴 문장이 요청 자리 밖에 있음(5) | `report_tone.php report_tone_warnings()` 「보고 칸에 요청문이 N곳」(`how_to_check` 의 명령형·당위만) · `tone.mjs` 명령형 — 그 밖의 칸과 「~할 것」「~몫임」 꼴은 **사람 눈** | dry_run · 로컬 렌더 산출물 |
|
|
592
611
|
| 학생 보고서투 · 완충어 · 근거 없는 총평 · 단독 부정 종결 | `tone.mjs` S1/S2 | 로컬 렌더 산출물 |
|
|
593
|
-
| 금칙 값(고객사·지역·제품명·티켓) | `build.py
|
|
612
|
+
| 금칙 값(고객사·지역·제품명·티켓) | 문서의 `forbid` — 로컬은 `build.py guard()` 가 렌더된 HTML 에 걸리면 멈춤 · 포털은 `report_publish.php report_forbid_warnings()` 가 발행 데이터 글자 칸마다 맞춰 ⚠(자리 5곳까지 · 세지 못한 패턴도 한 줄) | **두 경로 다** — 로컬은 멈춤, 포털은 경고 |
|
|
594
613
|
| 개발 식별자(3 — 대상 목록은 `lim-portal-format.md` §10-1) | `gazette.py` `text_scan()` ⚠ | **두 경로 다** |
|
|
595
614
|
| 자격증명 명사 + 노출 경로·동사 근접 · 우리 실수 서술(13번) | `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 명사 하나(「비밀번호 재설정」)는 안 셈 · 「우리 실수」 일반은 **없음 — 사람 눈** | **두 경로 다** |
|
|
596
615
|
| 판단 항목·확인 요청에 기한 없음 · `asks` 절 없음 · 선택지 표에 근거 등급 없음 · `asks` 절 표의 동일값 열(브리핑) | `gazette.py` `brief_checks()` ⚠ | **두 경로 다** |
|
|
@@ -602,6 +621,8 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
|
|
|
602
621
|
| 도판 출처 줄의 제작 설명·그림 번호 · 출처 줄 길이(0.5단계 5a행) | `gazette.py` `text_scan()` ⚠ — 캡션은 안 봄 | **두 경로 다** |
|
|
603
622
|
| 선택지를 「길」로 부른 곳(스킬 장치 이름의 유출, 12번) | `gazette.py` `text_scan()` ⚠ — 「막대 길이」「길게」는 안 세고 「어느 길이」·열 머리 「길」은 셈. 「사진」「단추」 같은 비유는 **없음 — 사람의 눈** | **두 경로 다** |
|
|
604
623
|
| 해라체 명령(「…을 보라」「…하라」, 12번) | `gazette.py` `text_scan()` ⚠ — 「보라색」「정할 것」은 안 셈. 공급사 용어 직역(「지원료」)은 **없음 — 사람의 눈** | **두 경로 다** |
|
|
624
|
+
| 대화 이력 낱말(「앞서 합의한」「요청하신 대로」 — 3b) · 책임 낱말 「탓」(12번) | `gazette.py` `text_scan()` ⚠ — 과정 어휘와 같은 칸을 칸마다 한 번 센다. 「사전에 협의」「남탓」「탓하다」는 안 셈 | **두 경로 다** |
|
|
625
|
+
| 소속처가 이미 반려한 작업 이름(12번) | `gazette.py` `text_scan()` ⚠ — 목록은 그 소속처 반려 결정들의 `rejected_names` 칸(이름 → 원래 이름, 이름마다 가장 새 결정). 포털은 서버가, 로컬은 `render.py --tenant <slug>` 가 `list_rejected_names` 로 받아 렌더러에 넘긴다. 렌더 없이 부르는 `gazette.py coined_scan()`(이 기계의 발행 직전 훅이 부르는 자리)도 같은 길로 받은 목록으로 같은 경고를 낸다. 목록 밖의 새 이름은 **없음 — 독자 검토 이름 물음(`names`)·사람 눈** | **두 경로 다** — 목록을 못 받으면 `render.py` 는 ⚠ 「반려 이름을 못 받았습니다」, 훅은 경고가 있을 때 「반려 이름 미확인」을 덧붙인다(둘 다 세지 않음) |
|
|
605
626
|
| 건 행 이름(`labels`) 낱말이 다른 절 부제·표 제목·열 머리에 다시 섬 · 선택지 기호 한 글자에 이름 둘(0.5단계 3행) | `gazette.py` `text_scan()` ⚠ · 뜻이 같은지는 사람 눈 | **두 경로 다** |
|
|
606
627
|
| 그림·표 번호 가리킴 — 없는 번호 · 조사 · 서지 못한/서지 않는 칸의 토큰 · `plates` 순서(0.5단계 6행) | `gazette.py` `text_scan()`·`build()` ⚠ — 번호 셈은 `fig_order()` 한 곳 | **두 경로 다** |
|
|
607
628
|
| 괄호 안 부연 · 흐름도 칸 `note` · 도판 캡션 문장 수(readability R11) | `gazette.py` `text_scan()` ⚠ — 한 줄 45자·요약·도입문 문장 수는 사람 눈 | **두 경로 다** |
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"cause": "석 달치 실제 사용량으로 비용을 셈함. 현행 대비 월 운영비가 약 1.4배. 사용량이 두 배로 늘면 격차가 1.6배까지 벌어짐.",
|
|
18
18
|
"fix": "지금 사용량에서의 격차는 1.4배임. 격차가 커지는 급증 구간은 계약의 사용량 상한 조항으로 줄일 수 있음.",
|
|
19
19
|
"how_to_check": "부록 4의 산식에 최신 월 사용량을 넣으면 같은 배수가 나옴.",
|
|
20
|
-
"remaining": "내년 사용량 전망치는 추정임. 분기마다 실측으로
|
|
20
|
+
"remaining": "내년 사용량 전망치는 추정임. 분기마다 실측으로 갱신할 예정."
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"group": "evidence",
|