@litfamily/litopencode 1.0.16 → 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.
- package/CHANGELOG.md +7 -0
- package/README-Ko-KR.md +11 -11
- package/README.md +11 -11
- package/dist/activation-routing.js +1 -1
- package/dist/features.js +2 -2
- package/dist/skills.js +6 -4
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/reference-Ko-KR.md +1 -1
- package/package.json +1 -1
- package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +1 -3
- package/skills/lit-docx/SKILL.md +80 -19
- package/skills/lit-docx/references/components.md +253 -0
- package/skills/lit-docx/references/direction-step.md +234 -0
- package/skills/lit-docx/references/examples/01-report-ko.md +160 -0
- package/skills/lit-docx/references/examples/02-brief-ko.md +58 -0
- package/skills/lit-docx/references/examples/03-manual-ko.md +107 -0
- package/skills/lit-docx/references/examples/04-proposal-ko.md +93 -0
- package/skills/lit-docx/references/examples/05-memo-ko.md +42 -0
- package/skills/lit-docx/references/examples/06-journal-en.md +84 -0
- package/skills/lit-docx/references/examples/07-report-en.md +137 -0
- package/skills/lit-docx/references/examples/08-journal-ko.md +93 -0
- package/skills/lit-docx/references/examples/09-brief-en.md +64 -0
- package/skills/lit-docx/references/page-composition.md +306 -0
- package/skills/lit-docx/references/tonalities/brief.md +104 -0
- package/skills/lit-docx/references/tonalities/journal.md +101 -0
- package/skills/lit-docx/references/tonalities/manual.md +111 -0
- package/skills/lit-docx/references/tonalities/memo.md +105 -0
- package/skills/lit-docx/references/tonalities/proposal.md +101 -0
- package/skills/lit-docx/references/tonalities/report.md +126 -0
- package/skills/lit-docx/run.py +2 -1
- package/skills/lit-docx/scripts/convert_md_to_docx.py +384 -67
- package/skills/lit-docx/scripts/craft_docx.py +204 -1
- package/skills/lit-docx/scripts/docx_design.py +2445 -0
- package/skills/lit-docx/scripts/docx_layout.py +959 -0
- package/skills/lit-docx/scripts/slop_lint.py +23 -6
- package/skills/lit-docx/templates/tonalities/brief.yaml +29 -0
- package/skills/lit-docx/templates/tonalities/journal.yaml +26 -0
- package/skills/lit-docx/templates/tonalities/manual.yaml +27 -0
- package/skills/lit-docx/templates/tonalities/memo.yaml +27 -0
- package/skills/lit-docx/templates/tonalities/proposal.yaml +27 -0
- package/skills/lit-docx/templates/tonalities/report.yaml +27 -0
- package/skills/lit-pptx/NOTICE.md +1 -1
- package/skills/lit-pptx/SKILL.md +108 -19
- package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Bold.otf +0 -0
- package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Regular.otf +0 -0
- package/skills/lit-pptx/references/density-and-fill.md +283 -0
- package/skills/lit-pptx/references/direction-step.md +249 -0
- package/skills/lit-pptx/references/examples/01-ops-review-ledger-ko.md +173 -0
- package/skills/lit-pptx/references/examples/02-launch-pitch-signal-en.md +153 -0
- package/skills/lit-pptx/references/examples/03-field-survey-atlas-ko.md +120 -0
- package/skills/lit-pptx/references/examples/04-lecture-chalk-ko.md +132 -0
- package/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +162 -0
- package/skills/lit-pptx/references/examples/06-policy-briefing-gazette-ko.md +176 -0
- package/skills/lit-pptx/references/examples/07-annual-story-studio-en.md +131 -0
- package/skills/lit-pptx/references/examples/08-reliability-keynote-night-en.md +182 -0
- package/skills/lit-pptx/references/examples/09-status-update-ledger-en.md +147 -0
- package/skills/lit-pptx/references/examples/10-investor-pitch-signal-ko.md +136 -0
- package/skills/lit-pptx/references/examples/11-forecast-review-night-ko.md +177 -0
- package/skills/lit-pptx/references/examples/12-exhibition-proposal-studio-ko.md +149 -0
- package/skills/lit-pptx/references/layout-families.md +470 -0
- package/skills/lit-pptx/references/title-treatments.md +271 -0
- package/skills/lit-pptx/references/tonalities/atlas.md +132 -0
- package/skills/lit-pptx/references/tonalities/chalk.md +132 -0
- package/skills/lit-pptx/references/tonalities/gazette.md +137 -0
- package/skills/lit-pptx/references/tonalities/ledger.md +151 -0
- package/skills/lit-pptx/references/tonalities/night.md +148 -0
- package/skills/lit-pptx/references/tonalities/paper.md +136 -0
- package/skills/lit-pptx/references/tonalities/signal.md +148 -0
- package/skills/lit-pptx/references/tonalities/studio.md +149 -0
- package/skills/lit-pptx/scripts/compile-deck.js +68 -21
- package/skills/lit-pptx/scripts/craft-thresholds.json +45 -1
- package/skills/lit-pptx/scripts/craft_extras.py +37 -8
- package/skills/lit-pptx/scripts/deck_output.py +654 -0
- package/skills/lit-pptx/scripts/embed_fonts.py +2 -2
- package/skills/lit-pptx/scripts/layout_inventory.py +35 -2
- package/skills/lit-pptx/scripts/lib/directive-parser.js +2 -2
- package/skills/lit-pptx/scripts/lib/font-map.js +4 -4
- package/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
- package/skills/lit-pptx/scripts/lib/layout-resolver.js +403 -21
- package/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
- package/skills/lit-pptx/scripts/lib/render-adapter-html.js +3 -9
- package/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +500 -113
- package/skills/lit-pptx/scripts/lib/render-pack.js +3558 -0
- package/skills/lit-pptx/scripts/lib/slide-ast.js +55 -24
- package/skills/lit-pptx/scripts/lib/spec-validator.js +2 -2
- package/skills/lit-pptx/scripts/lib/template-registry.js +335 -11
- package/skills/lit-pptx/scripts/qa_deck.py +48 -13
- package/skills/lit-pptx/scripts/validate_pptx.py +17 -5
- package/skills/lit-pptx/specs/template-enrollment-contract.md +4 -4
- package/skills/lit-pptx/templates/boilerplate_professional.css +13 -13
- package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
- package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +5 -2
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +20 -20
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -11
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +10 -7
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +17 -17
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +8 -8
- package/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +105 -0
- package/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +110 -0
- package/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +106 -0
- package/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +107 -0
- package/skills/lit-pptx/templates/tonalities/night/pack.yaml +106 -0
- package/skills/lit-pptx/templates/tonalities/paper/pack.yaml +111 -0
- package/skills/lit-pptx/templates/tonalities/signal/pack.yaml +107 -0
- package/skills/lit-pptx/templates/tonalities/studio/pack.yaml +105 -0
- package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +1 -1
- package/skills/lit-typographic-motion/engine/stage/capture.mjs +2 -2
- package/skills/lit-typographic-motion/engine/treatment.mjs +1 -1
- package/skills/lit-typographic-motion/fonts/pins.json +2 -2
- package/skills/lit-typographic-motion/gate.mjs +1 -1
- package/skills/lit-typographic-motion/references/stage.md +1 -1
- package/skills/lit-typographic-motion/references/style-bibles.md +2 -2
- package/skills/lit-typographic-motion/references/treatment.md +1 -1
- package/skills/lit-typographic-motion/references/type-craft.md +3 -3
- package/skills/managed-skill-manifest.json +288 -44
- package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Bold.otf +0 -0
- package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Regular.otf +0 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# Density and fill
|
|
2
|
+
|
|
3
|
+
LitOpenCode decks are dense by default. Every pack ships at density 10, the compact step, because
|
|
4
|
+
the user's standing verdict on earlier rounds was that slides held too little ("더 빽빽하게"). This
|
|
5
|
+
file explains what the density dial changes, the readable floors nothing goes below, what the
|
|
6
|
+
engine does when a slide comes out short, what the source has to contain so a slide fills with
|
|
7
|
+
substance, and how the gate measures the result.
|
|
8
|
+
|
|
9
|
+
The one-line rule: **fill a slide with facts the reader needs, never with size or decoration.**
|
|
10
|
+
The engine will not invent content and will not enlarge type on the compact step, so a short
|
|
11
|
+
source produces a visibly short slide and a gate finding. The fix is always in the source.
|
|
12
|
+
|
|
13
|
+
## The density dial
|
|
14
|
+
|
|
15
|
+
`density:` in the frontmatter (1-10) overrides the pack default for one deck. The skill may lower
|
|
16
|
+
it by up to 2 without asking (record it on the direction card); a bigger move needs the user's
|
|
17
|
+
word. Each step selects a row of `DENSITY_BANDS` in `scripts/lib/grid-resolver.js`:
|
|
18
|
+
|
|
19
|
+
| Density | Grid (16:9 side margin) | Ramp: body / label / source pt | Item / group / block gap | Padding | Min table row | Lines per text column | Empty band allowed | Type step-up to fill |
|
|
20
|
+
|---|---|---|---|---|---|---|---|---|
|
|
21
|
+
| 1-2 | airy (60) | presented: 18 / 14 / 12 | 18 / 36 / 48 | 24 | 36 | 6 | 28 % | yes |
|
|
22
|
+
| 3-4 | standard (48) | presented: 18 / 14 / 12 | 12 / 24 / 36 | 24 | 32 | 8 | 24 % | yes |
|
|
23
|
+
| 5-6 | standard (48) | reading: 14 / 12 / 10 | 6 / 18 / 24 | 18 | 24 | 12 | 18 % | yes |
|
|
24
|
+
| 7-8 | dense (36) | reading: 14 / 12 / 10 | 6 / 12 / 24 | 12 | 22 | 16 | 14 % | yes |
|
|
25
|
+
| 9 | dense (36) | reading: 14 / 12 / 10 | 6 / 12 / 24 | 12 | 20 | 18 | 12 % | no |
|
|
26
|
+
| 10 | compact (24) | compact: 13 / 11 / 9 | 6 / 12 / 18 | 12 | 18 | 22 | 12 % | no |
|
|
27
|
+
|
|
28
|
+
Titles stay at 26 pt (display 36, cover 44) from density 5 upward, so lowering density changes the
|
|
29
|
+
body, not the hierarchy. The compile prints the dials and grid it used on its first line:
|
|
30
|
+
`Tonality night · density 10 · variance 6 · 16:9 compact grid`.
|
|
31
|
+
|
|
32
|
+
### What the compact step adds
|
|
33
|
+
|
|
34
|
+
- **Grid.** On 16:9: 24 pt margins, twelve 54 pt columns, 24 pt gutters (24 + 12 x 54 + 11 x 24 + 24 =
|
|
35
|
+
960). On 4:3: 24 pt margins, 45 pt columns, 12 pt gutters.
|
|
36
|
+
- **Title zone.** A top-rule title frame is as tall as its lines, its rule 6 pt under it, and the body
|
|
37
|
+
18 pt under the rule, so a one-line title leaves the body from about y 92 instead of 120. A band
|
|
38
|
+
keeps its 108 pt height and the body follows at 120. Side-rail and bottom-anchor are unchanged.
|
|
39
|
+
- **No type inflation.** Step-up is off: on density 9 and 10 the engine never sets body text a ramp
|
|
40
|
+
step larger to fill space. Comparisons, headed rows and agendas stay at body size too.
|
|
41
|
+
- **More per slide.** KPI rows hold up to six figures; chart slides also show the chart's values as a
|
|
42
|
+
small table where it fits; comparison rows draw a criteria column; process rows read across;
|
|
43
|
+
references step down and run in two columns before they overflow.
|
|
44
|
+
|
|
45
|
+
### When to lower it
|
|
46
|
+
|
|
47
|
+
Lower to 8 or 9 (body 14 pt, dense grid) for a deck projected in a large room or read from the back
|
|
48
|
+
of a hall: a keynote over about 40 people, a classroom without individual screens. Keep 10 for
|
|
49
|
+
anything read on a screen or a desk, which is most decks. Never lower density to hide a thin
|
|
50
|
+
source; that only moves the empty band from the gate to the reader.
|
|
51
|
+
|
|
52
|
+
## Readable floors
|
|
53
|
+
|
|
54
|
+
Nothing on the compact step goes below these sizes, and nothing in a source can ask it to:
|
|
55
|
+
|
|
56
|
+
| Text | Floor | Compact size |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| Body text, takeaways, step text | 12 pt | 13 pt |
|
|
59
|
+
| Table cells, captions, labels | 11 pt | 11 pt |
|
|
60
|
+
| Source and note strip | 9 pt | 9 pt |
|
|
61
|
+
|
|
62
|
+
The engine reaches density by cutting margins, gaps and padding, not by shrinking type below these.
|
|
63
|
+
If a slide's content does not fit at these sizes, the engine first drops leads to body size and
|
|
64
|
+
gaps to the item gap; if it still overflows, the gate reports the overflowing frame and the slide
|
|
65
|
+
must be split or cut. Never use `::: box` with a tiny `role` to squeeze text in.
|
|
66
|
+
|
|
67
|
+
## The source strip
|
|
68
|
+
|
|
69
|
+
Any line in a content slide's text that starts with `출처:`, `자료:`, `주:`, `Source:` or `Note:` is
|
|
70
|
+
lifted out of the takeaways and set at the foot of the body at source size, full width, under a
|
|
71
|
+
hairline where the pack draws hairlines. The strip costs the takeaway column nothing and puts the
|
|
72
|
+
provenance where a reader looks for it.
|
|
73
|
+
|
|
74
|
+
- Write `출처:` / `Source:` on every content slide that carries a figure: who measured it, over
|
|
75
|
+
what period, from which document.
|
|
76
|
+
- Add `주:` / `Note:` when a definition changes the reading: how a ratio is computed, what counts as
|
|
77
|
+
a failure, which baseline a delta uses.
|
|
78
|
+
- Closings keep these lines inside their next-step device rather than in a strip.
|
|
79
|
+
- The strip text is 9 pt and the gate's empty-band check (OF-109) ignores text that small, so a
|
|
80
|
+
strip does not count as filling the body. It is evidence, not filler.
|
|
81
|
+
|
|
82
|
+
## The sample-data notice
|
|
83
|
+
|
|
84
|
+
When any figure, name or photograph in the deck is invented or stands in for the real one, say so in
|
|
85
|
+
the frontmatter:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
notice: 예시 데이터 · 실제 수치로 바꿔 쓰는 샘플
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The engine sets this line as a small tag in the footer zone of every slide, in the pack's colours.
|
|
92
|
+
Name the sample status in the reply as well. Never leave bracketed placeholders (a company name or "to be decided"
|
|
93
|
+
in square brackets) in a source; write a plausible labelled sample instead, or leave the item out.
|
|
94
|
+
|
|
95
|
+
## Fill policies: what the engine does with a short slide
|
|
96
|
+
|
|
97
|
+
After laying a content slide out, the engine measures the empty band between the last content and
|
|
98
|
+
the body floor. If it is larger than the band the density allows (12 % at density 10), it tries the
|
|
99
|
+
pack's `fill-order` one policy at a time, keeping a policy only when it fills more without
|
|
100
|
+
overflowing:
|
|
101
|
+
|
|
102
|
+
| Policy | What it does | On density 10 |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `step-up` | Body text one ramp step larger | Off |
|
|
105
|
+
| `distribute` | Item gaps one step up (to at most 24 pt), group and block gaps one step up (to at most 48 pt) | On |
|
|
106
|
+
| `anchor-visual` | The chart, image or table takes the room left; a KPI card row turns into figure rows | On |
|
|
107
|
+
| `change-family` | A better family for the content | Never automatic; the log asks you to do it |
|
|
108
|
+
|
|
109
|
+
Each pack orders these differently. Ledger, gazette and chalk effectively spread first (their
|
|
110
|
+
`step-up` is off at density 10); atlas, paper and night let the visual take the room first; studio
|
|
111
|
+
lists a family change first and signal second; the engine never changes a family by itself, so
|
|
112
|
+
those two fall through to letting the visual take the room and then spreading. The compile log prints
|
|
113
|
+
one `fill:` line per slide that started short:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
fill: slide 4 band 0.29 -> 0.24 (distribute)
|
|
117
|
+
fill: slide 6 band 0.20 -> 0.20 (none: nothing on the slide can grow; choose a fuller family)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The second line is the important one. It means the slide is short because the source is short, and
|
|
121
|
+
no policy can help. Add the facts the slide is missing (next section) or move the content to a
|
|
122
|
+
family that suits its amount; `layout-families.md` lists what each family expects.
|
|
123
|
+
|
|
124
|
+
Some families also spread on their own when the body is short: headed points become rows, agenda
|
|
125
|
+
rows spread down to the floor, timeline room is shared above and below the axis, table takeaways
|
|
126
|
+
move under the table, references spread with rules. These moves never add words.
|
|
127
|
+
|
|
128
|
+
### A short column beside a full one
|
|
129
|
+
|
|
130
|
+
A column can stand empty beside a full one even when the body reaches the floor: two short
|
|
131
|
+
takeaways beside a chart, a source line at the column's foot and nothing between them. The engine
|
|
132
|
+
reads each text or picture column against the column beside it (its tallest empty band, from the
|
|
133
|
+
top of the pair down to where the longer column ends) and fills a column that leaves more than 40 %
|
|
134
|
+
of the body empty. It tries, in order, and only by layout:
|
|
135
|
+
|
|
136
|
+
1. The visual takes columns: the takeaway column narrows (down to three columns) and wraps onto more
|
|
137
|
+
lines while the chart or picture grows; a picture keeps taking columns while either side leaves a
|
|
138
|
+
fifth of the body empty. Takeaways never get a smaller size for it.
|
|
139
|
+
2. The points step up to lead size when they fit and keep twelve glyphs a line.
|
|
140
|
+
3. The room left is shared between the points, at most a sixth of the body per gap.
|
|
141
|
+
4. Two or three short points beside a chart that still leave the column empty run under the chart,
|
|
142
|
+
side by side, and the chart with its values takes the body's width.
|
|
143
|
+
5. A short sidebar note first takes a narrower column at body size; if the main column still runs
|
|
144
|
+
far past it, the note stands across the top at lead size and the main points run in two columns
|
|
145
|
+
under it. Under a side title the note stands in the rail.
|
|
146
|
+
6. Beside figure rows (kpi-row, big-number) the takeaways' column is read down to the body floor,
|
|
147
|
+
since the rows stop where their spacing ends: short points run under the rows, or share the room
|
|
148
|
+
beside them when running under would leave a band between rows and points.
|
|
149
|
+
7. A title under which a column still stays empty is unfit for the slide when another title fits.
|
|
150
|
+
|
|
151
|
+
The source strip closing a column counts as a block but never hides the band above it, and the
|
|
152
|
+
chart's values table under the takeaways moves and is read with their column. The gate reads the
|
|
153
|
+
same way (OF-115). When a slide still fails, the source is short: one more real takeaway,
|
|
154
|
+
the values the chart stands on, or a family that suits the amount.
|
|
155
|
+
|
|
156
|
+
## What to write per slide
|
|
157
|
+
|
|
158
|
+
A dense slide is a slide that answers the reader's next question before it is asked. For every
|
|
159
|
+
content slide, check the source holds these five things; most short slides miss two of them.
|
|
160
|
+
|
|
161
|
+
1. **Basis.** What the number is measured on: per building, per 1,000 kg of water, at 0.1 MPa,
|
|
162
|
+
weighted by effort, a 1 % request sample.
|
|
163
|
+
2. **Comparison.** Against what: plan, last year, the previous quarter, a target, the other option,
|
|
164
|
+
the baseline model.
|
|
165
|
+
3. **Period.** When: 2026년 7~9월, weeks 35-40, January to September, as of 30 September.
|
|
166
|
+
4. **Source.** Who produced it: the `출처:` / `Source:` line.
|
|
167
|
+
5. **Implication.** What it means or what happens next: the takeaway, the decision it supports, the
|
|
168
|
+
follow-up date.
|
|
169
|
+
|
|
170
|
+
Counts that make a slide read as finished at density 10:
|
|
171
|
+
|
|
172
|
+
| Element | Target |
|
|
173
|
+
|---|---|
|
|
174
|
+
| KPI row | 4-6 figures, each with a basis row (`계획 대비 +4.1%`, `target 99.95%`) |
|
|
175
|
+
| Table | 5-8 body rows, a totals row where the rows add up |
|
|
176
|
+
| Comparison | 3-4 labelled criteria rows, the same labels on both sides |
|
|
177
|
+
| Chart | 5-9 categories, a caption, 2-4 takeaways, a source line |
|
|
178
|
+
| Timeline | 5-6 events with owners, 2-3 takeaways |
|
|
179
|
+
| Text slide | 5-6 headed points or 4-6 groups with sub-points |
|
|
180
|
+
| Method | a formula line plus 4-5 terms with one or two sub-points each |
|
|
181
|
+
| References | 8-10 entries, sources then definitions |
|
|
182
|
+
| Closing | 3-5 asks or decisions with amounts or dates and owners |
|
|
183
|
+
|
|
184
|
+
### A short slide and the same slide filled
|
|
185
|
+
|
|
186
|
+
Short (compiles, but the band is empty and the reader has questions):
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
---
|
|
190
|
+
layout: chart-insight
|
|
191
|
+
|
|
192
|
+
## 월별 출고 건수
|
|
193
|
+
|
|
194
|
+
::: chart type=column
|
|
195
|
+
| 월 | 출고 |
|
|
196
|
+
|---|---|
|
|
197
|
+
| 7월 | 131 |
|
|
198
|
+
| 8월 | 137 |
|
|
199
|
+
| 9월 | 144 |
|
|
200
|
+
:::
|
|
201
|
+
|
|
202
|
+
- 출고가 늘었음
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Filled (same slide job; every added line comes from the source material, none from imagination):
|
|
206
|
+
|
|
207
|
+
```text
|
|
208
|
+
---
|
|
209
|
+
layout: chart-insight
|
|
210
|
+
|
|
211
|
+
## 월별 출고 건수, 2025년과 2026년 비교
|
|
212
|
+
|
|
213
|
+
::: chart type=column unit="만 건"
|
|
214
|
+
| 월 | 2025년 | 2026년 |
|
|
215
|
+
|---|---|---|
|
|
216
|
+
| 7월 | 118 | 131 |
|
|
217
|
+
| 8월 | 124 | 137 |
|
|
218
|
+
| 9월 | 133 | 144 |
|
|
219
|
+
> 월별 출고 건수, 2025년과 2026년 비교 (예시 데이터)
|
|
220
|
+
:::
|
|
221
|
+
|
|
222
|
+
- 세 달 모두 전년보다 8~11% 많았고, 9월이 분기 최대
|
|
223
|
+
- 9월 증가분의 70%가 이천 센터 자동 분류기 가동 뒤 처리량
|
|
224
|
+
- 4분기 성수기에는 평시의 1.6배까지 늘어날 전망
|
|
225
|
+
- 출처: 예시 물류 WMS 출고 실적(2025년 7월~2026년 9월)
|
|
226
|
+
- 주: 출고 건수는 반품 재출고를 제외한 주문 기준
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
The first version also breaks two rules on its own: the title has no comparison or period, and the
|
|
230
|
+
takeaway is a bare claim (`늘었음`) with no figure.
|
|
231
|
+
|
|
232
|
+
### Numbers stay honest
|
|
233
|
+
|
|
234
|
+
- No hero numerals. The engine caps every number it sets (KPI values, big-number panels, cover
|
|
235
|
+
figures, closing keys, section numerals) at the title size of the ramp; do not try to get around
|
|
236
|
+
that with a `box` or `shape`.
|
|
237
|
+
- A figure is never larger than the title, and a figure without a basis is not a KPI.
|
|
238
|
+
- Signed deltas carry their sign and unit (`+4.1%`, `−3.6%`, `+0.5%p`, `▲ 12%`). In signal, where
|
|
239
|
+
the accent is red, losses keep the ink colour and rely on the `▼` sign.
|
|
240
|
+
- Keep one unit per column; put the unit in the header or the chart's `unit=`.
|
|
241
|
+
- Round to what the source supports and keep the rounding consistent within a slide.
|
|
242
|
+
|
|
243
|
+
## How the gate measures density
|
|
244
|
+
|
|
245
|
+
`node <skill>/run.mjs qa deck.pptx` reports three density-related findings. Only HIGH findings and
|
|
246
|
+
the composition failure fail the gate; read the MEDIUM ones as a to-do list.
|
|
247
|
+
|
|
248
|
+
- **OF-109, empty band (per slide).** The largest vertical gap between content blocks on a content
|
|
249
|
+
slide, measured from under the title to 0.55 in above the bottom edge (or above a bottom title),
|
|
250
|
+
ignoring text of 10.5 pt or less, which means the source strip and captions do not count. A gap of
|
|
251
|
+
25 % or more is MEDIUM, over 35 % is HIGH. Cards are measured the same way inside themselves.
|
|
252
|
+
Typical causes: a method slide with three short terms, a sidebar-note with six lines of main text,
|
|
253
|
+
a closing summary with four one-line items, a timeline with one takeaway.
|
|
254
|
+
- **OF-112, deck median band.** Each content slide's empty band against the density's cap (12 % at
|
|
255
|
+
density 10) is MEDIUM; a deck whose median band exceeds 20 % fails.
|
|
256
|
+
- **Composition fill (`low_content_fill`).** An older whole-slide check: on every slide except the
|
|
257
|
+
first and the last, the area of text, tables, charts and pictures that start between 1.7 in and
|
|
258
|
+
6.7 in from the top must cover at least 12 % of the content area. Blocks that start higher than
|
|
259
|
+
1.7 in are not counted at all. On the compact step a top title's body starts near 1.3 in, so a
|
|
260
|
+
slide whose table and takeaways both start at the top can fail even when it looks full. The
|
|
261
|
+
remedies that worked on the example decks:
|
|
262
|
+
- give a `table-insight` slide three or four takeaways, so they either run beside the table at
|
|
263
|
+
length or move under it in two columns;
|
|
264
|
+
- give a `ledger-table` slide three or four takeaways under the table;
|
|
265
|
+
- give a mid-deck `statement` slide its one support line;
|
|
266
|
+
- give a `dashboard-grid` four panels, so the second row starts lower;
|
|
267
|
+
- or put the title at the bottom (`title: bottom-anchor` where the pack allows it), since the
|
|
268
|
+
bottom title itself is counted.
|
|
269
|
+
|
|
270
|
+
Other checks that interact with density: OF-102 flags a line measure over 38 Hangul or 90 Latin
|
|
271
|
+
characters (HIGH) or a narrow column under 10 characters a line over three lines (MEDIUM); OF-101
|
|
272
|
+
flags too many accent hues on one slide; the layout inventory flags any text frame whose estimated
|
|
273
|
+
text height exceeds the frame. Shorten the text; do not reach for smaller type.
|
|
274
|
+
|
|
275
|
+
## A density pass, in order
|
|
276
|
+
|
|
277
|
+
1. Compile. Read every `fill:` line ending in `none` and every `note:` line.
|
|
278
|
+
2. Run the gate. List OF-109 HIGH slides and any `low_content_fill` slides.
|
|
279
|
+
3. For each, add the missing basis, comparison, period, source or implication from the source
|
|
280
|
+
material. If the material has nothing more, change the family to one that suits the amount
|
|
281
|
+
(`layout-families.md`) or merge the slide with its neighbour.
|
|
282
|
+
4. Recompile and rerun the gate until it exits 0. MEDIUM findings may remain; HIGH may not.
|
|
283
|
+
5. Render and look at the pages. A passing gate is not a visual review.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Choosing a direction before the first slide
|
|
2
|
+
|
|
3
|
+
A LitOpenCode deck is drawn from a tonality pack: palette roles, a type ramp, the title treatments
|
|
4
|
+
the pack allows, the layout families it lists, its cover, section and closing variants, and two
|
|
5
|
+
dials. Eight packs ship in `templates/tonalities/`. The engine never guesses a look on its own, so
|
|
6
|
+
the first decision of every build is which pack to compile under. This file is the procedure for
|
|
7
|
+
making that decision quickly, recording it, and telling the user what was chosen.
|
|
8
|
+
|
|
9
|
+
The step costs a few minutes and saves the most expensive failure in slide work: a deck that is
|
|
10
|
+
correct slide by slide but wrong as a whole, because a stage pitch was set as a dense reading
|
|
11
|
+
document or a briefing paper was set as a keynote.
|
|
12
|
+
|
|
13
|
+
## What the step produces
|
|
14
|
+
|
|
15
|
+
1. One tonality id written into the deck's frontmatter (`tonality: ledger`).
|
|
16
|
+
2. Two named alternatives, with the reason each one lost.
|
|
17
|
+
3. The density and variance the deck compiles at, and any move away from the pack default.
|
|
18
|
+
4. A direction card kept in the task's working notes (the build log), and a two or three sentence
|
|
19
|
+
summary of it in the reply.
|
|
20
|
+
|
|
21
|
+
Nothing else is decided here. Layout families per slide come next, while outlining; they are
|
|
22
|
+
recorded on the card because a pack that cannot carry a planned slide is a wrong pack.
|
|
23
|
+
|
|
24
|
+
## No questions on a bare request
|
|
25
|
+
|
|
26
|
+
A bare request ("발표자료 만들어 줘", "make a deck from these notes", a bare `lit` slide request)
|
|
27
|
+
gets no question about colours, fonts or style. Read the request and any sources, pick the
|
|
28
|
+
direction yourself, build the whole deck, and say in the reply what was chosen and what the
|
|
29
|
+
alternatives were. The user corrects a finished deck faster than they answer an abstract style
|
|
30
|
+
question.
|
|
31
|
+
|
|
32
|
+
Ask only in two cases:
|
|
33
|
+
|
|
34
|
+
- the user has explicitly left the look open and wants to see options ("어떤 느낌이 좋을지 모르겠어",
|
|
35
|
+
"show me a few styles"): build the compare strip below instead of asking in words;
|
|
36
|
+
- a dial would have to move by more than 2 from the pack default to meet the brief (see "Dials").
|
|
37
|
+
|
|
38
|
+
## Step 1: read four facts off the brief
|
|
39
|
+
|
|
40
|
+
Infer each fact when the brief does not state it, and write the inference on the card so the user
|
|
41
|
+
can correct it later.
|
|
42
|
+
|
|
43
|
+
| Fact | What to settle | Why it matters |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Deck type | One of the eight types below, or the nearest one | Gives the starting candidate order |
|
|
46
|
+
| Delivery | Spoken in a room, sent ahead and read alone, or both | Read decks favour Gazette and Ledger; stage decks favour Signal and Night |
|
|
47
|
+
| Room | Lit office, screen share, dark hall, printed handout | A dark hall pulls Night forward; print rules Night out |
|
|
48
|
+
| Language | Korean, English or mixed | Korean glyphs take about twice the width of Latin letters, which tightens title budgets |
|
|
49
|
+
|
|
50
|
+
## Step 2: start from the deck type
|
|
51
|
+
|
|
52
|
+
Each deck type has an ordered shortlist. The first entry wins when no signal in step 3 moves it.
|
|
53
|
+
All eight packs default to density 10; the variance shown is each pack's own default.
|
|
54
|
+
|
|
55
|
+
| Deck type | First choice | Second | Third |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| Pitch or proposal (투자·제안) | signal (v6) | studio (v8) | atlas (v7) when the product is physical and photographed |
|
|
58
|
+
| Management review (경영·사업 실적) | ledger (v5) | gazette (v4) when circulated in Korean before the meeting | night (v6) when presented on a stage screen |
|
|
59
|
+
| Research talk (연구 발표) | paper (v5) | night (v6) for a large dark auditorium | chalk (v6) for a tutorial-style talk |
|
|
60
|
+
| Lecture or training (강의·교육) | chalk (v6) | paper (v5) | studio (v8) for a public lecture with images |
|
|
61
|
+
| Data review (데이터·지표 리뷰) | night (v6) | ledger (v5) | paper (v5) when the review is a written analysis |
|
|
62
|
+
| Image-led showcase (제품·현장·포트폴리오) | atlas (v7) | studio (v8) | signal (v6) for a launch moment |
|
|
63
|
+
| Korean reading brief (보고서형 덱) | gazette (v4) | ledger (v5) | none |
|
|
64
|
+
| Status update (주간·월간 보고) | ledger (v5) | gazette (v4) | night (v6) |
|
|
65
|
+
|
|
66
|
+
A request that fits none of these takes the nearest type, and the card says "other, treated as
|
|
67
|
+
status update" or similar.
|
|
68
|
+
|
|
69
|
+
## Step 3: measure the outline and reorder
|
|
70
|
+
|
|
71
|
+
Write a rough outline first: one line per slide naming its job and the visual it needs (table,
|
|
72
|
+
chart, image, numbers, steps, prose). Count on that outline, not on the raw notes. Apply the rules
|
|
73
|
+
in this order; ties keep the deck-type order, so the same source always lands on the same pack.
|
|
74
|
+
|
|
75
|
+
| Rule | Fires when | Move |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| Named by the user | The brief or an earlier turn names a tonality | Use it. Still write the card and still name two alternatives |
|
|
78
|
+
| Legacy template named | The brief names AZURE-PRO, AZURE-A2Z, BOILERPLATE-PRETENDARD or BOILERPLATE-A2Z | Compile with `--template` as named; offer two tonalities as alternatives |
|
|
79
|
+
| Read, not presented | "미리 배포", "보고서", "sent ahead", "for the board pack" | gazette to the front for Korean, ledger otherwise |
|
|
80
|
+
| Table-heavy | 30 % or more of slides hold a table | ledger or gazette up one place |
|
|
81
|
+
| Chart-heavy | 30 % or more of slides hold a chart | ledger, night or paper up one place |
|
|
82
|
+
| Image-heavy | 30 % or more of slides hold a photograph or screenshot | atlas or studio up one place; gazette down one place |
|
|
83
|
+
| Long bodies | average body over about 150 Hangul or 300 Latin characters per content slide | gazette or ledger up; signal down |
|
|
84
|
+
| Short bodies | average body under about 40 Hangul or 80 Latin characters | signal or studio up |
|
|
85
|
+
| Citations | numbered references, DOIs, a references slide | paper up one place |
|
|
86
|
+
| Teaching shape | definitions, equations, or a how-it-works sequence of three or more steps | chalk or paper up one place |
|
|
87
|
+
| Dark room | keynote hall, demo day, stage | night up one place |
|
|
88
|
+
| Missing carrier | the pack has no family or title that can carry a planned slide | drop that pack from the shortlist |
|
|
89
|
+
|
|
90
|
+
The last rule overrides taste. The packs differ in what they can draw:
|
|
91
|
+
|
|
92
|
+
- ledger, gazette and atlas have no `statement` title treatment; a statement slide there is set as
|
|
93
|
+
a top title, the largest the pack has, and the compile log says so;
|
|
94
|
+
- atlas lists no table, chart or references family; an outline with a results table does not fit
|
|
95
|
+
it, however many photographs it also has;
|
|
96
|
+
- gazette lists no chart family; a chart-led Korean report belongs to ledger;
|
|
97
|
+
- signal lists no `ledger-table`, `dashboard-grid` or `references-appendix`;
|
|
98
|
+
- night lists no image family at all, so a photograph-led slide does not fit it, and its two
|
|
99
|
+
closings are a statement and a decision box;
|
|
100
|
+
- only atlas and studio carry `image-full`, and only atlas, studio and paper have a cover that uses
|
|
101
|
+
a photograph.
|
|
102
|
+
|
|
103
|
+
Run `node <skill>/run.mjs compile --list-layouts <tonality>` to see a pack's exact families, the
|
|
104
|
+
treatments each family takes in that pack, and its cover, section and closing variants.
|
|
105
|
+
|
|
106
|
+
### A worked case
|
|
107
|
+
|
|
108
|
+
A Korean seminar on battery recycling for an industry association, 25 minutes, projected in a lit
|
|
109
|
+
conference room, with nine content slides planned: three charts, two tables, two process
|
|
110
|
+
diagrams, one photograph and a references slide.
|
|
111
|
+
|
|
112
|
+
- Deck type: research talk, so paper, night, chalk.
|
|
113
|
+
- Chart share 3/9 = 33 %: paper (already first) stays first.
|
|
114
|
+
- Table share 2/9 = 22 %: does not fire.
|
|
115
|
+
- References slide present: paper up (already first).
|
|
116
|
+
- Two process slides of four steps each: chalk up one place, above night.
|
|
117
|
+
- The room is lit: night gets no lift.
|
|
118
|
+
|
|
119
|
+
Result: paper, alternatives chalk and night. The card says chalk would fit better if the audience
|
|
120
|
+
were students rather than practitioners.
|
|
121
|
+
|
|
122
|
+
## Step 4: the direction card
|
|
123
|
+
|
|
124
|
+
Write the card before the first slide and keep it with the task's notes. It is working evidence,
|
|
125
|
+
not slide content, and it is shown to the user only in summary unless they ask for it.
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
DIRECTION
|
|
129
|
+
deck type research talk (연구 발표), industry seminar, 25 min, lit room
|
|
130
|
+
delivery presented; file shared afterwards
|
|
131
|
+
tonality paper alternatives: chalk, night
|
|
132
|
+
reason figures and citations carry the talk; 33 % chart slides, references present
|
|
133
|
+
signals chart share, citations, teaching shape (moved chalk above night)
|
|
134
|
+
dials density 10, variance 5 (pack defaults)
|
|
135
|
+
role map content top-rule | data top-rule | data-takeaway bottom-anchor | definition side-rail
|
|
136
|
+
families cover-index, section-rule, text-column, method, figure-academic, chart-insight x2,
|
|
137
|
+
table-insight, comparison, closing-summary-list, references-appendix
|
|
138
|
+
wrong if the audience is students: chalk's step rhythm and definition boxes teach better
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Every line is required. If you cannot fill `tonality` and `reason`, stop and ask; there is no
|
|
142
|
+
silent default look. The `wrong if` line is the first thing a reviewer checks: when it turns out to
|
|
143
|
+
be true, rebuild under the alternative it names rather than patching slides.
|
|
144
|
+
|
|
145
|
+
Copy the role map from the tonality sheet (`tonalities/<id>.md`). The engine may still give a slide
|
|
146
|
+
another treatment the family allows when that slide fills better under it, and the variety pass
|
|
147
|
+
may move one slide to add a layout; the compile log prints each move (`variety: slide 3 drawn
|
|
148
|
+
under bottom-anchor ...`) and a `Treatments:` line with the final choice per slide.
|
|
149
|
+
|
|
150
|
+
## Step 5: tell the user
|
|
151
|
+
|
|
152
|
+
In the reply, next to the delivered files, say the choice, the reason and the two alternatives in
|
|
153
|
+
plain words. Keep it short; the card itself stays in the notes.
|
|
154
|
+
|
|
155
|
+
> paper 톤으로 만들었습니다. 그림과 인용이 발표를 끌고 가는 자료라서입니다. 수강생 대상이라면
|
|
156
|
+
> chalk, 어두운 대강당이라면 night도 맞습니다.
|
|
157
|
+
|
|
158
|
+
> Built in Signal: a live pitch with one idea per slide. Studio would suit a slower editorial
|
|
159
|
+
> story; Atlas would suit a product that is mostly photographed.
|
|
160
|
+
|
|
161
|
+
Name sample data as sample data in the same reply when the deck uses any (see `notice:` in
|
|
162
|
+
`density-and-fill.md`).
|
|
163
|
+
|
|
164
|
+
## Dials
|
|
165
|
+
|
|
166
|
+
Two integers in the frontmatter override the pack defaults for one deck.
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
density: 9
|
|
170
|
+
variance: 6
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- **density** (1-10) chooses the grid, the type ramp, the gaps and padding, the minimum table row,
|
|
174
|
+
and how much empty band a content slide may leave. Every pack defaults to 10, the compact step.
|
|
175
|
+
For a deck projected to a room of more than about 40 people, lowering it to 8 or 9 (body 14 pt,
|
|
176
|
+
dense grid) is the usual move. See `density-and-fill.md`.
|
|
177
|
+
- **variance** (1-10) caps how many distinct title treatments one deck mixes: 2 at variance 1-3,
|
|
178
|
+
3 at 4, 4 at 5-6, 5 at 7 and above, never more than the pack lists. Variance under 4 is only for
|
|
179
|
+
a user who asks for a uniform deck; the gate then reports the low variety as MEDIUM instead of
|
|
180
|
+
passing it silently.
|
|
181
|
+
|
|
182
|
+
The skill may move either dial by at most 2 from the pack default without asking, and the card
|
|
183
|
+
records the move ("density 8, lowered 2 for a 300-seat hall"). A larger move needs the user's
|
|
184
|
+
word. `node <skill>/run.mjs compile` prints the dials it used on its first line
|
|
185
|
+
(`Tonality ledger · density 10 · variance 5 · 16:9 compact grid`); check that line against the card.
|
|
186
|
+
|
|
187
|
+
Two neighbouring keys are not dials but belong to the same decision:
|
|
188
|
+
|
|
189
|
+
- `canvas: 4:3` switches every pack to its 4:3 grid (all eight list both canvases);
|
|
190
|
+
- `faces: a2z` (or `--faces a2z`) switches the display and numeral faces to A2Z. Pretendard is the
|
|
191
|
+
default in every pack, and A2Z is used only when the user asks for it.
|
|
192
|
+
|
|
193
|
+
## The compare strip
|
|
194
|
+
|
|
195
|
+
When the user wants to see options, render the first three slides of the same source under the
|
|
196
|
+
chosen pack and the two alternatives, and show the nine pages as three labelled rows before writing
|
|
197
|
+
the rest of the deck. The content and order are identical in every row; only the pack changes.
|
|
198
|
+
|
|
199
|
+
```sh
|
|
200
|
+
# strip.md: the deck's frontmatter plus its first three slides
|
|
201
|
+
for t in paper chalk night; do
|
|
202
|
+
node <skill>/run.mjs compile strip.md --tonality "$t" --pptx "strip-$t.pptx"
|
|
203
|
+
node <skill>/run.mjs qa "strip-$t.pptx"
|
|
204
|
+
done
|
|
205
|
+
# then render each strip deck to page images as the skill's render step describes, and show them
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
`--tonality` overrides the frontmatter, so one strip source serves all three rows. A strip of
|
|
209
|
+
three slides is below the gate's variety thresholds (OF-110 starts at eight slides, OF-111 at
|
|
210
|
+
three content slides), so the deck-level checks do not judge it; judge the strip by eye. Do not argue for a row in the message beyond the card's reason. When the
|
|
211
|
+
user picks, change the card's reason to "picked by the user from the strip" and build the deck.
|
|
212
|
+
|
|
213
|
+
Do not build a strip for a bare request. It is a response to an explicit wish to compare, not a
|
|
214
|
+
default step.
|
|
215
|
+
|
|
216
|
+
## Legacy templates
|
|
217
|
+
|
|
218
|
+
AZURE-PRO, AZURE-A2Z, BOILERPLATE-PRETENDARD and BOILERPLATE-A2Z keep their names and their single
|
|
219
|
+
look. Use one only when the user names it or an existing source already says `template:`. Compile
|
|
220
|
+
with `--template <NAME>`; a `title:` key on any slide is then an error, because a legacy template
|
|
221
|
+
has one title look. The gate treats a legacy deck's variety checks (OF-110, OF-111) and the label
|
|
222
|
+
check (OF-114) as MEDIUM: the user asked for one look, so low variety is reported, not failed. The
|
|
223
|
+
reply still names two tonalities as alternatives.
|
|
224
|
+
|
|
225
|
+
## Failure patterns this step prevents
|
|
226
|
+
|
|
227
|
+
- **Same pack for every topic.** If the last three decks in a session all compiled under one pack
|
|
228
|
+
and the briefs differ, rerun step 3 honestly.
|
|
229
|
+
- **Pack picked for its colour.** The colour is the least important part of a pack. Choose by
|
|
230
|
+
delivery, content shape and the families the outline needs.
|
|
231
|
+
- **A pack that cannot carry the outline.** Discovered at compile time as a log note such as
|
|
232
|
+
`slide 6: table-insight is not a atlas layout family ... drawn with its own geometry`. That slide
|
|
233
|
+
then borrows geometry from outside the pack; change the pack or the slide's job.
|
|
234
|
+
- **Silent dial moves.** A density of 6 written into the frontmatter without a card line is the
|
|
235
|
+
same as a silent style change.
|
|
236
|
+
- **Asking instead of building.** A bare request answered with "which style do you prefer?" has
|
|
237
|
+
failed the step.
|
|
238
|
+
- **Choosing by example deck.** The worked examples in `examples/` show what each pack looks like
|
|
239
|
+
with real content; they are not templates to copy. Write the user's deck from the user's facts.
|
|
240
|
+
|
|
241
|
+
## Where to go next
|
|
242
|
+
|
|
243
|
+
- `tonalities/<id>.md`: what each pack is for, its role map, families and variants.
|
|
244
|
+
- `title-treatments.md`: the eight title treatments and how a slide gets one.
|
|
245
|
+
- `layout-families.md`: what each family holds and what the source must contain for it.
|
|
246
|
+
- `density-and-fill.md`: the density steps, readable floors, fill policies and what to write per
|
|
247
|
+
slide so the gate passes on substance rather than padding.
|
|
248
|
+
- `examples/`: twelve compiled decks across all eight packs, each passing
|
|
249
|
+
`node <skill>/run.mjs qa`.
|