@litfamily/lithermes 1.0.28 → 1.0.30

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 (167) hide show
  1. package/README.md +12 -9
  2. package/README_Ko-KR.md +12 -9
  3. package/assets/lithermes-plugin/README.md +15 -2
  4. package/assets/lithermes-plugin/__init__.py +49 -10
  5. package/assets/lithermes-plugin/adhd_stack.py +228 -0
  6. package/assets/lithermes-plugin/core.py +30 -4
  7. package/assets/lithermes-plugin/core_commands.py +99 -0
  8. package/assets/lithermes-plugin/core_contexts.py +54 -4
  9. package/assets/lithermes-plugin/core_contract.py +2 -2
  10. package/assets/lithermes-plugin/core_routing.py +126 -0
  11. package/assets/lithermes-plugin/diagnostics.py +3 -2
  12. package/assets/lithermes-plugin/lit_mark.py +75 -0
  13. package/assets/lithermes-plugin/payload-version.json +472 -60
  14. package/assets/lithermes-plugin/plugin.yaml +1 -1
  15. package/assets/lithermes-plugin/scientific_visualization.py +23 -0
  16. package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +7 -7
  17. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/components.css +414 -0
  18. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/fonts.json +42 -0
  19. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/landing.html +164 -0
  20. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/settings.html +114 -0
  21. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/workspace.html +115 -0
  22. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/computational-brutalism.json +227 -0
  23. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/field-notes.json +205 -0
  24. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/graphite.json +200 -0
  25. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/meadow.json +199 -0
  26. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/neo-brutalism.json +222 -0
  27. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/ui.js +226 -0
  28. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +2 -4
  29. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +4 -4
  30. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +10 -0
  31. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design-lock.mjs +400 -0
  32. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +6 -1
  33. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +76 -4
  34. package/assets/lithermes-plugin/skills/lit-adhd/SKILL.md +194 -0
  35. package/assets/lithermes-plugin/skills/lit-adhd/references/brief-contract.md +55 -0
  36. package/assets/lithermes-plugin/skills/lit-adhd/references/card-examples.md +86 -0
  37. package/assets/lithermes-plugin/skills/lit-adhd/references/status-taxonomy.md +40 -0
  38. package/assets/lithermes-plugin/skills/lit-adhd/scripts/adhd.mjs +11 -0
  39. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/collect.mjs +554 -0
  40. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/gauge.mjs +89 -0
  41. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/hermes-sessions.mjs +219 -0
  42. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/next-step.mjs +101 -0
  43. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/plan-task-rows.mjs +32 -0
  44. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/redact.mjs +42 -0
  45. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/secret-shapes.mjs +59 -0
  46. package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +7 -4
  47. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +20 -11
  48. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +3 -3
  49. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +1 -1
  50. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +3 -3
  51. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +1 -1
  52. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +5 -0
  53. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +4 -4
  54. package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +1 -1
  55. package/assets/lithermes-plugin/skills/lit-hijack/SKILL.md +239 -0
  56. package/assets/lithermes-plugin/skills/lit-hijack/references/capture-and-provenance.md +123 -0
  57. package/assets/lithermes-plugin/skills/lit-hijack/references/clean-room-build.md +128 -0
  58. package/assets/lithermes-plugin/skills/lit-hijack/references/distil-and-licence.md +128 -0
  59. package/assets/lithermes-plugin/skills/lit-hijack/references/gap-and-port-design.md +152 -0
  60. package/assets/lithermes-plugin/skills/lit-hijack/references/parity-and-report.md +131 -0
  61. package/assets/lithermes-plugin/skills/lit-hijack/scripts/hijack.mjs +995 -0
  62. package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +1 -0
  63. package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +11 -6
  64. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Bold.ttf +0 -0
  65. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Regular.ttf +0 -0
  66. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/OFL.txt +93 -0
  67. package/assets/lithermes-plugin/skills/lit-pptx/fonts/provenance.json +1 -0
  68. package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +3 -0
  69. package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +1 -1
  70. package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +1 -1
  71. package/assets/lithermes-plugin/skills/lit-pptx/references/direction-step.md +8 -2
  72. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/13-engineering-review-computational-brutalism-ko.md +175 -0
  73. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/14-launch-pitch-neo-brutalism-ko.md +156 -0
  74. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/15-design-lecture-bauhaus-ko.md +141 -0
  75. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/16-community-programme-riso-ko.md +160 -0
  76. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/17-public-data-briefing-newsroom-ko.md +183 -0
  77. package/assets/lithermes-plugin/skills/lit-pptx/references/layout-families.md +1 -1
  78. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/bauhaus.md +105 -0
  79. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/computational-brutalism.md +111 -0
  80. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/neo-brutalism.md +114 -0
  81. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/newsroom.md +106 -0
  82. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/riso.md +101 -0
  83. package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +49 -0
  84. package/assets/lithermes-plugin/skills/lit-pptx/scripts/deck_output.py +4 -2
  85. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-pack.js +96 -10
  86. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +50 -6
  87. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/bauhaus/pack.yaml +103 -0
  88. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/computational-brutalism/pack.yaml +99 -0
  89. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/neo-brutalism/pack.yaml +107 -0
  90. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/newsroom/pack.yaml +99 -0
  91. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/riso/pack.yaml +99 -0
  92. package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +1 -1
  93. package/assets/lithermes-plugin/skills/lit-schematic/SKILL.md +144 -0
  94. package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/build.mjs +38 -0
  95. package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/scene.mjs +133 -0
  96. package/assets/lithermes-plugin/skills/lit-schematic/examples/journal-adsorption-rig/build.mjs +87 -0
  97. package/assets/lithermes-plugin/skills/lit-schematic/examples/pid-dosing-skid/build.mjs +85 -0
  98. package/assets/lithermes-plugin/skills/lit-schematic/references/cutaway-outputs.md +70 -0
  99. package/assets/lithermes-plugin/skills/lit-schematic/references/isometric-craft.md +101 -0
  100. package/assets/lithermes-plugin/skills/lit-schematic/references/journal-figures.md +72 -0
  101. package/assets/lithermes-plugin/skills/lit-schematic/references/kit-api.md +134 -0
  102. package/assets/lithermes-plugin/skills/lit-schematic/references/pfd-and-layout.md +53 -0
  103. package/assets/lithermes-plugin/skills/lit-schematic/references/pid-drafting.md +103 -0
  104. package/assets/lithermes-plugin/skills/lit-schematic/references/pid-symbols.md +163 -0
  105. package/assets/lithermes-plugin/skills/lit-schematic/references/verification.md +100 -0
  106. package/assets/lithermes-plugin/skills/lit-schematic/scripts/doctor.mjs +57 -0
  107. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/figure.mjs +81 -0
  108. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/fonts.mjs +27 -0
  109. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/geom.mjs +113 -0
  110. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/interactive.mjs +292 -0
  111. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/isa.mjs +115 -0
  112. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/iso.mjs +719 -0
  113. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/legend-sheet.mjs +162 -0
  114. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/pid.mjs +937 -0
  115. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/png.mjs +132 -0
  116. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/qa-core.mjs +658 -0
  117. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/route.mjs +218 -0
  118. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/sheet.mjs +890 -0
  119. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/svg.mjs +82 -0
  120. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/theme.mjs +115 -0
  121. package/assets/lithermes-plugin/skills/lit-schematic/scripts/motion.mjs +129 -0
  122. package/assets/lithermes-plugin/skills/lit-schematic/scripts/qa.mjs +92 -0
  123. package/assets/lithermes-plugin/skills/lit-schematic/scripts/render.mjs +233 -0
  124. package/assets/lithermes-plugin/skills/lit-schematic/scripts/scaffold.mjs +60 -0
  125. package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +19 -1
  126. package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +12 -11
  127. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +56 -2
  128. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +129 -4
  129. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +9 -0
  130. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender/runner.py +218 -0
  131. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender.mjs +154 -0
  132. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/board.mjs +132 -0
  133. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +48 -5
  134. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +13 -0
  135. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/house.mjs +44 -0
  136. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scaffold.mjs +238 -0
  137. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/score.mjs +643 -0
  138. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound-dsp.mjs +21 -0
  139. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +171 -0
  140. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +23 -3
  141. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +124 -17
  142. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/styles.mjs +240 -0
  143. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +152 -10
  144. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/LICENSE +21 -0
  145. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/environments/RoomEnvironment.js +144 -0
  146. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/geometries/RoundedBoxGeometry.js +155 -0
  147. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/three.module.js +54571 -0
  148. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/expected.json +67 -0
  149. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/index.html +139 -0
  150. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/depth.md +74 -0
  151. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/studio.md +87 -0
  152. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +9 -2
  153. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +24 -8
  154. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/paper.json +41 -0
  155. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/swiss-signal.json +41 -0
  156. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/terminalcore.json +42 -0
  157. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/tidal.json +41 -0
  158. package/assets/lithermes-plugin/skills/litresearch/SKILL.md +4 -0
  159. package/assets/lithermes-plugin/skills/readme-studio/SKILL.md +1 -1
  160. package/assets/lithermes-plugin/skills/readme-studio/templates/hyperframes/package-lock.json +3 -3
  161. package/assets/lithermes-plugin/skills/readme-studio/templates/remotion/package-lock.json +3 -3
  162. package/assets/lithermes-plugin/skills/review-work/SKILL.md +2 -0
  163. package/assets/lithermes-plugin/skills/start-work/SKILL.md +2 -1
  164. package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
  165. package/package.json +1 -1
  166. package/readme-assets/badge-version.svg +1 -1
  167. package/src/lib/skillPayload.js +1 -1
