Agent skill

Canvas Submit

by X-isdoingreat in X-isdoingreat/canvas-pilot

Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.

AGPL-3.0Auto-check passedEducation

Install Canvas Submit

skills CLI
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install X-isdoingreat/canvas-pilot canvas-submit --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/canvas-submit .claude/skills/canvas-submit && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
canvas-submit
GitHub stars
125
Token cost
~2.7k tokens
SKILL.md length
1,205 words
Files
2
Skills in repo
32
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.

  • Works in 8 steps: Enforce the later-message boundary → Bind the current plan target → Require a verified ordinary-assignment… → …
  • Education work in your project
  • SKILL.md covers 1. Enforce the later-message…, 2. Bind the current plan target, 3. Require a verified… and 4. Issue one exact signed…, plus 4 more sections
  • Calls python

What it does

Canvas Submit is an agent skill from X-isdoingreat/canvas-pilot. Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item. Create one scoped receipt, perform only that mutation, verify Canvas read-back, and write the canonical result. Reject broad, automatic, ambiguous, or hypothetical requests.

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).

It sits in Education. The repository describes itself as: Local-first Canvas LMS AI agent that learns each course's recurring assignment workflow and reuses it through scan - approval - execute with student review. The licence is AGPL-3.0.

When your agent uses it

  • Education work in your project

Example prompts

  • “/canvas-submit”

Requirements

  • Python 3

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Enforce the later-message boundary
  2. Bind the current plan target
  3. Require a verified ordinary-assignment draft
  4. Issue one exact signed receipt
  5. Dispatch one ordinary submission
  6. Hand Classic Quiz work to canvas-inside
  7. Write only evidence-backed results
  8. Close out narrowly

What it can do on your machine

Read from SKILL.md and the folder at commit 6b79d5b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • python

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Canvas Submit loads about 2.7k tokens when it runs. Until then it costs about 81 tokens; SKILL.md has 1,205 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~81
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from X-isdoingreat/canvas-pilot at commit 6b79d5b, republished under its AGPL-3.0 licence (© X-isdoingreat). 1,205 words, ~2,670 tokens.

Download SKILL.mdSave it as .claude/skills/canvas-submit/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
canvas-submit
description
Use only for a separate exact later-message Canvas command (`submit N`, `take quiz N`, or `retake quiz N`) for one current approved item. Create one scoped receipt, perform only that mutation, verify Canvas read-back, and write the canonical result. Reject broad, automatic, ambiguous, or hypothetical requests.

canvas-submit

Perform one explicitly authorized Canvas mutation after the scan, approval, and draft boundary. This skill is the interactive submit entry point; neither canvas-scan, canvas-execute, nor a course drafting skill may invoke it on the user's behalf.

1. Enforce the later-message boundary

Use the raw text of the current user message. Never reconstruct authority from an earlier message, quoted text, a plan decision, an overlay, a schedule, or the agent's own recommendation.

Pass the complete current message to src.mutation_approval.parse_mutation_command. Accept only one whole expression recognized by that parser:

  • submit N or 提交第N项 for one ordinary assignment;
  • take quiz N, 参加测验第N项, or 做测验第N项 for one first quiz attempt;
  • retake quiz N, 重做测验第N项, or 重考测验第N项 for one explicitly authorized retake.

Outer whitespace may be retained, but no other prose is allowed. Reject submit all, approve all, please submit 1, submit 1 and 2, take quiz 1 now, hypotheticals, and any command copied from a prior turn. One message authorizes at most one indexed target. Never translate a vague request into an accepted command.

Plan approval is not submission authority. approve 1, all, do 1, and a plan.json decision may authorize drafting through canvas-execute, but they must never mint or substitute for a mutation receipt. This skill is not an automatic-submit or cron workflow.

2. Bind the current plan target

Use only the run directory associated with the current scan presented in this conversation. Require its non-expired plan.json and matching assignments.json; do not search older run directories for a convenient target. Validate them with src.run_state.validate_plan_assignments(..., run_dir=run_dir, require_current=True).

The requested index must resolve to one contiguous 1-based plan item whose user_decision is approve or swap:canvas-*, and that item must have a one-to-one snapshot match. If the plan is absent, stale, unapproved, or inconsistent, stop and require a fresh scan/approval. Never repair plan state inside this skill.

Derive the only allowed work directory from immutable IDs:

python
from src.run_state import stable_work_dir

work_dir = stable_work_dir(run_dir, course_id, assignment_id)

