dsh-office-kit 0.4.1 → 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 (116) hide show
  1. package/assets/skills/excel-live-control/SKILL.md +120 -148
  2. package/assets/skills/excel-live-control/container_tools/live_excel.py +9 -0
  3. package/assets/skills/excel-live-control/domain_guidance/financial_models.md +42 -58
  4. package/assets/skills/excel-live-control/domain_guidance/healthcare.md +36 -42
  5. package/assets/skills/excel-live-control/domain_guidance/marketing_advertising.md +33 -34
  6. package/assets/skills/excel-live-control/domain_guidance/scientific_research.md +34 -36
  7. package/assets/skills/excel-live-control/references/office-automation.md +127 -153
  8. package/assets/skills/excel-live-control/references/read_only_qna.md +40 -45
  9. package/assets/skills/excel-live-control/style_guidelines.md +56 -64
  10. package/assets/skills/excel-live-control/workflows/create_workflows.md +40 -47
  11. package/assets/skills/excel-live-control/workflows/edit_workflows.md +37 -45
  12. package/assets/skills/office-documents/SKILL.md +24 -60
  13. package/assets/skills/office-documents/examples/end_to_end_smoke_test.md +5 -5
  14. package/assets/skills/office-documents/ooxml/comments.md +8 -8
  15. package/assets/skills/office-documents/ooxml/hyperlinks_and_fields.md +10 -10
  16. package/assets/skills/office-documents/ooxml/rels_and_content_types.md +7 -7
  17. package/assets/skills/office-documents/ooxml/tracked_changes.md +12 -12
  18. package/assets/skills/office-documents/references/docx-structure.md +11 -13
  19. package/assets/skills/office-documents/references/template-elicitation.md +11 -13
  20. package/assets/skills/office-documents/references/writing-quality.md +20 -20
  21. package/assets/skills/office-documents/tasks/accessibility_a11y.md +16 -22
  22. package/assets/skills/office-documents/tasks/captions_crossrefs.md +23 -26
  23. package/assets/skills/office-documents/tasks/clean_tracked_changes.md +17 -22
  24. package/assets/skills/office-documents/tasks/comments_manage.md +9 -11
  25. package/assets/skills/office-documents/tasks/compare_diff.md +10 -16
  26. package/assets/skills/office-documents/tasks/create_edit.md +14 -16
  27. package/assets/skills/office-documents/tasks/equations.md +17 -28
  28. package/assets/skills/office-documents/tasks/fields_update.md +14 -16
  29. package/assets/skills/office-documents/tasks/fixtures_edge_cases.md +19 -33
  30. package/assets/skills/office-documents/tasks/footnotes_endnotes.md +12 -14
  31. package/assets/skills/office-documents/tasks/forms_content_controls.md +16 -20
  32. package/assets/skills/office-documents/tasks/headings_numbering.md +17 -22
  33. package/assets/skills/office-documents/tasks/images_figures.md +15 -25
  34. package/assets/skills/office-documents/tasks/multi_doc_merge.md +13 -23
  35. package/assets/skills/office-documents/tasks/navigation_internal_links.md +18 -21
  36. package/assets/skills/office-documents/tasks/privacy_scrub_metadata.md +16 -22
  37. package/assets/skills/office-documents/tasks/protection_restrict_editing.md +19 -21
  38. package/assets/skills/office-documents/tasks/read_review.md +9 -20
  39. package/assets/skills/office-documents/tasks/redaction_anonymization.md +17 -18
  40. package/assets/skills/office-documents/tasks/sections_layout.md +16 -23
  41. package/assets/skills/office-documents/tasks/style_lint_normalize.md +18 -22
  42. package/assets/skills/office-documents/tasks/tables_spreadsheets.md +21 -31
  43. package/assets/skills/office-documents/tasks/templates_style_packs.md +17 -21
  44. package/assets/skills/office-documents/tasks/toc_workflow.md +10 -14
  45. package/assets/skills/office-documents/tasks/verify_render.md +11 -23
  46. package/assets/skills/office-documents/tasks/watermarks_background.md +11 -15
  47. package/assets/skills/office-documents/troubleshooting/libreoffice_headless.md +9 -9
  48. package/assets/skills/office-documents/troubleshooting/run_splitting.md +12 -12
  49. package/assets/skills/office-pdf/SKILL.md +36 -51
  50. package/assets/skills/office-pdf/references/form-fields.md +20 -20
  51. package/assets/skills/office-pdf/references/geometry.md +10 -10
  52. package/assets/skills/office-pdf/references/layout-quality.md +13 -13
  53. package/assets/skills/office-pdf/references/limits.md +12 -56
  54. package/assets/skills/office-pdf/tasks/annotations.md +5 -5
  55. package/assets/skills/office-pdf/tasks/create.md +6 -9
  56. package/assets/skills/office-pdf/tasks/edit-pages.md +14 -14
  57. package/assets/skills/office-pdf/tasks/forms.md +15 -15
  58. package/assets/skills/office-pdf/tasks/read.md +9 -9
  59. package/assets/skills/office-pdf/tasks/redact.md +18 -18
  60. package/assets/skills/office-pdf/tasks/stamp.md +10 -10
  61. package/assets/skills/office-presentations/SKILL.md +71 -91
  62. package/assets/skills/office-presentations/container_tools/render_slides.py +1 -1
  63. package/assets/skills/office-presentations/domain_guidance/finance.md +16 -16
  64. package/assets/skills/office-presentations/recipes/README.md +24 -35
  65. package/assets/skills/office-presentations/recipes/autolayout.md +12 -13
  66. package/assets/skills/office-presentations/recipes/connectors.md +11 -12
  67. package/assets/skills/office-presentations/recipes/images.md +11 -12
  68. package/assets/skills/office-presentations/recipes/master-and-layouts.md +18 -18
  69. package/assets/skills/office-presentations/recipes/native-charts.md +8 -8
  70. package/assets/skills/office-presentations/recipes/rich-text-runs.md +13 -13
  71. package/assets/skills/office-presentations/recipes/speaker-notes.md +7 -7
  72. package/assets/skills/office-presentations/recipes/tables.md +14 -14
  73. package/assets/skills/office-presentations/recipes/textbox-at-coordinate.md +9 -9
  74. package/assets/skills/office-presentations/recipes/theme-tokens.md +7 -8
  75. package/assets/skills/office-presentations/references/authoring-workflow.md +38 -43
  76. package/assets/skills/office-presentations/references/finalization.md +10 -12
  77. package/assets/skills/office-presentations/references/native-bullets.md +14 -18
  78. package/assets/skills/office-presentations/references/native-evidence.md +18 -32
  79. package/assets/skills/office-presentations/references/style-guidelines.md +27 -32
  80. package/assets/skills/office-presentations/references/templates.md +31 -60
  81. package/assets/skills/office-presentations/routing/google_slides.md +4 -4
  82. package/assets/skills/office-presentations/tasks/apply-annotations.md +17 -17
  83. package/assets/skills/office-presentations/tasks/charts-tables-notes.md +20 -23
  84. package/assets/skills/office-presentations/tasks/create-deck.md +19 -19
  85. package/assets/skills/office-presentations/tasks/edit-deck.md +14 -16
  86. package/assets/skills/office-presentations/tasks/inspect-and-verify.md +31 -34
  87. package/assets/skills/office-presentations/tasks/template-following.md +23 -28
  88. package/assets/skills/office-spreadsheets/SKILL.md +32 -39
  89. package/assets/skills/office-spreadsheets/recipes/charts.md +8 -26
  90. package/assets/skills/office-spreadsheets/recipes/conditional-formats.md +9 -26
  91. package/assets/skills/office-spreadsheets/recipes/data-tables.md +7 -23
  92. package/assets/skills/office-spreadsheets/recipes/named-ranges.md +8 -21
  93. package/assets/skills/office-spreadsheets/recipes/number-formats.md +7 -23
  94. package/assets/skills/office-spreadsheets/recipes/sparklines.md +7 -20
  95. package/assets/skills/office-spreadsheets/references/charts.md +15 -34
  96. package/assets/skills/office-spreadsheets/references/domain/financial-models.md +10 -25
  97. package/assets/skills/office-spreadsheets/references/domain/healthcare.md +8 -19
  98. package/assets/skills/office-spreadsheets/references/domain/marketing.md +8 -22
  99. package/assets/skills/office-spreadsheets/references/domain/research.md +8 -19
  100. package/assets/skills/office-spreadsheets/references/formula-patterns.md +20 -50
  101. package/assets/skills/office-spreadsheets/references/style-guidelines.md +19 -44
  102. package/assets/skills/office-spreadsheets/references/workbook-structure.md +12 -35
  103. package/assets/skills/office-spreadsheets/routing/google-sheets.md +11 -26
  104. package/assets/skills/office-spreadsheets/tasks/analyze-workbook.md +10 -25
  105. package/assets/skills/office-spreadsheets/tasks/annotations.md +12 -30
  106. package/assets/skills/office-spreadsheets/tasks/create-workbook.md +5 -5
  107. package/assets/skills/office-spreadsheets/tasks/diff-workbooks.md +2 -2
  108. package/assets/skills/office-spreadsheets/tasks/edit-workbook.md +5 -5
  109. package/assets/skills/office-spreadsheets/tasks/inspect-workbook.md +9 -9
  110. package/assets/skills/office-spreadsheets/tasks/recalc-and-check.md +10 -30
  111. package/assets/skills/shared/annotation-recipes.md +98 -120
  112. package/assets/skills/shared/common-workflow.md +70 -80
  113. package/dist/index.js +105 -29
  114. package/package.json +1 -1
  115. package/postinstall.mjs +58 -17
  116. package/python/office_cli.py +70 -7
