Skip to content

GitHub assignment submission and public feedback

This page describes the earlier fourteen-week layout and is being rewritten; where it differs, the syllabus applies.

Use this guide to submit an assignment at a fixed commit, locate feedback and retry, practicing LO2, LO5 and LO9. Feedback is labeled public_only: it checks that the submission can be located and required files are present. It does not assess program correctness and is not a formal grade. The teaching team provides a GitHub submission repository containing only public student material and a reviewed checker. Do not request access to the instructor source repository. Use least privilege: the assignment repository should expose only the files and actions needed for your submission.

Create the submission, then verify it

  1. Fork the submission repository using the access route provided by the teaching team, then create submit/p1 in your own fork. Students have no write permission for the course submission repository; do not create branches there directly. For other assignments, use the announced submit/<assignment_id>. Submit one assignment per PR.
  2. Complete the code, verification evidence and independent reflection required by the lab. Follow Week 0 setup and your lab's launcher commands when executing agent-generated code, commands or dependency scripts. This public entry point reads data only and provides no alternative route for executing code.
  3. Maintain one artifact note in the repository-root README.md: locate the current assignment's artifact, verification results and short explanation, and assign the record an evidence ID. Add AI use once in that same record: either no AI use, or the tool/model and its purpose. You may reference an existing artifact note or compatible disclosure file by path and the same evidence ID, without copying its contents or submitting another disclosure file. README.md must be a nonempty regular file of at most 64 KiB, never a symbolic link. Redact attachments first. Do not include raw interviews, real names, credentials, instructor answers or hidden tests in the PR.
  4. Commit the verified submission files to the branch. Record the full 40-character commit SHA with git rev-parse HEAD, push to your own fork, and open a PR targeting the instructor-designated protected default branch of the submission repository. State the assignment ID, SHA and artifact-note evidence ID in the PR, without repeating the AI-use note. PR titles and bodies are for readers; the machine locates the submission using the GitHub event's head SHA.
  5. Open the PR's Course public feedback Actions run. First check that submission.commit_sha matches your submitted SHA. Then read the summary or download feedback.json from the public-feedback-* artifact. This template retains feedback for 7 days. For longer-term evidence, save a redacted file and reference it by ID.

For example, the artifact note can be these few lines. This is a course-created example; replace paths, commands and results with your actual records:

Evidence ID: p1-e1
Artifact: src/agent.py; this change stops the loop after a tool failure.
Verification: run P1's specified checks in the course launcher; record the command, expected and actual output, and reference the saved results.
Short explanation: the stop condition prevents repeated calls; the timeout boundary still needs testing.
AI-use note: no AI used.

If you used AI, replace the final line with the actual tool/model and purpose; follow the lab's red/yellow/green rules. Reflection written without AI may be included in the same note. Submit trajectories only when the lab explicitly specifies the learning objective, required excerpts and verification method. Generic conversation exports, commit trailers and additional reflection files are not required. When logs are not required, their absence does not trigger a request for more evidence or pending_human. The public entry point checks only the existence, type and size of README.md; the relevant lab's verification and human review check the artifact, evidence and note contents.

Later changes require a new commit and updates to the changed purposes and evidence in the same record. Feedback for a historical SHA describes only that submission; moving the branch does not replace the record. The formal submission is the full SHA collected by the instructor. Assignment rules determine deadlines and late submissions; the public entry point does not decide late penalties.

Reproduce the same check locally

Use the trusted public_check.py supplied by the teaching team, with Python 3.12.13 and Git, and keep it outside the student submission directory. github-event.json is a redacted copy of the same PR event, supplied through the teaching team's trusted entry point. Do not use a self-edited event as formal identity evidence. Your local Git clone must already contain the commit. This command reads Git objects only; it does not execute submission files:

python3 -I /path/to/course-tools/public_check.py \
  --event /path/to/github-event.json --repository course-org/submissions \
  --assignment p1 --expected-sha FULL_40_CHARACTER_COMMIT_SHA \
  --snapshot /path/to/student-clone --ledger /path/to/local-feedback.sqlite

Replace the paths, repository and SHA with actual values. Actions invokes the same script with the same options. The instructor template pins the checker's SHA-256; versions must match. The local and Actions feedback objects should be identical. delivery describes the first receipt (recorded) or a repeat (duplicate) in this ledger and is not part of the feedback contents or any grade. You retain the local ledger for debugging only; it cannot be submitted as the instructor's ledger or authoritative grading evidence.

Understand failures and retries

Exit code / state Meaning and next step
0 / accepted Commit located; the artifact-note entry README.md passes existence, type and size checks. Continue checking lab behavior and test evidence.
1 / checks_failed Inspect failed files in checks, fix them, commit and push again, then verify the new SHA.
2 / rejected The event format, repository, branch or SHA does not match, or Git cannot find the commit. Check the full SHA and event and contact a TA to collect it again.
3 / infrastructure_error A read, ledger or timeout failure. Keep the SHA; after the environment is repaired, an authorized person reruns Actions.
No feedback artifact Checkout or the base environment may have failed first. Inspect the failed run step and ask a TA to rerun it; absence of an artifact does not mean acceptance.

Retrying the same event in the same ledger retains one record. Failed feedback remains failed on retry; it does not turn into success or a student score of zero. Each Actions run uses a temporary ledger. A stable idempotency_id identifies repeats across runs; the teaching team deduplicates by that ID when collecting feedback, rather than counting several artifacts as several submissions. If a checker-version change causes a ledger conflict, the TA preserves old evidence and revalidates with a ledger for the new version, without manually editing old feedback.

GitHub student identification uses a repository-scoped student pseudonym derived from the numeric repository ID and PR author's numeric ID. Login names, real names and PR bodies are not written to feedback. A pseudonym can still be linked to a person; share feedback only within the course-authorized scope. For account changes or submissions on another person's behalf, TAs verify identities and membership records. This entry point does not infer individual contribution.

Formal grades

Labs provide practice and feedback. Selected evidence contributes to the portfolio or project under the current assessment rules. Formal scores require the registered grading unit and isolated runner, a trusted attestation, actual merging of the human-scored component and admission of its source. You can view and retain a valid component receipt without waiting for future assessments; future items remain missing rather than being entered as zero.

A local ledger, a green Actions check or JSON manually relabeled authoritative cannot be imported as a formal grade. If grading is not yet available or execution fails, wait for valid grading; the result is not recorded as zero.