dsh-office-kit 0.4.2 → 0.4.3

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 (113) hide show
  1. package/assets/skills/excel-live-control/SKILL.md +119 -152
  2. package/assets/skills/excel-live-control/domain_guidance/financial_models.md +42 -58
  3. package/assets/skills/excel-live-control/domain_guidance/healthcare.md +36 -42
  4. package/assets/skills/excel-live-control/domain_guidance/marketing_advertising.md +33 -34
  5. package/assets/skills/excel-live-control/domain_guidance/scientific_research.md +34 -36
  6. package/assets/skills/excel-live-control/references/office-automation.md +127 -153
  7. package/assets/skills/excel-live-control/references/read_only_qna.md +40 -45
  8. package/assets/skills/excel-live-control/style_guidelines.md +56 -64
  9. package/assets/skills/excel-live-control/workflows/create_workflows.md +40 -47
  10. package/assets/skills/excel-live-control/workflows/edit_workflows.md +37 -45
  11. package/assets/skills/office-documents/SKILL.md +24 -60
  12. package/assets/skills/office-documents/examples/end_to_end_smoke_test.md +5 -5
  13. package/assets/skills/office-documents/ooxml/comments.md +8 -8
  14. package/assets/skills/office-documents/ooxml/hyperlinks_and_fields.md +10 -10
  15. package/assets/skills/office-documents/ooxml/rels_and_content_types.md +7 -7
  16. package/assets/skills/office-documents/ooxml/tracked_changes.md +12 -12
  17. package/assets/skills/office-documents/references/docx-structure.md +11 -13
  18. package/assets/skills/office-documents/references/template-elicitation.md +11 -13
  19. package/assets/skills/office-documents/references/writing-quality.md +20 -20
  20. package/assets/skills/office-documents/tasks/accessibility_a11y.md +16 -22
  21. package/assets/skills/office-documents/tasks/captions_crossrefs.md +23 -26
  22. package/assets/skills/office-documents/tasks/clean_tracked_changes.md +17 -22
  23. package/assets/skills/office-documents/tasks/comments_manage.md +9 -11
  24. package/assets/skills/office-documents/tasks/compare_diff.md +10 -16
  25. package/assets/skills/office-documents/tasks/create_edit.md +14 -16
  26. package/assets/skills/office-documents/tasks/equations.md +17 -28
  27. package/assets/skills/office-documents/tasks/fields_update.md +14 -16
  28. package/assets/skills/office-documents/tasks/fixtures_edge_cases.md +19 -33
  29. package/assets/skills/office-documents/tasks/footnotes_endnotes.md +12 -14
  30. package/assets/skills/office-documents/tasks/forms_content_controls.md +16 -20
  31. package/assets/skills/office-documents/tasks/headings_numbering.md +17 -22
  32. package/assets/skills/office-documents/tasks/images_figures.md +15 -25
  33. package/assets/skills/office-documents/tasks/multi_doc_merge.md +13 -23
  34. package/assets/skills/office-documents/tasks/navigation_internal_links.md +18 -21
  35. package/assets/skills/office-documents/tasks/privacy_scrub_metadata.md +16 -22
  36. package/assets/skills/office-documents/tasks/protection_restrict_editing.md +19 -21
  37. package/assets/skills/office-documents/tasks/read_review.md +9 -20
  38. package/assets/skills/office-documents/tasks/redaction_anonymization.md +17 -18
  39. package/assets/skills/office-documents/tasks/sections_layout.md +16 -23
  40. package/assets/skills/office-documents/tasks/style_lint_normalize.md +18 -22
  41. package/assets/skills/office-documents/tasks/tables_spreadsheets.md +21 -31
  42. package/assets/skills/office-documents/tasks/templates_style_packs.md +17 -21
  43. package/assets/skills/office-documents/tasks/toc_workflow.md +10 -14
  44. package/assets/skills/office-documents/tasks/verify_render.md +11 -23
  45. package/assets/skills/office-documents/tasks/watermarks_background.md +11 -15
  46. package/assets/skills/office-documents/troubleshooting/libreoffice_headless.md +6 -6
  47. package/assets/skills/office-documents/troubleshooting/run_splitting.md +12 -12
  48. package/assets/skills/office-pdf/SKILL.md +36 -51
  49. package/assets/skills/office-pdf/references/form-fields.md +20 -20
  50. package/assets/skills/office-pdf/references/geometry.md +10 -10
  51. package/assets/skills/office-pdf/references/layout-quality.md +13 -13
  52. package/assets/skills/office-pdf/references/limits.md +12 -56
  53. package/assets/skills/office-pdf/tasks/annotations.md +5 -5
  54. package/assets/skills/office-pdf/tasks/create.md +6 -9
  55. package/assets/skills/office-pdf/tasks/edit-pages.md +14 -14
  56. package/assets/skills/office-pdf/tasks/forms.md +15 -15
  57. package/assets/skills/office-pdf/tasks/read.md +9 -9
  58. package/assets/skills/office-pdf/tasks/redact.md +18 -18
  59. package/assets/skills/office-pdf/tasks/stamp.md +10 -10
  60. package/assets/skills/office-presentations/SKILL.md +71 -91
  61. package/assets/skills/office-presentations/container_tools/render_slides.py +1 -1
  62. package/assets/skills/office-presentations/domain_guidance/finance.md +16 -16
  63. package/assets/skills/office-presentations/recipes/README.md +24 -35
  64. package/assets/skills/office-presentations/recipes/autolayout.md +12 -13
  65. package/assets/skills/office-presentations/recipes/connectors.md +11 -12
  66. package/assets/skills/office-presentations/recipes/images.md +11 -12
  67. package/assets/skills/office-presentations/recipes/master-and-layouts.md +18 -18
  68. package/assets/skills/office-presentations/recipes/native-charts.md +8 -8
  69. package/assets/skills/office-presentations/recipes/rich-text-runs.md +13 -13
  70. package/assets/skills/office-presentations/recipes/speaker-notes.md +7 -7
  71. package/assets/skills/office-presentations/recipes/tables.md +14 -14
  72. package/assets/skills/office-presentations/recipes/textbox-at-coordinate.md +9 -9
  73. package/assets/skills/office-presentations/recipes/theme-tokens.md +7 -8
  74. package/assets/skills/office-presentations/references/authoring-workflow.md +38 -43
  75. package/assets/skills/office-presentations/references/finalization.md +10 -12
  76. package/assets/skills/office-presentations/references/native-bullets.md +14 -18
  77. package/assets/skills/office-presentations/references/native-evidence.md +18 -32
  78. package/assets/skills/office-presentations/references/style-guidelines.md +27 -32
  79. package/assets/skills/office-presentations/references/templates.md +31 -60
  80. package/assets/skills/office-presentations/routing/google_slides.md +4 -4
  81. package/assets/skills/office-presentations/tasks/apply-annotations.md +17 -17
  82. package/assets/skills/office-presentations/tasks/charts-tables-notes.md +20 -23
  83. package/assets/skills/office-presentations/tasks/create-deck.md +19 -19
  84. package/assets/skills/office-presentations/tasks/edit-deck.md +14 -16
  85. package/assets/skills/office-presentations/tasks/inspect-and-verify.md +31 -34
  86. package/assets/skills/office-presentations/tasks/template-following.md +23 -28
  87. package/assets/skills/office-spreadsheets/SKILL.md +32 -39
  88. package/assets/skills/office-spreadsheets/recipes/charts.md +8 -26
  89. package/assets/skills/office-spreadsheets/recipes/conditional-formats.md +9 -26
  90. package/assets/skills/office-spreadsheets/recipes/data-tables.md +7 -23
  91. package/assets/skills/office-spreadsheets/recipes/named-ranges.md +8 -21
  92. package/assets/skills/office-spreadsheets/recipes/number-formats.md +7 -23
  93. package/assets/skills/office-spreadsheets/recipes/sparklines.md +7 -20
  94. package/assets/skills/office-spreadsheets/references/charts.md +15 -34
  95. package/assets/skills/office-spreadsheets/references/domain/financial-models.md +10 -25
  96. package/assets/skills/office-spreadsheets/references/domain/healthcare.md +8 -19
  97. package/assets/skills/office-spreadsheets/references/domain/marketing.md +8 -22
  98. package/assets/skills/office-spreadsheets/references/domain/research.md +8 -19
  99. package/assets/skills/office-spreadsheets/references/formula-patterns.md +20 -50
  100. package/assets/skills/office-spreadsheets/references/style-guidelines.md +19 -44
  101. package/assets/skills/office-spreadsheets/references/workbook-structure.md +12 -35
  102. package/assets/skills/office-spreadsheets/routing/google-sheets.md +11 -26
  103. package/assets/skills/office-spreadsheets/tasks/analyze-workbook.md +10 -25
  104. package/assets/skills/office-spreadsheets/tasks/annotations.md +12 -30
  105. package/assets/skills/office-spreadsheets/tasks/create-workbook.md +5 -5
  106. package/assets/skills/office-spreadsheets/tasks/diff-workbooks.md +2 -2
  107. package/assets/skills/office-spreadsheets/tasks/edit-workbook.md +5 -5
  108. package/assets/skills/office-spreadsheets/tasks/inspect-workbook.md +9 -9
  109. package/assets/skills/office-spreadsheets/tasks/recalc-and-check.md +10 -30
  110. package/assets/skills/shared/annotation-recipes.md +98 -120
  111. package/assets/skills/shared/common-workflow.md +70 -80
  112. package/dist/index.js +1 -1
  113. package/package.json +1 -1