@@ -1,58 +1,52 @@
1
1
  # Healthcare
2
2
 
3
- Two kinds of workbook live in a health organisation, and they carry different rules:
3
+ Health organisations run two workbook kinds:
4
4
 
5
- - **Clinical and patient records**: appointments, encounters, observations, results.
6
- The source of truth is a clinical system; a workbook holds an extract.
7
- - **Administrative and financial work**: budgets, staffing, throughput, cost per case.
8
- Money follows `financial_models.md` even when the organisation is a hospital.
5
+ - **Clinical and patient records** — appointments, encounters, observations, results. The
6
+ clinical system is the source of truth; a workbook holds an extract.
7
+ - **Administrative and financial work** — budgets, staffing, throughput, cost per case. Money
8
+ follows `financial_models.md`, hospitals included.
9
9
 
10
- Most healthcare spreadsheet tasks are the second kind built on top of the first. Keep the
11
- extract and the analysis visibly separate.
10
+ Most tasks are the second kind built on the first. Keep extract and analysis visibly apart.
12
11
 
13
12
  ## Handling the raw extract
14
13
 
15
- - Put raw data on its own sheet or block, untouched, one table. Everything you compute
16
- lives *beside* it or in a separate prepared block — never by overwriting a measurement.
17
- - Descriptive names help the next reader: `Appointments_RawData` beats `Sheet2`;
18
- `Clinic KPI Dashboard` beats `Sheet5`.
19
- - Keep the source's definitions with the data: the period it covers, the extract date, the
20
- source system, the denominator used. Length of stay, readmission rate and utilisation
21
- are meaningless without them, and definitions differ between systems.
22
- - Preserve identifiers exactly as supplied (MRN formats vary), and keep dates as dates with
23
- one format down the column.
24
- - Units belong in the header (`Weight (kg)`, `Temperature (°C)`, `HbA1c (%)`, `Heart rate
25
- (bpm)`), not in the cells as text. A column of `"72 bpm"` strings cannot be averaged.
14
+ - Keep raw data untouched on its own sheet or block, as one table; compute beside it or in a
15
+ separate prepared block. Never overwrite a measurement.
16
+ - Name descriptively: `Appointments_RawData` beats `Sheet2`; `Clinic KPI Dashboard` beats
17
+ `Sheet5`.
18
+ - Keep the source's definitions with the data: period covered, extract date, source system,
19
+ denominator. Length of stay, readmission rate and utilisation are meaningless without them,
20
+ and systems define them differently.
21
+ - Preserve identifiers exactly (MRN formats vary); dates as dates, one format down the column.
22
+ - Units in the header (`Weight (kg)`, `Temperature (°C)`, `HbA1c (%)`, `Heart rate (bpm)`),
23
+ never cell text — `"72 bpm"` strings cannot be averaged.
26
24
 
