genetics-mcp 2.18.2 → 2.19.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.
@@ -0,0 +1,105 @@
1
+ # 도해 — Archify 를 관보에 흡수한다 (2026-09-16)
2
+
3
+ > 「관보에 불가능한 로직이 있다면 가능하게 고도화하고, Archify 까지 호환되도록」(사용자 지시).
4
+ > 이 문서는 **Archify 로 도해를 그려 관보 `sections[].diagrams[]` 에 앉히는 절차**의 정본이다.
5
+ > 렌더러 쪽 계약(칸·경고)은 `lim-portal-format.md` §11-9, 가독성 잣대는 `readability.md` R1.
6
+
7
+ ## 0. 왜 도판(PNG)이 아니라 도해(SVG)인가
8
+
9
+ | | 도판 `plates`(PNG) | 도해 `diagrams`(인라인 SVG) |
10
+ |---|---|---|
11
+ | 글자 | 비트맵 — 확대하면 뭉개지고 검사기가 못 읽는다 | 활자 — 인쇄·확대에서 선명하고 문서의 Pretendard 를 물려받는다 |
12
+ | 예산 | 장당 80KB · 합계 400KB | 장당 250KB(문서 크기에 직접 더해진다) |
13
+ | 만드는 법 | `figure.mjs` 로 굽는다 | `diagram.mjs render/export` 로 굳힌다 |
14
+ | 언제 | 실제 화면 캡처 · 비트맵 원본 | 구조·흐름·순서·데이터 흐름·상태 전이 |
15
+
16
+ 열람 CSP 는 인라인 SVG 를 허용한다(2026-08-24 실측). 스크립트는 여전히 0 이다 — 그래서 Archify 의
17
+ **뷰어(팬·줌·애니메이션·검색)는 관보에 실리지 않고 정지 화면만 실린다.** 그것이 문서의 뜻이다.
18
+
19
+ ## 1. Archify 는 어디에 있나
20
+
21
+ Archify 는 에이전트 스킬이다(MIT, `tt-a1i/archify`). **이 스킬 패키지에 동봉하지 않는다** — 8MB 이고 자체
22
+ 갱신 절차를 가진다. 사용자 기계의 스킬 폴더에 설치돼 있어야 한다.
23
+
24
+ ```bash
25
+ npx skills add tt-a1i/archify -g # Claude Code · Cursor · Codex 공용 설치기
26
+ node ~/.claude/skills/archify/bin/archify.mjs doctor
27
+ ```
28
+
29
+ `diagram.mjs` 는 `--archify <dir>` → `ARCHIFY_DIR` → `~/.claude/skills/archify` → `~/.agents/skills/archify`
30
+ → `~/.cursor/skills/archify` → `~/.codex/skills/archify` 순으로 찾는다. 없으면 설치 안내와 함께 멈춘다(exit 2).
31
+
32
+ ## 1.5 실측이 정한 두 길 — `ir`(기본) 과 `svg`(예외)
33
+
34
+ Archify 의 SVG 는 노드 라벨 11px · 부제·간선 라벨 8px · 범례 7.5px 를 800px 넘는 viewBox 에 놓는다(화면+줌 전제, 자체 계약은
35
+ 「투영 6px 이상」). 관보는 인쇄 우선이라 어떤 글자도 15px 아래로 못 내려가는데(R1), 전폭 1030px 에서도 그 SVG 는 표시 10px 에
36
+ 그친다 — 3열 단일 레인(viewBox 808)도 10.2px 였다(2026-09-16 실측, 프리셋 넷 모두 같음). 글자를 키우면 Archify 의 노드 상자·라벨
37
+ 마스크가 깨진다. 그래서:
38
+
39
+ | 길 | 언제 | 무엇을 넣나 | 가독성 |
40
+ |---|---|---|---|
41
+ | **`ir`** (기본) | `workflow`(절차·관문·runbook) | Archify validate 를 통과한 IR **그대로** | 관보가 15px 활자·장 색으로 다시 그린다 — R1 자동 충족 |
42
+ | `svg` (예외) | architecture · sequence · dataflow · lifecycle | `diagram.mjs export` 의 SVG | R1 ⚠ 를 감수, 크게 보기(1400px)로 읽힌다. 인쇄에서는 작다 |
43
+
44
+ `ir` 길에서 Archify 는 **저작·검증 도구**다(타입 스키마·주 경로·간선 의미·검증 영수증). 그린 HTML 은 화면용 부속물로
45
+ 문서 밖 링크에 둘 수 있다.
46
+
47
+ ## 2. 절차 — IR 을 쓰고, 검증하고, 앉힌다(`ir` 길) / 굳히고 재서 앉힌다(`svg` 길)
48
+
49
+ 1. **종류를 고른다** — Archify `SKILL.md` 의 Type router: `architecture`(구성 요소·경계) · `workflow`(절차·관문·runbook)
50
+ · `sequence`(호출 순서) · `dataflow`(파이프라인·계보) · `lifecycle`(상태 전이). 모르면
51
+ `node bin/archify.mjs guide "<상황>" --json`.
52
+ 2. **IR 을 쓴다** — Archify 의 `schemas/<type>.schema.json` 과 `examples/` 를 읽고 새로 쓴다(사실은 그 문서의 데이터에서).
53
+ 한국어 라벨을 쓴다. 노드 12개 이하, 주 경로 하나. `meta.quality_profile: "showcase"`. `meta.animation` 은 적지 않는다.
54
+ **`meta.legend: {"mode": "hidden"}` 을 적는다** — Archify 의 자동 범례는 영문 7.5px 라 관보 관문(15px)에 걸리고 문서에서는
55
+ 캡션이 그 몫을 한다(실측 2026-09-16). **열은 4개 이하**(viewBox 폭 ≈ 1,000 이하) — 전폭 1030px 에 1:1 로 앉아야 글자가 산다.
56
+ 부제(`sublabel`)는 9자 안, 간선 라벨은 5자 안 — 글자를 키워도(아래 4단계) 노드 폭 168 안에 서는 길이다.
57
+ ⚠ Archify 의 라벨 폭 셈은 라틴 글자 기준이라 **한글 라벨은 예측보다 넓게 선다** — 라벨 겹침 진단이 나면 낱말을 줄이거나
58
+ 노드 `width` 를 준다.
59
+ 3. **검증한다** — `node bin/archify.mjs validate <type> <ir.json> --quality showcase --json` 이 9/9 · 오류 0 · 경고 0.
60
+ 4. **굳힌다** —
61
+ ```bash
62
+ node ~/.claude/skills/genetics-report/assets/diagram.mjs render <type> <ir.json> <out.svg> --wide --min-text 16 --tight --json
63
+ ```
64
+ deliver → 브라우저에서 계산된 스타일을 속성으로 굳힘 → 클래스·스크립트·스타일·애니메이션·원래 표현 속성 걷음 → SVG 하나.
65
+ font-family 는 굳히지 않는다(문서 활자를 물려받게).
66
+ - `--min-text 16`: Archify 는 글자 크기를 컴파일러 상수로 박아(제목 16 · 부제 11 · 간선 8 · 구역 7~10) IR 로는 못 키운다.
67
+ 문턱 아래 글자를 뷰박스 단위 16 으로 키우되 배치는 그대로 두고, **글자 상자 겹침·노드 넘침을 브라우저에서 재서** 영수증에 낸다(R5).
68
+ 노드 부제는 제목과 16px 간격이라 `--min-sub`(기본 15) 까지만 키운다 — 그 위는 제목과 겹친다.
69
+ - `--tight`: Archify 는 화면 비율에 맞춰 아래를 비워 두는데 문서에서는 빈 띠다. 배경 격자를 뺀 내용 상자 + 12 로 viewBox 를 조인다.
70
+ - 영수증의 「작은 글자」 다섯 개가 무엇인지 보고 IR 에서 부제·태그를 줄인다 — 글자를 더 키우는 것은 답이 아니다. 상세 단계는 가장 자세한 단계로 고정한다.
71
+ 5. **잰다** — 위 명령이 함께 잰다: 바이트(≤ 250,000) · viewBox · 가장 작은 글자 × (표시 폭 ÷ viewBox 폭) ≥ 15px(R1) ·
72
+ 세로/폭 ≤ 1.8(R9). ✗ 면 exit 3 — 렌더러도 같은 ⚠ 를 내므로 **여기서 고친다**: 넓은 도해는 `--wide`(표시 1030px),
73
+ 그래도 모자라면 노드·라벨을 줄인다. 글자를 키우는 것은 Archify 의 몫이 아니다 — 도해를 쪼갠다.
74
+ 6. **앉힌다** — `report.json`. `ir` 길은 4·5 를 건너뛰고 IR 을 그대로 넣는다:
75
+ ```json
76
+ "diagrams": [{
77
+ "id": "upgrade-path", "caption": "업그레이드가 지나는 세 관문",
78
+ "ir": { "schema_version": 2, "diagram_type": "workflow", "meta": {"title": "…"}, "lanes": [...], "nodes": [...], "edges": [...] },
79
+ "alt": "스냅샷 복원 → 시험 → 운영 적용", "verdict": "직접 확인", "wide": true,
80
+ "origin": "archify workflow v2 · ir/upgrade-path.workflow.json"
81
+ }]
82
+ ```
83
+ `svg` 길은 `"svg": "<svg …>…</svg>"` 로(파일 내용을 문자열로, JSON 이스케이프). `origin` 은 렌더 안 됨 — IR 경로를 남긴다.
84
+ `ir` 길의 관보 규칙: 노드 라벨은 열 폭에서 15px 두 줄까지(넘치면 ⚠) · 부제 한 줄 · 되돌아가는 간선은 위 채널 ·
85
+ `security` 는 위험색 테두리 · `external`·`dashed` 는 파선 · `mainPath` 는 장 색 굵은 선 · `groups` 는 그리지 않는다.
86
+ 그림 번호는 차트 → 흐름도 → 도해 → 도판 순으로 자리가 매긴다. 본문에서 `{{그림:upgrade-path}}` 로 가리킨다.
87
+ 7. **로컬 렌더 → dry_run** — 다른 장치와 같다. 렌더러 ⚠ 문구는 `lim-portal-format.md` §10-1.
88
+
89
+ ## 3. 무엇이 관보에 들어가고 무엇이 빠지나
90
+
91
+ | Archify 가 주는 것 | 관보에서 |
92
+ |---|---|
93
+ | 정지 SVG(노드·간선·라벨·범례) | 그대로 — 활자로 |
94
+ | 팬·줌·검색·초점·경로 추적·프레젠테이션 | 빠진다(스크립트 0). 필요하면 문서 밖 링크로 Archify HTML 을 따로 준다 |
95
+ | 다크/라이트 | 라이트만 굳힌다(`colorScheme: light`) |
96
+ | 애니메이션(`trace`) | 걷는다 — `reducedMotion` + `animation:none` 으로 정지 상태를 굳힌다 |
97
+ | 브랜드 마크(`brand`) | `data:image/` 로 박힌 것만 남고 외부 주소는 걷힌다 |
98
+ | 뷰어 UI 언어(`meta.locale`) | 무관 — 뷰어가 안 실린다 |
99
+
100
+ ## 4. 하지 않는 것
101
+
102
+ - Mermaid 를 관보에 직접 싣지 않는다. Mermaid 원문은 Archify 의 입력이다(Archify `SKILL.md` 「Mermaid input」) — Archify IR 로
103
+ 다시 쓰고 위 절차를 밟는다.
104
+ - SVG 를 손으로 고치지 않는다. 고칠 것은 IR 이고, 굳히기는 다시 돌린다(재현성).
105
+ - 도해 하나에 문장을 넣지 않는다(R4). 설명은 캡션 한 문장과 본문.
@@ -119,3 +119,5 @@
119
119
  뒤늦게 돌린 세 관점 검토(선형 독자·규칙 대조·사실 대조 + 반박)가 낮은 지적 14를 냈다 — 같은 답 묶음 안의 전제 되풀이, 주어가 빠져 「4차가 접수한 것」으로 읽히는 출처 줄, 인쇄에서 죽는 「누르면」, 절 이름과 부제의 되풀이. → 16판 8자리 · `edition-review.workflow.js` · 0.5단계 표 7행 · 체크리스트 7단계 독자 검토 행.