@@ -1,65 +1,60 @@
1
1
  # Authoring workflow
2
2
 
3
- ## What a deck is, mechanically
3
+ ## What a deck is
4
4
 
5
- A `.pptx` is a zip of XML parts: one `presentation.xml` naming the slide order, one
6
- part per slide, a slide master per theme, a layout per family, chart parts with
7
- embedded workbooks, notes parts, and a media folder. Everything the reader sees
8
- comes from those parts, which is why the verification loop reads the file back
9
- instead of trusting the code that wrote it.
5
+ A `.pptx` is a zip of XML parts: `presentation.xml` (slide order), one part per
6
+ slide, a slide master per theme, a layout per family, chart parts with embedded
7
+ workbooks, notes parts, a media folder. Read the file back; never trust the code
8
+ that wrote it.
10
9
 
11
- Three consequences shape the whole workflow:
10
+ Three consequences:
12
11
 
13
- 1. **Geometry is explicit.** Nothing reflows on open except autofit. If two
14
- shapes overlap in the XML, they overlap on screen.
15
- 2. **Inheritance is real.** A slide draws its background, type sizes and bullet
12
+ 1. **Geometry is explicit.** Nothing reflows on open except autofit; shapes that
13
+ overlap in XML overlap on screen.
14
+ 2. **Inheritance is real.** A slide draws background, type sizes and bullet
16
15
  glyphs from its layout and master. Overriding at slide level is a per-slide