27
25
  ## Building on it
28
26
 
29
- - Highlight the fields staff must complete (amber fill) and keep unused placeholders out.
30
- - If a threshold drives a flag, use one named cell for it (`BMI_threshold`) and reference
31
- it, so the cut-off is visible and changeable. A number buried in a formula is an
32
- invisible policy.
33
- - Flags come only from a stated source or protocol threshold, and keep the severity the
34
- source gives (normal / elevated / high), with a legend on the sheet. Do not invent
35
- clinical ranges, do not round a borderline value into a category.
36
- - A codebook (code → meaning, units, abbreviations) next to the data when the extract uses
37
- codes, or a legend when it uses abbreviations.
38
- - Keep a `Corrected value` column or an audit log for corrections. Never edit the original
39
- measurement in place; the original and the correction are both evidence.
27
+ - Highlight fields staff must complete (amber fill); no unused placeholders.
28
+ - For a threshold-driven flag, name one cell (`BMI_threshold`) and reference it, so the
29
+ cut-off is visible and changeable.
30
+ - Flags only from a stated source or protocol threshold, with its severity (normal / elevated
31
+ / high) and a sheet legend. Never invent clinical ranges; never round a borderline value
32
+ into a category.
33
+ - Codebook (code → meaning, units, abbreviations) beside coded data; legend for
34
+ abbreviations.
35
+ - `Corrected value` column or audit log; never edit the original measurement in place —
36
+ original and correction are both evidence.
40
37
 
