Skip to content

Roadmap: returning-agent handoff and sequenced assessment work #31

Open

Description

@rabesss

Returning-agent execution map

Prepared 2026-09-22. This is the starting point for the next agent, not a new feature implementation. Read this issue, then only the selected work item's handoff. Older PR discussions are historical evidence, not a fresh discovery queue.

Verified baseline

Work State Exact head / next issue
#30 quality toolchain Open, three required CI jobs fail chore/agent-readiness-toolchain, f855ce3c7e39f1acd5afb71ed110c125bd03b928; #32
#28 site-bound submission Open, follow-up fixes already applied fix/issue-25-submit-site-binding, 8412a55aded0e523b731b4bdaf812b3fd4706512; #25 handoff
#29 lazy imports Open, compatibility fixes already applied codex/trim-command-imports, 4ec9dd13e6bba38321131e6024b357417dc1fcf0; #27 handoff
#19, #20, #21 Merged Transport, role assessment commands, checkpointed trial previews. Do not reimplement.
#23 / #22 reviewer-model routing #23 closed unmerged; #22 explicitly deferred Optional, not a blocker. Do not resume unless separately requested.

GitHub main rules already require lint / types / architecture / deps, secret scan, tests (py3.10), tests (py3.13), and repository policy tests. #28/#29 do not currently report those checks; #30 introduces them but is red. Conversation resolution is not required by the current rules. Do not relax rules to make the queue green.

Execution order and dependency graph

  1. Now: [P1] Finish PR #30: repair required CI gates and agent-readiness handoff #32, repair chore: enforce quality toolchain, CI and agent-readiness hardening #30 in its existing branch. Get all required checks green. Merge only with authorization.
  2. Then finish Bind assignment submission to an explicit site or session #25/fix: bind assignment submissions to selected site #28 and Reduce CLI startup latency by deferring legacy command imports #27/perf: defer legacy command imports #29, using their dated handoff comments. Once chore: enforce quality toolchain, CI and agent-readiness hardening #30 is merged, update each branch from main, resolve overlaps, and run the full new gate. Do not create replacement PRs. These overlap shared command files; land and revalidate sequentially.
  3. P1 correctness: [P1] Trial preview start can create a remote attempt while CLI reports unknown and blocks resume #24, recover uncertain preview starts without replay. Start from integrated main after the queue is cleared. If expedited earlier, use a separate branch and revalidate after integration.
  4. Next low-risk capability: [P2] Add role course, semester, and content discovery #33, role/site-scoped read-only discovery.
  5. Next assessment writes: [P2] Add learner text assignment submissions #34 after Bind assignment submission to an explicit site or session #25, and [P2] Verify and implement draft-only instructor assignment feedback #35 after its protocol contract is verified. Serialize edits to assessment_commands.py / assessment_api.py; do not let multiple agents modify those files concurrently.
  6. External prerequisite: [Blocked: access] Authorize synthetic trial learner and record CLI E2E evidence #36 can be arranged independently, but actual E2E write validation waits for the corresponding code and explicit fixture/account authorization.
  7. Bounded feasibility only: [P3] Establish supported quiz question-authoring capability and blockers #37, question-authoring support. Not a blocker for the queue or [P1] Trial preview start can create a remote attempt while CLI reports unknown and blocks resume #24; stop if the supported upstream route is unavailable.

#26 remains the capability umbrella. Its checkboxes must not be marked complete merely because a plan, mock test, or instructor preview exists.

Start protocol, maximum one baseline refresh

  • Read AGENTS.md, REVIEW.md, and the selected issue. Use repository skills for validation/review when implementation reaches that stage.
  • Check branch/worktree status and the PR head. If unchanged from this map, use the evidence here. If changed, inspect only the new commits and their checks, not the entire historical review.
  • The current workspace is on chore: enforce quality toolchain, CI and agent-readiness hardening #30's branch. Untracked d2l-logo.png is pre-existing user work; do not alter it. Never discard other-agent work or assume an old temporary path is safe to delete.
  • Each issue owns one bounded outcome. No wholesale formatter refactor, auth rewrite, speculative API, or unrelated bot migration.