17
- decision; overriding at master level is a deck decision.
18
- 3. **Data can stay alive.** A native chart or table keeps its numbers in the
19
- file and can be checked; a screenshot cannot.
16
+ decision; at master level a deck decision.
17
+ 3. **Data stays alive.** A native chart or table keeps its numbers and can be
18
+ checked; a screenshot cannot.
20
19
 
21
20
  ## The loop
22
21
 
23
- 1. **Decide the story**: one sentence per slide, in order, before any XML. A
24
- slide without a sentence is a slide the audience will not read.
25
- 2. **Pick the frame**: slide size from the target (`13.333 × 7.5 in` is the 16:9
26
- default; check `prs.slide_width` of a supplied template, never assume).
27
- 3. **Place, top-down**: background, chrome, title, body, evidence. Later shapes
22
+ 1. **Decide the story.** One sentence per slide, in order, before any XML.
23
+ 2. **Pick the frame.** Slide size from the target: `13.333 × 7.5 in` is the 16:9
24
+ default; check `prs.slide_width` of a supplied template, never assume.
25
+ 3. **Place, top-down.** Background, chrome, title, body, evidence; later shapes
28
26
  paint over earlier ones.
29
- 4. **Fill or delete every placeholder.** An empty placeholder is visible in edit
30
- view and prints "Click to add text".
31
- 5. **Render, look, fix.** `container_tools/render_slides.py` then `read_image` on
32
- every PNG. Repeat until nothing surprises you.
27
+ 4. **Fill or delete every placeholder.** An empty one shows in edit view and
28
+ prints "Click to add text".
29
+ 5. **Render, look, fix.** `container_tools/render_slides.py`, then `read_image`
30
+ on every PNG; repeat until nothing surprises you.
33
31
 
34
- ## The numbers that keep a deck readable
32
+ ## Layout numbers
35
33
 
36
- | Element | Value | Why |
37
- |---|---|---|
38
- | Slide size | 13.333 × 7.5 in | 16:9; 10 × 5.625 in for 16:9 in "wide" templates |
39
- | Margin | 0.6–0.9 in | Below 0.5 in a projector crops it |
40
- | Title | 28–36 pt, bold | 44 pt only on covers |
41
- | Body | 18 pt minimum | The back row rule |
42
- | Caption / source | 12–14 pt | Never below 11 pt |
43
- | Line spacing | 1.1–1.2 | Tighter crowds ascenders |
44
- | Gap between blocks | 0.2–0.4 in | The eye groups by proximity |
45
- | Footer zone | bottom 0.55 in | Keep text out of it |
34
+ Type, colour and density: [style-guidelines](style-guidelines.md).
46
35
 
47
- Convert once and keep the numbers in EMU or inches, not mixed: `Inches(x)` in
48
- code, `x * 914400` when you must talk to the XML directly.
36
+ | Value | Rule |
37
+ |---|---|
38
+ | Slide size | 13.333 × 7.5 in (16:9); 10 × 5.625 in for "wide" templates |
39
+ | Margin | 0.6–0.9 in; below 0.5 in a projector crops it |
40
+ | Line spacing | 1.1–1.2; tighter crowds ascenders |
41
+ | Gap between blocks | 0.2–0.4 in; the eye groups by proximity |
42
+ | Footer zone | bottom 0.55 in; keep text out |
49
43
 
50
- ## Deciding slide count
44
+ One unit only: `Inches(x)` in code, `x * 914400` for raw XML. Never mix EMU and
45
+ inches.
51
46
 
52
- One idea per slide. If a slide has two headlines competing, it is two slides. If
53
- it has one headline and a table too large to read at 14 pt, the table becomes an
54
- appendix slide and the body slide states the conclusion in one line.
47
+ ## Deciding slide count
55
48
 
56
- A presentation of N minutes needs roughly N/2 content slides at 60–90 seconds
57
- each, plus a cover and a closing ask.
49
+ One idea per slide; two competing headlines is two slides. One headline plus a
50
+ table too large for 14 pt makes the table an appendix, and the body slide states
51
+ the conclusion in one line. N minutes ≈ N/2 content slides at 60–90 seconds each,
52
+ plus a cover and a closing ask.
58
53
 
59
54
  ## Where the detail lives
60
55
 
61
- - Type, colour, density and cover art: [style-guidelines](style-guidelines.md).
56
+ - Type, colour, density, cover art: [style-guidelines](style-guidelines.md).
62
57
  - Bullets that read as sentences: [native-bullets](native-bullets.md).
