@litfamily/litclaude 1.0.19 → 1.0.21

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 (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +14 -8
  3. package/README_ko-KR.md +13 -8
  4. package/docs/assets/readme/badge-version.svg +1 -1
  5. package/docs/hooks.md +3 -2
  6. package/package.json +1 -1
  7. package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
  8. package/plugins/litclaude/bin/litclaude-hook.js +4 -4
  9. package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
  10. package/plugins/litclaude/lib/canonical-skill-resources.mjs +91 -31
  11. package/plugins/litclaude/skills/frontend-ui-ux/ATTRIBUTION.md +3 -6
  12. package/plugins/litclaude/skills/lit-docx/SKILL.md +50 -19
  13. package/plugins/litclaude/skills/lit-docx/references/components.md +207 -0
  14. package/plugins/litclaude/skills/lit-docx/references/direction-step.md +277 -0
  15. package/plugins/litclaude/skills/lit-docx/references/examples/01-report-ko.md +166 -0
  16. package/plugins/litclaude/skills/lit-docx/references/examples/02-brief-ko.md +105 -0
  17. package/plugins/litclaude/skills/lit-docx/references/examples/03-manual-ko.md +164 -0
  18. package/plugins/litclaude/skills/lit-docx/references/examples/04-proposal-ko.md +138 -0
  19. package/plugins/litclaude/skills/lit-docx/references/examples/05-memo-en.md +55 -0
  20. package/plugins/litclaude/skills/lit-docx/references/examples/06-journal-en.md +130 -0
  21. package/plugins/litclaude/skills/lit-docx/references/examples/07-report-en.md +123 -0
  22. package/plugins/litclaude/skills/lit-docx/references/examples/08-proposal-en.md +123 -0
  23. package/plugins/litclaude/skills/lit-docx/references/examples/09-memo-ko.md +45 -0
  24. package/plugins/litclaude/skills/lit-docx/references/page-composition.md +221 -0
  25. package/plugins/litclaude/skills/lit-docx/references/tonalities/brief.md +143 -0
  26. package/plugins/litclaude/skills/lit-docx/references/tonalities/journal.md +142 -0
  27. package/plugins/litclaude/skills/lit-docx/references/tonalities/manual.md +148 -0
  28. package/plugins/litclaude/skills/lit-docx/references/tonalities/memo.md +137 -0
  29. package/plugins/litclaude/skills/lit-docx/references/tonalities/proposal.md +140 -0
  30. package/plugins/litclaude/skills/lit-docx/references/tonalities/report.md +156 -0
  31. package/plugins/litclaude/skills/lit-docx/scripts/convert_md_to_docx.py +274 -73
  32. package/plugins/litclaude/skills/lit-docx/scripts/docx_design.py +2449 -0
  33. package/plugins/litclaude/skills/lit-docx/scripts/docx_layout.py +959 -0
  34. package/plugins/litclaude/skills/lit-docx/scripts/qa_docx.py +66 -9
  35. package/plugins/litclaude/skills/lit-docx/scripts/slop_lint.py +18 -6
  36. package/plugins/litclaude/skills/lit-docx/templates/tonalities/brief.yaml +28 -0
  37. package/plugins/litclaude/skills/lit-docx/templates/tonalities/journal.yaml +25 -0
  38. package/plugins/litclaude/skills/lit-docx/templates/tonalities/manual.yaml +26 -0
  39. package/plugins/litclaude/skills/lit-docx/templates/tonalities/memo.yaml +26 -0
  40. package/plugins/litclaude/skills/lit-docx/templates/tonalities/proposal.yaml +26 -0
  41. package/plugins/litclaude/skills/lit-docx/templates/tonalities/report.yaml +26 -0
  42. package/plugins/litclaude/skills/lit-pptx/SKILL.md +105 -48
  43. package/plugins/litclaude/skills/lit-pptx/references/agents/analyst.md +1 -1
  44. package/plugins/litclaude/skills/lit-pptx/references/agents/thesis.md +1 -1
  45. package/plugins/litclaude/skills/lit-pptx/references/anti-slop-checklist.md +59 -30
  46. package/plugins/litclaude/skills/lit-pptx/references/authoring-guide.md +119 -42
  47. package/plugins/litclaude/skills/lit-pptx/references/consensus-protocol.md +1 -1
  48. package/plugins/litclaude/skills/lit-pptx/references/data-display-cookbook.md +13 -6
  49. package/plugins/litclaude/skills/lit-pptx/references/density-and-fill.md +164 -0
  50. package/plugins/litclaude/skills/lit-pptx/references/design-system-azure.md +7 -4
  51. package/plugins/litclaude/skills/lit-pptx/references/direction-step.md +186 -0
  52. package/plugins/litclaude/skills/lit-pptx/references/examples/01-pitch-signal-ko.md +210 -0
  53. package/plugins/litclaude/skills/lit-pptx/references/examples/02-pitch-studio-ko.md +147 -0
  54. package/plugins/litclaude/skills/lit-pptx/references/examples/03-business-review-ledger-ko.md +199 -0
  55. package/plugins/litclaude/skills/lit-pptx/references/examples/04-business-review-night-en.md +203 -0
  56. package/plugins/litclaude/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +179 -0
  57. package/plugins/litclaude/skills/lit-pptx/references/examples/06-lecture-chalk-ko.md +199 -0
  58. package/plugins/litclaude/skills/lit-pptx/references/examples/07-data-review-night-en.md +194 -0
  59. package/plugins/litclaude/skills/lit-pptx/references/examples/08-image-led-atlas-ko.md +175 -0
  60. package/plugins/litclaude/skills/lit-pptx/references/examples/09-briefing-gazette-ko.md +204 -0
  61. package/plugins/litclaude/skills/lit-pptx/references/examples/10-status-update-ledger-ko.md +179 -0
  62. package/plugins/litclaude/skills/lit-pptx/references/examples/11-portfolio-studio-en.md +164 -0
  63. package/plugins/litclaude/skills/lit-pptx/references/examples/12-research-tutorial-chalk-en.md +174 -0
  64. package/plugins/litclaude/skills/lit-pptx/references/interview-protocol.md +1 -1
  65. package/plugins/litclaude/skills/lit-pptx/references/layout-families.md +198 -0
  66. package/plugins/litclaude/skills/lit-pptx/references/stages/autopilot.md +1 -1
  67. package/plugins/litclaude/skills/lit-pptx/references/stages/interview.md +2 -2
  68. package/plugins/litclaude/skills/lit-pptx/references/stages/plan.md +1 -1
  69. package/plugins/litclaude/skills/lit-pptx/references/title-treatments.md +109 -0
  70. package/plugins/litclaude/skills/lit-pptx/references/tonalities/atlas.md +139 -0
  71. package/plugins/litclaude/skills/lit-pptx/references/tonalities/chalk.md +148 -0
  72. package/plugins/litclaude/skills/lit-pptx/references/tonalities/gazette.md +149 -0
  73. package/plugins/litclaude/skills/lit-pptx/references/tonalities/ledger.md +149 -0
  74. package/plugins/litclaude/skills/lit-pptx/references/tonalities/night.md +147 -0
  75. package/plugins/litclaude/skills/lit-pptx/references/tonalities/paper.md +151 -0
  76. package/plugins/litclaude/skills/lit-pptx/references/tonalities/signal.md +150 -0
  77. package/plugins/litclaude/skills/lit-pptx/references/tonalities/studio.md +132 -0
  78. package/plugins/litclaude/skills/lit-pptx/scripts/compile-deck.js +64 -16
  79. package/plugins/litclaude/skills/lit-pptx/scripts/craft_extras.py +664 -3
  80. package/plugins/litclaude/skills/lit-pptx/scripts/deck_craft.py +48 -6
  81. package/plugins/litclaude/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
  82. package/plugins/litclaude/skills/lit-pptx/scripts/lib/layout-resolver.js +362 -11
  83. package/plugins/litclaude/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
  84. package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +211 -65
  85. package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-pack.js +3559 -0
  86. package/plugins/litclaude/skills/lit-pptx/scripts/lib/slide-ast.js +10 -6
  87. package/plugins/litclaude/skills/lit-pptx/scripts/lib/template-registry.js +286 -1
  88. package/plugins/litclaude/skills/lit-pptx/scripts/qa_deck.py +39 -10
  89. package/plugins/litclaude/skills/lit-pptx/scripts/validate_pptx.py +22 -7
  90. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
  91. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +4 -1
  92. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -1
  93. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +4 -1
  94. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +92 -0
  95. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +97 -0
  96. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +93 -0
  97. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +94 -0
  98. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/night/pack.yaml +93 -0
  99. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/paper/pack.yaml +98 -0
  100. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/signal/pack.yaml +94 -0
  101. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/studio/pack.yaml +92 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lit-pptx
3
- description: Build a finished PowerPoint deck (.pptx) from a request, notes or source files — Markdown slide source compiled through designed templates (AZURE-PRO blue and white by default, plus A2Z and plain 4:3 variants, or one learned from the user's own deck), native editable charts and KPI cards, Pretendard fonts embedded, a QA gate for overflow, contrast, sparse or table-only slides and blanks, rendered-page review and a 정/반/합 improvement loop. Use it whenever someone wants slides, a deck, a presentation, 발표자료, 슬라이드, PPT or 피피티 as a file. Charts inside a deck come from lit-scientific-visualization; a Word report comes from lit-docx.
3
+ description: Build a finished PowerPoint deck (.pptx) from a request, notes or source files — first a design direction chosen for the audience and content (eight tonalities with their own palette, type, title treatments and layout families; legacy AZURE and plain 4:3 templates, or one learned from the user's own deck, when named), then Markdown slide source compiled with native editable charts and KPI rows, Pretendard fonts embedded (A2Z on request), a QA gate for overflow, contrast, sparse or table-only slides, blanks, title-treatment and layout variety and empty lower halves, rendered-page review and a 정/반/합 improvement loop. Use it whenever someone wants slides, a deck, a presentation, 발표자료, 슬라이드, PPT or 피피티 as a file. Charts inside a deck come from lit-scientific-visualization; a Word report comes from lit-docx.
4
4
  ---
5
5
 
6
6
  ## #contract.activation
@@ -47,8 +47,9 @@ Code documentation, bug or test reports and quoted or fenced text stay inert. Th
47
47
 
48
48
  | Mode | Trigger | Completion boundary |
49
49
  | --- | --- | --- |
50
- | lit-default | The hook says "ask no style questions" (a bare `lit` request) | AZURE-PRO with Pretendard, no questions of any kind; a complete `.pptx` plus the Markdown source even when facts are missing (see "Missing facts"); gate PASS; pages looked at |
51
- | style-gate | Explicit invocation without a named template, and the user is present | One short question round (template · font · optional accent hex) with "AZURE-PRO · Pretendard · blue" as the first, one-click option; "알아서 / just make it good" means that default |
50
+ | lit-default | The hook says "ask no style questions" (a bare `lit` request) | The direction step chooses the tonality with no questions of any kind and the reply names it and two alternatives; a complete `.pptx` plus the Markdown source even when facts are missing (see "Missing facts"); gate PASS; pages looked at |
51
+ | style-gate | Explicit invocation without a named tonality or template, and the user is present | Run the direction step, then one short question round: the chosen tonality with its one-line reason as the first, one-click option, the two alternatives, and "compare them first"; "알아서 / just make it good" means the first option |
52
+ | compare | The user asks to see options, or the brief leaves the look open on purpose | The compare strip: the first three slides under the chosen tonality and both alternatives, rendered and shown; build the rest under the user's pick |
52
53
  | guided | A vague or large brief and the user is present | `references/stages/interview.md` → `references/stages/plan.md` → `references/stages/autopilot.md` |
53
54
  | autopilot | A clear brief, or the user delegated the details | 정/반/합 (below) then the compile → gate → look loop |
54
55
  | learn | The user supplied a branded `.pptx` | Learned template under `.lit-pptx/templates/<NAME>`, closed-set verified, then compile against it |
@@ -73,37 +74,71 @@ Run helpers by absolute path; never from the working directory, another cached p
73
74
  node "$LITCLAUDE_LIB/office-runtime.mjs" status # readiness, cache location, soffice/pandoc/xelatex
74
75
  # cache: ${XDG_CACHE_HOME:-~/.cache}/litclaude/office-runtime, or $LITCLAUDE_OFFICE_RUNTIME when set
75
76
  ```
76
- 2. **Pick the template.** `node scripts/compile-deck.js --list-templates`, then `--list-layouts <TEMPLATE>` for the layouts and blocks it supports.
77
-
78
- | Template | Canvas | Font | Look |
79
- | --- | --- | --- | --- |
80
- | `AZURE-PRO` (default) | 16:9 · 13.333×7.5 in | Pretendard | Blue and white: geometric cover, tinted numbered cards, KPI badges, navy section dividers |
81
- | `AZURE-A2Z` | 16:9 | 에이투지체 | The same design with A2Z type |
82
- | `BOILERPLATE-PRETENDARD` | 4:3 · 10×7.5 in | Pretendard | Plain professional; no `section` layout |
83
- | `BOILERPLATE-A2Z` | 4:3 | 에이투지체 | Plain, A2Z type |
84
- | learned | from the source deck | from the source deck | `scripts/learn_template.py`; no company brand template ships with the skill |
85
-
86
- Azure-style templates also take `--font pretendard|a2z`, `--accent "#RRGGBB"` (a WCAG-checked palette and recoloured gradient art are derived from it) and `--bg mesh` (blurred gradient wash), or the same keys as `font:`, `accent:`, `background:` in the deck frontmatter.
87
- 3. **Outline before prose.** One message per slide, written as the slide title ("방문은 늘었고 대출은 제자리다", not "현황"). Typical shape: cover · where things stand · evidence · options compared · recommendation · next steps · closing. Aim for the fewest slides that carry the argument; split a slide that needs more than four groups or about eight lines.
77
+ 2. **Choose the direction first: the direction card.** Before any slide is written, decide how the deck should look and write that decision down. A look is a tonality: a pack of palette roles, faces, type ramp, title treatments, layout families, decoration and density that the engine reads as data. Eight ship with the skill, and the engine has no default: a deck compiles only under a tonality or a template that someone chose. Follow `references/direction-step.md`:
78
+ - Close the brief: deck type, reader, delivery (presented or read), language. Infer what the brief leaves out and write the inference on the card.
79
+ - Draft the outline (step 3) far enough to count it, then rank the candidates. The deck type gives two or three; the content signals reorder them:
80
+
81
+ | Deck type | Candidates in order (density, variance) |
82
+ | --- | --- |
83
+ | Pitch (투자·제안 피치) | Signal (10, 6) · Studio (10, 7) · Atlas (10, 7) when the product is visual |
84
+ | Business review (경영 실적 보고) | Ledger (10, 5) · Gazette (10, 4) when circulated in Korean · Night (10, 6) on a stage |
85
+ | Research talk (연구 발표) | Paper (10, 5) · Night (10, 5) in a keynote room · Chalk (10, 6) for a tutorial |
86
+ | Lecture or teaching (강의) | Chalk (10, 6) · Paper (10, 5) · Studio (10, 7) for a public lecture |
87
+ | Data-heavy review (데이터 리뷰) | Night (10, 6) · Ledger (10, 5) · Paper (10, 5) for a written analysis |
88
+ | Image-led (product, site, portfolio) | Atlas (10, 7) · Studio (10, 8) · Signal (10, 6) for a launch |
89
+ | Korean text briefing (보고서형 덱) | Gazette (10, 4) · Ledger (10, 5) |
90
+ | Status update (주간·월간 보고) | Ledger (10, 5) · Gazette (10, 4) · Night (10, 6) |
91
+
92
+ | Content signal, counted on the outline | Effect |
93
+ | --- | --- |
94
+ | The brief names a tonality, or a legacy template | use it; the card still records it and names two alternatives |
95
+ | Read rather than presented (sent ahead, "보고서") | Gazette (Korean) or Ledger to the front, density 10 |
96
+ | 30 % or more slides with a table / a chart / an image | Ledger or Gazette / Ledger, Night or Paper / Atlas or Studio up one place |
97
+ | Long bodies (150+ Korean glyphs, 300+ Latin chars per slide) / short bodies (40 / 80 or fewer) | Gazette or Ledger up, Signal down / Signal or Studio up; density 10 still (the strip and the basis rows fill short slides) |
98
+ | Citations or a references slide / definitions or a 3+ step how-it-works / a dark room | Paper up / Chalk or Paper up / Night up |
99
+ | A pack has no family or title for one of the outline's slides | drop that pack |
100
+
101
+ Pick the first candidate after reordering; the next two are the alternatives. Ties keep the deck-type order, so the same source always gets the same choice.
102
+ - Write the card: deck type, reader, tonality and the two alternatives, a one-sentence reason tied to the audience and the signals that fired, the dials (density and variance, with any move from the pack default; at most 2 per dial without asking the user), the treatments by slide role (from the tonality sheet), one family per slide, and **what would make this direction wrong** (for example "if the file is read alone before the meeting, Gazette fits better"). A build that cannot fill the tonality and the reason stops and asks; there is no silent default look.
103
+ - Put the card in the build log beside the source and say the choice in the reply: the tonality, why, and the two alternatives, in two or three plain sentences.
104
+ - **Compare strip.** When the user asks to compare, or the brief leaves the look open on purpose ("어떤 느낌이 좋을지 모르겠다", "show me options"), compile and render the first three slides under the chosen tonality and both alternatives, show the three rows, and build the rest under the one the user picks. Same content, same order; only the tonality changes.
105
+ - **Legacy templates.** `AZURE-PRO`, `AZURE-A2Z`, `BOILERPLATE-PRETENDARD` and `BOILERPLATE-A2Z` keep their names and their single look. Use one only when the user names it or an existing source already says `template:`; the reply still offers two tonalities. Learned brand templates work the same way (mode `learn`).
106
+
107
+ | Tonality | Character | Sheet |
108
+ | --- | --- | --- |
109
+ | `ledger` | numbers first, dense reading pages, tabular, quiet green-teal accent | `references/tonalities/ledger.md` |
110
+ | `signal` | short, bold slides with one hot accent, KPI rows and data panels for a pitch | `references/tonalities/signal.md` |
111
+ | `atlas` | pictures carry the deck; titles on panels or under large images | `references/tonalities/atlas.md` |
112
+ | `chalk` | teaching: numbered steps, worked examples, a fenced note for the definition | `references/tonalities/chalk.md` |
113
+ | `paper` | ink on white, figures with numbered captions, booktabs tables, citations | `references/tonalities/paper.md` |
114
+ | `gazette` | Korean briefing pages: header band, boxed summary, 개조식 evidence at reading size | `references/tonalities/gazette.md` |
115
+ | `studio` | editorial grid, asymmetric splits, side titles, real part numbers | `references/tonalities/studio.md` |
116
+ | `night` | dark ground and light type for data and technical keynotes | `references/tonalities/night.md` |
117
+
118
+ `node scripts/compile-deck.js --list-tonalities` prints the eight and the legacy templates; `--list-layouts <tonality>` prints the pack's families with the title treatments each allows, and its cover, section and closing variants.
119
+ 3. **Outline before prose.** One message per slide. The slide title is a specific topic label that names the subject, the measure and the period ("분기별 방문·대출 추이"; not a sentence such as "방문은 늘었고 대출은 제자리다", and not a bare "현황"); the message itself is the first line of the body. Cover titles are the topic or product name, never a slogan. Typical shape: cover · where things stand · evidence · options compared · recommendation · next steps · closing; each deck type has its own sequence in `references/direction-step.md`. Aim for the fewest slides that carry the argument; split a slide that needs more than four groups or about eight lines. Name one layout family per slide from the chosen pack, by the slide's job (`references/layout-families.md`), never by what the previous slide used.
88
120
  4. **Give every message the visual that fits it, sized to the slide.** The gate measures this (step 7), so decide per slide before writing:
89
121
 
90
- | The message is… | Use | Syntax |
122
+ | The message is… | Family under a tonality | Syntax |
91
123
  | --- | --- | --- |
92
- | two to four headline numbers | KPI cards | a one-row pipe table with 2–4 short values (or a two-column value/label table of up to four rows) — the Azure templates draw it as cards |
93
- | a series over time or a comparison across items | a native, editable chart | `::: chart type=column\|bar\|line\|area\|stacked\|pie\|doughnut unit="억 원"` around a pipe table: first column = categories, one column per series |
94
- | parallel points, causes, options, steps | numbered cards | `- **Header**` groups with `(1)` `(2)` items, or `summary` groups; a card is as tall as its text, so a row of two-line cards leaves the lower slide free — put the takeaway there (`layout: main` + `::: main-box`, which moves up to sit under the cards) or give each card the evidence behind its point |
95
- | a lookup the reader scans row by row | a table | a pipe table; the engine right-aligns number columns and grows the rows to fill the slide |
96
- | the one sentence to remember | a callout | `::: main-box` on a `main` slide |
97
-
98
- Vary the visuals across the deck: a deck whose content slides are mostly tables and has no chart fails the gate. Keep one message per slide; if a visual leaves most of the slide empty, merge the slide with its neighbour or add the takeaway beside it. Sources and captions on a Korean deck are short and in Korean (기관·문서명·연도), never a long English citation. Measured scientific data (instrument output, statistics with uncertainty) still goes to lit-scientific-visualization and comes back as a captioned figure; conceptual pictures go to lit-diagram-drawer.
99
- 5. **Write the Markdown source** as `<name>.md` beside the output. Read `references/authoring-guide.md` first; `specs/markdown-slide-spec-v1.md` and `specs/markdown-slide-spec-v2.md` are the contract. The rules that break decks most often:
124
+ | a claim and its reasons | `summary-box-list`, or the family of the evidence (table, chart, KPI row) with the claim as its first takeaway | a label title; the claim boxed or first, then the reasons with their numbers |
125
+ | two to four related figures | `big-number` (a data panel) | a pipe table: labels in the head, values in row 1, each figure's basis or comparison in row 2 ("전년 대비 +12%", "목표 50%"); a `>` caption with period and source; two or three evidence bullets |
126
+ | two to four headline numbers | `kpi-row`, or `kpi-over-chart` with the trend | the same table shape: labels, values, and a second row with each value's basis |
127
+ | a series over time or a comparison across items | `chart-insight`, `full-chart`, `dashboard-grid` | `::: chart type=column\|bar\|line\|area\|stacked\|pie\|doughnut unit="억 원"` around a pipe table: first column = categories, one column per series |
128
+ | a lookup the reader scans row by row | `table-insight` (takeaway beside) or `ledger-table` (takeaway under) | a pipe table with a `>` caption, then takeaway bullets |
129
+ | two sides read across | `comparison` | `:::: columns 1fr 1fr` with a `- **head**` and `(1)` `(2)` items per side |
130
+ | steps or dated events | `process`, `step-diagram`, `timeline` | `- **1. 단계** what happens`, or a table of date, task, owner |
131
+ | a picture and its reading | `image-full`, `image-split`, `photo-grid`, `figure-pair`, `figure-academic` | `![도 1. … \| 출처: …](path.png)` then bullets |
132
+
133
+ On a legacy Azure template the same messages take its layouts: KPI cards from a small one-row table, numbered cards from `- **Header**` groups with `(1)` `(2)` items, and a `::: main-box` callout on a `main` slide. There, a card is as tall as its text, so a row of two-line cards leaves the lower slide free — put the takeaway there or give each card the evidence behind its point. Vary the visuals across the deck: a deck whose content slides are mostly tables and has no chart fails the gate. Sources and captions on a Korean deck are short and in Korean (기관·문서명·연도), never a long English citation. Measured scientific data (instrument output, statistics with uncertainty) still goes to lit-scientific-visualization and comes back as a captioned figure; conceptual pictures go to lit-diagram-drawer.
134
+ 5. **Write the Markdown source** as `<name>.md` beside the output, with `tonality:` in its frontmatter. Read `references/authoring-guide.md` first and open the example in `references/examples/` closest to the job; `specs/markdown-slide-spec-v1.md` and `specs/markdown-slide-spec-v2.md` are the contract. The rules that break decks most often:
100
135
  - The slide separator is exact: a `---` line, a blank line, then `---` and the next `layout:` line.
101
- - `cover` and `closing` take one `#` title and nothing else. Cover subtitle, eyebrow and date come from frontmatter keys (`subtitle:`, `eyebrow:`, `date:`). `notice:` prints a coloured tag (light red fill, dark red bold text) at the bottom left of every slide, cover included — use it for "예시 데이터 — 실제 수치로 바꿔 주세요" so no single slide can be passed on as sourced.
102
- - `content` takes one `##` title; body bullets are `- **Group header**` with `(1)` `(2)` sub-items, which the rich templates render as numbered cards.
103
- - `summary` groups come from `###` headings (first group top, second bottom); `section` is a divider with one `#` title (Azure templates only).
136
+ - Covers, sections and closings are variants (`cover-figures`, `section-rule`, `closing-ask` …; `references/layout-families.md`). A cover or section takes one `#` title; date, department and presenter come from frontmatter keys. `notice:` prints a coloured tag (light red fill, dark red bold text) at the bottom left of every slide, cover included — use it for "예시 데이터 — 실제 수치로 바꿔 주세요" so no single slide can be passed on as sourced.
137
+ - A content slide takes one `##` title that names its topic as a label, never a declarative sentence (the gate's OF-114 fails a Korean title ending in -다, -니다, -요 or a claim in -음/-함/-됨, and an English title with a finite verb or a final period; the same holds for `subtitle:`). `title: <treatment>` on the line after `layout:` pins that slide's title treatment when the pack and the family allow it (`references/title-treatments.md`); otherwise the engine picks among the allowed treatments by how well the body fills.
138
+ - **Write so the slides fill** (`references/density-and-fill.md`): every content slide carries its supporting facts (the basis, a comparison with the previous period, plan or a peer, the period, the source, and the implication or next step), and every data slide ends with a `출처:` / `Source:` line the engine sets as a strip at the foot; KPI rows hold four to six figures with a basis row, tables five to eight rows, comparisons three or four labelled criteria; figures come in structured groups with their basis, never one giant number; every table gets a two- or three-line takeaway; every chart gets a caption and two or three takeaways; a closing carries the ask, what is to be approved and the next step with owner and date, never "감사합니다" alone. When a slide still has little to say, merge it or give it a family made for short content; never pad.
104
139
  - A table or chart caption is a blockquote line (`> …`) right after the table, or inside the `::: chart` block; do not number it yourself — the engine adds "표 N." for tables and "도 N." for charts and figures on a Korean deck, and "Table N." / "Figure N." on any other (frontmatter `lang: ko|en` overrides the detection).
105
140
  - Figures: `![<caption> (출처: <source>)](path.png)` followed by a short interpretation that reads the evidence.
106
- - Placement beyond the template uses the three tiers in the spec: `::: region name=…`, `:::: columns 2fr 1fr` with `::: col`, then absolute `::: box` / `::: shape` or `layout: free`. Any tier-3 or free slide must be looked at after rendering.
141
+ - Placement beyond the families uses the three tiers in the spec: `::: region name=…`, `:::: columns 2fr 1fr` with `::: col`, then absolute `::: box` / `::: shape` or `layout: free`. Any tier-3 or free slide must be looked at after rendering, and a title is never placed with a free box.
107
142
 
108
143
  **Missing facts under `lit`.** A bare `lit` request is a delegation: never stop to ask, and never leave `[제품명]`, `[금액]`, `XXX`, `TBD` or `○○` blanks. When the sources do not give a company, product, period or number, choose a realistic, internally consistent example (a plausible company name, figures that add up), label it on the page — `notice: 예시 데이터 — 실제 수치로 바꿔 주세요` in the frontmatter, and "(예시)"/"(가정)" in captions — and say in the reply which values are examples and what to replace. Invented values are never presented as sourced. An explicit, non-lit request may still ask one question first.
109
144
  **Numbers from a data file.** When the deck quotes the same figures on several slides, or shows totals, shares, growth, margins or a payback that must agree, keep the numbers in one small file beside the source and let the compiler write them in. Raw inputs go in a CSV (first column = row keys) or in `values`; every derived number is a formula; the relations a reader would check are declared. `compile-deck.js` computes the formulas, fills the placeholders and stops with `Data error: data check failed: …` when a check does not hold, so a total can never disagree with its parts and a KPI card, a chart and a table always show the same figure:
@@ -118,24 +153,36 @@ Run helpers by absolute path; never from the working directory, another cached p
118
153
  On the slides write `{{ now }}` (thousands separators by default; a whole amount prints without decimals, so give a format such as `| .1f` only to values that really have them — `24.0억 원` reads as a typo for `24억 원`), `{{ growth_pct | +.1f }}%`, a KPI row of placeholders, or `{{ table:regions }}` for the whole table with its derived columns and total row; inside a `::: chart` block use `{{ table:regions | columns=방문,대출 no-total }}` so the chart plots only the series, not the total or a percentage column. Run `python3 lib/office_data.py check deck.md` to see every computed value and check before compiling, and quote numbers in the reply from that output. Deliver the data file and CSVs with the deck: they are how the reader re-runs the numbers. Formulas allow arithmetic, `sum avg min max abs round len growth share approx`, `table.column`, `table.column['row']` and `table['column name']` — nothing else runs.
119
154
  6. **Compile with embedded fonts.**
120
155
  ```bash
121
- node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template AZURE-PRO --pptx deck.pptx --embed-fonts
156
+ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --pptx deck.pptx --embed-fonts # the tonality comes from the frontmatter
157
+ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template AZURE-PRO --pptx deck.pptx --embed-fonts # only when the user named the template
122
158
  ```
123
- `--embed-fonts` adds the bundled Pretendard or A2Z faces (`fonts/`, SIL OFL, see `fonts/provenance.json`) to the package and then runs the OOXML integrity check (`lib/ooxml_integrity.py`: zip, content types, well-formed parts, relationship targets, embedded-font parts, no `NaN` attribute values, python-pptx reopen). A family the skill does not bundle (from a learned template) is skipped with a warning.
124
- 7. **Gate.** `python3 scripts/qa_deck.py deck.pptx` must exit 0. It combines the layout inventory (`scripts/layout_inventory.py`: text spilling out of its frame, text or a grown table past the canvas, a text box off the canvas), WCAG contrast on the real fill (body 4.5:1, large 3:1), picture/table occlusion, text-on-text collisions, the anti-slop term list (`scripts/forbidden-terms.json`), objective evidence checks (captions with 출처/Source, appendix links as real hyperlinks, no text under 6 pt), package integrity, and the deck-craft checks (`scripts/deck_craft.py`): a content slide whose content fills less than 45% of the area under its title, a deck that is mostly tables with no chart, a shape running off the canvas, an empty outlined box, an unfilled `[blank]`, and a long foreign-language source line on a Korean deck. The craft-floor checks (`scripts/craft_extras.py`, ids OF-101 to OF-109) add one accent colour per slide, body lines at most 90 characters (38 for Korean), right-aligned numeric columns, concentric nested frames, cards spaced at least twice the gap between their contents (advisory for now), no gradient text, glow or emoji bullets, and no empty band over 35% of a slide or card; a MEDIUM finding is reported as advisory. Every failure reason carries a fix hint. Fix the Markdown, never the gate: change the visual (step 4), merge or split slides, shorten text.
125
- 8. **Look at the pages.** `python3 lib/render_pages.py deck.pptx --out-dir renders --pages 99`, then open the PNGs. Read every slide at its real size: hierarchy, Korean glyphs, numbers against the source, anything the gate cannot see (a cramped card, an empty half-slide, a title that wraps into a widow). Fix and recompile until the gate passes and the pages read well — this compile → gate → look loop is the 정/반/합 below in miniature (the gate and your look are the 반). Three full rounds is the budget; a defect that survives them is reported as a limitation.
126
- 9. **Deliver.** The `.pptx`, its Markdown source and, when useful, the rendered PNGs sit in the user's directory. Never leave generated files inside the skill.
159
+ The first line of output names the tonality, density, variance and grid. `note:` lines say where the engine drew something other than what the source asked (a family the pack lacks, a variant that cannot be drawn, a title moved for its glyph budget or for fill); `fill:` lines say which slides the fill policies grew and by how much. Copy both into the build log and fix the source when a note shows it asked for the wrong thing. `--embed-fonts` adds the bundled Pretendard or A2Z faces (`fonts/`, SIL OFL, see `fonts/provenance.json`) to the package and then runs the OOXML integrity check (`lib/ooxml_integrity.py`: zip, content types, well-formed parts, relationship targets, embedded-font parts, no `NaN` attribute values, python-pptx reopen). A family the skill does not bundle (from a learned template) is skipped with a warning.
160
+ 7. **Gate.** `python3 scripts/qa_deck.py deck.pptx` must exit 0. It combines the layout inventory (`scripts/layout_inventory.py`: text spilling out of its frame, text or a grown table past the canvas, a text box off the canvas), WCAG contrast on the real fill (body 4.5:1, large 3:1), picture/table occlusion, text-on-text collisions, the anti-slop term list (`scripts/forbidden-terms.json`), objective evidence checks (captions with 출처/Source, appendix links as real hyperlinks, no text under 6 pt), package integrity, and the deck-craft checks (`scripts/deck_craft.py`): a content slide whose content fills less than 45% of the area under its title, a deck that is mostly tables with no chart, a shape running off the canvas, an empty outlined box, an unfilled `[blank]`, and a long foreign-language source line on a Korean deck. The craft-floor checks (`scripts/craft_extras.py`) add, per slide (OF-101 to OF-109), one accent colour, body lines at most 90 characters (38 for Korean), right-aligned numeric columns, concentric nested frames, cards spaced at least twice the gap between their contents (advisory for now), no gradient text, glow or emoji bullets, and no empty band over 35% of a slide or card; and over the whole deck (OF-110 to OF-113), read from the compiled file: at least three title treatments on a deck of eight or more slides, each title drawn as the treatment it is named; content slides that do not share one composition (title zone × body partition × dominant content) on more than 40% of them; a median empty band under the body of at most 0.20; one title frame per treatment; titles and the cover subtitle written as labels, not sentences (OF-114); no region left empty (OF-115: a bottom title that ends above the floor, a side rail under half used, a text or picture column whose largest empty band beside a longer column passes 40 % of the body, even when a source strip closes it, a title panel taller than its text, a plate under an empty page); no light figure card on a dark ground (OF-117); no bold run-in label running into its sentence without a separator (OF-118; the engine sets the colon); and no count numeral beside an agenda title (OF-119). When the user is shown two tonalities of one source, `--sibling other.pptx` adds OF-116: the two must differ in skeleton (title zone and partition) on at least two content slides. On a legacy template the variety checks and the median band are advisories. A MEDIUM finding is reported as advisory. Every failure reason carries a fix hint. Fix the Markdown, never the gate: change the family or the visual (step 4), add the takeaway the slide lacks, merge or split slides, shorten text.
161
+ 8. **Look at the pages.** `python3 lib/render_pages.py deck.pptx --out-dir renders --pages 99`, then open the PNGs. Read every slide at its real size: hierarchy, Korean glyphs, numbers against the source, anything the gate cannot see (a cramped card, an empty half-slide, a title that wraps into a widow, a title treatment that does not suit the slide's job). Check the deck against its direction card: if the card's "wrong if" line turned out true, rebuild under the alternative and update the card and the reply. Fix and recompile until the gate passes and the pages read well — this compile → gate → look loop is the 정/반/합 below in miniature (the gate and your look are the 반). Three full rounds is the budget; a defect that survives them is reported as a limitation.
162
+ 9. **Deliver.** The `.pptx`, its Markdown source, the build log and, when useful, the rendered PNGs sit in the user's directory. The reply names the direction and the two alternatives. Never leave generated files inside the skill.
163
+
164
+ The files of one build, side by side in the user's directory:
165
+
166
+ ```text
167
+ deck.md the source; tonality: in its frontmatter
168
+ deck.build.md the direction card, the compile notes and fill lines, the gate result
169
+ deck.pptx the compiled deck
170
+ renders/ page PNGs from the look step
171
+ ```
127
172
 
128
173
  The whole loop, by absolute path:
129
174
 
130
175
  ```bash
131
- node "$SKILL_ROOT/scripts/compile-deck.js" --list-templates
132
- node "$SKILL_ROOT/scripts/compile-deck.js" --list-layouts AZURE-PRO
176
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-tonalities # eight tonalities and the legacy templates
177
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-layouts ledger # families, allowed titles, variants of one pack
178
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-templates # legacy and learned templates
133
179
  python3 "$LITCLAUDE_LIB/office_data.py" check deck.md # when the frontmatter names data:
134
- node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template AZURE-PRO --pptx deck.pptx --embed-fonts
180
+ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --pptx deck.pptx --embed-fonts
135
181
  python3 "$SKILL_ROOT/scripts/qa_deck.py" deck.pptx # exit 0 required
136
182
  python3 "$SKILL_ROOT/scripts/layout_inventory.py" deck.pptx --issues-only # geometry detail when the gate fails
137
183
  python3 "$SKILL_ROOT/scripts/deck_craft.py" deck.pptx # per-slide fill and craft findings
138
- python3 "$SKILL_ROOT/scripts/craft_extras.py" deck.pptx # craft-floor findings (OF-101..OF-109)
184
+ python3 "$SKILL_ROOT/scripts/craft_extras.py" deck.pptx # craft floor (OF-101..OF-109) and deck output checks (OF-110..OF-119)
185
+ python3 "$SKILL_ROOT/scripts/qa_deck.py" deck.pptx --sibling other.pptx # two tonalities of one source: OF-116 skeleton check
139
186
  python3 "$LITCLAUDE_LIB/render_pages.py" deck.pptx --out-dir renders --pages 99
140
187
  python3 "$LITCLAUDE_LIB/ooxml_integrity.py" deck.pptx # also run by the gate and by --embed-fonts
141
188
  python3 "$SKILL_ROOT/scripts/learn_template.py" brand.pptx --name MY-BRAND # writes .lit-pptx/templates/MY-BRAND
@@ -145,25 +192,27 @@ python3 "$SKILL_ROOT/scripts/learn_template.py" brand.pptx --name MY-BRAND # wr
145
192
 
146
193
  Use it for a deck that will be presented to decision makers, or whenever the first render reads flat. Each step is a Claude Code subagent (`Agent` tool, `general-purpose`) whose prompt is the role file plus the inputs:
147
194
 
148
- 1. 정 — `references/agents/thesis.md` writes the full Markdown deck from the brief and sources.
195
+ 1. 정 — `references/agents/thesis.md` writes the full Markdown deck from the brief, the sources and the direction card.
149
196
  2. 반 — `references/agents/antithesis.md` critiques it with severities: argument gaps, weak titles, unsupported numbers, density, anti-slop tells.
150
197
  3. 합 — `references/agents/synthesizer.md` merges both into the improved source and a short change summary.
151
198
  4. Then steps 6–8 above. Critique is cheaper than regeneration, so this raises quality without full rewrites. `references/stages/autopilot.md` holds the full loop and its resumable state file; `references/consensus-protocol.md` the planner/architect/critic variant used by `references/stages/plan.md`.
152
199
 
153
- ### Design laws (binding for every template)
200
+ ### Design laws (binding for every tonality and template)
201
+
202
+ The full checklist is `references/anti-slop-checklist.md`; each tonality's tokens are in its sheet under `references/tonalities/`; the legacy Azure colour system is `references/design-system-azure.md`; data display patterns are in `references/data-display-cookbook.md`.
154
203
 
155
- The full checklist is `references/anti-slop-checklist.md`; the Azure colour system is `references/design-system-azure.md`; data display patterns are in `references/data-display-cookbook.md`.
204
+ - **Direction.** One tonality per deck, chosen for the audience and the content and recorded on the card. Title treatments follow slide roles (three to five per deck, each in one fixed frame); layout families follow slide jobs; the pack's decoration list is the only decoration.
156
205
 
157
- - **Hierarchy.** Exactly one primary element per slide, at least twice the size of the next level, top or left; two or three secondary; the rest muted. At most four items per group. Keep density even across the deck.
158
- - **Type.** Primary reading text ≥ 12 pt; 6–10.5 pt only for sources and labels with passing contrast; display ≤ 40 pt. One size ramp, no near-equal sizes (14/15/16). Weight builds hierarchy; at most four weights. Korean body line spacing at the loose end (1.3–1.45). No one-word widow on a title's last line.
159
- - **Colour.** Tinted neutrals carry most of the surface, one accent ≤ ~10% marks the single emphasised item. One colour, one meaning, across the deck. No per-slide one-off hex.
206
+ - **Hierarchy and fill.** Exactly one primary element per slide, at least twice the size of the next level; two or three secondary; the rest muted. At most four items per group. Density follows the dial, evenly across the deck, and content slides use their body down toward the floor.
207
+ - **Type.** Primary reading text ≥ 12 pt (13 pt on the compact step every pack starts from), table cells and captions ≥ 11 pt, sources ≥ 9 pt with passing contrast. One size ramp (presented, reading or compact, set by the pack and the density dial), no near-equal sizes (14/15/16); display sizes only on cover, section and statement titles; no hero step, and every figure at title size at most, inside a structure that gives its label, unit, basis and source. Pretendard Regular and Bold by default; the A2Z faces only when the user or the source asks (`faces: a2z`). Weight builds hierarchy; at most four weights. Korean body line spacing at the loose end (1.3–1.45). No one-word widow on a title's last line.
208
+ - **Colour.** Every colour comes from the pack's roles. Tinted neutrals carry most of the surface, one accent ≤ ~10% marks the single emphasised item. One colour, one meaning, across the deck. No per-slide one-off hex.
160
209
  - **Contrast floors.** Body and captions 4.5:1 on their actual fill, large text and structural lines 3:1. Push toward ink when close; no grey text on a coloured fill.
161
- - **Anti-slop bans.** No side-stripe accent bars, no border plus heavy shadow on one card, no card inside a card, no eyebrow or 01·02·03 ordinal on every slide, no identical icon-card grids as filler, no cream or beige reading ground, no hand-drawn decoration, no generic titles ("개요", "Overview"), no padding bullets that restate the title, no placeholder or AI-tell wording.
210
+ - **Anti-slop bans.** No side-stripe accent bars, no border plus heavy shadow on one card, no card inside a card, no eyebrow or 01·02·03 ordinal on every slide, no identical icon-card grids as filler, no cream or beige reading ground, no hand-drawn decoration, no generic titles ("개요", "Overview"), no declarative titles or subtitles, no single exaggerated number as a slide, no padding bullets that restate the title, no placeholder or AI-tell wording.
162
211
  - **Evidence.** Separate observation, inference, limitation and proposal. Every sourced number traces to its source and every example value is labelled as one; every figure or table carries a caption with 출처/Source or "(예시)". Expand specialist abbreviations on first use. Unsupported absolutes are review findings.
163
212
 
164
213
  ## #contract.outputs
165
214
 
166
- `<name>.pptx` and `<name>.md` in the user's directory (plus the data file and its CSVs when the numbers come from one, and `renders/` when pages were rendered). The reply names the file, the template, the slide count and anything cut, merged or assumed from the sources. Gate JSON and render receipts stay internal unless the user asks.
215
+ `<name>.pptx` and `<name>.md` in the user's directory, with the build log beside them (plus the data file and its CSVs when the numbers come from one, and `renders/` when pages were rendered). The reply names the file, the slide count, the direction (the tonality or named template, the one-line reason and the two alternatives) and anything cut, merged or assumed from the sources. Gate JSON and render receipts stay internal unless the user asks.
167
216
 
168
217
  ## #contract.output_channels
169
218
 
@@ -176,7 +225,7 @@ Reader mode is the default. Slides carry subject matter only: no generator credi
176
225
 
177
226
  ## #contract.evidence
178
227
 
179
- A PASS needs, on the final file: `compile-deck.js` exit 0, `qa_deck.py` exit 0, and rendered pages that were opened when soffice exists. Record the gate result, the render directory and what the pages showed in task evidence, not in the deck.
228
+ A PASS needs, on the final file: a direction card with a tonality and a reason, `compile-deck.js` exit 0, `qa_deck.py` exit 0 (deck output checks included), and rendered pages that were opened when soffice exists. Record the card, the compile notes and fill lines, the gate result, the render directory and what the pages showed in the build log and task evidence, not in the deck.
180
229
 
181
230
  ## #contract.hard_stops
182
231
 
@@ -186,19 +235,27 @@ A PASS needs, on the final file: `compile-deck.js` exit 0, `qa_deck.py` exit 0,
186
235
  - Never present an invented number, quote or source as sourced. Example values are allowed only when facts are missing, and then they are labelled on the page and in the reply.
187
236
  - Never add a company logo, trademark or "official template" claim the user did not supply.
188
237
  - Never report PASS from a gate that did not run, or a visual check without opened pages.
238
+ - Never build without a chosen direction: no tonality and no reason on the card means stop and ask, never a silent default look.
189
239
 
190
240
  ## #contract.anti_patterns
191
241
 
192
- A deck that restates the request instead of answering it; stopping to ask for data under a bare `lit`, or handing back a template of `[blanks]`; a deck of tables with no chart or card; a short table at the top of an otherwise empty slide; decorations cropped at the canvas edge; long English citations on Korean slides; topic-label titles; one idea spread over three thin slides or six ideas crammed into one; decorative charts drawn from shapes; numbers that do not match the source; a total, share or growth rate typed by hand that disagrees with its parts or with another slide; a sample-data label only a close reader would find; shrinking text to beat the overflow check; weakening a gate threshold; a caption numbered twice; a Markdown-only or HTML-only answer when a deck file was asked for; and "done" reported from the gate alone without looking at the pages.
242
+ A deck that restates the request instead of answering it; stopping to ask for data under a bare `lit`, or handing back a template of `[blanks]`; a deck of tables with no chart or card; a short table at the top of an otherwise empty slide; decorations cropped at the canvas edge; long English citations on Korean slides; generic titles ("현황") or sentence titles that state the claim instead of naming the topic; a giant single figure with nothing around it; one idea spread over three thin slides or six ideas crammed into one; decorative charts drawn from shapes; numbers that do not match the source; a total, share or growth rate typed by hand that disagrees with its parts or with another slide; a sample-data label only a close reader would find; shrinking text to beat the overflow check; one look for every topic, or a direction named without its reason and alternatives; every content slide under the same title treatment or the same composition; a title nudged off its treatment's frame with a free box; a statement, table, big number or closing with nothing under it while the lower half stays empty; padding bullets or decoration added to fill space; weakening a gate threshold; a caption numbered twice; a Markdown-only or HTML-only answer when a deck file was asked for; and "done" reported from the gate alone without looking at the pages.
193
243
 
194
244
  ## Reference map
195
245
 
196
246
  | Need | Read |
197
247
  | --- | --- |
248
+ | Choosing the direction, the card, the compare strip | `references/direction-step.md` |
249
+ | One tonality's tokens, treatments, families, do and avoid, two worked slides | `references/tonalities/<id>.md` (ledger, signal, atlas, chalk, paper, gazette, studio, night) |
250
+ | Where titles sit and how the engine picks them | `references/title-treatments.md` |
251
+ | Which family does which job, covers, sections and closings | `references/layout-families.md` |
252
+ | The density and variance dials, fill policies, writing source that fills | `references/density-and-fill.md` |
253
+ | Complete decks that compile and pass the gate | `references/examples/` (twelve, all eight tonalities and deck types) |
198
254
  | Authoring the Markdown dialect | `references/authoring-guide.md`, `specs/markdown-slide-spec-v1.md`, `specs/markdown-slide-spec-v2.md` |
199
255
  | AST shape for debugging a compile error | `specs/slide-ast-v1.schema.json`, `specs/slide-ast-v2.schema.json` |
256
+ | The pack files the engine reads | `templates/tonalities/<id>/pack.yaml` |
200
257
  | Enrolling or learning a template | `specs/template-enrollment-contract.md`, `scripts/learn_template.py --help` |
201
- | Design laws in full | `references/anti-slop-checklist.md`, `references/design-system-azure.md` |
258
+ | Design laws in full | `references/anti-slop-checklist.md`; the legacy Azure system in `references/design-system-azure.md` |
202
259
  | Tables, KPIs and figures | `references/data-display-cookbook.md` |
203
260
  | Data file format, formulas, checks, placeholders | `../../lib/office_data.py` (module docstring) |
204
261
  | Interview, planning and autopilot stages | `references/stages/*.md`, `references/interview-protocol.md`, `references/consensus-protocol.md` |
@@ -17,7 +17,7 @@ Extract structured requirements from a user's presentation request, separating w
17
17
 
18
18
  ### 3. Structure & Scope
19
19
  - Slide count (stated or implied)? Sections to cover? Layout needs (cover/content/main/summary/closing)?
20
- - **Template & brand**: did the user name a template or font (e.g. BOILERPLATE-PRETENDARD, BOILERPLATE-A2Z/에이투지체, or a learned brand template)? Do they have an existing branded `.pptx` to learn from (`scripts/learn_template.py`)? If unspecified, default is AZURE-PRO.
20
+ - **Template & brand**: did the user name a template or font (e.g. BOILERPLATE-PRETENDARD, BOILERPLATE-A2Z/에이투지체, or a learned brand template)? Do they have an existing branded `.pptx` to learn from (`scripts/learn_template.py`)? If unspecified, the direction step chooses a tonality from the deck type and the content signals (`references/direction-step.md`); report the signals you see.
21
21
 
22
22
  ### 4. Data & Evidence
23
23
  - Tables/charts/KPIs/images needed? Sources available or to be created? Specific metrics to highlight?
@@ -10,7 +10,7 @@ Before generating, read from the skill directory:
10
10
  - The chosen template's capabilities: run `node "$SKILL_ROOT/scripts/compile-deck.js" --list-layouts <TEMPLATE>` to see which blocks/regions each layout supports.
11
11
 
12
12
  ## Template-Parameterized Rules (NOT hardcoded brand)
13
- - The deck's `template:` frontmatter selects an enrolled template. Default: `AZURE-PRO` (16:9, Pretendard). Other bundled options: `AZURE-A2Z` (16:9, 에이투지체), `BOILERPLATE-PRETENDARD` / `BOILERPLATE-A2Z` (4:3). A brand deck the user supplies can be learned with `scripts/learn_template.py`.
13
+ - The deck's `tonality:` frontmatter carries the direction chosen on the direction card (`references/direction-step.md`); write each slide's `layout:` as a family of that pack (`references/layout-families.md`) and follow the fill rules (`references/density-and-fill.md`). A legacy template (`AZURE-PRO`, `AZURE-A2Z`, `BOILERPLATE-PRETENDARD`, `BOILERPLATE-A2Z`) goes in `template:` only when the user named it. A brand deck the user supplies can be learned with `scripts/learn_template.py`.
14
14
  - **Do not write fonts, colors, dimensions, or decorations into content** — the template injects them. Never add logos/lines/confidential marks manually; decorations are automatic per template.
15
15
  - Slide separator is exact: a `---` line, a blank line, then `---` + the next slide's `layout:` (see the spec). Getting this wrong silently breaks slide splitting.
16
16
  - Use only approved layouts: `cover`, `content`, `main`, `summary`, `closing`.
@@ -1,6 +1,6 @@
1
1
  # Anti-Slop Checklist for PPTX Outputs
2
2
 
3
- Run after building any deck. Brand specifics (palette, fonts) come from the chosen enrolled template — this checklist is template-agnostic.
3
+ Run after building any deck. Palette, faces, radius and decoration come from the chosen tonality pack (or the named legacy template); this checklist holds for all of them.
4
4
 
5
5
  ## Automated checks
6
6
  - `python3 "$SKILL_ROOT/scripts/qa_deck.py" output.pptx` — honest gate: overflow/overlap/off-slide + WCAG contrast + anti-slop terms + objective executive/research OOXML checks (exit non-zero = FAIL).
@@ -31,35 +31,54 @@ Run after building any deck. Brand specifics (palette, fonts) come from the chos
31
31
  - **Review-only:** unsupported absolutes (`논문이 없다`, `없다는 것이 발견`), empty rhetoric (`판이 굳었다`, `전제로 깐다`), command-like planning (`닫아야 할 게이트`, `역전 금지`), unexplained RAM/FTO/CNKI/코퍼스/전이원, and arbitrary dates or day counts without an approved source.
32
32
  - Review-only findings must be recorded and rewritten where warranted, but they do not become brittle automated failures. Prefer “검토한 데이터베이스 범위에서는 확인되지 않았다” and expand specialist terms on first use.
33
33
 
34
- ## Visual design laws (impeccable-adapted)
35
- Apply with a human eye AFTER automated checks. Targets a static export (no motion/gradients; no borders/shadows on text).
36
-
37
- ### Anti-slop visual bans (absolute)
38
- - [ ] No side-stripe accents (colored `border-left/right` > 1px) — use a 1px hairline, a flat tint, a leading numeral, or an icon on a wrapper `<div>`.
39
- - [ ] No ghost cards: one box = a 1px border OR a ≤8px shadow, never both; no empty outlined boxes as decoration.
40
- - [ ] One corner-radius law deck-wide (default sharp); pills only for tags/chips.
41
- - [ ] No identical card grid — vary span/size or mix card with non-card.
42
- - [ ] No eyebrow reflex / `01·02·03` on every slide unless it genuinely is an ordered sequence.
43
- - [ ] No hero-metric ornament — a big number only when it IS the slide's data.
44
- - [ ] No card-everything / card-in-card — group with spacing and hairline dividers.
45
- - [ ] No gradients, blobs, mesh/noise, or sketchy SVG (pptxgenjs has no native gradient; decorations are bundled PNGs); flat ground only.
46
-
47
- ### Contrast & color (within the template's palette)
48
- - [ ] Body/running text ≥ 4.5:1; large text (≥18pt, or bold ≥14pt) and structural lines ≥ 3:1 — measure the pair (`qa_deck.py` enforces this).
49
- - [ ] No gray text on a colored fill; darken the fill's own hue instead. Color is never the sole signal — deltas carry a ▲/▼ glyph + sign.
50
- - [ ] Accent coverage ≤ ~10% of the slide; one color = one meaning deck-wide. Use the template palette; invent no inline one-off hex.
51
-
52
- ### Typography
53
- - [ ] One family in ≤ 3–4 weights, one role each; body never set in a display cut. For per-weight-family fonts (에이투지체/Brand Sans) pick weight by family name, never a bold flag.
54
- - [ ] ≤ 3–4 distinct sizes per slide on one ramp; no muddy near-equal sizes. Display ≤ ~40pt for the boilerplate templates.
55
- - [ ] UPPERCASE labels take positive tracking (override the narrow body default). Headings line-height 1.1–1.2; body 1.3–1.7 (Korean body looser).
56
- - [ ] No single-word widow on a heading's last line (author manual breaks — `text-wrap` does not survive export). Numeric columns right-aligned.
57
-
58
- ### Layout & hierarchy
59
- - [ ] Squint test passes: the one primary element + the groupings are obvious at a blur.
60
- - [ ] Exactly one primary element per slide (≥ 2:1 to the next level); ≤ 4 items per group; even density across the deck.
61
- - [ ] One 4pt spacing scale (4/8/12/16/24/32/48); vary gaps for rhythm; one alignment axis per region.
62
- - [ ] Every border/divider/box earns its place — remove anything carrying no information before export.
34
+ ## Visual design laws
35
+
36
+ These are judged by eye on the rendered pages, after the automated checks pass. They hold for every
37
+ tonality; where a law depends on the direction (radius, display size, which decoration is allowed),
38
+ the tonality pack sets the value and the law says where to look.
39
+
40
+ ### Bans that hold in every direction
41
+ - [ ] A coloured stripe down one edge of a card is never an accent. Mark the item with a hairline
42
+ above it, a flat tint, or a real numeral beside it instead.
43
+ - [ ] One surface gets one edge: an outline or a soft shadow, never both. An outlined box with
44
+ nothing in it is clutter, not structure.
45
+ - [ ] Corners follow the pack (`radius` 0 or 6) on every surface of the deck; fully rounded shapes
46
+ are for small tags only.
47
+ - [ ] A row of identical cards is a filler pattern. Vary the span, let one element lead, or set the
48
+ points as a list or a comparison.
49
+ - [ ] Ordinals (`01 · 02 · 03`) and small labels above titles appear only where the order is real.
50
+ - [ ] A large number appears only when it is the slide's evidence, sourced and labelled.
51
+ - [ ] No card inside a card and no card around everything; group with space and hairlines.
52
+ - [ ] Flat grounds only: no gradients, blobs, glows, mesh or noise textures, no hand-drawn marks.
53
+ Bands, rails and colour fields come from the pack's decoration list and nowhere else.
54
+
55
+ ### Colour inside the pack
56
+ - [ ] Body text and captions reach 4.5:1 on the fill they actually sit on; large text and structural
57
+ lines reach 3:1 (`qa_deck.py` measures the pairs).
58
+ - [ ] Grey text never sits on a coloured fill; use the fill's own `on-field` or `accent-deep` role.
59
+ A colour never carries meaning alone: deltas also carry ▲/▼ and a sign.
60
+ - [ ] The accent covers about a tenth of a content slide and means one thing across the deck.
61
+ Every colour comes from the pack's roles; no one-off hex per slide.
62
+
63
+ ### Type
64
+ - [ ] Pretendard Regular and Bold by default; A2Z only when the user or the source asks
65
+ (`faces: a2z`), then at most three faces from two families, A2Z weights chosen by family name.
66
+ - [ ] One ramp per deck (presented or reading), at most four sizes on a slide, no near-equal pairs.
67
+ No hero step; a figure is set at title size at most, with its label, unit, basis and source.
68
+ - [ ] Titles and subtitles are topic labels, never declarative sentences (OF-114); the claim opens
69
+ the body.
70
+ - [ ] Headings at 1.1-1.2 line height, body at 1.3-1.45 (Korean at the loose end).
71
+ - [ ] No single word alone on a title's last line; break by hand at a 어절 boundary.
72
+
73
+ ### Layout and hierarchy
74
+ - [ ] At a squint each slide shows one primary element and its groups.
75
+ - [ ] One primary element per slide, about twice the next level; at most four items per group.
76
+ - [ ] Gaps come from one scale (6, 12, 18, 24, 36, 48, 72 pt), smaller inside a group than between
77
+ groups; one alignment edge per region.
78
+ - [ ] Every line, box and field carries information or structure; anything else goes.
79
+ - [ ] The title treatment matches the slide's job, and each treatment keeps one frame across the
80
+ deck (`title-treatments.md`).
81
+ - [ ] The body reaches toward the floor on content slides (`density-and-fill.md`).
63
82
 
64
83
  ### Craft-floor checks (enforced by `scripts/craft_extras.py` through `qa_deck.py`)
65
84
 
@@ -70,6 +89,16 @@ Apply with a human eye AFTER automated checks. Targets a static export (no motio
70
89
  - [ ] OF-105: the gap between cards is at least twice the smallest gap between two shapes inside a card (a shape's inset to its own card edge is padding and does not count). Advisory (MEDIUM) until the family's calibration re-run promotes it.
71
90
  - [ ] OF-106 / OF-107 / OF-108: no gradient-filled text, no glow, no emoji bullets.
72
91
  - [ ] OF-109: no single empty band over 35% of the content area or of a card (25 to 35% is advisory); in a row of equal-height cards the row counts its smallest trailing band. Fill it, shrink the region, or merge slides.
92
+ - [ ] OF-110: a deck of eight or more slides uses at least three title treatments and no more than its variance allows; every title is one of the eight treatments and is drawn as the treatment its name says.
93
+ - [ ] OF-111: content slides do not share one composition (title zone × body partition × dominant content) on more than 40 % of them, and show at least ceil(0.6 × content slides) distinct ones, capped at 5.
94
+ - [ ] OF-112: the median empty band under the body's last block stays at or under 0.20; a slide over its density cap is an advisory.
95
+ - [ ] OF-113: every slide with one title treatment keeps that treatment's frame within 1 pt (a bottom title by its bottom edge).
96
+ - [ ] OF-115: no region stands empty: a bottom title on the floor, a side rail that carries its slide's criteria, takeaways or source, a takeaway column that runs as long as the chart, table or picture beside it (its largest empty band, not its last block: a source strip at the foot does not hide the band above it, and a chart's values table under the takeaways belongs to the column), a picture drawn as tall as its column allows, a title panel as tall as its text, and no plate under an empty page.
97
+ - [ ] OF-116: run `qa_deck.py deck.pptx --sibling other.pptx` when two tonalities of one source are offered; their skeletons (title zone and partition per content slide) must differ on at least two content slides (one on a deck of fewer than four).
98
+ - [ ] OF-117: no mostly-white figure picture on a dark tonality; give it a `.dark` variant or draw it as a native chart.
99
+ - [ ] OF-118: a bold run-in label is followed by its separator ("**요약:** …"); the engine adds the colon when the source leaves it out, so a finding means the label was set by hand.
100
+ - [ ] OF-119: an agenda title stands without a numeral beside it; the agenda's rows carry the numbers.
101
+ - [ ] On a legacy template OF-110, OF-111 and the OF-112 median are advisories, because the user asked for that template's single look.
73
102
 
74
103
  ### Objective evidence checks
75
104