120
120
  - **검사기가 남의 문서의 절 번호를 뒤 절로 오인** — R12h 정규식이 「검수 보고 4차 제5절」·「제10절」·「제11절」을 이 문서(7절까지)의 뒤 절로 세어, 15판이 세 자리의 위치 구절을 억지로 지웠다(3.17kg 의 자리가 사라짐).
121
121
  → `text_scan` W5 「N차 … 제N절」 예외 · 16판이 표 이름(「두 계산식의 차이 실측」)으로 위치를 되살림. 표 번호 선참조(「표 7-1」)를 셀지는 미결.
122
+ - **사용자 결정 둘(2026-09-15)** — 두 물음 「읽는 법에 확인 요청 한 줄을 둬도 되나」·「「바로 반영」 지시가 판 갱신 검토보다 앞서도 되나」에 둘 다 「응」.
123
+ → SKILL 5a 요청 자리 목록·108행·0.5단계 7행 · process.md · lim-portal-format §10 경어체 행·§12.5b · genetics lim 결정 두 장.
@@ -262,6 +262,8 @@ python3 assets/render.py <report.json>
262
262
  | `note` | `kind:"status"` 에서 표 아래 한 줄 | 그 줄이 빠진다 |
263
263
  | `flow` | 의존 흐름도 한 개(11-2절). `kind` 와 무관하다 | 도해가 빠진다 |