@@ -0,0 +1,111 @@
1
+ # Computational Brutalism (`computational-brutalism`)
2
+
3
+ A deck about a system, told to the people who build or run it: terminals, plotter paper and
4
+ engineering drawings. The twelve-column grid is marked in the top margin with numbered ticks,
5
+ every content slide carries its index as `[03/08]`, titles, labels and figures are set in a
6
+ monospaced face, tables are ruled on every edge, and one electric-blue signal marks the figure
7
+ that matters. Body text stays in Pretendard and every mark sits on the grid it shows.
8
+
9
+ ## Pick it when
10
+
11
+ - Architecture reviews, infrastructure or reliability reports, developer-tool or AI-system launches
12
+ for engineers, benchmark write-ups, incident retrospectives, hackathon demos.
13
+ - Metrics with units (p99 latency, throughput, error budget, GPU hours), version numbers and
14
+ identifiers, code or command names in the text, before-and-after measurements.
15
+ - An audience that reads a table faster than a sentence; a deck read again after the meeting.
16
+
17
+ ## Pass on it when
18
+
19
+ - A board, investor committee, finance or public-sector report (grid marks read as unfinished work).
20
+ - Long Korean reading (mono sets Latin and figures only; Hangul titles lose the look but keep the width cost).
21
+ - Consumer marketing, grief, safety or HR topics; a deck under a corporate brand guide.
22
+ - A quiet data review (Ledger, Night); an investor pitch (Signal, Neo-Brutalism).
23
+
24
+ ## Token summary
25
+
26
+ | Token | Value |
27
+ |---|---|
28
+ | ground, surface | #EEEDE7, #E2E1D9 |
29
+ | ink, ink-muted, line | #111111, #4D4C47, #9A988F |
30
+ | accent, accent-deep, accent-tint | #1F43E0, #14267A, #D9DEF2 |
31
+ | field, on-field | #111111, #8CF5A6 (phosphor green on the terminal field) |
32
+ | positive, negative | #1C6B35, #B3261E |
33
+ | series | #1F43E0, #111111, #7A786F |
34
+ | faces | JetBrains Mono Bold (display, title, numeral), JetBrains Mono Regular (label), Pretendard Regular (body); Hangul inside a mono run is set in Pretendard; no A2Z map |
35
+ | ramp | compact at density 10 (body 13, title 26, display 36, cover 44 pt); hero step on fitting cover and statement titles |
36
+ | density, variance | 10, 7 |
37
+ | radius, edge | 0, border 1 pt in ink |
38
+ | decoration | hairline-rule, column-hairlines, box-outline, grid-marks, numeral |
39
+
40
+ Density 10 sets the deck on the compact grid (24 pt side margins), body 13 pt and no step-up.
41
+ The mono face is wider than Pretendard, so the engine measures every mono title at its own width
42
+ before it chooses a treatment; a long Latin title moves to a wider frame rather than shrinking.
43
+ The fonts ship with the skill under the SIL Open Font License 1.1 (no Reserved Font Name); the
44
+ official Regular and Bold files embed unmodified with `--embed-fonts`.
45
+
46
+ ## Title treatments by role
47
+
48
+ Allowed: `top-rule`, `top-plain-large`, `side-rail`, `bottom-anchor`, `statement`. Defaults: content,
49
+ data, sequence, reference → top-rule; data-takeaway, image → bottom-anchor; definition → side-rail;
50
+ statement → statement. Pinned: `chart-insight` → top-rule, `table-insight` → bottom-anchor,
51
+ `comparison` → side-rail (spec sheet), `step-diagram` → top-plain-large (large mono headline).
52
+
53
+ ## Families and display slides
54
+
55
+ Families: `dashboard-grid`, `kpi-row`, `chart-insight`, `full-chart`, `table-insight`, `ledger-table`,
56
+ `method`, `step-diagram`, `matrix-2x2`, `comparison`, `text-two-column`, `references-appendix`,
57
+ `quote`, `statement`.
58
+
59
+ - Covers `cover-typographic`, `cover-index`, `cover-figures`; sections `section-numeral`,
60
+ `section-rule`; closings `closing-decision-box`, `closing-ask`, `closing-summary-list`.
61
+ - Display devices: cover `drench` (the terminal field edge to edge, topic in phosphor green
62
+ anchored low), statement `drench` (sentence in phosphor on black), number `outline`,
63
+ closing `box`. Grid marks and the slide index run on content slides only.
64
+ - Table: ruled grid on every cell, label-face header, bold totals, protagonist row on accent-tint.
65
+ Chart: hairline gridlines, direct labels, accent on the highlighted series. Image: hairline frame.
66
+ - Fill order: change-family, distribute, anchor-visual, step-up.
67
+
68
+ ## Do
69
+
70
+ - Give every figure its unit and its basis: `p99 182 ms`, `2026년 9월 기준`.
71
+ - Keep identifiers, versions and commands as written; the mono face is for them.
72
+ - Put one blue figure on a slide; everything else stays ink.
73
+ - Rule tables on every edge and right-align numbers.
74
+ - End on a decision box or an ask with owner and date.
75
+
76
+ ## Avoid
77
+
78
+ - Body paragraphs in the mono face (the pack refuses a mono body).
79
+ - Fake code, fake terminal prompts or decorative binary strings.
80
+ - Grid marks or the slide index in the accent colour.
81
+ - A second accent; phosphor green belongs to the black field only.
82
+ - This direction for a board pack, a finance report or a sensitive topic.
83
+
84
+ ## Worked slide
85
+
86
+ A latency review with the measured result, its basis and the detail in the table.
87
+
88
+ ```markdown
89
+ ---
90
+ layout: kpi-row
91
+
92
+ ## API 게이트웨이 v3 전환 결과, 2026년 9월
93
+
94
+ | p99 지연 | 처리량 | 오류율 | 노드 수 |
95
+ |---|---|---|---|
96
+ | 182 ms | 41k rps | 0.07% | 24 |
97
+ | v2 410 ms | v2 18k rps | v2 0.31% | v2 40 |
98
+
99
+ > 운영 클러스터 4주 평균, 2026년 9월 (예시)
100
+
101
+ - 지연은 절반 아래로 줄었고, 노드는 40대에서 24대로 줄었다
102
+ - 오류율 0.07%는 SLO 0.1% 안쪽이다
103
+ - 출처: 예시 관측 대시보드, 2026년 9월 (예시)
104
+ ---
105
+ ```
106
+
107
+ ## Example in this skill
108
+
109
+ ```text
110
+ references/examples/13-engineering-review-computational-brutalism-ko.md
111
+ ```
@@ -0,0 +1,114 @@
1
+ # Neo-Brutalism (`neo-brutalism`)
2
+
3
+ The loud direction, loud on purpose: every card a flat yellow block with a thick black border
4
+ and a hard black shadow offset down and right, no blur at all. Heavy tight titles, a saturated
5
+ blue topic band, one pink-red accent for the figure the slide is for, on warm cream. Nothing
6
+ soft: no gradients, no rounded corners, no glow. A poster or product sticker for a room that
7
+ should feel energy — and still legible, because every colour pair meets the contrast floor.
8
+
9
+ ## Pick it when
10
+
11
+ - Startup pitches at demo days, consumer product launches, campaign kick-offs, creator or
12
+ community events, hackathon finals, education decks for a young audience.
13
+ - One claim and two or three facts per slide; three or four headline numbers; a launch or
14
+ sign-up ask; words such as 런칭, 출시, 데모데이, 캠페인, 크리에이터, or a bold, punchy,
15
+ "brutalist" look. Second candidate for pitches after Signal; first for a bold, playful look.
16
+
17
+ ## Pass on it when
18
+
19
+ - Formal reports, academic talks, board or finance reviews, decks read alone later (blocks take
20
+ the space a reader needs; long paragraphs between thick borders read as noise).
21
+ - Grief, safety, HR or financial-loss topics; decks under a corporate brand guide.
22
+ - A brief that says "clean" or "minimal" (Signal, Studio); a brief that says "report"
23
+ (Ledger, Gazette).
24
+
25
+ ## Token summary
26
+
27
+ | Token | Value |
28
+ |---|---|
29
+ | ground, surface | #FFF5E1, #FFD43B (the yellow card) |
30
+ | ink, ink-muted, line | #111111, #3A3A3A, #111111 |
31
+ | accent, accent-deep, accent-tint | #D81B5C, #6B0F2E, #FFC9DA |
32
+ | field, on-field | #2F4BFF, #FFFFFF |
33
+ | positive, negative | #137A43, #111111 (losses in ink with ▼) |
34
+ | series | #D81B5C, #2F4BFF, #111111, #137A43 |
35
+ | faces | Pretendard Bold (display, title, numeral), Regular (body, label); `faces: a2z` swaps to A2Z Black display, titles and numerals |
36
+ | register, ramp | bold / presented; hero step on cover and fitting statements; figures at most title size |
37
+ | type voice | title tracking −2, display −3 |
38
+ | density, variance | 10, 7 |
39
+ | radius, edge | 0 / fill and border, 2.5 pt in ink |
40
+ | shadow | 6 pt offset at 45°, ink, fully opaque, no blur |
41
+ | decoration | colour-field, numeral |
42
+
43
+ This is the family's bold register: presented type and the hero step, filling the same slide-grid
44
+ zones as every other pack — the register changes the size inside a zone, never the zone. The
45
+ registry refuses presented type in a pack without `register: bold`. A KPI row keeps its bordered
46
+ cards: the card is this direction's figure. The pink accent is darkened until a pink figure on a
47
+ yellow card holds 3:1 at title size. The shadow is a real outer shadow with a blur of zero, so
48
+ PowerPoint, Keynote and LibreOffice draw the same hard edge. Every block of the blue field
49
+ carries the black border too. Gate allowance: `qa: offset-shadow` lets OF-120 pass the hard
50
+ shadow; any blur still fails.
51
+
52
+ ## Title treatments by role
53
+
54
+ Allowed: `top-plain-large`, `band`, `kicker-numeral`, `statement`, `bottom-anchor`. Defaults:
55
+ content, data-takeaway → top-plain-large; data, sequence, reference, definition → band (title in
56
+ white on the blue band); image → bottom-anchor; statement → statement.
57
+
58
+ ## Families and display slides
59
+
60
+ Families: `big-number`, `kpi-row`, `comparison`, `process`, `step-diagram`, `chart-insight`,
61
+ `table-insight`, `image-split`, `summary-box-list`, `agenda`, `quote`, `statement`.
62
+
63
+ - Covers `cover-typographic`, `cover-split-field`, `cover-numeral`; sections `section-field`,
64
+ `section-numeral`; closings `closing-ask`, `closing-decision-box`, `closing-statement`.
65
+ - Display devices: cover `plate` (topic in white on a blue plate across the lower half, bordered
66
+ in black), statement `drench` (page in blue, sentence in white), number `field`, closing `box`
67
+ (bordered, with its shadow).
68
+ - Table: yellow header, ruled grid, protagonist row in pink tint, bold totals. Chart: no
69
+ gridlines, direct labels, series in order (pink, blue, black). Image: hairline frame.
70
+ - Fill order: step-up, change-family, anchor-visual, distribute.
71
+
72
+ ## Do
73
+
74
+ - Keep one claim per slide, written in the first body line in plain words.
75
+ - Give every figure its label and its basis in the card.
76
+ - Let yellow cards carry figures and short labels, never paragraphs.
77
+ - End on `closing-ask` with the amount, its uses and the next meeting.
78
+
79
+ ## Avoid
80
+
81
+ - Blurred or soft shadows, rounded corners, gradients.
82
+ - Thin hairlines beside the 2.5 pt borders.
83
+ - More than three fill colours on one slide.
84
+ - Muted grey text on the yellow surface.
85
+ - This direction for formal reports or sensitive topics.
86
+
87
+ ## Worked slide
88
+
89
+ A traction slide: four results as cards with two facts under them.
90
+
91
+ ```markdown
92
+ ---
93
+ layout: kpi-row
94
+
95
+ ## 베타 8주 성과, 2026년 10월
96
+
97
+ | 가입자 | 주간 재방문 | 추천 가입 | 유료 전환 |
98
+ |---|---|---|---|
99
+ | 1만 2천 명 | 46% | 38% | 7.4% |
100
+ | 목표 1만 명 | 업계 평균 25% | 광고비 0원 | 목표 5% |
101
+
102
+ > 베타 운영 기록, 2026년 8-10월 (예시)
103
+
104
+ - 광고 없이 가입자 목표를 넘겼다: 셋 중 하나 이상이 친구 추천으로 왔다
105
+ - 유료 전환 7.4%는 목표 5%를 넘었고, 연 결제가 그중 60%다
106
+ - 출처: 예시 서비스 운영 대시보드, 2026년 10월 (예시)
107
+ ---
108
+ ```
109
+
110
+ ## Example in this skill
111
+
112
+ ```text
113
+ references/examples/14-launch-pitch-neo-brutalism-ko.md
114
+ ```
@@ -0,0 +1,106 @@
1
+ # Newsroom (`newsroom`)
2
+
3
+ Data journalism for a general reader: a black masthead band or a heavy rule at the title, charts
4
+ in greys with one orange series, direct labels and the source under every figure. For explainers,
5
+ public briefings, newsletters and data stories told to people who do not read tables.
6
+
7
+ ## Pick it when
8
+
9
+ - Explainers, public briefings, newsletters, data stories for a general audience.
10
+ - One story per chart, a finding (what changed, by how much, since when) up front, sources
11
+ under every figure.
12
+
13
+ ## Pass on it when
14
+
15
+ - An internal dense review (Ledger), a pitch (Signal) or a lecture (Chalk).
16
+
17
+ ## Token summary
18
+
19
+ | Token | Value |
20
+ |---|---|
21
+ | ground, surface | #FBFAF7, #EEEDEA |
22
+ | ink, ink-muted, line | #111111, #55534D, #CCCAC5 |
23
+ | accent, accent-deep, accent-tint | #C2410C, #7C2A08, #FBE3D3 |
24
+ | field, on-field | #111111, #FFFFFF (masthead band) |
25
+ | positive, negative | #1F6B3A, #111111 (losses in ink with ▼) |
26
+ | series | #C2410C, #77746C, #2F5D8A, #111111 |
27
+ | faces | Pretendard Bold (display, title, numeral), Regular (body, label); `faces: a2z` swaps to A2Z Bold display, titles and numerals |
28
+ | ramp | compact at density 10 (body 13, title 26, display 36, cover 44 pt); hero step on fitting cover and statement titles |
29
+ | density, variance | 10, 6 |
30
+ | radius, edge | 0 / fill |
31
+ | decoration | hairline-rule, column-hairlines, numeral (the masthead band is the `band` title) |
32
+
33
+ The orange holds 5.2:1 on the paper, so it can set a kicker word or a figure. The second series
34
+ is a warm grey, the third a quiet blue for the one line a story compares against. Rules and
35
+ surfaces are neutral greys: a warm-tinted rule reads as a second hue family beside the orange.
36
+ No `qa:` allowance beyond the default craft floor; the source line under every figure is the
37
+ house rule, and the gate's source checks already ask for it.
38
+
39
+ ## Title treatments by role
40
+
41
+ Allowed: `band`, `bottom-anchor`, `top-rule`, `kicker-numeral`, `statement`. Defaults: data →
42
+ band (title in white on the black masthead band); data-takeaway, image → bottom-anchor (title
43
+ over a heavy black rule); content, reference, definition → top-rule; sequence → kicker-numeral;
44
+ statement → statement. Every treatment draws in the slide grid's one title zone, so a band, a
45
+ bottom-anchor and a top-rule title sit at the same place.
46
+
47
+ ## Families and display slides
48
+
49
+ Families: `full-chart`, `chart-insight`, `kpi-over-chart`, `big-number`, `kpi-row`,
50
+ `table-insight`, `comparison`, `timeline`, `image-split`, `figure-pair`, `text-two-column`,
51
+ `sidebar-note`, `references-appendix`, `quote`, `statement`.
52
+
53
+ - Covers `cover-typographic`, `cover-figures`, `cover-index`; sections `section-rule`,
54
+ `section-numeral`; closings `closing-summary-list`, `closing-statement`, `closing-ask`.
55
+ - Display devices: cover `band` (deck title in white on the black masthead band, parts on the
56
+ paper under it), statement `rules` (sentence between two rules), number `tint`, closing
57
+ `rules`; a deck index runs along the top of the display slides.
58
+ - Table: open, no header fill, rule under the header, bold totals. Chart: horizontal gridlines,
59
+ direct labels, accent on the story's series over greys. Image: no frame.
60
+ - Fill order: anchor-visual, change-family, distribute, step-up.
61
+
62
+ ## Do
63
+
64
+ - Name the topic and its period in the title; put the finding (what changed, by how much, since
65
+ when) in the first body line.
66
+ - Colour one series orange and leave the rest grey.
67
+ - Put the source and the period under every chart and table.
68
+ - Label lines and bars directly; a legend is for a chart that cannot take labels.
69
+
70
+ ## Avoid
71
+
72
+ - More than one highlighted series on a chart.
73
+ - A chart without its source and period.
74
+ - 3D, gradients or pictograms standing in for numbers.
75
+ - This direction for a pitch, a lecture or an internal dense review.
76
+
77
+ ## Worked slide
78
+
79
+ A full chart names its topic, keeps one orange line and states the finding under it.
80
+
81
+ ```markdown
82
+ ---
83
+ layout: full-chart
84
+
85
+ ## 매매가 대비 전셋값 비율, 2023-2026년
86
+
87
+ ::: chart type=line unit="%"
88
+ | 연도 | 우리 구 (%) | 시 평균 (%) |
89
+ |---|---|---|
90
+ | 2023년 | 55.2 | 56.0 |
91
+ | 2024년 | 57.1 | 56.8 |
92
+ | 2025년 | 59.4 | 57.9 |
93
+ | 2026년 | 61.3 | 58.6 |
94
+ > 매매가 대비 전셋값 비율, 해마다 6월 (예시 자료)
95
+ :::
96
+
97
+ - 우리 구의 전셋값이 처음으로 매매가의 60%를 넘었다
98
+ - 출처: 예시 구청 주택 통계, 2026년 (예시)
99
+ ---
100
+ ```
101
+
102
+ ## Example in this skill
103
+
104
+ ```text
105
+ references/examples/17-public-data-briefing-newsroom-ko.md
106
+ ```
@@ -0,0 +1,101 @@
1
+ # Riso (`riso`)
2
+
3
+ Two spot inks on warm paper, the look of a risograph print. Teal fields carry the cover, the
4
+ sections, the statements and the band over a data title; pink marks the one word or figure that
5
+ matters on a content page. Surfaces and rules stay grey so the two inks are the only colours.
6
+
7
+ ## Pick it when
8
+
9
+ - Community, culture and education programmes: workshops, festivals, library or museum
10
+ programmes, student clubs, nonprofit annual gatherings, volunteer briefings.
11
+ - Programmes with dates and places, a few counts (participants, sessions, books), steps for
12
+ taking part, words such as 워크숍, 프로그램, 축제, 동아리, 도서관, 주민, 참여, 자원봉사,
13
+ community, programme, zine.
14
+
15
+ ## Pass on it when
16
+
17
+ - Boards, finance, public-sector or sensitive topics (two bright inks read as unserious).
18
+ - Dense data reviews (Ledger) or general-public data stories that live on their charts (Newsroom).
19
+ - Grief, safety or financial-loss topics.
20
+
21
+ ## Token summary
22
+
23
+ | Token | Value |
24
+ |---|---|
25
+ | ground, surface | #F5F0E6, #E4E2DE |
26
+ | ink, ink-muted, line | #1C2433, #4E5361, #C4C1BB |
27
+ | accent, accent-deep, accent-tint | #D1206B, #8A1043, #F8D5E3 |
28
+ | field, on-field | #00727A, #FFFFFF |
29
+ | positive, negative | #1D6B45, #1C2433 (losses in ink with ▼) |
30
+ | series | #D1206B, #00727A, #1C2433, #8A6A00 |
31
+ | faces | Pretendard Bold (display, title, numeral), Regular (body, label); `faces: a2z` swaps to A2Z Bold display, titles and numerals |
32
+ | ramp | compact at density 10 (body 13, title 26, display 36, cover 44 pt); hero step on fitting cover and statement titles |
33
+ | density, variance | 10, 7 |
34
+ | radius, edge | 6 / fill |
35
+ | decoration | mark-underline, colour-field, numeral |
36
+
37
+ The pink is the fluorescent ink darkened until it holds 4.5:1 on the paper, so it can set a word;
38
+ teal holds white type at 5.6:1. A loss uses ink with a ▼ sign, since pink is the accent. The
39
+ fourth series colour is an ochre that holds 3:1 on the paper. Teal and pink share a content slide
40
+ (a band title over a pink figure): the two inks are the register, not a gate limit. Surfaces and
41
+ rules stay grey on purpose: a warm beige card would read as a third hue family and fail.
42
+
43
+ ## Title treatments by role
44
+
45
+ Allowed: `top-plain-large`, `band`, `kicker-numeral`, `statement`, `side-rail`. Defaults: content,
46
+ data-takeaway, image → top-plain-large (title over a pink underline); data, reference →
47
+ band (title in white on teal); sequence → kicker-numeral; definition → side-rail;
48
+ statement → statement.
49
+
50
+ ## Families and display slides
51
+
52
+ Families: `agenda`, `summary-box-list`, `text-two-column`, `sidebar-note`, `comparison`,
53
+ `process`, `step-diagram`, `timeline`, `kpi-row`, `big-number`, `chart-insight`,
54
+ `table-insight`, `image-split`, `photo-grid`, `quote`, `statement`.
55
+
56
+ - Covers `cover-typographic`, `cover-numeral`, `cover-split-field`; sections `section-field`,
57
+ `section-numeral`; closings `closing-ask`, `closing-summary-list`, `closing-statement`.
58
+ - Display devices: cover `drench` (page in teal, title in white), statement `drench`,
59
+ number `field` (teal panel), closing `band`.
60
+ - Table: pink-tint header, rule under it, grey banding, bold totals. Chart: no gridlines, direct
61
+ labels, accent on the highlighted series. Image: no frame.
62
+ - Fill order: change-family, distribute, step-up, anchor-visual.
63
+
64
+ ## Do
65
+
66
+ - Keep full teal fields on display slides; on a content page teal is the title band and nothing more.
67
+ - Let pink mark one word or one figure on a content slide.
68
+ - Give every session a date, a place and who it is for.
69
+ - Write the way organisers talk to participants: short, plain, inviting.
70
+
71
+ ## Avoid
72
+
73
+ - A third ink beside pink and teal (black is the type, not an ink).
74
+ - The fluorescent pink as text; the darkened accent is the type colour.
75
+ - Gradients, grain or halftone painted to fake the print.
76
+ - Teal blocks on content slides beyond the title band.
77
+ - This direction for a board, finance, public-sector or sensitive topic.
78
+
79
+ ## Worked slide
80
+
81
+ A process slide shows how to take part, one step per row.
82
+
83
+ ```markdown
84
+ ---
85
+ layout: process
86
+
87
+ ## 참여는 이렇게: 신청부터 첫 모임까지
88
+
89
+ - **1. 신청** 10월 31일까지 도서관 누리집에서 한 사람씩 신청한다
90
+ - **2. 안내 문자** 모임 사흘 전 장소와 준비물을 문자로 받는다
91
+ - **3. 첫 모임** 11월 7일 저녁 7시, 3층 다목적실에서 만난다
92
+ - **4. 소모임 배정** 첫 모임에서 관심사별로 다섯 명씩 나눈다
93
+ - 출처: 예시 도서관 운영 계획, 2026년 (예시)
94
+ ---
95
+ ```
96
+
97
+ ## Example in this skill
98
+
99
+ ```text
100
+ references/examples/16-community-programme-riso-ko.md
101
+ ```
@@ -25,6 +25,46 @@ ADVISORY_BY_TEMPLATE = {"AZURE-PRO": {"OF-109"}}
25
25
  EMU = 914400