41
38
  ## Consequences of getting it wrong
42
39
 
43
- Clinical arithmetic and clinical judgement are different things. Compute what the source
44
- supports; verify a critical calculation (dosing, risk score, threshold classification)
45
- against the authoritative definition when one is available, and if it is not available say
46
- so instead of asserting the number is right. Do not give clinical advice, and do not
47
- present a screening flag as a diagnosis.
40
+ Clinical arithmetic is not clinical judgement. Compute what the source supports; check a
41
+ critical calculation (dosing, risk score, threshold classification) against the authoritative
42
+ definition, and say when none exists rather than asserting the number. No clinical advice; a
43
+ screening flag is not a diagnosis.
48
44
 
49
45
  ## Doing it live
50
46
 
51
- - The user may have the extract open with their own formatting. Read before writing:
52
- `info` for the sheets and used ranges, `read_range --formulas --display` for the block
53
- you are extending.
54
- - Add derived columns to the right of the raw block with a clear header, or to a separate
55
- prepared area; never insert a column into the middle of an extract that other formulas
56
- or a pivot already reference.
57
- - After writing, verify with `read_range --formulas` and check the `errors` array — a
58
- healthcare sheet with a `#DIV/0!` in a rate column is a report that will be misread.
47
+ - The extract may be open with the user's formatting. Read first: `info` for sheets and used
48
+ ranges; `read_range --formulas --display` for the block you will extend.
49
+ - Add derived columns right of the raw block with a clear header, or in a separate prepared
50
+ area; never insert a column into an extract that formulas or a pivot reference.
51
+ - After writing, verify with `read_range --formulas` and check `errors` — a `#DIV/0!` in a
52
+ rate column becomes a misread report.
@@ -1,53 +1,52 @@
1
1
  # Marketing and advertising
2
2
 
3
- Campaign, funnel, lead, CRM and ad-performance data. The failures here are almost always
4
- grain, denominator or freshness — not arithmetic.
3
+ Campaign, funnel, lead, CRM and ad-performance data. Failures here are grain, denominator or
4
+ freshness — rarely arithmetic.
5
5
 
6
6
  ## Know what the export is
7
7
 
8
- - **Extract freshness vs analysis time.** An export pulled Tuesday and analysed Friday is
9
- Tuesday's data. Record the extract date and the as-of date once, in the input area, and
10
- do not compare a Friday figure with a Tuesday one as if the difference were performance.
11
- - **Channel setup.** A campaign may be split across an ad platform, a CRM and a billing
12
- system. Name which one each figure comes from before combining them.
13
- - **Grain.** Daily rows are not campaign rows. Impressions are not sessions; clicks are not
8
+ - **Freshness**: an export pulled Tuesday and analysed Friday is Tuesday's data. Record the
9
+ extract date and as-of date in the input area; do not read a Friday-vs-Tuesday difference as
10
+ performance.
11
+ - **Channel setup**: a campaign may span an ad platform, a CRM and a billing system. Name the
12
+ source of each figure before combining them.
13
+ - **Grain**: daily rows are not campaign rows. Impressions are not sessions; clicks are not
14
14
  leads; leads are not qualified leads; a pipeline total is not revenue.
15
- - **Denominators.** CTR uses impressions, CVR uses sessions or clicks depending on the
16
- platform's definition, CPA uses conversions attributed that period. Carry the platform's
17
- definition into the label; two vendors' "conversion rate" differ.
15
+ - **Denominators**: CTR uses impressions; CVR uses sessions or clicks per the platform's
16
+ definition; CPA uses conversions attributed that period. Put the platform's definition in
17
+ the label — vendors' "conversion rate" differ.
18
18
 