264
264
  | `plates` | 절 본문 도판의 `assets[].id` 목록(11-1절) | 도판이 빠진다 |
265
+ | `quotes` | 원문 인용 목록(11-8절). `kind` 와 무관하다 | 인용이 빠진다 |
266
+ | `diagrams` | 도해(인라인 SVG) 목록(11-9절). `kind` 와 무관하다 | 도해가 빠진다 |
265
267
 
266
268
  ### ⚠ `no` 와 `id` 는 **안 읽힌다**
267
269
 
@@ -424,13 +426,13 @@ python3 assets/render.py <report.json>
424
426
  |---|---|---|
425
427
  | 「고객사 로고가 SVG 로 등록돼 있어 표지에 못 싣습니다」·「표지용 파생본이 아직 없습니다」 | 소속처 로고 설정의 상태다 | 소속처 관리 화면(사람) |
426
428
  | 「바깥에서 받아 오는 것이 있습니다」 — 그 호스트가 **본문 링크**(`[글자](주소)`·맨 주소·건 `source_url`)뿐일 때 | 입고 검사가 `<a href>` 호스트까지 센다(§11-6). 누르는 링크는 받아 오는 자원이 아니다. `<img src>` 등으로 뜨면 작성자 몫 | 서버 검사 수리 전까지 사람이 호스트 목록을 대조 |
