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.
Files changed (31) hide show
  1. package/bin/aarch64-apple-darwin/gcell +0 -0
  2. package/bin/aarch64-unknown-linux-musl/gcell +0 -0
  3. package/bin/manifest.json +5 -5
  4. package/bin/x86_64-apple-darwin/gcell +0 -0
  5. package/bin/x86_64-pc-windows-gnu/gcell.exe +0 -0
  6. package/bin/x86_64-unknown-linux-musl/gcell +0 -0
  7. package/genetics.mjs +2224 -238
  8. package/package.json +3 -2
  9. package/skills/gazette-report/SKILL.md +11 -10
  10. package/skills/gazette-report/scripts/tone.mjs +17 -5
  11. package/skills/gazette-report/scripts/tone.test.mjs +15 -2
  12. package/skills/gazette-report/template/skeleton.html +10 -10
  13. package/skills/genetics-define/SKILL.md +2 -0
  14. package/skills/genetics-report/SKILL.md +93 -87
  15. package/skills/genetics-report/assets/example/cases-briefing.json +1 -1
  16. package/skills/genetics-report/assets/example/cases.json +3 -3
  17. package/skills/genetics-report/assets/example/report-briefing-designs.json +26 -26
  18. package/skills/genetics-report/assets/example/report-briefing.json +3 -3
  19. package/skills/genetics-report/assets/example/report.json +11 -11
  20. package/skills/genetics-report/assets/mcp-call.mjs +109 -0
  21. package/skills/genetics-report/assets/patch.py +196 -0
  22. package/skills/genetics-report/assets/render.py +172 -0
  23. package/skills/genetics-report/assets/xlsx-plate.py +203 -0
  24. package/skills/genetics-report/references/content-pipeline.md +26 -26
  25. package/skills/genetics-report/references/edition-review.workflow.js +70 -15
  26. package/skills/genetics-report/references/history.md +76 -2
  27. package/skills/genetics-report/references/lim-portal-format.md +101 -45
  28. package/skills/genetics-report/references/linear-read-test.workflow.js +50 -14
  29. package/skills/genetics-report/references/process.md +47 -43
  30. package/skills/genetics-report/references/reader-review.workflow.js +105 -28
  31. package/skills/genetics-report/references/visual-first.md +29 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genetics-mcp",
3
- "version": "2.22.0",
3
+ "version": "2.24.0",
4
4
  "description": "문서 포털 발행·세션 이식·사례 기억 MCP — 데이터를 주면 규격 문서가 나온다 (짝인 스킬 동봉)",
5
5
  "author": "주식회사 LIM (LIM Inc.)",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -18,7 +18,8 @@
18
18
  "node": ">=18"
19
19
  },
