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,9 +1,6 @@
1
1
  # Number formats
2
2
 
3
- A number format changes how a stored value is displayed, never the value. The
4
- cell keeps full precision; `0.0%` shows `6.4%` for `0.06398`. Never store a
5
- rounded number to make a column look tidy, and never store `"6.4%"` as text —
6
- it stops summing.
3
+ A number format changes how a stored value is displayed, never the value. The cell keeps full precision; `0.0%` shows `6.4%` for `0.06398`. Never store a rounded number to make a column look tidy, and never store `"6.4%"` as text — it stops summing.
7
4
 
8
5
  ```python
9
6
  import sys
@@ -42,31 +39,18 @@ wb.save(sys.argv[2])
42
39
  | Date | `yyyy-mm-dd` | Sortable, unambiguous; store a real date, not text |
43
40
  | Text passthrough | `@` | For codes and account numbers with leading zeros |
44
41
 
45
- Do not use `0,0%` or `#.##0`. They are not locale-independent and render
46
- differently on an engine that reads `,` as a decimal separator.
42
+ Do not use `0,0%` or `#.##0`. They are not locale-independent and render differently on an engine that reads `,` as a decimal separator.
47
43
 
48
44
  ## Signs, units, and scale
49
45
 
50
- - State the unit once, in the header or title (`Revenue (USD)`), and keep the
51
- stored value in that unit. A column that stores thousands but is headed
52
- "USD" is a defect waiting to be discovered.
53
- - If the presentation needs thousands (`$K`) while the data is in units,
54
- format does not divide — either store thousands and say so, or divide with a
55
- formula in a helper column. Never scale twice.
56
- - Percentages: store `0.064`, never `6.4`. A stored `6.4` formatted `0.0%`
57
- reads `640.0%`.
46
+ - State the unit once, in the header or title (`Revenue (USD)`), and keep the stored value in that unit. A column that stores thousands but is headed "USD" is a defect waiting to be discovered.
47
+ - If the presentation needs thousands (`$K`) while the data is in units, format does not divide — either store thousands and say so, or divide with a formula in a helper column. Never scale twice.
48
+ - Percentages: store `0.064`, never `6.4`. A stored `6.4` formatted `0.0%` reads `640.0%`.
58
49
 
59
50
  ## Widths and `###`
60
51
 
61
- `###` means the column is narrower than the formatted number. Widen that
62
- column (`ws.column_dimensions["B"].width = 14`) or shrink the font for the block.
63
- Never shorten the number, switch to text, or reduce decimals just to fit — and do
64
- not autofit every column in the sheet to fix one.
52
+ `###` means the column is narrower than the formatted number. Widen that column (`ws.column_dimensions["B"].width = 14`) or shrink the font for the block. Never shorten the number, switch to text, or reduce decimals just to fit — and do not autofit every column in the sheet to fix one.
65
53
 
66
54
  ## Dates
67
55
 
68
- Write a real date (`datetime.date(2026, 1, 31)`) and set `yyyy-mm-dd`. Storing
69
- an ISO string sorts alphabetically and calculates as text: `EDATE`, `SUMIFS` on
70
- dates, and `YEAR()` all fail silently or with `#VALUE!`. A date typed as a number
71
- of days since 1899-12-30 is a serial — fine for formulas, unreadable for people,
72
- so format it.
56
+ Write a real date (`datetime.date(2026, 1, 31)`) and set `yyyy-mm-dd`. An ISO string sorts alphabetically and calculates as text: `EDATE`, `SUMIFS` on dates, and `YEAR()` all fail silently or with `#VALUE!`. A date typed as a number of days since 1899-12-30 is a serial — fine for formulas, unreadable for people, so format it.
@@ -1,8 +1,6 @@
1
1
  # Sparklines and in-cell bars
2
2
 
3
- openpyxl writes no sparkline object (and neither does the helper CLI), so a
4
- "sparkline" here is one of two things: a formula that draws a bar inside the
5
- cell, or a tiny native chart. Pick by what the user needs to read.
3
+ openpyxl writes no sparkline object (and neither does the helper CLI), so a "sparkline" here is one of two things: a formula that draws a bar inside the cell, or a tiny native chart. Pick by what the user needs to read.
6
4
 
7
5
  ```python
8
6
  import sys
@@ -21,23 +19,12 @@ ws.row_dimensions[4].height = 14
21
19
  wb.save(sys.argv[2])
22
20
  ```
23
21
 