427
- | 경어체 경고 — PART I 간지(`parts[]`)의 요청 문장에서만 날 때 | PART I 간지는 요청 자리(§14-2)인데 서버 문체 관문이 이 자리는 아직 센다 | 사람이 자리를 확인 |
429
+ | 경어체 경고 — PART I 간지(`parts[]`)의 요청 문장이나 읽는 법(`guide`)의 확인 요청 한 줄에서만 날 때 | 둘 다 요청 자리(§14-2 · §12.5b)인데 서버 문체 관문이 이 자리는 아직 센다 | 사람이 자리를 확인 |
428
430
  | 레포의 렌더러·서버 관문이 운영보다 앞선 동안, 새 규칙대로 고친 자리에 운영 `dry_run` 이 옛 규칙으로 내는 경고 | 운영은 배포된 판으로 센다 — 되돌리면 새 규칙에 걸리고, 배포되면 사라진다 | 새 판에서 0 인지 먼저 잰다 — 렌더러 경고는 레포 작업본을 부르는 로컬 `render.py`, 서버 문체 관문·입고 검사·서식 등록부 칸은 레포 개발 스택의 `dry_run`(절차: genetics lim `cases/dev-스택이-OrbStack-덧판https-base_url으로-떠-있으면-…`). 0 이면 핸드오프에 「배포 뒤 해소」 한 줄 |
429
431
 
430
432
  요청 절의 경어체는 이제 예외가 아니다. 서버 문체 관문(`report_tone.php report_tone_warnings()`)은 요청 자리(`open_items[].body`·`cta`·
431
433
  `colophon.note`·`asks` 절 `marg`)와 「」 인용을 빼고 세고, 로컬 `tone.mjs` 는 판단 항목 본문과 「」 인용을 뺀다.
432
434
  ⚠ 서버 쪽 자리 가림은 운영 반영 확인 전(2026-09-14 갈래)이다 — 배포 전의 운영 `dry_run` 이 요청 자리에서 내는 경어체 경고는 이 표의 셋째 행처럼 자리를 확인하고 넘긴다. 그래도 경어체 경고가
433
- 뜨면 기록 자리(`open_items[].title` 포함)나 `guide` 에 요청 문장이 샌 것이다 — 요청 문장은 요청 절로 옮긴다(SKILL 5a 「보고 칸에 요청문을 두지 마라」).
435
+ 뜨면 기록 자리(`open_items[].title` 포함)나 `guide` 에 요청 문장이 샌 것이다 — 요청 문장은 요청 절로 옮긴다(SKILL 5a 「보고 칸에 요청문을 두지 마라」). 단 `guide` 에서 요청 절의 확인 요청을 가리키는 한 줄은 허용한다(2026-09-15 사용자 결정) — 그 한 줄에서만 나는 경어체 경고는 §10 통과 기준 표의 행으로 넘긴다.
434
436
  건의 `how_to_check` 에서 걸린 명령형은 「보고 칸에 요청문이 N곳 있습니다 — 요청 절(open_items)로 옮깁니다」로 따로 뜬다.
435
437
  톤 게이트는 경고이지 거절이 아니다(실측 2026-09-11: 경어체 경고를 안은 `update_report` 2회 모두 발행 성공).
436
438
  「경고 0」을 요청 자리를 개조식으로 내려서 맞추려다 **말투 반려가 네 번 났다**(genetics `decisions/고객-문서-요청-자리는-하십시오체로-맺는다-…`).
@@ -447,7 +449,15 @@ python3 assets/render.py <report.json>
447
449
 
448
450
  | ⚠ | 문턱 | 처방 |
449
451
  |---|---|---|