It must be named course-<course_id>__assignment-<assignment_id>. Never use a course name, assignment name, slug, or arbitrary path as identity.

3. Require a verified ordinary-assignment draft

For submit N, perform this local fail-closed preflight before issuing a receipt:

  1. Require <work_dir>/result.json to exist.
  2. Load it and call src.run_state.validate_result(result, root=Path.cwd(), work_dir=work_dir); do not trust a status string without validation.
  3. Require the validated status to be exactly draft_ready.
  4. Require the resolved draft_path to be substantive and contained inside the stable work directory. Never submit a path supplied only in chat.
  5. Call src.run_state.validate_verification_log on the verification evidence selected by the result contract. It must contain at least one PASS line, no FAIL line, and no unresolved placeholder/skeleton sentinel.
  6. Confirm the result, plan item, snapshot, course ID, assignment ID, and intended payload all refer to the same target.

A missing draft, directory escape, error/skipped result, failed verification, or ambiguous payload must stop before Canvas mutation. Do not regenerate, edit, or silently replace the draft in this skill; return to the responsible course skill instead.

Quiz commands do not use this ordinary-draft gate. Their read-only reading, notes, arbitration, pacing, and mutation gates remain owned by canvas-inside.

4. Issue one exact signed receipt

After the applicable local preflight, call src.mutation_approval.issue_interactive_authorization with:

  • the exact current run_dir;
  • the configured origin from src.canvas_client.BASE, never a URL invented from chat;
  • user_text equal to the verbatim current user message;
  • the default protected local signing key and current Codex thread/session.

The helper repeats current-plan validation, derives the exact target/actions, and writes these private artifacts below the stable work directory:

text
mutation_authority.json
mutation_authorization.json

Use synthetic_qa=True only inside an independently verified, isolated local QA Canvas. It is always false for a real Canvas origin. Do not print, copy, publish, broaden, refresh, or hand-edit a receipt. A receipt for one course, assignment/quiz, origin, session, or action cannot authorize another.

If authorization issuance fails, stop without mutation. Receipt issuance by itself is not receipt consumption.

Show full SKILL.md (575 more words)Show less

5. Dispatch one ordinary submission

Load <work_dir>/mutation_authorization.json with src.authorization.load_authorization_receipt and pass that same receipt to every write. Select one payload mode from the validated snapshot:

Canvas submission typeExact receipt action(s)Required canonical payloadAllowed wrapper
online_text_entryassignment.submit_textone non-empty UTF-8 text draftsrc.canvas_submit_origin.submit_text_with_view
online_uploadassignment.upload_init, assignment.upload_blob, assignment.submit_filesthe draft file, or an explicit ordered metadata.submission_files list fully contained below work_dirsrc.canvas_submit_origin.upload_and_submit_files_with_view
online_urlassignment.submit_urlone spec-verified HTTP(S) URL from the canonical draft metadata/artifactsrc.canvas_submit_origin.submit_url_with_view
online_quizquiz-scoped actions onlyno ordinary payloadhand off to canvas-inside as described below

When the snapshot declares several supported types, require result.metadata.submission_type to choose exactly one declared mode. Do not pick the first type, submit the same artifact through multiple modes, glob a directory, extract text from a binary document, or infer extra attachments. Unsupported types such as external_tool, on_paper, and proctored delivery are not made submit-capable by the user's command.

For file and text submissions, the receipt-aware python -m scripts.submit_canvas CLI is an allowed adapter, but use only its single-target mode with --authorization-receipt. Never use --batch-manifest from this skill. The direct src.canvas_submit_origin wrappers are preferred because they return the authoritative read-back object. If the CLI is used, require exit code 0 and perform a fresh read-only Canvas submission read-back before writing the result.

Never call cv.submit_text, cv.submit_files, cv.submit_url, cv.upload_submission_file, or raw Canvas mutation endpoints here. The origin wrappers must perform the pre-read, pass the exact receipt through each write, and read the submission back after the write.

6. Hand Classic Quiz work to canvas-inside

For take quiz N or retake quiz N, require the snapshot to declare only online_quiz, include the exact quiz_id, and route to canvas-inside. Provide its native Codex skill handoff with:

text
run_dir=<current run directory>
work_dir=<stable ID-based work directory>
course_id=<exact snapshot course ID>
assignment_id=<exact snapshot assignment ID>
quiz_id=<exact snapshot quiz ID>
authorization_receipt_path=<work_dir>/mutation_authorization.json
mutation_operation=quiz_take|quiz_retake

