• v0.42.0 99f78b1230

    joeyr released this 2026-08-24 18:13:36 -05:00 | 81 commits to main since this release

    Canvas C3: list_upcoming_assignments. One request answers "what is due" across
    every course, sorted by due date, with submission state attached. Seven tools.

    The filter is the phase, and the obvious implementation is wrong

    Filter on submissions, not on plannable_type. Canvas states whether an item counts
    toward a grade in the item itself — submissions is a dict of flags on anything gradeable
    and the literal false on anything else.

    Probe 10 returned 23 items: assignment ×14, discussion_topic ×5, announcement ×4 —
    and one of those five discussion topics is gradeable and carries a due date. A graded
    discussion is real coursework, so an allowlist of ("assignment", "quiz") reports fifteen
    items as fourteen, silently.

    The trap the plan predicted was quizzes, and a different instance of the same class fired
    instead.
    No quiz item appeared in the window at all — so a type allowlist would have
    looked perfectly correct that day and broken the first week a quiz was set.

    Added

    • start_date / end_date go to Canvas, proved server-side with a window containing
      nothing that returned zero items rather than everything.
    • Sorted by due_at with undated items last. Canvas orders by plannable_date, which
      is a sort key rather than a deadline.
    • non_coursework_ignored is reported — "nothing is due" and "the planner held four
      announcements and no work" are different facts.

    Changed

    • The planner's submission shape is reconciled with C2's by OMISSION rather than nulls.
      It carries no score; an absent key says "this tool does not answer that", while a null one
      reads as "not graded yet".

    Corrected

    • The 0.29 planner cost recorded earlier was for ten items. Twenty-three cost 1.138, so
      the honest margin over the fan-out is about 2x, not 5x.

    All six new guards proved by breaking them, including filtering by plannable_type the
    obvious way.

    1374 tests green.

    Downloads