Unit 12.00: Scoping the vision task and its refusals
The capstone scope names what the system is not for as carefully as what it is.
Task, non-tasks, cost asymmetry, refusals
What it flags, what it must not decide, what an error costs, and when it declines.
The code prints a scope and checks it.
import json
scope = {
"task": "flag cartons with visible damage for human inspection",
"not_the_task": ["deciding liability", "identifying who handled it",
"counting throughput"],
"users": "warehouse inspectors, at the unloading bay",
"decision_it_supports": "which cartons a person opens and checks",
"cost_of_a_miss": "a customer claim, roughly 45x an unnecessary inspection",
"refuses_when": ["image is blurred beyond threshold",
"carton occupies under 5% of the frame",
"lighting is outside the trained range"],
"success": "inspectors open fewer cartons and miss fewer damaged ones",
}
print(json.dumps(scope, indent=2))
checks = [
("names what it is NOT for", len(scope["not_the_task"]) > 0),
("states the error cost asymmetry", "45x" in scope["cost_of_a_miss"]),
("has computable refusal conditions", len(scope["refuses_when"]) == 3),
("success is observable", "inspectors" in scope["success"]),
]
for check, ok in checks:
print(f" {'OK ' if ok else 'FAIL'} {check}")
cost_of_a_miss states the asymmetry as a ratio, which is what makes the threshold choice in Module 7 a computation rather than a judgement.
The refusal conditions are all computable from the image before any model runs - blur, object size, lighting range. That keeps the refusal free and certain rather than dependent on the model recognising its own limits.
The mistake this prevents
The mistake is scoping the model by what it can do. Scope it by the decision it supports - 'which cartons a person opens' - because that is what determines the metric, the threshold and the refusals.
Takeaway
Scope by the decision the model supports, state the error-cost asymmetry as a ratio, and make refusal conditions computable from the image.
