Running a TDAA course.
Bring up the harness on a new machine, then run the weekly cycle end to end. Setup is roughly one hour; each subsequent week is a short generate-review-publish loop. Assumes a textbook PDF, a GitHub account, and a terminal.
Prerequisites
TDAA fits subjects whose evidence of understanding lives in precise definitions and short proof tasks — Theory of Computation, discrete math, formal methods. Subjects whose evidence is essay-length or project-shaped need a different gate. You'll need a stable canonical source (textbook, course pack, or complete notes) and a way to run closed-book tests with enough staff to circulate during self-paced study.
Install once per machine:
brew install typst gh uv # core tools
brew install --cask claude-code # AI assistant
gh auth login # sign in to GitHub
On other platforms, install from
typst.app,
docs.astral.sh/uv,
github.com/cli/cli,
and the assistant vendor's page. If anything is missing,
/bootstrap probes for it on first run and offers the
right install command. /grade-homework needs
pdftoppm and libreoffice at grading
time, not at bootstrap.
Fork and bootstrap the course
Create a fresh private copy of the
TDAA-Go
starter — never copy from a reference course directly, since its
weekly content will only get in the way. Replace
my-course with a short folder name:
gh repo create my-course --private --template GiggleLiu/TDAA-Go --clone
cd my-course
claude
> /bootstrap
If you have existing course materials (syllabus, slides, past
exams as PDF / PPTX / DOCX / MD), drop them into
reference/ before answering — /bootstrap
converts them and extracts course code, name, textbook,
instructor, institution, and weekly topics with source and
confidence notes. Otherwise it asks each field directly. Then
give it the textbook PDF path.
What /bootstrap produces:
config.toml— editable course metadata (theconfig.typshim loads and re-exports it for Typst templates)textbook/*.md— extracted definitions, theorems, proofs, and examplescoursedesign/schedule.typ— draft week-by-week section assignments- Substituted placeholders in
.github/templates/*.htmland the release workflow
AI extraction is good enough to start from, not good enough to ship. Read the textbook extraction and the proposed schedule and correct them by hand. The schedule is the contract with students — if a topic is not in it, the test must not silently introduce it.
Generate a week
With the schedule corrected, generate week 1:
> /generate-week 1
The skill runs the writer-reviewer debate for the learning
sheet, then a similar pass for the test files. Output:
week1/1.learning-sheet.typ,
1.test.typ, 1.test.B.typ, and
1.validation.typ. For finer control, use the
smaller skills individually:
/write-learning-sheet,
/review-learning-sheet, /revise,
/write-tests, /review-tests.
Review before release
The single most important habit. AI can draft and mark quickly and confidently, and sometimes wrongly. Before pushing anything, read the bundle yourself and ask:
- Is the explanation correct and in the textbook's notation?
- Does the validation sheet actually prepare students for the test?
- Does the test only ask about concepts defined in the learning sheet — never a term introduced for the first time on test day?
- Are AI prompts in the learning sheet broad enough (frontiers and applications, not just deeper drills)?
- Have doubtful grading decisions been flagged for human review rather than guessed?
AI operates only on the production side. The instructor is the final approver on every learning sheet, test, and grade that reaches a student.
Build and publish
Build the site locally, preview it, and push. The included
Pages workflow republishes on every push to main
that touches .typ, .html,
config.toml, or the Makefile:
make build # compile PDFs and site
make serve # preview at http://localhost:8000
make compile-tests # compile test/validation PDFs
make dump-solutions # same, with solutions visible
git add week1 && git commit -m "week 1" && git push
/bootstrap tries to enable Pages automatically.
If not, in the repo open Settings → Pages and
set Source to GitHub Actions.
The weekly rhythm
Each subsequent week repeats the same loop. For week N:
> /generate-week N
> /revise N # interactive polish + test audit
make build
git add weekN && git commit -m "week N" && git push
The DSAA 3071 run used three contact hours per week:
- 0:00 – 0:30 — Closed-book test on the previous week's material.
- 0:30 – 2:30 — Self-paced study block. Students work in groups of about four; the instructor and TAs circulate and surface confusion. When a misconception is widespread, the instructor pauses for a short whole-room explanation.
- 2:30 – 2:50 — Discussion segment on conceptually heavy points or upcoming applications.
The new week's validation sheet is released immediately after the test — while the gap is fresh — with its answers two days later. That cadence is part of the design.
Grade submitted work
For a folder of student submissions (mixed PDF, JPG, DOCX):
> /grade-homework
> /homework-report
/grade-homework discovers submissions, confirms the
rubric against a teacher-provided solution document with point
allocations, and produces grades/grades.csv plus
per-student feedback — with explicit flags on items that need
human review. /homework-report then builds a
teacher-facing PDF showing each student's submission images
beside the per-question marks. Return tests fast enough that
feedback helps the next learning cycle.
Zulip integration
Zulip is an open-source chat platform with a first-class API and topic-threaded conversations. Those two properties make it uniquely suited for AI-agent workflows: bots can post, read, and react to messages programmatically, and the topic threading keeps automated posts neatly separated from human discussion. TDAA-Go uses Zulip as its optional delivery and feedback channel.
What you can do with it
- Scheduled material release. Learning sheets, validation-sheet answers, and test answers are posted to a course stream on a timetable you define — for example, releasing the validation answers two days after the test. A GitHub Actions cron job checks the schedule hourly and drips the right PDF at the right time, so students see a steady stream of materials without manual uploads.
- Homework submission by photo. Students snap a photo of their handwritten work and DM it to a course-specific bot — no file-naming conventions, no LMS upload forms. The bot collects every image in a per-student thread, ready for the instructor to pull.
-
AI-graded feedback delivery.
The instructor runs a single command
(
/zulip-mark-feedback N) that pulls submitted photos, grades them with AI against the rubric, and DMs per-student feedback back through the same bot. Students get individual, private feedback within hours instead of days.
Setup
1. Create the grading bot (one-time):
> /setup-zulip-grading
This creates a bot on your Zulip realm, writes .zuliprc
(gitignored) with its credentials, and bootstraps
coursedesign/roster.csv so submissions map to student IDs.
2. Enable scheduled releases (optional):
Set zulip-stream in config.toml and
add ZULIP_BOT_EMAIL, ZULIP_BOT_API_KEY,
and ZULIP_SITE as repo secrets. Then copy
coursedesign/release-schedule.example.json to
release-schedule.json and fill in dates and times.
The hourly release-materials.yml workflow handles
the rest. Leave zulip-stream empty to disable.
3. Grade and return feedback (per homework):
> /zulip-mark-feedback N
Pulls DMs into weekN/submissions/, delegates to
/grade-homework, optionally builds a teacher-facing
report, and previews the feedback messages before sending them.
Unlike most LMS platforms, Zulip's API is designed for bots and automation from the ground up. Any AI agent — not just TDAA-Go's built-in skills — can interact with students through the same channels: answering questions, posting announcements, or collecting submissions. The open-source, self-hostable nature means your data stays on your infrastructure, which matters for student privacy.