450
- | 절 N 「이름」이 글로만 서 있습니다(M자) | 산문 400자 이상인데 표·흐름도·차트·도판 0 | 그 절의 요지를 표·흐름도·차트·도판 중 하나로 세운다(§11-1~11-4) |
452
+ | 절 N 「이름」이 글로만 서 있습니다(M자) | 산문 400자 이상인데 표·흐름도·차트·도판·인용·도해 0 | 그 절의 요지를 표·흐름도·차트·도판·인용·도해 중 하나로 세운다(§11-1~11-9) |
453
+ | 절 %s 인용 %d 에 출처 줄이 없습니다 — 원본 위치 한 구절(주소·쪽·행)을 적습니다 | `quotes[]` 에 `source_text`·`source_url` 둘 다 없다 | 원문의 위치 한 구절(주소·쪽·행)을 적는다(§11-8) |
454
+ | 절 %s 도해 「%s」의 글자가 표시 %dpx 로 섭니다 — %dpx 이상이 되게 wide 로 두거나 노드를 줄입니다 | 도해 SVG 의 가장 작은 font-size × (표시 폭 ÷ viewBox 폭) < 15px(readability R1 과 같은 잣대) | `wide: true` 로 전폭에 세우거나 노드·라벨을 줄인다(§11-9) |
455
+ | 절 %s 도해 「%s」가 %d바이트입니다 — 상한 %d바이트, 노드를 줄이거나 도판(PNG)으로 싣습니다 | `diagrams[].svg` 가 250,000B 초과 | 도해를 나누거나 PNG 도판으로 |
456
+ | 절 %s 도해 「%s」에 viewBox 가 없거나 svg 가 아닙니다 — 폭을 알 수 없어 싣지 않습니다 | 루트 `<svg>` 에 viewBox 가 없다 | `diagram.mjs export` 로 굳힌 SVG 를 넣는다(§11-9) |
457
+ | 절 %s 시계열 「%s」의 표식 「%s」가 점에 없습니다 — marks[].x 는 points[].x 와 같은 값이어야 섭니다 | `charts[].marks[].x` 가 어느 `points[].x` 와도 같지 않다 | 점의 x 값 그대로 적는다(§11-7) |
458
+ | 절 %s 도해 「%s」의 ir 는 %s 입니다 — 관보가 직접 그리는 것은 workflow 뿐, 다른 종류는 svg 로 굳혀 넣습니다 | `diagrams[].ir.diagram_type` 이 `workflow` 가 아니다 | Archify 로 그린 뒤 `diagram.mjs export` 의 svg 를 넣는다(§11-9) |
459
+ | 절 %s 도해 「%s」의 노드 「%s」 라벨이 두 줄을 넘습니다 — 낱말을 줄이거나 wide 로 두십시오 | 노드 폭(열 폭 − 간격)에서 15px 글자로 두 줄을 넘는 라벨 | 라벨을 줄이거나 `wide: true` |
460
+ | 절 %s 도해 「%s」의 노드 「%s」가 없는 레인 「%s」를 가리킵니다 | `nodes[].lane` 이 `lanes[].id` 에 없다 | Archify validate 를 먼저 통과시킨다 |
451
461
  | 절 N 「이름」의 k번째 문단이 M자입니다 | 문단 한 개 220자 초과(세 줄) | 두 문장으로 끊거나 수치를 표로 내린다 |
452
462
  | 절 N 「이름」 산문에 참조 번호가 M개입니다 | 산문(문단·도입문·여백 주석)에 6.6·2.12a 같은 번호 4개 이상 | 번호는 표·건·판단 항목에만, 산문은 뜻으로 잇는다 |
453
463
  | 판단 요청 N항이 산문으로만 섭니다 | `open_items` 6항 이상인데 asks 절에 표·흐름도 0 | 한눈표(항 · 지금 · 그대로 두면 · 바꾸면 — 두 길 대칭, 권고 열·시한 칩 없음) + 관문 흐름도(§11-2). |
@@ -638,6 +648,10 @@ CSS 로는 못 한다. 우측 판독부에 남는 것은 문서 전체의 사실
638
648
  | `cells[].note` | 칸의 둘째 줄(작은 글자). 조건·한정을 담는다 |
639
649
  | `cells[].path` | 경로·기술 문자열. 별도 활자로 서고 `/` 앞에서 끊어 읽는다 |
640
650
 
651
+ **`mode: "cause"` — 원인 사슬.** 「해야 할 것 → 이미 된 것 → 그러면」이 아니라 「사실 → 우리 상태 → 결과」를
652
+ 잇는 사슬(요금이 왜 붙었나, 장애가 왜 났나)에는 첫 칸의 노란 강조 면이 뜻을 비튼다. `"mode": "cause"` 를 주면
653
+ 그 면을 걷어 세 칸이 같은 무게로 선다. 열 수·칸 수 계약은 그대로다(2026-09-16).
654
+
641
655
  **그림 번호는 도판과 한 셈을 쓴다** — 한 절에 흐름도와 도판이 같이 있으면 본문 순서대로
642
656
  `그림 N-1`·`그림 N-2` 가 된다. 따로 세면 같은 번호가 두 번 나와 상호참조가 무엇을 가리키는지
643
657
  알 수 없게 된다.
@@ -810,6 +824,98 @@ CSS 로는 못 한다. 우측 판독부에 남는 것은 문서 전체의 사실
810
824
  - 짝이 안 맞거나 모르는 톤은 그대로 글자로 나간다 — 조용히 사라지지 않는다.
811
825
  - 편집기 서식 구간(`_runs`)과 함께 와도 된다. 구간이 태그를 씌운 뒤 표기를 푼다.
812
826
 