24
- - `REPT` needs a repeat count that fits the column. A 9-character column shows
25
- about 7 blocks at 9pt; anything longer spills into the neighbouring cell and
26
- the bars look like one continuous smear. Scale to the column width, not to 22.
27
- - Keep the count formula-driven (`value / MAX(values) * width`), so a changed
28
- number moves the bar.
29
- - The block character is text. Sorting the column sorts blocks, and a reader who
30
- copies the cell gets `████`, not a number — never put these in the column the
31
- numbers should be read from.
32
- - Guard blanks with `IF(cell="","",…)`, otherwise a blank reads as zero and every
33
- missing month draws a minimum bar.
34
- - A native in-cell chart is not the same as a chart object: if the user needs a
35
- hover tooltip, axis, or legend, build a real chart with `recipes/charts.md`
36
- instead of stretching a formula.
22
+ - `REPT` needs a repeat count that fits the column. A 9-character column shows about 7 blocks at 9pt; anything longer spills into the neighbouring cell and the bars look like one continuous smear. Scale to the column width, not to 22.
23
+ - Keep the count formula-driven (`value / MAX(values) * width`), so a changed number moves the bar.
24
+ - The block character is text. Sorting the column sorts blocks, and a reader who copies the cell gets `████`, not a number — never put these in the column the numbers should be read from.
25
+ - Guard blanks with `IF(cell="","",…)`, otherwise a blank reads as zero and every missing month draws a minimum bar.
26
+ - An in-cell native chart is not the same as a chart object: if the user needs a hover tooltip, axis, or legend, build a real chart with `recipes/charts.md` instead of stretching a formula.
37
27
 
38
28
  ## When a real chart is the right answer
39
29
 
40
- A sparkline is context for one number, in a dense table. If the sheet has space
41
- and the point is the trend itself, a small `LineChart` (height 4, width 9, no
42
- legend, no gridlines) reads better and stays editable. Two or three word-sized
43
- charts beat a wall of block characters.
30
+ A sparkline is context for one number, in a dense table. If the sheet has space and the point is the trend itself, a small `LineChart` (height 4, width 9, no legend, no gridlines) reads better and stays editable. Two or three word-sized charts beat a wall of block characters.
@@ -1,8 +1,6 @@
1
1
  # Chart choice and audit
2
2
 
3
- A chart earns its place when it makes a comparison, a trend, a distribution, or a
4
- relationship easier to see than a table would. If the reader only needs the
5
- figures, a compact table or a KPI tile is better — and cheaper to check.
3
+ A chart earns its place when it makes a comparison, a trend, a distribution, or a relationship easier to see than a table would. If the reader only needs the figures, a compact table or a KPI tile is better — and cheaper to check.
6
4
 
7
5
  | Question | Default | Notes |
8
6
  | --- | --- | --- |
@@ -16,48 +14,31 @@ figures, a compact table or a KPI tile is better — and cheaper to check.
16
14
 
17
15
  ## Honesty
18
16
 
19
- - Series must read from cells, not from typed arrays, and derived values must be
20
- formulas. A chart of pasted numbers drifts the moment the table updates.
21
- - Include zero on bar, column, and area axes. Narrowing a line or scatter axis is
22
- acceptable when the limits are stated; a truncated bar axis turns a 5% change
23
- into a dramatic cliff.
17
+ - Series must read from cells, not typed arrays, and derived values must be formulas. A chart of pasted numbers drifts the moment the table updates.
18
+ - Include zero on bar, column, and area axes. Narrowing a line or scatter axis is acceptable when the limits are stated; a truncated bar axis turns a 5% change into a dramatic cliff.
24
19
  - No 3-D, no shadows, no gradients. They occlude data and date the workbook.
25
- - One period, one baseline, one unit across comparable charts. Disclose omitted
26
- periods and missing values; do not let a blank read as zero.
27
- - Sort categories deliberately (by value, or by the natural order of time), and
28
- keep the same order across charts that will be compared.
20
+ - One period, one baseline, one unit across comparable charts. Disclose omitted periods and missing values; do not let a blank read as zero.
21
+ - Sort categories deliberately (by value, or by the natural order of time), and keep the same order across charts that will be compared.
29
22
 
30
23
  ## Formatting rules that catch reviewers' eyes
31
24
 
32
- - Title states subject and unit: `Profit by category ($m)`, `Monthly revenue
33
- (USD)`. No placeholder titles, no legend standing in for a title.
34
- - Units in the title or on the axis: `($K)`, `($M)`, `(USD thousands)`. Never
35
- `($000)`.
36
- - Axis number formats are set on the chart. Source cell formats do not carry over,
37
- and a `0.0%` column can still produce `0.06, 0.08` ticks.
38
- - Few series: direct labels. More series: legend above the plot area, consistent
39
- colours per series across the workbook.
40
- - Single series: no legend, one colour. A reference or target line is neutral or
41
- dashed so it does not read as another data series.
42
- - Selective data labels only — the last point, the maximum, the one the user asked
43
- about. Ten labels on a twelve-point line is a table with extra steps.
25
+ - Title states subject and unit: `Profit by category ($m)`, `Monthly revenue (USD)`. No placeholder titles, no legend standing in for a title.
26
+ - Units in the title or on the axis: `($K)`, `($M)`, `(USD thousands)`. Never `($000)`.
27
+ - Axis number formats are set on the chart. Source cell formats do not carry over, and a `0.0%` column can still produce `0.06, 0.08` ticks.
28
+ - Few series: direct labels. More series: legend above the plot area, consistent colours per series across the workbook.
29
+ - Single series: no legend, one colour. A reference or target line is neutral or dashed so it does not read as another data series.
30
+ - Selective data labels only — the last point, the maximum, the one the user asked about. Ten labels on a twelve-point line is a table with extra steps.
44
31
  - Line strokes are set explicitly; a fill alone may not colour an exported line.
45
32
 
46
33
  ## Placement
47
34
 
