The file on the shared drive is kit_margins_v2.xlsx. Six tabs: SKUs, Costs, Tax, Promo, Margin, Deck. SKU KIT-214 lists at $48.00. Unit cost is $22.50. The Margin tab says 53.1%. Finance opens Tax at 10:41 a.m. The $48.00 already includes 8.4% sales tax. Pre-tax list is $44.28. Real margin is 49.2%. The deck went to the vendor on Tuesday.
This is Part 19 of the Grok series. Grok Build can try spreadsheet work and web research. Launch posts for Grok 4.5 and 4.6 talk about Excel, Word, and PowerPoint help. Treat that as “it can try.” You still own every formula and every citation. If you only needed a sentence in a README, you are in the wrong part. Start from the four surfaces or the project loop in Part 17.
Feature names and office add-ins move. Re-check the Grok 4.5 post and Grok 4.6 notes the week you let an agent touch a workbook that Finance will forward.
Why workbooks hide wrong formulas behind tidy tabs
- Why workbooks hide wrong formulas behind tidy tabs
- A safe first sheet task: one grain, one formula, one check tab
- How to use Build for research without pasting a rumor into Slack
- What to do with notes and leftover files the agent drops in the folder
- A toy margin model in Python you can rerun when the xlsx looks “done”
Why sheets are a trap
A coding agent likes files it can rewrite. A workbook is a pile of files wearing one icon. Six tabs means six chances to define “price.” SKUs has list price. Tax has a rate. Promo has a discount. Margin divides something by something. Deck copies a number as a picture of confidence. Nobody names the grain. Is $48.00 the sticker a customer sees, or the pre-tax wholesale number Purchasing uses?
In the KIT-214 mess, both numbers sat in the file. The agent built Margin first because you said “build a margin workbook.” It grabbed the largest money column on SKUs. That column included tax. Dividing by a tax-in price makes margin look healthier by about the tax rate. 8.4 points of tax became 8.4 points of fake comfort. The Deck tab rounded 53.1% to “about 53%” and the vendor smiled.

Text in a .py file is reviewable in git diff. A formula buried in row 84 of Margin is reviewable only if you click it. Agents do not always leave a comment on the cell. They also invent helper tabs named “Notes” that restate the wrong definition in friendlier English. A restated wrong definition is still wrong.
Merged cells, hidden columns, and a frozen header make it worse. The agent can “see” values and still miss that Promo already netted tax out. You asked for speed. You received a consistent story across six tabs, all pointed at the wrong denominator.
A safe sheet task
Give Build a sheet job that would fit on a whiteboard. One grain. One formula written in words. One output tab. One check you can run without Excel if you have to.
A prompt that stays small:
Create a toy workbook with two tabs only: Inputs and Margin.
Inputs columns: sku, list_price_tax_in, tax_rate, unit_cost.
Grain: one row is one kit SKU.
Formula in words: pre_tax = list_price_tax_in / (1 + tax_rate).
margin_pct = (pre_tax - unit_cost) / pre_tax.
Do not add a Deck tab.
Do not invent promo logic.
Write the formula in a cell comment and in README.md.
Stop after I can rerun the three SKUs in Python.Notice the forbids. Deck tabs exist to present. Presenting is how a wrong 53.1% leaves the building. Promo logic is a second project. If you need promo later, open a second session after Inputs and Margin match a hand calc for KIT-214.
Stay in the TUI on ask/watch. Plan mode first if the agent starts talking about “a full planning model.” You asked for two tabs. A full planning model is how you get six tabs again.
If your company already has Grok in Excel as an add-in, that is a different door from Grok Build in a folder. Add-ins sit inside a file you already have open. Build will happily create a new xlsx next to your repo and a Python twin that disagrees with it. Pick one artifact as source of truth. For teaching, the Python twin is easier to check. For a live Finance file, work on a copy, not on kit_margins_v2.xlsx in the shared drive.
Research with sources you open
The same morning often includes a research ask. “What tax rate does this county use?” “Did the scanner vendor change the date contract?” Build can search. Chat can search. Neither is a filing cabinet. Treat every link as a lead.
Ask for sources in the prompt. Then open them. Check the date on the page, the version label, and whether the number is a list price or a tax-in shelf price. If the agent cites a blog from 2024 for a 2026 county rate, throw the number out. Part 13 of this series is the everyday version of that habit. The Build version is the same habit plus a file that will outlive the chat.
A research prompt that stays honest:
Find the official page for sales tax in this county.
Paste the URL. Quote the rate and the date on the page.
Do not write the rate into the workbook until I say the page matches.
If you cannot open a primary page, say so and stop.If you already know the rate is 8.4% because Tax tab came from Finance, do not ask the model to “confirm.” It will confirm. It is agreeable. Type the rate yourself and leave a cell note: “Finance Tax tab, 2026-08-11.” That note will matter in December when someone asks why Margin moved.

