Skip to content

AF2 and stage-review remaining delivery

The minimum usable release completes the existing branch tabs, restores AF1 action/category behaviour, and corrects controls and navigation in the redesigned workspace. It preserves saved answers, incomplete drafts, permissions, and the legacy rollback path. Personalisation follows in independently shipped slices; it remains required programme scope.

Sequence and observable acceptance

Slice Dependencies Acceptance and evidence
Branch tabs, #2810 Merged isolation repair #3207 Current-head AF2/stage-review tests, review and CI pass; switching tabs preserves drafts and control identity; nested errors reveal ancestors; keyboard navigation and deletion preserve focus and selection.
Status cues and action/category/order parity, #3084 #2810 Distinct shapes identify all branch states without colour; invalid forms cannot Complete; dirty partial work can Save subject to permission and saving guards; category icons and visited validity match AF1; adding/deleting/reloading units preserves identity and creation order.
Controls and comments, 3A #3084 Every supported control presents prompt, helper, input and errors in that order; long prompts wrap; accessible names and descriptions stay associated; comment add/edit/cancel/save and quote insertion retain their semantics without hover/focus layout shifts. Unit regressions plus gallery browser screenshots.
Panels and navigation, 3B #3084; PDF-host owner integration Header buttons have unclipped focus surfaces; entity dialog Escape/backdrop/close preserve drafts and restore focus; My Studies design footnote removed while project permission and dirty navigation guards remain; Skip occupies a consistent header location across all stage types with unchanged behaviour.
Release baseline, 4 3A, 3B Annotation-only, screening-only, combined; narrow/wide; light/dark; pristine/dirty/invalid/completed; navigator on/off. Include nested branches, many entities, quote-to-comment and save failure. Required final-head CI and preview/staging journeys pass; deployed versions verified; user guide and rollback recorded.
Entity reordering, 5A Baseline; review-data ordering contract Drag and keyboard move actions persist order without changing entity identity, labels, answers or completion; reload, deletion, selection, failure and read-only paths covered.
Reviewer layouts, 5B Baseline; reviewed interaction and storage contract Per-reviewer versioned layouts for each capability combination; movable Source/Screening/Annotation panels; usable narrow-screen fallback, reset, schema/capability migration and failed persistence recovery.
Source modes, 5C 5B; PDF viewer lifecycle/host integration Embedded, floating and detached modes share authoritative study selection and preserve quotes; keyboard movement, viewport recovery, blocked-popup fallback, window close, study change and sign-out verified.
Backlog and cleanup, 6 Stable accepted default rollout Reconcile every #3067 entry with evidence or explicit follow-up; >8 branches usable; remove only unreferenced legacy components after rollback is no longer needed; preserve the original untracked notes and commit completion evidence.

The shortest critical path is #2810 → #3084 → 3A/3B → baseline acceptance. Shared shell files must be integrated after the active PDF-host changes; independent form work can proceed in parallel. Every implementation uses a sole-writer worktree under the repository’s .worktrees/ directory.

Flags and release gates

Existing annotationFormV2 and stageReviewRedesign gates remain in force. No production activation is implied by merging implementation. Wider/default enablement requires acceptance and a release decision, followed by a stability interval before legacy removal.

Entity order belongs to each reviewer’s review and must persist in that review’s database data. It must preserve entity names, identity and answer ownership. Preserve record-and-stay versus advance behaviour pending its separate decision. Reviewer-layout storage and mode/position persistence need a concrete reviewed contract. Credentials and production activation remain operator-controlled.

Infrastructure hardening, preview race repairs and unrelated colour/selector defects are only baseline blockers when current evidence proves an intrinsic correctness, regression or major security issue. Coordinate existing repair owners rather than duplicating them.

Recovery evidence

On 2026-09-05, #2810 remained open at 7d20971d1 with failed historical Angular checks;

3084 remained stacked on it at 932cba73c3. #3207 and #3174 are merged. Both branches merge

cleanly into the refreshed stack locally. Original pr/ worktrees have untracked status notes and are preserved. The main checkout also has unrelated staged/unstaged work; validation uses committed code in isolated worktrees.

Sources and implementation contracts

The acceptance criteria above govern delivery; prototypes illustrate interactions and do not replace these requirements.

Comment editing contract

Saved comment text appears in a compact chip with an edit action. Add/Edit opens a local comment transaction held in the shared form store, so pagination and the full-screen entity view do not lose it. Cancel drops that transaction; Save comment applies it to the review draft and closes the editor. Neither action writes to the server. Pending text participates in the existing unsaved-navigation guard.

Whole-session Save progress and Complete apply all pending comment edits before validation and submission. Revert, deletion and replacement by another session clear the relevant local editor state. Quotes inserted while editing remain in both the editor and its Cancel baseline: cancelling typed changes must not erase an independently inserted quote. Read-only sessions show comment text without edit controls.

Branch-answer overflow preferences

The 2026-09-08 reviewer mockup selects wrapping quiet branch tabs (15a) as the default at every nesting level. This first slice changes layout only: existing status shapes, active underline, branch identity, selection and draft state remain shared and unchanged. Long labels fit the available width and retain their full accessible names. Flag decision: this is inside the existing annotationFormV2 feature; no separate flag is needed for the default tab layout correction.

Required next slice: an account-persisted reviewer preference across projects, with explanatory miniature previews for wrapping (default), a single row with a More menu (hidden-error indicator and count), and sideways scrolling. These are render choices over the same branch data/status logic, not project-admin settings or Dockview panel tabs. Switching modes must preserve selection, drafts, focus, error reveal and accessibility. Wrapping chips (15b) are an unselected alternative.

The mockup references an unspecified 10a selector beyond approximately15 branches. Neither that selector nor an exact cutover is supplied; the older >8 note in repository docs is not a settled threshold. Obtain that design before implementing the cutover. Do not conflate it with the existing ancestry selector.

Status: default wrapping implemented; all 79 question-list tests and the authenticated browser journey passed. Browser coverage checks 375px nested wrapping, visible status indicators, stable tab IDs, keyboard selection and preserved nested drafts. Preview acceptance remains pending. The saved preference and alternate render modes are required follow-up work, not delivered by this first slice.

The branch-wrapping MVP keeps Add on the same row when short tabs leave room; longer sibling lists wrap without losing their status markers. The browser contract checks both a short row and actual multiple-row geometry at 375px.