48
- Charts sit next to the data they describe, aligned to a column edge, over empty
49
- cells, and never over the data, the controls, or a note. Size them to their
50
- content; a chart stretched across the page with two bars in it looks unfinished.
35
+ Charts sit next to the data they describe, aligned to a column edge, over empty cells, and never over the data, the controls, or a note. Size them to their content; a chart stretched across the page with two bars looks unfinished.
51
36
 
52
37
  ## Verifying a chart
53
38
 
54
39
  1. Read the object back: type, anchor, series count, category source.
55
- 2. Render and look at the image: are there categories, is anything clipped, is the
56
- legend empty, do the bars reach the values in the table?
40
+ 2. Render and look at the image: are there categories, is anything clipped, is the legend empty, do the bars reach the values in the table?
57
41
  3. Compare the visual against the sheet's numbers at one or two points.
58
- 4. Re-open in the app the user will use if the colours matter — an authoring
59
- preview is not proof that a filled series exports as a visible line.
42
+ 4. Re-open in the app the user will use if the colours matter — an authoring preview is not proof that a filled series exports as a visible line.
60
43
 
61
- If the chart cannot be delivered as asked (the engine has no box plot, the data
62
- cannot be rearranged), say so and use the closest clear alternative. Never claim a
63
- requirement was met by a chart that does not show it.
44
+ If the chart cannot be delivered as asked (the engine has no box plot, the data cannot be rearranged), say so and use the closest clear alternative. Never claim a requirement was met by a chart that does not show it.
@@ -1,29 +1,15 @@
1
1
  # Financial models
2
2
 
3
- Applies to forecasts, budgets, cash-flow plans, and valuation work in any
4
- industry.
3
+ Forecasts, budgets, cash-flow plans, and valuation work in any industry.
5
4
 
6
- - Periods run left to right with the scale in the header (Actual, Forecast,
7
- Budget). Do not mix a monthly column with a quarterly total in the same row
8
- without a labelled total column at the edge.
9
- - Drivers first, results second: volume × price, headcount × cost, days × rate.
10
- A revenue row that jumps straight to a number cannot be reviewed.
11
- - Units are stated once and kept: thousands vs millions in the same block is the
12
- classic reconciliation failure. Put the unit in the title, not in a footnote.
13
- - Three statements or none: if the workbook includes a balance sheet and a cash
14
- flow, the balance sheet must balance and closing cash must equal the cash-flow
15
- ending balance. Add those as checks, not as comments.
16
- - Working capital moves: receivables from revenue × DSO, payables from cost × DPO,
17
- inventory from COGS × days. Hard-coded changes in working capital break when the
18
- drivers move.
19
- - Scenarios: one selector, one set of case inputs per driver, and an explicit
20
- `Case Selected:` on each output. A workbook with two switch cells reports two
21
- answers.
22
- - Never hard-code a total that already exists as a sum, and never sum a column that
23
- already contains a total (double counting is silent).
24
- - Sensitivity: one or two variables, closed-form or a small grid with the base case
25
- marked. A native What-If Data Table is a different object with its own limits —
26
- only build one when the user asks for it and the engine supports it.
5
+ - Periods run left to right with the scale in the header (Actual, Forecast, Budget). Do not mix a monthly column with a quarterly total in the same row unless a labelled total column sits at the edge.
6
+ - Drivers first, results second: volume × price, headcount × cost, days × rate. A revenue row that jumps straight to a number cannot be reviewed.
7
+ - State units once and keep them: thousands and millions in the same block is the classic reconciliation failure. Put the unit in the title, not a footnote.
8
+ - Three statements or none: if the workbook has a balance sheet and a cash flow, the balance sheet must balance and closing cash must equal the cash-flow ending balance. Make these checks, not comments.
9
+ - Working capital moves: receivables from revenue × DSO, payables from cost × DPO, inventory from COGS × days. Hard-coded working-capital changes break when drivers move.
10
+ - Scenarios: one selector, one set of case inputs per driver, and an explicit `Case Selected:` on each output. Two switch cells report two answers.
11
+ - Never hard-code a total that exists as a sum, and never sum a column that already holds a total — double counting is silent.
12
+ - Sensitivity: one or two variables, closed-form or a small grid with the base case marked. A native What-If Data Table is a different object with its own limits; build one only when the user asks and the engine supports it.
27
13
 
28
14
  ## Checks a finance reader looks for first
29
15
 
@@ -36,5 +22,4 @@ industry.
36
22
  | Case consistency | Every tab shows the same selected case |
37
23
  | No hard-coded totals | Total cells are formulas |
38
24
 
39
- Put them on a check tab, terminal and read-only, and make a failing check visually
40
- obvious without painting passing checks green.
25
+ Put them on a check tab, terminal and read-only. Make a failing check visually obvious without painting passing checks green.
@@ -1,22 +1,11 @@
1
1
  # Healthcare operations
2
2
 
3
- Workbooks here usually track volume, capacity, cost, and quality — not patients.
4
- Treat patient-level data as sensitive: do not paste identifiers into a workbook
5
- unless the user asks for it, do not copy rows from files you were shown into new
6
- sheets, and prefer aggregates.
3
+ Workbooks here usually track volume, capacity, cost, and quality — not patients. Treat patient-level data as sensitive: do not paste identifiers into a workbook unless the user asks, do not copy rows from files you were shown into new sheets, and prefer aggregates.
7
4
 