Safety and validation contract for every item

  • Preserve site/origin/account isolation, sealed CredentialStore artifacts, no secret or user-content logging, JSON-only stdout, and clean stderr errors.
  • Do not automatically retry state-creating requests, including legacy GETs. HTTP 200 alone is not write verification.
  • Remote LMS writes, account provisioning, grading/publication, credential changes, and Git merges/pushes need the applicable explicit authorization. This issue set authorizes planning, not live LMS execution.
  • No production/coursework writes, identity impersonation, real learner payload replay, browser auth export, or fixture cleanup by assumption. Use mocks and synthetic fixtures; record live validation as blocked when access is unavailable.
  • At implementation closeout run the contribution-toolchain gate: format, lint, strict mypy, import contracts, deptry, configured xenon threshold, repository policy tests, full pytest/coverage, and both enforced secret checks. Do not use system-tool versions instead of project pins.
  • Report exact final head, commands/results, hosted check state, unverified behavior, and remaining blockers. A green bot review is not a green CI gate. Stale counts are history, not fresh validation.

Definition of done for this roadmap

Planning evidence: GitHub PR heads, current ruleset, CI run 35445986366, issue/PR discussions, selected exact-head source reads, and current #30 source. No implementation or new test run was performed while preparing this map.

Activity

  1. pullfrog commented on Sep 22, 2026

    @pullfrog

    Run failed. View the logs →

    Pullfrog  | Rerun failed job ➔ | View workflow run | via Pullfrog | Using openai-compatible/glm-5.3 | 𝕏

  2. added
    area: assessmentsquizzes, submissions, instructor tools
    area: ciCI, tooling, release automation
    type: choreMaintenance and tooling
    on Sep 22, 2026
  3. rabesss commented on Oct 1, 2026

    @rabesss
    OwnerAuthor

    Status update (2026-10-01)

    Merged: #46 (Lighthouse-only; no --site, no trial connection), #47 (read-only submit --dry-run), #49 (hold mando<0.8 for radon) and the Dependabot updates #38 #39 #40 #41 #44 #50 #51.
    Closed: #28 and #25 (site binding is moot after #46), #36 (the trial cannot provide a learner).
    Retitled: #33 and #34 now describe Lighthouse-only work.

    Trial testing now runs through an out-of-repository harness that refuses non-sandbox hosts and blocks Lighthouse sign-in commands; the product code has only a private connection override.

    Next, in order:

    1. Student quiz attempt command: blocked on an owner-driven passive capture of a practice/ungraded Lighthouse quiz (summary → start → answer → submit → receipt). Scope after the capture: untimed multiple-choice quizzes first, a read-only info preflight, confirmation before start/next/submit, and at-most-once dispatch with verified outcomes.
    2. [P2] Add role course, semester, and content discovery #33 role discovery reads, then [P2] Add learner text assignment submissions #34 text submissions, [P2] Verify and implement draft-only instructor assignment feedback #35 and [P3] Establish supported quiz question-authoring capability and blockers #37.
    3. Reduce CLI startup latency by deferring legacy command imports #27/perf: defer legacy command imports #29 startup latency: decide between the current lazy-export design and a smaller function-local-import version.
    4. Release workflow: fails on every push to main because Actions may not create pull requests (a repository setting).
  4. rabesss commented on Oct 14, 2026

    @rabesss
    OwnerAuthor

    Roadmap

    Refreshed 2026-10-14 (previous refresh 2026-10-05). This replaces the 2026-09-22 execution map; its history is in the comments below and in the merged PRs.

    Where things stand

    The CLI is Lighthouse-only (#46).

    Since the 2026-10-05 refresh:

    Up to the 2026-10-05 refresh:

    Closed earlier: #24 (fixed by #45), #25 and #28 (moot after #46), #27, #32 (via #30), #36.

    Now: validate the learner attempt flow on more Brightspace sites

    The protocol and transport were checked on a public Brightspace site and a disposable sandbox. The CLI commands were then checked on the sandbox through its "View as Student" role. A first round with learner accounts on D2L Open Courses and Modern States produced the fixes in #70 and #71. Before adding features, keep running the current CLI on Brightspace instances that give free learner access to quizzes, and record what it handles and where it breaks.

    • Harness: testing runs through the out-of-repository harness, which pins the connection to one sandbox origin and blocks Lighthouse sign-in. The product stays Lighthouse-only and gains no site-selection option.
    • Accounts and quizzes: use throwaway accounts that the owner creates, and only quizzes meant for practice. The instructor side (building quizzes in each configuration) is tested on the disposable sandbox; the learner side runs on public Brightspace sites with free learner access. Lighthouse itself is not written to unless the owner asks.
    • What to record per site:
      • How sign-in works.
      • Quiz layouts, question types, equations and images, timing, auto-submit and attempt limits.
      • For each command, whether it worked, refused safely, or failed.
      • Wall time and request count per step.
    • Failures: each one gets its own issue, with a sanitised page fixture and a failing test, and its fix ships as a separate PR.

    On hold (owner decision, 2026-10-05)

    Their order is unchanged once the validation round is done. These issues predate the Lighthouse-only change, so before resuming one, read the current AGENTS.md, REVIEW.md, README and docs/quiz-protocol.md, and reconcile its instructions with main:

    #26 stays the umbrella issue; its boxes are ticked only with live evidence.

    Rules that still apply

    • Isolation and output: keep site and account isolation and the sealed credential store. Never log secrets or user content. With --json, stdout carries only JSON; prompts, progress and diagnostics go to stderr.
    • Writes:
      • Never automatically retry a request that creates state.
      • An HTTP 200 alone does not verify a write.
      • LMS writes, merges and pushes need explicit authorisation.
    • Gate: run the full gate before review: ruff check, strict mypy, import contracts, deptry, the complexity ratchet, repository policy tests, pytest with coverage, and both secret scans. Formatting is by hand, with no ruff format.
    • Required checks on main: lint / types / architecture / deps, tests (py3.10) and tests (py3.13). The secret scans and policy tests run inside these jobs.
  5. rabesss commented on Oct 15, 2026

    @rabesss
    OwnerAuthor

    Update (2026-10-15)

    Merged since the 2026-10-14 refresh:

    • feat(auth): opt-in unattended sign-in with a stored authenticator #76: opt-in unattended sign-in. auth totp-setup seals an authenticator-app secret next to the saved credentials. After that, auth login needs no prompt as long as the saved username matches, no --totp is given and the MFA method (flag or LIGHTHOUSE_MFA_METHOD) is unset or app. A replay-safe read whose session has expired signs in once and retries once. Write requests, the quiz-attempt flows, submit --dry-run and other connections never sign in on their own. A write command's earlier reads can sign in first, but the write itself is still sent only once. After an expiry on one of those paths, run auth login. After an auth failure, a breaker blocks automatic attempts until a stored auth login succeeds or auth totp-setup or auth totp-remove runs; a network failure gives a 5-minute cooldown. auth status now checks whoami and reports renewed and unattended_login. Tested read-only on Lighthouse: setup and login, deleted cookies, an expired session, and two processes at once. Details: docs/auth-unattended.md.
    • fix(auth): say when the Microsoft password has expired #77: expired-password message. When Microsoft answers with its "Update your password" page (AADSTS 50055 or 50144), auth login and auth verify say the password has expired and should be changed in a browser, instead of the generic "Authentication failed". With feat(auth): opt-in unattended sign-in with a stored authenticator #76, the same page blocks automatic sign-in as credentials_rejected.

    Learner side. The plan above is unchanged. Still open:

    • student attempt has not been run on a real Lighthouse quiz yet. Next, as planned above: keep running it on public Brightspace practice quizzes through the harness. A Lighthouse quiz run is still outstanding and happens only when the owner asks for it. Extra time and reopened attempts are still unobserved.
    • Question types other than single choice, true/false, multi-select and fill-in-the-blank are refused, and the page has to be finished in a browser. So are unclear MathML, SVG, audio and video, password-protected quizzes and LockDown Browser.
    • Not implemented: group assignment submission, discussions, checklists and surveys (docs/quiz-protocol.md, "Not yet implemented"). Text-only learner submission stays unavailable ([P2] Add learner text assignment submissions #34).

    Known follow-ups (listed in #76 under "Not in this PR"; no issue yet):

    • auth refresh --cdp-port doesn't work with Helium: its debug port has no /json/version, and Network.getAllCookies isn't available on the browser target.
    • On systems without fcntl (Windows), student attempt and instructor preview fail when they load, because quiz_learner_session.py and quiz_preview_session.py import fcntl at module level. Other commands, including the quiz and quizzes reads, are unaffected.

    #35 and #37 stay on hold as above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: assessmentsquizzes, submissions, instructor toolsarea: ciCI, tooling, release automationtype: choreMaintenance and tooling

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions