Upgrade notes
Notes for anyone upgrading a workflow, or an instructor repository, from an earlier GrillMyCode release. Newest changes first.
GitHub Models was discontinued
GitHub permanently discontinued GitHub Models, so the endpoint GrillMyCode called no longer exists. This affects every version of GrillMyCode that offered ai_provider: 'github-models' — there is no configuration or token that will bring it back.
Current versions of GrillMyCode fail immediately with a message pointing here if a workflow still sets ai_provider: 'github-models'.
To migrate, update your workflow as follows:
- Create an OpenRouter API key — sign up at openrouter.ai, add a small prepaid balance, and generate a key at openrouter.ai/keys.
- Store it as a secret — add it as an organization-level Actions secret named
OPENROUTER_API_KEYso all student repositories inherit it. - Update the workflow — remove
ai_provider: 'github-models'(or set it to'openrouter', which is now the default), replace theai_modelvalue with an OpenRouterprovider/model-nameidentifier, and addapi_key.
permissions:
contents: write
issues: write
steps:
- uses: NSCC-ITC-Assessment/GrillMyCode@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- ai_provider: 'github-models'
- ai_model: 'gpt-4.1'
+ ai_model: 'google/gemini-3.5-flash-lite'
+ api_key: ${{ secrets.OPENROUTER_API_KEY }}
The main practical difference is cost: GitHub Models was free within your GitHub quota, whereas OpenRouter bills per token. The recommended models are typically well under one cent per assessment, so a small prepaid balance covers a full class for a semester.
Workflows no longer need the models: read permission either. It is not used by anything, and can be removed from the permissions: block.
Already have an instructor PAT?
Tokens created before the workflow scope became a requirement need updating. Every delivery now
rewrites .github/workflows/generate-lms-quiz.yml when the action ships a newer copy, and GitHub
refuses any write under .github/workflows/ from a token without that scope — so a repo-only
token produces a Could not update .github/workflows/generate-lms-quiz.yml … warning on every
student push, and the instructor repository stays on its original quiz-generation code.
Assessments are still delivered — the sync warns rather than fails — but the fixes never arrive.
To fix it, edit the existing classic token (Settings → Developer settings → Tokens (classic) →
your token → Regenerate/Edit) and tick workflow alongside repo, or add
Workflows: Read and Write to a fine-grained token. Update the INSTRUCTOR_REPO_TOKEN org
secret if regenerating produced a new value.
Instructor repository naming (upgrading from 1.2.8 or earlier)
Earlier releases named the instructor repository after the assignment's template repository when GitHub reported one, and could file an assessment under whoever pushed or started the run. Assessments now go to <classroom>-<assignment>-grillmycode-instructor. Any instructor repositories named after a template, or after a whole student repository (…-jsmith-grillmycode-instructor), are no longer written to and can be deleted once you have kept what you need from them.
The first run after an upgrade regenerates every student's quiz
Expected, once. The quiz workflow decides what to rebuild by comparing a content hash stored inside
each .imscc and .csv. A repository that has just received an updated workflow has no current hashes on
file, so a single run rebuilds the package for every student, serialized by the workflow's
concurrency group. For a class of thirty that is a long run, not a broken one — subsequent pushes
go back to rebuilding only the student who pushed.
An older instructor repository has two quiz workflows
Repositories created before the workflow was renamed still contain
.github/workflows/generate-brightspace-quizzes.yml alongside the generate-lms-quiz.yml the sync
now adds. The sync never deletes files, so the old one stays.
It is harmless where it sits — it has no push: trigger, so it never runs on its own (which is why
those repositories generated nothing on a student push before the sync existed). Dispatching it by
hand from the Actions tab, though, runs the old generator without any of the current fixes. Delete
it from the repository if you would rather not have it there; nothing in the action re-creates it.