@litfamily/litopencode 1.0.15 → 1.0.17

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 (118) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README-Ko-KR.md +11 -11
  3. package/README.md +11 -11
  4. package/dist/activation-routing.js +1 -1
  5. package/dist/auto-handoff.js +34 -1
  6. package/dist/features.js +2 -2
  7. package/dist/skills.js +6 -4
  8. package/docs/assets/readme/badge-version.svg +1 -1
  9. package/docs/reference-Ko-KR.md +1 -1
  10. package/package.json +1 -1
  11. package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +1 -3
  12. package/skills/lit-docx/SKILL.md +80 -19
  13. package/skills/lit-docx/references/components.md +253 -0
  14. package/skills/lit-docx/references/direction-step.md +234 -0
  15. package/skills/lit-docx/references/examples/01-report-ko.md +160 -0
  16. package/skills/lit-docx/references/examples/02-brief-ko.md +58 -0
  17. package/skills/lit-docx/references/examples/03-manual-ko.md +107 -0
  18. package/skills/lit-docx/references/examples/04-proposal-ko.md +93 -0
  19. package/skills/lit-docx/references/examples/05-memo-ko.md +42 -0
  20. package/skills/lit-docx/references/examples/06-journal-en.md +84 -0
  21. package/skills/lit-docx/references/examples/07-report-en.md +137 -0
  22. package/skills/lit-docx/references/examples/08-journal-ko.md +93 -0
  23. package/skills/lit-docx/references/examples/09-brief-en.md +64 -0
  24. package/skills/lit-docx/references/page-composition.md +306 -0
  25. package/skills/lit-docx/references/tonalities/brief.md +104 -0
  26. package/skills/lit-docx/references/tonalities/journal.md +101 -0
  27. package/skills/lit-docx/references/tonalities/manual.md +111 -0
  28. package/skills/lit-docx/references/tonalities/memo.md +105 -0
  29. package/skills/lit-docx/references/tonalities/proposal.md +101 -0
  30. package/skills/lit-docx/references/tonalities/report.md +126 -0
  31. package/skills/lit-docx/run.py +2 -1
  32. package/skills/lit-docx/scripts/convert_md_to_docx.py +384 -67
  33. package/skills/lit-docx/scripts/craft_docx.py +204 -1
  34. package/skills/lit-docx/scripts/docx_design.py +2445 -0
  35. package/skills/lit-docx/scripts/docx_layout.py +959 -0
  36. package/skills/lit-docx/scripts/slop_lint.py +23 -6
  37. package/skills/lit-docx/templates/tonalities/brief.yaml +29 -0
  38. package/skills/lit-docx/templates/tonalities/journal.yaml +26 -0
  39. package/skills/lit-docx/templates/tonalities/manual.yaml +27 -0
  40. package/skills/lit-docx/templates/tonalities/memo.yaml +27 -0
  41. package/skills/lit-docx/templates/tonalities/proposal.yaml +27 -0
  42. package/skills/lit-docx/templates/tonalities/report.yaml +27 -0
  43. package/skills/lit-pptx/NOTICE.md +1 -1
  44. package/skills/lit-pptx/SKILL.md +108 -19
  45. package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Bold.otf +0 -0
  46. package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Regular.otf +0 -0
  47. package/skills/lit-pptx/references/density-and-fill.md +283 -0
  48. package/skills/lit-pptx/references/direction-step.md +249 -0
  49. package/skills/lit-pptx/references/examples/01-ops-review-ledger-ko.md +173 -0
  50. package/skills/lit-pptx/references/examples/02-launch-pitch-signal-en.md +153 -0
  51. package/skills/lit-pptx/references/examples/03-field-survey-atlas-ko.md +120 -0
  52. package/skills/lit-pptx/references/examples/04-lecture-chalk-ko.md +132 -0
  53. package/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +162 -0
  54. package/skills/lit-pptx/references/examples/06-policy-briefing-gazette-ko.md +176 -0
  55. package/skills/lit-pptx/references/examples/07-annual-story-studio-en.md +131 -0
  56. package/skills/lit-pptx/references/examples/08-reliability-keynote-night-en.md +182 -0
  57. package/skills/lit-pptx/references/examples/09-status-update-ledger-en.md +147 -0
  58. package/skills/lit-pptx/references/examples/10-investor-pitch-signal-ko.md +136 -0
  59. package/skills/lit-pptx/references/examples/11-forecast-review-night-ko.md +177 -0
  60. package/skills/lit-pptx/references/examples/12-exhibition-proposal-studio-ko.md +149 -0
  61. package/skills/lit-pptx/references/layout-families.md +470 -0
  62. package/skills/lit-pptx/references/title-treatments.md +271 -0
  63. package/skills/lit-pptx/references/tonalities/atlas.md +132 -0
  64. package/skills/lit-pptx/references/tonalities/chalk.md +132 -0
  65. package/skills/lit-pptx/references/tonalities/gazette.md +137 -0
  66. package/skills/lit-pptx/references/tonalities/ledger.md +151 -0
  67. package/skills/lit-pptx/references/tonalities/night.md +148 -0
  68. package/skills/lit-pptx/references/tonalities/paper.md +136 -0
  69. package/skills/lit-pptx/references/tonalities/signal.md +148 -0
  70. package/skills/lit-pptx/references/tonalities/studio.md +149 -0
  71. package/skills/lit-pptx/scripts/compile-deck.js +68 -21
  72. package/skills/lit-pptx/scripts/craft-thresholds.json +45 -1
  73. package/skills/lit-pptx/scripts/craft_extras.py +37 -8
  74. package/skills/lit-pptx/scripts/deck_output.py +654 -0
  75. package/skills/lit-pptx/scripts/embed_fonts.py +2 -2
  76. package/skills/lit-pptx/scripts/layout_inventory.py +35 -2
  77. package/skills/lit-pptx/scripts/lib/directive-parser.js +2 -2
  78. package/skills/lit-pptx/scripts/lib/font-map.js +4 -4
  79. package/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
  80. package/skills/lit-pptx/scripts/lib/layout-resolver.js +403 -21
  81. package/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
  82. package/skills/lit-pptx/scripts/lib/render-adapter-html.js +3 -9
  83. package/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +500 -113
  84. package/skills/lit-pptx/scripts/lib/render-pack.js +3558 -0
  85. package/skills/lit-pptx/scripts/lib/slide-ast.js +55 -24
  86. package/skills/lit-pptx/scripts/lib/spec-validator.js +2 -2
  87. package/skills/lit-pptx/scripts/lib/template-registry.js +335 -11
  88. package/skills/lit-pptx/scripts/qa_deck.py +48 -13
  89. package/skills/lit-pptx/scripts/validate_pptx.py +17 -5
  90. package/skills/lit-pptx/specs/template-enrollment-contract.md +4 -4
  91. package/skills/lit-pptx/templates/boilerplate_professional.css +13 -13
  92. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
  93. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +5 -2
  94. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +20 -20
  95. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -11
  96. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +10 -7
  97. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +17 -17
  98. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +8 -8
  99. package/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +105 -0
  100. package/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +110 -0
  101. package/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +106 -0
  102. package/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +107 -0
  103. package/skills/lit-pptx/templates/tonalities/night/pack.yaml +106 -0
  104. package/skills/lit-pptx/templates/tonalities/paper/pack.yaml +111 -0
  105. package/skills/lit-pptx/templates/tonalities/signal/pack.yaml +107 -0
  106. package/skills/lit-pptx/templates/tonalities/studio/pack.yaml +105 -0
  107. package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +1 -1
  108. package/skills/lit-typographic-motion/engine/stage/capture.mjs +2 -2
  109. package/skills/lit-typographic-motion/engine/treatment.mjs +1 -1
  110. package/skills/lit-typographic-motion/fonts/pins.json +2 -2
  111. package/skills/lit-typographic-motion/gate.mjs +1 -1
  112. package/skills/lit-typographic-motion/references/stage.md +1 -1
  113. package/skills/lit-typographic-motion/references/style-bibles.md +2 -2
  114. package/skills/lit-typographic-motion/references/treatment.md +1 -1
  115. package/skills/lit-typographic-motion/references/type-craft.md +3 -3
  116. package/skills/managed-skill-manifest.json +288 -44
  117. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Bold.otf +0 -0
  118. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Regular.otf +0 -0
