Open this lesson in your favourite AI. It'll walk you through the why, explain the demo, and quiz you on the try-it list.
By now you have the pieces — jobs to be done, the value test, the three taxes, build-vs-buy, the spike, the map — and the payoff is a single repeatable rubric you can apply to any AI feature idea in five minutes. A written rubric makes the decision defensible and consistent across your team, replacing 'the CEO saw a cool demo' with criteria everyone agreed on. It also becomes a forcing function: features that can't articulate their job, survive a wrong answer, or beat their cost simply don't pass. Owning this rubric is the durable skill of this module; the specific features will change, the screening discipline won't.
A weighted rubric that rolls up the whole module: a clear job, survivable errors, value beating the taxes, validated by a spike, and an alternative to plain code. It returns a go/no-go with the weak dimensions called out.
Use these three in order. Each builds on the one before.
In one paragraph, summarize the criteria that make a feature a good candidate for AI.
Walk me through applying a go/no-go rubric to an AI feature idea, dimension by dimension.
Given a feature that passes every rubric dimension except cost, how would you decide whether to ship it anyway, and what would you change?
RUBRIC = {
"clear_job": 3, # names a real job-to-be-done with a measurable outcome
"wrong_is_survivable": 3, # a bad answer doesn't burn trust or money
"value_beats_taxes": 2, # value per use > cost + latency + trust taxes
"spike_passed": 2, # feasibility proven on real examples
"beats_plain_code": 1, # a rule/query wouldn't do it
}
def evaluate(feature):
earned = sum(w for k, w in RUBRIC.items() if feature.get(k))
weak = [k for k in RUBRIC if not feature.get(k)]
total = sum(RUBRIC.values())
return {"score": f"{earned}/{total}", "verdict": "GO" if earned >= 8 else "NO-GO",
"fix_these": weak}
print(evaluate({"clear_job": True, "wrong_is_survivable": True,
"value_beats_taxes": True, "spike_passed": True, "beats_plain_code": False}))python3 main.py