genetics-mcp 2.22.0 → 2.24.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 +2224 -238
- package/package.json +3 -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 +93 -87
- 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 +109 -0
- package/skills/genetics-report/assets/patch.py +196 -0
- package/skills/genetics-report/assets/render.py +172 -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 +70 -15
- package/skills/genetics-report/references/history.md +76 -2
- package/skills/genetics-report/references/lim-portal-format.md +101 -45
- package/skills/genetics-report/references/linear-read-test.workflow.js +50 -14
- package/skills/genetics-report/references/process.md +47 -43
- package/skills/genetics-report/references/reader-review.workflow.js +105 -28
- package/skills/genetics-report/references/visual-first.md +29 -12
|
@@ -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,16 +41,16 @@ 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 | `gazette.py` `text_scan()`·`brief_checks()`·`tally_scan()` · `build.py guard()` | — |
|
|
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장 미열람」 없음 · 반영 뒤 로컬 렌더·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
56
|
| 8 초안 발행·수정 | 초안 링크 | 새 문서 `publish_report` · 고치면 8단계 「수정 절차」 | 같은 링크 · 사람이 고친 초안을 모르고 덮지 않음 | 사람 — `update_report` 에 `body_rev` 잠금 칸이 아직 없음 | 사람이 고친 초안이면 덮어도 되는가 |
|
|
@@ -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
113
|
- **그림 계약**: `update_report` 에서 `assets` 를 **빼고** 보내면 서버가 저장된 그림을 그대로 유지한다. 전부 지우려면 `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,7 +320,7 @@ 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
326
|
**수정 절차** — `get_report` 머리줄에서 판번호(`body_rev`)와 사람 편집 초안 여부를 본다 → 받은 JSON 을 백업 → 자리마다 지금 값이
|
|
@@ -349,6 +355,7 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
|
349
355
|
| 4 | `update_report(dry_run: true)` → `update_report` | 메모마다 그 칸을 고쳐 **한 번에** 보낸다. `uid` 는 받은 값 그대로 되돌린다 — 흘리면 메모가 자리를 잃는다. 초안은 초안 그대로 남는다 |
|
|
350
356
|
| 5 | `resolve_note(id, note, rev)` | **고친 뒤에만.** 반영이 실린 `body_rev` 를 함께 준다. 먼저 부르면 미반영 목록에서 빠져 다시 안 보인다 |
|
|
351
357
|
| 6 | `reply_note(id, note, body)` | 못 고치거나 다르게 본 메모는 **닫지 말고** 그 메모에 이유를 답글로 단다 |
|
|
358
|
+
| 7 | `remember_case`·`remember_decision`(메모가 반려일 때) | 반려를 팀 기억에 남길 때 「스킬 반영: `references/history.md` §n / 미반영(까닭)」 한 줄을 함께 적는다. 반려가 작업하며 지은 이름을 짚었으면 그 이름과 독자 화면의 원래 이름을 그 반려 결정(`remember_decision`)의 `rejected_names` 칸에 `{name, use}` 로 적는다(흔한 낱말이면 함께 설 낱말을 `near` 에) — 같은 소속처의 발행·모의 발행·로컬 렌더가 그 목록으로 센다. 확인은 `list_rejected_names`. 운영 반영 확인 전(2026-09-26) — 서버 배포 전에는 이 칸이 안 적힌다(응답이 「이 서버는 아직 그 칸을 모른다」고 말한다) |
|
|
352
359
|
|
|
353
360
|
`anchor_state` 가 `unmoored`·`reparented` 면 문서가 바뀌어 자리를 잃은 메모다 — `quote_exact` 로 본문에서 찾아 고치고, 못 찾으면 답글로 묻는다. 끝나면 사람에게 **한 줄로** 알린다: 반영 N건 · 답글로 되물은 N건 · 문서 링크.
|
|
354
361
|
|
|
@@ -362,6 +369,7 @@ report.json + cases.json 을 하나로 합쳐 `publish_report` 에 준다
|
|
|
362
369
|
| 2 | (대조) | 회신마다 원고와 맞춰 본다 — 이미 답이 온 판단 항을 **열린 항으로 다시 묻고 있지 않은가**, 원고가 「회신에 언급이 없어 미결」이라고 쓴 자리가 회신과 어긋나지 않는가, 회신의 낱말과 정본(고객 문서)의 낱말이 갈리면 정본 낱말로 맞췄는가 |
|
|
363
370
|
| 3 | `update_report(dry_run: true)` → `update_report` | 반영한다. 답이 온 판단 항은 닫힌 항 표로 옮기고 출처에 회신 날짜를 적는다. 교체 경고의 「열린 검토 회신 …」 줄은 회신의 본문과 함께 온다 — 그 회신을 이 판이 반영한 것이면 그대로 발행한다 |
|
|
364
371
|
| 4 | `resolve_note(id, reply, rev)` | **반영한 뒤에만.** 표시해도 회신은 고객에게 그대로 보인다. 문서에 반영할 것이 없는 회신(인사·이미 답한 물음)도 읽었으면 표시한다 |
|
|
372
|
+
| 5 | `remember_case`·`remember_decision`(회신이 반려일 때) | 9a단계 7행과 같다 — 팀 기억에 「스킬 반영: `references/history.md` §n / 미반영(까닭)」 한 줄, 작업하며 지은 이름을 짚은 반려면 그 반려 결정의 `rejected_names` 칸에 그 이름과 원래 이름을 적는다 |
|
|
365
373
|
|
|
366
374
|
- **회신대로 고치면 그 회신이 집은 문장은 바뀐다. 그것이 정상이다**(열람 화면의 「원문이 바뀜」). 핀을 「제자리」로 돌리려고 발행 문장을 옛 표기로 되돌리지 않는다 — 실제로 그렇게 해서 렌더러 경고만 얹은 판이 있었다.
|
|
367
375
|
- **고객에게 보이는 답글은 에이전트가 달지 않는다.** 창구에 쓰는 길이 없다. 고객에게 할 말(「N차에 반영했습니다」)은 문안을 사람에게 넘기고, 사람이 포털에서 쓴다. 우리 팀끼리의 고칠 지시는 검토 회신이 아니라 첨삭 메모(9a)다.
|
|
@@ -398,13 +406,15 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
398
406
|
|
|
399
407
|
| 파일 | 역할 |
|
|
400
408
|
|---|---|
|
|
401
|
-
| `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지
|
|
409
|
+
| `assets/render.py` | `report.json` → 단일 HTML. **서버 등록부에서 서식을 읽어** 레포 `private/builder/build.py` 를 부른다 — 여기 사본을 두지 마라. `--text <출력.txt>` 는 렌더가 성공한 뒤 화면에 보이는 글만 화면 순서대로 텍스트로 뽑는다(그림 자리 「[그림]」 · 표 칸 「 \| 」 · `origin`·alt·스크립트 없음) — 독자 검토의 입력이고, 원고 폴더 안에 쓰면 ⚠ 가 뜬다. `--tenant <slug>`(없으면 원고의 `tenant`)는 그 소속처가 반려한 이름을 옆 `mcp-call.mjs` 로 MCP `list_rejected_names` 를 불러 받아 함께 센다 — 못 받으면 ⚠ 한 줄을 내고 반려 이름만 빼고 굽는다(`references/lim-portal-format.md` §10-1) |
|
|
410
|
+
| `assets/patch.py` | 원고 **부분 고치기(멱등)** — `python3 assets/patch.py report.json edits.json`. 회차마다 고치는 파이썬을 새로 짓지 말고 **데이터(edits.json)만** 남긴다. op 다섯: `set`·`replace`·`drop_rows`·`append_row`·`forbid`. 두 번 돌려 「바꿈 0」이 계약이고, 값이 `old` 도 `new` 도 아니면 **멈춘다**(그 사이 누가 고쳤다는 뜻). 회차 스크립트가 쌓여 고객사 문서 폴더가 플랫폼이 되던 것을 멈추려고 들였다(2026-09-22 — 한 폴더 2,563줄·다른 폴더 4,285줄 실측) |
|
|
411
|
+
| `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
412
|
| `assets/subset_font.py` | 폰트 서브셋 생성 (보통 실행 불필요) |
|
|
403
413
|
| `assets/example/report.json` · `cases.json` | 관보 필드를 전부 채운 본보기. 새 문서는 여기서 베낀다 |
|
|
404
414
|
| `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
415
|
| `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 호출)
|
|
416
|
+
| `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 관점이 같은 읽기를 하나로 한다 |
|
|
417
|
+
| `references/edition-review.workflow.js` | **판 갱신 검토** — 구조는 그대로이고 낱말·출처 줄·여백 주석만 고친 판의 **변경 자리**(edit-N.py 의 put/sub 호출)를 규칙 대조·사실 대조로, 새 판 렌더본 전체를 선형 독자로 읽고 심각도 3 이상은 진단과 처방을 따로 반박한다(`args: {file, backup, edit_script, doc, text}` — 결과 `kept`(진단이 거짓 아님, 처방이 규칙에 걸리면 `rx`)·`refuted`(진단 거짓)·`weak`·`unverified`(상한 밖·검증 실패), 실패가 있으면 `head` 「검토 미완」). 사실 관점이 백업↔새 판 JSON diff 에 스크립트가 바꾼 자리가 빠짐없이 있는지(삽입·삭제가 섞이면 줄 수가 아니라 자리로)·수치 무변경을 검산한다. 구조가 바뀐 판은 `reader-review.workflow.js`. 낱말 손질 판을 검토 없이 발행하자 다음 판 8자리 손질이 생겼다(2026-09-15) |
|
|
408
418
|
| `assets/example/report-briefing.json` · `cases-briefing.json` | 「결정한다(R&D 브리핑)」 모드 본보기 — 물음 제목 · 두 길 대칭 한눈표 · 선택지 전치 행렬 · FCG 의견 표 한 장 · 바꾸는 길의 위험 · 고른 길별 일정 · `cta` 기본 `[]` |
|
|
409
419
|
| `assets/example/report-briefing-designs.json` · `cases-briefing-designs.json` | 「결정한다」 도안 결재형 본보기 — 세 길 · 전폭 선택지 도판(자리 표시) · 조건표 · 선택지마다 한 행인 의견 표 · 판단 항목 둘(물음 + 「… 확인 요청」) · 확인 프로필 표(`references/lim-portal-format.md` §12.3b) |
|
|
410
420
|
| 폰트 | **레포** `private/builder/fonts/pretendard-gazette.woff2` — 가변 1면 |
|
|
@@ -433,7 +443,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
433
443
|
「~ 그대로(변화 없음)」. 독자는 앞 회차·회신·판을 모른다. 정해진 것은 **사실**로 요지(배경)에 적고,
|
|
434
444
|
결정 요청 절에는 **지금 열린 것만** 둔다. 회차의 자리는 `history` 하나. 원고는 직전 판의 차분이 아니라
|
|
435
445
|
**독자의 0 상태에서 다시 쓴다** — 판마다 「처음 읽는 사람이 이 절에서 무엇을 알아야 하나」를 다시 묻는다.
|
|
436
|
-
집행자: `gazette.py` `text_scan()` 과정 어휘 ⚠(`tests/builder.test.py`) ·
|
|
446
|
+
집행자: `gazette.py` `text_scan()` 과정 어휘 ⚠(`tests/builder.test.py`) · 대화 이력 낱말 ⚠(「앞서 합의한」「요청하신 대로」 — 2026-09-26) ·
|
|
437
447
|
`references/readability.md` R11h. 상태 열·「그대로(변화 없음)」는 기계가 못 본다 — 사람의 눈.
|
|
438
448
|
**결정 주체** — 결정권이 고객에게 있는 항은 고객이 정한 기록이 있고 그 항이 원문에서 실제로 닫혀 있을 때만(「정해야 함·차기」로 남아 있지 않을 때) 사실로 배경에 쓴다.
|
|
439
449
|
기록이 없거나 FCG·내부 대화에서 정했으면 사실로 쓰지 않고 결정 물음이나 FCG 의견 절로 둔다. FCG 권한 안의 작업 결정(작업 순서·일정)은 「FCG 작업」으로 사실 서술한다.
|
|
@@ -442,46 +452,33 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
442
452
|
공개 뒤 내용이 바뀐 update 에만 `history` 행을 더한다. 문서 밖 결정의 날짜는 본문에 적지 않는다. `cover_date` 는 요약면 「기준」 날짜(수치의 기준일)라 이 셋과 대조하지 않는다.
|
|
443
453
|
집행자: `gazette.py` `date_scan()` ⚠ — 세 자리를 년·월·일로 견줘 다르면 센다(두 경로 · `lim-portal-format.md` §10-1). 공개하는 날인지와 `history` 행 수는 사람(체크리스트 행) · 공개 때 날짜 안내(`release_report`)는 아직 기계가 없다(경위: `references/history.md` §12).
|
|
444
454
|
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`(결정문 보관 소속처) —
|
|
455
|
+
5. **톤은 주어와 자리가 함께 정한다.** 요청 자리 밖에는 주어가 우리·사물·화면인 문장만 쓰고 개조식 `~함 / ~했음 / ~임` 으로 맺는다.
|
|
456
|
+
**독자가 주어인 문장 — 독자가 할 일 — 은 요청 자리에만 두고, 요청 자리는 사실을 말하는 문장까지 모두 하십시오체로 맺는다.** 요청 자리는 요청 절(`cta`·`open_items`)·PART I 간지(PART I 이 요청·결정 PART 일 때)·판권지의 회신 안내,
|
|
457
|
+
그리고 요청 절 항을 부탁하는 읽는 법(`guide`) 한 줄(「시험판 확인은 확인 프로필 표의 네 경우로 부탁드립니다」 꼴)이다(2026-09-15 사용자 결정) — 항을 가리키기만 하는 사실 줄은 요청 자리가 아니다. 그 밖의 칸 — 건의 다섯 칸·요약·절 도입문·여백 주석·문단·표·부록 — 에는
|
|
458
|
+
독자를 주어로 쓰지 않는다. 거기서 독자가 할 일이 생기면 사실만 남기고(「기준 수치는 미정」) 할 일은 요청 절 항으로 옮긴다.
|
|
459
|
+
경어체 `습니다|십시오|합니다|입니다|됩니다|주세요` 0건은 요청 자리 밖에만 거는 기준이다.
|
|
460
|
+
**까닭은 하나다.** 명사형 종결(`-ㅁ/-음`)은 한국어 상대높임 등급 밖이라 청자 높임이 0 이다. 주어가 사물이면 기록체지만, 독자가 주어면
|
|
461
|
+
명령·떠넘김으로 읽힌다 — 반려된 「회신 필요」「주시면 됨」「부탁드림」「~을 보라」「~할 것」「~해야 함」「~몫임」은 모두 이 한 꼴이다(경위: `references/history.md` §5).
|
|
462
|
+
관보 원전(행정안전부·KISA 지침서)은 위에서 아래로 지시하는 문서라 이 꼴이 제 말투다. 우리 독자는 아래가 아니라 결정권자다 — **조판만 가져오고 말투는 가져오지 않는다.**
|
|
463
|
+
이름(제목·표 머리·라벨의 명사구 — 「고객사가 정할 것」「회신이 필요한 것 4가지」)은 문장이 아니고, 물음(여백 주석 Why·PART 물음·판단 항목의 물음 제목)은 독자의 목소리로 묻는 것이라 명령이 아니다 — 둘 다 그대로 둔다.
|
|
464
|
+
사물이 주어여도 판정만 던지는 계사문(「순서는 다른 항목 뒤임」)은 무성의하게 읽힌다 — 우리 행위 동사로 적는다(「다른 항목을 마친 뒤 착수함」).
|
|
465
|
+
5a. **요청 자리의 꼴** — 모든 문장이 종결까지 존댓말이다(사실 문장도 「…나올 수 있습니다」). 다른 칸에서는 맨 오른쪽 열처럼 사실로 적는다.
|
|
466
|
+
|
|
467
|
+
| 독자가 할 일 | 쓰지 않는다 | 요청 자리 | 다른 칸(사실) |
|
|
468
|
+
|---|---|---|---|
|
|
469
|
+
| 제목 | ~해 주셔야 함 · 서술문 제목 · ~하시겠습니까? | 검수·보고는 **~ 요청** + 기한 괄호, 결정은 **물음**(「…할 것인가」 — 기한은 본문 첫 문장, 0.5단계 5행) | — |
|
|
470
|
+
| 확인 | 열어 볼 것 · 보면 됨 · ~인지 확인 · 확인 필요 | 확인해 **주시기 바랍니다** | 확인 방법: 「목록을 열면 1초 안에 뜸」 |
|
|
471
|
+
| 조건 부탁 | 알려 주시면 맞출 예정 · 보시면 확인됨(가장 많이 샌 꼴) | 알려 주시면 **맞추겠습니다** | 확인 요청: 「기준은 대조 결과를 받은 뒤 맞출 예정」 |
|
|
472
|
+
| 회신·결정 | 회신 필요 · 주시면 됨 · 정해야 함 · 부탁드**림** · ~몫임 | 회신 **부탁드립니다** · 정해 주시면 **반영하겠습니다** | 확인 요청: 「기준 수치는 미정」 |
|
|
473
|
+
| 문의 | 업체에 물어야 함 | 업체에 한도를 확인해 **주시기 바랍니다** | 확인 요청: 「그 시스템의 한도는 미확인」 |
|
|
474
|
+
| 참조 | 03절과 함께 읽을 것 · ~을 보라 | — | Advice: 「03절 대조표」 |
|
|
475
|
+
|
|
476
|
+
정본은 genetics 결정문 `decisions/고객-문서-톤은-주어가-정한다-독자가-할-일은-요청-자리에만-기록-칸은-사물화면이-주어.md`(2026-09-26)·
|
|
477
|
+
`decisions/고객-문서-요청-자리는-하십시오체로-맺는다-명사형-종결은-하대로-읽힌다.md`·
|
|
478
|
+
`decisions/고객-문서-보고-칸에는-요청문을-두지-않는다-요청은-요청-절에만.md`(그중 「요청은 요청 절에만」 부분 — 그 결정문의 「부탁드림」 처방과 앞 결정문 「…요청드림-부탁드림으로-맺는다」는 09-11 결정이 뒤집었다. 결정문 보관 소속처).
|
|
472
479
|
이 스킬은 패키지로 덮어써지므로 여기 적은 것은 사본이다.
|
|
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
|
-
요청문이 보고 칸으로 새면 관보가 통째로 편지가 된다. **자리를 먼저 가르고, 그 다음 문체다.**
|
|
480
|
+
집행자: `report_tone.php report_tone_warnings()`(dry_run) 「보고 칸에 요청문이 N곳」(`how_to_check` 의 명령형·당위만) · `gazette.py` 「해라체 명령」 ⚠ · `tone.mjs` S1 —
|
|
481
|
+
**독자를 주어로 쓴 개조식 일반은 기계가 못 가른다. 사람 눈.**
|
|
485
482
|
5b. **한글은 마침표에서 줄을 바꾼다.** 문장을 이어 붙인 한글 문단은 개조식으로 고쳐도
|
|
486
483
|
여전히 기계가 쓴 글로 읽힌다. **줄만 바꾸면 부족하다** — 실측(문장 296개)에서 26%가
|
|
487
484
|
글줄 폭을 넘어 접혔고 좁은 단은 54%였다. 접히면 둘째 줄과 다음 문장을 구별할 수 없다.
|
|
@@ -491,7 +488,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
491
488
|
⚠ 라벨-값 양식 행·차례 항목·상태 칩에는 적용하지 않는다 — 산문만이다.
|
|
492
489
|
6. **절마다 여백 주석 세 줄(`marg`)을 채운다.** 그것이 두 단 본문의 본체다.
|
|
493
490
|
다만 **채우려고 넣으면 안 넣느니만 못하다** — 독자가 실제로 던질 질문이어야 한다.
|
|
494
|
-
7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예:
|
|
491
|
+
7. **파괴적 버튼을 안내할 때는 결과를 같이 적는다.** (예: 요약·건 「이 버튼을 누르면 고객에게 알림톡이 실제로 나감」, 요청 절 「…실제로 나갑니다」)
|
|
495
492
|
8. **포털이 이미 주는 것을 문서 안에 만들지 않는다.** 검토 회신(댓글)·핵심 요약·진척률 바·상단 바는
|
|
496
493
|
포털 셸이 문서 **둘레**에 놓는다. 문서에 「댓글로 알려 주세요」를 쓰거나 요약 팝업을 흉내 내면
|
|
497
494
|
같은 것이 두 번 있게 된다 — `references/lim-portal-format.md` 9절.
|
|
@@ -502,7 +499,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
502
499
|
`role: figure` · `provider: user-provided` · `origin`(누가 제공했는지 — **비우면 거절된다**)
|
|
503
500
|
으로 두고 `file` 에 로컬 절대경로를 주면
|
|
504
501
|
화질을 계단으로 내려 예산(장당 300,000B) 안에 앉힌다. `sections[].plates` 에 id 를
|
|
505
|
-
적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의
|
|
502
|
+
적어야 자리가 선다. 캡션은 **이 화면에서 독자가 볼 자리**를 명사형으로 적는다(「8.0 행의 두 날짜와 8.4 행의 종료일」) —
|
|
506
503
|
「…을 보라」 같은 해라체 명령은 어디에도 없다(반드시 지키는 것 12 · 렌더러 ⚠) —
|
|
507
504
|
본문이 이미 말한 것을 되풀이하면 도판이 장식이 된다.
|
|
508
505
|
다만 `hero`·`chapter`·`eof` 는 자리가 없다. 표지의 빈
|
|
@@ -524,7 +521,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
524
521
|
거절은 그 효과가 대부분 사라진다 — `references/lim-portal-format.md` §12.7b).
|
|
525
522
|
- **주어는 조건**이다. 「[조건]이면 [기준] 때문에 [결과]」. 사람·조직·국가를 제외/미지원의 주어로 세우지 않는다.
|
|
526
523
|
- 부정 하나에 **원인·기준·재검토 시점·선택지** 넷을 붙인다. 넷 중 하나라도 없으면 그 부정은 아직 못 쓴다.
|
|
527
|
-
- 같은 부정을 여러 절에서 되풀이하지 않는다. 한 자리에 한 번,
|
|
524
|
+
- 같은 부정을 여러 절에서 되풀이하지 않는다. 한 자리에 한 번, 뒤 절은 그 자리를 되짚는다(앞 절이 뒤 절을 가리키지 않는다 — 0.5단계 7행) —
|
|
528
525
|
결정권이 고객에게 있는 문서에서 그 자리는 「하지 않기로 한 것」 절이 아니라 선택지 표의 「정할 자리」·「다시 볼 때」 행이다.
|
|
529
526
|
- 나쁜 소식 앞에 **상대가 이미 잘 둔 것 한 문장**. 위로가 아니라 기준점이다 — 그 다음 문장의 기준이 된다.
|
|
530
527
|
- 「해야 합니다」를 쓰지 않는다. **결정권이 고객에게 있는 문서에서는 「하지 않기로 함」「권고함」「기각」도 쓰지 않는다** —
|
|
@@ -544,10 +541,16 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
544
541
|
「사진」(스냅샷)·「단추」(버튼)는 물건을 비유로 부른 것이다 — 둘 다 결정권자에게 뜻이 닿지 않는다.
|
|
545
542
|
같은 버릇을 소설 연구가 잰 적이 있다: 감정을 이름으로 부르지 않고 몸으로만 보여 주는 비율이 사람 글 29 %, AI 글 8 %(StoryScope, arXiv 2604.03136 —
|
|
546
543
|
소설 연구이므로 수치는 유추일 뿐, 규칙의 근거는 2026-09-17 반려다). 결정 문서는 직접 부르는 쪽이 맞다.
|
|
547
|
-
**공급사 용어도 같다** — AWS 의 Extended Support 를 「연장 지원료」로 직역하면 「지원해 주는 돈」으로 읽힌다(같은 날 반려).
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
544
|
+
**공급사 용어도 같다** — AWS 의 Extended Support 를 「연장 지원료」로 직역하면 「지원해 주는 돈」으로 읽힌다(같은 날 반려).
|
|
545
|
+
**독자가 콘솔·화면·계약서에서 그 이름을 보면 원래 이름을 본명으로 쓰고 첫 등장에 괄호로 한 번 풀이한다**(「Extended Support(8.0 연장 지원 요금)」).
|
|
546
|
+
독자가 볼 일이 없는 이름일 때만 설명형으로 부른다 — 콘솔의 원래 설정 이름을 가린 설명형 이름이 반려됐다(2026-09-22).
|
|
547
|
+
**작업하면서 지은 이름은 문서 안에서 정의했어도 쓰지 않는다.** 판·환경·인스턴스·결정 번호에 우리가 붙인 이름(「예비판」「거울」「D1」)은
|
|
548
|
+
독자 화면의 글자, 날짜, 독자 쪽 문서 번호 순으로 고른 이름으로 바꾼다(0단계 물음 5 · 2026-09-21 반려). 렌더러 길이·참조 경고를 피하려고 원래 이름을 바꾸거나 줄이지 않는다 —
|
|
549
|
+
원래 이름은 길이·참조 번호로 세지 않는다(2026-09-26). **이 스킬의 규칙 문장도 원고 말투가 아니다** — 캡션 규칙 「무엇을 보라는 것인지」를 베껴 캡션이 「…을 보라.」가 됐다.
|
|
550
|
+
독자가 주어인 문장은 요청 자리에만 하십시오체로, 나머지는 우리·사물이 주어인 개조식이고, 해라체 명령은 어디에도 없다(5).
|
|
551
|
+
집행자: `gazette.py` `text_scan()` ⚠ 「선택지를 「길」로 부른 곳」·「해라체 명령이 N곳」(두 경로 — 운영 반영 확인 2026-09-17) ·
|
|
552
|
+
「책임 낱말 「탓」」·「대화 이력 낱말」·「소속처가 반려한 이름」(목록은 소속처 반려 결정의 `rejected_names` 칸 — 2026-09-26, 카피 게이트 표) ·
|
|
553
|
+
독자 검토 이름 물음(`names`) · 목록 밖의 비유·조어·직역 일반은 **없음 — 사람의 눈**(경위: `references/history.md` §13·§16·§17).
|
|
551
554
|
13. **우리 쪽 보안·운영 실수와 자격증명 취급 사실을 문서에 적지 않는다 — 구두로 전한다.**
|
|
552
555
|
「비밀번호가 메신저로 오갔음」「키를 메일로 보냈음」은 교체 권고의 근거로 옳아도 고객 문서의 자리가 아니다 —
|
|
553
556
|
박제되고 책임 소재를 글로 남긴다. 권고는 사용자에게 채팅으로만, 문서에는 그 사건의 원인·조치·확인만(`references/content-pipeline.md` 유형 L).
|
|
@@ -568,7 +571,7 @@ render·css·폰트를 함께 얹는다. 직접 부르면 옛 서식 시트가
|
|
|
568
571
|
| "웹앱 같다" | 목차를 본문 위에 얹음 | 목차는 **옆으로** 뺀다. 좌측 고정 내비 |
|
|
569
572
|
| 낱말이 한가운데서 갈라짐 | `word-break` 기본값 | `word-break:keep-all` (구조 CSS 에 이미 있음) |
|
|
570
573
|
| 인용문이 문장 중간에서 잘림 | 근거를 자동 발췌 | 발췌 인용을 **아예 넣지 않는다.** 조치 본문에 이미 있다 |
|
|
571
|
-
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | **사람이 원고에서 고친다.** ⚠ `text_fix` 는 관보 경로에서 **안 돈다**(`build_gazette` 가 안 부른다 — 실측: 치환 0회). `forbid` 는 로컬
|
|
574
|
+
| 개발 서술이 새어 들어감 | 원고를 그대로 씀 | **사람이 원고에서 고친다.** ⚠ `text_fix` 는 관보 경로에서 **안 돈다**(`build_gazette` 가 안 부른다 — 실측: 치환 0회). `forbid` 는 로컬 렌더에서는 걸리면 렌더를 멈추고(`build.py guard()`), 포털 발행에서는 `report_publish.php report_forbid_warnings()` 가 경고로 센다. 개발 식별자는 두 경로 다 `text_scan()` ⚠ 가 센다 |
|
|
572
575
|
| `forbid` 가 멀쩡한 문장을 막는다 | **한국어에는 낱말 경계가 없다** — `머지` 가 「**나**머지 절은」을 잡는다. `\b` 도 전방탐색도 안 듣는다(뒤에 공백이 오니까) | **앞**을 막는다: `(?<!나)머지`. 앞 글자로 갈리는 것이라 후방탐색이 답이다 |
|
|
573
576
|
| 두 단이 한 단으로 선다 | `marg` 를 안 채웠다 | `dry_run` 이 ⚠ 로 세어 준다. **경고를 읽어라** |
|
|
574
577
|
| 발행했는데 옛 서식이 나온다 | 관보 필드를 하나도 안 실었다 | 실측(2026-08-24): v2 최상위 16종 중 **0종**·절 키 11종 중 **0종** 사용. `assets/example/report.json` 을 베껴 시작한다 |
|
|
@@ -581,16 +584,17 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
|
|
|
581
584
|
**"A에서 B로" 전환 공식**은 이 문서에서도 그대로 금지다.
|
|
582
585
|
|
|
583
586
|
**집행자가 없는 규칙은 규칙이 아니다.** 규칙마다 누가 잡는지를 적고, **없으면 없음이라고 적는다**(경위: `references/history.md` §10).
|
|
584
|
-
「두 경로」는 dry_run 과 로컬
|
|
587
|
+
「두 경로」는 dry_run 과 로컬 렌더다. 렌더러 경고 문구 원문·정규식 대상·탈출구는 `lim-portal-format.md` 「10. 경고 조건」·「10-1. 시각 우선 관문」 표 한 곳에만 둔다 — 이 표는 규칙 · 집행자 · 경로만 적는다.
|
|
588
|
+
2026-09-26 부터 과정 어휘·「길」·해라체 경고는 자리를 5곳까지 짚고, 렌더러의 길이·참조 번호 셈은 원래 이름(ASCII 식별자·제품 이름과 그 판 번호)을 빼고 센다(`lim-portal-format.md` §10 · §10-1).
|
|
585
589
|
|
|
586
590
|
| 규칙 | 집행자 | 어느 경로에서 |
|
|
587
591
|
|---|---|---|
|
|
588
592
|
| 대시 `—` 밀도 | `tone.mjs` S2(0.5/천자) | 로컬 렌더 산출물 |
|
|
589
593
|
| 「A에서 B로」 전환 공식 | **없음** — 사람의 눈 검수(`process.md` 7단계 표) | — |
|
|
590
|
-
| 경어체 잔존(
|
|
591
|
-
|
|
|
594
|
+
| 경어체 잔존(요청 자리 밖) · 한 문장 한 줄 | `tone.mjs` S1 · `report_tone.php report_tone_warnings()` — 둘이 빼는 요청 자리는 「Lim 발행 규칙」 톤 줄(5 · 11) | 로컬 렌더 산출물 · dry_run |
|
|
595
|
+
| 독자를 주어로 쓴 문장이 요청 자리 밖에 있음(5) | `report_tone.php report_tone_warnings()` 「보고 칸에 요청문이 N곳」(`how_to_check` 의 명령형·당위만) · `tone.mjs` 명령형 — 그 밖의 칸과 「~할 것」「~몫임」 꼴은 **사람 눈** | dry_run · 로컬 렌더 산출물 |
|
|
592
596
|
| 학생 보고서투 · 완충어 · 근거 없는 총평 · 단독 부정 종결 | `tone.mjs` S1/S2 | 로컬 렌더 산출물 |
|
|
593
|
-
| 금칙 값(고객사·지역·제품명·티켓) | `build.py
|
|
597
|
+
| 금칙 값(고객사·지역·제품명·티켓) | 문서의 `forbid` — 로컬은 `build.py guard()` 가 렌더된 HTML 에 걸리면 멈춤 · 포털은 `report_publish.php report_forbid_warnings()` 가 발행 데이터 글자 칸마다 맞춰 ⚠(자리 5곳까지 · 세지 못한 패턴도 한 줄) | **두 경로 다** — 로컬은 멈춤, 포털은 경고 |
|
|
594
598
|
| 개발 식별자(3 — 대상 목록은 `lim-portal-format.md` §10-1) | `gazette.py` `text_scan()` ⚠ | **두 경로 다** |
|
|
595
599
|
| 자격증명 명사 + 노출 경로·동사 근접 · 우리 실수 서술(13번) | `gazette.py` `text_scan()` ⚠ 「자격증명 노출」 — 명사 하나(「비밀번호 재설정」)는 안 셈 · 「우리 실수」 일반은 **없음 — 사람 눈** | **두 경로 다** |
|
|
596
600
|
| 판단 항목·확인 요청에 기한 없음 · `asks` 절 없음 · 선택지 표에 근거 등급 없음 · `asks` 절 표의 동일값 열(브리핑) | `gazette.py` `brief_checks()` ⚠ | **두 경로 다** |
|
|
@@ -602,6 +606,8 @@ doc-pptx 의 슬롭 3종 중 **대시 대비 헤드라인**("복붙에서 위임
|
|
|
602
606
|
| 도판 출처 줄의 제작 설명·그림 번호 · 출처 줄 길이(0.5단계 5a행) | `gazette.py` `text_scan()` ⚠ — 캡션은 안 봄 | **두 경로 다** |
|
|
603
607
|
| 선택지를 「길」로 부른 곳(스킬 장치 이름의 유출, 12번) | `gazette.py` `text_scan()` ⚠ — 「막대 길이」「길게」는 안 세고 「어느 길이」·열 머리 「길」은 셈. 「사진」「단추」 같은 비유는 **없음 — 사람의 눈** | **두 경로 다** |
|
|
604
608
|
| 해라체 명령(「…을 보라」「…하라」, 12번) | `gazette.py` `text_scan()` ⚠ — 「보라색」「정할 것」은 안 셈. 공급사 용어 직역(「지원료」)은 **없음 — 사람의 눈** | **두 경로 다** |
|
|
609
|
+
| 대화 이력 낱말(「앞서 합의한」「요청하신 대로」 — 3b) · 책임 낱말 「탓」(12번) | `gazette.py` `text_scan()` ⚠ — 과정 어휘와 같은 칸을 칸마다 한 번 센다. 「사전에 협의」「남탓」「탓하다」는 안 셈 | **두 경로 다** |
|
|
610
|
+
| 소속처가 이미 반려한 작업 이름(12번) | `gazette.py` `text_scan()` ⚠ — 목록은 그 소속처 반려 결정들의 `rejected_names` 칸(이름 → 원래 이름, 이름마다 가장 새 결정). 포털은 서버가, 로컬은 `render.py --tenant <slug>` 가 `list_rejected_names` 로 받아 렌더러에 넘긴다. 렌더 없이 부르는 `gazette.py coined_scan()`(이 기계의 발행 직전 훅이 부르는 자리)도 같은 길로 받은 목록으로 같은 경고를 낸다. 목록 밖의 새 이름은 **없음 — 독자 검토 이름 물음(`names`)·사람 눈** | **두 경로 다** — 목록을 못 받으면 `render.py` 는 ⚠ 「반려 이름을 못 받았습니다」, 훅은 경고가 있을 때 「반려 이름 미확인」을 덧붙인다(둘 다 세지 않음) |
|
|
605
611
|
| 건 행 이름(`labels`) 낱말이 다른 절 부제·표 제목·열 머리에 다시 섬 · 선택지 기호 한 글자에 이름 둘(0.5단계 3행) | `gazette.py` `text_scan()` ⚠ · 뜻이 같은지는 사람 눈 | **두 경로 다** |
|
|
606
612
|
| 그림·표 번호 가리킴 — 없는 번호 · 조사 · 서지 못한/서지 않는 칸의 토큰 · `plates` 순서(0.5단계 6행) | `gazette.py` `text_scan()`·`build()` ⚠ — 번호 셈은 `fig_order()` 한 곳 | **두 경로 다** |
|
|
607
613
|
| 괄호 안 부연 · 흐름도 칸 `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",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"symptom": "주문서를 작성하고 저장을 눌러도 목록으로 돌아오면 그 주문이 보이지 않던 상황. 새로고침을 한 번 더 하면 나타났음.",
|
|
7
7
|
"cause": "저장이 끝나기 전에 목록을 다시 불러오고 있어, 저장 직전 상태가 화면에 남았음.",
|
|
8
8
|
"fix": "저장이 끝난 뒤에 목록을 불러오도록 순서를 바꿈. 운영 환경에서 주문서를 실제로 작성·저장해 목록에 바로 나타나는 것까지 확인함.",
|
|
9
|
-
"how_to_check": "주문서를 하나 작성해
|
|
9
|
+
"how_to_check": "주문서를 하나 작성해 저장하면 목록에 새로고침 없이 바로 보임."
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"group": "own",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"symptom": "주문이 많은 지점에서 목록 첫 화면이 뜨기까지 10초 넘게 걸리던 상황.",
|
|
16
16
|
"cause": "목록을 그릴 때마다 전체 항목을 훑고 있었음. 건수가 늘수록 시간이 비례해 늘어남.",
|
|
17
17
|
"fix": "자주 쓰는 조회 조건에 조회 색인을 걸어 필요한 만큼만 읽도록 바꿈. 운영 데이터를 건별로 대조해 결과가 같은 것을 확인함.",
|
|
18
|
-
"how_to_check": "주문이 가장 많은 지점의
|
|
19
|
-
"remaining": "목록 위 총 건수가 예전 데이터 때문에 실제보다 몇 건 많게 나올 수 있는 상황. 실제 수치와
|
|
18
|
+
"how_to_check": "주문이 가장 많은 지점의 목록도 첫 화면이 1초 안에 뜸.",
|
|
19
|
+
"remaining": "목록 위 총 건수가 예전 데이터 때문에 실제보다 몇 건 많게 나올 수 있는 상황. 기준은 실제 수치와 대조한 결과를 받은 뒤 맞출 예정."
|
|
20
20
|
}
|
|
21
21
|
]
|