The first-attempt receipt must not contain quiz.retake. Only the exact retake quiz N command may issue that action. Do not start, answer, complete, or retake the quiz inline in this skill. canvas-inside must validate the receipt, bind its quiz evidence to this work directory/session/attempt, perform Canvas read-back, finalize receipt usage when required, and write the quiz result.json. After the handoff, validate that result with src.run_state.validate_result before reporting success.

7. Write only evidence-backed results

For an ordinary successful mutation, require the read-back to contain workflow_state of submitted or graded and a real submitted_at. Require src.authorization.authorization_usage_status(receipt) to show the matching terminal assignment action before claiming consumption. Then atomically replace <work_dir>/result.json with src.run_state.write_result, preserving the verified draft path and at least these fields:

json
{
  "status": "submitted",
  "draft_path": "<existing verified draft>",
  "submitted_at": "<Canvas read-back timestamp>",
  "authorization_receipt_id": "<exact receipt id>",
  "authorization_consumed": true,
  "metadata": {
    "skill": "canvas-submit",
    "submission_type": "<selected declared type>",
    "canvas_workflow_state": "submitted",
    "readback_verified": true,
    "attempt": 1,
    "verification_log_path": "<existing PASS log>"
  },
  "notes": "Canvas submission verified by read-back."
}

Copy actual read-back values; the example values are not defaults. Preserve attachment metadata when Canvas returns it. Never write submitted from an HTTP success alone, a CLI exit code alone, an upload response, or an agent claim.

If the wrapper raises src.canvas_submit_origin.AlreadySubmitted, call existing_submission_result and atomically write canonical status=submitted, reason_code=already_submitted using the live read-back. This branch is read-only: omit authorization_receipt_id, omit authorization_consumed, and never claim the newly issued receipt was used.

For an authorization, network, mutation, or read-back failure, do not retry automatically and do not claim submission. Preserve the draft and write an honest canonical error result with the concrete failure evidence. If a write outcome is uncertain, perform a read-only Canvas check; report submitted only when that read-back proves it.

8. Close out narrowly

Report only the selected item, Canvas workflow state, attempt, submitted time, and whether read-back proved success. Do not expose the signed receipt, authority record, private origin/token, course identity, or unrelated plan items. Do not initiate another target, a retake, or a second attempt without a new exact later-message command.

© X-isdoingreat, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .agents/skills/canvas-submit of X-isdoingreat/canvas-pilot.

  • SKILL.md
  • agents/openai.yaml

Open the folder on GitHubat commit 6b79d5b

Compare with similar skills

Canvas Submit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Canvas Submit compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Canvas Submit this skillX-isdoingreat/canvas-pilot125—~2.7kAutomated safety check: PassAGPL-3.0
DeepTutor CLIHKUDS/DeepTutor41k—~2.8kAutomated safety check: PassApache-2.0
AI Engineering Placement Quizrohitg00/ai-engineering-from-scratch66k—~2kAutomated safety check: PassMIT
Deep Reading Analystginobefun/deep-reading-analyst-skill3534 repos~3.6kAutomated safety check: PassMIT
OpenMAIC Setup and ExtensionTHU-MAIC/OpenMAIC40k—~1.7kAutomated safety check: NotesMIT
Codebase to Coursezarazhangrui/codebase-to-course5.7k—~4.4kAutomated safety check: PassNone

