<Course Code> / <Course Name>
For instructors

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.

§ 01

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.

§ 02

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:

Read before continuing

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.

§ 03

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.

§ 04

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:

Nothing ships unreviewed

AI operates only on the production side. The instructor is the final approver on every learning sheet, test, and grade that reaches a student.

§ 05

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.

§ 06

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:

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.

§ 07

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.

§ 08

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

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.

Why Zulip?

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.