Excel review — a second pair of eyes (taxonomy-driven)
What to do
- Run the script for precise, reproducible mechanical checks (openpyxl, no LibreOffice).
It needs
openpyxl — if the import fails, pip install openpyxl first:python3 scripts/check_excel.py <path/to/file.xlsx>
- Then review against the taxonomy below. The script is a floor, not a ceiling. Read each
sheet and reason through every class, using your general business/finance/spreadsheet knowledge.
Goal (per Panko 2008): be expansive — suggest issues to check, don't just confirm a fixed list.
The error taxonomy — your review framework (Panko–Halverson, revised 2008)
Work top-down. Each class has a different detection rate — the ones lowest for the human eye
(omission/lapses and qualitative) are where you must look hardest; that's where real value is added.
1. Violations vs Errors
- Violation — breaks a policy or compliance rule (even if the math is right): a banned/hardcoded
rate, a missing required control/disclaimer/sign-off, a regulated calc done off-standard.
You usually can't know client policy — flag "confirm against your standards."
- Error — inadvertent. Everything below.
2. Qualitative vs Quantitative
- Qualitative — the number is not wrong today, but the design is risky (latent). Often the most
dangerous because it survives review. Examples:
- Hardcoding / "jamming" — a constant buried in a formula (
=B2*0.10 instead of referencing a
rate cell); a number typed over a formula. Breaks silently on the next what-if or update.
- Poor structure — inputs mixed into calculations; no separation of assumptions.
- Ambiguous labeling / units — a result that can be misread (units not stated, unclear header)
→ an interpretation error downstream.
- Smells — magic numbers, overly long/nested formulas, volatile functions (NOW/TODAY/RAND),
undocumented colour-coding, a formula inconsistent with the rest of its row/column.
- Quantitative — a bottom-line value is actually wrong. Break it down by §3.
3. Quantitative errors: Mistakes / Slips / Lapses (Reason–Norman)
- Mistakes — the plan is wrong (wrong formula/algorithm). Sub-sources:
- Domain mistake — misunderstands the business rule (wrong margin definition, wrong tax/period
treatment). Generic red flags you CAN judge: a percentage > 100% where impossible, a discount >
price, a margin implausibly high/low, a negative where only non-negative makes sense.
- Logic / math mistake — ratio on the wrong base, double-counting / overlapping ranges, a stated
total ≠ sum of its parts, sign error, wrong order of operations, units mismatch (thousands vs
units, mixed currency).
- Software-use mistake — misusing a function: VLOOKUP approximate-match returning the wrong row,
a SUM/AVERAGE over the wrong range, AVERAGE silently including blanks/text, absolute/relative
reference drift after a copy, off-by-one ranges.
- Slips — sensory-motor, in execution (often leave visible artifacts → easier to catch):
mistyped number, transposed digits, wrong sign typed, a formula pointing at the wrong cell,
number stored as text.
- Lapses — memory overload → OMISSION (lowest detection rate — look hardest here):
a row / line / period dropped from a total (truncated SUM); an expected client / product / segment
absent; a required value left blank; a month missing from a series; a formula not extended to new
rows. Omission also includes a requirement left out of the model entirely — not visible as a cell,
only by asking "what should be here that isn't?"
4. Where to look — life-cycle lens
Different errors concentrate at different stages; when reviewing or modifying a file already in
operation, weight your attention there:
- Requirements / design — a wrong or incomplete rule baked in from the start.
- Cell entry — slips, mistyped constants.
- Draft / debugging — inconsistent formulas, broken refs (
#REF!) after inserts/deletes.
- Operation (most errors in live files): wrong data entered, bad imports (numbers as text),
formulas overwritten with constants, stale numbers, misread outputs. ← the modify/review case.
Also scan at multiple levels: cell → algorithm (a group of cells) → module → whole sheet →
the business system it feeds. Many errors come from losing sight of the broader flow, not the cell.
Generic vs client-specific
Use general knowledge to flag logic, omission, and qualitative issues without project rules. For
client-specific thresholds (exact bonus %, margin rate, segment bands, program conditions) do
not assert a verdict — defer to your domain skill (a separate, project-specific skill that
holds your exact rules) or ask the human, and flag "this looks off — confirm against your rules."
How to present (Verify)
Output a table: sheet · cell · class · confidence · materiality · what's wrong.
- Script (mechanical) findings → high confidence. Your reasoning findings → "confirm."
- class = the taxonomy bucket (violation / qualitative / mistake / slip / lapse-omission).
- materiality = how much it moves the bottom line, or whether a decision would change (rank the
big ones first; note tiny ones but don't drown the report).
- For each finding show the cell/formula and explain in plain words WHY it's suspicious — a clear
reason is what stops a real error from being dismissed (avoid the "warned-but-ignored" failure).
This is a second pair of eyes — the final call is the human's. Watch for false positives; when
unsure, ask rather than assert. Treat the list above as a starting frame: always ask "what else
could be wrong here that isn't on it?"
Framework: Panko, "Revisiting the Panko–Halverson Taxonomy of Spreadsheet Errors" (EuSpRIG 2008);
Reason, "Human Error" (1990); Rajalingham (2005); Powell, Lawson & Baker (2007).
1---2name: excel-hygiene3description: A rigorous "second pair of eyes" on any xlsx before it goes out. Runs a deterministic script for precise MECHANICAL checks (numbers as text, hardcoded-over-formula, cell errors, truncated SUM, percent as whole number), then reasons across the full spreadsheet-error taxonomy (Panko 2008: violations vs errors; qualitative vs quantitative; mistakes / slips / lapses; life-cycle) using general business and spreadsheet knowledge. Use for calcs, offers, mediaplans, budgets, any table. Client-specific thresholds (exact rates, margins, segment bands) belong to a domain skill.4license: Apache-2.05---67# Excel review — a second pair of eyes (taxonomy-driven)89## What to do101. **Run the script** for precise, reproducible **mechanical** checks (openpyxl, no LibreOffice).11 It needs `openpyxl` — if the import fails, `pip install openpyxl` first:12 ```13 python3 scripts/check_excel.py <path/to/file.xlsx>14 ```152. **Then review against the taxonomy below.** The script is a **floor, not a ceiling.** Read each16 sheet and reason through every class, using your general business/finance/spreadsheet knowledge.17 Goal (per Panko 2008): be **expansive — suggest issues to check, don't just confirm a fixed list.**1819## The error taxonomy — your review framework (Panko–Halverson, revised 2008)20Work top-down. Each class has a different **detection rate** — the ones lowest for the human eye21(omission/lapses and qualitative) are where you must look hardest; that's where real value is added.2223### 1. Violations vs Errors24- **Violation** — breaks a policy or compliance rule (even if the math is right): a banned/hardcoded25 rate, a missing required control/disclaimer/sign-off, a regulated calc done off-standard.26 *You usually can't know client policy — flag "confirm against your standards."*27- **Error** — inadvertent. Everything below.2829### 2. Qualitative vs Quantitative30- **Qualitative** — the number is *not* wrong today, but the design is risky (latent). Often the most31 dangerous because it survives review. Examples:32 - **Hardcoding / "jamming"** — a constant buried in a formula (`=B2*0.10` instead of referencing a33 rate cell); a number typed over a formula. Breaks silently on the next what-if or update.34 - **Poor structure** — inputs mixed into calculations; no separation of assumptions.35 - **Ambiguous labeling / units** — a result that can be *misread* (units not stated, unclear header)36 → an interpretation error downstream.37 - **Smells** — magic numbers, overly long/nested formulas, volatile functions (NOW/TODAY/RAND),38 undocumented colour-coding, a formula inconsistent with the rest of its row/column.39- **Quantitative** — a bottom-line value is actually wrong. Break it down by §3.4041### 3. Quantitative errors: Mistakes / Slips / Lapses (Reason–Norman)42- **Mistakes — the plan is wrong** (wrong formula/algorithm). Sub-sources:43 - *Domain mistake* — misunderstands the business rule (wrong margin definition, wrong tax/period44 treatment). Generic red flags you CAN judge: a percentage > 100% where impossible, a discount >45 price, a margin implausibly high/low, a negative where only non-negative makes sense.46 - *Logic / math mistake* — ratio on the wrong base, double-counting / overlapping ranges, a stated47 total ≠ sum of its parts, sign error, wrong order of operations, units mismatch (thousands vs48 units, mixed currency).49 - *Software-use mistake* — misusing a function: VLOOKUP approximate-match returning the wrong row,50 a SUM/AVERAGE over the wrong range, AVERAGE silently including blanks/text, absolute/relative51 reference drift after a copy, off-by-one ranges.52- **Slips — sensory-motor, in execution** (often leave visible artifacts → easier to catch):53 mistyped number, transposed digits, wrong sign typed, a formula pointing at the wrong cell,54 number stored as text.55- **Lapses — memory overload → OMISSION** (lowest detection rate — look hardest here):56 a row / line / period dropped from a total (truncated SUM); an expected client / product / segment57 absent; a required value left blank; a month missing from a series; a formula not extended to new58 rows. *Omission also includes a requirement left out of the model entirely — not visible as a cell,59 only by asking "what should be here that isn't?"*6061### 4. Where to look — life-cycle lens62Different errors concentrate at different stages; when reviewing or modifying a file already **in63operation**, weight your attention there:64- *Requirements / design* — a wrong or incomplete rule baked in from the start.65- *Cell entry* — slips, mistyped constants.66- *Draft / debugging* — inconsistent formulas, broken refs (`#REF!`) after inserts/deletes.67- **Operation (most errors in live files):** wrong data entered, bad imports (numbers as text),68 **formulas overwritten with constants**, stale numbers, **misread outputs**. ← the modify/review case.6970Also scan at multiple **levels**: cell → algorithm (a group of cells) → module → whole sheet →71the business system it feeds. Many errors come from losing sight of the broader flow, not the cell.7273## Generic vs client-specific74Use general knowledge to flag **logic, omission, and qualitative** issues without project rules. For75**client-specific thresholds** (exact bonus %, margin rate, segment bands, program conditions) do76**not** assert a verdict — defer to your **domain skill** (a separate, project-specific skill that77holds your exact rules) or ask the human, and flag *"this looks off — confirm against your rules."*7879## How to present (Verify)80Output a table: `sheet · cell · class · confidence · materiality · what's wrong`.81- **Script (mechanical) findings → high confidence.** Your reasoning findings → **"confirm."**82- **class** = the taxonomy bucket (violation / qualitative / mistake / slip / lapse-omission).83- **materiality** = how much it moves the bottom line, or whether a decision would change (rank the84 big ones first; note tiny ones but don't drown the report).85- For each finding **show the cell/formula and explain in plain words WHY** it's suspicious — a clear86 reason is what stops a real error from being dismissed (avoid the "warned-but-ignored" failure).8788This is a **second pair of eyes** — the final call is the human's. Watch for false positives; when89unsure, ask rather than assert. Treat the list above as a starting frame: always ask **"what else90could be wrong here that isn't on it?"**9192---93*Framework: Panko, "Revisiting the Panko–Halverson Taxonomy of Spreadsheet Errors" (EuSpRIG 2008);94Reason, "Human Error" (1990); Rajalingham (2005); Powell, Lawson & Baker (2007).*