Deliver an automation capstone
Combine the course ideas into a tested workflow and a clear handover. This module has 3 lessons and takes about 1h 50m. Each lesson has a practice exercise that runs real Python in your browser and a short quiz.
Start module 20 in the Learning LabOrchestrate a draft workflow
Validate id and message, route unknown labels to review, and return a repair or training draft. Set ready only for a trusted boolean approved=True.
The capstone combines intake validation, a simulated AI proposal, and an approval state. Every output is a local record. No message is sent by the lesson.
Require a non-empty string id and message. Accept repair or training predictions as drafts; other predictions need review. A trusted approved flag changes draft to ready, which still does not execute an external action.
This small function omits durable idempotency and versioned approval for readability. Your capstone plan must add those before describing a live deployment.
See it in action
def solve(record, label, approved):
if not isinstance(record, dict) or not all(isinstance(record.get(k), str) and record[k].strip() for k in ("id","message")):
return {"status":"invalid"}
if label not in ("repair", "training"):
return {"id":record["id"], "status":"review"}
return {"id":record["id"], "queue":label, "status":"ready" if approved is True else "draft"}
print(solve({"id":"r1","message":"Help"}, "repair", False))
This small function omits durable idempotency and versioned approval for readability. Your capstone plan must add those before describing a live deployment.
Report test evidence honestly
Return incomplete for an empty result dictionary, pass when every value is boolean True, and fail otherwise.
A handover should show what was tested and what remains uncertain. Do not report unrun tests as passing or simulated results as real customer outcomes.
Given named case results, return pass only when there is at least one case and every result is exactly True. Return incomplete for no cases and fail for any other result.
Keep input fixtures and expected outputs with the report so another person can reproduce the evidence.
See it in action
def solve(results):
if not results:
return "incomplete"
return "pass" if all(value is True for value in results.values()) else "fail"
print(solve({"normal":True,"duplicate":True,"invalid":True}))
Keep input fixtures and expected outputs with the report so another person can reproduce the evidence.
Practical: Finish the workshop assistant
Return one status per row: invalid for missing id/message, duplicate for a repeated valid id, review for an unknown label, otherwise ready only for approved=True or draft.
Bring the pieces together in a batch capstone. Each fictional row contains an id, message, simulated label, and trusted approval flag. Preserve every row in the output so invalid work is visible.
Validate id and message before deduplication. Keep the first valid occurrence of each id. A duplicate becomes duplicate, an unknown label becomes review, and known labels become draft or ready according to approval.
This capstone checks deterministic workflow behaviour. It does not measure a real model or prove production readiness. Include the remaining integration work in your handover.
Your experiment plan
Use the browser editor or the notebook. All records and AI responses are fictional. No network calls, credentials, or real messages are used.
- Build the full fictional workshop intake using the earlier validation, routing, approval, retry, and ledger designs.
- Run the example and predict its result before changing it.
- Complete the function in Practice and run the checks. Add your own normal, empty, and failure cases.
- Inject duplicates, malformed responses, an expired approval, and a temporary failure. Record each path.
- Save the notebook with your observations and explain one limitation of the simulation.
What to hand in
- A runnable capstone notebook, workflow diagram, evaluation table, and handover with owners and limitations.
- A test table with inputs, expected outputs, actual outputs, and one revision.
Reflect on your results
What evidence would you require before connecting a real model or sending real messages?
The automatic exercise checks the core code behaviour. Review observations and written deliverables yourself or with a mentor.
See it in action
def solve(rows):
seen, output = set(), []
for row in rows:
if not isinstance(row, dict) or not all(isinstance(row.get(k), str) and row[k].strip() for k in ("id","message")):
output.append("invalid")
continue
if row["id"] in seen:
output.append("duplicate")
continue
seen.add(row["id"])
if row.get("label") not in ("repair", "training"):
output.append("review")
else:
output.append("ready" if row.get("approved") is True else "draft")
return output
print(solve([{"id":"r1","message":"Help","label":"repair"},{"id":"r1","message":"Help","label":"repair"},{"id":"r2","message":"Hi","label":"other"},{}]))
This capstone checks deterministic workflow behaviour. It does not measure a real model or prove production readiness. Include the remaining integration work in your handover.
Free, open and run by a nonprofit.
This page is part of AI Automation, a free course of 20 modules and 60 lessons in the engineering.fit( ) Learning Lab. The Learning Lab is built and run by engineering.fit( ), a nonprofit founded by Abdullateef Opeyemi Bakare that helps African engineering students gain research experience. You do not need an account or pay a fee to learn.