26
26
  NUMERIC = re.compile(r"^[\s,$€£¥₩%▲▼+\-±().0-9]+$")
27
27
  EMOJI = re.compile("[\U0001f000-\U0001faff\u2600-\u27bf]")
28
+ STAMP = re.compile(r"\blit-pptx tonality=(\S+) density=(\d+) grid=(\w+) variance=(\d+)")
29
+ QA_KEY = re.compile(r"^ ([a-z-]+):\s*(\S+)\s*$")
30
+
31
+
32
+ def pack_allowances(deck_subject) -> dict:
33
+ """The stamped tonality pack's `qa:` block as {key: int or bool}; empty without a stamp or a block."""
34
+ stamp = STAMP.search(deck_subject or "")
35
+ if not stamp or not re.fullmatch(r"[a-z][a-z0-9-]*", stamp.group(1)):
36
+ return {}
37
+ path = Path(__file__).parent.parent / "templates" / "tonalities" / stamp.group(1) / "pack.yaml"
38
+ if not path.is_file():
39
+ return {}
40
+ allowed, inside = {}, False
41
+ for line in path.read_text(encoding="utf-8").splitlines():
42
+ if not line.strip() or line.lstrip().startswith("#"):
43
+ continue
44
+ if not line.startswith(" "):
45
+ inside = line.rstrip() == "qa:"
46
+ continue
47
+ match = QA_KEY.match(line) if inside else None
48
+ if match:
49
+ value = match.group(2)
50
+ allowed[match.group(1)] = value == "true" if value in ("true", "false") else int(value) if value.isdigit() else value
51
+ return allowed
52
+
53
+
54
+ def shadow_findings(number, slide, allowed) -> list:
55
+ """OF-120: a hard offset shadow (blur 0) is a pack's look or nothing; a pack that has it keeps every shadow hard."""
56
+ from pptx.oxml.ns import qn
57
+ found = []
58
+ for shape in slide.shapes:
59
+ for shadow in shape._element.iter(qn("a:outerShdw")):
60
+ hard = int(shadow.get("blurRad") or 0) == 0
61
+ if hard and not allowed.get("offset-shadow"):
62
+ found.append(("OF-120", "HIGH", number, shape.name, "hard offset shadow in a pack that does not draw one",
63
+ "Remove the shadow; only a pack whose qa block allows offset-shadow draws one."))
64
+ elif not hard and allowed.get("offset-shadow"):
65
+ found.append(("OF-120", "HIGH", number, shape.name, "soft shadow beside the pack's hard offset shadows",
66
+ "Draw the shadow with no blur at the pack's offset, or remove it."))
67
+ return found
28
68
 
