Repository navigation
Roadmap: returning-agent handoff and sequenced assessment work #31
Description
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
- 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.
- 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.
- 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.
- Next low-risk capability: [P2] Add role course, semester, and content discovery #33, role/site-scoped read-only discovery.
- 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. - 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.
- 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.pngis 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
CredentialStoreartifacts, 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
- chore: enforce quality toolchain, CI and agent-readiness hardening #30 repaired and integrated with five required checks passing.
- fix: bind assignment submissions to selected site #28 and perf: defer legacy command imports #29 finalized, validated on integrated code, and their issues reconciled.
- [P1] Trial preview start can create a remote attempt while CLI reports unknown and blocks resume #24 delivered with safe known-ID and unknown-ID recovery semantics.
- Each Benchmark follow-ups: unsupported assessment capabilities and learner access boundaries #26 workstream has its own evidence-based outcome or explicit blocker.
- No unsupported capability or genuine learner E2E result is represented as complete.
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
pullfrog commentedon Sep 22, 2026
Run failed. View the logs →
openai-compatible/glm-5.3| 𝕏chore: make the CLI Lighthouse-only; drop the trial connection (#46)
rabesss commentedon Oct 1, 2026
Status update (2026-10-01)
Merged: #46 (Lighthouse-only; no
--site, no trial connection), #47 (read-onlysubmit --dry-run), #49 (holdmando<0.8for 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:
infopreflight, confirmation before start/next/submit, and at-most-once dispatch with verified outcomes.mainbecause Actions may not create pull requests (a repository setting).rabesss commentedon Oct 14, 2026
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:
student attemptorpreviewis refused at the session check, the message now says the session may have ended or the account may lack API access, instead of only "Permission denied".submit(andsubmit --dry-run) refuses a text-only, on-paper or observed assignment before reading or sending the file. This settles [P2] Add learner text assignment submissions #34 (see below).Up to the 2026-10-05 refresh:
student attempt start,page,answer,next,previous,images,submit,verify,forgetandstatus.imagesdownloads them.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.
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 anddocs/quiz-protocol.md, and reconcile its instructions withmain:--siteand trial support were removed from the product.docs/assessment-coverage.mdno longer exists.#26 stays the umbrella issue; its boxes are ticked only with live evidence.
Rules that still apply
--json, stdout carries only JSON; prompts, progress and diagnostics go to stderr.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 noruff format.main:lint / types / architecture / deps,tests (py3.10)andtests (py3.13). The secret scans and policy tests run inside these jobs.rabesss commentedon Oct 15, 2026
Update (2026-10-15)
Merged since the 2026-10-14 refresh:
auth totp-setupseals an authenticator-app secret next to the saved credentials. After that,auth loginneeds no prompt as long as the saved username matches, no--totpis given and the MFA method (flag orLIGHTHOUSE_MFA_METHOD) is unset orapp. A replay-safe read whose session has expired signs in once and retries once. Write requests, the quiz-attempt flows,submit --dry-runand 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, runauth login. After an auth failure, a breaker blocks automatic attempts until a storedauth loginsucceeds orauth totp-setuporauth totp-removeruns; a network failure gives a 5-minute cooldown.auth statusnow checkswhoamiand reportsrenewedandunattended_login. Tested read-only on Lighthouse: setup and login, deleted cookies, an expired session, and two processes at once. Details:docs/auth-unattended.md.auth loginandauth verifysay 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 ascredentials_rejected.Learner side. The plan above is unchanged. Still open:
student attempthas 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.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-portdoesn't work with Helium: its debug port has no/json/version, andNetwork.getAllCookiesisn't available on the browser target.fcntl(Windows),student attemptandinstructor previewfail when they load, becausequiz_learner_session.pyandquiz_preview_session.pyimportfcntlat module level. Other commands, including thequizandquizzesreads, are unaffected.#35 and #37 stay on hold as above.