GrepBoard/Manuals
84 manuals ·

Replace a generic SWOT with assumptions you can test

·updated ·claude-sonnet-5-5 · run 2026-10-20 (ChatGPT could not be run, so Claude was used)·6 steps

An AI SWOT mixes in lines that fit any business. Get six assumption questions that quote your plan, each with a check, and verify the quotes by script.

Ask for "a SWOT analysis" and every box gets filled. Then someone in the meeting asks "how would we check that?" and there is no answer. Here is the same plan run two ways.

[1] The input is a made-up plan for a side dish subscription. It has numbers because a question can only attach to the plan if the plan has something to attach to.

plan.en.txt
[Business plan summary] Weekly home-style side dish subscription (working title)1. Target customers: dual-income households aged 30-40 living in apartment complexes in the southeast part of the city. They want to spend less time on weekday dinner prep.2. Product: five side dishes (1-2 servings each) delivered chilled every Thursday. Subscription price is $24 per week.3. Delivery radius: only areas within a 30-minute drive of our own kitchen. Two contract drivers handle delivery.4. Demand: 120 subscribing households in month one, then growth of 20% per month.5. Retention: we expect 70% of households that sign up to still be subscribed after three months.6. Costs: ingredients are 38% of revenue per order; delivery is budgeted at $3 per order.7. Schedule: start at three pilot complexes next quarter.

[2] Start with the short request: "Do a SWOT analysis of the business plan below." followed by the plan. An excerpt of the answer:

output
## Weaknesses- **Contribution margin is overstated.** Costs omit labor, packaging (chilled, food-safe), kitchen rent and utilities, payment fees, waste and spoilage, marketing and customer acquisition. …- **Delivery capacity.** Two drivers and one delivery day (Thursday) cap volume. At 20% monthly growth you would have roughly 890 households by month 12, which two drivers likely can't serve in one evening window.…## Threats- **Competition.** Meal-kit services, delivery apps, supermarket prepared food, convenience-store meals and local banchan or side dish shops.- **Food safety and regulation.** Chilled prepared food needs licensing, cold-chain compliance and allergen labeling. One incident could damage the brand.

The weaknesses are better than expected: several point at the plan's own numbers. The threats are not. "Competition" and "Food safety" fit any food plan, and no item says which sentence it came from or what result would prove it wrong.

[3] Change the shape. Ban the SWOT, ask for "what has to be true for this plan to work" as questions, and fix the columns to a source sentence, a way to check, and a break threshold. The plan goes inside <plan> tags because the model knows nothing about this kitchen's numbers. That follows the Gemini API prompting guide: put the context the model needs into the prompt instead of assuming it knows.

head.en.txt
Review the business plan inside <plan>. Do not write a SWOT. Instead, pull out the assumptions that must be true for this plan to succeed, as questions. Rules:- Exactly 6 questions. Each must touch a number or condition that is in this plan. Do not use questions that fit any business (brand awareness, increased competition, and so on).- Output a Markdown table with exactly these columns: No. | Question | Source sentence | How to check | Break threshold- Source sentence is one span copied character for character from the plan (do not summarize or edit it).- How to check is one concrete action: a dataset to pull or an experiment to run. Break threshold states, as a number, what result would show the assumption is wrong.- Do not invent numbers that are not in the plan. If one is needed, write "not in the plan".- Output only the table, no other text. <plan>

[4] Append the plan and the closing tag, then run it.

console
$ (cat head.en.txt plan.en.txt; echo "</plan>") > prompt.en.txt$ claude -p --model claude-sonnet-5-5 --max-turns 1 --tools "" --setting-sources "" --strict-mcp-config < prompt.en.txt > out.en.1.txt

Row 5 of 6 from the first run:

output
| No. | Question | Source sentence | How to check | Break threshold ||---|---|---|---|---|…| 5 | Do actual ingredient and delivery costs stay within 38% of revenue and $3 per order? | ingredients are 38% of revenue per order; delivery is budgeted at $3 per order. | Cook and cost five test boxes from real supplier invoices, and divide the contract drivers' quoted fees by the stops per route in a route simulation. | Ingredient cost above 38% of $24 (about $9.12) per box, or delivery cost above $3 per order. |

Recompute the threshold: 24 × 0.38 = 9.12. The second run split cost and delivery into two rows and had no row about how many qualifying households exist.

[5] Check that the source column really exists in the plan. The script also flags empty cells and any threshold that says "not in the plan".

check.py
import sysplan = " ".join(open(sys.argv[1], encoding="utf-8").read().split())rows = [[c.strip() for c in l.strip().strip("|").split("|")]        for l in open(sys.argv[2], encoding="utf-8") if l.strip().startswith("|")]rows = [r for r in rows if len(r) == 5 and not set("".join(r)) <= set("-: ")][1:]for num, q, quote, how, thr in rows:    p = []    if " ".join(quote.split()) not in plan: p.append("quote not in plan")    if not how or not thr: p.append("empty cell")    if "not in the plan" in thr.lower(): p.append("review: not in plan")    print("OK   " if not p else "CHECK", num, "; ".join(p))
console
$ python3 -I check.py plan.en.txt out.en.1.txtOK    1CHECK 2 review: not in planOK    3OK    4OK    5CHECK 6 review: not in plan

All six quotes are in the plan. The two flagged rows have "not in the plan" in the threshold, which points at missing inputs: the take rate in row 2 and the stops per driver in row 6. The second run flagged rows 1 and 6 the same way. Treat a flagged row as homework for the meeting, not as junk.

[6] Read what the script cannot see. It checks only the source column. Row 2 of the first run is a good example: the question is whether enough qualifying households exist, and the threshold is "fewer than 120 qualifying households in the three pilot complexes". But 120 is the number of subscribers the plan wants, so that threshold only breaks the assumption if every single household signs up. The model noticed the missing take rate and wrote "not in the plan" next to it, then used 120 anyway. The script flagged the row, and only reading it shows why.

#swot#planning#assumptions#chatgpt