8
- - Name the denominator in every rate: per patient day, per discharge, per 1,000
9
- members, per available bed. A percentage without its base is not a metric.
10
- - Volume and capacity are different columns. Utilization is
11
- `used ÷ available`, and both sides need the same period and unit (bed-days, not
12
- beds).
13
- - Payer mix, service line, and site of care are separate dimensions. One table with
14
- a column per dimension beats four tables that must be read together.
15
- - Quality and safety metrics keep their own definitions; do not average a rate
16
- across sites without stating whether it is volume-weighted.
17
- - Claims and remittance data arrive with gaps. Show missing as blank or `n.a.`,
18
- never as zero, and state the coverage period.
19
- - Do not invent clinical thresholds, targets, or compliance claims. Use the
20
- targets the source file provides, and cite the sheet and cell.
21
- - Money and counts follow the finance conventions: units stated once, totals as
22
- formulas, checks that detail rows reconcile to the summary.
5
+ - Name the denominator in every rate: per patient day, per discharge, per 1,000 members, per available bed. A percentage without its base is not a metric.
6
+ - Volume and capacity are different columns. Utilization is `used ÷ available`, and both sides need the same period and unit (bed-days, not beds).
7
+ - Payer mix, service line, and site of care are separate dimensions. One table with a column per dimension beats four tables that must be read together.
8
+ - Quality and safety metrics keep their own definitions; do not average a rate across sites without stating whether it is volume-weighted.
9
+ - Claims and remittance data arrive with gaps. Show missing as blank or `n.a.`, never as zero, and state the coverage period.
10
+ - Do not invent clinical thresholds, targets, or compliance claims. Use the targets the source file provides, and cite the sheet and cell.
11
+ - Money and counts follow the finance conventions: units stated once, totals as formulas, checks that detail rows reconcile to the summary.
@@ -1,28 +1,14 @@
1
1
  # Marketing and advertising
2
2
 
3
- Campaign work is a funnel plus a spend table, and both are easy to make look
4
- better than they are.
3
+ Campaign work is a funnel plus a spend table, and both are easy to make look better than they are.
5
4
 
6
- - One row per campaign, channel, or creative — with that grain named in the header.
7
- Mixing a channel total into a campaign table double counts.
8
- - The funnel reads spend → impressions → clicks → conversions → revenue, in that
9
- order, with rates derived by formula: `CTR = clicks / impressions`,
10
- `CVR = conversions / clicks`, `CPA = spend / conversions`,
11
- `ROAS = revenue / spend`.
12
- - Never compute a ratio from cells that are not the same period and the same
13
- population. A monthly CTR built from a quarterly spend and a weekly click count
14
- is a number nobody can defend.
15
- - Attribution is a claim: say which model the numbers use (last click, platform
16
- reported, blended) and keep it constant across the table. Do not add platform
17
- conversions together and call it incremental revenue.
18
- - Missing spend or reach for a period is blank, not zero — a zero-spend month
19
- shows an infinite CPA and a fake collapse in the trend.
20
- - Benchmarks and targets belong in a labelled row or column with their source, not
21
- in a note the reader has to find.
5
+ - One row per campaign, channel, or creative, with that grain named in the header. Mixing a channel total into a campaign table double counts.
6
+ - The funnel reads spend → impressions → clicks → conversions → revenue in that order, with rates derived by formula: `CTR = clicks / impressions`, `CVR = conversions / clicks`, `CPA = spend / conversions`, `ROAS = revenue / spend`.
7
+ - Never compute a ratio from cells that are not the same period and the same population. A monthly CTR built from a quarterly spend and a weekly click count is a number nobody can defend.
8
+ - Attribution is a claim: say which model the numbers use (last click, platform reported, blended) and keep it constant across the table. Do not add platform conversions together and call it incremental revenue.
9
+ - Missing spend or reach for a period is blank, not zero — a zero-spend month shows an infinite CPA and a fake collapse in the trend.
10
+ - Benchmarks and targets belong in a labelled row or column with their source, not in a note the reader has to find.
22
11
 
23
12
  ## Charts for marketing
24
13
 
25
- Spend and return on the same chart only when both are in the same unit; otherwise
26
- two aligned charts. Sort channel bars by spend or by return — not alphabetically —
27
- and keep the same order across charts. A conversion trend belongs on a line chart
28
- with the campaign launch dates marked, not on a pie.
14
+ Put spend and return on one chart only when both use the same unit; otherwise two aligned charts. Sort channel bars by spend or by return, not alphabetically, and keep the same order across charts. A conversion trend belongs on a line chart with the campaign launch dates marked, not on a pie.
@@ -1,22 +1,11 @@
1
1
  # Scientific and research data
2
2
 
3
- The spreadsheet is usually a working copy of measurements, not the record of
4
- truth. Keep it that way: never edit raw measurements in place, and never let a
5
- formatted view replace the values behind it.
3
+ The spreadsheet is usually a working copy of measurements, not the record of truth. Keep it that way: never edit raw measurements in place, and never let a formatted view replace the values behind it.
6
4
 
