Final Project
1 Overview
The final project is a team-based software engineering project in which you will design, implement, test, secure, and deploy an AI-powered application. Over roughly nine weeks you will take a system from a written proposal to a running, publicly reachable deployment, and then defend it in a live demo.
The project should demonstrate that you can integrate LLMs and AI
agents into a substantial software system—
The goal is not to build the most sophisticated AI model. The goal is to engineer a reliable software system that uses AI effectively.
Everything this course has covered—
1.1 What counts as an acceptable project
AI is one component of a larger software system that also has a real frontend, backend, database, and deployment story.
The AI does something the rest of your system can act on: retrieve, plan, call tools, produce structured output.
Your system can tell when the AI is wrong, and does something about it.
You can show, with numbers, that it works.
1.2 What is not sufficient
A prompt box that forwards text to an LLM and prints the reply.
A RAG chatbot over a folder of PDFs, with nothing built on top of the answers.
A project where the “database” is a JSON file.
A project that only runs on your laptop.
A polished UI wrapped around an AI component that was never evaluated.
2 Learning Objectives
By the end of this project you should be able to:
Design a nontrivial software system and justify its architecture.
Build and deploy a full-stack application.
Design and use a relational database.
Integrate LLM APIs into application code.
Implement RAG and/or tool calling.
Build an agentic workflow that plans, acts, and verifies.
Evaluate AI-generated results quantitatively.
Write automated tests at the unit, API, and behavioral level.
Identify and mitigate security threats, including prompt injection.
Containerize and deploy an application with CI/CD.
Use Git/GitLab as a collaborating team, not as a backup drive.
Document architectural and engineering decisions for another engineer.
3 Team Requirements
Teams of 2 students are recommended.
Teams of 3 are allowed only for projects that are genuinely large and challenging, and only with instructor approval at the proposal stage. A 3-person team is held to a visibly larger scope than a 2-person team.
Solo projects are not the default. Talk to the instructor before assuming one.
Every student must have identifiable ownership of part of the system. A typical split:
Student | Primary responsibility |
A | Frontend + UX |
B | Backend + database |
C | AI/agent + evaluation |
These roles are a starting point, not a wall. The actual requirement is:
Every student must contribute substantial code and participate in design, testing, and documentation.
Your Git history must show that participation. Commit count alone is
not the measure—
4 Timeline and Milestones
Milestone | What is due | Date |
M1 — | Finalized written proposal, approved by the instructor | Thursday, October 1, 2026 |
M2 — | End-to-end system running, however thin | Thursday, October 29, 2026 |
M3 — | Core functionality done; testing/evaluation/security underway | Thursday, November 19, 2026 |
Final submission | Deployed system, repository, documentation, evaluation, report | Tuesday, December 1, 2026 |
Demo | Live presentation to the class | Final week — |
Your proposal must be finalized before October 1, which means drafts and revisions happen during the last week of September. Start early; a proposal that arrives on October 1 with no prior discussion will usually need changes.
4.1 M2 — Vertical prototype (October 29)
By this date the system must already work end-to-end:
UI -> Backend -> Database -> AI -> Response |
Functionality can be very limited. A single page, a single endpoint,
a single table, and one real LLM call is enough—
This milestone exists to stop teams from spending a month building infrastructure with nothing running. If you are still “setting things up” on October 15, you are behind.
4.2 M3 — Feature complete (November 19)
Core functionality is done. The remaining three weeks go to:
testing
AI evaluation
security analysis and mitigation
reliability and error handling
UI polish
deployment
4.3 Final (December 1)
Deployed system, GitLab repository, documentation, evaluation results,
final report, and demo materials. Note that Thanksgiving break
falls in the week before the deadline (November 25–29)—
Milestone policy: M1–M3 are required and graded satisfactory/unsatisfactory. Each missed or unsatisfactory milestone costs 5 points from your final project grade. They exist so you get feedback while feedback is still useful.
5 What Counts as an AI Project?
The distinction that matters:
AI is part of a software system, not the entire software system.
Too simple | Good project |
Chatbot that answers questions about a PDF | AI incident-response system that investigates logs, Git history, and deployment data and produces a verified diagnosis |
RAG chatbot over a collection of PDFs | Research assistant that retrieves papers, compares claims, and verifies citations against the source text |
Upload a CSV, ask ChatGPT questions about it | AI data analyst that generates SQL, executes it, validates the results, and produces visualizations |
“Summarize my meeting notes” | Meeting system that extracts decisions and action items, stores them, and creates tracked tasks you can query months later |
See Suggested Final Project Ideas for worked examples. You are not
restricted to that list—
6 Suggested Final Project Ideas
6.3.14 Constraint-Aware Planner (Events, Itineraries, Scheduling) |
Fall 2026 · Companion to Final Project
6.1 How to use this list
These are starting points, not assignments. You may pick one,
modify one, combine two, or propose something entirely your own.
Original ideas are encouraged—
Every idea below is written in the same shape, matching what your proposal has to contain:
Concept—
what it does Features—
what users can do Tools—
candidate tools for your agent (you need at least 3 meaningful ones) Reliability—
what happens when the AI is wrong Evaluation—
something you can measure Difficulty / fit—
honest assessment for a 9-week term Watch out for—
the thing that usually goes wrong
Read Project Requirements before you choose. Then read
What Makes a Project Ambitious?—
6.2 The scope test
Nearly every project in this course fails or succeeds on one distinction:
AI is part of a software system, not the entire software system.
Too simple | Substantial |
Chatbot that answers questions about a PDF | System that retrieves, cross-checks, verifies citations, and flags conflicting sources |
Upload a CSV, ask ChatGPT about it | Agent that inspects the schema, writes SQL, executes it, validates the numbers, and charts them |
“Review my code with AI” | Reviewer that runs static analysis and an LLM, compares them, and verifies its own findings |
“Summarize my meetings” | System that extracts decisions and owners, stores them, tracks them across months, and answers questions with evidence |
Trip-planning chatbot | Planner that builds an itinerary satisfying real
constraints— |
If a wrong answer from your model produces no visible consequence anywhere in your system, your idea is on the left side of that table.
6.3 The ideas
6.3.1 AI Software Engineering Assistant
Concept. Connect a GitLab repository and let an agent continuously analyze the project: answer questions about the code, explain architecture, review merge requests, find missing test coverage, summarize commit ranges, and open issues for what it finds.
Features. Repository ingestion and indexing · natural-language code Q&A · MR review with inline findings · test coverage gap report · commit range summaries · issue creation · review history
Tools. inspect_repository() · get_commits() · get_merge_request_diff() · run_tests() · get_coverage() · create_issue() · search_code()
Reliability. Before reporting a bug, the agent must locate the code and run the test suite. Findings that cannot be grounded in a file and line are dropped. Generated issues go to a human approval queue before they are created.
Evaluation. Seed a repository with 25–30 known defects. Measure detection rate, false positive rate, and how often the agent points at the right file.
Advanced version. Give the agent a failing test and have it
investigate autonomously—
Difficulty: ★★★★★ · Fit: strong for a team of 3
Watch out for. Repository size. Index one moderate repo well
rather than handling arbitrary ones badly. Decide your chunking
strategy early—
6.3.2 AI Incident Response Center
Concept. A miniature DevOps/SRE platform where an agent investigates simulated production incidents using logs, deployment history, Git commits, metrics, and configuration.
You give it an incident—
Incident |
↓ |
Inspect logs -> Inspect recent deployments -> Inspect Git commits -> Inspect DB status |
↓ |
Form hypotheses |
↓ |
Run diagnostic tools |
↓ |
Rank hypotheses |
↓ |
Incident report |
The UI shows the investigation as it happens, step by step, so a human can follow the reasoning.
Features. Incident dashboard · log ingestion and search · deployment timeline · live investigation view · ranked hypotheses with evidence · generated incident report · incident history
Tools. search_logs() · get_deployment_history() · search_git_history() · get_metrics() · run_diagnostic() · create_incident_report()
Reliability. Every hypothesis must cite the specific log lines, commits, or metrics supporting it. Claims without evidence are rejected before display. Confidence is shown per hypothesis.
Evaluation. Build 20–30 synthetic incidents with known root causes. Measure top-1 and top-3 root cause accuracy, and average number of tool calls to reach the answer.
Difficulty: ★★★★★ · Fit: team of 3
Watch out for. You have to generate realistic incident data before you can build anything. Budget a full week for the simulator and make it a deliverable in its own right.
6.3.3 AI Data Analyst
Concept. Users connect a database or upload CSVs and ask
questions in English—
The rule that makes this project good:
The LLM may not state a number it did not obtain through a tool.
Features. Data upload / DB connection · schema browser · natural-language queries · visible query plan · generated SQL shown to the user · charts · saved analyses · export
Tools. inspect_schema() · run_sql() · calculate_statistics() · create_chart() · profile_column()
Reliability. SQL passes a validator before execution:
read-only enforcement, table allowlist, column existence check, row
limit, query timeout. Numbers in the final answer are cross-checked
against the actual result set—
Evaluation. 30–40 questions with known correct answers. Measure exact-match answer accuracy, SQL validity rate, and how often the validator catches a bad query.
Difficulty: ★★★★★ · Fit: 2 or 3
Watch out for. This is the idea most likely to become a thin wrapper if you skip the validation layer. The validator is the project. Build it in week 2, not week 7.
6.3.4 Natural Language → SQL, Focused on Safety
Concept. A narrower, deeper sibling of AI Data Analyst that investigates one question: how do you make LLM-generated SQL safe?
Question -> LLM -> SQL -> Validator -> Security checker -> Database -> Results -> Explanation |
Features. Query interface · generated SQL with explanation · validator verdict shown to the user · blocked-query log · role-based table access · query history
Tools. inspect_schema() · validate_sql() · run_sql() · explain_plan() · check_permissions()
Reliability. The whole project is the reliability mechanism. Test against: invalid SQL, destructive statements, unauthorized tables, injection attempts, hallucinated columns, and ambiguous questions.
Evaluation. An adversarial suite of 40+ queries—
Difficulty: ★★★★☆ · Fit: good for a team of 2
Watch out for. Narrower scope means the engineering has to be excellent. Per Grading Rubric, that is a completely viable way to score well.
6.3.5 Knowledge Navigator (Courses, Degrees, Policies)
Concept. RAG over a large collection of institutional
information—
What lifts it above a RAG chatbot: query decomposition, multi-source retrieval, conflict detection between documents, citation verification, document freshness tracking, and an admin interface for ingesting new material.
Question -> Query decomposition -> Search multiple sources -> Retrieve |
-> Check for conflicts -> Generate answer -> Verify citations -> Response |
Features. Document ingestion (PDF/HTML/Markdown) · semantic + keyword search · cited answers · conflict warnings · prerequisite chain resolution · “why did you recommend this?” · admin upload console · freshness indicators
Tools. search_documents() · get_course() · resolve_prerequisites() · check_requirements() · verify_citation()
Reliability. Every factual claim must map to a retrieved span. A verification pass re-checks each citation against the source text; unsupported claims are stripped or flagged before the answer is shown.
Evaluation. 30–50 questions with known correct answers drawn from the catalog. Measure answer accuracy, citation precision (does the cited source actually support the claim?), and retrieval recall.
Difficulty: ★★★★☆ · Fit: 2 or 3
Watch out for. Prerequisite chains are graph problems, not
text problems. Model them in your database and let the agent query
them with a tool—
6.3.6 AI Code Tutor and Debugging Coach
Concept. Not “ask AI to fix my code.” A student submits broken code and the system teaches them to debug it, revealing information progressively:
Hint 1: Your function works for positive integers. What happens when n = 0?
Hint 2: Look at the recursive call.
[Show solution]
Features. Code submission and sandboxed execution · test running · progressive hints · Socratic follow-up questions · attempt tracking · generated practice problems · instructor dashboard of common mistakes
Tools. run_code() · run_tests() · parse_ast() · get_stack_trace() · generate_test_case() · record_attempt()
Reliability. Hints must be grounded in an actual failing test or a real AST finding, never in the model’s guess about what looks wrong. Before a hint is shown, the system verifies the claimed defect actually reproduces.
Evaluation. A set of 25+ programs with known bugs. Measure
defect localization accuracy and hint relevance. If you can recruit
classmates, measure time-to-fix with hints versus without—
Difficulty: ★★★★☆ · Fit: 2 or 3
Watch out for. Running untrusted student code is a genuine
security problem. Sandbox it properly (container, resource limits, no
network) and write that up in your security section—
6.3.7 AI Debugging Assistant with a Fix Loop
Concept. A developer submits source code, an error message, a
stack trace, and optionally Git history. The system diagnoses the
problem and proposes a fix—
AI -> proposed fix -> generated test -> run suite -> feedback -> AI revision |
Features. Submission interface · likely cause with cited code · suggested fix as a diff · generated reproducing test · generated verification test · automatic test execution · revision history showing each attempt
Tools. run_tests() · apply_patch() · get_git_blame() · search_codebase() · generate_test()
Reliability. The loop itself: a proposed fix is only presented as successful if the reproducing test fails before and passes after, with no other tests broken. Fixes that do not survive that check are marked unverified.
Evaluation. 20–30 bugs with known fixes. Measure verified-fix rate, average revision attempts, and regression rate.
Difficulty: ★★★★★ · Fit: 2 or 3
Watch out for. Scope the language and project type
narrowly—
6.3.8 AI Research Assistant with Citation Verification
Concept. A research tool over a collection of academic papers: upload, search semantically, ask questions, compare methods across papers, extract claims, and find supporting or contradicting evidence.
Paper A --+ method · dataset · results · limitations |
Paper B --+--> Structured comparison |
Paper C --+ |
Features. PDF ingestion and parsing · semantic search · cross-paper comparison tables · claim extraction · evidence linking · contradiction detection · literature map · export
Tools. search_papers() · extract_section() · compare_papers() · verify_claim() · find_contradictions()
Reliability. A citation verification agent checks whether each generated claim is actually supported by the cited passage. Unsupported claims are flagged in the UI rather than silently shown.
Evaluation. Hand-label 30–40 claim/citation pairs (some genuine, some deliberately wrong). Measure how often the verifier correctly accepts and rejects.
Difficulty: ★★★★☆ · Fit: 2 or 3
Watch out for. PDF parsing is miserable and will eat more time than you expect. Use a known-good library, test it on your actual corpus in week 1, and keep the corpus small and clean.
6.3.9 AI Security Auditor
Concept. Submit a repository; the system performs automated security analysis combining static analysis, dependency scanning, secret detection, and LLM review, then produces a report where each finding is verified before it is shown.
CRITICAL Hard-coded database password src/config.py:17 |
HIGH Possible SQL injection api/users.py:82 |
MEDIUM Missing CSRF protection api/app.py:34 |
Features. Repository submission · multi-analyzer pipeline · severity-ranked findings · per-finding explanation (“why is this vulnerable?”) · suggested patch · verification status · scan history · false-positive marking
Tools. run_static_analysis() · scan_dependencies() · detect_secrets() · search_code() · lookup_vulnerability_db() · verify_finding()
Reliability. The AI must not trust its own findings. Each LLM-reported issue is checked against a static analyzer, a rule-based test, or a vulnerability database. Unconfirmed findings are labeled as such.
Evaluation. A corpus of repositories with known planted
vulnerabilities. Measure precision, recall, and false positive
rate—
Difficulty: ★★★★★ · Fit: 2 or 3
Watch out for. Scope to one language and a fixed vulnerability
list. Also: you are running untrusted code’s source, not the
code itself—
6.3.10 AI Meeting Intelligence with Persistent Memory
Concept. More than transcription. From meeting transcripts,
extract decisions, action items, owners, deadlines, and unresolved
questions—
“What did we decide about the database last Tuesday?”
An agent can then act: “Create tasks for all outstanding action items.”
Features. Transcript upload · decision and action-item extraction · owner and deadline assignment · searchable meeting history · evidence-linked answers · task creation in an internal tracker · follow-up detection for stale items
Tools. search_meetings() · extract_action_items() · create_task() · get_task_status() · link_to_transcript()
Reliability. Every extracted decision links to the transcript span it came from and is shown alongside it. Task creation requires human confirmation before it writes to the database. Extraction output is schema-validated.
Evaluation. Hand-annotate 20–30 transcripts with ground-truth action items. Measure extraction precision and recall, and owner-assignment accuracy.
Difficulty: ★★★★☆ · Fit: team of 2
Watch out for. Getting transcripts. Decide your source in
week 1—
6.3.11 AI Support Platform That Knows When Not to Answer
Concept. A real support platform, not a chatbot:
Ticket -> AI classification -> RAG over documentation -> Agent investigates |
-> Proposed solution -> Confidence assessment -> Human approval -> Response |
The interesting requirement: the system must know when not to answer.
Confidence: 42% → escalate to a human
Features. Ticket intake and queue · automatic classification and routing · documentation search · drafted responses with citations · confidence scoring · escalation workflow · agent approval interface · resolution analytics
Tools. search_documentation() · get_customer_history() · classify_ticket() · check_known_issues() · escalate_to_human()
Reliability. Confidence thresholds with escalation, plus citation checks on every drafted answer. Test it by deliberately removing or corrupting documentation and measuring whether the system escalates instead of inventing an answer.
Evaluation. 30+ tickets, some answerable from your docs and some deliberately not. Measure answer accuracy on the answerable half and correct-escalation rate on the rest. The second number is the interesting one.
Difficulty: ★★★★☆ · Fit: team of 2
Watch out for. Calibrating confidence is genuinely hard. Do
not use the model’s self-reported confidence alone—
6.3.12 Personal Finance Intelligence
Concept. Users import transactions; the system categorizes them, detects recurring payments and anomalies, builds budgets, and answers analytical questions agentically:
“Why did my spending increase this month?”
get_transactions() -> get_previous_month() -> group_by_category() |
-> find_recurring() -> compare_categories() -> explanation |
Features. Transaction import · automatic categorization · recurring payment detection · anomaly flags · budget creation and tracking · natural-language questions · monthly summaries · duplicate detection
Tools. get_transactions() · group_by_category() · find_recurring() · compare_periods() · detect_anomalies()
Reliability. As in AI Data Analyst, every figure in an explanation must come from a tool result, verified against the returned data before display. Categorization confidence below a threshold is surfaced for user correction, and corrections feed back into the system.
Evaluation. A labeled transaction set. Measure categorization accuracy, recurring-payment detection rate, and numerical correctness of generated explanations.
Difficulty: ★★★★☆ · Fit: team of 2
Watch out for. Use synthetic or anonymized data only. Never use real financial data belonging to anyone, including yourselves. Privacy and authorization belong at the center of your security analysis.
6.3.13 AI Test Generation and Test-Quality Analyzer
Concept. Submit a codebase; the system generates tests—
Features. Repository submission · test generation per module · coverage reporting before and after · mutation testing · test-quality score · flaky test detection · gap report identifying untested branches
Tools. analyze_coverage() · generate_test() · run_tests() · mutate_code() · detect_flaky()
Reliability. A generated test is only kept if it (a) passes on the correct code, (b) fails on at least one mutant, and (c) is not flaky across repeated runs. Everything else is discarded. This is one of the cleanest verification loops available in this list.
Evaluation. Measure coverage delta, mutation kill rate, and
the discard rate of generated tests—
Difficulty: ★★★★★ · Fit: 2 or 3
Watch out for. Mutation testing is slow. Limit mutant count and module scope, and run it as a background job rather than in the request path.
6.3.14 Constraint-Aware Planner (Events, Itineraries, Scheduling)
Concept. A planning agent that builds a real plan under real constraints, rather than describing one. Two concrete forms:
Campus event planner—
Itinerary planner—
Features. Constraint input · generated plan with reasoning · constraint violation warnings · interactive editing with partial re-planning · alternatives · plan persistence and export
Tools. search_availability() · check_capacity() · get_travel_time() · check_conflicts() · calculate_cost() · create_booking()
Reliability. A rule-based constraint validator checks the
finished plan independently of the LLM: no double-booking, nothing
scheduled outside opening hours, travel times physically possible,
total within budget. Violations are either repaired or shown to the
user—
Evaluation. 25+ scenarios with known-feasible solutions. Measure constraint satisfaction rate, plan validity, and how often the validator has to intervene.
Difficulty: ★★★★★ · Fit: team of 3
Watch out for. External APIs (maps, venues, flights) have rate limits and costs. Cache aggressively, and have a fixture-based fallback so your demo does not depend on a live third party.
6.4 Ideas that need work before they qualify
These come up every term. Each is too small as stated—
As usually proposed | What would make it a CMSC389A project |
Study assistant: upload notes, ask questions | Add quiz generation with verified answers, spaced repetition backed by real performance data, and retrieval quality measurement against a labeled question set |
Resume / job description matcher | Extract structured requirements from both sides, match them against a skills database, and evaluate against human-labeled match ratings |
Email classifier | Compare a classical ML baseline against an LLM
on the same labeled set— |
Flashcard generator | Verify each generated card against the source text, track learner performance, and measure whether card quality affects retention |
Meeting summarizer | See AI Meeting Intelligence with Persistent Memory— |
“Chatbot for X” | Give the AI tools that change state, and a verification layer that catches it when it is wrong |
6.5 Choosing
Project | AI depth | Engineering | Demo | Team size |
1. Software Engineering Assistant | ★★★★★ | ★★★★★ | ★★★★★ | 3 |
2. Incident Response Center | ★★★★★ | ★★★★★ | ★★★★★ | 3 |
3. Data Analyst | ★★★★★ | ★★★★☆ | ★★★★★ | 2–3 |
4. NL→SQL Safety | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2 |
5. Knowledge Navigator | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2–3 |
6. Code Tutor | ★★★★☆ | ★★★★☆ | ★★★★★ | 2–3 |
7. Debugging Assistant | ★★★★★ | ★★★★☆ | ★★★★★ | 2–3 |
8. Research Assistant | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2–3 |
9. Security Auditor | ★★★★★ | ★★★★★ | ★★★★☆ | 2–3 |
10. Meeting Intelligence | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2 |
11. Support Platform | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2 |
12. Finance Intelligence | ★★★★☆ | ★★★★☆ | ★★★★☆ | 2 |
13. Test Quality Analyzer | ★★★★★ | ★★★★☆ | ★★★☆☆ | 2–3 |
14. Constraint Planner | ★★★★★ | ★★★★☆ | ★★★★★ | 3 |
A five-star project that half works will score below a four-star project that works completely. See Grading Rubric.
6.6 Before you commit
Ask these five questions. If you cannot answer all of them, you are not ready to write the proposal:
What does a user actually do with this? Name three concrete actions.
What are my three tools, and could each one be replaced by pasting text into the prompt? If yes, it is not a tool.
What happens when the AI is wrong? Name the mechanism, and name what visibly breaks without it.
What number will I report in December, and how will I build the test cases for it?
What is the smallest version of this that still works end to end? That version is your October 15 milestone.
Bring your answers to office hours before October 1. A twenty-minute conversation in September is worth three weeks in November.
7 Project Requirements
7.1 Frontend
React with TypeScript.
A real interface with multiple views, not a single textarea.
Handles loading, error, and partial-result states—
AI calls are slow and sometimes fail, and your UI has to say so.
7.2 Backend
FastAPI (Python), or an equivalent API framework approved at the proposal stage.
A REST API or equivalent, with a documented set of endpoints.
Application logic lives here. The frontend must not call the LLM provider directly.
7.3 Database
PostgreSQL or MySQL.
Real schema design: tables, keys, relationships, indexes where they matter, and migrations.
Storing application state in JSON files instead of the database does not satisfy this requirement.
Document your schema in your README.
7.4 AI / LLM
The project must meaningfully use one or more of:
an LLM
RAG
tool calling
an AI agent
structured generation
embeddings / vector search
But:
A simple “prompt -> LLM -> response” application is insufficient.
7.5 Agents and Tools
Your AI system must have at least 3 meaningful tools that let it interact with data or external systems. Examples:
search_database() |
get_user_information() |
run_analysis() |
search_documents() |
create_ticket() |
run_tests() |
inspect_repository() |
get_deployment_history() |
send_notification() |
A tool is meaningful when:
It performs an operation that cannot be replaced by simply including the same information in the prompt.
A “tool” that returns a hardcoded string, or that returns data you already pasted into the system prompt, does not count. Tools that query your database, hit an external API, run a computation, or change system state do.
Your proposal must list your tools and what each one does.
7.6 AI Reliability — “What happens when the AI is wrong?”
This is the requirement we care about most, and the one most projects underestimate.
Every project must implement at least one mechanism for detecting or mitigating incorrect AI output, and must be able to demonstrate it working. Acceptable mechanisms include:
schema validation on structured output
citation verification against source documents
test execution against generated code
human approval before a consequential action
confidence thresholds with escalation
tool-result validation
consistency checking across multiple generations
rule-based verification
retrieval quality evaluation
Build this:
LLM |
↓ |
Generate SQL |
↓ |
Validate SQL |
↓ |
Execute |
↓ |
Check result |
↓ |
Return answer |
Not this:
LLM |
↓ |
Trust answer |
A good heuristic while you design: your project should contain
something that fails if the AI is wrong. If a wrong answer from the
model produces no visible consequence anywhere in your system, you
have not built a reliability mechanism—
7.7 Evaluation
You must define at least one quantitative evaluation metric and report results on a test dataset or a set of test scenarios. Candidates:
accuracy
hallucination rate
retrieval precision / recall
task completion rate
tool-selection accuracy
code-generation success rate
classification accuracy
response time
cost per request
human satisfaction ratings
This does not need to be a research project. 20–50 carefully constructed test cases is a reasonable target. What matters is that the cases are real, that you built them deliberately, and that the number you report means something.
Report your results in your README and in your final report, and explain what the number does not tell you.
7.8 Testing
Automated tests are required at three levels:
unit tests for business logic
API tests for endpoints
database tests
at least some component or integration tests
evaluation/test cases for AI behavior (these overlap with Evaluation)
You must also be able to answer, in your documentation:
What kinds of failures are caught by your tests?
Tests must run in CI.
7.9 Security
Identify the threats relevant to your application and address them. Common ones:
authentication and authorization
SQL injection
XSS
CSRF
prompt injection
sensitive information disclosure
insecure tool execution
excessive agent permissions
API key protection
malicious uploaded documents
Prompt injection analysis is mandatory for any project involving
agents or RAG—
Authentication and authorization are required. An agent with tools must not be able to reach data the current user is not allowed to see.
7.10 Architecture
Produce an architecture diagram, for example:
+---------------+ |
| React/TS UI | |
+-------+-------+ |
| |
v |
+---------------+ |
| FastAPI | |
+-------+-------+ |
| |
+-----------+-----------+ |
v v v |
PostgreSQL Agent External API |
| |
+-------+-------+ |
v v v |
Tool 1 Tool 2 Tool 3 |
As a rule of thumb: if component A sends messages to component B, draw an arrow from A to B.
Alongside the diagram, explain your components, data flow, AI architecture, database architecture, external services, authentication, and deployment.
7.11 Docker
docker compose up |
must start your frontend, backend, and database. Document any setup steps (environment variables, seed data, migrations) in your README.
This is not optional—
7.12 CI/CD
Configure GitLab CI to run on push:
git push |
| |
v |
CI |
|-- lint |
|-- tests |
|-- build |
+-- security checks |
Automated deployment is encouraged but not required. A reproducible build is.
7.13 Deployment
A deployed, reachable version of your application is required. You choose the infrastructure:
UMD VM
a cloud VM
Render, Railway, Fly.io
AWS, Azure, GCP
any other platform approved at the proposal stage
The requirement is simply:
The instructor and TAs must be able to access and evaluate the application without reproducing your entire development environment.
Keep costs in mind and use free tiers where you can. If your deployment needs credentials to log in, provide a test account.
8 Project Proposal
Due: Thursday, October 1, 2026. Maximum 3 pages.
Do not spend four weeks building the wrong thing. The proposal is where scope gets fixed, and it is where the instructor can still save you.
8.1 Audience
Write for a technical reader who may not know your domain. If you are
building a security tool, assume your reader can code but has never
written a static analyzer. As you write each section, ask what
questions a reader would have—
8.2 Required contents
Project name
Team members—
and whether you are a team of 2 or 3 Problem statement—
what problem, for whom, and why it is worth solving Target users
Pitch—
1–2 clear sentences on what the system does and who benefits. No implementation details, no programming languages. This is your first impression; write it last and rewrite it twice. Why AI is necessary or useful here—
what breaks if you remove the AI? Main features—
5–10 specific actions a user can complete. Each should stand alone and say what the user can do, not how. Write “Users can compare two research papers,” not “Users can click the compare button to open a side-by-side view.” Scope this list against the nine weeks you actually have. AI architecture—
retrieval, prompting, agent loop, structured output, and where verification happens Tools—
your 3+ tools, what each does, and why each is meaningful under Agents and Tools Database design—
tables and relationships Technology stack—
and, for each major component, why that choice given your team’s skills Reliability plan—
what happens when the AI is wrong (AI Reliability — “What happens when the AI is wrong?”) Evaluation plan—
your metric, how you will build test cases, and what result would count as success Security considerations—
including your prompt injection threat model Risks—
at least three things that could go wrong, each with a plan: how you would resolve it, the expected schedule impact, and how you would adjust. “Ask the instructor for help” is a legitimate plan for one risk, not for all three. Teamwork—
one concrete way you will reduce friction across your development environments (and why it fits your team), plus how you will divide the work. Assign pieces of the project, not individual methods. Timeline—
your own task breakdown against the four milestones in Timeline and Milestones, with at least two tasks per week
Scheduling is genuinely hard and you will not stick to your schedule perfectly. That is expected and is not graded as a failure. What is graded is whether the schedule is balanced and whether you adjusted it honestly as things changed.
9 Git and GitLab Requirements
A GitLab repository, instructor created and shares it with you and TAs
Meaningful commit messages and history
Feature branches (or an equivalent documented workflow)
Merge requests—
at least one MR reviewed by another team member for each major feature Issue tracking used for real work
README.md (see Documentation)
.gitignore
.env.example documenting every environment variable
No API keys, credentials, or secrets committed—
ever. If you commit one, rotate it immediately and say so in your final report.
Merge request review is where the collaborative engineering actually happens. Reviewing your teammate’s code is part of your grade, not a favor you do them.
10 Documentation
Your repository README must follow this structure:
# Project Name |
|
## Team Members |
|
## Problem |
|
## Features |
|
## Architecture |
|
## Technology Stack |
|
## AI Architecture |
|
## Tools |
|
## Database |
|
## Installation |
|
## Running Locally |
|
## Deployment |
|
## Testing |
|
## Evaluation |
|
## Security |
|
## Limitations |
|
## Future Work |
Limitations is the section that matters most for an AI project, and it is the one most teams write badly. Answer directly:
Where does your system fail?
Name the inputs that break it, the cases your evaluation does not cover, and the failure modes you know about and did not fix. An honest limitations section raises your grade. A limitations section that says “the system works well in all tested scenarios” lowers it.
11 AI Usage Policy
You are expected to use AI coding and development tools on this project. That is the subject of the course. Using Claude Code, Copilot, Cursor, or anything comparable is encouraged.
However:
You are responsible for all code you submit and must be able to explain how your system works.
Submit an AI-USAGE.md documenting:
which AI tools you used
how you used them
where AI-generated code was incorporated
how you verified AI-generated code before merging it
significant AI failures you encountered—
bugs it introduced, confident wrong answers, code that passed review and broke later
That last item is graded, and graded generously. It is the point of the course.
12 Final Deliverables
Due Tuesday, December 1, 2026:
GitLab repository (instructor and TAs have access)
Deployed, reachable application (with a test account if login is required)
Docker configuration—
docker compose up works from a clean clone README following the Documentation structure
Architecture diagram
Automated tests, running in CI
AI evaluation with reported results
Security analysis, including a demonstrated prompt injection attack and mitigation
AI-USAGE.md
Final report
Presentation / demo materials
Individual contribution statement from each team member
13 Final Presentation and Demo
10–15 minutes per team, structured:
Time | Section | Content |
2 min | Problem | What problem are you solving, and for whom? |
2 min | Architecture | How does the system work? |
5 min | Live demo | An actual workflow, running against your deployment |
2 min | AI | Your AI/agent architecture and tools |
2 min | Evaluation & security | How you tested it, your metric and result, and what happens when the AI fails |
Followed by questions from the instructor and the class.
The live demo is the centerpiece—
Record a backup video. Live demos break.
14 Grading Rubric
Category | Points |
Functionality & completeness | 20 |
Software architecture | 15 |
AI/agent integration | 15 |
AI reliability & evaluation | 10 |
Testing | 10 |
Security | 10 |
Code quality & engineering practices | 10 |
Deployment & DevOps | 5 |
Documentation | 5 |
Total | 100 |
Missed or unsatisfactory milestones (Timeline and Milestones): -5 points each.
Two consequences of this rubric, stated plainly:
A technically ambitious idea that does not work reliably will not receive a high score simply because the idea is ambitious.
A smaller project with excellent engineering, testing, evaluation, and reliability can outperform a much larger project that is incomplete.
Choose your scope accordingly.
15 What Makes a Project Ambitious?
Use these five dimensions when you are deciding whether your idea is
big enough—
Scale—
Intelligence—
Engineering—
Reliability—
Evaluation—
You do not need to maximize every dimension. Your project should be substantial in several of them.
A project that scores low on all five will not be approved. A project that scores very high on reliability and evaluation but is modest in scale is a perfectly good CMSC389A project.
16 FAQ
Can I work alone?
Not by default. Talk to the instructor first.
Can we be a team of 3?
Yes, if your project is large and challenging enough to justify it, and the instructor approves it at the proposal stage. Your scope expectations go up accordingly.
Can we use a stack other than React/FastAPI/PostgreSQL?
Propose it in the technology stack item of Project Proposal with a justification. Reasonable alternatives are usually approved. Decide before October 1, not in November.
Can we use a framework like LangChain, LlamaIndex, or an MCP server?
Yes. You still have to explain what it is doing and remain responsible for the behavior of your system.
Which LLM provider should we use?
Use the LLM API key we provided or any other LLM provided you have access to. Budget for API costs, cache aggressively during development, and never commit your keys. If cost is a problem, raise it early rather than quietly scaling down your evaluation.
Does a vector database count as our database requirement?
No. You need a relational database (Database). A vector store is in addition to it, not instead of it.
Our evaluation numbers came out bad. Should we hide that?
No. Report them, explain why, and describe what you would change.
Honest negative results score well. Fabricated or unexamined positive
results score very badly—
How much should we build ourselves versus generate with AI?
Generate as much as you want. Understand all of it. See AI Usage Policy.
Something is going wrong and we are behind.
Tell the instructor at the next milestone, not on December 1. Milestones exist precisely so that a struggling project can be rescoped while there is still time.