63
- - Charts, tables and notes as evidence: [native-evidence](native-evidence.md).
58
+ - Charts, tables and notes: [native-evidence](native-evidence.md).
64
59
  - Supplied templates: [templates](templates.md).
65
60
  - Pre-delivery checklist: [finalization](finalization.md).
@@ -1,7 +1,6 @@
1
1
  # Finalization checklist
2
2
 
3
- Run this before `present`. It exists because every item on it has shipped a
4
- broken deck at least once.
3
+ Run this before `present`. Every item has shipped a broken deck at least once.
5
4
 
6
5
  ## The file
7
6
 
@@ -12,19 +11,18 @@ broken deck at least once.
12
11
  - [ ] Slide count matches the intent; nothing left over from an earlier draft.
13
12
  - [ ] Core properties set:
14
13
  `"<python>" "<skill>/container_tools/core_properties.py" --input deck.pptx --title "..." --author "..."`
15
- (an untitled deck shows up as "PowerPoint Presentation" in every file list).
14
+ (an untitled deck shows as "PowerPoint Presentation" in every file list).
16
15
 
17
16
  ## The content
18
17
 
19
- - [ ] Every placeholder is filled or deleted — no "Click to add text".
18
+ - [ ] Every placeholder filled or deleted — no "Click to add text".
20
19
  - [ ] No default chart title ("Chart Title") survives:
21
20
  `"<python>" "<skill>/container_tools/native_chart_title_gate.py" --input deck.pptx`.
22
21
  - [ ] Totals are arithmetic:
23
22
  `"<python>" "<skill>/container_tools/native_table_arithmetic_gate.py" --input deck.pptx --contracts totals.json`.
24
23
  - [ ] Charts have their data in the file (portable mode passes) and categories
25
24
  are in a meaningful order.
26
- - [ ] Numbers in the deck agree with the numbers in the source data, at the
27
- precision shown.
25
+ - [ ] Numbers in the deck agree with the source data at the precision shown.
28
26
  - [ ] Speaker notes carry the provenance of the non-obvious numbers.
29
27
 
30
28
  ## The layout
@@ -34,7 +32,7 @@ broken deck at least once.
34
32
  → `passed: true`; review findings read and consciously accepted.
35
33
  - [ ] Nothing outside the slide edge, nothing overlapping the footer zone.
36
34
  - [ ] Titles are one or two lines; no title ends in a full stop.
37
- - [ ] Body text is at least 18 pt, captions at least 12 pt.
35
+ - [ ] Body text at least 18 pt, captions at least 12 pt.
38
36
  - [ ] One idea per slide, one emphasis per paragraph.
39
37
 
40
38
  ## The look
@@ -46,7 +44,7 @@ broken deck at least once.
46
44
  - [ ] Text is not clipped, ellipsised or shrunk to illegibility.
47
45
  - [ ] Photographs are not stretched; their sources are listed.
48
46
  - [ ] Charts read at thumbnail size: the point is visible before any label.
49
- - [ ] The cover and closing slide both say something.
47
+ - [ ] Cover and closing slide both say something.
50
48
 
51
49
  ## Delivery
52
50
 
@@ -57,7 +55,7 @@ broken deck at least once.
57
55
 
58
56
  ## When rendering is unavailable
59
57
 
60
- `render_slides.py --engine draft` draws a geometry preview with PyMuPDF when no
61
- office suite is installed. It is honest about being approximate: type is drawn
62
- at declared sizes in a substitute face, and layout chrome is not rendered. Use
63
- it to catch overlap, overflow and placement — not to judge typography.
58
+ `render_slides.py --engine draft` draws a PyMuPDF geometry preview when no office
59
+ suite is installed. Type is drawn at declared sizes in a substitute face and
60
+ layout chrome is not rendered. Use it to catch overlap, overflow and placement —
61
+ not to judge typography.
@@ -8,24 +8,21 @@ A bullet is a claim, not a label. Two forms work:
8
8
  cost, not the pick."
9
9
  - **Number + meaning**: "12 minutes per order lost to aisle travel."
10
10
 