7
- - Raw data on its own sheet, untouched, in columns whose headers carry the unit
8
- (`time (s)`, `temp (C)`, `conc (mg/L)`). Derived columns live on a build sheet
9
- and reference the raw cells.
10
- - One row per observation, one column per variable. Do not encode a variable in a
11
- colour, a note, or a header font.
12
- - Replicates are separate rows with a replicate id and a group id; the mean and
13
- standard deviation are formulas over those rows, never typed.
14
- - Keep the precision the instrument gives you and let the format hide extra
15
- decimals. Rounding stored values destroys the ability to recompute a mean.
16
- - Uncertainty, detection limits, and excluded points are stated in labelled cells.
17
- An excluded point stays in the data with a reason column — deleting it hides the
18
- decision.
19
- - Smoothing, binning, and unit conversion are formulas with visible inputs, or they
20
- do not exist. A trend line drawn over noisy points is not an analysis.
21
- - Distribution, trend, and relationship: choose the chart by the question, and
22
- check that the axis ranges and bins are stated (`references/charts.md`).
5
+ - Raw data on its own sheet, untouched, in columns whose headers carry the unit (`time (s)`, `temp (C)`, `conc (mg/L)`). Derived columns live on a build sheet and reference the raw cells.
6
+ - One row per observation, one column per variable. Do not encode a variable in a colour, a note, or a header font.
7
+ - Replicates are separate rows with a replicate id and a group id; mean and standard deviation are formulas over those rows, never typed.
8
+ - Keep the precision the instrument gives you and let the format hide extra decimals. Rounding stored values destroys the ability to recompute a mean.
9
+ - State uncertainty, detection limits, and excluded points in labelled cells. An excluded point stays in the data with a reason column — deleting it hides the decision.
10
+ - Smoothing, binning, and unit conversion are formulas with visible inputs, or they do not exist. A trend line drawn over noisy points is not an analysis.
11
+ - Distribution, trend, and relationship: choose the chart by the question, and check that axis ranges and bins are stated (`references/charts.md`).
@@ -1,7 +1,6 @@
1
1
  # Formula patterns
2
2
 
3
- Spreadsheet formulas are read by people who did not write them and recalculated
4
- by engines that disagree at the edges. Prefer the direct, boring form.
3
+ People who did not write a formula have to read it, and engines that disagree at the edges recalculate it. Prefer the direct, boring form.
5
4
 
6
5
  ## Anchoring
7
6
 
@@ -12,67 +11,38 @@ by engines that disagree at the edges. Prefer the direct, boring form.
12
11
  | `$A8` | right only | A column of item labels |
13
12
  | `$B$3` | never | One rate, a case selector, a fixed constant |
14
13
 
15
- `=SUMIFS(Amount,Month,C$4,Item,$A8)` reads the period from the header and the item
16
- from the label. `=C8*$B$3` multiplies by one fixed rate; `=C8*C$3` multiplies by
17
- the rate in that column. Getting this backwards is the most common silent error in
18
- a copied model — check one filled row and one filled column by hand.
14
+ `=SUMIFS(Amount,Month,C$4,Item,$A8)` reads the period from the header and the item from the label. `=C8*$B$3` multiplies by one fixed rate; `=C8*C$3` multiplies by the rate in that column. Getting this backwards is the most common silent error in a copied model — check one filled row and one filled column by hand.
19
15
 
20
16
  ## Aggregation
21
17
 
22
- - `SUM` for a column, `SUMIFS` for filtered totals, `COUNTIFS` for counts,
23
- `AVERAGEIFS` for averages.
24
- - Use `SUMIFS`/`COUNTIFS` even with one criterion; they read the same and extend
25
- cleanly.
26
- - `SUMPRODUCT(qty_range, rate_range)` for paired multiplication; it does not
27
- collapse to a single cell the way array arithmetic would.
28
- - `PRODUCT` for multiplied factors, but it skips blanks: a missing input silently
29
- removes a factor. Check the inputs before trusting the result.
30
- - `INDEX`/`MATCH`, `VLOOKUP(...,FALSE)`, or `XLOOKUP` — all fine. Keep the exact
31
- match flag explicit. A matched key is not a filled value: check the returned
32
- cell for blank as well as for the key existing.
33
- - Long category lists belong in a mapping table with a lookup, not in a nested
34
- `IF` chain.
18
+ - `SUM` for a column, `SUMIFS` for filtered totals, `COUNTIFS` for counts, `AVERAGEIFS` for averages.
19
+ - Use `SUMIFS`/`COUNTIFS` even with one criterion; they read the same and extend cleanly.
20
+ - `SUMPRODUCT(qty_range, rate_range)` for paired multiplication; it does not collapse to a single cell the way array arithmetic would.
21
+ - `PRODUCT` for multiplied factors, but it skips blanks: a missing input silently removes a factor. Check the inputs before trusting the result.
22
+ - `INDEX`/`MATCH`, `VLOOKUP(...,FALSE)`, or `XLOOKUP` — all fine. Keep the exact-match flag explicit. A matched key is not a filled value: check the returned cell for blank as well as for the key existing.
23
+ - Long category lists belong in a mapping table with a lookup, not in a nested `IF` chain.
35
24
 
36
25
  ## Dates and periods
37
26
 