Stickies and notes the model leaves
Agents leave debris. You will find NOTES.md, plan.md, a second xlsx, a CSV “for debug,” and a comment that says “assumed tax is already removed.” Those files feel like documentation. They are often a diary of the wrong assumption.
After a sheet session:
- Open every new file
git statusshows. Delete the ones you did not ask for - If a note disagrees with the cell formula, the cell wins only after you hand-calc. Then fix the note or delete it
- Do not commit
Deck_final.xlsxbecause it looks finished. Commit Inputs, Margin, and the Python check - If the agent wrote “verified against official docs” and there is no URL, treat that sentence as empty
House rules in AGENTS.md help here. Add a line: “Do not add Notes or Deck tabs unless I ask. Do not write ‘verified’ without a URL I can open.” Part 18 is the house-rules chapter. This is why that one line exists.
Worked mini model: toy margins
Three kits. Same 8.4% tax-in mistake on the first formula. Same fix on the second. Run this even if the xlsx already “looks right.”
rows = [
{"sku": "KIT-214", "list_price_tax_in": 48.00, "tax_rate": 0.084, "unit_cost": 22.50},
{"sku": "KIT-088", "list_price_tax_in": 36.00, "tax_rate": 0.084, "unit_cost": 19.00},
{"sku": "KIT-301", "list_price_tax_in": 60.00, "tax_rate": 0.084, "unit_cost": 28.75},
]
print("sku, wrong_margin_pct, right_margin_pct, pre_tax")
for r in rows:
wrong = (r["list_price_tax_in"] - r["unit_cost"]) / r["list_price_tax_in"]
pre_tax = r["list_price_tax_in"] / (1 + r["tax_rate"])
right = (pre_tax - r["unit_cost"]) / pre_tax
print(
f"{r['sku']}, {wrong * 100:.1f}, {right * 100:.1f}, {pre_tax:.2f}"
)What that code prints (toy numbers, not a market study):
| sku | wrong margin % | right margin % | pre-tax list |
|---|---|---|---|
| KIT-214 | 53.1 | 49.2 | 44.28 |
| KIT-088 | 47.2 | 42.8 | 33.21 |
| KIT-301 | 52.1 | 48.1 | 55.35 |
Hand check for KIT-214: 48.00 / 1.084 = 44.28. (44.28 − 22.50) / 44.28 = 0.492. If your Margin tab does not show 49.2% for that row, the workbook is still the Tuesday file, whatever the tab is named.
A second check table you can keep next to the sheet:
| Check | How |
|---|---|
| Grain | Say out loud: one row is one kit SKU |
| Tax-in vs pre-tax | Hand-divide list by (1 + rate) for one SKU |
| Denominator | Margin uses pre-tax list, not tax-in, not cost |
| Promo | Absent until Inputs and Margin already match |
| Citation | Rate comes from a named tab or a URL you opened |
| Debris | git status shows only files you asked for |
If Build writes an xlsx, rerun the Python. If the two disagree, believe neither until the hand calc lands. Then fix the one you will keep and delete the other. Two sources of truth is how 53.1% and 49.2% both survive into next quarter.
Sheets hide the formula
| Mistake | What you get | Fix |
|---|---|---|
| “Build a full workbook” | Six tabs, one wrong denominator | Two tabs. Formula in words first |
| Tax-in list as revenue | Margin high by about the tax rate | Divide out tax. Hand-calc one SKU |
| Agent “confirms” a rate | A confident sentence, stale page | Open the URL. Type the rate yourself |
| Keep the Deck tab | Wrong % becomes a vendor slide | No Deck until Margin matches Python |
| Commit NOTES.md blindly | Wrong assumption looks official | Delete debris or rewrite after the check |
Sheets hide the formula (carefully)
Copy the three-row Python into the sandbox. Run it. Then ask Build for the two-tab workbook only. Do not send it the Tuesday xlsx. When both match 49.2% for KIT-214, stop. If you want the agent to read a county tax page, do that in a second session and paste the URL into the Inputs tab yourself.
Next is Grok Build review, rollback, and safety rails. That part is git, autonomy, secrets, and what happens when headless grok -p treats “clean unused files” as a delete order. Index: Grok series.
Sheets hide the formula 3
- Sheets hide the formula. Write the grain and the math in words before any tab exists
- Tax-in list price is a different number than pre-tax list. Margin cares
- Research links are leads. Open them. Do not let the agent stamp “verified”
- Rerun a tiny Python check. Delete Deck and Notes until the numbers match
- Office features can try. You still own the cell Finance will forward
Sources
Research and further reading used for this article:
- xAI: Grok 4.5 (office-style claims; treat as “it can try”)
- xAI docs: Grok 4.6 (current Build-era model notes)
- xAI docs: Grok Build overview (folder agent, headless
grok -p) - xAI: Introducing Grok Build (plan mode and review-before-execute)
- xAI: Grok Build (product home)
- Analytics Made Simple: Learn (related tutorials)
Keep going
Same lessons in your feed
Short diagrams and hooks on Instagram, X, and Facebook.