Similar skills

  • DeepTutor CLI

    HKUDS/DeepTutor

    Teaches the agent to set up and run DeepTutor from the command line: chat and capabilities, knowledge bases, partners, memory, sessions, notebooks and the server or Web app.

    41k GitHub stars~2.8k tokensUpdated yesterday
    EducationAuto-check passed
  • AI Engineering Placement Quiz

    rohitg00/ai-engineering-from-scratch

    Runs a 10-question quiz across five areas to place a learner in the AI Engineering from Scratch curriculum, so they skip what they already know.

    66k GitHub stars~2k tokensUpdated today
    EducationAuto-check passed
  • Deep Reading Analyst

    ginobefun/deep-reading-analyst-skill

    Comprehensive framework for deep analysis of articles, papers, and long-form content using 10+ thinking models (SCQA, 5W2H, critical thinking, inversion, mental models, first principles, systems…

    353 GitHub starsUsed in 4 repos~3.6k tokens
    EducationAuto-check passed
  • Guides setup, classroom generation and secondary development for OpenMAIC, the multi-agent interactive classroom, one confirmed phase at a time.

    40k GitHub stars~1.7k tokensUpdated today
    EducationAuto-check: notes
  • Codebase to Course

    zarazhangrui/codebase-to-course

    Turns a codebase into an interactive single-page HTML course for non-technical learners, with scroll modules, animated diagrams, quizzes and plain-English code translations.

    5.7k GitHub stars~4.4k tokensUpdated 6 mo ago
    EducationAuto-check passed
  • Zhang Xuefeng Perspective

    alchaincyf/zhangxuefeng-skill

    Answers education and career questions in the voice of Zhang Xuefeng, looking up current employment and admissions data before giving a direct verdict.

    10k GitHub stars~2.6k tokensUpdated 1 mo ago
    EducationAuto-check passed

More from X-isdoingreat/canvas-pilot

All 32 skills in this repo
  • Daily Work Tweet

    X-isdoingreat/canvas-pilot

    A skill your agent uses when verified work from today or another day should become an X/Twitter post, build-in-public update, ship log, or bilingual draft.

    125 GitHub stars~1.6k tokensUpdated 2 mo ago
    Auto-check passed
  • Canvas Awkward Syntax

    X-isdoingreat/canvas-pilot

    A skill your agent uses when a short local academic draft needs role-aware syntax diversification while preserving meaning, locks, source grounding, rubric-critical openings, and document structure.

    125 GitHub stars~2k tokensUpdated 2 mo ago
    Auto-check passed
  • Canvas Cron

    X-isdoingreat/canvas-pilot

    A skill your agent uses when managing Canvas Pilot schedules: install, inspect, pause, change, delete, or safely test scheduled scans and runs.

    125 GitHub stars~2.1k tokensUpdated 2 mo ago
    Auto-check: notes
  • Canvas Essay

    X-isdoingreat/canvas-pilot

    A skill your agent uses for an approved long academic-writing assignment routed by canvas-execute after the deterministic writing router selects essay.

    125 GitHub stars~2.2k tokensUpdated 2 mo ago
    Auto-check passed
  • Canvas Generic

    X-isdoingreat/canvas-pilot

    A skill your agent uses for an approved Canvas assignment that no specialized course skill can handle.

    125 GitHub stars~2.4k tokensUpdated 2 mo ago
    Auto-check passed
  • Canvas Humanizer

    X-isdoingreat/canvas-pilot

    A skill your agent uses when a local academic draft needs a meaning-preserving humanizing pass with less uniform syntax while retaining rubric, source, lock, voice, and length constraints.

    125 GitHub stars~1.8k tokensUpdated 2 mo ago
    Auto-check passed

Categories

Questions about Canvas Submit

What does Canvas Submit do?

Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item. Canvas Submit is an agent skill from X-isdoingreat/canvas-pilot. Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.

When should I use Canvas Submit?

Canvas Submit fits situations like: education work in your project.

How do I install Canvas Submit in Claude Code?

Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a claude-code`. Or copy the skill folder (.agents/skills/canvas-submit in X-isdoingreat/canvas-pilot) into .claude/skills/canvas-submit in your project. Claude Code loads it when a task matches its description.

How do I install Canvas Submit in Codex?

Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a codex`. Or copy the skill folder (.agents/skills/canvas-submit in X-isdoingreat/canvas-pilot) into .agents/skills/canvas-submit in your project. Codex loads it when a task matches its description.

Can I use Canvas Submit in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas-submit, .gemini/skills/canvas-submit, .github/skills/canvas-submit and .opencode/skills/canvas-submit in your project.

What does Canvas Submit need to run?

Going by SKILL.md and its folder, Canvas Submit needs the command-line tools its instructions call (python). Our summary lists: Python 3.

Does Canvas Submit access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Canvas Submit safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Canvas Submit use?

Canvas Submit is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Canvas Submit use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Canvas Submit?

Skills that share tags, products or a category with Canvas Submit: DeepTutor CLI (HKUDS/DeepTutor, 41k stars), AI Engineering Placement Quiz (rohitg00/ai-engineering-from-scratch, 66k stars), Deep Reading Analyst (ginobefun/deep-reading-analyst-skill, 353 stars) and OpenMAIC Setup and Extension (THU-MAIC/OpenMAIC, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Canvas Submit?

X-isdoingreat (a GitHub user) maintains it in X-isdoingreat/canvas-pilot, which has 125 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on July 31, 2026.

Source: X-isdoingreat/canvas-pilot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.