38
- - Use the date the source gives; `TODAY()` only when the workbook should track
39
- today, and label it when it does.
27
+ - Use the date the source gives; `TODAY()` only when the workbook should track today, and label it when it does.
40
28
  - Store real dates with a date number format. Text dates do not calculate.
41
- - Derive period filters from one header row so a new month is a copy, not an edit:
42
- `=SUMIFS(Amount,Date,">="&C$4,Date,"<"&EDATE(C$4,1),Item,$A8)`.
43
- - Week starting on the first business day (Monday unless the business says
44
- otherwise); say which in the header.
45
- - Time scales run left to right coarse to fine: Annual, Quarterly, Monthly,
46
- Weekly — with narrow unfilled spacer columns, not merged headers over hidden
47
- helpers.
29
+ - Derive period filters from one header row so a new month is a copy, not an edit: `=SUMIFS(Amount,Date,">="&C$4,Date,"<"&EDATE(C$4,1),Item,$A8)`.
30
+ - Week starting on the first business day (Monday unless the business says otherwise); say which in the header.
31
+ - Time scales run left to right coarse to fine: Annual, Quarterly, Monthly, Weekly — with narrow unfilled spacer columns, not merged headers over hidden helpers.
48
32
 
49
33
  ## Missing data
50
34
 
51
- - A real zero is zero. A missing value is blank, or honestly `n.a.`/`N/A` where
52
- the reader expects text. Never substitute one for the other to make a chart look
53
- complete.
54
- - `IFERROR` only around a failure you understand, never wrapped around a whole
55
- block to hide it. `IFERROR(x,0)` turns a broken reference into a plausible zero.
56
- - Guards must not swallow the failure they guard against: `=IF(C8=0,"n.a.",B8/C8)`
57
- is a clear answer, `=IFERROR(B8/C8,0)` is a lie.
58
- - Missing keys in a lookup should show as missing (`=IFNA(...,"not found")`), not
59
- as zero.
35
+ - A real zero is zero. A missing value is blank, or honestly `n.a.`/`N/A` where the reader expects text. Never substitute one for the other to make a chart look complete.
36
+ - `IFERROR` only around a failure you understand, never around a whole block to hide it. `IFERROR(x,0)` turns a broken reference into a plausible zero.
37
+ - Guards must not swallow the failure they guard against: `=IF(C8=0,"n.a.",B8/C8)` is a clear answer, `=IFERROR(B8/C8,0)` is a lie.
38
+ - Missing keys in a lookup should show as missing (`=IFNA(...,"not found")`), not as zero.
60
39
 
61
40
  ## Things not to write
62
41
 
63
- - `LET`, dynamic arrays/spills, `MAP`, `REDUCE`, `LAMBDA`: the engines that read
64
- these files implement them unevenly, and openpyxl stores text without
65
- validating it.
66
- - `INDIRECT` for everything. It breaks traceability and does not update when a
67
- sheet is renamed. Keep it only where the existing file already relies on it.
68
- - Volatile functions (`TODAY`, `NOW`, `RAND`, `OFFSET`) in a calculation grid:
69
- every keystroke recalculates them, and the value changes when the file is
70
- reopened.
42
+ - `LET`, dynamic arrays/spills, `MAP`, `REDUCE`, `LAMBDA`: the engines that read these files implement them unevenly, and openpyxl stores text without validating it.
43
+ - `INDIRECT` for everything. It breaks traceability and does not update when a sheet is renamed. Keep it only where the existing file already relies on it.
44
+ - Volatile functions (`TODAY`, `NOW`, `RAND`, `OFFSET`) in a calculation grid: every keystroke recalculates them, and the value changes when the file is reopened.
71
45
 
72
46
  ## Circular references
73
47
 
74
- Avoid unintended cycles; Excel flags them for a reason. If a cycle is deliberate
75
- (interest on average balance, iterative allocation), document it in the sheet,
76
- confirm iteration is enabled, and verify the result converges to the expected
77
- number. A model that only "works" because the last recalc happened to stop at
78
- iteration 100 is not verified.
48
+ Avoid unintended cycles; Excel flags them for a reason. If a cycle is deliberate (interest on average balance, iterative allocation), document it in the sheet, confirm iteration is enabled, and verify the result converges to the expected number. A model that only "works" because the last recalc happened to stop at iteration 100 is not verified.
@@ -1,69 +1,44 @@
1
1
  # Style guidelines
2
2
 
3
- Precedence: the user's request, then the workbook or template being edited, then a
4
- domain convention, then these defaults. Defaults apply to new sheets, or to
5
- restyling the user asked for — never to a sheet you were not asked to touch.
3
+ Precedence: the user's request, then the workbook or template being edited, then a domain convention, then these defaults. Defaults apply to new sheets, or to restyling the user asked for — never to a sheet you were not asked to touch.
6
4
 
7
5
  ## Page furniture
8
6
 
9
- - One blank row at the top, then a short unfilled title, left aligned, in a size
10
- clearly larger than the body. No full-width filled banner.
7
+ - One blank row at the top, then a short unfilled title, left aligned, in a size clearly larger than the body. No full-width filled banner.
11
8
  - A thin rule under the title separates it from the table; nothing else.