827
+ ## 11-7. 시계열 — 한 값이 시간에 따라 어떻게 갔나 (2026-09-16)
828
+
829
+ 분포 막대(11-4)는 「몇 개의 수를 견준다」. 하루·달 단위로 잰 값이 **언제 계단을 만드는지**는 선이어야 보인다 —
830
+ AWS 요금 조사(2026-09)에서 트래픽·로그·DB 용량이 8월 1일 앞뒤로 평평하다는 것을 막대로는 말할 수 없었다.
831
+
832
+ ```json
833
+ "charts": [
834
+ { "kind": "series", "caption": "ALB 처리량",
835
+ "unit": "GB", "points": [{ "x": "2026-05-01", "y": "8.7" }, { "x": "2026-05-02", "y": "10.5" }],
836
+ "marks": [{ "x": "2026-08-01", "label": "8/1 과금 시작" }],
837
+ "note": "하루 단위 합산." }
838
+ ]
839
+ ```
840
+
841
+ | 칸 | 뜻 |
842
+ |---|---|
843
+ | `kind` | `"series"`. 없으면 분포 막대다 |
844
+ | `points[].x` · `.y` | x 는 `YYYY-MM-DD` 가 기본(달 눈금과 달별 글자 행을 자동으로 세운다). 그 밖의 문자열도 된다(여섯 눈금). y 는 표기 그대로 |
845
+ | `marks[].x` · `.label` | 사건 세로선. x 는 어느 `points[].x` 와 **같은 값**이어야 선다(아니면 ⚠) |
846
+ | `summary[]` | `{label, value, note?}` — 글자 행을 손으로 줄 때. 없으면 달마다 평균·최대를 자동으로 적는다 |
847
+ | `unit` · `caption` · `note` | 막대와 같다 |
848
+
849
+ 인라인 SVG 로 그리되 **스크립트는 0** 이다. 글자(눈금·표식 라벨)는 SVG text 인데 CSS 활자 등급(`--t-sm`)을
850
+ 물려받아 본문과 같은 크기로 선다. 값을 전부 글자로 남길 수 없으므로 **달마다 평균·최대**가 글자 행으로 남는다 —
851
+ 막대와 같은 원칙(그림이 안 보여도 문서가 선다). 그림 번호는 막대·흐름도·도판과 한 셈이다.
852
+
853
+ ## 11-8. 원문 인용 — 문구를 원문 그대로 (2026-09-16)
854
+
855
+ 스킬 「반드시 지키는 것」 11 은 「인용은 원문 문구 그대로」라고 하는데, 관보에는 그 자리가 없었다 — 표 칸은
856
+ 20자, 산문은 우리 글이다. 공식 문서·계약·회신의 문구를 **손대지 않고** 싣는 자리다.
857
+
858
+ ```json
859
+ "quotes": [
860
+ { "text": "Starting March 1, 2024, Amazon RDS automatically charges you for RDS Extended Support.",
861
+ "lang": "en",
862
+ "source_text": "AWS 문서 › Amazon RDS Extended Support (4문단)",
863
+ "source_url": "https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/extended-support.html",
864
+ "verdict": "직접 확인",
865
+ "translation": "표준 지원이 끝난 다음 날부터 자동으로 과금함." }
866
+ ]
867
+ ```
868
+
869
+ | 칸 | 뜻 |
870
+ |---|---|
871
+ | `text` | 원문 그대로. 인라인 표기(굵게·칩)를 **풀지 않는다**. 줄바꿈은 그대로 선다 |
872
+ | `lang` | 원문 언어 코드. `en` 이면 낱말 단위 접기가 라틴 규칙으로 바뀐다 |
873
+ | `source_text` · `source_url` | 출처 줄(도판과 같은 장치). **둘 다 없으면 ⚠** — 독자가 원본에 닿아야 인용이다 |
874
+ | `verdict` | 도판과 같은 축(직접 확인 · 조사 보고 · 미확인) — 캡션 끝 칩 |
875
+ | `translation` | 우리말 풀이 한 문장(선택). 우리 글이므로 표기를 푼다 |
876
+
877
+ 인용은 절 본문의 **맨 앞**에 선다(원문이 가장 강한 근거이고 표·도해는 그것을 줄인 것). `kind` 와 무관하다.
878
+ 번호는 없다 — 그림·표가 아니다.
879
+
880
+ ## 11-9. 도해 — Archify 를 흡수한다 (2026-09-16)
881
+
882
+ 구조·흐름·순서·데이터 흐름·상태 전이는 Archify(`tt-a1i/archify`, 에이전트 스킬)로 그린다. 관보에는 그 산출물의
883
+ **정지 SVG 만** 인라인으로 앉힌다 — 절차는 스킬 `references/diagrams.md`, 굳히는 도구는 `assets/diagram.mjs`.
884
+
885
+ ```json
886
+ "diagrams": [
887
+ { "id": "upgrade-path", "caption": "업그레이드가 지나는 세 관문",
888
+ "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 520\">…</svg>",
889
+ "alt": "스냅샷 복원 → 시험 → 운영 적용", "verdict": "직접 확인", "wide": true,
890
+ "origin": "archify workflow v2 · ir/upgrade-path.workflow.json" }
891
+ ]
892
+ ```
893
+
894
+ | 칸 | 뜻 |
895
+ |---|---|
896
+ | `ir` | **Archify workflow IR 그대로**(`schema_version:2`·`diagram_type:"workflow"`·lanes·phases·nodes·edges·mainPath). 관보가 **자기 활자(15px)·장 색**으로 다시 그린다 — Archify 의 SVG 는 8~11px 활자라 전폭에서도 10px 에 그친다(실측 2026-09-16). `svg` 가 같이 있으면 `svg` 가 이긴다 |
897
+ | `svg` | `diagram.mjs export` 가 굳힌 SVG 문자열(workflow 밖 종류의 길 — R1 ⚠ 를 감수하고 크게 보기로 읽힌다). 서버가 다시 걷는다 — 스크립트·스타일·foreignObject·이벤트·애니메이션·외부 href(문서 안 `#`·`data:image/` 만 남는다). 루트 width/height 는 버리고 viewBox 로 선다 |
898
+ | `id` | `{{그림:id}}` 로 가리키는 이름 · 메모가 무는 `data-uid` |
899
+ | `caption` · `alt` · `source_text` · `verdict` · `note` | 도판과 같다. 우리가 그린 도해의 출처 줄은 비운다(R12e) |
900
+ | `wide` | 전폭(1030px). 글자가 표시 15px 에 못 미치는 넓은 도해는 켠다 — 그리드 밖, 절 끝에 선다 |
901
+ | `origin` | 렌더 안 됨 — IR 경로·생성 도구를 남긴다 |
902
+
903
+ 관보가 `ir` 에서 읽는 칸(그 밖은 무시한다 — `groups`·`views`·`semanticChecks`·`brand`·좌표 힌트):
904
+
905
+ | IR 칸 | 관보에서 |
906
+ |---|---|
907
+ | `diagram_type` | `workflow` 만 그린다 |
908
+ | `lanes[].id` · `.label` | 가로 띠와 왼쪽 이름 |
909
+ | `phases[].label` · `.fromCol` · `.toCol` | 위 단계 띠(열 묶음) |
910
+ | `nodes[].id` · `.lane` · `.col` · `.label` · `.sublabel` · `.type` · `.variant` | 상자 — `type:security`·`variant:security` 는 위험색 테두리, `type:external`·`variant:dashed` 는 파선 |
911
+ | `edges[].from` · `.to` · `.label` · `.variant` | 간선 — 오른쪽 열로 가면 곧은 선·꺾인 선, 같은 열이나 왼쪽으로 가면 위 채널 |
912
+ | `mainPath` | 그 순서로 이어진 노드·간선을 장 색 굵은 선으로 |
913
+
914
+ **기본은 `ir` 다.** Archify 가 검증한 workflow IR 을 그대로 넣으면 관보가 레인·단계·노드·간선·주 경로를 15px 활자로 그린다 — 되돌아가는 간선은 위 채널, 위험(security)은 위험색 테두리, 외부(external)·점선은 파선. 노드 라벨은 두 줄까지(넘치면 ⚠). architecture·sequence·dataflow·lifecycle 은 `svg` 로.
915
+
916
+ 관문(⚠, §10-1): 바이트 250,000 초과 · viewBox 없음 · **가장 작은 글자 × (표시 폭 ÷ viewBox 폭) < 15px**(readability R1, `svg` 길에만).
917
+ `diagram.mjs` 가 같은 잣대로 먼저 재므로 렌더러 ⚠ 는 마지막 그물이다. 그림 번호는 차트 → 흐름도 → 도해 → 도판 순.
918
+
813
919
  ## 12. 판정 밖의 두 모드 — 가르치는 문서 · R&D 브리핑
814
920
 
815
921
  독자가 **판정**하는 문서(검수 보고)와 **배우는** 문서, **결정하는** 문서는 뼈대가 다르다.
@@ -991,7 +1097,7 @@ Submissions·WHO/SUPPORT 정책 브리프(1:3:25)가 **같은 뼈대**를 요구
991
1097
  ```
992
1098
 
993
1099
  - 표지 `meta`·`notice` 에는 사실문으로만 올린다(「시험판 확인은 받으신 뒤 7일 안」). 요청 문장은 이 건 하나에만 둔다.
994
- - `guide`(읽는 법)·표지·현황 줄·다른 절에 「확인 부탁드립니다」를 흩어 두지 않는다 — 요청은 요청 절에만(SKILL 5a 「보고 칸에 요청문을 두지 마라」).
1100
+ - 표지·현황 줄·다른 절에 「확인 부탁드립니다」를 흩어 두지 않는다 — 요청은 요청 절에만(SKILL 5a 「보고 칸에 요청문을 두지 마라」). `guide`(읽는 법)에는 이 건을 가리키는 요청 한 줄을 둘 수 있다(「시험판 확인은 확인 프로필 표의 네 경우로 부탁드립니다」 꼴, 2026-09-15 사용자 결정).
995
1101
  - 제목이 「… 확인 요청」으로 끝나면 렌더러가 기한 ⚠ 를 「확인 요청 「…」에 기한이 없습니다」로 가른다 — 결정 물음 문구(「결정을 요청한 것이 아닙니다」)로 오분류되지 않는다.
996
1102
  - 무엇을 확인하면 되는지는 §12.3b 「확인 프로필」 표가 받는다.
997
1103
 
@@ -283,7 +283,7 @@ RANK_TAG = ['live', 'data', 'done', 'soon'] # 배지 종류
283
283
  그래서 검수·보고 문서의 `open_items[].title` 은 전부 1인칭이다 — `검증에 쓴 표본이 작음`, `같은 전화번호를 쓰는 계정의 주인은 우리가 판단할 수 없음`.
284
284
  결정 문서(브리핑)의 판단 항목은 다르다 — 고객이 고를 **물음**이다(SKILL 0.5단계 5행 · lim-portal-format §12.5b).
285
285
  독자의 할 일이 둘이면(결정 + 시험판 확인) 둘째는 `open_items` 두 번째 건 「… 확인 요청」으로 두고 본문 첫 문장에 상대 기한을 넣는다 —
286
- 표지·현황 줄에는 사실문으로만 올리고, 읽는 법(`guide`)에 요청문을 두지 않는다(보고 자리, SKILL 5a). 집행자: `gazette.py` `brief_checks()` 기한 ⚠(「확인 요청」 문구로 갈림) · 독자 검토 decider 관점.
286
+ 표지·현황 줄에는 사실문으로만 올린다. 읽는 법(`guide`)에는 요청 절의 확인 요청을 가리키는 요청 한 줄을 둘 수 있다(2026-09-15 사용자 결정) — 그 밖의 요청문은 두지 않는다(보고 자리, SKILL 5a). 집행자: `gazette.py` `brief_checks()` 기한 ⚠(「확인 요청」 문구로 갈림) · 독자 검토 decider 관점.
287
287
 
288
288
  | 규칙 | 어기면 |
289
289
  |---|---|
@@ -568,7 +568,7 @@ RANK_TAG = ['live', 'data', 'done', 'soon'] # 배지 종류
568
568
  도구가 `publish` 를 명시적으로 참으로 주지 않는 한 고객에게 안 보인다. 여는 것은 10단계다.
569
569
 
570
570
  수정은 SKILL.md 8단계 「수정 절차」(`get_report` 머리줄 확인 → 백업 → 고침 → 로컬 렌더·dry_run·독자 검토 → `update_report` → 9단계).
571
- **같은 링크가 새 내용을 가리킨다.** 초안 `update_report` 도 **본문 판(`body_rev`)** 을 올리고 사용자가 그 판을 읽으므로 독자 검토를 통과한 본문 판만 올린다 — 발행 이력 행(`history`)은 공개 뒤에만 는다(SKILL 3c).
571
+ **같은 링크가 새 내용을 가리킨다.** 초안 `update_report` 도 **본문 판(`body_rev`)** 을 올리고 사용자가 그 판을 읽으므로 독자 검토를 통과한 본문 판만 올린다. 사용자가 「바로 반영」을 지시하면 먼저 올리고 검토를 곧바로 뒤따라 돌린다 — 발행 이력 행(`history`)은 공개 뒤에만 는다(SKILL 3c).
572
572
  사람이 고친 초안이면 덮기 전에 묻는다 — `update_report` 에 `body_rev` 잠금 칸이 아직 없어 기계가 막지 않는다.
573
573
 
574
574
  포털 셸이 문서 **둘레**에 놓는 것(검토 회신·핵심 요약·진척률 바)은 저작 대상이 아니다.
@@ -97,9 +97,11 @@ get_case(tenant, "work/<slug>.md")
97
97
 
98
98
  ### 훅이 없을 때
99
99
 
100
- 세포 미설치 기계나 codex 에서는 소속 한 줄이 안 옵니다. 그때는 **사람에게 일의 이름을 묻습니다.**
101
- 일의 목록은 군체 화면에 있고, 이름을 지어내거나 세션 목록에서 추측하지 않습니다.
102
- `search_cases` 로 「일」을 검색하는 것도 답이 아닙니다 — 소속은 사람이 누른 것만입니다.
100
+ 세포 미설치 기계나 codex 에서는 소속 한 줄이 안 옵니다. 열린 일이 **이미 있으면** 사람에게
101
+ 일의 이름을 묻거나 군체 화면에서 고르게 합니다. 열린 일이 **0건이면** 군체 화면으로 보내지
102
+ 않습니다 — 고를 일이 없습니다. 그 과업의 결정을 `remember_decision` 에 남기되 `work` 에
103
+ 열쇠를 적습니다. 저장 즉시 「계획」으로 섭니다. 이름을 세션 목록에서 추측하지 않습니다.
104
+ `search_cases` 로 「일」을 검색하는 것도 소속 확정이 아닙니다 — 소속은 사람이 누른 것만입니다.
103
105
 
104
106
  ## 커밋·배포 직전의 의식
105
107
 
@@ -135,7 +137,8 @@ get_case(tenant, "work/<slug>.md")
135
137
 
136
138
  ## 무엇을 하지 않는가
137
139
 
138
- - **내 일을 스스로 정하지 않습니다.** 소속은 사람이 군체 화면에서 누릅니다.
140
+ - **세션 소속을 스스로 확정하지 않습니다.** 열린 일이 있으면 소속은 사람이 군체 화면에서 누릅니다.
141
+ - **열린 일이 0건이면 군체 화면으로 보내지 않습니다.** 정문은 `remember_decision` 의 `work` 열쇠다.
139
142
  - **세포·훅·소속처를 대신 세우지 않습니다.** 안 서 있으면 말하고 멈춥니다.
140
143
  - **두뇌 초안을 사실로 옮기지 않습니다.** 「요약이지 관측이 아니다」는 표제가 붙은 이유입니다.
141
144
  - **동기화를 핑계로 남의 작업분을 정리하지 않습니다.** 읽는 것과 고치는 것은 다른 결정입니다.