11
- Forms that do not work: a single noun ("Efficiency"), a truncated clause
12
- ("Picking accounts for…"), a list of three adjectives, or a bullet that restates
13
- the slide title.
11
+ Forms that fail: a single noun ("Efficiency"), a truncated clause ("Picking
12
+ accounts for…"), three adjectives in a row, or a bullet that restates the slide
13
+ title.
14
14
 
15
15
  ## Length and count
16
16
 
17
17
  - One line, two at the absolute maximum, per bullet on a 16:9 slide.
18
18
  - Three to five bullets. Six is a signal to split; eight is a document.
19
- - No sub-sub-bullets. If a bullet needs a child, the parent was a section.
19
+ - No sub-sub-bullets. A bullet needing a child means the parent was a section.
20
20
  - Keep bullets grammatically parallel: all sentences, or all noun phrases.
21
21
 
22
22
  ## Native bullet glyphs
23
23
 
24
- Bullets in PowerPoint are paragraph properties, not characters. A bullet
25
- character typed into the text ("• Picking…") is a bullet that cannot re-indent,
26
- cannot change level, and looks different from every other bullet in the deck.
27
-
28
- Set them properly:
24
+ Bullets are paragraph properties, not characters. A typed bullet ("• Picking…")
25
+ cannot re-indent, cannot change level, and looks unlike every other bullet.
29
26
 
30
27
  ```python
31
28
  "<python>" - <<'PY'
@@ -64,15 +61,14 @@ print("bullets:", len(frame.paragraphs))
64
61
  PY
65
62
  ```
66
63
 
67
- The `marL`/`indent` pair is what pulls the second line of a wrapped bullet under
68
- the text instead of under the glyph — the most common "malformed bullet" defect
69
- in generated decks.
64
+ The `marL`/`indent` pair pulls a wrapped bullet's second line under the text
65
+ instead of under the glyph — the most common "malformed bullet" defect in
66
+ generated decks.
70
67
 
71
68
  ## Anti-patterns
72
69
 
73
- - Bullets as a script: a slide is not a transcript, the speaker notes are.
74
- - Fake bullets via "– " or "→ " prefixes in the text; they do not indent.
75
- - Six bullets of equal weight where one is the actual point. Make the point the
76
- title and the bullets the evidence.
77
- - Numbered lists where the order does not matter, and bullet lists where it
78
- does.
70
+ - Bullets as a script: a slide is not a transcript; the speaker notes are.
71
+ - Fake bullets via "– " or "→ " prefixes; they do not indent.
72
+ - Six bullets of equal weight where one is the point. Make the point the title,
73
+ the bullets the evidence.
74
+ - Numbered lists where order does not matter, bullets where it does.
@@ -1,7 +1,7 @@
1
1
  # Evidence on slides: charts, tables, notes
2
2
 
3
- "Evidence" is anything on a slide that claims a fact: a number, a chart, a
4
- table, a quotation. The rules below keep it checkable.
3
+ "Evidence" is anything on a slide that claims a fact: a number, a chart, a table,
4
+ a quotation. These rules keep it checkable.
5
5
 
6
6
  ## Native or it did not happen
7
7
 
@@ -12,56 +12,42 @@ table, a quotation. The rules below keep it checkable.
12
12
  | A single number | A bold run in a sentence | A one-bar chart |
13
13
  | A process | Shapes plus connectors | Image of a flowchart |
14
14
 
15
- The wrong column has one shared defect: the audience cannot read it at projector
16
- size and nobody can verify it. Native charts and tables also keep their numbers
17
- in the package, which is what lets `container_tools/native_quantitative_chart_gate.py`
18
- and `container_tools/native_table_arithmetic_gate.py` check them.
15
+ The wrong column is unreadable at projector size and unverifiable. Native charts
16
+ and tables keep their numbers in the package, which is what lets the
17
+ quantitative-chart and table-arithmetic gates check them
18
+ ([inspect-and-verify](../tasks/inspect-and-verify.md)).
19
19
 
20
20
  ## Charts
21
21
 
22
22
  - The chart title says what the chart means. The slide title says the conclusion.
23
- Two titles, two jobs — if they are the same sentence, drop the chart title
24
- (`chart.has_title = False`) rather than repeat it.
23
+ If they are the same sentence, drop the chart title (`chart.has_title = False`)
24
+ rather than repeat it.
25
25
  - Bars start at zero. Lines may start elsewhere only if the axis is labelled.
26
26
  - Categories in the order the audience thinks in (Q1..Q4, not alphabetised).
27
- - Label the few numbers that matter, not every point. Ten data labels is a
28
- table with rounded corners.
29
- - One axis. Two y-axes on a slide chart is a way to imply a correlation that may
30
- not exist.
27
+ - Label the few numbers that matter, not every point; ten data labels is a table
28
+ with rounded corners.
29
+ - One axis. Two y-axes imply a correlation that may not exist.
31
30
  - Source and window in the caption: "Driver logs, FY2026, 12 sites".
32
31
 
33
32
  ## Tables
34
33
 
35
34
  - Column order follows the reader's question: what, then how much, then change.
36
- - Header row is bold and distinct; total row is bold and separated.
35
+ - Header row bold and distinct; total row bold and separated.
37
36
  - Numbers right-aligned, one decimal convention per column.
38
37
  - A total is arithmetic the reader can check. Fill it from the data, never by
39
38
  eye, and let the table arithmetic gate confirm it.
40
- - Do not put units in every cell; put them in the header.
41
- - A table with more than about 7 rows belongs in an appendix, with the slide
42
- stating the conclusion.
39
+ - No units in every cell; units in the header.
40
+ - A table over about 7 rows belongs in an appendix, with the slide stating the
41
+ conclusion.
43
42
 
44
43
  ## Speaker notes as provenance
45
44
 
46
- Notes are where "where did this number come from" lives, so the presenter can
47
- answer without the slide turning into a footnote.
45
+ Notes hold "where did this number come from", so the presenter can answer without
46
+ turning the slide into a footnote.
48
47
 
49
- - One note per non-obvious number: source, date range, and any caveat.
48
+ - One note per non-obvious number: source, date range, any caveat.
50
49
  - The sentence you will actually say, in spoken words.
51
50
  - No bullet-stacking in notes; notes are prose.
52
51
  - Notes are invisible to the render loop — verify them from the file, not the
53
52
  PNGs. `container_tools/inspect_presentation_package_integrity.py` counts
54
53
  `notesSlides`, and the package dump shows their text.
55
-
56
- ## Fidelity gates
57
-
58
- Before presenting a deck that carries numbers:
59
-
60
- ```bash
61
- "<python>" container_tools/native_quantitative_chart_gate.py --input deck.pptx --all-slides
62
- "<python>" container_tools/native_table_arithmetic_gate.py --input deck.pptx --contracts totals.json
63
- "<python>" container_tools/native_chart_title_gate.py --input deck.pptx
64
- ```
65
-
66
- Each prints one JSON object whose `passed` field is the decision. A failing gate
67
- is not advisory: it means the slide asserts something the file cannot support.
@@ -2,8 +2,8 @@
2
2
 
3
3
  ## The type scale
4
4
 
5
- Three sizes are enough: title, body, caption. A fourth size is a decision the
6
- audience has to make, and they will make it wrongly.
5
+ Three sizes: title, body, caption. A fourth is a decision the audience will make
6
+ wrongly.
7
7
 
8
8
  | Role | Size | Weight | Colour |
9
9
  |---|---|---|---|
@@ -13,54 +13,49 @@ audience has to make, and they will make it wrongly.
13
13
  | Lead-in number | Same as body + bold | Bold | Accent |
14
14
  | Caption, source | 12–14 pt | Regular | Muted |
15
15
 
16
- Rules that carry the rest:
16
+ 44 pt belongs to covers; content titles stay 28–36 pt.
17
17
 
18
- - One typeface family. A second family means "different voice", so use it for
19
- one thing (a quote, a code line) and nothing else.
18
+ - One typeface family. A second family means "different voice": use it for one
19
+ thing (a quote, a code line) and nothing else.
20
20
  - Bold is emphasis, not decoration: at most one bold phrase per paragraph.
21
- - All-caps for a 2–4 word label is a design choice; all-caps for a sentence is
22
- a readability tax.
23
- - Left-align body text. Centred paragraphs longer than two lines are hard to
24
- track back to the next line.
21
+ - All-caps suits a 2–4 word label; in a sentence it is a readability tax.
22
+ - Left-align body text. Centred paragraphs over two lines are hard to track back.
25
23
 
26
24
  ## Colour
27
25
 
28
- - One ink, one muted, one accent, plus the template's own rule colour. More
29
- than that and the accent stops meaning "look here".
30
- - Contrast is a correctness issue: body text on white needs a dark ink
31
- (roughly luminance ratio 4.5:1), and text over a photograph needs a scrim,
32
- not luck.
33
- - Never encode meaning in colour alone — an accent bar showing the direction of
34
- a metric also needs an arrow or a word.
35
- - Chart series colours come from the theme; a sixth series colour is a signal
36
- that the chart has too many series.
26
+ - One ink, one muted, one accent, plus the template's rule colour. More and the
27
+ accent stops meaning "look here".
28
+ - Contrast is a correctness issue: body on white needs dark ink (≈4.5:1), and
29
+ text over a photograph needs a scrim, not luck.
30
+ - Never encode meaning in colour alone: an accent bar also needs an arrow or a
31
+ word.
32
+ - Chart series colours come from the theme; a sixth series colour signals too
33
+ many series.
37
34
 
38
35
  ## Density
39
36
 
40
- - Body blocks stop at about 6 lines of 18 pt on a 16:9 slide before the eye
41
- stops at the middle.
42
- - A table on a slide reads at up to about 7 rows × 4 columns. Beyond that it is
43
- an appendix, and the slide should carry the one row that matters.
44
- - Whitespace is a layout element, not leftover space: leave at least 0.6 in
45
- between content blocks and the slide edge.
37
+ - Body blocks stop at about 6 lines of 18 pt on a 16:9 slide.
38
+ - A slide table reads at about 7 rows × 4 columns. Beyond that it is an appendix,
39
+ and the slide carries the one row that matters.
40
+ - Keep at least 0.6 in between content blocks and the slide edge.
46
41
  - One idea per slide. If the title needs "and", split.
47
42
 
48
43
  ## Cover art direction
49
44
 
50
45
  A cover carries three things: the title, the context line, and the visual that
51
- sets the tone. Keep them separate roles.
46
+ sets the tone. Keep the roles separate.
52
47
 
53
48
  - Abstract geometry, a photograph of the actual subject, or a flat colour field
54
49
  all work. Clip art of a handshake does not.
55
- - If the visual is photographic, darken it (a scrim at 40–60% black) under the
56
- text rather than hoping the text lands on a dark region.
57
- - If no suitable image exists, use a colour field plus an accent rule. An
58
- invented diagram pretending to be a photograph is worse than a plain cover.
59
- - Encode the deck's palette: if the accent is amber, the cover visual should
60
- contain amber, not a random sunset.
50
+ - Photographic visual: scrim it at 40–60% black under the text rather than
51
+ hoping the text lands on a dark region.
52
+ - No suitable image: colour field plus an accent rule. An invented diagram
53
+ pretending to be a photograph is worse than a plain cover.
54
+ - Encode the deck's palette: an amber accent means an amber-bearing visual, not a
55
+ random sunset.
61
56
  - Never ship a screenshot of a tool, a UI or another slide as cover art.
62
57
 
63
58
  ## Closing slides
64
59
 
65
60
  The last slide restates the ask in one line and nothing else. "Thank you" alone
66
- wastes the slot the audience is still looking at while they gather their things.
61
+ wastes the slot the audience looks at while gathering their things.
@@ -1,76 +1,47 @@
1
1
  # Working from a supplied template
2
2
 
3
- ## Why templates win
4
-
5
- A template already answers branding, type scale, slide families and chrome. The
6
- cheapest correct deck puts the user's content into the template's own slides
7
- and leaves the design alone. Rebuilding the look from a screenshot produces a
8
- near-miss that reads as "someone remade our deck in a hurry".
3
+ A template already answers branding, type scale, slide families and chrome. Put
4
+ the user's content into the template's own slides and leave the design alone;
5
+ rebuilding the look from a screenshot produces a near-miss that reads as "someone
6
+ remade our deck in a hurry".
9
7
 
10
8
  ## Order of operations
11
9
 
12
- 1. **Inspect the template** before judging it:
13
-
14
- ```bash
15
- "<python>" "<skill>/template_following_scripts/inspect_template_deck.py" --template brand.pptx --out-dir template-inspect
16
- ```
17
-
18
- It writes `template-inspect.ndjson` (per slide: layout, placeholders with
19
- index, kind, rect and text, background art) and `template-manifest.json`
20
- (slide size, aspect, layout names, theme fonts, which slides carry
21
- full-bleed art).
22
-
23
- 2. **Choose the slide families you need** — cover, section, content, table,
24
- chart, closing. You want the *fewest* source slides that cover those roles.
25
-
26
- 3. **Write the frame map** — a JSON plan that names, per output slide, which
27
- source slide it duplicates and what happens to each element
28
- (`rewrite`, `rewrite-and-reposition`, `fill-placeholder`, `replace`,
29
- `delete`, `keep`).
30
-
31
- 4. **Validate the plan** before building:
32
-
33
- ```bash
34
- "<python>" "<skill>/template_following_scripts/validate_template_plan.py" --plan frame-map.json
35
- ```
36
-
37
- It rejects unknown actions, out-of-range zones, new primitives without an
38
- explicit justification, and any attempt to edit a brand or chrome element.
39
-
40
- 5. **Build the starter deck**, then fill it:
41
-
42
- ```bash
43
- "<python>" "<skill>/template_following_scripts/prepare_template_starter_deck.py" --template brand.pptx --plan frame-map.json --out starter.pptx
44
- ```
45
-
46
- The starter deck contains only the slides you kept, in your order, with the
47
- placeholders filled. From there `container_tools/add_slides.py` and the
48
- recipes extend it.
49
-
50
- 6. **Check fidelity** against the source:
51
-
52
- ```bash
53
- "<python>" "<skill>/template_following_scripts/check_template_fidelity.py" --template brand.pptx --final starter.pptx --plan frame-map.json
54
- "<python>" "<skill>/container_tools/template_source_fidelity_gate.py" --template brand.pptx --final starter.pptx --requirements fidelity.json
55
- ```
56
-
57
- Both print JSON with a `passed` boolean. Leftover placeholders, drifted
58
- layout rects and opaque panels covering inherited artwork are failures, not
59
- style opinions.
10
+ Commands, JSON shapes and gate flags: [tasks/template-following.md](../tasks/template-following.md).
11
+ This file is the reasoning behind that procedure.
12
+
13
+ 1. **Inspect** with `inspect_template_deck.py`. It writes
14
+ `template-inspect.ndjson` (per slide: layout, placeholders with index, kind,
15
+ rect and text, background art) and `template-manifest.json` (slide size,
16
+ aspect, layout names, theme fonts, which slides carry full-bleed art).
17
+ 2. **Choose the families** you need — cover, section, content, table, chart,
18
+ closing. Take the *fewest* source slides that cover those roles.
19
+ 3. **Write the frame map**: a JSON plan naming, per output slide, the source
20
+ slide it duplicates and what happens to each element (`rewrite`,
21
+ `rewrite-and-reposition`, `fill-placeholder`, `replace`, `delete`, `keep`).
22
+ 4. **Validate** with `validate_template_plan.py`: it rejects unknown actions,
23
+ out-of-range zones, new primitives without an explicit justification, and any
24
+ attempt to edit a brand or chrome element.
25
+ 5. **Build** the starter deck with `prepare_template_starter_deck.py`: only the
26
+ slides you kept, in your order, with placeholders filled. Extend it with
27
+ `container_tools/add_slides.py` and the recipes.
28
+ 6. **Check fidelity** with `check_template_fidelity.py` and
29
+ `template_source_fidelity_gate.py`. Leftover placeholders, drifted layout rects
30
+ and opaque panels covering inherited artwork are failures, not style opinions.
60
31
 
61
32
  ## Reading a template's own geometry
62
33
 
63
34
  `container_tools/inspect_presentation_layout_geometry.py --input brand.pptx`
64
- prints every shape's rect in inches, which is what you address when a slide's
65
- placeholder needs a value that fits its frame.
35
+ prints every shape's rect in inches — what you address when a placeholder needs a
36
+ value that fits its frame.
66
37
 
67
38
  ## Rules
68
39
 
69
40
  - Placeholders keep their index; fill by index rather than adding a textbox on
70
41
  top of a placeholder.
71
- - Never restyle the master to match a screenshot you were given. If the brand
72
- colours are wrong, ask; guessing produces a deck the brand team rejects.
42
+ - Never restyle the master to match a screenshot. If the brand colours are wrong,
43
+ ask; guessing produces a deck the brand team rejects.
73
44
  - If the template has no suitable family for a slide (say, a two-column
74
- comparison), say which family you added and why, rather than silently
75
- inventing a look.
45
+ comparison), say which family you added and why rather than silently inventing
46
+ a look.
76
47
  - Keep the template's slide size. Changing it invalidates every inherited rect.