12
- - Notes sit in ordinary cells to the right of the data, at least one blank column
13
- away from the last header fill, with wrap off.
9
+ - Notes sit in ordinary cells to the right of the data, at least one blank column away from the last header fill, with wrap off.
14
10
  - No footer blocks, no "Prepared by" furniture, no date stamps nobody asked for.
15
- - Gridlines off on new sheets. Do not change gridlines on a sheet you are editing
16
- for another reason.
11
+ - Gridlines off on new sheets. Do not change gridlines on a sheet you are editing for another reason.
17
12
 
18
13
  ## Structure
19
14
 
20
- - Freeze the header row of any table that scrolls, plus the identifying column(s)
21
- when horizontal scrolling hides them. Freeze the smallest useful area and never
22
- move content to make freezing convenient.
23
- - Header row: bold, centred horizontally and vertically, dark fill with white text
24
- or a light grey band, thin white separators between header cells.
25
- - Section bands: one continuous fill with a single outline around the block; no
26
- internal borders inside the band, no full-cell grid.
27
- - Spacer columns are genuinely empty (no values, no borders), not narrow columns
28
- of spaces.
29
- - Keep working titles, headers, and input areas unmerged. Center Across Selection
30
- gives the look of a merge without breaking sorting, filtering, and references.
15
+ - Freeze the header row of any table that scrolls, plus the identifying column(s) when horizontal scrolling hides them. Freeze the smallest useful area and never move content to make freezing convenient.
16
+ - Header row: bold, centred horizontally and vertically, dark fill with white text or a light grey band, thin white separators between header cells.
17
+ - Section bands: one continuous fill with a single outline around the block; no internal borders inside the band, no full-cell grid.
18
+ - Spacer columns are genuinely empty (no values, no borders), not narrow columns of spaces.
19
+ - Keep working titles, headers, and input areas unmerged. Center Across Selection gives the look of a merge without breaking sorting, filtering, and references.
31
20
 
32
21
  ## Numbers, inputs, calcs
33
22
 
34
23
  - Typed values with explicit number formats — see `recipes/number-formats.md`.
35
- - Left-align text, right-align numbers, centre headers, middle-align vertically;
36
- top-align long wrapped descriptions.
37
- - Distinguish inputs from calculations consistently: inputs get a light fill or a
38
- colour cue the sheet already uses, calculations stay white. Yellow/amber marks an
39
- input that still needs updating; keep that cue separate from calculated warnings.
40
- - When cases exist, show `Case Selected:` plus the linked value near the top of
41
- each output and build tab, in a restrained dashed outline, and highlight the
42
- active row in the driver table.
24
+ - Left-align text, right-align numbers, centre headers, middle-align vertically; top-align long wrapped descriptions.
25
+ - Distinguish inputs from calculations consistently: inputs get a light fill or a colour cue the sheet already uses, calculations stay white. Yellow/amber marks an input that still needs updating; keep that cue separate from calculated warnings.
26
+ - When cases exist, show `Case Selected:` plus the linked value near the top of each output and build tab, in a restrained dashed outline, and highlight the active row in the driver table.
43
27
  - Technical helper rows above a model are italic and grouped/collapsed.
44
28
 
45
29
  ## Conditional formatting as a cue
46
30
 
47
- - Bound the rule to the data, and use it for status, risk, variance, and
48
- exceptions — not decoration.
49
- - Critical errors: light red fill, bold dark red text. Valid checks stay neutral;
50
- no static green "PASS" paint over a range.
51
- - Reuse the sheet's existing rule style before inventing a new colour. Two similar
52
- reds in one workbook look like two different severities.
31
+ - Bound the rule to the data, and use it for status, risk, variance, and exceptions — not decoration.
32
+ - Critical errors: light red fill, bold dark red text. Valid checks stay neutral; no static green "PASS" paint over a range.
33
+ - Reuse the sheet's existing rule style before inventing a new colour. Two similar reds in one workbook look like two different severities.
53
34
 
54
35
  ## Typography
55
36
 
56
37
  - One family across the workbook: Helvetica Neue, Helvetica, Arial, then Aptos.
57
- - Two sizes at most (three counting the title). Largest size no more than six
58
- points above body. A 10pt body with an 11pt header and a 14pt title is enough.
59
- - Bold for headers and totals, italic for short context notes — never both on
60
- the same line, never on every row.
61
- - Tighten row heights after content fits; do not shrink the font to win an
62
- argument with a column width.
38
+ - Two sizes at most (three counting the title). Largest size no more than six points above body. A 10pt body with an 11pt header and a 14pt title is enough.
39
+ - Bold for headers and totals, italic for short context notes — never both on the same line, never on every row.
40
+ - Tighten row heights after content fits; do not shrink the font to win an argument with a column width.
63
41
 
64
42
  ## Tab colours
65
43
 
66
- Use colours only to help navigation: a darker brand tone on output tabs, one
67
- level lighter on assumptions, a distinct muted tone on a ReadMe, a divider tab
68
- coloured while its children stay plain. Financial Actuals tabs are traditionally
69
- light tan. Never recolour tabs during an unrelated edit.
44
+ Use colour only to help navigation: a darker brand tone on output tabs, one level lighter on assumptions, a distinct muted tone on a ReadMe, a divider tab coloured while its children stay plain. Financial Actuals tabs are traditionally light tan. Never recolour tabs during an unrelated edit.
@@ -1,9 +1,6 @@
1
1
  # Workbook structure