19
19
  ## Layout
20
20
 
21
21
  - Name tabs by content and period: `Leads_Q1_2025`, `Pipeline Analysis`, `ROI Dashboard`.
22
- - Keep the raw import intact on its own sheet; clean in derived columns or a prepared
23
- area, and record what you excluded or mapped (non-target region, test account,
24
- renamed source) so the exclusion is visible.
22
+ - Keep the raw import intact on its own sheet; clean in derived columns or a prepared area,
23
+ and record exclusions and mappings (non-target region, test account, renamed source).
25
24
  - One typed time-series date column with one format. Add an ISO helper column only when a
26
- downstream import needs it, and label it as such.
25
+ downstream import needs it, labelled as such.
27
26
  - Targets and traffic lights only when the source supplies a target and a direction. No
28
- invented targets, no green/amber/red on numbers nobody set a goal for.
29
- - Every dashboard figure traces back to a cell in the prepared data. If a number cannot be
30
- traced, it does not go on the dashboard.
27
+ invented targets, no green/amber/red on goals nobody set.
28
+ - Every dashboard figure traces back to a cell in the prepared data; otherwise it does not go
29
+ on the dashboard.
31
30
 
32
31
  ## Metrics
33
32
 
34
- - Define abbreviations where they are used (CPC, CPM, CPA, ROAS, MQL) — a legend on the
35
- analysis sheet, not a glossary tab nobody opens.
36
- - Keep the comparison basis visible: week over week, month over month, or the same period
37
- last year. Mixing bases across one chart is the most common misleading dashboard.
38
- - Attribution: say which model (last click, first click, linear, platform-reported) and
39
- keep it consistent within a table. Platform-reported and analytics-reported conversions
40
- never reconcile exactly; report both rather than forcing a match.
41
- - Charts only when they make a trend, a comparison or a funnel clearer than a table. A
42
- chart of six categories is a table with extra steps.
33
+ - Define abbreviations where used (CPC, CPM, CPA, ROAS, MQL) — a legend on the analysis sheet,
34
+ not a glossary tab nobody opens.
35
+ - Keep the comparison basis visible: week over week, month over month, or same period last
36
+ year. Mixing bases in one chart is the most common misleading dashboard.
37
+ - Attribution: state the model (last click, first click, linear, platform-reported) and keep
38
+ it consistent within a table. Platform- and analytics-reported conversions never reconcile
39
+ exactly; report both.
40
+ - Charts only when they make a trend, comparison or funnel clearer than a table. Six
41
+ categories is a table with extra steps.
43
42
 
44
43
  ## Doing it live
45
44
 
46
- - Read first: `info` (which sheets, which used ranges, whether the user is mid-edit) then
45
+ - Read first: `info` (sheets, used ranges, whether the user is mid-edit), then
47
46
  `read_range --formulas` across the block you will extend.
48
- - Append new periods as rows below the existing table and extend the table/conditional
49
- formatting/chart source with it. Do not create a second table beside the first.
50
- - When a figure must be flagged for refresh (stale extract, missing platform), use the
51
- amber input fill and a note in the cell beside it, not a colour nobody explained.
52
- - Verify with `read_range --formulas`: this is where a misaligned denominator shows up as a
53
- rate that is off by a factor of ten.
47
+ - Append new periods as rows below the table and extend the table, conditional formatting and
48
+ chart source with them. No second table beside the first.
49
+ - For a refresh flag (stale extract, missing platform), use amber input fill plus a note in
50
+ the cell beside it, not an unexplained colour.
51
+ - Verify with `read_range --formulas`; a misaligned denominator surfaces as a rate off by a
52
+ factor of ten.
@@ -1,53 +1,51 @@
1
1
  # Scientific research data
2
2
 
3
- The spreadsheet is often the only record of an experiment. Treat the observations as
4
- irreplaceable: a cleaned value that overwrote a raw measurement is data loss, and a live
5
- edit is one keystroke away from it.
3
+ The spreadsheet is often the only record of an experiment. Treat observations as
4
+ irreplaceable: a cleaned value that overwrote a raw measurement is data loss, and a live edit
5
+ is one keystroke away.
6
6
 
7
7
  ## Keep the raw table raw
8
8
 