29
69
 
30
70
  def _box(shape):
@@ -100,7 +140,11 @@ def check(path: Path) -> dict:
100
140
  "threshold": threshold, "tier": tier,
101
141
  **({"advisory_template": template_id} if advisory else {})})
102
142
 
143
+ allowed = pack_allowances(subject)
103
144
  for slide_no, slide in enumerate(deck.slides, 1):
145
+ for rule, severity, number, name, value, hint in shadow_findings(slide_no, slide, allowed):
146
+ shape = next((s for s in slide.shapes if s.name == name), slide)
147
+ add(rule, severity, number, shape, value, hint)
104
148
  shapes = list(slide.shapes)
105
149
  display = _title_or_display(shapes)
106
150
  # A pack slide names its family: a cover, section, statement, quote or full-bleed picture is a display slide.
@@ -123,6 +167,11 @@ def check(path: Path) -> dict:
123
167
  if not any(min(abs(hue - known), 360 - abs(hue - known)) <= RULES["hue_family_deg"] for known in hues):
124
168
  hues.append(hue)
125
169
  high = 4 if display else 3
170
+ # A pack's own limit only widens the default: N families pass, N + 1 fail, with no advisory step between.
171
+ allow_key = "display-accent-families" if display else "accent-families"
172
+ limit = allowed.get(allow_key)
173
+ if isinstance(limit, int) and not isinstance(limit, bool):
174
+ high = max(high, limit + 1)
126
175
  if len(hues) >= high:
