Agent skill

Canvas Scan

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

A skill your agent uses when the student asks what Canvas work is pending or wants a homework plan.

AGPL-3.0Auto-check: notes

Install Canvas Scan

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

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

GitHub CLI
$ gh skill install X-isdoingreat/canvas-pilot canvas-scan --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-scan .claude/skills/canvas-scan && 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-scan
GitHub stars
125
Token cost
~2.6k tokens
SKILL.md length
1,286 words
Files
1
Skills in repo
32
Repo updated
First seen
Licence
AGPL-3.0

At a glance

A skill your agent uses when the student asks what Canvas work is pending or wants a homework plan.

  • Works in 9 steps: Setup and route gate → One enriched Canvas process → Fail loudly on an incomplete scan → …
  • The student asks what Canvas work is pending
  • SKILL.md covers Hard boundary, Phase 0: Setup and route gate, Phase 1: One enriched Canvas… and Phase 2: Fail loudly on an…, plus 7 more sections
  • Calls python

What it does

Canvas Scan is an agent skill from X-isdoingreat/canvas-pilot. Use when the student asks what Canvas work is pending or wants a homework plan. It performs one enriched read-only scan, writes the atomic assignment snapshot and approval plan, renders the plan, and stops without drafting or submitting anything.

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

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

  • The student asks what Canvas work is pending
  • Wants a homework plan

Example prompts

  • “/canvas-scan”

Requirements

  • Python 3

Workflow steps

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

  1. Setup and route gate
  2. One enriched Canvas process
  3. Fail loudly on an incomplete scan
  4. Normalize and fail closed
  5. Deduplicate completed work
  6. Use enriched buckets without refetching
  7. Write both state artifacts atomically
  8. Render the student plan
  9. Hard stop

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 Scan loads about 2.6k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 1,286 words of instructions outside code blocks.

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

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: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:25
    1. If `.env` is missing or the Canvas host/auth configuration is incomplete,

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,286 words, ~2,561 tokens.