9
- - One flat table: one row per observation, one variable per column, one unit per column.
10
- No merged cells, no multi-row headers, no calculation rows mixed into the data block.
11
- - Do not overwrite a measurement. Transformations live in separate columns (clearly headed
12
- `log10(x)`, `normalised`) or in a separate processed block/sheet.
13
- - Record the cleaning: which rows were excluded and why, which values were imputed, which
14
- units were converted. A protocol note on the sheet or a short note beside the block.
15
- - Missing observations stay visibly missing (blank or `n.a.` as the table's convention
16
- dictates) — never silently zero-filled. Randomised and simulated values are labelled as
17
- such; they are not observations.
9
+ - One flat table: one row per observation, one variable per column, one unit per column. No
10
+ merged cells, no multi-row headers, no calculation rows inside the data block.
11
+ - Never overwrite a measurement. Transformations go in separate columns (headed `log10(x)`,
12
+ `normalised`) or a separate processed block or sheet.
13
+ - Record the cleaning: rows excluded and why, values imputed, units converted — in a protocol
14
+ note on or beside the sheet.
15
+ - Missing observations stay visibly missing (blank or `n.a.`, per the table's convention);
16
+ never zero-fill silently. Label randomised and simulated values as such — they are not
17
+ observations.
18
18
 
19
19
  ## Presentation tables are a different object
20
20
 
21
- When the sheet is a report of the data rather than the data itself:
21
+ When the sheet reports the data rather than holding it:
22
22
 
23
- - One type of data per column, units in the header (`Concentration (mg/L)`), never inside
24
- the cell.
23
+ - One type of data per column; units in the header (`Concentration (mg/L)`), never in the cell.
25
24
  - Never encode meaning only in colour or bold — add a labelled value column (`Flag:
26
- excluded`, `Status: control`). A reader with a monochrome printout must still get the
27
- full information.
28
- - Notes belong in a notes column, not in cell comments that a co-author will never see.
29
- - No merged cells in a table you expect anyone to sort or filter.
25
+ excluded`, `Status: control`). A monochrome printout must still carry the meaning.
26
+ - Notes belong in a notes column, not in cell comments a co-author will never see.
27
+ - No merged cells in a table anyone will sort or filter.
30
28
 
31
29
  ## Analysis
32
30
 
33
- - Prefer a transparent formula to a clever one. Someone has to defend this number in a
34
- review six months from now.
35
- - Show the calculation steps: the intermediate columns are the evidence. Hiding them in a
36
- single formula makes the result unfalsifiable.
37
- - A circular reference or iterative calculation is off-limits unless the user asks for it
38
- and documents it. A simulation's random seed and method are part of the result.
39
- - Distinguish measurement, derived value, flag and assumption — by label, not by font
40
- colour alone.
41
- - If the design of the analysis changes (an exclusion added, a normalisation changed), say
42
- so in the reply. A quiet change to a denominator rewrites the conclusion.
31
+ - A transparent formula beats a clever one; someone must defend the number in review six
32
+ months from now.
33
+ - Show the steps: intermediate columns are the evidence; one formula makes the result
34
+ unfalsifiable.
35
+ - Circular references and iterative calculation are off-limits unless the user asks and
36
+ documents it. A simulation's random seed and method are part of the result.
37
+ - Distinguish measurement, derived value, flag and assumption by label, not by font colour
38
+ alone.
39
+ - If the design changes (exclusion added, normalisation changed), say so in the reply. A
40
+ quiet denominator change rewrites the conclusion.
43
41
 
44
42
  ## Doing it live
45
43
 
46
44
  - Before touching anything: `info`, then `read_range --formulas --display` on the block.
47
- Raw data and report blocks are usually on different sheets; confirm which is which.
48
- - Append observations as rows at the bottom of the table, extend any table object to cover
49
- them, and keep the header row exactly as it is.
50
- - Verify with `read_range --formulas`; the `errors` array catches the `#DIV/0!` and
51
- `#VALUE!` that appear when a text value lands in a numeric column.
52
- - Never delete rows from the middle of a data table; a delete shifts every downstream
53
- formula and every chart range with it.
45
+ Raw data and report blocks usually sit on different sheets; confirm which is which.
46
+ - Append observations as bottom rows, extend any table object to cover them, leave the header
47
+ row untouched.
48
+ - Verify with `read_range --formulas`; the `errors` array catches the `#DIV/0!` and `#VALUE!`
49
+ that appear when text lands in a numeric column.
50
+ - Never delete rows from the middle of a data table; a delete shifts every downstream formula
51
+ and chart range.