2
2
 
3
- Tab roles describe what a sheet *does*, not what tabs a workbook must have. A
4
- simple workbook can carry several roles as labelled blocks on one sheet; a large
5
- one separates them because the readers, the refresh cadence, or the audit trail
6
- differ.
3
+ Tab roles describe what a sheet *does*, not what tabs a workbook must have. A simple workbook can carry several roles as labelled blocks on one sheet; a large one separates them because the readers, the refresh cadence, or the audit trail differ.
7
4
 
8
5
  | Role | Holds | Feeds |
9
6
  | --- | --- | --- |
@@ -16,45 +13,25 @@ differ.
16
13
 
17
14
  Rules that keep a workbook readable a year later:
18
15
 
19
- - Inputs flow forward: source → build → output. A source tab never reads a
20
- downstream result back in; when it seems to, the value belongs on a build tab.
21
- - Builds show the steps: quantity × rate, capacity used ÷ capacity available,
22
- opening + movements = closing. One dense formula that jumps from input to final
23
- number cannot be reviewed and will be wrong the first time an input changes.
24
- - Outputs consolidate and roll up. They do not repeat a calculation that already
25
- exists on a build tab; they reference it.
26
- - Checks are terminal. Nothing depends on a check tab, and a passing check stays
27
- neutral — a wall of green PASS fills trains the reader to ignore the one red
28
- cell that matters.
29
- - Combine roles when the workbook is small. Three assumption cells do not need a
30
- Settings tab; a short labelled block beside the calculation is easier to audit.
31
- - Add a tab when the reader differs, the data grain differs, the refresh
32
- boundary differs, or the user asks. Not because a template had one.
16
+ - Inputs flow forward: source → build → output. A source tab never reads a downstream result back in; when it seems to, the value belongs on a build tab.
17
+ - Builds show the steps: quantity × rate, capacity used ÷ capacity available, opening + movements = closing. One dense formula that jumps from input to final number cannot be reviewed and will be wrong the first time an input changes.
18
+ - Outputs consolidate and roll up. They reference the calculation on the build tab; they do not repeat it.
19
+ - Checks are terminal. Nothing depends on a check tab, and a passing check stays neutral — a wall of green PASS fills trains the reader to ignore the one red cell that matters.
20
+ - Combine roles when the workbook is small. Three assumption cells do not need a Settings tab; a short labelled block beside the calculation is easier to audit.
21
+ - Add a tab when the reader differs, the data grain differs, the refresh boundary differs, or the user asks. Not because a template had one.
33
22
 
34
23
  ## Physical order
35
24
 
36
- For multi-tab workbooks, left to right: outputs, the assumption control panel
37
- (usually just after the primary output so a reader sees the switch), builds,
38
- then inputs and sources, with a divider tab such as `Internal >>` guarding the
39
- tail. The reader gets the answer first; the machinery lives to the right.
25
+ For multi-tab workbooks, left to right: outputs, the assumption control panel (usually just after the primary output so a reader sees the switch), builds, then inputs and sources, with a divider tab such as `Internal >>` guarding the tail. The reader gets the answer first; the machinery lives to the right.
40
26
 
41
- Separate schedules when inputs, grain, or owners differ (revenue vs cost bases,
42
- monthly vs weekly). A single mega-sheet that mixes both grains is where
43
- double-counting starts.
27
+ Separate schedules when inputs, grain, or owners differ (revenue vs cost bases, monthly vs weekly). A single mega-sheet that mixes both grains is where double-counting starts.
44
28
 
45
29
  ## Names
46
30
 
47
- Short, descriptive, and about the content: `Pipeline`, `Revenue build`,
48
- `Monthly forecast`. Not `Sheet3`, not `Data2`, not a sentence. A forecast review
49
- tab is `Forecast review`, `Forecast variance`, or `Sensitivity`; never `Movement`,
50
- which says nothing about what moved.
31
+ Short, descriptive, and about the content: `Pipeline`, `Revenue build`, `Monthly forecast`. Not `Sheet3`, not `Data2`, not a sentence. A forecast review tab is `Forecast review`, `Forecast variance`, or `Sensitivity`; never `Movement`, which says nothing about what moved.
51
32
 
52
- Divider tabs are labels, not data: `Inputs >>` with its children uncoloured reads
53
- as a section marker; a coloured tab on every sheet reads as noise.
33
+ Divider tabs are labels, not data: `Inputs >>` with its children uncoloured reads as a section marker; a coloured tab on every sheet reads as noise.
54
34
 
55
35
  ## The case selector
56
36
 
57
- When a workbook has cases, there is exactly one editable selector, on the cover
58
- or assumptions tab, with its current value shown as `Case Selected:` near the top
59
- of every output and build tab. Two selectors, or a selector plus hard-coded
60
- per-tab values, is how a model ends up reporting two different cases.
37
+ When a workbook has cases, there is exactly one editable selector, on the cover or assumptions tab, with its current value shown as `Case Selected:` near the top of every output and build tab. Two selectors, or a selector plus hard-coded per-tab values, is how a model ends up reporting two different cases.