20
20
  "scripts": {
21
- "test": "node smoke.mjs && node notify.test.mjs && node schedule.test.mjs && node windows.test.mjs && bash ../cell/tests/cellcycle.sh",
21
+ "test": "node smoke.mjs && node append.test.mjs && node task-results-stdio.test.mjs && node notify.test.mjs && node schedule.test.mjs && node windows.test.mjs && bash ../cell/tests/cellcycle.sh",
22
+ "test:task-results": "node task-results.test.mjs && node task-results-stdio.test.mjs",
22
23
  "prepack": "find skills -name __pycache__ -type d -prune -exec rm -rf {} + 2>/dev/null; bash ../cell/build-all.sh",
23
24
  "prepublishOnly": "npm test",
24
25
  "release": "bash release.sh"
@@ -12,6 +12,7 @@ description: 정적 HTML 보고서를 한국 정부간행물(관보) 문서 문
12
12
  - 화면으로도 읽히고 **인쇄하면 진짜 A4 문서**가 나와야 할 때
13
13
 
14
14
  기준 원전: 행정안전부·KISA 『소프트웨어 개발보안 가이드』, 『공공 SW사업 제안요청서 작성을 위한 요구사항 상세화 실무가이드라인』 계열.
15
+ 이 원전은 위에서 아래로 지시하는 지침서다 — **조판만 가져오고 말투는 가져오지 않는다.** 독자에게 시키는 문장(「~할 것」·「~ 필요」·Advice 「참조하라」)은 우리 독자(결정권자)에게 하대로 읽힌다(아래 톤 절).
15
16
 
16
17
  ---
17
18
 
@@ -145,7 +146,7 @@ report-v2 144종을 이렇게 훑어 4건이 나왔다 — CSS 만 봐서는 하
145
146
  |---|---|---|
146
147
  | **가구** | 표지 · 차례 · 간지 · 측면 색인 · 표 캡션 · 판권지 | 웹페이지로 읽힘 |
147
148
  | **페이지 문법** | **두 단 본문 + 여백 주석 단** · 위치 브레드크럼 머리띠 · PART 층위 | 「문서처럼 꾸민 웹페이지」에서 멈춤 |
148
- | **자리별 톤** | 기록 자리는 개조식, **요청 자리는 하십시오체**(톤 절) | 기록이 겉돌거나, 요청이 하대로 읽힘 |
149
+ | **주어별 톤** | 요청 자리 밖은 우리·사물이 주어인 개조식, 독자가 할 일은 **요청 자리에만 하십시오체**(톤 절) | 기록이 겉돌거나, 독자를 부리는 문장이 하대로 읽힘 |
149
150
 
150
151
  본문 쪽의 실제 골격:
151
152
 
@@ -168,7 +169,7 @@ report-v2 144종을 이렇게 훑어 4건이 나왔다 — CSS 만 봐서는 하
168
169
  240px 나머지
169
170
  ```
170
171
 
171
- **좌측 여백 주석 단이 본체다.** 관보 가이드는 모든 본문 쪽 여백에 `? Why` / `Key Point` / `Advice` 를 고정으로 둔다. 장식이 아니라 읽기 장치 — 「이 절을 왜 읽는가 → 한 줄 요지 → 어디를 참조하라」가 본문 옆에 상시 붙어 있다.
172
+ **좌측 여백 주석 단이 본체다.** 관보 가이드는 모든 본문 쪽 여백에 `? Why` / `Key Point` / `Advice` 를 고정으로 둔다. 장식이 아니라 읽기 장치 — 「이 절을 왜 읽는가 → 한 줄 요지 → 더 볼 곳」이 본문 옆에 상시 붙어 있다.
172
173
 
173
174
  내용은 **독자가 실제로 던질 질문**이어야 한다. 채우려고 넣으면 안 넣느니만 못하다.
174
175
  쪽이 없는 화면에서는 쪽마다 반복할 수 없으므로 `position: sticky`. 900px 미만은 본문 위 가로 띠로 접는다.
@@ -279,11 +280,11 @@ PDF의 파스텔을 그대로 옮기면 「로봇처럼 베낀 것」이 된다.
279
280
  그쪽은 산문 윤문 도구이므로 **번역투(A) · 영어 인용(B) · 리듬 균일성(E)은 가져오지 않는다** —
280
281
  개조식은 리듬이 균일한 것이 정상이다. 심각도 3단계(S1/S2/S3)와 route 3경로도 같은 출처.
281
282
 
282
- 논문·과제·공문 문체. `~합니다 / ~해 주세요 / ~했습니다` **아님**.
283
+ 논문·과제·공문 문체. `~합니다 / ~해 주세요 / ~했습니다` **아님**. 단 **요청 자리 밖에서, 주어가 우리·사물인 문장에만** 쓴다 — 독자가 할 일은 아래 요청 자리에만 두고 사실 문장까지 하십시오체로.
283
284
 
284
285
  | 쓰지 마라 | 써라 |
285
286
  |---|---|
286
- | 인증서를 설치해 주셔야 합니다 | 인증서 설치 **필요** |
287
+ | 인증서를 설치해 주셔야 합니다 | (독자가 할 일 — 요청 자리에서 「설치하여 주시기 **바랍니다**」, 그 밖의 자리에는 사실만: 인증서가 없는 기기에서는 접속이 막**힘**) |
287
288
  | 확인했습니다 | 확인**함** |
288
289
  | 연결됩니다 | 연결**됨** |
289
290
  | 거부합니다 | 거부하는 **상황** |
@@ -292,16 +293,16 @@ PDF의 파스텔을 그대로 옮기면 「로봇처럼 베낀 것」이 된다.
292
293
 
293
294
  질문형(Why 블록, 활용법 라벨)은 `~하는가?` / `~인가?`. `~합니까?` 아님.
294
295
 
295
- 검사: **기록 자리**에서 `습니다|십시오|합니다|입니다|됩니다|주세요` 정규식이 **0건**이어야 한다(스크립트 태그 제외).
296
+ 검사: **요청 자리 밖**에서 `습니다|십시오|합니다|입니다|됩니다|주세요` 정규식이 **0건**이어야 한다(스크립트 태그 제외).
296
297
 
297
298
  ⚠ **요청 자리는 반대다 — 하십시오체로 맺는다.** 상대에게 직접 말을 거는 자리
298
- (요청 절의 강조문·판단 항목, PART I 간지, 판권지 회신 안내)는 종결까지 존댓말이어야 한다 —
299
+ (요청 절의 강조문·판단 항목, 요청·결정 PART 의 간지(PART I), 판권지 회신 안내, 요청 절 항을 부탁하는 읽는 법 한 줄)는 종결까지 존댓말이어야 한다 —
299
300
  「확인 **부탁드립니다**」·「회신 주시면 **반영하겠습니다**」·「열어 **주시기 바랍니다**」.
300
301
  명사형 종결 `-ㅁ/-음` 은 한국어 상대높임 등급 **밖**이라 청자 높임이 0 이고, 사람에게 직접 쓰면
301
302
  하대로 읽힌다 — 겸양 어간이 든 「부탁드림」도 존대가 아니다. 제목은 명사형 「~ 요청」(검수·보고) 또는 물음(결정 문서의 판단 항목)으로 둔다.
302
- `tone.mjs` 는 판단 항목 본문(`p.ask__body`)과 「」 인용만 빼고 센다(2026-09-12, 그 파일 ① 경어체 절) — **그 밖의 요청 자리
303
- (강조문·간지·판권지 회신 안내)에서 난 S1 경어체 지적은 사람이 걸러 읽고 그대로 둔다.** 이것을 몰라 말투 반려가 네 번 났다
304
- (2026-09-02 · 09-03 ×2 · 09-11). 정본은 genetics(hnl)
303
+ `tone.mjs` 는 요청 자리(판단 항목 본문·강조문·요청 PART 의 간지·판권지 회신 안내)와 「」 인용을 빼고 센다(2026-09-26, 그 파일 ① 경어체 절) — 읽는 법 요청 한 줄은 세며 그 경고는 의도다.
304
+ 요청 자리를 세면 규칙을 지킨 문서가 떨어지고, 떨어지지 않으려고 하대로 돌아간다. 요청 자리 밖에서 독자를 부린 꼴(보고 칸 요청문·해라체·칸 정의)까지 합치면
305
+ 말투 반려는 여섯 번이다(2026-09-02 · 09-03 ×2 · 09-11 · 09-17 · 09-26, genetics-report `references/history.md` §5). 정본은 genetics(hnl)
305
306
  `decisions/고객-문서-요청-자리는-하십시오체로-맺는다-명사형-종결은-하대로-읽힌다.md`.
306
307
 
307
308
  ### 한 문장 한 줄 — 한글은 마침표에서 줄을 바꾼다
@@ -448,7 +449,7 @@ flush」로 두 방식이 섞인다 — 실측: 여백 주석 단에서 Key Poin
448
449
  | `read.mjs` | 읽는 글 전수의 **글자/줄 · 행간 · 대비** | 43자 이하 · 행간 1.6+ · 지적 0 |
449
450
  | `flexcheck.mjs` | flex/grid 안에서 **문장이 토막 나는 곳** | 0건 |
450
451
  | `fontchk.mjs` | **렌더된** 활자 크기·굵기 분포를 4개 폭(1440·1100·900·390)에서. CSS 토큰화로는 안 잡히는 것 | 스케일 밖 **0** · 굵기 **3종** · 굵게 **≤55%** |
451
- | `tone.mjs` | ① 본문 **경어체 잔존**(S1) ② **늘어짐 지표 9종**(S2, 천 자당 밀도) — 문두 접속사 · 추측 종결 · 이중 완곡 · 「이는 ~」 · 형식명사 결합 · 괄호 부연 · 낫표 · 대시 · 인라인 강조 ③ **한 문장 한 줄**(S1) — 마침표로 이어 붙인 블록 | 경어체 **기록 자리 0건**(요청 자리 지적은 의도 — 위 톤 절) · 이어 붙인 블록 **0개** · 밀도 초과 **0항** |
452
+ | `tone.mjs` | ① 본문 **경어체 잔존**(S1) ② **늘어짐 지표 9종**(S2, 천 자당 밀도) — 문두 접속사 · 추측 종결 · 이중 완곡 · 「이는 ~」 · 형식명사 결합 · 괄호 부연 · 낫표 · 대시 · 인라인 강조 ③ **한 문장 한 줄**(S1) — 마침표로 이어 붙인 블록 | 경어체 **요청 자리 밖 0건**(요청 자리 넷은 세지 않고, 읽는 법 요청 한 줄은 세되 의도 — 위 톤 절) · 이어 붙인 블록 **0개** · 밀도 초과 **0항** |
452
453
  | `sentbreak.py` | 검사가 아니라 **적용** — 문장마다 `<span class="sn">` 을 새긴다. 멱등 | 돌린 뒤 `contentdiff.sh` 통과 |
453
454
  | `contentdiff.sh` | **내용 불변 게이트** — 조판이 본문 낱말 · `id` · `data-*` · 앵커를 바꿨는지 전후 대조 | 전 항목 차이 **0** |
454
455
  | `pdfcheck.sh` | 실제 PDF 생성 → 쪽수 · 절별 새 쪽 시작 · 쪽번호 · 러닝 푸터 | 표지 단독 · 절마다 새 쪽 · 푸터 = 쪽수-1 |
@@ -52,15 +52,26 @@ export function analyze(raw0) {
52
52
  // 종결까지 하십시오체가 규칙이다(genetics-report SKILL 5·5a). 여기서 세면 규칙을 지킨 문서가 떨어지고,
53
53
  // 떨어지지 않으려고 「회신 주시면 됨」 같은 하대로 돌아간다 — 2026-09-03 에 그렇게 반려됐다.
54
54
  // ⑵ 「」 안은 원문 인용이다(SKILL 11 — 인용은 원문 문구 그대로). 앱 문구 「다시 입력해 주세요」를 인용한
55
- // 표가 경어체로 잡히면 인용을 비틀게 된다. 기록 자리(문단·표·요약)의 우리 문장은 그대로 센다.
56
- const politeTxt = raw
55
+ // 표가 경어체로 잡히면 인용을 비틀게 된다. 요청 자리 밖(문단·표·요약)의 우리 문장은 그대로 센다.
56
+ // 2026-09-26 — ⑴ 과 같은 까닭으로 나머지 요청 자리도 뺀다: 머리 강조문(`aside.urgent` = cta), PART I 간지(`section.pt[data-part-no="1"]`),
57
+ // 판권지 회신 안내(`p.colophon__note`). 요청 자리는 사실 문장까지 하십시오체다(genetics-report SKILL 5·5a) — 여기서 세면
58
+ // 본보기가 그 자리를 개조식으로 남겨 두게 되고, 에이전트는 그 본보기를 따른다(2026-09-26 A/B 에서 판단 항목 10/14 문장이 명사형).
59
+ // PART I 간지는 그 PART 가 요청·결정 PART 일 때(PART 1 의 절 안에 요청 절 `ol.asks` 가 있을 때)만 요청 자리다 — 태그를 지우기 전에 뺀다.
60
+ // 배우는 문서·정황 공유 문서의 PART I(원리·경과)은 요청 자리가 아니므로 센다.
61
+ const reqPart1 = /<section class="part"[^>]*data-part-no="1"[^>]*>(?:(?!<section class="part")[\s\S])*?class="asks"/.test(raw);
62
+ const rawReq = reqPart1
63
+ ? raw.replace(/<section class="pt"[^>]*data-part-no="1"[^>]*>[\s\S]*?<\/section>/g, ' ')
64
+ : raw;
65
+ const politeTxt = rawReq
57
66
  .replace(/<p class="ask__body"[^>]*>[\s\S]*?<\/p>/g, ' ')
67
+ .replace(/<aside class="urgent"[^>]*>[\s\S]*?<\/aside>/g, ' ')
68
+ .replace(/<p class="colophon__note"[^>]*>[\s\S]*?<\/p>/g, ' ')
58
69
  .replace(/<[^>]+>/g, ' ')
59
70
  .replace(/&#x27;/g, "'").replace(/&amp;/g, '&').replace(/&nbsp;/g, ' ')
60
71
  .replace(/「[^「」]{0,200}」/g, ' ')
61
72
  .replace(/\s+/g, ' ').trim();
62
73
  const polite = politeTxt.match(POLITE) || [];
63
- lines.push(`[S1] 경어체 잔존: ${polite.length}건 (0 이어야 함 — 개조식은 ~함 / ~했음 / ~필요)`);
74
+ lines.push(`[S1] 경어체 잔존: ${polite.length}건 (0 이어야 함 — 요청 자리 밖은 개조식 ~함 / ~했음 / ~임)`);
64
75
  polite.slice(0, 12).forEach(h => lines.push(' ✗ ' + h.trim().slice(0, 80)));
65
76
 
66
77
  // ── ①b 상대에게 내리는 명령 (S1) — ① 의 **반대쪽 벽** ────────
@@ -81,14 +92,15 @@ export function analyze(raw0) {
81
92
  const DUTY = /(?:주셔야|하셔야|주시어야|하시어야)\s*(?:함|됨)(?=[\s.。]|$)/g;
82
93
  const order = txt.match(ORDER) || [];
83
94
  const duty = txt.match(DUTY) || [];
84
- lines.push(`\n[S1] 상대에게 내리는 명령: ${order.length + duty.length}건 (0 이어야 함 — 상대가 할 일에는 높임 어간을 살린다)`);
95
+ lines.push(`\n[S1] 상대에게 내리는 명령: ${order.length + duty.length}건 (0 이어야 함 — 독자가 할 일은 요청 자리에만 하십시오체로, 그 밖에는 사실만)`);
85
96
  [...duty, ...order].slice(0, 12).forEach(h => lines.push(' ✗ ' + h.trim()));
86
97
  if (order.length + duty.length) {
87
98
  // ⚠ 2026-09-11 교체. 옛 처방은 「회신 주시면 됨」이었는데 그 표현 자체가 2026-09-03 에
88
99
  // 반려됐다(「이런 말투 존나 싸가지 없지 않아?」). 명사형 종결 `-ㅁ/-음` 은 한국어
89
100
  // 상대높임 등급 밖이라 청자 높임이 0 이고, 사람에게 직접 쓰면 하대로 읽힌다 —
90
101
  // 겸양 어간이 든 「부탁드림」도 마찬가지다. 요청 자리는 종결까지 존댓말로 맺는다.
91
- lines.push(' → 「회신 필요」 → 「회신 부탁드립니다」 · 「~해 주셔야 함」 → 「~해 주시기 바랍니다」');
102
+ lines.push(' → 요청 자리(판단 항목·강조문·요청 PART 간지·판권지 회신 안내)면 「회신 필요」 → 「회신 부탁드립니다」 · 「~해 주셔야 함」 → 「~해 주시기 바랍니다」');
103
+ lines.push(' → 그 밖의 칸(건·문단·표·여백 주석)이면 높이지 말고 사실만 남긴다(「기준 수치는 미정」) — 부탁은 요청 절 항으로 옮긴다');
92
104
  lines.push(' → 제목은 명사형 「~ 요청」 그대로. 「부탁드림·바람·하시면 됨」은 존대가 아니다.');
93
105
  }
94
106
 
@@ -137,12 +137,12 @@ test('상대에게 내리는 명령 — 개조식의 반대쪽 벽 (2026-09-02)'
137
137
  assert.match(analyze(wrap('검수 결과는 별도 회신 필요.')).lines.at(-1), /상대에게 내리는 명령 1건/);
138
138
  });
139
139
 
140
- test('경어체 — 판단 항목 본문(요청 자리)과 「」 인용은 세지 않는다, 기록 자리는 센다(2026-09-12)', () => {
140
+ test('경어체 — 판단 항목 본문(요청 자리)과 「」 인용은 세지 않는다, 요청 자리 밖은 센다(2026-09-12)', () => {
141
141
  const ask = '<ol class="asks"><li class="ask" id="case-01"><div class="ask__head"><h4 class="ask__title">방식 A 를 들일 것인가</h4></div>'
142
142
  + '<p class="ask__body"><span class="sn">2026년 9월 30일까지 회신해 주시기 바랍니다.</span> <span class="sn">고른 길은 다음 작업에 넣겠습니다.</span></p></li></ol>';
143
143
  const r = analyze(ask + wrap('앱 안내문의 맺음은 「주소를 다시 입력해 주세요」임.'));
144
144
  assert.equal(r.polite.length, 0, r.polite.join(' | '));
145
- // 대조군 — 같은 문장이 기록 자리(문단)에 서면 센다. 뮤테이션: 요청 자리 제외를 문단까지 넓히면 여기서 죽는다.
145
+ // 대조군 — 같은 문장이 요청 자리 밖(문단)에 서면 센다. 뮤테이션: 요청 자리 제외를 문단까지 넓히면 여기서 죽는다.
146
146
  const c = analyze(wrap('고른 길은 다음 작업에 넣겠습니다.'));
147
147
  assert.equal(pos(c.polite.length), 1);
148
148
  // 대조군 — 인용 괘 밖의 경어체는 센다(괘 안만 뺀다).
@@ -150,6 +150,19 @@ test('경어체 — 판단 항목 본문(요청 자리)과 「」 인용은 세
150
150
  assert.equal(pos(q.polite.length) >= 1, true);
151
151
  });
152
152
 
153
+ test('경어체 — 요청 PART 의 간지·강조문·판권지 회신 안내는 세지 않고, 배우는 문서의 PART I 간지는 센다(2026-09-26)', () => {
154
+ const reqDoc = '<section class="pt" id="pt-1" data-part-no="1"><p class="pt__lede">확인을 부탁드리는 사항입니다.</p></section>'
155
+ + '<section class="part" id="sec-1" data-chapter="01" data-part-no="1"><aside class="urgent"><p class="urgent__t">각 건을 열어 확인해 주시기 바랍니다.</p></aside>'
156
+ + '<ol class="asks"><li class="ask"><p class="ask__body">회신 부탁드립니다.</p></li></ol></section>'
157
+ + '<footer class="eof"><div class="colophon"><p class="colophon__note">※ 이 문서에는 입력 기능이 없습니다.</p></div></footer>';
158
+ const r = analyze(reqDoc);
159
+ assert.equal(r.polite.length, 0, r.polite.join(' | '));
160
+ // 대조군 — 요청 절이 없는 배우는 문서의 PART I 간지는 요청 자리가 아니다 → 센다. 뮤테이션: PART I 을 조건 없이 빼면 여기서 죽는다.
161
+ const learn = '<section class="pt" id="pt-1" data-part-no="1"><p class="pt__lede">원리를 먼저 설명합니다.</p></section>'
162
+ + '<section class="part" id="sec-1" data-chapter="01" data-part-no="1"><p>원리 하나를 다룸.</p></section>';
163
+ assert.equal(pos(analyze(learn).polite.length), 1);
164
+ });
165
+
153
166
  test('양성 표본 수 — 0표본 통과 방지', () => {
154
167
  console.log(` 양성 표본 ${positives}건 (0 이면 이 시험은 아무것도 안 잰 것)`);
155
168
  assert.equal(positives >= 28, true, String(positives));
@@ -176,7 +176,7 @@
176
176
  <div class="guide__row">
177
177
  <p class="guide__q">시간이 없다면 어디를 봐야 하는가?</p>
178
178
  <ul class="guide__a">
179
- <li><span class="sn"><a class="ref" href="#sec-1">01절</a>만 읽으면 됨.</span><span class="sn">나머지 절은 그 근거.</span></li>
179
+ <li><span class="sn"><a class="ref" href="#sec-1">01절</a>이 요청의 전부임.</span><span class="sn">나머지 절은 그 근거.</span></li>
180
180
  </ul>
181
181
  </div>
182
182
  <div class="guide__row">
@@ -188,7 +188,7 @@
188
188
  <div class="guide__row">
189
189
  <p class="guide__q">인쇄하려면?</p>
190
190
  <ul class="guide__a">
191
- <li><span class="sn">Chrome 131 이상에서 인쇄.</span><span class="sn">대화상자의 「머리글 및 바닥글」 체크 해제 필요.</span></li>
191
+ <li><span class="sn">Chrome 131 이상에서 인쇄.</span><span class="sn">「머리글 및 바닥글」이 켜져 있으면 주소가 쪽마다 찍힘.</span><span class="sn">인쇄 대화상자에서 그 칸을 끄면 주소 없이 인쇄됨.</span></li>
192
192
  </ul>
193
193
  </div>
194
194
  </div>
@@ -269,7 +269,7 @@
269
269
  </div>
270
270
  <div class="marg__b marg__b--adv">
271
271
  <p class="marg__k"><span class="marg__i" aria-hidden="true">i</span>Advice</p>
272
- <p class="marg__t"><span class="sn">어디를 참조해야 하는지.</span><span class="sn">근거의 출처를 가리킴.</span></p>
272
+ <p class="marg__t"><span class="sn">더 볼 곳의 이름(「03절 대조표」).</span><span class="sn">근거의 출처를 가리킴.</span></p>
273
273
  </div>
274
274
  </aside>
275
275
 
@@ -280,18 +280,18 @@
280
280
  <li class="ask is-urgent" id="case-01-1">
281
281
  <div class="ask__head">
282
282
  <span class="ask__no">01-1</span>
283
- <h4 class="ask__title">가장 시급한 항목의 제목. 개조식으로 「~ 필요」.</h4>
283
+ <h4 class="ask__title">가장 시급한 항목의 제목. 「~ 요청」 + 기한 괄호(결정 문서는 물음).</h4>
284
284
  <span class="ask__flag">가장 시급</span>
285
285
  <a class="ask__ref" href="#case-01-2">근거 01-2</a>
286
286
  </div>
287
- <p class="ask__body"><span class="sn">현재 상태와 원인, 그리고 조치 시 무엇이 달라지는지를 개조식으로 씀.</span><span class="sn">문단은 한글 43자 안에서 끊기며, 행간은 1.75 임.</span><span class="sn">근거가 있으면 단정하고 없으면 확인하지 못한 범위를 명시함.</span><span class="sn">판단의 출처는 「근거」 단추로 잇고, 본문 안에서는 밑줄 링크로 가리킴.</span><span class="sn">굵게 하지 않음.</span></p>
287
+ <p class="ask__body"><span class="sn">현재 상태와 원인, 조치하면 무엇이 달라지는지를 적습니다.</span><span class="sn">문단은 한글 43자 안에서 끊기며, 행간은 1.75 입니다.</span><span class="sn">근거가 있으면 단정하고, 없으면 확인하지 못한 범위를 밝힙니다.</span><span class="sn">판단의 출처는 「근거」 단추로 잇고, 본문 안에서는 밑줄 링크로 가리킵니다.</span><span class="sn">굵게 하지 않습니다.</span></p>
288
288
  </li>
289
289
  <li class="ask" id="case-01-2">
290
290
  <div class="ask__head">
291
291
  <span class="ask__no">01-2</span>
292
292
  <h4 class="ask__title">둘째 항목의 제목.</h4>
293
293
  </div>
294
- <p class="ask__body"><span class="sn">둘째 항목의 설명.</span><span class="sn">상태를 먼저 적고 그 다음에 원인을, 마지막에 필요한 조치를 적음.</span><span class="sn">조치가 상대 쪽에 있으면 무엇이 준비되어야 하는지를 구체적으로 씀.</span><span class="sn">「개선이 필요함」 같은 추상 주어는 쓰지 않음.</span></p>
294
+ <p class="ask__body"><span class="sn">둘째 항목의 설명입니다.</span><span class="sn">저희가 못 닫은 사실을 먼저 적고, 부탁은 하십시오체로 맺습니다.</span><span class="sn">상대 쪽에서 준비해 주실 것이 있으면 그것을 구체적으로 적습니다.</span><span class="sn">「개선이 필요함」 같은 추상 주어는 쓰지 않습니다.</span></p>
295
295
  </li>
296
296
  </ol>
297
297
 
@@ -335,7 +335,7 @@
335
335
  <tr><th scope="row">증상</th><td><p><span class="sn">무엇이 어떻게 나타나는지를 관찰한 그대로 적음.</span><span class="sn">해석을 섞지 않음.</span></p></td></tr>
336
336
  <tr><th scope="row">원인</th><td><p><span class="sn">왜 그런지.</span><span class="sn">근거가 있으면 단정하고, 추정이면 추정임을 밝힘.</span><span class="sn">확인 방법이 달라지므로 이 둘을 섞지 않음.</span></p></td></tr>
337
337
  <tr><th scope="row">조치</th><td><p><span class="sn">무엇을 했는지와 어디까지 확인했는지.</span><span class="sn">「직접 확인」과 「산출물 대조」는 근거의 세기가 다르므로 구분해 적음.</span></p></td></tr>
338
- <tr class="open"><th scope="row">미결</th><td><p><span class="sn">아직 남은 것.</span><span class="sn">이 행이 독자에게 넘어가는 몫이며, 앞 절의 요청 항목으로 이어짐.</span></p></td></tr>
338
+ <tr class="open"><th scope="row">미결</th><td><p><span class="sn">아직 닫히지 않은 사실(미확인·미결)과 운영에 아직 안 나간 작업.</span><span class="sn">부탁은 앞 절의 요청 항목에 있음.</span></p></td></tr>
339
339
  </tbody>
340
340
  </table>
341
341
  </article>
@@ -398,7 +398,7 @@
398
398
  <h3 class="part__title">둘째 절</h3>
399
399
  <span class="part__count">1항</span>
400
400
  </div>
401
- <p class="part__lede"><span class="sn">이번 회차의 확인 범위 밖이었던 사항.</span><span class="sn">앞 절과 함께 읽어야 정확함.</span></p>
401
+ <p class="part__lede"><span class="sn">이번 회차의 확인 범위 밖이었던 사항.</span><span class="sn">앞 절의 확인 범위와 짝을 이룸.</span></p>
402
402
  </div>
403
403
  </header>
404
404
 
@@ -414,7 +414,7 @@
414
414
  </div>
415
415
  <div class="marg__b marg__b--adv">
416
416
  <p class="marg__k"><span class="marg__i" aria-hidden="true">i</span>Advice</p>
417
- <p class="marg__t"><span class="sn">이 절과 함께 읽어야 앞 절의 확인 범위가 정확해짐.</span></p>
417
+ <p class="marg__t"><span class="sn">짝이 되는 확인 범위는 앞 절 대조표.</span></p>
418
418
  </div>
419
419
  </aside>
420
420
 
@@ -468,7 +468,7 @@
468
468
  <div><dt>수신</dt><dd>누가 읽는가</dd></div>
469
469
  </dl>
470
470
  <p class="colophon__mark">이 문서는 0000년 0월 0일 기준임.<b>내부 공유용</b></p>
471
- <p class="colophon__note"><span class="sn">※ 독자가 오해할 수 있는 것을 여기 적음.</span><span class="sn">예: 화면 표시가 작성자에게 전달되지 않는다는 사실.</span></p>
471
+ <p class="colophon__note"><span class="sn">※ 독자가 오해할 수 있는 것을 여기 적습니다.</span><span class="sn">예: 화면 표시는 작성자에게 전달되지 않습니다.</span></p>
472
472
  </div>
473
473
  <p class="eof__note">이후 진행 사항은 차기 회차 보고로 공유 예정.</p>
474
474
  </footer>
@@ -45,6 +45,8 @@ version: "1.0.0"
45
45
  5 갈래 처리 기술 자리 → 구현 계약 장 / 사업 자리 → 시각표 질문 → 오너 답을 결정문 하나씩
46
46
  6 항목 장 확정 장을 읽는 순서로 링크, 「무슨 조건이면 다시 여나」= 지금 막는 것 없음
47
47
  7 재측정 4 를 다시. 갈림 0 이면 끝. 아니면 5 로
48
+ 8 완료 보고 report_task(tenant, task_uid, body, evidence[]) — 할 일 표(list_tasks 의 uid)에 무엇을 어떻게 했는지와 근거를 올린다.
49
+ 세포의 done 은 **검수**로 선다(완료 도장은 사람) · 근거는 (kind, ref) 이지 글이 아니다 · 안 주면 이 세션이 근거다.
48
50
  ```
49
51
 
50
52
  **항목 장이 없다고 바로 쓰지 말 것.** 어느 회차(W-05)에서 5분 차로 세션 둘이 같은 항목을 잡았고, 앞 세션이 쓴