@@ -1,6 +1,6 @@
1
1
  # Handing a deck to Google Slides
2
2
 
3
- Google Slides imports `.pptx`, and mostly survives it. What it does not survive
3
+ Google Slides imports `.pptx` and mostly survives it. What it does not survive
4
4
  is worth designing around.
5
5
 
6
6
  ## What converts cleanly
@@ -25,10 +25,10 @@ is worth designing around.
25
25
 
26
26
  1. Build the deck as a normal `.pptx` — nothing Slides-specific is needed.
27
27
  2. Render and inspect the PNGs locally first; fix overflow before importing.
28
- 3. Upload to Drive, open with Google Slides, and check these in order: title
28
+ 3. Upload to Drive, open with Google Slides, and check in this order: title
29
29
  wrapping, bullet indentation, connector attachment, chart axes, notes.
30
- 4. If the deck will be edited by other people in Slides, keep shapes distinct
31
- and named (right-click → rename) so comments and edits are unambiguous.
30
+ 4. If others will edit the deck in Slides, keep shapes distinct and named
31
+ (right-click → rename) so comments and edits are unambiguous.
32
32
 
33
33
  ## Sharing
34
34
 
@@ -12,8 +12,8 @@ coordinates mean the same thing:
12
12
  "<python>" "<skill>/container_tools/render_slides.py" --input deck.pptx --out-dir preview
