@litfamily/litopencode 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README-Ko-KR.md +11 -11
  3. package/README.md +11 -11
  4. package/dist/activation-routing.js +1 -1
  5. package/dist/auto-handoff.js +34 -1
  6. package/dist/features.js +2 -2
  7. package/dist/skills.js +6 -4
  8. package/docs/assets/readme/badge-version.svg +1 -1
  9. package/docs/reference-Ko-KR.md +1 -1
  10. package/package.json +1 -1
  11. package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +1 -3
  12. package/skills/lit-docx/SKILL.md +80 -19
  13. package/skills/lit-docx/references/components.md +253 -0
  14. package/skills/lit-docx/references/direction-step.md +234 -0
  15. package/skills/lit-docx/references/examples/01-report-ko.md +160 -0
  16. package/skills/lit-docx/references/examples/02-brief-ko.md +58 -0
  17. package/skills/lit-docx/references/examples/03-manual-ko.md +107 -0
  18. package/skills/lit-docx/references/examples/04-proposal-ko.md +93 -0
  19. package/skills/lit-docx/references/examples/05-memo-ko.md +42 -0
  20. package/skills/lit-docx/references/examples/06-journal-en.md +84 -0
  21. package/skills/lit-docx/references/examples/07-report-en.md +137 -0
  22. package/skills/lit-docx/references/examples/08-journal-ko.md +93 -0
  23. package/skills/lit-docx/references/examples/09-brief-en.md +64 -0
  24. package/skills/lit-docx/references/page-composition.md +306 -0
  25. package/skills/lit-docx/references/tonalities/brief.md +104 -0
  26. package/skills/lit-docx/references/tonalities/journal.md +101 -0
  27. package/skills/lit-docx/references/tonalities/manual.md +111 -0
  28. package/skills/lit-docx/references/tonalities/memo.md +105 -0
  29. package/skills/lit-docx/references/tonalities/proposal.md +101 -0
  30. package/skills/lit-docx/references/tonalities/report.md +126 -0
  31. package/skills/lit-docx/run.py +2 -1
  32. package/skills/lit-docx/scripts/convert_md_to_docx.py +384 -67
  33. package/skills/lit-docx/scripts/craft_docx.py +204 -1
  34. package/skills/lit-docx/scripts/docx_design.py +2445 -0
  35. package/skills/lit-docx/scripts/docx_layout.py +959 -0
  36. package/skills/lit-docx/scripts/slop_lint.py +23 -6
  37. package/skills/lit-docx/templates/tonalities/brief.yaml +29 -0
  38. package/skills/lit-docx/templates/tonalities/journal.yaml +26 -0
  39. package/skills/lit-docx/templates/tonalities/manual.yaml +27 -0
  40. package/skills/lit-docx/templates/tonalities/memo.yaml +27 -0
  41. package/skills/lit-docx/templates/tonalities/proposal.yaml +27 -0
  42. package/skills/lit-docx/templates/tonalities/report.yaml +27 -0
  43. package/skills/lit-pptx/NOTICE.md +1 -1
  44. package/skills/lit-pptx/SKILL.md +108 -19
  45. package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Bold.otf +0 -0
  46. package/skills/lit-pptx/pretendard-font/public/static/Pretendard-Regular.otf +0 -0
  47. package/skills/lit-pptx/references/density-and-fill.md +283 -0
  48. package/skills/lit-pptx/references/direction-step.md +249 -0
  49. package/skills/lit-pptx/references/examples/01-ops-review-ledger-ko.md +173 -0
  50. package/skills/lit-pptx/references/examples/02-launch-pitch-signal-en.md +153 -0
  51. package/skills/lit-pptx/references/examples/03-field-survey-atlas-ko.md +120 -0
  52. package/skills/lit-pptx/references/examples/04-lecture-chalk-ko.md +132 -0
  53. package/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +162 -0
  54. package/skills/lit-pptx/references/examples/06-policy-briefing-gazette-ko.md +176 -0
  55. package/skills/lit-pptx/references/examples/07-annual-story-studio-en.md +131 -0
  56. package/skills/lit-pptx/references/examples/08-reliability-keynote-night-en.md +182 -0
  57. package/skills/lit-pptx/references/examples/09-status-update-ledger-en.md +147 -0
  58. package/skills/lit-pptx/references/examples/10-investor-pitch-signal-ko.md +136 -0
  59. package/skills/lit-pptx/references/examples/11-forecast-review-night-ko.md +177 -0
  60. package/skills/lit-pptx/references/examples/12-exhibition-proposal-studio-ko.md +149 -0
  61. package/skills/lit-pptx/references/layout-families.md +470 -0
  62. package/skills/lit-pptx/references/title-treatments.md +271 -0
  63. package/skills/lit-pptx/references/tonalities/atlas.md +132 -0
  64. package/skills/lit-pptx/references/tonalities/chalk.md +132 -0
  65. package/skills/lit-pptx/references/tonalities/gazette.md +137 -0
  66. package/skills/lit-pptx/references/tonalities/ledger.md +151 -0
  67. package/skills/lit-pptx/references/tonalities/night.md +148 -0
  68. package/skills/lit-pptx/references/tonalities/paper.md +136 -0
  69. package/skills/lit-pptx/references/tonalities/signal.md +148 -0
  70. package/skills/lit-pptx/references/tonalities/studio.md +149 -0
  71. package/skills/lit-pptx/scripts/compile-deck.js +68 -21
  72. package/skills/lit-pptx/scripts/craft-thresholds.json +45 -1
  73. package/skills/lit-pptx/scripts/craft_extras.py +37 -8
  74. package/skills/lit-pptx/scripts/deck_output.py +654 -0
  75. package/skills/lit-pptx/scripts/embed_fonts.py +2 -2
  76. package/skills/lit-pptx/scripts/layout_inventory.py +35 -2
  77. package/skills/lit-pptx/scripts/lib/directive-parser.js +2 -2
  78. package/skills/lit-pptx/scripts/lib/font-map.js +4 -4
  79. package/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
  80. package/skills/lit-pptx/scripts/lib/layout-resolver.js +403 -21
  81. package/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
  82. package/skills/lit-pptx/scripts/lib/render-adapter-html.js +3 -9
  83. package/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +500 -113
  84. package/skills/lit-pptx/scripts/lib/render-pack.js +3558 -0
  85. package/skills/lit-pptx/scripts/lib/slide-ast.js +55 -24
  86. package/skills/lit-pptx/scripts/lib/spec-validator.js +2 -2
  87. package/skills/lit-pptx/scripts/lib/template-registry.js +335 -11
  88. package/skills/lit-pptx/scripts/qa_deck.py +48 -13
  89. package/skills/lit-pptx/scripts/validate_pptx.py +17 -5
  90. package/skills/lit-pptx/specs/template-enrollment-contract.md +4 -4
  91. package/skills/lit-pptx/templates/boilerplate_professional.css +13 -13
  92. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
  93. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +5 -2
  94. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +20 -20
  95. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -11
  96. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +10 -7
  97. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +17 -17
  98. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +8 -8
  99. package/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +105 -0
  100. package/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +110 -0
  101. package/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +106 -0
  102. package/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +107 -0
  103. package/skills/lit-pptx/templates/tonalities/night/pack.yaml +106 -0
  104. package/skills/lit-pptx/templates/tonalities/paper/pack.yaml +111 -0
  105. package/skills/lit-pptx/templates/tonalities/signal/pack.yaml +107 -0
  106. package/skills/lit-pptx/templates/tonalities/studio/pack.yaml +105 -0
  107. package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +1 -1
  108. package/skills/lit-typographic-motion/engine/stage/capture.mjs +2 -2
  109. package/skills/lit-typographic-motion/engine/treatment.mjs +1 -1
  110. package/skills/lit-typographic-motion/fonts/pins.json +2 -2
  111. package/skills/lit-typographic-motion/gate.mjs +1 -1
  112. package/skills/lit-typographic-motion/references/stage.md +1 -1
  113. package/skills/lit-typographic-motion/references/style-bibles.md +2 -2
  114. package/skills/lit-typographic-motion/references/treatment.md +1 -1
  115. package/skills/lit-typographic-motion/references/type-craft.md +3 -3
  116. package/skills/managed-skill-manifest.json +288 -44
  117. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Bold.otf +0 -0
  118. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Regular.otf +0 -0
@@ -0,0 +1,111 @@
1
+ # Manual
2
+
3
+ Pack: `templates/tonalities/manual.yaml` · dials density 9, variance 6 · accent #2E4A66 on the callout
4
+ rules and the sidebar rule.
5
+
6
+ ## Purpose
7
+
8
+ A Manual is used, not read through: an operating procedure, a maintenance guide, an onboarding guide, a
9
+ safety procedure, a work instruction. The reader has a task in front of them and looks for the section
10
+ that covers it, follows numbered steps, stops at warnings and checks values in reference tables. Korean
11
+ 절차서, 운영 지침, 작업 표준 and 매뉴얼 belong here.
12
+
13
+ ## Wrong for
14
+
15
+ - A document reporting what happened rather than what to do: use a Report.
16
+ - A one-page instruction with three steps: use a Memo, with the steps as a numbered list.
17
+ - A policy or decision paper: use a Brief.
18
+
19
+ ## Structure
20
+
21
+ | Feature | What the pack sets |
22
+ |---|---|
23
+ | Page 1 | title and subtitle over a document-control block between two hairlines: document (`short_title` or `title`), owner (`author`), organisation (`organization`), issued (`date`); the notice under it |
24
+ | Summary | prose; most manuals open with scope and responsibilities instead of a summary |
25
+ | Numbering | 1 / 1.1 / 1.1.1, so steps and sections can be cited ("see 3.2") |
26
+ | Components | callout (one style for every warning), sidebar, columns |
27
+ | Running head | header: short title; footer: folio right; none on page 1 |
28
+ | Contents | a short list of h1 headings with page numbers, when the source is long enough for about five pages |
29
+
30
+ The control block labels are 문서 / 작성 부서 / 기관 / 시행일 in Korean and Document / Owner /
31
+ Organisation / Issued in English. The block counts as a component kind for the gate's
32
+ `component.variety` check.
33
+
34
+ ## Type scale
35
+
36
+ Body 10.5 pt, h1 14 pt, h2 12 pt, h3 10.5 pt bold, title 26.5 pt, table text 9.5 pt; sidebar text at table
37
+ size. Ragged right in both languages, which keeps step text from stretching. Decimal heading numbers sit
38
+ in a hanging indent wide enough for the widest number, so the heading texts of a level start on one line.
39
+
40
+ ## Components
41
+
42
+ - **Callout, `kind=warning`.** A hazard, an irreversible step, a forbidden combination. Place it directly
43
+ before the step it protects, not at the end of the section. All warnings share one style; there is no
44
+ separate danger or caution colour. The budget is about one box per four pages, so a short manual gets
45
+ one; the converter keeps warnings ahead of notes when it chooses. Write the most serious one as the box
46
+ and fold the others into the step text.
47
+ - **Sidebar.** Definitions, contact numbers or reference values the reader looks up while following the
48
+ text. Floats right at a third of the width by default. Needs two or three paragraphs after it before
49
+ the next heading, or it stands full width.
50
+ - **Columns.** Two balanced blocks, such as the same check on two machine types.
51
+
52
+ ## Writing the source
53
+
54
+ - Do not use a `::: cover` directive unless you want a kicker line above the title; the control block
55
+ comes from the frontmatter.
56
+ - Open with scope and responsibilities: what the manual covers, what it does not, who does what.
57
+ - Write each procedure as a Markdown numbered list (`1.`, `2.`, …), one action per step, in the
58
+ imperative. Each new list restarts at 1.
59
+ - Put conditions and values in tables (inspection items with their limits and the action when a limit is
60
+ missed).
61
+ - Keep warnings short: what not to do, what happens if you do, what to do instead.
62
+ - End with the emergency or exception procedure, also as numbered steps.
63
+
64
+ ## Source fragment
65
+
66
+ ```markdown
67
+ ---
68
+ title: Walk-in freezer daily check procedure
69
+ subtitle: Opening checks, temperature logging and alarm response for kitchen staff
70
+ author: Facilities Team
71
+ organization: Example catering site
72
+ date: 2026-11-20
73
+ short_title: Freezer daily checks
74
+ notice: Sample procedure. Equipment, limits and contacts are invented examples.
75
+ tonality: Manual
76
+ ---
77
+
78
+ # Opening checks
79
+
80
+ Complete these checks before the first delivery is put away. They take about five minutes.
81
+
82
+ 1. Read the display temperature and write it in the log with the time.
83
+ 2. Check that the door closes fully and the seal shows no ice build-up.
84
+ 3. Check the floor for water near the evaporator drain.
85
+
86
+ ::: callout kind=warning title="Door left open"
87
+ Do not prop the door open during deliveries. The evaporator ices over within twenty minutes and the
88
+ freezer may take two hours to recover. Close the door between trolley loads.
89
+ :::
90
+
91
+ ## Temperature limits
92
+
93
+ Table 1. Freezer temperature limits
94
+
95
+ | Reading | Status | Action |
96
+ |---|---|---|
97
+ | -18 °C or colder | Normal | Log and continue |
98
+ | -17 to -15 °C | Warning | Recheck in 30 minutes |
99
+ | Warmer than -15 °C | Alarm | Follow section 3 |
100
+ ```
101
+
102
+ The h1 prints as `1 Opening checks` and the h2 as `1.1 Temperature limits`; the control block on page 1
103
+ lists Freezer daily checks, Facilities Team, Example catering site and 20 November 2026.
104
+
105
+ ## Before delivery
106
+
107
+ - Every step is one action and starts with a verb.
108
+ - Every warning stands before the step it protects.
109
+ - Cross-references use the printed section numbers, which the converter assigns in order; check them
110
+ after any section is added or removed.
111
+ - Reference tables give a value, a status and an action in every row.
@@ -0,0 +1,105 @@
1
+ # Memo
2
+
3
+ Pack: `templates/tonalities/memo.yaml` · dials density 9, variance 2 · no accent.
4
+
5
+ ## Purpose
6
+
7
+ A Memo tells a group of people something they need to know or do, in one or two pages: a notice of works
8
+ or a schedule change, an internal memo, a request for cooperation, a short letter, a decision already
9
+ taken and now announced. Korean 안내문, 공지, 협조 요청 and 업무 연락 fit here. The reader wants the
10
+ subject, what changes, what they must do and whom to ask, and stops reading there.
11
+
12
+ ## Wrong for
13
+
14
+ - A request that someone approve something: use a Brief, which puts the decision box first.
15
+ - More than two pages, or more than two tables: use a Report or a Manual.
16
+ - A procedure with warnings: use a Manual.
17
+
18
+ ## Structure
19
+
20
+ | Feature | What the pack sets |
21
+ |---|---|
22
+ | Page 1 | no cover and no masthead: a small label (the kicker, default 메모 / Memo), the subject as the title at 1.8 times the body size, then rows of To / From / Date / Subject between two hairlines, then the notice |
23
+ | Summary | none; the first section says what happens |
24
+ | Numbering | none |
25
+ | Components | none; a callout or other directive is set as its bold title and plain text |
26
+ | Running head | footer: folio right, from page 2 |
27
+ | Contents | never |
28
+
29
+ The rows come from the lines of the `::: cover` body that start with `To:`, `From:`, `Date:`, `Subject:`,
30
+ `Cc:` or the Korean `받는 사람:`, `보내는 사람:`, `날짜:`, `제목:`, `참조:`. Several pairs may share a line
31
+ when separated by ` · `. When no date row is written, the frontmatter date is inserted after the sender,
32
+ formatted for the language (2026. 10. 12. or 12 October 2026). English values are capitalised. The block
33
+ counts as a component kind for the gate.
34
+
35
+ ## Type scale
36
+
37
+ Korean body 10.5 pt, h1 12.5 pt, h2 11.5 pt, title 19 pt. English body 11 pt, h1 13 pt, h2 12 pt, title
38
+ 20 pt. The smallest heading steps of any pack: in a memo the headings are signposts, not chapters.
39
+ Korean justified.
40
+
41
+ The pack sets `spacing: tight`, so a memo whose content allows stays on one page: line pitch at the low
42
+ end (Hangul 165 %, Latin 120 %), heading space of 12/5, 10/4, 9/3 and 8/3 pt before and after, table cells
43
+ 2 pt top and bottom. A run-in head (a callout's bold title) keeps 12 pt above it, so it starts a block, and
44
+ a paragraph after a list stands 6 pt clear of the list's last item.
45
+
46
+ ## Components
47
+
48
+ None. The memo's single structural device is its header block. A point that seems to need a box is
49
+ better written as the first sentence of its section. If the source holds a callout anyway, the converter
50
+ prints its title as a bold line and the body as plain paragraphs.
51
+
52
+ ## Writing the source
53
+
54
+ - Put the To / From lines in the cover directive and give it a kicker that names the kind of memo (안내,
55
+ 공지, 협조 요청, Notice, Request).
56
+ - The title is the subject line: what, where, when ("본관 승강기 교체 공사 기간 이용 안내", "Car park
57
+ closure, 3 to 7 November").
58
+ - Three to five short sections: what changes, what readers should do, any exceptions, whom to contact.
59
+ - One small table at most, for a schedule or a before-and-after comparison, with a caption.
60
+ - Polite address (합니다체) is normal in a Korean notice addressed to staff; keep it consistent through the
61
+ memo.
62
+ - Give a named contact with an extension or address in the last section.
63
+
64
+ ## Source fragment
65
+
66
+ ```markdown
67
+ ---
68
+ title: Car park closure for resurfacing, 3 to 7 November
69
+ author: Estates Office
70
+ organization: Example college
71
+ date: 2026-10-21
72
+ notice: Sample memo. Names, dates and locations are invented examples.
73
+ tonality: Memo
74
+ ---
75
+
76
+ ::: cover kicker="Notice"
77
+ To: All staff and students · From: Estates Office · Cc: Security desk
78
+ :::
79
+
80
+ # Closed area and dates
81
+
82
+ The main car park on Mill Lane will be closed from 07:00 on Monday 3 November until 18:00 on Friday
83
+ 7 November while the surface is replaced. Blue-badge bays by the library entrance stay open.
84
+
85
+ # Where to park instead
86
+
87
+ Staff permits are valid at the Riverside overflow car park for the week. A shuttle minibus runs from
88
+ Riverside to the main entrance every fifteen minutes between 07:30 and 09:30 and between 16:00 and 18:30.
89
+
90
+ # Questions
91
+
92
+ Contact the Estates Office on extension 2210 or at estates@example.org.
93
+ ```
94
+
95
+ The header block reads To, From, Date (21 October 2026, inserted after From) and Cc, with "Notice" above
96
+ the title.
97
+
98
+ ## Before delivery
99
+
100
+ - The rendered memo is two pages or fewer; page 1 carries no folio. A memo that runs onto a second page
101
+ and fills less than a quarter of it fails `memo.fit` (`qa --layout`): tighten the prose by the lines
102
+ that spill; a memo that needs a real second page keeps it.
103
+ - The subject, the date of the change and the action required are on page 1.
104
+ - No component box appears; the qa output shows only the memo block.
105
+ - Contact details are real for the organisation or clearly marked as examples by the notice.
@@ -0,0 +1,101 @@
1
+ # Proposal
2
+
3
+ Pack: `templates/tonalities/proposal.yaml` · dials density 8, variance 6 · accent #6E2639 on the cover
4
+ rule and the callout rules.
5
+
6
+ ## Purpose
7
+
8
+ A Proposal asks for approval and money for something that does not exist yet: an investment, a pilot, a
9
+ new service, a funding application, a project plan. Its reader is a decision maker or a panel who wants to
10
+ know what will be done, what it costs, when it happens, what it returns and what could go wrong. Korean
11
+ 제안서, 기획서, 사업 계획서 and 투자 품의 fit here.
12
+
13
+ ## Wrong for
14
+
15
+ - Reporting results of something already running: use a Report.
16
+ - A decision on an existing arrangement, such as a rule change, that fits on two pages: use a Brief.
17
+ - A proposal of one page with no budget table: use a Memo or a Brief.
18
+
19
+ ## Structure
20
+
21
+ | Feature | What the pack sets |
22
+ |---|---|
23
+ | Page 1 | a typographic cover page: kicker, the title left-aligned in the upper third, one short rule in the accent, the subtitle and the lead; byline, date and notice at the foot; no picture, no colour block |
24
+ | Summary | prose under the first h1, with one key-figure strip after its first paragraph |
25
+ | Numbering | none |
26
+ | Components | keyfigures, callout (one box), columns |
27
+ | Running head | footer: folio centred; the cover has none and the folio starts at 1 on the first body page |
28
+ | Contents | never |
29
+
30
+ The cover is its own section. The title is broken between words in at most three lines over ten of
31
+ twelve grid columns; the rule under it is 36 mm long and 1 pt thick.
32
+
33
+ ## Type scale
34
+
35
+ Korean body 10.5 pt, h1 14.5 pt, h2 12.5 pt, title 28.5 pt. English body 11 pt, h1 15.5 pt, h2 13 pt,
36
+ title 29.5 pt. Figures may take up to 60 % of the frame height, the most of any pack, because proposals
37
+ often carry a site plan or a schematic. Korean justified.
38
+
39
+ ## Components
40
+
41
+ - **Key figures.** One strip in the summary with the three numbers a decision maker weighs: output or
42
+ benefit, annual saving or revenue, payback or cost per unit. Each basis line states the assumption
43
+ behind the number. Never on the cover: a strip placed inside the cover directive is moved to the
44
+ summary.
45
+ - **Callout.** One `kind=key` box with the decision request, normally at the end. The pack caps callouts
46
+ at one.
47
+ - **Columns.** Two balanced option blocks, when the proposal compares a recommended option with an
48
+ alternative.
49
+
50
+ ## Writing the source
51
+
52
+ - Start with a `::: cover kicker="…"` directive whose body is one or two sentences saying what is
53
+ proposed. That lead is the only text on the cover besides the title block.
54
+ - First h1: the summary. One paragraph on what is proposed and its scale, the strip, one paragraph on cost
55
+ and timing.
56
+ - Then background (why now), what will be built or done, budget, schedule, benefits and risks, and the
57
+ decision request.
58
+ - The budget table lists items with amounts in the header unit, a share column and a total row. The
59
+ schedule table lists stages with dates written the reader's way (`2026년 11월`, `November 2026`).
60
+ - State each risk with its effect on the numbers in the strip ("payback rises to 6.7 years").
61
+
62
+ ## Source fragment
63
+
64
+ ```markdown
65
+ ---
66
+ title: 본사 구내 어린이집 정원 확대 제안
67
+ subtitle: 정원 49명에서 79명으로, 2027년 9월 개원
68
+ author: 예시 은행 인사부
69
+ organization: 예시 은행(가상 기업)
70
+ date: 2026-12-01
71
+ notice: 예시 데이터. 회사, 정원, 금액은 모두 가정이다.
72
+ tonality: Proposal
73
+ ---
74
+
75
+ ::: cover kicker="복리후생 사업 제안"
76
+ 본사 별관 1층을 리모델링해 직장 어린이집 정원을 30명 늘리는 계획이다.
77
+ :::
78
+
79
+ # 요약
80
+
81
+ 별관 1층 사무 공간 410m²를 보육실 4개와 놀이실로 바꿔 정원을 49명에서 79명으로 늘리자고 제안한다.
82
+ 현재 대기 아동은 61명이다.
83
+
84
+ ::: keyfigures
85
+ - **30명** 정원 증가
86
+ - 만 1~4세, 보육실 4개 기준
87
+ - **6억 8,000만 원** 리모델링·설비 비용
88
+ - 업체 견적 3건의 중간값
89
+ - **49%** 대기 아동 해소율
90
+ - 대기 61명 중 30명
91
+ :::
92
+
93
+ 공사는 2027년 3월부터 5개월 동안 진행하고 9월에 새 반을 연다.
94
+ ```
95
+
96
+ ## Before delivery
97
+
98
+ - The cover holds the kicker, title, rule, subtitle, one lead sentence and the foot lines, nothing else.
99
+ - The strip's numbers appear again in the budget table or the text, identical.
100
+ - The decision callout states the amount, the budget line and the first step after approval.
101
+ - The budget table's shares add to 100.0 and its rows add to the total.
@@ -0,0 +1,126 @@
1
+ # Report
2
+
3
+ Pack: `templates/tonalities/report.yaml` · dials density 9, variance 5 · accent #1F3A5F on the title rule
4
+ and callout rules.
5
+
6
+ ## Purpose
7
+
8
+ A Report carries results and the evidence for them: a periodic operating report, a project close-out, an
9
+ analysis of a programme, a quarterly review. It runs from about four to thirty pages, its readers are
10
+ managers who read the summary closely and the rest selectively, and its tables do most of the arguing.
11
+
12
+ The Korean default follows the manner of a research institute's issue paper: continuous prose in the
13
+ plain declarative style (-다), sections numbered Ⅰ. / 1. / 가., tables with `<표 n>` captions, unit lines
14
+ and source lines. The government 개조식 style (□ ○ - lines ending in -함, -임) is a variant the user must
15
+ ask for; it is not the default.
16
+
17
+ ## Wrong for
18
+
19
+ - A document that asks for one decision and has fewer than three supporting tables: that is a Brief.
20
+ - A procedure the reader follows step by step: that is a Manual.
21
+ - A request for money or approval of a new project with a budget and schedule: that is a Proposal.
22
+ - One or two pages of notice: that is a Memo.
23
+ - A long argument with few tables, written to be read through: that is a Journal.
24
+
25
+ ## Structure
26
+
27
+ | Feature | What the pack sets |
28
+ |---|---|
29
+ | Page 1 | masthead title block: series line (kicker left, date right), title, subtitle, byline, one rule in the accent, the notice |
30
+ | Summary | prose under the first h1, with an optional key-figure strip after its first paragraph |
31
+ | Numbering | Korean Ⅰ. / 1. / 가.; English 1 / 1.1 / 1.1.1 |
32
+ | Components | keyfigures, callout, columns (three kinds at most, as always) |
33
+ | Running head | footer: short title left, folio right; none on page 1 |
34
+ | Contents | a short list of h1 headings with page numbers after the title block, when the source is long enough for about five pages |
35
+
36
+ The contents list is generated from the h1 headings; do not write one in the source. The page estimate is
37
+ about 1,500 Korean or 3,300 English characters per page, plus a line for every table row.
38
+
39
+ ## Type scale
40
+
41
+ Body 10.5 pt Pretendard, h1 14.5 pt, h2 12.5 pt, h3 10.5 pt bold, title 26.5 pt, table text 9.5 pt,
42
+ note lines 9 pt. Korean body justified, English ragged right. Line pitch 175 % (Korean) and 133 %
43
+ (English) at density 9.
44
+
45
+ ## Components
46
+
47
+ - **Key figures.** One strip in the summary with three or four results of the period, each with a basis
48
+ line. Good: trips carried, availability against target, cost per trip. Poor: the number of sites, the
49
+ project start date.
50
+ - **Callout.** Usually one `kind=key` box for the decision the report asks for, at the end. A report long
51
+ enough for a second callout (about eight pages) may add one `kind=warning` for a risk that needs action
52
+ before the next report.
53
+ - **Columns.** Rarely needed. Use for two parallel blocks of similar length, such as two sites or two
54
+ options, inside a section.
55
+
56
+ A Report of four pages or more needs two component kinds to pass `component.variety`, because the
57
+ masthead does not count as one. Key figures in the summary and a decision callout are the usual pair.
58
+
59
+ ## Writing the source
60
+
61
+ - Open with a `::: cover kicker="…"` directive when the report belongs to a series ("운영 보고 2026-4호",
62
+ "Half-year operating report"); leave it out otherwise.
63
+ - Make the first h1 the summary (요약 / Summary). Its first paragraph states the main result with its
64
+ number; the strip follows; the next paragraphs give the main problem and what is proposed.
65
+ - Give every following h1 an opening paragraph before its first h2.
66
+ - Put the evidence in tables with captions, a unit line where the header allows it, and `주:` / `자료:`
67
+ lines. Discuss each table in the text: the sentence before it says what to look for, the sentence after
68
+ it says what follows from it.
69
+ - End with the plan or decision section; a closing `kind=key` callout states exactly what is asked.
70
+ - Set `short_title:` for the footer.
71
+
72
+ ## Source fragment
73
+
74
+ ```markdown
75
+ ---
76
+ title: 2026년 상반기 고객 상담 센터 운영 실적
77
+ subtitle: 응답 시간, 상담 건수, 인력 운영
78
+ author: 예시 서비스 고객지원팀
79
+ organization: 예시 서비스(가상 기업)
80
+ date: 2026-07-10
81
+ short_title: 상반기 상담 센터 실적
82
+ notice: 예시 데이터. 회사와 수치는 모두 가정이다.
83
+ tonality: Report
84
+ ---
85
+
86
+ ::: cover kicker="반기 운영 보고"
87
+ :::
88
+
89
+ # 요약
90
+
91
+ 상반기 상담 건수는 18만 4,200건으로 작년 같은 기간보다 9% 늘었다. 평균 응답 시간은 2분 40초로
92
+ 목표 3분 안에 들었지만, 3월 요금 개편 직후 두 주 동안은 6분을 넘었다.
93
+
94
+ ::: keyfigures
95
+ - **18만 4,200건** 상반기 상담 건수
96
+ - 2026. 1.~6., 전화·채팅 합계
97
+ - **2분 40초** 평균 응답 시간
98
+ - 목표 3분, 상담 시스템 기록
99
+ - **87%** 1회 해결률
100
+ - 재문의 7일 기준
101
+ :::
102
+
103
+ # 상담 건수
104
+
105
+ 상담 건수는 요금 개편이 있었던 3월에 가장 많았다.
106
+
107
+ 표 1. 1분기 월별 상담 건수
108
+
109
+ | 구분 | 1월 (건) | 2월 (건) | 3월 (건) |
110
+ |---|---:|---:|---:|
111
+ | 전화 | 18,400 | 17,900 | 26,100 |
112
+ | 채팅 | 9,800 | 10,200 | 14,600 |
113
+
114
+ 자료: 상담 시스템 월간 집계(예시)
115
+ ```
116
+
117
+ The three header cells after the first end in the same unit, so the converter writes `(단위: 건)` above
118
+ the table and the headers read 1월, 2월, 3월. The h1 headings print as Ⅰ. 요약 and Ⅱ. 상담 건수.
119
+
120
+ ## Before delivery
121
+
122
+ - Every number in the summary and the strip matches the table that carries the same quantity, with the
123
+ same rounding.
124
+ - Headings are noun phrases; no heading ends in -다 or -음.
125
+ - No ISO date outside the frontmatter `date:`.
126
+ - The qa run passes; with `--layout`, no page under 0.35 fill, no stranded heading, no split table.
@@ -20,6 +20,7 @@ COMMANDS = {
20
20
  "pdf-to-md": "convert_pdf.py",
21
21
  "edit": "edit_docx.py",
22
22
  "lint": "slop_lint.py",
23
+ "qa": "craft_docx.py",
23
24
  "audit": "visual_audit.py",
24
25
  "clean-md": "clean_markdown.py",
25
26
  "embed-images": "embed_images.py",
@@ -48,7 +49,7 @@ def prepare():
48
49
 
49
50
  def main():
50
51
  if len(sys.argv) < 2:
51
- raise SystemExit("Usage: python3 run.py <md-to-docx|md-to-pdf|pdf-to-md|edit|lint|audit|clean-md|embed-images|templates|doctor> [arguments]")
52
+ raise SystemExit("Usage: python3 run.py <md-to-docx|md-to-pdf|pdf-to-md|edit|lint|qa|audit|clean-md|embed-images|templates|doctor> [arguments]")
52
53
  command, *args = sys.argv[1:]
53
54
  if command == "doctor":
54
55
  print(json.dumps({"pythonReady": ready()}))