@@ -0,0 +1,271 @@
1
+ # Title treatments
2
+
3
+ A title treatment answers four questions at once: where the title sits, how large it is set, what
4
+ is drawn with it, and where the body starts. The engine knows eight treatments
5
+ (`scripts/lib/grid-resolver.js`, `TREATMENTS`). Each pack allows four or five of them, maps every
6
+ slide role to one default, and the renderer may pick another allowed one per slide when that slide
7
+ fills better under it. A deck therefore mixes several title looks, but every slide that uses one
8
+ treatment puts its title in exactly the same frame.
9
+
10
+ This file covers the geometry of each treatment, which packs allow it, how a slide gets its
11
+ treatment, the per-slide `title:` key, and what the gate checks.
12
+
13
+ ## Titles name a topic
14
+
15
+ Before geometry: every title and the cover subtitle is a noun-phrase label, never a sentence.
16
+
17
+ - Korean titles do not end in a sentence ending: no -다, -니다, -요, -죠, and no nominalised claim
18
+ in -함, -됨, -음 (for example -었음, 있음).
19
+ - English titles carry no finite verb (is, are, was, has, will, grew, rose, fell, leads, beats,
20
+ shows ...) and no closing period.
21
+ - A title ending in a question mark is not judged as a claim, and neither is a title that opens
22
+ with a quotation mark, which is how a quote slide stays legal (see `quote` below).
23
+ - A trailing parenthesis is ignored when the gate reads the ending, so `(예시)` does not rescue a
24
+ sentence.
25
+
26
+ | Sentence (fails OF-114) | Label (passes) |
27
+ |---|---|
28
+ | 김포 센터의 처리비가 가장 높다 | 거점별 건당 처리비 비교 |
29
+ | 오출고율이 크게 개선됨 | 분기별 오출고율 추이 |
30
+ | APAC latency fell by 100 ms | p99 latency by region, January to September |
31
+ | Config changes cause most incidents. | Incidents by root cause |
32
+
33
+ The claim moves into the slide: the first takeaway, a caption, or a `key-message` box. The gate
34
+ reports a sentence title as OF-114 HIGH under a tonality pack.
35
+
36
+ ## The eight treatments
37
+
38
+ Positions below are for the 16:9 canvas on the compact grid that density 10 uses: 24 pt side
39
+ margins, 12 columns 54 pt wide with 24 pt gutters, so column *a* starts at 24 + 78(*a* − 1) pt and a
40
+ span of *n* columns is 78*n* − 24 pt wide. The canvas is 960 x 540 pt; the content floor is y 486.
41
+ On the 4:3 canvas the same column spans apply to its own grid. Sizes are steps of the compact ramp:
42
+ title 26 pt, display 36 pt, cover 44 pt.
43
+
44
+ ### top-rule
45
+
46
+ - **Geometry.** Title across columns 1-12 at y 36, set at title size, one or two lines; the frame is
47
+ exactly as tall as its lines. A rule sits 6 pt under the frame: a short accent bar one column wide
48
+ and 4 pt thick in packs that list `accent-rule`, otherwise a 0.75 pt hairline across the full
49
+ width. The body starts 18 pt under the rule, so a one-line title gives a body from about y 92.
50
+ - **Budget.** Two lines at most. On 16:9 one line holds roughly 33 Hangul or 60 Latin characters.
51
+ - **For.** The workhorse for content, data and reference slides that read top to bottom.
52
+ - **Packs.** ledger, signal, chalk, paper, gazette.
53
+
54
+ ### top-plain-large
55
+
56
+ - **Geometry.** Title across columns 1-10 at y 36, at display size, no rule. One line takes a 54 pt
57
+ frame, two lines 102 pt (each with a little extra for descenders). The body starts 18 pt under it.
58
+ - **Budget.** Two lines; about 21 Hangul or 38 Latin characters per line.
59
+ - **For.** Slides read at a distance: image splits, comparisons, KPI rows and timelines in packs
60
+ built for rooms.
61
+ - **Packs.** signal, atlas, studio, night.
62
+
63
+ ### side-rail
64
+
65
+ - **Geometry.** Title in columns 1-4 from y 36, at title size, up to four lines; the frame keeps one
66
+ spare line so a rebalanced break never clips. Packs with `rail-fill` paint the rail from the
67
+ canvas edge to half a gutter past column 4 (in chalk the rail is the dark field with a white
68
+ title; elsewhere the light surface colour). Packs without it but with `hairline-rule` draw a
69
+ 0.75 pt line at the rail edge instead. The body is columns 5-12, starting level with the title.
70
+ - **Budget.** Four lines of a narrow measure: about 10 Hangul or 18 Latin characters a line.
71
+ - **For.** A data slide with its takeaway, a definition or method page, an editorial text page.
72
+ - **The rail under the title.** The rail carries what belongs beside the title: a comparison's
73
+ criteria labels, level with their rows; a chart's, table's, figure's or picture's takeaways; the
74
+ source and note at the rail's foot. A slide that would leave more than 40 % of the rail empty
75
+ takes another treatment unless the source pins `title: side-rail`, and the gate reports a pinned
76
+ rail left empty (OF-115).
77
+ - **Packs.** ledger, atlas, chalk, paper, gazette, studio, night.
78
+
79
+ ### band
80
+
81
+ - **Geometry.** A field-coloured band across the whole canvas from y 0 to 108. The title sits in it
82
+ across columns 1-11 at y 36, in the on-field colour. The body starts at y 120 on the compact step.
83
+ - **Budget.** Two lines, a little narrower than top-rule.
84
+ - **For.** Pages read like a document: Korean briefing pages, agenda pages, reference pages, and the
85
+ data pages of a dark keynote.
86
+ - **Packs.** gazette, night.
87
+
88
+ ### statement
89
+
90
+ - **Geometry.** The sentence or label itself is the slide: display size across columns 1-10, set in
91
+ balanced lines and centred on the body's vertical middle. Studio frames it between two hairlines
92
+ on the open page (its `display.statement: rules`). One support line may follow 24 pt below, in the
93
+ muted ink. There is no body zone.
94
+ - **Budget.** Three lines.
95
+ - **When it can be drawn.** No table, chart or image on the slide, and at most one text block
96
+ besides the title. A slide that breaks this falls back to another treatment.
97
+ - **For.** Pull quotes and the one framing line of a live pitch. Since the user's verdict on
98
+ density, a claim is not a slide title; most decks need no statement at all.
99
+ - **Packs.** signal, atlas, chalk, paper, studio, night. In ledger and gazette a `statement` slide is
100
+ drawn as the largest top title the pack has, and the compile log notes it.
101
+
102
+ ### overlay
103
+
104
+ - **Geometry.** A picture fills the canvas edge to edge, cropped to its own proportions. A dark
105
+ panel at 88 % opacity covers the lower left, from the canvas edge to just past column 7 and from
106
+ y 324 to 516; the title sits in it at y 348, columns 1-7, in the on-field colour. Contrast is
107
+ judged on the panel, never on the photograph.
108
+ - **Budget.** Two lines; about 19 Hangul or 34 Latin characters per line.
109
+ - **When it can be drawn.** Only on a slide with an image, and only in the `image-full` family,
110
+ which takes no other treatment. The image's alt text becomes the numbered caption.
111
+ - **Packs.** atlas, studio.
112
+
113
+ ### kicker-numeral
114
+
115
+ - **Geometry.** A real number at cover size in the accent colour sits in columns 1-2 at y 36; the
116
+ title runs beside it in columns 3-12 at y 48, at title size. The body starts at y 120.
117
+ - **Budget.** One line only.
118
+ - **Where the number comes from.** The engine supplies it; you never type it. On an `agenda` slide it
119
+ is never used: the rows are numbered, and a count beside the title read as a stray section number
120
+ (OF-119). On a content slide that follows a section slide it is that
121
+ section's part number (taken from the agenda position when the section title matches an agenda
122
+ entry, otherwise counted). Closings never take it. A slide with no such number cannot be drawn
123
+ under kicker-numeral, so slides before the first section never show it. A deck with an agenda and
124
+ no section therefore has one treatment fewer to mix; open a part when OF-110 asks for a third.
125
+ - **For.** The opening slide of a numbered part.
126
+ - **Packs.** ledger, chalk, gazette, night.
127
+
128
+ ### bottom-anchor
129
+
130
+ - **Geometry.** The title closes the page from below: columns 1-9 at title size, up to two lines,
131
+ its last line standing on the body floor (y 486), so a one-line title starts lower than a
132
+ two-line one. The 0.75 pt hairline across the width sits 12 pt above the title in packs that draw
133
+ hairlines, and the visual zone runs from y 36 down to 24 pt above the title: what a short title
134
+ does not use goes to the visual. The three columns beside the title stay empty by design.
135
+ - **Budget.** Two lines; about 25 Hangul or 45 Latin characters per line.
136
+ - **When it can be drawn.** The upper part must be a visual (chart, table, image or KPI row), or the
137
+ slide must hold at most one text block. A text-only slide with several blocks cannot take it.
138
+ - **For.** Chart-led, figure-led and photo-led slides where the picture comes first.
139
+ - **Packs.** ledger, signal, atlas, paper, studio.
140
+
141
+ ## Which packs allow what
142
+
143
+ | Treatment | ledger | signal | atlas | chalk | paper | gazette | studio | night |
144
+ |---|---|---|---|---|---|---|---|---|
145
+ | top-rule | yes | yes | | yes | yes | yes | | |
146
+ | top-plain-large | | yes | yes | | | | yes | yes |
147
+ | side-rail | yes | | yes | yes | yes | yes | yes | yes |
148
+ | band | | | | | | yes | | yes |
149
+ | statement | | yes | yes | yes | yes | | yes | yes |
150
+ | overlay | | | yes | | | | yes | |
151
+ | kicker-numeral | yes | | | yes | | yes | | yes |
152
+ | bottom-anchor | yes | yes | yes | | yes | | yes | |
153
+
154
+ ## How a slide gets its treatment
155
+
156
+ Each layout family has a slide role and a list of treatments its geometry can take
157
+ (`FAMILIES` in `grid-resolver.js`). The roles are content, data, data-takeaway, sequence, image,
158
+ statement, reference and definition. A `comparison` counts as data when its text is dense with
159
+ figures (about one digit in 25 characters) and as content otherwise. A closing is a content slide
160
+ whose title names the ask, so it takes only top-rule, band or top-plain-large; `closing-statement`
161
+ takes only statement.
162
+
163
+ The choice runs in three passes.
164
+
165
+ 1. **Resolver.** For every content slide the candidates are the pack's own title for the slide's
166
+ family when its `structure:` map names one (Paper draws a comparison as a ruled table under
167
+ `top-rule`, Chalk sets its criteria on the board rail under `side-rail`; that title holds even when
168
+ the deck already leans on it, so two tonalities of one source differ in structure and not only in
169
+ colour), else the pack's default for the slide's role; then the pack's other treatments that the family allows and that can be drawn on this
170
+ slide (title within budget, numeral available, image present, statement conditions met).
171
+ 2. **Renderer.** Each candidate is laid out and measured. The role default stays when its body fills
172
+ to the density band, it is not the previous slide's treatment, and it has not yet covered about a
173
+ third of the deck (at least three slides). Otherwise the candidate with the smallest empty band
174
+ wins, with small penalties for repeating the previous slide or a treatment the deck already leans
175
+ on. The variance dial stops new treatments once the deck reaches its maximum.
176
+ 3. **Variety pass.** On a deck of eight or more slides at variance 4 and up, the engine makes sure
177
+ at least three treatments appear, that no title zone (top, side, band, bottom) covers more than
178
+ 40 % of the content slides, and that the deck carries enough distinct layouts for OF-111. Each
179
+ move is printed: `variety: slide 3 drawn under bottom-anchor so no title zone covers more than
180
+ 40 % of the content slides`.
181
+
182
+ The last compile line lists the outcome, for example
183
+ `Treatments: 2:top-rule 3:top-rule 4:top-rule 5:top-rule 6:top-rule 8:side-rail 9:bottom-anchor`.
184
+ Covers and sections are absent from it: they draw their variant's own title.
185
+
186
+ ## The per-slide `title:` key
187
+
188
+ Put `title:` on the line after `layout:` to fix one slide's treatment:
189
+
190
+ ```text
191
+ ---
192
+ layout: chart-insight
193
+ title: bottom-anchor
194
+
195
+ ## 월별 출고 건수, 2025년과 2026년 비교
196
+ ```
197
+
198
+ The key set after `layout:` is closed: only `variant` and `title` are read, and the run of keys ends
199
+ at the first blank line or the first line that is not one of them. A mistyped key stays visible in
200
+ the body instead of being swallowed. The value must pass four checks or the compile stops with a
201
+ message naming the problem:
202
+
203
+ - it is one of the eight treatments;
204
+ - it is one of the pack's treatments;
205
+ - the slide's family allows it;
206
+ - it can be drawn on this slide (budget, numeral, image, statement conditions).
207
+
208
+ A cover or section slide rejects `title:` because its variant owns the title, and a legacy template
209
+ rejects it because it has a single title look.
210
+
211
+ Use the key sparingly and for a reason you can state:
212
+
213
+ - the gate reports OF-111 (too few layouts, or one layout over 40 % of the content slides) and a
214
+ different treatment on one repeated slide fixes it;
215
+ - a comparison of two argued options reads better across the page under a top title than squeezed
216
+ beside a rail (under a top title its labelled rows form a criteria grid);
217
+ - a table slide's takeaways are too short to sit beside it and you want the title below the table.
218
+
219
+ The examples in `examples/` use the key where the first compile showed one of these problems.
220
+
221
+ ## Reading the compile log
222
+
223
+ | Log line | Meaning | Action |
224
+ |---|---|---|
225
+ | `note: slide 7: the title is longer than the top-rule budget; shorten it` | No allowed treatment fits the title, so the first one is used anyway | Shorten the label; move detail into the first takeaway |
226
+ | `note: slide 4: ledger has no statement title, so the sentence is drawn as a top-rule title` | A statement slide in a pack without the statement treatment | Accept it, or turn the slide into a content family |
227
+ | `variety: slide 5 drawn under top-plain-large so the deck carries 5 layouts` | The variety pass moved a slide | None; check the slide visually |
228
+ | `Slide 3: title "overlay" is not one of the ledger treatments (...)` | A `title:` value outside the pack | Pick one of the listed treatments |
229
+ | `Slide 6: the comparison family does not take "statement"; it allows ...` | A `title:` value the family cannot draw | Pick from the listed ones |
230
+
231
+ ## What the gate checks
232
+
233
+ `node <skill>/run.mjs qa deck.pptx` prints JSON; any HIGH finding fails the gate. Six of its
234
+ deck-level checks concern titles:
235
+
236
+ - **OF-110.** The treatment is read from the title frame's geometry and what is drawn around it,
237
+ then compared with the name the compiler wrote on the shape (`title@side-rail`). A mismatch is
238
+ HIGH. A deck of eight or more slides must use at least three treatments, and no more than the
239
+ variance allows.
240
+ - **OF-111.** Content slides vary their composition: the title zone times the body's column
241
+ partition (one, two-even, two-asym, three, grid, full-bleed) must reach about 60 % of the
242
+ content-slide count in distinct values (capped at five), and no one layout may cover more than
243
+ 40 % of the content slides.
244
+ - **OF-113.** Every slide that uses a treatment keeps the same title frame (x, y, width, size).
245
+ A bottom title keeps its bottom edge instead of its top, which moves with the line count. Never
246
+ position a title by hand with `::: box`; the frame will drift and the check fails.
247
+ - **OF-114.** Titles and the cover subtitle are labels, as described at the top of this file.
248
+ - **OF-115.** A bottom title whose last line ends more than 12 pt above the body floor, and a side
249
+ rail more than 40 % empty under its title, fail. What stands in the rail under the title is the
250
+ rail's: it neither changes the side-rail reading nor counts as a column of the body (OF-111).
251
+ A text or picture column of a two-column body fails too when its tallest empty band, from the top
252
+ of the pair down to where the longer column ends, passes 40 % of the body; a source strip at its
253
+ foot counts as a block but does not hide the band above it.
254
+ - **OF-116.** `node <skill>/run.mjs qa deck.pptx --sibling other.pptx` compares two tonalities of
255
+ one source: at least two content slides (one on a deck of fewer than four) must take another title
256
+ zone or column partition.
257
+ - **OF-118.** A point that opens with a bold label and runs on in regular weight keeps a separator
258
+ after the label (`**요약:** …`). The compiler adds the colon when the source leaves it out, so this
259
+ fires on a label set by hand.
260
+ - **OF-119.** An agenda title stands without a numeral beside it; the agenda's rows carry the numbers.
261
+
262
+ ## Choosing well
263
+
264
+ - Let the roles do the work. A deck whose slides have real jobs (a table slide, a chart slide with a
265
+ takeaway, an agenda, a process) gets its variety from the pack's role map without any `title:`.
266
+ - A short title in a side rail reads as a design choice; a long one reads as a squeezed column.
267
+ Keep rail titles to eight Korean words or fewer.
268
+ - Use bottom-anchor when the visual is the evidence and the label names it after the reader has
269
+ looked: a big chart, a photo pair, a KPI row.
270
+ - Do not chase five treatments. Three or four that each mean something are better than five that
271
+ vary for their own sake.
@@ -0,0 +1,132 @@
1
+ # Atlas
2
+
3
+ Atlas is a picture book with captions. Photographs bleed to the edge, titles sit on dark panels
4
+ over pictures or under large images, text stays short and calm, and the photographs bring the
5
+ colour; the pack's own accent is a quiet navy. Pack file: `templates/tonalities/atlas/pack.yaml`.
6
+
7
+ ## Use it for
8
+
9
+ - Field surveys and site reports where the photographs are the evidence (현장 조사, 시설 점검).
10
+ - Product showcases, portfolios, exhibitions and places.
11
+ - Any deck where 30 % or more of the slides hold a real photograph or screenshot.
12
+
13
+ ## Wrong for
14
+
15
+ - Decks without real images: a look built around pictures turns into empty frames. Never ship grey
16
+ placeholder boxes; if there are no photographs, pick another pack.
17
+ - Results tables and charts: Atlas lists no table, chart or references family. A survey with a
18
+ results table belongs to studio (charts) or ledger (tables).
19
+ - Long reading text.
20
+
21
+ ## Palette roles
22
+
23
+ | Role | Colour | Used for |
24
+ |---|---|---|
25
+ | ground / surface | white / pale grey `#F3F4F5` | background, rail |
26
+ | ink / ink-muted | charcoal `#1A1D21` / grey `#555B63` | text |
27
+ | line | light grey `#D6D9DD` | hairlines |
28
+ | accent | muted navy `#2B4C7E` | the one marked figure or label |
29
+ | accent-deep / accent-tint | dark navy `#1B2F4E` / pale blue-grey `#E6ECF4` | deep text / number tint |
30
+ | field / on-field | charcoal / white | caption panels, cover plate, closing field |
31
+ | positive / negative | green `#1E7A3F` / red `#B3261E` | signed deltas |
32
+ | series | navy, grey, bronze, sage | charts, if any |
33
+
34
+ ## Type
35
+
36
+ Pretendard throughout. Compact ramp at density 10. Titles at normal tracking, display slightly
37
+ tight; figures proportional.
38
+
39
+ ## Dials
40
+
41
+ Density 10, variance 7: up to five treatments, which is all of Atlas's five.
42
+
43
+ ## Title treatments by role
44
+
45
+ | Role | Default treatment |
46
+ |---|---|
47
+ | content | side-rail |
48
+ | data | top-plain-large |
49
+ | data-takeaway | bottom-anchor |
50
+ | sequence | top-plain-large |
51
+ | image | overlay |
52
+ | statement | statement |
53
+ | reference | side-rail |
54
+ | definition | side-rail |
55
+
56
+ Treatments: overlay, bottom-anchor, side-rail, top-plain-large, statement. Overlay applies only to
57
+ `image-full`. The cover is drawn on a `plate`, the dark field under the text, that hugs the title
58
+ and its lines and bleeds off the page foot. A statement or quote stands on the whole-page field
59
+ (`drench`): a plate under the lower half would leave the page above it open.
60
+
61
+ ## Families and variants
62
+
63
+ Families: image-full, image-split, photo-grid, figure-pair, asymmetric-feature, kpi-row,
64
+ comparison, timeline, text-column, statement.
65
+
66
+ Covers: cover-full-image and cover-split-image (both take the first image in the deck; the cover
67
+ slide itself holds only the title), cover-typographic. Sections: section-image (needs its own
68
+ image), section-field. Closings: closing-contact-split, closing-ask.
69
+
70
+ Display devices: cover `plate`, statement `drench`, big number on a tint, closing step in a `band`.
71
+
72
+ ## Tables and charts
73
+
74
+ - Tables `light-grid`: no header fill, row rules, no banding, numbers right-aligned, totals bold.
75
+ A table can only appear inside a family that holds one (kpi-row, a closing).
76
+ - Charts: hairline gridlines, direct labels, annotation off.
77
+ - Images: bleed allowed, crop allowed, no frame; pictures are cropped to their box with their own
78
+ proportions, never stretched.
79
+
80
+ ## Decoration vocabulary
81
+
82
+ caption-band, hairline-rule, colour-field. Text is never placed straight on a photograph; the
83
+ panel carries it.
84
+
85
+ ## Fill behaviour
86
+
87
+ `fill-order`: anchor-visual, change-family, distribute, step-up. The picture takes the room first.
88
+
89
+ ## Writing for Atlas
90
+
91
+ - Every image line needs a caption that says what, where and when (`중류 31번 지점, 포장 들뜸과
92
+ 배수구 막힘, 9월 15일`). The caption is numbered automatically.
93
+ - Pair photographs with numbers on the next slide: a KPI row of survey counts, a timeline of works.
94
+ - A figure pair needs one interpretation line with figures (`밤 조도 3 lx, 권장값의 3분의 1`).
95
+ - In image paths use `assets/...` relative to the deck source; the skill ships no photographs.
96
+
97
+ ## Avoid
98
+
99
+ - Text placed straight on photographs.
100
+ - Images in card frames.
101
+ - More than three images in one row.
102
+ - Grey placeholder boxes in a delivered deck.
103
+
104
+ ## A sample fragment
105
+
106
+ ```text
107
+ ---
108
+ tonality: atlas
109
+ title: 해안 산책로 시설 점검
110
+ date: 2026-10-06
111
+ notice: 예시 데이터와 대체 사진
112
+ ---
113
+ layout: image-full
114
+
115
+ ## 북측 구간 데크 침하 지점
116
+
117
+ ![북측 3번 데크, 침하 4cm와 난간 흔들림, 9월 22일](assets/example-a.png)
118
+ ---
119
+ layout: figure-pair
120
+
121
+ ## 보수 전후의 남측 계단
122
+
123
+ ![보수 전, 디딤판 균열 7곳](assets/example-b.png)
124
+ ![보수 뒤, 미끄럼 방지 마감과 조명 2기](assets/example-c.png)
125
+
126
+ - 보수 뒤 야간 이용자는 하루 평균 140명에서 230명으로 늘었고 미끄럼 신고는 0건
127
+ - 출처: 예시 시설관리과 점검 기록(2026년 6~9월)
128
+ ```
129
+
130
+ ## Examples
131
+
132
+ - `examples/03-field-survey-atlas-ko.md`: Korean riverside park field survey, 9 slides.
@@ -0,0 +1,132 @@
1
+ # Chalk
2
+
3
+ Chalk is a good teacher's board, cleaned up. Numbered steps, one concept marked per slide, a fenced
4
+ box for the definition or the common mistake, slightly rounded surfaces, a dark green-black rail and
5
+ a warm rust accent for the thing being taught. Pack file: `templates/tonalities/chalk/pack.yaml`.
6
+
7
+ ## Use it for
8
+
9
+ - Lectures, training sessions and tutorials (강의, 특강, 사내 교육).
10
+ - Worked examples and how-to sequences with three or more steps.
11
+ - Research tutorials where definitions and formulas carry the talk.
12
+
13
+ ## Wrong for
14
+
15
+ - Decision decks: the step rhythm reads as padding to an executive.
16
+ - Data reviews: Chalk lists only `table-insight` for numbers, no chart family.
17
+ - Pitches.
18
+
19
+ ## Palette roles
20
+
21
+ | Role | Colour | Used for |
22
+ |---|---|---|
23
+ | ground / surface | off-white `#FAFBFC` / pale blue-grey `#EEF2F5` | background, aside boxes |
24
+ | ink / ink-muted | slate `#1F2933` / grey `#4E5A66` | text |
25
+ | line | grey `#CBD3DA` | rules |
26
+ | accent | rust `#9A3412` | the concept being taught, step numerals, formula |
27
+ | accent-deep / accent-tint | dark rust `#6B2409` / pale apricot `#FCEBE0` | table header text / table header fill |
28
+ | field / on-field | board green-black `#1F3B33` / white | the rail under a side title, cover rail |
29
+ | positive / negative | green `#1E7A3F` / red `#B3261E` | signed values |
30
+ | series | rust, board green, grey, blue | charts |
31
+
32
+ ## Type
33
+
34
+ Pretendard throughout. Compact ramp at density 10. Surfaces take a 6 pt radius; chalk is the only light pack
35
+ with rounded corners (night, on its dark ground, is the other).
36
+
37
+ ## Dials
38
+
39
+ Density 10, variance 6: up to four of its four treatments.
40
+
41
+ ## Title treatments by role
42
+
43
+ | Role | Default treatment |
44
+ |---|---|
45
+ | content | top-rule |
46
+ | data | top-rule |
47
+ | data-takeaway | side-rail |
48
+ | sequence | kicker-numeral |
49
+ | image | side-rail |
50
+ | statement | statement |
51
+ | reference | top-rule |
52
+ | definition | side-rail |
53
+
54
+ Treatments: kicker-numeral, top-rule, side-rail, statement. The side rail is the board itself
55
+ (`rail: field`): a dark rail with the title in white. The statement is drawn `drench`, on the field
56
+ over the whole page. Top-rule draws the short rust accent bar. A comparison sets its criteria on the
57
+ board rail under a `side-rail` title (`structure: comparison: side-rail`), kept even when the deck
58
+ already leans on the rail. The agenda draws no numeral (OF-119), so a chalk deck whose only kicker
59
+ was its agenda needs a step or sidebar slide under `kicker-numeral` to keep three treatments
60
+ (OF-110); a sidebar note set across the top adds a top-title grid slide that can push that
61
+ composition past 40 % of the content slides (OF-111).
62
+
63
+ ## Families and variants
64
+
65
+ Families: step-diagram, process, method, sidebar-note, comparison, image-split, quote, agenda,
66
+ statement, text-column, table-insight.
67
+
68
+ Covers: cover-rail, cover-typographic, cover-numeral. Sections: section-numeral, section-rail.
69
+ Closings: closing-summary-list, closing-ask.
70
+
71
+ Display devices: cover `rail`, statement `drench`, big number on a tint, closing step in a `box`.
72
+
73
+ ## Tables and charts
74
+
75
+ - Tables `header-fill`: a pale apricot header with dark rust labels, row rules, no banding, numbers
76
+ right-aligned, totals bold.
77
+ - Charts (if a chart appears in a table-insight): hairline gridlines, direct labels, annotation on.
78
+ - Images bleed on one side only, no crop, no frame.
79
+
80
+ ## Decoration vocabulary
81
+
82
+ accent-rule, mark-underline (listed; not drawn by the current engine), rail-fill, numeral.
83
+
84
+ ## Fill behaviour
85
+
86
+ `fill-order`: distribute, step-up (off at density 10), change-family, anchor-visual. Teaching slides
87
+ are text-led, so a short Chalk slide spreads its gaps; the gate then reports the empty band, which
88
+ means the slide needs more worked detail.
89
+
90
+ ## Writing for Chalk
91
+
92
+ - Put the definition or common mistake in `::: main-box` on a `sidebar-note` slide, never buried in
93
+ a bullet. Give the main column enough material (five groups with two sub-points is about right at
94
+ density 10).
95
+ - A `method` slide wants the formula as one plain line, then four or five terms each with one or two
96
+ sub-points. Under side-rail the formula runs across the eight body columns and the terms in two
97
+ columns under it. Do not add a figure to the same slide; with a figure the formula line is not
98
+ drawn.
99
+ - Number step heads in the text (`- **1. 목표 온도 강하**`) and give each step the value it produces.
100
+ - A `closing-summary-list` reads as finished with five or six one-line conclusions.
101
+
102
+ ## Avoid
103
+
104
+ - More than one marked term per slide.
105
+ - Numerals on points that are not a sequence.
106
+ - Definitions buried in bullets instead of the aside.
107
+
108
+ ## A sample fragment
109
+
110
+ ```text
111
+ ---
112
+ tonality: chalk
113
+ title: 회귀분석 입문 4주차
114
+ date: 2026-10-06
115
+ notice: 예시 강의 자료
116
+ ---
117
+ layout: step-diagram
118
+
119
+ ## 단순 회귀 기울기 계산 순서
120
+
121
+ - **1. 평균** x 평균 4.0, y 평균 12.6을 먼저 구함
122
+ - **2. 편차곱 합** Σ(x−x̄)(y−ȳ) = 38.4
123
+ - **3. 편차제곱 합** Σ(x−x̄)² = 16.0
124
+ - **4. 기울기** b = 38.4 / 16.0 = 2.4, 절편 a = 12.6 − 2.4 × 4.0 = 3.0
125
+ - 표본 5개의 손 계산 예시로, 스프레드시트 결과와 소수 둘째 자리까지 같음
126
+ - 출처: 예시 교재 4장 예제 4.1
127
+ ```
128
+
129
+ ## Examples
130
+
131
+ - `examples/04-lecture-chalk-ko.md`: Korean thermodynamics lecture on hydrate phase equilibria, 9
132
+ slides.
@@ -0,0 +1,137 @@
1
+ # Gazette
2
+
3
+ Gazette is a Korean briefing paper set as slides. A slate header band carries the title on content
4
+ pages, a boxed one-line conclusion sits on top, itemised evidence fills two columns at reading size,
5
+ and a red key line is the only accent. It is built for decks that are read at a desk, not presented.
6
+ Pack file: `templates/tonalities/gazette/pack.yaml`.
7
+
8
+ ## Use it for
9
+
10
+ - 보고서형 덱: policy briefings, internal reports and proposals circulated before a meeting.
11
+ - 경영 보고 decks that are read alone, with tables, schedules and a decision page.
12
+ - Any Korean deck with long bodies (about 150 Hangul or more per content slide).
13
+
14
+ ## Wrong for
15
+
16
+ - A live talk: the density that serves a reader overwhelms a listener. Use signal, night or ledger.
17
+ - Chart-led content: Gazette lists no chart family. A chart-heavy report belongs to ledger.
18
+ - Photo-led content.
19
+ - English decks: it works, but its conventions (개조식, 붙임, 건의 사항) are Korean document habits.
20
+
21
+ ## Palette roles
22
+
23
+ | Role | Colour | Used for |
24
+ |---|---|---|
25
+ | ground / surface | white / pale slate `#F1F4F8` | background, table banding |
26
+ | ink / ink-muted | deep slate `#1A2230` / grey `#4A5568` | text |
27
+ | line | grey-blue `#C8D0DA` | grid rules, box outline |
28
+ | accent | key-line red `#A61B1B` | the key line only |
29
+ | accent-deep / accent-tint | slate blue `#233A4F` / pale slate `#E8EEF4` | deep text / tint |
30
+ | field / on-field | slate blue `#233A4F` / white | header band, table header, cover band |
31
+ | positive / negative | green `#1E7A3F` / ink | gains; losses in ink with their sign |
32
+ | series | red, slate blue, grey, olive | charts (rare here) |
33
+
34
+ ## Type
35
+
36
+ Pretendard throughout. Compact ramp at density 10 (body 13 pt, tables 11 pt). Figures tabular.
37
+
38
+ ## Dials
39
+
40
+ Density 10, variance 4: exactly three title treatments in a deck of eight or more slides. Gazette is
41
+ the pack most likely to need a `title:` key to satisfy the variety checks, because its pages are
42
+ meant to look alike.
43
+
44
+ ## Title treatments by role
45
+
46
+ | Role | Default treatment |
47
+ |---|---|
48
+ | content | band |
49
+ | data | top-rule |
50
+ | data-takeaway | side-rail |
51
+ | sequence | kicker-numeral |
52
+ | image | side-rail |
53
+ | statement | band (no statement treatment) |
54
+ | reference | top-rule |
55
+ | definition | side-rail |
56
+
57
+ Treatments: band, top-rule, kicker-numeral, side-rail. Top-rule draws a hairline across the width.
58
+
59
+ ## Families and variants
60
+
61
+ Families: summary-box-list, text-two-column, text-column, ledger-table, table-insight, comparison,
62
+ timeline, matrix-2x2, agenda, references-appendix.
63
+
64
+ Covers: cover-band, cover-typographic, cover-index. Sections: section-band, section-rule. Closings:
65
+ closing-decision-box (건의 사항), closing-ask.
66
+
67
+ Display devices: cover `band`, big number in an `outline`, closing decision in a `box` with an
68
+ outline, and `index: true`: a section page repeats the agenda with the current part marked.
69
+
70
+ ## Tables and charts
71
+
72
+ - Tables `header-fill`: slate blue header with white labels, a full grid of rules, pale slate
73
+ banding, numbers right-aligned, totals bold. The densest table style of the eight.
74
+ - Charts: hairline gridlines, direct labels, annotation off.
75
+ - Images: no bleed, no crop, hairline frame.
76
+
77
+ ## Decoration vocabulary
78
+
79
+ header-band, box-outline, hairline-rule, numeral.
80
+
81
+ ## Fill behaviour
82
+
83
+ `fill-order`: step-up (off at density 10), distribute, change-family, anchor-visual.
84
+
85
+ ## Writing for Gazette
86
+
87
+ - Open with `summary-box-list`: a `::: key-message` of one to three lines that states the proposal
88
+ with its numbers, then four to six headed groups (현황, 원인, 방안, 재원, 운영, 일정) of one or two
89
+ sub-points each.
90
+ - Keep 개조식 discipline: each level a real sub-point, five items or fewer per level, the same
91
+ endings throughout a list (noun endings or -함/-임 forms in bullets are fine; titles stay labels).
92
+ - Tables are the evidence: seven rows with a totals row is normal here.
93
+ - End with `closing-decision-box` (건의 사항) and a `references-appendix` titled 붙임.
94
+ - No more than three text families in a row; break them with a table, a timeline or a matrix.
95
+
96
+ ## Avoid
97
+
98
+ - English section kickers.
99
+ - Red for anything but the key line.
100
+ - A summary box longer than three lines.
101
+ - More than three text families in a row.
102
+
103
+ ## A sample fragment
104
+
105
+ ```text
106
+ ---
107
+ tonality: gazette
108
+ title: 공공도서관 야간 개관 확대 방안
109
+ date: 2026-10-06
110
+ notice: 예시 데이터
111
+ ---
112
+ layout: summary-box-list
113
+
114
+ ## 핵심 요약
115
+
116
+ ::: key-message
117
+ 2027년부터 구립도서관 12곳의 평일 개관을 22시까지 늘리고, 연 운영비 9.4억 원은 인력 재배치로 절반을 충당하는 안
118
+ :::
119
+
120
+ - **현황** 평일 18시 폐관 도서관 12곳, 18시 이후 이용 요청 연 3,100건
121
+ (1) 직장인 회원 비율 41%, 평일 이용률은 21%에 그침
122
+ - **방안** 22시까지 연장, 열람실과 대출 창구만 운영
123
+ (1) 야간 인력 24명 중 12명은 주간 인력 재배치
124
+ - **재원** 연 9.4억 원, 재배치로 4.6억 원 절감
125
+ (1) 순증 예산 4.8억 원
126
+ - **효과** 평일 방문 연 18만 명 증가 예상
127
+ (1) 시범 운영 2곳의 야간 방문은 하루 평균 160명
128
+ - **운영** 열람실 좌석 60%와 무인 반납기만 개방
129
+ (1) 야간 안전 요원 1명씩 배치, 경비 용역에 포함
130
+ - **일정** 27년 1월 4곳, 7월 8곳으로 두 단계 확대
131
+ (1) 1단계 이용률 30% 미만이면 2단계 대상 조정
132
+ - 출처: 예시구 도서관 이용 통계(2026년 1~8월), 시범 운영 결과
133
+ ```
134
+
135
+ ## Examples
136
+
137
+ - `examples/06-policy-briefing-gazette-ko.md`: Korean public EV-charging policy briefing, 11 slides.