13
13
  ```
14
14
 
15
- Slide index = `page` in the payload, 1-based. Keep the PNGs — you will compare
16
- the same slide before and after.
15
+ Slide index = `page` in the payload, 1-based. Keep the PNGs to compare the same
16
+ slide before and after.
17
17
 
18
18
  ## 2. Resolve each annotation to shapes
19
19
 
@@ -26,17 +26,17 @@ width_in = region.width * slide_width_in
26
26
  height_in = region.height * slide_height_in
27
27
  ```
28
28
 
29
- Then select candidate shapes whose bounding box overlaps that rect, largest
30
- overlap first:
29
+ Select candidate shapes whose bounding box overlaps that rect, largest overlap
30
+ first:
31
31
 
32
32
  ```bash
33
33
  "<python>" "<skill>/container_tools/inspect_presentation_layout_geometry.py" --input deck.pptx --json-out geometry.json
34
34
  ```
35
35
 
36
- `geometry.json` lists every shape per slide with `left`, `top`, `width`,
37
- `height` in inches, plus its text. Two overlapping shapes (a title over a
38
- background panel) are common: use the annotation's `text` to disambiguate —
39
- match it against each candidate's text, and prefer an exact or prefix match.
36
+ `geometry.json` lists every shape per slide with `left`, `top`, `width`, `height`
37
+ in inches, plus its text. Overlapping shapes (a title over a background panel)
38
+ are common: use the annotation's `text` to disambiguate — prefer an exact or
39
+ prefix match.
40
40
 
