• v0.44.0 e020278e3e

    joeyr released this 2026-08-24 21:16:07 -05:00 | 75 commits to main since this release

    Canvas C5, half of it: get_discussion. Scheduled by use rather than by
    plan — a real session asked what a graded discussion required, and every tool on
    the tenant could say it was due on Friday and worth 2.5 points while none could
    say what it asked for. Two defects came out of building it, both shipped in
    0.43.0 and both silent.

    Added

    • get_discussion — a discussion's prompt, and for a graded one its due
      date and point value from the assignment object Canvas returns inline. It
      reads the PROMPT only: list_discussion_entries — every student's replies —
      stays declined, and this server still cannot post.

      It also hands over assignment_id, which is a different id from the
      topic's. That distinction is the reason the tool exists at all.

    • Every item that names a reader now hands over the id that reader takes.
      Module items carry assignment_id, topic_id or page_url beside
      opens_with; planner items carry assignment_id or topic_id.

    Fixed

    • list_modules named a tool and handed over an id that tool rejects. A
      module item has two ids — id is its place in the module, content_id is the
      thing it points at — and 0.43.0 emitted only the first while labelling
      Assignment items opens_with: get_assignment. Measured on two live courses:
      that id returns 404 from the assignments endpoint and content_id
      returns the assignment. Pages were unaffected, because page_url was added
      when the same trap was spotted there and nothing checked the other kinds.

      An item whose handle is missing now names no tool at all, rather than making a
      promise that 404s.

    • A module lock was reported as emptiness, in three different ways. Measured
      across all three courses on 2026-08-24, one condition and three behaviours:

      Tool What Canvas returns when locked What 0.43.0 said
      get_page body is null, reason in lock_explanation "This page exists but has no text in it… do not retry"
      get_assignment description is null, same an assignment with no instructions
      get_discussion message IS the lock notice, byte for byte (new tool — caught on its first live run)

      Twelve locked assignments and two locked pages on the account the day this was
      measured, so none of it was hypothetical. All three now carry locked and a
      stripped lock_explanation, and the notes distinguish "Canvas is withholding
      this" from "the instructor left it blank". A withheld discussion prompt comes
      back empty with prompt_withheld: true rather than as 155 characters of
      plausible prose in the field the instructions live in.

    Verified

    • Live pass 2026-08-24 through the tool layer, 35 checks, all green. The
      planner labels a discussion get_discussion and an assignment
      get_assignment; every module item's handle opens its own reader; the graded
      topic reports prompt_withheld with the module holding it named; and the call
      that started this — a topic id sent to get_assignment — still fails, which
      is correct, while the assignment_id the topic hands over succeeds.

    • probes/canvas_probe_c5.py holds the measurements the design rests on —
      gitignored like every other probe, so what it established is written down
      here, in CLAUDE.md and in the fixtures rather than only in the script.

    Downloads