127
176
  add("OF-101", "HIGH", slide_no, slide, len(hues), f"<{high} accent families")
128
177
  elif len(hues) == high - 1:
@@ -321,8 +321,10 @@ def _short_column(p, content, title, shown, body_floor, column5, W, H):
321
321
  """A column of a two-column body that stops short of its neighbour: the largest empty band inside it, from the
322
322
  body's top down to where the neighbour ends, over 40 % of the body. A source or note strip that closes the
323
323
  column does not hide the band above it. Returns (shape name, value) or None."""
324
- # The body starts under a top title; beside a side title (in its rail) or over a bottom title, at the top.
325
- top_of_title = title["y"] + title["h"] if shown not in ("bottom-anchor", "side-rail") else 0.0
324
+ # The body starts under a top title, or below a bottom title (the source gate vacates what a
325
+ # bottom title closes: a table with its takeaways under it is not a short column). Beside a
326
+ # side title, in its rail, the strict read from the page top stays.
327
+ top_of_title = title["y"] + title["h"] if shown != "side-rail" else 0.0
326
328
  fields = [m for m in p["marks"] if m["kind"] == "shape" and m["filled"] and m["w"] * m["h"] >= 0.1 * W * H]
327
329
  body = [m for m in content if m["y"] >= top_of_title - TOL and m["y"] < body_floor and m["w"] > 0 and m["h"] > 0
328
330
  and not (shown == "side-rail" and m["x"] + m["w"] <= column5 + TOL) and not any(_inside(m, f) for f in fields)]