41
41
  ## 3. Decide the smallest edit
42
42
 
@@ -66,18 +66,18 @@ Mutations go through this pack's tools (`replace_text.py`, `add_slides.py`,
66
66
  ## 5. Confirm, in words
67
67
 
68
68
  Open the same slide number and check the region now looks right. Report which
69
- shape you changed, what changed, and the slide number.
69
+ shape changed, what changed, and the slide number.
70
70
 
71
71
  ## When it cannot be mapped
72
72
 
73
- - Empty region, or no shape overlaps it → say that the region covers blank
74
- space and ask what object was meant.
73
+ - Empty region, or no shape overlaps it → say the region covers blank space and
74
+ ask what object was meant.
75
75
  - Overlapping candidates that `text` does not disambiguate → name both and ask.
76
- - The requirement is about something the file has no geometry for (a font that
77
- is not installed, a transition) → say so plainly.
76
+ - The requirement is about something the file has no geometry for (an uninstalled
77
+ font, a transition) → say so plainly.
78
78
  - The region covers a chart or table whose values would need to change → state
79
- that values come from the data, and ask for the corrected figures rather than
80
- editing the rendered numbers.
79
+ that values come from the data, and ask for corrected figures rather than
80
+ editing rendered numbers.
81
81
 
82
- Never guess silently. "I changed the title on slide 3; the region also touched
83
- the subtitle, which I left alone" is a good answer. Silence plus a diff is not.
82
+ Never guess silently. "I changed the title on slide 3; the region also touched the
83
+ subtitle, which I left alone" is a good answer. Silence plus a diff is not.