Download SKILL.mdSave it as .claude/skills/canvas-scan/SKILL.md (or your agent's skills folder).
name
canvas-scan
description
Use when the student asks what Canvas work is pending or wants a homework plan. It performs one enriched read-only scan, writes the atomic assignment snapshot and approval plan, renders the plan, and stops without drafting or submitting anything.

Canvas Scan

Scan is proposal only. It reads current Canvas state, creates a reviewable plan, and stops. The next user message is the architectural approval boundary.

Hard boundary

  • MUST NOT execute or draft an assignment.
  • MUST NOT dispatch a course skill or canvas-execute.
  • MUST NOT write a per-assignment result.json or REPORT.md.
  • MUST NOT create .scan_in_progress.
  • MUST NOT upload, submit, or start/answer/complete a quiz.
  • MUST NOT interpret authentication as work approval.
  • MUST stop after rendering the plan. Never “helpfully” begin an urgent item.

Phase 0: Setup and route gate

Read local setup state before touching Canvas.

  1. If .env is missing or the Canvas host/auth configuration is incomplete, hand off to canvas-setup and stop this scan when setup returns.

  2. Read courses.yaml. Treat missing routes, routes: null, an empty mapping, and effectively all-commented routes as empty.

  3. If routes are empty, hand off to canvas-skill-opportunity with this intent:

    Inspect recurring candidates read-only, inspect representative real specs and safe feedback-policy evidence, make a qualitative recommendation, write the private opportunity report, and stop for the student's numbered choice.

    Stop when opportunity analysis returns. Do not scan assignments and do not call canvas-bootstrap in the same turn. The student first chooses a candidate; a later Bootstrap invocation verifies it and creates one route.

  4. Only non-empty usable routes proceed to the scan.

Phase 1: One enriched Canvas process

Run exactly one interactive scan command:

powershell
python -m src.router --scan-json

This single process owns connection/auth recovery, routed-course assignment listing, pending-window filtering, live submission reads (get_submission), due-time calculation, urgency buckets, unsupported-submission classification, and quiz LockDown metadata checks. It reuses one Canvas/browser session. The router delegates normalization/output safety to the shared src.scan_service and route resolver; this skill consumes those outputs rather than reimplementing their rules.

Do not restore the old interactive sequence of python -m src.canvas_client --probe, python -m src.router --dry-run, and separate per-item live-state calls. Those commands may remain for setup, cron, or debugging, but they are not the student-facing scan path.

Read runs/<today>/scan.json; do not reconstruct the payload from terminal prose. Expected top-level fields are:

json
{
  "generated_at": "<ISO local time>",
  "now_utc": "<ISO UTC time>",
  "items": [],
  "course_errors": []
}

Each item must already include the identifiers and display fields needed by the state protocol plus:

  • canonical skill from src.routes.resolve_skill(route, assignment);
  • live_state;
  • hours_left;
  • bucket;
  • supported/unsupported classification;
  • LockDown result or an explicit check failure.

Scan consumes the canonical canvas-* name emitted by the shared route resolver. Never embed or guess a legacy alias table in this skill.

Phase 2: Fail loudly on an incomplete scan

Handle command-level errors before writing any approval artifact:

Error classBehavior
not configuredhand off to setup and stop
authenticationexplain that Canvas needs login, offer one browser retry, then stop on failure
network/browserexplain the connection problem, do not retry silently more than once
unknownshow a short sanitized detail and stop

Do not write or replace assignments.json or plan.json after a non-zero scan.

Treat a non-empty course_errors array as an incomplete scan even if the process exited zero. Name the affected course aliases, explain that the plan would be partial, and stop without replacing the prior approval plan. Do not hide a failed course in a “successful” plan. A later explicit product feature may authorize partial planning; ordinary scan does not.

Per-item live-state or LockDown lookup failures are different: the item remains visible with live_state: "unknown" or an explicit check-failed field, and the plan renders ?. A failed safety classification must never be treated as proof that an item is safe to mutate.

Phase 3: Normalize and fail closed

Validate scan.json before deduplication:

  • top level is an object and items/course_errors are lists;
  • every item has one stable course/assignment identity;
  • no duplicate identity appears;
  • live_state and bucket are in their documented enums;
  • route skill is a canonical canvas-* name;
  • dates and numeric fields are either valid or explicitly unknown.

Unsupported delivery types (for example on-paper work or an unsupported external tool) must be canonicalized to canvas-skip with a reason, never routed as ordinary draft work. LockDown-confirmed quizzes also route to canvas-skip. When LockDown status could not be checked, retain the item with a loud caveat; the quiz skill must re-check and fail closed before any attempt.

Phase 4: Deduplicate completed work

Use both layers:

  1. Same-day result — derive the work directory using the shared run-state identity helper. Its stable shape is course-<course_id>__assignment-<assignment_id>; never recompute a directory from mutable course or assignment names. A valid result with terminal status draft_ready, submitted, or skipped means the item was handled today.
  2. Cross-day ledger — read runs/_processed.json. Skip a matching terminal entry completed close enough to its due time to represent this assignment.

Exception: any ledger/result entry with deferred_to_next_run: true re-enters the plan. This is how skip, cancel, an explicit defer, and crash recovery get another approval opportunity.

Live Canvas state is defense in depth. Exclude confirmed submitted, graded, or pending_review items from new work even if local state drifted. Preserve unknown rather than inventing a submitted state.

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

Phase 5: Use enriched buckets without refetching

Copy the single-process values; do not recompute or refetch them:

BucketMeaning
overduedue time passed and live state confirms not submitted
urgentdue within 72 hours, including uncertain past-due state
soondue within 7 days after the urgent window
lateroutside 7 days only when configured pending window includes it
unknownmissing/unparseable due time

Sort by overdue, urgent, soon, later, unknown, then by hours_left ascending with unknown last. Assign stable 1-based indices after all filters.

Phase 6: Write both state artifacts atomically

If no items survive, say there is no pending work in the configured window and stop. Do not create an empty approval plan.

First materialize runs/<today>/assignments.json from the final normalized, deduplicated items. This snapshot is what execute and the Stop guard share; it must not be a stale --dry-run file. Include the canonical skill, identity, name, due time, delivery types, points, URLs needed by the course skill, enriched live state/bucket, skip reason, and a deterministic work-dir field when the shared runtime provides one. Materialize it with src.run_state.stable_work_dir(run_dir, course_id, assignment_id) so scan, execute, finalize, and the Stop guard use the exact same ID-based directory.

Then write runs/<today>/plan.json:

json
{
  "generated_at": "<ISO local time>",
  "expires_at": "<generated_at + 24 hours>",
  "items": [
    {
      "index": 1,
      "bucket": "urgent",
      "course_id": "<local-only>",
      "course_name": "<local-only>",
      "assignment_id": "<local-only>",
      "assignment_name": "Example Assignment",
      "due_at": "<ISO time>",
      "hours_left": 18.5,
      "live_state": "unsubmitted",
      "proposed_skill": "canvas-example",
      "user_decision": null
    }
  ]
}

Every plan item must map one-to-one to an assignments snapshot item by course and assignment identity. Every user_decision starts null; prior decisions must not leak into a fresh scan.

Write each JSON file to a sibling .tmp, parse and validate the temporary content, then commit with os.replace. Commit the snapshot first and the plan second. If either write fails, do not present an approval prompt; remove only the temporary file and keep the last known-good artifacts.

Phase 7: Render the student plan

Use the student's language. Always show:

  • due within 3 days (including overdue at the top);
  • due within 7 days;
  • item index, recognizable course label, assignment name, due time, and live submitted state (done, no, or ?);
  • a small “manual/can't do” list for items routed to canvas-skip;
  • one suggested starting item when at least one is draft-capable.

Prefer a private friendly course alias when configured. Do not show route names, internal paths, plan expiry, implementation details, or bucket emojis.

End with exactly one simple approval hint:

text
Reply all, numbers like 1,3, or skip.

This hint documents selection only. It does not imply submission or quiz authority.

Phase 8: Hard stop

After rendering, stop the turn. At this point verify:

  • assignments.json and plan.json are valid and mutually consistent;
  • every plan decision is null;
  • no marker exists;
  • no result, report, draft, upload, submission, or quiz attempt was created;
  • no course skill was handed off.

The student's next message may be parsed by canvas-execute. Scan itself never crosses that boundary.

Real source-of-truth rule

Assignment names and Canvas descriptions are routing hints, not reliable full specifications. Scan never guesses task requirements or drafts from them. Approved course skills must follow the front page, modules, attachments, linked pages, files, and external sources to the real specification at execution time.

© 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

Just SKILL.md in .agents/skills/canvas-scan of X-isdoingreat/canvas-pilot.

Open the folder on GitHubat commit 6b79d5b

Compare with similar skills

Canvas Scan 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 Scan compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Canvas Scan this skillX-isdoingreat/canvas-pilot125—~2.6kAutomated safety check: NotesAGPL-3.0
Manim Video Productionbrowser-use/video-use29k6 repos~3kAutomated safety check: PassMIT
Logseq Review Workflow Evallogseq/logseq45k—~1kAutomated safety check: PassAGPL-3.0
Baoyu URL To Markdownsdyckjq-lab/llm-wiki-skill2.5k2 repos~3.2kAutomated safety check: PassNone
DeepTutor CLIHKUDS/DeepTutor41k—~2.8kAutomated safety check: PassApache-2.0
Obsidian CLIAtmosphere/atmosphere3.8k13 repos~795Automated safety check: PassApache-2.0

Similar skills

  • Manim Video Production

    browser-use/video-use

    Produces math and technical explainer videos with Manim Community Edition: concept animations, equation derivations, algorithm walkthroughs and data stories.

    29k GitHub starsUsed in 6 repos~3k tokens
    Media & CreativeAuto-check passed
  • Compare two revisions of the Logseq logseq-review-workflow skill by running the same review prompt against isolated before and after skill snapshots, collecting both outputs, and producing a…

    45k GitHub stars~1k tokensUpdated today
    Knowledge ManagementAuto-check passed
  • Baoyu URL To Markdown

    sdyckjq-lab/llm-wiki-skill

    Fetch any URL and convert to markdown using Chrome CDP. An agent skill from sdyckjq-lab/llm-wiki-skill.

    2.5k GitHub starsUsed in 2 repos~3.2k tokens
    Knowledge ManagementAuto-check passed
  • 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 3 days ago
    EducationAuto-check passed
  • Obsidian CLI

    Atmosphere/atmosphere

    Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more.

    3.8k GitHub starsUsed in 13 repos~795 tokens
    Knowledge ManagementAuto-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.

    67k GitHub stars~2k tokensUpdated today
    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

Questions about Canvas Scan

What does Canvas Scan do?

A skill your agent uses when the student asks what Canvas work is pending or wants a homework plan. Canvas Scan is an agent skill from X-isdoingreat/canvas-pilot. Use when the student asks what Canvas work is pending or wants a homework plan.

When should I use Canvas Scan?

Canvas Scan fits situations like: the student asks what Canvas work is pending; wants a homework plan.

How do I install Canvas Scan in Claude Code?

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

How do I install Canvas Scan in Codex?

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

Can I use Canvas Scan 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-scan -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-scan, .gemini/skills/canvas-scan, .github/skills/canvas-scan and .opencode/skills/canvas-scan in your project.

What does Canvas Scan need to run?

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

Does Canvas Scan 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 Scan safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Canvas Scan use?

Canvas Scan 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 Scan use?

About 2.6k tokens (SKILL.md is roughly 10k 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 Scan?

Skills that share tags, products or a category with Canvas Scan: Manim Video Production (browser-use/video-use, 29k stars), Logseq Review Workflow Eval (logseq/logseq, 45k stars), Baoyu URL To Markdown (sdyckjq-lab/llm-wiki-skill, 2.5k stars) and DeepTutor CLI (HKUDS/DeepTutor, 41k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Canvas Scan?

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.