UX strategy for the integrated review programme¶
1. Purpose and status¶
Temporary planning document; planning only. This page is the end-to-end user-experience strategy for every screen the programme adds or changes, written to resolve the round-2 UX review (UX-01 to UX-22, its §3 strategy and §4 questions) and the UX-relevant findings of the other round-2 reviews (PH-13, PH-19, PH-35; review AC-17, AC-19, AC-27, AC-28, AC-29; SR-25; DD-11's user-facing glossary and Q-D4/Q-D5; V2-22, V2-25; RT-10, RT-14, RT-22; NS-07, NS-10, NS-13). Its changes to the other package documents have been merged into them: acceptance criteria §2 (AC-ALL-06 to AC-ALL-08; the AC-UX metrics in §2.3), §3 (UI-1 to UI-11 and the width matrix) and §5 (PE-05 and the user-testing tasks); contracts C17; open questions §3 (U30–U45 and the revised U6, U13, U16, U27) and §4 (A-24 rewritten, A-37, A-38); the integrated plan (R2a, R3a–R3c and R4a scope, §6.1 and §6.2 gates, §7, §9 and §10); and the UI comparison §2.3, §4 and §5.
Authority. Chris's 3 October decision UI1 (every new and updated screen is consistent, modern
and Material 3 under FEAT-023's contract; decision register §1.11)
is OWNER. The approved AF2 validation and presentation plan
(/home/chris/workspace/syrf/handover/2026-09-13-af2-validation-presentation-plan.md, approved
14 September) and the project-navigation handoff rev 2
(/home/chris/workspace/syrf/main/docs/features/material-3-migration/handoffs/project-navigation-drawer/README.md,
implemented by the navigation plan) are DOC-APPROVED inputs. Everything else here is
PROPOSAL unless it carries a ledger ID. Product choices that need Chris are cited by their
Batch D IDs from the round-2 brief (D1-06, D2-07, D2-08, D2-10, D2-12, D3-01 to D3-08, D3-15,
D3-17, D3-19, D3-20, D3-23, D4-01, D4-13, D4-18, D4-19); no new question IDs are minted here.
D1-06 (the tester panel) was approved as recommended on 3 October
(register §1.13), and Chris
named the panel late that evening (register §1.14;
§9); no external SyRF users are named yet. D4-18 was answered the same night ("independent of
funders"); its recorded reading keeps the independent WCAG 2.1 AA audit at GA and stays PROPOSAL
until Chris confirms it in the G0 dossier. Owner session, 5 October 2026: most
of the Batch D items named in this paragraph are now decided; §1.1 records which.
Code baseline. Current-UI claims were re-checked on main at de3e98c59 (3 October 2026):
| Claim | Evidence (/home/chris/workspace/syrf/main/…) |
|---|---|
No keyboard decision shortcuts exist on the reviewer page; no kbd hint renders |
src/services/web/src/app/stage/stage-review/review-decision-card/review-decision-card.component.spec.ts:391-392 ("No I/E shortcuts exist yet"); no keydown host listener under src/services/web/src/app/stage/ |
| The only onboarding is a one-shot hint with a "GOT IT" button; the public "What's new" is a marketing page | …/stage/stage-review/review-first-run-hint/review-first-run-hint.component.html:19-27; …/info/home/whats-new/ |
| Per-user review preferences and the My studies navigator already exist | …/stage/stage-review/review-preferences-dialog/, …/stage/stage-review/my-studies-navigator/ |
| AF2's action bar already says "Save progress" (compact "Save"), "Complete" and "Edit annotations" | …/shared/annotation/annotation-form-v2/annotation-form-v2.component.html:419, :466, :506 |
| Typed message constants exist for one feature; a help-URL guard spec exists | …/study-presence/session-messages.ts; …/shared/pipes/user-guide-url/no-hardcoded-help-urls.spec.ts |
| Shared shells and primitives exist: page shell and page state, section shell, overlay scroll, row overflow | …/shared/page-shell/, …/shared/side-nav/, …/shared/overlay-scroll/, …/shared/row-overflow/ |
| The e2e stack has no axe dependency and runs every Playwright project on Desktop Chrome | e2e/package.json (no @axe-core); e2e/playwright.config.ts:60-115 |
| The question-tree designer still uses native HTML5 drag events | …/project/project-admin/question-management/design/question-node/question-node.component.html:12 (dragstart); …/design/design.component.html:67-201 (dragover/drop); …/design/annotation-question-tree-drag-drop.feature.ts:125-226 (DragEvent, dataTransfer) |
No .browserslistrc; TypeScript target ES2022; no stylelint configuration |
src/services/web/tsconfig.json:42; absence verified by listing |
check:theme-migration scans M2 APIs, private Material paths and legacy Bootstrap imports only |
src/services/web/scripts/check-theme-migration.mjs:20-55 |
themeToggle defaults off and is on in staging |
src/charts/syrf-common/env-mapping.yaml:1467-1475; /home/chris/workspace/cluster-gitops/syrf/environments/staging/web/values.yaml:62, …/staging/api/values.yaml:91 |
| LogRocket and Google Analytics are configurable; Sentry is bundled | env-mapping.yaml:1563-1572, :2031-2036; src/services/web/package.json:60-62, :77-78 (runtime state per environment UNVERIFIED) |
| Debug panels render on reviewer-reachable routes | …/stage/stage-reconcile/stage-reconcile.component.html:4-17 (app-debugger-group), :18 (gdColumns); …/stage/stage-review/review-completed/review-completed.component.html:28-38 |
| Legacy project navigation keeps "Studies" and "Screening" sections | …/project/project-nav/project-nav.component.ts:438-548 (Screening info group visible: false at :519) |
| The project index has a "Pending Projects" tab and no cross-project work list | …/project-index/project-index.component.html:56-86 |
| The user guide still says "Save" and "Submit" in one place and "Save progress" and "Complete" in another; the screening progress copy says "Unavailable" | user-guide/annotating.md:239-249 vs :375-376; user-guide/stages/screening.md:37; user-guide/getting-started/glossary.md exists |
1.1 Owner-session integration (5 October 2026)¶
Chris decided the UX packages U1 to U3 and related amendments in the owner session of 4–5 October
2026 (consolidation §6;
condensed packages U1 to
U3 with their amendments and final clarifications). The detailed screens and rules are in the
UX, devices and work discovery specification
(the UX spec, rules UX-R…, evidence UX-AE…); the other eight
specifications own the behaviour those screens show. The
consolidation wins over older text on this page. Earlier wording is kept and marked where it is
superseded. Amendment IDs (OS-A…) are those of the
owner-session integration.
Authority boundary. These are planning approvals. Brief approval and implementation authorisation are separate (D1-04) and on hold since 5 October 2026. Nothing here authorises implementation, telemetry collection, a PWA build, offline writes, messaging the design session or building a new prototype. No gate has passed.
Decision statuses for this page.
| ID | Status | What it settles here | Sections changed |
|---|---|---|---|
| Q-12 | Decided (4 October) | A step selector with one form area in the existing annotation workspace | §4.3, §7.1, §11 (U7) |
| D3-03 | Decided-amended (U1 with wording flexibility, OS-A21) | Save progress, Complete, Needs updating, Outdated answers, Fix, Accepted answers ("gold standard" in help text) and Screening result; "Draft auto-saved" and "Version checkpoint saved" as illustrative labels whose meaning is fixed | §2, §4.3, §5.2, §6.4 |
| D3-04 | Decided (U1) | Material 3 sentence case | §4.2, §5.2 |
| D3-05 | Decided-amended (U2 device scope) | Screening and full annotation on phones, tablets and desktops at launch; the largest project is an acceptance case | §6.1, §8.2, §8.3, §9 |
| D3-06 | Decided-amended (U2 final clarification, OS-A23) | Refreshed design and as many compatible new features as possible on legacy screens, with no change to review-workflow semantics before a confirmed conversion | §3.4, §14 |
| D3-07 | Decided (U3) | Project My work, a cross-project tab and a global badge even when notifications are muted; pending admin changes shown; full global landing page deferred | §3.1 |
| D3-08 | Decided (U3) | The agreed tester panel with no extra external recruitment now; consent-based timing telemetry without answer content | §9, §10 |
| D3-01 | Brief item (T-UX-00) |
Material 3 roles, dark-mode and staging checks, visual baselines | §14 |
| D3-02 | Brief item (T-UX-00) |
Release design reviews, risky-screen previews, routine checks | §13.2 |
| D3-14 | Decided (owner session, outside the register) | Add missing staging seeds; preserve staging data where possible; never production | §9 |
| D3-15 | Decided (owner session, outside the register) | Firefox, WebKit and touch coverage | §8.3 |
| D2-07, D2-08 | Decided (owner session, outside the register) | Form-owned inactivity timeout and in-progress limit; one shared session and place across tabs and devices with base-version checks | §5.4, §5.5, §6.5 |
| D2-12 | Replaced (OS-A29) | One consolidated current Study with reversible unmerge | §3.1, §5.2, §11 (U41) |
| D2-16 | Replaced | No size-based exclusion; the largest project is an acceptance case | §5.5, §9 |
| D3-20, D3-23 | Brief items (T-SP-00, T-AC-00) |
Presence counts with names only for Monitor holders; resolved notices leave counts and stay in history | §3.1, §5.4, §7.6 |
| D3-22, D3-24 | Decided-amended, Decided (O2) | Informative, permission-aware emails; per-project mute | §7.9 |
| D4-01 | Decided (S1, with OS-A16) | Unsure key where the profile enables it | §5.2, §6.1 |
Amendments outside the register count that change this page. Draft and checkpoint status (OS-A21); compatible features on legacy screens (OS-A23); PWA exploration beyond the MVP (OS-A22, §16); reconciled-answer hints with click-to-fill (OS-A04, §4.3, §7.1); form- and profile-owned blinding with unpredictable candidate order (OS-A02, OS-A03, §7.3); screening tie adjudication in an adjudication step (OS-A13, §7.3); reviewer-pool browsing and Saved work (OS-A27, OS-A05, §7.11); the admin eligibility explanation (OS-A08, §7.12); question-design presence (OS-A01, §7.13); active-work impact previews (consolidation §6, §7.14); the merge and unmerge wizard (OS-A29, §7.15); training (OS-A18, §7.16); contribution exclusion, reversible project deletion, the catalogue and notification content settings (OS-A24, OS-A25, D2-15, OS-A26, §7.17); the design-prototype handoff (OS-A30, §4.4).
Ambiguities recorded on this page (from UX spec §12; no owner answer is assumed). A1, holding edits on the device during a connection loss (§6.4); A2, reconciliation and design screens on phones (§7.3); A3, the largest project as test data (§9).
2. UX principles for SyRF¶
- Reviewer time is the scarce resource. Reviewers screen and extract for hours a week. Every change to the reviewer page is measured against today's time per decision and per form (AC-UX-03, AC-UX-04), and nothing reviewer-visible ships without a keyboard path.
- Independence and blinding are visible, never implied. Candidates never see each other (VS1 default off, BL1 aliases); the UI says when a view would make work "informed" (VS2) before the reviewer sees it; presence shows counts, not names (pending D3-20); decision buttons stay equal-weight so the interface does not nudge a decision (Review Prototype v4 correction 3). Owner session: candidates still never see each other's candidate answers, but labelled hints from existing accepted answers are shown by default and copied only by an explicit click, with exposure recorded (OS-A04, superseding "VS1 default off"); reconciliation blinding is owned by the form or profile and uses context-local aliases (OS-A02, OS-A03, superseding "BL1 aliases"); presence follows D3-20 (brief item).
- Honesty about state and versions. The four AF2 facts stay separate (answer progress, readiness, reveal, persistence). Copy never says "saved" for a kept draft, never "Completed" for an answer scope, never shows a count without a real numerator, and always says which version counts (SL3). Freshness is labelled, not assumed. Owner session (OS-A21): the owner's illustrative labels "Draft auto-saved" and "Version checkpoint saved" replace the word rule about "saved"; the meaning rule stands, so an autosaved draft is never called a version or a submission and a checkpoint never implies completion.
- Consistency and Material 3 (UI1). One design system of record (§4), one button and type language (D3-04), one copy deck (§5), and the same chrome in legacy and canonical projects (§3.4). A pattern is specified once and reused. Owner session: legacy projects also get every compatible new feature (D3-06 as amended, OS-A23), and every device class gets the same features (D3-05).
- Accessible by construction. WCAG 2.2 AA is the working standard (audited to 2.1 AA at GA, D4-18); keyboard, screen-reader, forced-colours, reflow and touch requirements are part of every pattern's specification, not a ship-gate afterthought (§8).
- Change is budgeted. Reviewers see at most three bundles of visible change before GA; each bundle ships with a "What changed" panel, a tour and help links (§12).
- Evidence, not opinion. Real reviewers test prototypes before freezes and releases before pilots; UX metrics are acceptance criteria with thresholds (§9, §10).
3. Information architecture¶
3.1 Project IA (C17) with My work¶
C17's navigation stands: Overview, Review, Reconcile, Design, Stages, Members & groups, Data,
Project settings; "Library" stays with Study Management. This strategy adds one surface and two
chrome elements (PROPOSAL, pending D3-07). Owner session: D3-07 is Decided (U3,
4 October 2026): project My work, the cross-project tab and the global badge work even when
notifications are muted, pending admin changes are shown, and the full global landing page is
deferred (UX-R18 to UX-R23).
| Element | What it is | Release | Window |
|---|---|---|---|
| My work (project level) | The reviewer's and reconciler's landing inside a project: every actionable item by role, with the four feature-owned queues as filters and the inbox as history | R3c (badge, banner, "changes awaiting approval"); R4a (full surface, "assigned reconciliation work", "requested reviews"); R4b adds "my concerns and outcomes" | U30 in W1 |
| Global My work badge | An app-bar badge whose count is computed at read time over the four queues and the admission-based "to review" count, across projects; no notification flag involved | R3c | U30 |
| Cross-project My work tab | A tab beside "Pending Projects" on the project index listing actionable items grouped by project (the #2621 global landing stays post-GA with its own owner) | R4a | U30 |
| Admin banner | On a project overview, "N changes awaiting your approval" for pending LC1 requests, with every notification flag off | R3c | U30 |
| Workflow version badge and panel | A badge in the overview and rail naming the project's workflow version; a panel in Project settings (admitted or classic, read-only containment, who changed it, when) | R0 (panel), R2a (badge, banner) | U32 in W0 |
My work contents (by role). To review (studies available to you by step, with Start or
Continue); Needs your attention (Needs updating, Outdated answers with Fix, kept changes whose
slot was released); Reconciliation (assigned to you, available, held); Requested reviews; Your
queries (concerns and their outcomes); Awaiting your approval (admins: LC1 change requests, a
stalled publication). Counts are computed at read time; rows deep-link to the task identity
(RE4) and use stage-owned aliases (BL1) use context-local labels under the form's or
profile's blinding, never an alias that carries across Studies (owner session, OS-A02, OS-A03).
An item resolved by someone else leaves the list but stays in history (pending D3-23 D3-23,
brief item). Empty states say why ("Nothing to review: this stage is waiting on other
reviewers"). The inbox (when enabled) is delivery and history, never the source of truth (A-07).
Owner session additions to My work (UX spec §3.5):
| Role | Added rows (owning specification) |
|---|---|
| Reviewer | Saved work you may still finish after a Study left the pool (SP); drafts whose place was released (RD); merge conflicts delegated to you (DM); training to complete or retry (TI); requested reviews from additional-review requests, which raise the effective target (RD) |
| Reconciler or adjudicator | Adjudication assigned to you or to your group (RS) |
| Administrator | Changes awaiting your approval, for example a protected change to a Completed stage (SP, Q-02); publications in progress or blocked (RD); merge conflicts awaiting resolution (DM); external screening runs awaiting acceptance (RI); training attempts awaiting manual assessment (TI); conversion findings needing action (BC) |
The badge counts actionable rows across projects, independent of notification flags, per-project
email mute (D3-24) and inbox state. Counts come from indexed read-time queries, never a stored
counter; a failed query shows "Couldn't load", never a false 0 (PROPOSAL: 60-second refresh,
proposed, not approved).
Where the new PRISMA, deduplication and adoption surfaces live. Data › PRISMA (report views and the reported-counts entry, R5b; per-search external-step records are entered on the search's own page under Study Management › Searches, P1). Study Management › Processing shows deduplication runs as long-running operations (P2), and Study Management › Library gains the duplicate review queue and the merge and unmerge wizard (P2a to P2c; OS-A29; D2-12 replaced by the consolidated merge). Adoption (R6) and the admission action (R0) live in Project settings › Workflow version; operator-only surfaces (adoption manifests, dry-runs) stay in the Admin Console.
Owner session placements. The duplicate review queue hosts the merge and unmerge wizard (D2-12 replaced, OS-A29; §7.15). R6 becomes universal baseline conversion waves: trials and pilots are admitted from Project settings › Workflow version, wave operations stay operator surfaces, and conversion findings reach admins through My work (BC spec). PRISMA views label imported references, source documents and Study items, and show coverage values and the machine-assisted share (RI spec §13). Design gains an AI screening models page listing model configuration versions and their use (RI spec §3.11; layout here, lane XS1 proposed). The application gains a restricted Deleted projects view, the catalogue browser with its publication-request queue, and Project settings gains notification content settings (ACD spec §13; §7.17).
3.2 Route inventory with an owner per route group¶
Following the M3 programme's "one owner per route group" rule. Paths marked (indicative) are
proposals; verified paths come from project-nav.component.ts.
| Route group | Routes | Mode | Owner | First release |
|---|---|---|---|---|
| Application chrome | app bar, My work badge, inbox button, help menu | both | M3 navigation owner (navigation plan slice 2); L16 for the badge | R3c |
| Project rail and footer checklist | rail sections per mode; setup checklist (readiness-based content from R2a) | both | M3 navigation owner; L16 supplies section models | R2a |
| Overview | project overview, admin banner, workflow version badge | both | L16 | R2a |
| My work | my-work (indicative) |
both (legacy shows the inbox-independent items it has) | L16 with L6 (reconciliation rows) and L4 (admission rows) | R3c, R4a |
| Review | stage review workspace (AF2, Dockview, step strip) | both | AF2 and stage-review programme; L5 lands programme changes in the agreed order | R2a onward |
| Reconcile | reconcile/… per study × form task (indicative) |
canonical | L6 | R4a |
| Design | questions, entity types, concepts & rules, outcome schemas, forms, screening profiles | canonical (legacy keeps the legacy editor) | L2; L9 (C1); L10 (O1) | R1a, R2a, R3b, C1, O1 |
| Stages | per stage: overview, steps & settings, monitor | canonical; legacy keeps today's settings | L4 (designer), L16 (overview DTOs) | R3a |
| Members & groups | members, groups, permissions | both | L8 with the authorization programme | R1b |
| Data | export, history, agreement, PRISMA | both (export); canonical (history, agreement, PRISMA) | L11; L12 (PRISMA) | R2a, R5a, R5c, R5b |
| Study Management | studies, searches, processing (verified) |
both | Study Management owner; L12 adds the dedup queue and merge wizard | P1, P2 |
| Legacy sections | screening/overview, admin/screening-settings (verified) and today's stage settings |
legacy only | unchanged owners; M3 restyle under D3-06 | GA (restyle) |
| Project settings | general settings, workflow version panel | both | L16; L0 (admission action) | R0 |
| Notifications | inbox, preferences | both | notification programme (M3 redesign before R2c, NS-10) | before R2c |
| Setup | guided setup wizard | canonical | L13 | R3d |
| Owner session: Deleted projects | restricted list and restore (indicative projects/deleted) |
both | ACD spec owner (T-AC-00) |
X-DEL |
| Owner session: Catalogue | catalogue browser, item versions, publication requests (indicative) | both | ACD spec owner (T-AC-00) |
R1a |
| Owner session: Design › AI screening models | model configuration versions and their runs (indicative) | canonical | RI spec owner (T-RI-00) |
XS1 (proposed) |
| Owner session: Stages › Monitor › Why? | eligibility explanation timeline for a Study and stage (indicative) | canonical (current-state only on legacy) | SP and UX spec owners (T-SP-00, T-UX-00) |
SP history release; timeline behind stageEligibilityTimeline (PROPOSAL) |
| Owner session: Review › Browse and Saved work | reviewer-pool browse list and Saved work (indicative) | canonical | SP spec owner (T-SP-00) |
R3a (browsing optional, PROPOSAL stage setting) |
| Owner session: Training | training steps inside the step selector; assessment queue for admins | canonical | TI spec owner (T-TI-00) |
Lane TR1 |
3.3 Workflow version badge and panel¶
- Names (
PROPOSAL, confirmed with D3-03): "Classic workflow" for legacy projects and "Versioned workflow" for admitted projects. "Canonical" and "legacy" never appear in the UI (DD-11 glossary). Owner session: D3-03 was decided without these two names, so they stayPROPOSALs for the copy deck at F1c. "Classic workflow" is temporary: every project converts to the faithful baseline after pilots (OS-A15). - Badge: in the overview header and as a rail footer line; text plus a shape, never colour alone; tooltip and panel link.
- Panel (Project settings › Workflow version): current version; what it means for this project (two sentences and a help link); admitted by whom and when; read-only containment state ("Reviewing is paused while this project is checked") with who set it and when; the audited admit or remove action for application administrators (R0). The panel is the admission and rollback UI that UX-18 found missing.
- Reviewer banner (read-only containment, U28): "This project is read-only while it is checked. Your changes are kept. Nothing you saved is lost." No edit control is enabled.
3.4 Legacy coexistence and the minimum shared chrome (D3-06)¶
Until adoption, a user who holds both kinds of project must still feel they are in one product:
| Identical in both modes | Differs by mode |
|---|---|
| App bar, My work badge, inbox, help menu; project rail geometry, colours, type and states; Overview layout; Members & groups; Data › Export page; Project settings; the workflow version badge; status chips, page shell, page state, long-running job language; copy deck terms | Rail sections: legacy keeps "Studies" and "Screening" and today's stage settings; versioned projects show Design, Stages, Reconcile and the Data subsections; the question editor's two modes (C17) |
Pending D3-06, legacy screens (chrome and shared pages, no behaviour change) are restyled under FEAT-023 so the atomic cutover covers them. U27 becomes a cross-project consistency check with a tester who holds both kinds of project (U45 extends it to the restyle).
Owner session (D3-06 decided-amended through the U2 final clarification, OS-A23). "Restyled with
no behaviour change" is superseded. Existing and legacy project screens get the refreshed design
and as many compatible new features as possible, while progression, screening, annotation,
eligibility, serving and other workflow semantics stay faithful until a confirmed conversion or a
later configuration change (UX-R16). A feature is compatible only if it leaves those semantics
unchanged and the legacy flags-off spec set still passes (AC-ALL-02). The UX brief keeps a
compatibility register listing each feature, its verdict, the reason and the parity evidence
(UX-R17; a document, not a database record). Initial verdicts (PROPOSAL, UX spec §3.4):
| Feature | Unconverted projects | Why (PROPOSAL) |
|---|---|---|
| Material 3 restyle of chrome and shared pages | Compatible | Appearance only |
| Navigation rail, help links, "What changed" panel | Compatible | No workflow semantics |
| My work, cross-project tab and badge | Compatible | Lists legacy work computable from current state |
| Phone and tablet layouts for legacy screening and annotation | Compatible | Layout only; the same actions |
| Keyboard screening shortcuts | Compatible | The same decisions through another input |
| Dark mode and accessibility fixes | Compatible | Presentation only |
| Draft and checkpoint status labels | Not compatible as worded | A legacy save overwrites the session and creates no immutable version; legacy screens keep truthful legacy wording |
| Step selector | Not compatible | Unconverted stages have no steps; the opt-in wizard maps them |
| Unsure, discussion, tie adjudication | Not compatible | They change screening semantics |
| Reconciled-answer hints and click-to-fill | Not compatible | They change exposure |
| Reviewer-pool browsing | Not compatible | It changes serving |
| Eligibility explanation | Compatible for current state only | No pool history exists before tracking begins; the panel says so |
| Presence counts | Compatible where tracking is already on | Existing behaviour |
Coexistence itself is temporary: after pilots, universal baseline conversion moves every remaining project into the new structures (OS-A15; BC spec).
4. Design system of record and pattern inventory¶
4.1 System of record¶
The design system of record is FEAT-023's emitted token contract (--mat-sys-* roles from
mat.theme() and documented --syrf-* brand or domain roles, measured by
src/services/web/scripts/token-contrast-contract.mjs) plus the shared Angular components:
shared/page-shell (page shell and page state), shared/side-nav (section shell), the project
navigation rail (navigation plan decision 2), shared/overlay-scroll, shared/row-overflow,
the StatusView chip contract (Study Management D5; kinds ok, info, warn, stopped, muted) and the
long-running-job visual language (docs/features/material-3-migration/technical-plan.md,
"Long-running-job visual-language contract"). Prototype kits (_ds React bundle, QM v2 HTML,
redesign v7, #2621) are design inputs; their token names are mapped, never copied (v10 README
"Design tokens"). A new shared token goes through FEAT-023's serial theme-contract change.
4.2 Button and type language (D3-04)¶
Pending D3-04 (owner session: D3-04 decided through U1, 4 October 2026): Material 3 sentence case for every label; button shape and radius from the M3
component theme as emitted, no per-feature radius overrides; no ALL-CAPS tracking; type from the
M3 type scale and the --syrf-space-* ladder (Study Management token mapping). The v4 stage-review
spec is re-audited against this before further parity work; items that change:
| v4 spec item | Under D3-04 |
|---|---|
| ALL-CAPS 13px/500 letterspaced buttons (corrections 3, 4, 11; "Design tokens") | Sentence case, M3 button type and shape |
| 4px button and input radii, 8px cards, hex values | M3 shape and colour roles; no literals (UI-1, UI-10) |
| "Unsaved changes" chip; footer "All changes saved" | Save-status indicator and copy deck terms (§6.4); owner session: Draft auto-saved, Version checkpoint saved and Complete as distinct states (OS-A21) |
| "Remove all annotations…" (destructive) | Versioned clear or "Discard kept changes" wording (AC-R2a-09) |
| Sidenav in-flow at 1200px | lt_lg edge (1239.98px) from break-points.ts |
Equal-weight outlined Include and Exclude with kbd hints |
Kept (deliberate non-nudging); hints render only once shortcuts exist (U33) |
| Anchored What's new tour | Kept as the shared tour component (§12) |
| Content threshold 980px of remaining width | Kept as a content-driven rule; verified at 925px (UI-6) |
4.3 Pattern inventory¶
Each pattern is specified once (states: hover, focus-visible, pressed, selected, disabled, error, loading, empty; tokens; keyboard model; narrow behaviour; copy keys), built once as a shared component, and shown on a spec gallery route behind a flag (E84). Status is per release; every pattern enters U43 before its first consumer builds.
| Pattern | Used by | States and tokens | Keyboard model | Narrow behaviour | Copy keys (deck) | First |
|---|---|---|---|---|---|---|
| Step strip (owner session: "step selector", Q-12 decided) | reviewer page (Q-12, U7) | selected, available, locked, done, skipped, held; owner session: adds "not applicable", shows the system adjudication step only to eligible adjudicators and training steps where configured; --mat-sys-secondary-container selected; status by shape plus text |
[ ] move, Enter opens, roving tabindex |
collapses to a select-like menu below lt_sm |
steps.* |
R3a |
| Save-status indicator | AF2 action bar, reconcile host, setup wizard | status is a polite live region; Retry is a button | icon plus short text below lt_sm |
save.* |
R2a | |
| Conflict and take-over screens | reviewer and reconciler forms | focus moves to the summary; one primary action | full-width card | conflict.* |
R2a | |
| Status chips (StatusView kinds extended) | sessions, forms, versions, queues | Needs updating, Outdated answers, Held, |
none (chips are not targets) | wraps; never truncates the kind word | status.* |
R2a |
| Version badge | forms, profiles, sessions, stage settings | current, superseded, unpublished | tooltip on focus | text stays | version.* |
R2a |
| History timeline | history panel, gold history (4.4) | current, pinned inputs, policy-derived, withdrawn, inputs changed | list semantics; Enter opens a version | single column | history.* |
R2a, R4a |
| Candidate pills and agreement icon | reconciliation form (4a) | agree, differ, one-sided, N candidates with overflow menu; selector never hides a disagreeing candidate (U1); owner session: context-local labels in random order with no chronology clues when blinded (OS-A02, OS-A03); a one-candidate layout for required human reconciliation (OS-A28); blank comparisons labelled "Not assessed" (Q-04) | arrow keys between pills; Enter copies an answer | selector plus single column | reconcile.* |
R4a |
| Prefill (autofill) marker | reconciliation form | prefilled, edited, accepted (RE2: no per-field confirm) | none; marker is described by the field's accessible description | unchanged | reconcile.prefill |
R4a |
| Impact flow scaffold (stepper) | publication, profile publication, stage settings publish | review, impact, choices, confirm; busy; blocked by stale evidence | stepper roles; Escape asks before discarding | one step per screen | publish.* |
R2c |
| Queue list (My work rows) | My work, pool, queues | actionable, waiting, held, resolved | list with row actions; Enter opens | cards below lt_sm |
mywork.* |
R3c |
| Workflow version badge and panel | overview, rail, settings | classic, versioned, read-only | panel is a page | text | workflow.* |
R0, R2a |
| What changed panel | app bar | unread, read, dismissed per user | dialog trap and return | full-screen sheet below lt_sm |
per-release keys | R2a |
| Anchored tour | reviewer page, reconciler page | step, paused, resumed | Esc pauses; arrows move; focus follows the spotlight | not shown below lt_sm (RP4) |
per-tour keys | R3a |
| Presence count chip | study header, pool | held, released, offline; counts only (D3-20, now a brief item: names only for Monitor holders, never across reconciliation blinding) | none | hidden below lt_sm |
slot.* |
R2b |
| Progress vocabulary strip | reviewer progress, stage overview | your work, available to you, waiting on others, locked by a step, enough reviewers | none | wraps | progress.* |
R2b |
Keyboard hint (kbd) |
decision card, action bar | rendered only when the shortcut is live | n/a | hidden when a touch pointer is primary | keys.* |
R3a |
| Blinded bibliographic placeholder | screening card | hidden authors, journal, year with a reason line (SR-25, PROPOSAL) |
n/a | text | blind.* |
R3b |
| Owner session: reconciled-answer hint and click-to-fill (OS-A04) | reviewer form | hint shown (labelled with authority and snapshot), hint used, hint hidden by step, no applicable hint (no control shown); replacing an own value needs an explicit choice | "Use accepted answer" is a button per question; "Use all available accepted answers" in the action bar | inline under the control | hint.* |
R4a |
| Owner session: eligibility explanation timeline (OS-A08) | Stages › Monitor, Study history; reviewer "Why isn't this available to me?" | entry, departure, review start, completion, configuration change, continuation, tracking gap, "No review is recorded"; historical versions labelled | list semantics; Enter opens the evidence | single column | explain.* |
SP history release |
| Owner session: design-page presence (OS-A01) | question and form design pages | viewing, editing, editing marker per question, live update arrived, conflict (both versions kept), publishing banner, live updates paused | avatars have names as accessible labels; conflict panel takes focus | avatars collapse to a count | presence.* |
R1a, R2a |
| Owner session: active-work impact preview (consolidation §6) | publication, target change, merge, unmerge, capacity, filter, continuation, stage completion, policy, import acceptance, exclusion, deletion, conversion waves | computing, ready, changed since reviewed, Apply anyway available (temporary reservations only), committed, refused; counts for all, names only with Monitor | stepper roles from the impact scaffold; Confirm and Apply anyway are separate buttons | one section per screen | impact.* |
R2c |
| Owner session: reviewer-pool browse list and Saved work (OS-A27, OS-A05) | Review › Browse; Saved work | available, waiting for the team's screening result, enough reviewers, stopped by exclusion, no longer in this stage; own status per step only | list with row actions; Enter opens; start re-checks admission | cards below lt_sm |
browse.*, saved.* |
R3a |
| Owner session: adjudication task (OS-A13) | adjudication step | assigned to me, assigned to my group, claimed, rationale required, inputs changed, resolved | as the reconciliation form | selector plus single column | adjudicate.* |
R4p |
| Owner session: merge conflict resolution (OS-A29) | merge wizard, delegated task | agreeing (prefilled controls), conflicting (side by side), delegated, resolved, unresolved pending | as the reconciliation form | single column | merge.* |
P2b |
| Owner session: training attempt and feedback (OS-A18) | training steps; assessment queue | not started, in progress, submitted, awaiting assessment, passed, failed, retry allowed or not, admitted | as the reviewer form | as the reviewer form | training.* |
Lane TR1 |
| Owner session: consent card (D3-08) | first pilot visit per project | asked, granted, declined, withdrawn | dialog trap and return | full-screen sheet below lt_sm |
consent.* |
R2a pilots |
Existing shared components are mandatory where they apply: app-page-shell and app-page-state
on every new admin page; the StatusView chip for every status; the long-running-job language for
every operation that can take more than a few seconds (publication phase 2, ASySD matching, as-of
export generation, O2 dry-runs, adoption waves), each with a place in Processing or a
release-owned surface (U40).
4.4 Handoff template¶
Every prototype pack ships with a handoff on this template, modelled on the navigation handoff
(docs/features/material-3-migration/handoffs/project-navigation-drawer/README.md):
- Why it changed (one paragraph; the decisions it serves, by ledger ID).
- Geometry (exact): widths, heights, radii, spacing from
--syrf-space-*. - Type and colour: a table of element → role (
--mat-sys-*or--syrf-*); no literals; a token-mapping table from the prototype's variables. - Data model: the DTO or store shape the pattern renders, including freshness labels.
- Behaviour: states, transitions, keyboard model, pointer and touch, narrow behaviour at the UI-6 widths, reduced motion.
- Copy keys: every string, by deck key, with the glossary term it uses.
- Accessibility: roles, names, live regions, focus order and return, forced colours.
- Acceptance checks: numbered, each tied to a defect found in review.
- Known gaps.
- Deviations log: filled by the implementing agent (file:line), as the navigation plan does.
- Audit against code: DONE, PARTIAL or NOT DONE with file:line, before building.
- Fixture data used: realistic open-licence abstracts and a 200-question form where relevant.
Next design iteration input (owner session, OS-A30). The design-prototype handoff is the self-contained specification for iterating SyRF Prototype v10 against the owner-session decisions: goals, terminology, roles and blinding, the screen inventory with the step selector and one form area, flows and states, configuration ownership, phone, tablet and desktop requirements, MVP and deferred scope, traceability, the prototype changes and a copy-ready design-session prompt. The comparison of v10 and Review Prototype v4 with the decisions is in the UI coverage comparison §6. Prototype packs that come back follow the template above. Producing the handoff is the deliverable; no design session is messaged and no new prototype is built by this package.
5. Copy deck and glossary¶
5.1 Mechanism (E83, F1c)¶
- One copy deck document in the programme's feature folder under
docs/features/(copy-deck.md,PROPOSALlocation), with one definition per term, its internal name (DD glossary), where it appears, and "never use" alternatives. - Typed message constants per feature (
<feature>-messages.ts,as const), followingsrc/services/web/src/app/study-presence/session-messages.tsand the session copy review. Core verbs and terms live in one shared constants file consumed by every feature. - A guard spec over the programme's folders fails when a template or constant uses a banned
string ("Save draft", "All changes saved", "Submit", "Gold standard" as a bare label, "Outcome"
for a screening result, "Unavailable" for progress, "canonical", "legacy") or hard-codes a core
verb instead of importing it; modelled on
no-hardcoded-help-urls.spec.ts. - User-guide glossary parity: every deck term marked
glossarymust have an entry inuser-guide/getting-started/glossary.md; a docs script checks it in CI. The guide's "Save"/"Submit" wording (annotating.md:239-249) is corrected in the R2a docs PR. - Validation: a terminology card sort in W0 (U42) before the deck freezes at F1c.
5.2 Terms and verbs (D3-03, Q-D4, Q-D5, DD-11)¶
| User-facing term | Meaning | Internal name | Never use | Label |
|---|---|---|---|---|
| Save progress | Create an immutable incomplete version that becomes current | SaveSession |
Save, Save draft | |
| Complete | Validate and create an immutable completed version that counts | CompleteSession |
Submit, Finish | |
| The autosaved draft is held on the server as a recoverable draft; it is not a version or a submission | SessionDraft |
Saved, Draft saved, All changes saved; superseded: "Changes kept, not yet saved", "Autosaved—not yet submitted" | ||
| Owner session: Version checkpoint saved (illustrative) | Save progress created an immutable incomplete version; it does not imply completion; it stays visible when newer edits are autosaved | SaveSession result |
Saved (alone), Submitted, Completed | Decided D3-03 with the U1 amendment and wording flexibility |
| Needs updating | An answer invalidated by a publication choice; blocks Complete until valid | policy requireReanswer |
Invalid, Stale | |
| Outdated answers | A session pins a superseded shared revision; a warning that never blocks alone | SF5 flag | Contains outdated annotations (DTO wording only) | |
| Fix | Create a current incomplete version from an outdated session and open it | FixTransition |
Repair, Reopen | |
| Update to version N | Move a session to the current form version (Upgrade transition, VA-10) | Upgrade | Migrate, Rebase | PROPOSAL |
| Accepted answers (gold standard) | The reconciler's authoritative answer set; "(gold standard)" in help text on first use | StudyGold, GoldSnapshot |
Gold as a bare label, Reconciled answers as a status | AcceptedResultVersion) |
| Screening result | The collective result for a profile (Pending, Conflict, Included, Excluded) | ScreeningOutcome |
Screening outcome (UI), Outcome | |
| Your decision | A reviewer's own Include or Exclude (or Unsure |
ScreeningDecision |
Vote | PROPOSAL |
| Outcome measure, outcome data | Measured outcomes and their series | OutcomeMeasure, Observation |
Outcome for screening | DD glossary |
| Query, concern, resolution | A challenge to an accepted answer and its per-raiser result | Concern, ConcernResolution |
Outcome for a query | DD glossary |
| Publish (a form or profile version) | Make a version current with a recorded impact choice | FormVersionIssue, ProfileVersionIssue |
Release, Deploy | DD glossary |
| Unpublished | A form, profile or question version not yet published; editable until first use | draft definition | Draft | PROPOSAL (PH-19) |
| Review (your review of a study) | A reviewer's work on one study and one form, across stages | FormSession |
Session | PROPOSAL |
| Step | One unit of a stage's workflow (screening, form or both) | ReviewStep |
Task, Phase | ledger DP6 |
| Screening profile | Profile-owned eligibility questions and rules | ScreeningProfile |
Rationale, Criteria set | DP4 |
StudyAliasStudy state, StudyVersion, StudyMerge, StudyUnmerge |
Canonical study; alias | DD glossary; D2-12 replaced (OS-A29) | ||
| Classic workflow, Versioned workflow | A project's mode before and after admission | CanonicalEnrolment |
Legacy, Canonical, New | PROPOSAL (§3.3) |
| Review slot | The reviewer's right to review a study for a form; held while active | SlotReservation |
Spot, Reservation, Session | shipped (session-messages.ts), RT-22 |
| Enough reviewers | The study has the reviews it needs for that step; no new slot | capacity | Unavailable, Sufficiently screened, At capacity | RT-22, UX-22 |
| Released | The slot is no longer held (idle or offline timers lapsed) | expiry | Expired, Removed | RT-22 |
| Offline | The browser cannot reach SyRF | connection state | Disconnected from the server | RT-22 |
| Informed, independent | Whether a contribution was made after seeing accepted answers (VS2) | ExposureState |
Contaminated | VS2 |
| Held | Reconciliation work waiting on a compatibility decision | task held state | Blocked | v10 §3 |
| Accepted copy, Copy from another tab | A draft kept from a non-holder tab after take-over (§6.5) | conflict copy | Conflict | PROPOSAL; owner session: under D2-08 (one shared session across tabs) the copy arises only from a stale-base conflict |
| Owner session: Saved work | Started work a reviewer may still finish after the Study left the stage pool or after exclusion | continuation basis | Pool, Available | SP spec §13 |
| Owner session: No longer in this stage | The Study left the stage's pool (filter-driven departure) | StagePoolDeparted |
Excluded (unless the reason is a screening Exclude) | SP spec §13 |
| Owner session: Waiting for the team's screening result | A step needs the collective Include (stage setting) | progression basis | Locked (alone), Pending | SP spec §13 |
| Owner session: Enough reviewers are already working on this | No place is free on the form or step | capacity | Unavailable, At capacity | SP spec §13; D3-19 |
| Owner session: Stopped by exclusion; Already sufficiently reviewed; No review is recorded | Exclusion-stop applies; the activity is sufficient from evidence collected anywhere; history shows no review (never an invented reason) | exclusion-stop; sufficiency; absence of records | Rejected; Done; Skipped | SP spec §13 |
| Owner session: Unsure | A reviewer's own decision that the Study is not excluded but not a definite Include | ScreeningDecision value |
Maybe, Don't know | D4-01 decided |
| Owner session: Adjudication; adjudicator | Resolution of a tie or unresolved Unsure by an assigned member or group member, in the adjudication step | AdjudicationTask |
Override, Tie-break vote | OS-A13 |
| Owner session: Hint from accepted answers; Use accepted answer | A labelled existing accepted answer; the explicit copy action | HintExposure, HintAdoption |
Prefilled, Suggested answer | OS-A04 |
| Owner session: AI-model-generated screening decision; AI screening model | A screening decision imported from an AI screening model, attributed to the model, never to a person | ExternalScreeningDecision |
Model decision, Robot, Auto-screen | RI spec (superseded wording 14) |
| Owner session: Deleted project | A project in the reversible deleted state, restorable from the Deleted projects view | Project.deletionState |
Archived, Removed, Erased | OS-A25 |
Distinct terms for each kind of draft (PH-19, ADR-010's five conflated drafts): reviewer autosave = "kept changes"; explicit incomplete version = "progress saved" or "In progress (saved)"; reconciler autosave = "kept changes" (same machine); correction in progress = "Correction in progress" (v10 r5); unpublished definition = "Unpublished"; resumable setup = "Setup in progress"; conflict copy = "Copy from another tab". The word "draft" appears only in the deck's internal-name column.
Owner session (OS-A21). Reviewer and reconciler autosave become "Draft auto-saved" and an explicit incomplete version becomes "Version checkpoint saved" (both illustrative). The owner's wording uses the word "draft" for the autosaved state, so "the word 'draft' appears only in the internal-name column" is superseded for that one term. The other draft kinds keep their distinct terms ("Correction in progress", "Unpublished", "Setup in progress", "Copy from another tab") so the five meanings stay separate. Design-page drafts of questions and forms are "Unpublished" and are never labelled with the reviewer status words.
Readiness vocabulary (approved AF2 four-state model, PH-19; DOC-APPROVED). Answer scopes
(categories, entities, branches, steps) use exactly the four approved states and their
precedence: Needs attention (a revealed applicable issue), Ready (every applicable
completion requirement met), In progress (some meaningful answers, work remaining),
Not started; "No applicable questions" is handled before them, and 0/0 counters are hidden.
"Ready" is for answer scopes; "Completed" is reserved for the persisted review lifecycle. Counts
are named ("1 of 3 required answered"). The programme extends the model with two scope-level
markers that never change a state's meaning: Needs updating (a publication choice invalidated
an answer; shown as Needs attention with its own wording) and Outdated answers (a shared
revision was superseded; a warning that never blocks alone). Status glyphs are shape-distinct
with contextual accessible names, never colour alone.
5.3 Reviewer progress vocabulary (UX-22)¶
| Term | Replaces | Where |
|---|---|---|
| Your work: N in progress, N completed | "Incomplete studies" headings | My work, My studies navigator, stage progress dialog |
| Available to you | "Studies to screen" | progress strip |
| Waiting on others | (none; today shows "Unavailable") | progress strip, My work empty state |
| Locked by a step | (new, R3a) | step strip tooltip, My work |
| Enough reviewers | "Unavailable", "sufficiently screened" (user-guide/stages/screening.md:37) |
progress strip, slot copy |
5.4 Slot and presence copy (RT-22, D2-07, D3-19, D3-20)¶
Pending D2-07's recommended rule (held while active under today's idle and disconnect timers counting draft activity; released when they lapse with the draft kept; Complete still allowed as an extra contribution unless an optional capacity cap applies, D3-17):
Owner session (D2-07 and D2-08 decided; D3-17 and D3-18 carry-forward alignment). The "middle ground" rule above is superseded. The form owns the inactivity timeout and the per-reviewer in-progress limit across every route and tab. One shared session holds one place across tabs, devices and stage routes; an idle or closed tab never releases it while another connection is active; when the session times out the place is released and the draft is kept (SP spec §3.11). The capacity cap is a form-owned baseline separate from the target, off by default and equal to the effective target when enabled (both defaults proposed, not approved); it never evicts held work. In the copy below, read "slot" as "review place" and "Your changes are kept" as "Your draft is kept". Where tracking is off the admin UI says "capacity not enforced".
| State | Copy (Comfort, Explain, Act) |
|---|---|
| Held | "Your review slot on this study is held while you work. Your changes are kept as you go." (status line only; no banner) |
| Idle warning | "You haven't done anything here for a while. Your slot will be released in [countdown], but your changes are kept." |
| Released, slot still available | "Your review slot was released while you were away. Your changes are kept. Continue to take a slot again." |
| Released, enough reviewers, no cap | "This study now has enough reviewers. Your changes are kept, and you can still complete this review as an extra review." |
| Released, enough reviewers, cap applies | "This study now has enough reviewers, so this review can't be completed. Keep your changes or discard them." [Keep] [Discard…] |
| Dependent step refused at Include (D3-19) | "Your Include is recorded. This study already has enough reviewers for [step]; nothing more is needed from you here." Owner session (D3-19 brief item): the step shows "Enough reviewers are already working on this" and the screening decision stands |
| Offline | "You're offline. Changes are kept on this device until you reconnect. Your slot is held for [countdown]." Owner session: local holding on the device is ambiguity A1 (§6.4); the UX spec's illustrative copy is "Offline. Your latest edits are held until you reconnect." |
| Presence (D3-20) | "N reviewers on this study now" (count only; names only in Monitor for capability holders; never shown in reconciliation). Owner session: D3-20 is a brief item; a Monitor holder who is also the blinded reconciler for that Study sees no names (SP-AMB-07 recommendation) |
| Owner session: Saved work after departure (OS-A05) | "This study is no longer in this stage. You can still finish the work you started; your draft is kept." With a restriction: "An administrator has stopped further work on studies that left this stage. Your draft is kept." |
| Reconciler editor claim refused (X-RECLAIM) | "Someone else is reconciling this study right now. Choose another study or come back later." |
5.5 Error and recovery copy for typed conflicts (UX-17)¶
Every typed outcome names what moved, what is kept and one primary action. All strings come from the deck; focus moves to the summary; nothing is lost silently.
| Typed outcome (C18) | What the reviewer sees | Options | Preserved |
|---|---|---|---|
| Stale base (Save or Complete on a superseded draft etag or base) | "A newer version of this review was saved, perhaps in another tab. Your changes here are kept as a copy." | Open current version (primary); Compare copies | Both: the current version and the copy |
| Two-tab lease (second tab opens). Superseded (D2-08 decided): both tabs edit the one shared session with base-version checks; a same-answer conflict shows a panel with both values. Read-only with take-over is only a brief option for small screens (RD §12) | "This review is open in another tab or on another device." | Take over editing (primary); View only | The other tab's edits become a copy on take-over |
| Lease lost (this tab was taken over). Superseded with the row above | "Editing moved to another tab. Changes you made here since [time] are kept as a copy." | Reload; Compare copies | The copy |
| Retryable conflict or outcome unknown | Save-status Retrying; after exhaustion, Failed with Retry | Retry; keep working | Kept changes on this device |
| Locked, fenced, publication in progress (D2-10) | "This form is being updated. Reviewing resumes in about [n]. Your changes are kept." with a progress line | Wait; go to My work | Draft |
| Size limit exceeded (E28). Owner session: D2-16 is replaced; limits are engineered for the largest project, an acceptance case (RD-R33), so this copy applies only to genuine limits beyond it | "This review is too large to keep in one piece. Save progress now to keep what you have." | Save progress (primary) | Draft up to the limit |
| Conflicted legacy answer | "Two earlier answers to this question disagree. Choose which to keep." | Choose; keep both visible in history | Both revisions |
| Held for compatibility (R4a) | "This study is held until an administrator decides whether versions are compatible." | Open another task | Nothing changes |
| Revoked access | "You no longer have access to this project." (inbox: "Related item unavailable") | Go to My work | Drafts retrievable by owners (AC-ALL-18) |
| Admission refused, feature unavailable | "This isn't available in this project yet." | Back | n/a |
| Read-only containment (U28) | §3.3 banner | None; nothing is editable | Everything saved |
| Enough reviewers (AtCapacity) | §5.4 | Keep or discard | Kept changes |
| Owner session: project deleted (OS-A25) | "This project has been deleted. Your draft is kept." | Go to My work | Draft and all history |
Owner session: continuation restricted (ContinuationRestricted, OS-A05) |
"This study is no longer in this stage and further work on it has been stopped. Your draft is kept." | Go to Saved work or My work | Draft |
| Owner session: stale browse item | "No longer available in this stage" (rendered under blinding) | Back to the list | Nothing changes |
| Owner session: impact changed at commit | "The impact changed since you reviewed it." with the difference listed | Review and confirm again; Cancel | Nothing commits |
6. Reviewer efficiency¶
6.1 Keyboard screening path (UX-02, PH-35; R3a/R3b scope, E87)¶
Moved into this plan's scope at R3a (default profile without eligibility questions) and R3b (profiles with eligibility questions), because they belong to the screening renderer and step strip that F5 owns, not to the AF2 parity join. Pending D3-05 the same path works on a phone for title and abstract steps. Owner session (D3-05 decided-amended): phones, tablets and desktops support screening and full annotation at launch, including very large forms, with no feature removed solely because the device is a phone (UX-R04 to UX-R07). Presentation may differ by device; draft, Save progress, Complete, validation and access behave identically.
| Situation | Keys | Actions per decision |
|---|---|---|
| Plain profile (no eligibility questions, reasons off) | I include, E exclude; auto-advance follows the review preference ("open the next study" default) |
1 |
| Reasons required on Exclude (DP5) | E, then a reason by number key or arrows and Enter |
2 |
| Derived decision (DP3, profiles with eligibility questions) | answer questions by number keys or arrows; the derived decision and its reasoning update live but never vote; Enter submits | answers + 1 (the submit is the decision) |
| Unsure ( |
U as a third decision key where the profile allows it; "Unanswered only" moves to Shift+U |
1 |
| Skip without deciding (RC6) | N |
1 (records nothing) |
| Navigate | J jump to next required, [ ] previous or next step or category |
n/a |
Rules: keys are ignored while a dialog, menu or text field is active; the decision card shows
kbd hints only once the shortcut is live (review-decision-card.component.spec.ts:391-392);
under DP3 the I and E keys are inert and the hint reads "Answer the questions; Enter
records your decision", so one key never contradicts a derived decision (PH-35); every key has a
visible button equivalent; a 390px phone shows the same card with 44px targets and the keyboard
hidden (U33). The ≤2 actions rule counts actions beyond answering eligibility questions.
6.2 Live completeness and jump¶
Every form host (reviewer, reconciler, setup wizard) shows "N required missing · Jump to next"
in its action bar while incomplete (grey pending; error only after a rejected Complete), per
Review Prototype v4 and the approved AF2 plan's summary pattern. Jump opens the right step,
category, branch and entity, waits for the target to mount and focuses the control. The
reconciler's count reads "N to resolve" (v10 §7). Validated in U34.
6.3 Input latency under autosave¶
Autosave never blocks input. Draft serialisation and the write happen off the input path
(debounced; PROPOSAL 2 s per AC-R2a-28); the per-holder write sequence makes duplicates
harmless (brief §1.8). Budget: keystroke-to-paint p95 under 50 ms at 200 and 1,000 questions on
the AF2 perf spec's reference profile (e2e/tests/perf/annotation-form-perf.spec.ts), measured
with autosave on (AC-UX-04).
6.4 Save-status state machine (UX-04)¶
One quiet status in the action bar; one polite live region; no toast per autosave; the dirty navigation guard arms on any kept change that has not reached the server.
| State | Trigger | Copy | Announce | Actions |
|---|---|---|---|---|
| Clean (owner session: Version checkpoint saved, or Complete) | no change since the last version | no | none | |
| Saving | a change is being kept | no | none | |
| Kept (owner session: Draft auto-saved) | the server acknowledged the draft (etag advanced) | once per editing session, not per keystroke | Save progress, Complete | |
| Retrying | a retryable error or outcome unknown; same write sequence resent with backoff | once | none; input continues | |
| Offline kept on this device (owner session: subject to ambiguity A1 below) | navigator.onLine false or health probe failing; changes written to a bounded local copy (IndexedDB) |
once | none; input continues | |
| Failed | retries exhausted or a non-retryable typed outcome | once, with focus to the status on an explicit Save or Complete | Retry; Save progress stays available when the server returns | |
| Reconnected | connectivity restored; local copy replayed in sequence | once | none | |
| Owner session: Not started | no draft and no version | "Not started" | no | none |
| Owner session: incomplete Save over a completed version | the reviewer presses Save progress while the latest version is completed | Confirmation first: "Saving progress now replaces your completed version. This review will stop counting as complete until you complete it again." (Q-27) | the dialog | Save progress; Complete instead; Cancel |
Rules: the local copy replays only while the server draft etag is the one it was based on;
otherwise it becomes a "Copy from another tab" (§6.5) and is never applied silently; Save
progress and Complete present the draft etag and consume the draft atomically; a stale autosave
arriving after a newer explicit version is discarded by the client (brief §1.8). Harvested from
QM v2 §14 (.local/qm-designer-handover/04-versioning-and-publishing/publishing-versioning-ux.md:845-928)
with the states renamed to the deck. Validated in U31; AC-UX-06 covers recovery.
Owner session (D3-03 with the U1 amendment and wording flexibility, OS-A21). The states are
renamed as marked. The three meanings are fixed and the words are illustrative: a recoverable
autosaved draft ("Draft auto-saved"), an explicit immutable checkpoint ("Version checkpoint saved")
and a completed version ("Complete"). An autosaved draft is never called a version or a submission,
a checkpoint never implies completion, and an earlier checkpoint stays visible when newer edits are
autosaved (UX-R11 to UX-R13). The copy-deck guard rejects the superseded strings "Changes kept, not
yet saved", "Autosaved—not yet submitted" and "Save draft" (UX-R15, PROPOSAL enforcement). Legacy
screens keep truthful legacy wording, because a legacy save overwrites the session (§3.4).
Ambiguity A1: holding edits on the device during a connection loss (UX spec §12; no owner
answer assumed). The "Offline kept on this device" row, E82 and AC-UX-06 assume a bounded local
copy in IndexedDB replayed on reconnect. The owner said no offline writes are authorised and
protected data must not be cached by accident (U2 PWA clarification). Options: (a) keep a bounded
in-session holding area for short interruptions, cleared at logout, completion and access loss,
never used to fetch new work, replayed only when the server base version still matches; (b) hold
edits in memory only, so closing the tab loses unacknowledged edits; © remove local holding until
the PWA design decides. Recommendation: (a), described as connectivity resilience within one
editing session and confirmed explicitly in the UX brief because it stores answer data on the
device. Until confirmed, the row and AC-UX-06's 60-second offline interval stay PROPOSALs.
6.5 Conflict screens¶
- Two-tab take-over (RT-10, D2-08): the second tab opens read-only with a banner and "Take over editing"; take-over transfers the lease by stable client tab ID; the displaced tab is told why, keeps a local copy until reload, and its unsaved edits are kept server-side as a bounded conflict copy ("keeps both" is literal). Copies appear in the history panel with timestamps; the reviewer chooses "Use this copy" or "Discard copy" (audited). Works with tracking off. Superseded (D2-08 decided in the owner session): one reviewer uses one shared session and place across tabs and devices. Connections are tracked separately, both edit with base-version checks, and a change to the same answer from a stale base shows a conflict panel with both values; nothing is discarded silently. The read-only and take-over presentation is only a brief option for small screens (RD spec §12; UX spec §8).
- Stale base: §5.5 row 1. The screen shows both timestamps, which tab or device made them when known, and a per-question comparison for small forms (a count plus "Compare" for large).
- Enough reviewers after a released slot: §5.4; a draft never holds a slot for days (D2-07). Owner session: the form's inactivity timeout releases the place and keeps the draft; completing it later re-checks capacity (D2-07 decided).
7. Key flows¶
7.1 Reviewer screening and annotation¶
Study header (title, position, chips: Your decision, Completed, In progress (saved), Kept changes, Needs updating) → step strip (R3a) → one form area for the selected step → decision card (equal-weight Include and Exclude; derived decision with reasoning under DP3; reasons under DP5) → action bar (Revert, N required missing · Jump, Save progress, Complete) → save-status line. Needs updating shows beside each affected question with "Why it changed" and "What to do differently" (VU2); Complete is refused until valid, with the summary focused (approved AF2 plan). Outdated answers show a non-blocking warning with Fix (R2d). Presence shows counts only. The history panel lists versions, kept copies and policy-derived revisions with provenance.
Owner session. The step strip is the step selector with one form area (Q-12 decided). The chips read Version checkpoint saved and Draft auto-saved (OS-A21). Where the form shows hints, applicable accepted answers appear as labelled hints beside the control, with "Use accepted answer" per question and "Use all available accepted answers"; nothing is prefilled, and exposure and adoption are recorded (OS-A04; RS-R31 to RS-R38). Unsure is a third decision where the profile enables it (D4-01). A locked step says why and what unlocks it, without revealing other reviewers' decisions. Outdated answers may block Complete where the form chose that mode (D4-17). Generated session versions from a publication appear in history with their publication as cause (D2-01 as amended). The flow runs on phones, tablets and desktops with the same functions (D3-05).
7.2 Fix, Upgrade and Needs updating¶
| Situation | What the reviewer sees | Action | Result |
|---|---|---|---|
| Publication chose requireReanswer | "Needs updating" chip on the session in My work and on the question in the form; blocks Complete | Answer; Complete | A new version pinned to the current form version |
| Publication chose doNothing; session pinned to an older version | Version badge "On form v1 (current is v3)" with "Update to v3" | Update to v3 (Upgrade, VA-10) | A current incomplete version with unchanged answers carried where compatible |
| A shared answer changed elsewhere (SF5) | "Outdated answers" warning on the session; Complete still counts (AC-R2d-05) | Fix | A current incomplete version opens; the outdated answers are marked |
| Fix on a session pinned to a Completed stage (LC1) | "This stage is complete. Your fix will wait for an administrator." | Request the change | A pending request in "changes awaiting approval"; the reviewer sees its state in My work |
7.3 Reconciler end-to-end journey (UX-14)¶
Pool (KPI cards, Start reconciling, assigned-first then random eligible as the next-task rule,
PROPOSAL) → task header (how assigned, "Reviewers blinded", editor claim held) → screening
part first (RX1, R4p: decisions, reasons, must-agree answers) → matching (3a; drag with CDK
pointer events plus a keyboard "Pair with…" path) → form part (4a: pills, agreement icon,
autofill marker, "N to resolve", Complete anyway after the unseen-control warning) → Complete
(gold snapshot) → next task (same rule) or back to pool.
- Narrow layout: below
lt_mda candidate selector plus a single column; disagreeing candidates are never hidden by the selector; the side-by-side view is desktop-only. - VS2 disclosure (U16): before accepted answers are shown to a candidate under VS1 on, a one-time interstitial: "You are about to view accepted answers for this study. Your contribution will be recorded as informed." [View accepted answers] [Not now]. Owner session (OS-A04): hints are shown by default from the form baseline, so the interstitial no longer gates viewing. The reviewer form labels each hint as an existing accepted answer, and "informed" is recorded when a hint renders in view and when it is adopted (RS-R34, RS-R35). Whether a one-time explanation of what "informed" means is still wanted is a design detail for U16.
- Release and reacquire (RA3, RA4): copy in the deck; an admin release keeps saved work.
- Validated as U36 (journey) with U1, U4, U16, U20 as its parts.
- Owner session (OS-A02, OS-A03, OS-A13, OS-A28, Q-11, Q-30). The task header's "Reviewers blinded" comes from the form's setting (annotation) or the profile's (screening), blinded by default. Candidates appear in a random order under context-local labels with no submission times or other chronology clues. A target-one form that requires human reconciliation shows a one-candidate layout: the single candidate's answers beside the reconciler's form, labelled so the result reads "Human reconciled". Screening ties and unresolved Unsure go to a separate adjudication step in the step selector, shown only to eligible adjudicators, with assignment to a member or a group and the individual resolver recorded. Bulk acceptance appears only where the form enables it. Unstarted-assignment expiry is optional and off by default.
- Ambiguity A2: reconciliation and design screens on phones (UX spec §12; no owner answer
assumed). D3-05 requires screening and full annotation on phones. Options: (a) require phone
acceptance for reconciliation too; (b) keep reconciliation's narrow layout usable with no feature
removed, without a phone acceptance gate; © desktop only. Recommendation: (b) for
reconciliation, with design and admin screens responsive but not phone-accepted at launch
(
PROPOSALs).
7.4 Admin publication as a staged flow (UX-10)¶
Replaces "one dialog combining five concerns" with a four-step flow on the impact scaffold:
- Review changes: changed questions grouped by category (FEAT-003 categories, PH-18) with the system-suggested compatibility and the admin's confirmation (D2-02).
- Impact summary: per prior version and per bound stage, the counts of completed, saved-incomplete and draft-only sessions, with freshness labels and the stale-evidence gate.
- Choices with defaults: per changed question, requireReanswer, autoUpdate (within a compatible class only) or doNothing, with within-session conflicts resolved explicitly; a "what reviewers will see" preview renders the form with Needs updating markers for a sample session in each category.
- Confirm: a dry-run summary table (sessions affected per choice, notices to be sent once per recipient, time estimate for phase 2); the preview digest is re-checked and the admin re-confirms if it changed (brief §1.1).
After confirm: a long-running operation row (phase 2 progress with a real numerator) and, where admission pauses (D2-10), the reviewer-facing pause copy. Prototyped on a realistic fixture (10 changed questions, 3 stages, 200 sessions across the three categories); comprehension criterion in AC-UX-02. Validated in U6 (revised).
Owner session. Step 1's "admin's confirmation (D2-02)" becomes the publisher's explicit compatibility and mapping declaration, immutable from commit; SyRF only suggests defaults (Q-34 decided; D2-02 decided-amended). A standard-target change is a publication with impact even without question changes (OS-A12). The impact summary names the attributable generated session versions the publication will write (D2-01 decided-amended). Step 4 uses the shared active-work impact preview (§7.14) and its recheck at commit. Profile publications follow the same flow with mismatch detection (Q-26 decided). Only one publication runs per form; collaborators see "Publishing by [name] since [time]. You can keep editing drafts." (§7.13).
7.5 Stage designer and step strip¶
The v10 r2 steps editor in a tabbed layout (U12): steps, dependency edges separate from display order, the effective-policy preview backed by the real admission service, cycle rejection, EW1, VS1, BL1 and lifecycle mode; versioned settings publish uses the same impact scaffold. The reviewer sees the result as the step strip (U7, Q-12).
Owner session (Q-15 replaced; Q-01, Q-02, Q-28; OS-A05, OS-A27). The designer gains a stage
study filter editor: clauses on screening-profile outcomes and reconciled answers in AND/OR
groups, which defines the stage's pool, with a feedback notice when a clause reads an activity bound
in the same stage. No cross-stage route control exists. Steps keep in-stage dependencies, with
progression after the reviewer's own Include by default and a stage setting that requires
collective Include. Each step has exclusion-stop, and the stage shows "Finishing work already
started" settings (saved work after exclusion; continuation after pool departure; placement is
SP-AMB-01). A route capacity cap may be stricter than the form baseline. Optional reviewer-pool
browsing is a stage setting (PROPOSAL). BL1 and VS1 leave the stage: blinding is on the form or
profile, and the hint baseline is on the form with a step hide-only override. System adjudication
and training steps appear as step kinds. The lifecycle follows Q-02: an automatic Completed stage
recalculates when remaining work appears, and a manual one stays Completed until reopened.
7.6 Lifecycle approvals¶
Changes awaiting approval (R3c) appear in My work and the admin banner; the approve dialog (U10) shows the specific change, its effect on readiness and shared work, and "approved by you" or "decided by [alias]" once another admin acts (pending D3-23). Owner session: D3-23 is a brief item (resolved notices leave unread counts and stay in history, with the resolver reference shaped by disclosure). Under Q-02, approval is needed for protected changes acting on a Completed stage itself; new arrivals with remaining work recalculate an automatic Completed stage without a hold.
7.7 Guided setup with an interim checklist (UX-19)¶
R2a replaces the footer checklist's content with readiness-based tasks (profile, form, step, members) while keeping its placement and interaction (21 September decision). R3d's guided route (U11, prototyped in W1) is measured by AC-UX-07: a new admin reaches a screenable stage from templates in 20 minutes or less without help.
7.8 Exports and PRISMA¶
The export page gains a Current, Previous versions, As of date selector with manifest download and per-dataset coverage labels (U22); unmasking follows the disclosure contract (U26). PRISMA views under Data show the diagram, reported external counts marked as reported, coverage and lower bounds for adopted projects (U23). Owner session (RI spec §13): PRISMA views label imported references, source documents and Study items; show report identity, reason, retrieval and pool-tracking coverage and the machine-assisted share per phase; and present actual review through a stage as the reporting priority, with pool history as separate audit data (OS-A09). Stage flow views never label a departure as an exclusion unless it was a screening Exclude. Exports gain lane X1's comparison export, codebook and RIS, and the machine-source columns (D4-09, OS-A20).
7.9 Notifications versus work queues (NS-07, NS-10, NS-13)¶
My work is the source of truth; the inbox is delivery and history. The notification stack's
inbox and preferences screens meet UI-1 to UI-11 before testers see them and the conversation,
issue and PDF screens before production (pending D3-01), through a Material 3 inbox redesign PR
before R2c (NS's evidence for the current inbox is in the stack worktree, CODE-PR,
not re-read here). Flood controls before R2c: mark all read; project and kind filters; a context
line from the resolver; "hide unavailable"; an unread count that excludes resolved items (D3-23);
digests grouped by project and kind; jittered refetch with per-request authority memoisation;
older publication notices for the same form marked superseded. Emails name the project only
(pending D3-22). Owner session: "Emails name the project only" is superseded (D3-22
decided-amended through O2): emails and digests may include project and study context including
study titles; aliases and other content follow recipient permission and blinding; answers and free
text are configurable per project (off by default, PROPOSAL); rights are checked at delivery. A
person can mute email per project while in-app notices continue (D3-24). Project settings gain a
notification content screen for that policy. D3-01 and D3-23 are brief items. Notification
delivery remains unauthorised (notifications integration §7).
7.10 Admission and pilot operations¶
The workflow version panel (§3.3) is the admit or remove screen; the read-only containment banner is what reviewers see after a rollback (U28, U32). Owner session: after trials and pilots, universal conversion waves reach every project with a notice period; findings and blockers appear in admins' My work, and a later in-engine wizard can redesign a converted project through versioned publication (OS-A14, OS-A15; BC spec).
7.11 Reviewer-pool browsing and Saved work (owner session, OS-A27, OS-A05)¶
When a stage enables browsing (PROPOSAL: a stage setting, off by default), a reviewer can list
their own reviewer study pool: the Studies in the stage's current pool that are allocated or
assigned to them and currently available. Each row shows bibliographic details (hidden where the
profile blinds them), the reviewer's own status per step and availability ("Available", "Waiting
for the team's screening result", "Enough reviewers", "Stopped by exclusion"). It never shows other
reviewers' decisions, answers, identities or timing. The list is dynamic: a Study that becomes
unavailable leaves it, and starting work re-checks admission. Browsing grants nothing. Started work
that may continue after a Study left the pool appears in a separate Saved work list with its
reason (SP spec §3.6, §3.9; UX spec §3.5).
7.12 Eligibility explanation (owner session, OS-A08)¶
An admin "Why?" panel, opened from a Study's history or a Monitor row, shows in time order the pool entries and departures with filter versions and clause results, review starts and submissions with the eligibility recorded at the time, configuration changes, the current reason category and any continuation after departure. Historical entries show the versions in force then. A Study that was eligible and not reviewed says "No review is recorded"; a tracking gap says "History before [date] was not tracked". Reviewers get "Why isn't this available to me?" with their own reasons only (UX spec §3.7; UX-R27 to UX-R29). On unconverted projects it explains current state only.
7.13 Presence on question-design pages (owner session, OS-A01)¶
Authorised users see who else is viewing and editing a design page, with names, avatars and a per-question editing marker. Accepted changes appear live in other views and never overwrite what a user is typing; when two people changed the same item, both versions stay visible and recoverable. Each accepted change shows its author and time in history; presence itself is not an audit record. Many drafts may be open, one publication runs per form (UX spec §3.8).
7.14 Active-work impact previews (owner session, consolidation §6)¶
One shared preview screen precedes every admin action that affects people working now: what changes; who is affected (counts for everyone, names only for Monitor holders, never across reconciliation blinding); what is kept; which temporary reservations would be released; dependent results whose inputs change; which notices will be sent. Actions are Cancel, Confirm and, only when the change conflicts with temporary reservations, Apply anyway, whose text names what it releases. Apply anyway never bypasses permissions, allocation constraints or invalid configuration. The impact is rechecked at commit; a changed impact shows the difference and asks again (UX spec §3.9; ACD spec §3.10). It builds on the impact flow scaffold of §4.3; the first consumer is R2c publication.
7.15 Duplicate merge and unmerge wizard (owner session, OS-A29)¶
The wizard previews the merge with active-work warnings, shows agreeing answers in resolution controls and conflicts side by side in a reconciliation-like view, lets the merging user resolve or delegate a conflict to the original reviewer as a task, asks the merger to confirm the resulting effective target, rechecks at commit and records the actual resolver. Unmerge is a new action with per-item carry-forward choices (to either restored Study, or left on the historical merged Study). Study-level bibliographic fields show their source or manual override (DM spec). Validated as U41.
7.16 Training (owner session, OS-A18)¶
A training step appears in the step selector where configured. The reviewer practises on reference Studies, submits an attempt and sees feedback as the policy allows; reference answers never appear before submission. Admins see an assessment queue, can pass or fail attempts with feedback, decide retries under the policy and see admissions to a group with the attempt, assessment and policy that caused them. Training works by keyboard, touch and screen reader on every device class (TI spec; TI-AE14, TI-AE15).
7.17 Access, catalogue and deletion screens (owner session; ACD spec)¶
- Contribution exclusion dialog (OS-A24): choose the form, profile, stage or project; give a reason; review the impact preview, including dependent results; resolve mixed route provenance explicitly; confirm. Reachable from the membership-disable workflow.
- Deleted projects view (OS-A25): a restricted list with deletion records and a restore action with reason and impact preview; restoration never revives stale reservations.
- Catalogue browser and request queue (D2-15): browse and copy catalogue item versions with provenance; request publication; catalogue administrators review requests.
- Notification content settings (D3-22): the project's content classes for emails and digests, narrowing what disclosure allows.
- Account deletion display: names of deleted accounts keep showing to authorised viewers, with
an "(account deleted)" suffix (
PROPOSAL); joining terms explain that contributions stay attributed (legal review before release).
8. Accessibility standard and harness¶
8.1 Standard¶
WCAG 2.2 AA is the working standard (PROPOSAL): it adds the criteria this programme needs anyway
(focus not obscured, dragging-movement alternatives, minimum target size, consistent help). The
GA audit is to WCAG 2.1 AA with an independent auditor (D4-18); 2.2-only criteria are reported
separately.
8.2 Harness (E85, L17, W0 and S0)¶
| Element | Implementation | Evidence |
|---|---|---|
| axe in journey specs | @axe-core/playwright added to e2e/; a per-route check with a committed baseline; journey specs call axe at named states (form open, failed Complete, conflict, dialog open) |
zero serious or critical (AC-UX-09) |
| Screen-reader matrix | NVDA with Firefox and Chrome; VoiceOver with Safari (macOS); VoiceOver with iOS Safari for phone screening |
checklist signed per release |
| Keyboard-only journeys | the release's main tasks completed by keyboard alone with visible focus; transcript attached | per release |
| Live regions | one polite region per page for save status, conflicts and status; one announcement per outcome; never per keystroke or per tab change; assertive never for autosave | pattern spec |
| Focus management | focus to the validation summary on a failed Complete; dialog trap and return; take-over moves focus to the banner; Jump focuses the control | pattern spec |
| Forced colours | Playwright forcedColors: 'active' screenshots on the five key surfaces; transparent outlines beside box-shadows (navigation plan decision 5) |
tier-1 matrix |
| Reduced motion | every transition honours prefers-reduced-motion; static indeterminate tracks (Study Management D16) |
guard in pattern specs |
| Zoom and reflow | 200% zoom and 400% reflow at 320 CSS px with no page-level horizontal scroll; short-height layouts (1280×600) keep the action bar reachable | UI-6 matrix |
| Touch targets | 44 px or more below 600 px (Study Management D17); 24 px minimum everywhere (WCAG 2.2) | tier-1 check |
| Contrast | pnpm run check:contrast in both layers; status never by colour alone |
per PR |
8.3 Browser and device matrix (PH-13, review AC-19, D3-15)¶
| Browser | Coverage | Lane |
|---|---|---|
| Chromium (Desktop Chrome) | full E2E, perf, axe | existing projects |
| Firefox | smoke journeys: reviewer screening and annotation, reconciler task, publication flow, My work | new Playwright project on the smoke label |
| WebKit | the same smoke journeys plus phone screening at 390 px with touch; owner session: plus phone annotation at 390 px and tablet journeys at 768 px with touch (D3-05, D3-15) | new Playwright project |
| Touch (iPad, phone) | pointer-based CDK drag only; native HTML5 drag is banned in programme folders by a guard spec; the question-tree designer moves to CDK before R1a ships (question-node.component.html:12) |
R1a precondition |
| Browser floor | commit a .browserslistrc, lower the TypeScript target and add the needed polyfills (the May analysis's BUILD.F1 to F3) before R1a |
programme-integration item; recorded here as part of E85 |
Pending D3-15 for the Firefox, WebKit and touch acceptance rows. Owner session: D3-15 is
Decided (Firefox, WebKit and touch coverage). Chromium keeps full end-to-end, performance and
accessibility runs; Firefox and WebKit run smoke journeys; touch journeys run at 390 px and 768 px;
real-device spot checks on iOS Safari and Android Chrome at staging acceptance are a PROPOSAL
(UX-R44).
9. Research plan with real users¶
| Study | When | Who | Method | Measures |
|---|---|---|---|---|
| Baseline of today's screening and annotation | W0, before the R2a build | 6 to 8 reviewers across the reviewer and admin roles (panel per D1-06), |
Moderated think-aloud on staging, production-equivalent configuration (AF2 off) and, as a second reference, AF2 and the redesigned shell on; realistic open-licence content | Time per title and abstract decision; time per 30-question form; actions per decision; confusion points; SUS; a review of support requests and the FAQ |
| Formative, per freeze gate | W0 to W3, one pack per gate (F1c: reviewer states, forms, history, export disclosure, My work, slots; F2: publication flow; F3: step strip, stage designer, route messages, Skip; F4: N-candidate workspace, matching, assignment, queries; F5: screening renderer, DP2 correction; F6: as-of export, PRISMA; F-C and F-O: cohort chip, schema authoring; R3d: guided setup) | 5 or more per affected role, |
Prototype pack with handoff; tasks mirror the §5 explain questions | AC-UX-01, AC-UX-02 on the prototype; pass bars in §11 |
| Summative, per release | Before each ship gate | The tier's panel (five for T1, three elsewhere, D1-06) | Staging with the seeded pilot projects plus one realistic-content project | AC-UX-01 to AC-UX-09 |
| Pilot diaries | During each staging and production pilot | Pilot project members | A two-week diary (three questions a day) or weekly 20-minute interviews | Pain points to the backlog; PE evidence |
| Terminology card sort | W0 | 8 to 12 participants across roles | Closed card sort of the deck terms against meanings; "which version counts" vignettes | ≥ 80% agreement per core term; U42 |
| Instrumented timing on pilots | From R2a pilots, |
Pilot projects, opt-in at admission; owner session: each user also consents and can withdraw (two-level consent, PROPOSAL) |
Privacy-safe events: study opened to decision; form opened to Complete; actions per decision; no content, no identifiers beyond a per-project hash | AC-UX-03, AC-UX-04 at pilot scale |
The tester panel (D1-06, named by Chris on 3 October 2026; register §1.14). T1 releases: Gillian Currie, Alexandra Bannach Brown, Francesca Tinsdeall, Chris Sena and Nadia Soleman. Other releases: Gillian Currie, Alexandra Bannach Brown and Francesca Tinsdeall. No external SyRF users are named yet; D1-06 asked for at least two "where possible", so the baseline and formative rows' external participants are still to be recruited (D3-08). Owner session (D3-08 decided through U3, 4 October 2026): the agreed panel is unchanged and no extra external recruitment is required now; "at least two external SyRF users where possible" no longer sets a requirement (UX-R24).
Owner-session requirements for the research plan.
- Device scope (D3-05). Formative and summative tasks include full annotation on a 390 px phone and a 768 px tablet, not only title and abstract screening. The largest project (2,023 questions; the figure is VB-12's and UNVERIFIED) is an acceptance case on every device class, never excluded for size (D2-16 replaced; UX-R07). Benchmark tier RV-DS-04 is its synthetic stand-in.
- Ambiguity A3: the largest project as test data (UX spec §12; no owner answer assumed). Options: (a) a synthetic replica at the RV-DS-04 shape; (b) a structure-only replica measured from the real project; © the real project. Recommendation: (a) now; (b) only after a separately approved read-only measurement that copies no study content or answers; never ©.
- Consent-based timing telemetry (D3-08). Timing events are recorded only when the project
administrator enabled pilot timing at admission and the user consented; withdrawing stops new
events at once. Events carry hashed keys, device class and form-size tier, never answer content,
free text, titles, names or clear identifiers. They live in a separate store with time-limited
retention, are reported only in aggregate with a minimum group size, and are never used to judge
an individual (UX spec §3.6; the store, retention of the pilot plus 90 days, the group size of 3
and the
pilotTimingTelemetryflag arePROPOSALs). - Staging seeds (D3-14 decided). Missing staging seeds are added, existing staging data is
preserved where possible, justified staging changes are allowed and production is never touched.
Seeds this plan needs (
PROPOSAL): a synthetic large-form project; a cross-project My work seed; an eligibility-history seed with a tracking gap, a departure and a continuation; a question-design seed with two administrators; and the existing legacy seed projects for the refresh checks.
Consent and data handling. A short consent text in the session invite and in the pilot
admission step; session notes and derived metrics only; recordings optional, stored on CAMARADES
storage and deleted after 90 days (PROPOSAL); sessions use the open-licence seed project, never
a live review; no clinical, report or participant data in notes or events. LogRocket session
recording and Google Analytics are not used for UX metrics; the LogRocket flag stays off for this
purpose (UX-21).
Realistic content. L17 builds a "Realistic content (open licence)" seed project from openly licensed abstracts and full texts so that screening-speed findings transfer, alongside the seeded pilot projects in acceptance criteria §6.
10. UX metrics and acceptance¶
Thresholds are PROPOSAL until confirmed at the consuming freeze gate; telemetry rows apply only
if D3-08 approves. PE-05 is redefined as AC-UX-01 and AC-UX-02 being met for every user-testing task of the release.
Owner session: D3-08 approved telemetry with consent and without answer content, so the
telemetry parts below apply to consenting pilot participants only. AC-UX-04 gains a phone-profile
budget set at the R2a freeze from measurement (UX-AE06). AC-UX-06's "two-tab take-over" becomes
recovery from a shared-session conflict across two tabs (D2-08), and its offline interval depends on
ambiguity A1 (§6.4).
| ID | Criterion | Verified by | Applies to |
|---|---|---|---|
| AC-UX-01 | Task success: at least 80% of testers complete each release task in §5 of the acceptance criteria without help | UT | every user-facing release |
| AC-UX-02 | Comprehension: at least 80% of testers answer each explain question correctly against its model answer (which version counts; why a study is offered or locked; what an accepted answer rests on; what a publication will do) | UT | R2a, R2c, R3a, R3b, R4a, R5a, R5b and every release with an explain task |
| AC-UX-03 | Screening throughput: median time per title and abstract decision and median actions per decision on the realistic-content project are no worse than the baseline study; a keyboard-only path exists with at most two actions per decision beyond answering eligibility questions | UT, E (keyboard), telemetry |
R3a, R3b, then every release touching the screening card |
| AC-UX-04 | Annotation: time to complete the baseline 30-question form is at most the baseline plus 10%; keystroke-to-paint p95 under 50 ms with autosave on at 200 and 1,000 questions | UT, B | R2a, then every release touching the form |
| AC-UX-05 | Reconciliation: median time per three-candidate study is at most 1.5× the two-candidate task on the same build | UT | R4a, R4p, R4c |
| AC-UX-06 | Error recovery: every tester recovers from a two-tab take-over, a stale base and a 60-second offline interval without losing an edit made before the event | UT, E (network throttling) | R2a, R4a |
| AC-UX-07 | Setup: a new administrator reaches a screenable stage from templates in 20 minutes or less without help | UT | R3d |
| AC-UX-08 | Satisfaction: SEQ at least 5.5 per task, or SUS at least 70 per role per release | UT | every user-facing release |
| AC-UX-09 | Accessibility: zero serious or critical axe findings on the release's routes; the main tasks complete by keyboard alone; the screen-reader checklist passes; forced colours and 400% reflow pass on the five key surfaces | A, E | every release |
11. U-validation schedule¶
Rule: every U runs in a window at least one before the build that consumes it, and the consuming freeze gate's exit evidence lists it as passed. "Passed" means: the U's tasks meet AC-UX-01, its explain questions meet AC-UX-02, no unresolved severity-1 usability finding (lost work, a wrong decision, a disclosure), the keyboard path and screen-reader meaning are present on the prototype, and every string comes from the deck. Per-U specifics follow. One documented exception: R1a and R1b build in W0 (plan §7) and nothing is prototyped before G0, so U19 and U8's visibility part run first in W0 and the R1a and R1b UI slices build after they pass, within the same window; their later parts (U8 dialog and delegation) keep the one-window rule.
| U | Window | Consuming build (window) | Gate exit | Tasks and explain questions | Pass bar specifics |
|---|---|---|---|---|---|
| U1 | W0 prototype; W2 validation | R4a (W3) | F4 | Reconcile a study with three and four candidates; explain why a candidate is hidden or not | AC-UX-05; no disagreeing candidate hidden in any test |
| U2 | W1 | R3a (W2) | F3 | Skip a step; explain what was recorded | 100% say "nothing" |
| U3 | W0 | C1 (W1) | F-C | Select cohorts without losing place | AC-UX-01 |
| U4 | W1 | R2d (W2), R4a (W3) | F2 (Fix part), F4 | Fix an outdated session; see the unseen-control warning and Complete anyway | AC-UX-01; warning list with jump links used by ≥ 80% |
| U5 | W1 | R2c, R3a (W2) | F2, F3 | Wait through a publication pause; read a route-change message | no tester infers another reviewer's vote |
| U6 (revised) | W1 | R2c (W2) | F2 | Predict a publication's effect on each session category from the staged flow. Owner session: include a target-only publication, generated session versions and an impact that changes before commit (recheck) | AC-UX-02 per category |
| U7 | W1 | R3a (W2) | F3 | Use the step strip versus card-per-step. Owner session: Q-12 decided the step selector with one form area; U7 now checks its layout before the freeze (UX-R03), including the narrow menu and the adjudication and training step kinds | preference and AC-UX-03 |
| U8 | W0 (visibility), W1 (dialog), W2 (delegation) | R1b (W0), R1c, R1d (floating) | R1b, R1c, R1d | Say who can do what and why | AC-UX-02 |
| U9 | W0 (ordinary), W2 (profile) | R2a (W1), R3b (W3) | F1c, F5 | Edit a question and a profile question; explain ownership. Owner session: two administrators edit the same design page and resolve a same-item conflict (OS-A01; UX-AE20, UX-AE21) | no ownership confusion |
| U10 | W1 | R3c (W2) | F3 | Approve a change to a Completed stage, predicting its effect | AC-UX-02 |
| U11 | W1 | R3d (W4) | R3d | Set up from templates; resume a saved setup | AC-UX-07 |
| U12 | W1 | R3a (W2) | F3 | Build a dependency graph; read the effective-policy preview. Owner session: also author a stage study filter and explain why a Study is in or out of the pool (Q-15 replaced) | cycle refused; preview matches admission |
| U13 | W0 | R2a (W1) | F1c | Edit, save and complete; say which version counts. Owner session: read Draft auto-saved, Version checkpoint saved and Complete, and the confirmation before an incomplete Save replaces a completed version (OS-A21; UX-AE07, UX-AE08) | AC-UX-02 ("which version counts") |
| U14 | W0 | R2a (W1) | F1c | Compose a form; bind it. Owner session: set the standard target (a publication) and the form's reconciliation, hint, capacity, timeout and limit settings | AC-UX-01 |
| U15 | W0 | R2a (W1) | F1c | Read history; find a kept copy | AC-UX-01 |
| U16 | W2 | R4a (W3) | F4 | View accepted answers after the VS2 disclosure; explain "informed". Owner session: use labelled hints and click-to-fill; explain what adopting a hint records (OS-A04) | AC-UX-02 |
| U17 | W2 | R3b (W3) | F5 | Screen with eligibility questions; explain what the decision rests on; keyboard path under DP3. Owner session: include Unsure and explain what happens next under the profile's tie policy (D4-01, OS-A16) | AC-UX-02, AC-UX-03 |
| U18 | W2 | R3b (W3) | F5 | Correct an own Exclude from history | AC-UX-01 |
| U19 | W0 | R1a (W0) | R1a | Browse and import templates | AC-UX-01 |
| U20 | W2 | R4a (W3) | F4 | Assignment, expiry, release, request an additional review; next-task rule. Owner session: expiry is optional and off by default (Q-30); the request raises the effective target and may name people or groups | AC-UX-01 |
| U21 | W2 | R4b (W3) | F4 | Raise a query; find its outcome | AC-UX-01 |
| U22 | W3 | R5a (W4) | F6a | Download an as-of export; explain coverage labels | AC-UX-02 |
| U23 | W3 | R5b (W5) | F6b | Read the PRISMA diagram with reported counts | AC-UX-02 |
| U24 | W0 | O1 (W1) | F-O | Create an outcome measure; choose a schema | AC-UX-01 |
| U25 | one window before each release's kinds | per release | per release | Open an inbox item to its task; see "Related item unavailable" | deep link honours task identity and aliases |
| U26 | W0 | R2a (W1) | F1c | Export with and without unmasking; explain who may unmask | AC-UX-02 |
| U27 | W0 (navigation), W3 (both project kinds) | R2a (W1), GA | F1c, GA | Switch between a classic and a versioned project; explain the badge. Owner session: coexistence is temporary (universal conversion, OS-A15) | AC-UX-02 |
| U28 | W0 | R2a (W1) | F1c | Read the read-only banner; find kept work | AC-UX-01 |
| U29 | W3 | R5c (W4) | R5c | Explain independent versus informed figures | AC-UX-02 |
| U30 (new) | W1 | R3c (W2), R4a (W3) | F3 | From the project index, reach an assignment in an unopened project in one step; as an admin, see a pending request without opening the project; use the four queue filters. Owner session: D3-07 decided; also with the project's email muted (D3-24; UX-AE12 to UX-AE14) | AC-UX-01; with every notification flag off |
| U31 (new) | W0 | R2a (W1) | F1c | Work through Saving, Kept, Retrying, Offline, Failed; take over from a second tab; recover a stale base. Owner session: states renamed (Draft auto-saved, Version checkpoint saved); the second tab edits the shared session and resolves a conflict (D2-08); the offline part depends on ambiguity A1 | AC-UX-06 |
| U32 (new) | W0 | R0 (W1 deploy), R2a (W1) | F1c | Read the workflow version badge and panel; admit a project; read the containment banner | AC-UX-02 |
| U33 (new) | W1 | R3a (W2), R3b (W3) | F3, F5 | Screen 20 studies by keyboard on a desktop and 20 on a 390px phone with the keyboard hidden; DP3 and DP5 variants. Owner session: add full annotation of the RV-DS-04-shaped form on a 390 px phone and a 768 px tablet with touch, including a failed Complete and Jump (D3-05; UX-AE03) | AC-UX-03; ≤ 2 actions per decision |
| U34 (new) | W0 | R2a (W1), R3a (W2) | F1c, F3 | Use "N required missing · Jump" and Unanswered only on a 200-question form | AC-UX-04; every jump lands on the control |
| U35 (new) | W0 (panel), W1 (tour) | R2a (W1), R3a (W2) | F1c, F3 | Read the "What changed" panel; dismiss it; replay the tour; open a help link | AC-UX-01; help link opens the right guide anchor |
| U36 (new) | W2 | R4a (W3) | F4 | The reconciler journey end to end at 1440px and 925px and in the narrow layout. Owner session: blinded candidates in random order, the one-candidate layout and a screening adjudication task (OS-A02, OS-A28, OS-A13) | AC-UX-05; no disagreeing candidate hidden |
| U37 (new) | W1 | R2c (W2) | F2 | Use the redesigned inbox and preferences; mark all read; filter; see "resolved". Owner session: mute one project's email and set the project's notification content (D3-22, D3-24) | AC-UX-01; UI-1 to UI-11 pass on the stack's screens |
| U38 (new) | W0 | R2b (W1), R3a (W2) | F1c, F3 | Read slot and presence states; a released slot with and without the cap; an Include refused for a dependent step. Owner session: form-owned timeout and cap (D2-07, D3-17); Saved work after a departure (OS-A05) | AC-UX-02; no tester reads a name they should not |
| U39 (new) | W0 | R2a (W1) | F1c | Follow the readiness-based checklist to a screenable stage on the interim route | AC-UX-07 on the interim route (PROPOSAL 30 minutes) |
| U40 (new) | W1 | R2c (W2), P2 (W3), R5a (W4), O2 | F2, P2 | Watch a publication phase 2, an ASySD run and an as-of export in Processing; explain the status | job language honoured; no fabricated progress |
| U41 (new) | W2 | P2 (W3) | P2 | Resolve a duplicate pair; merge and split; explain where the secondary's reviews went. Owner session: D2-12 replaced: merge into one consolidated Study with conflict resolution or delegation, then unmerge with carry-forward choices (OS-A29) | AC-UX-02 ( |
| U42 (new) | W0 | F1c copy deck | F1c | Terminology card sort and "which version counts" vignettes | ≥ 80% agreement per core term |
| U43 (new) | W0, then per new pattern | the first consumer of each pattern | F1c and each gate | Pattern gallery review: every pattern's states, keyboard model, narrow behaviour and copy keys | Chris's per-PR acceptance (D3-02); axe clean |
| U44 (new) | W2 | R3b (W3) | F5 | Screen with bibliographic details hidden (SR-25) | AC-UX-03 unchanged; provenance records hidden metadata |
| U45 (new) | W3 | GA | GA | A tester holding both project kinds walks the restyled legacy chrome and shared pages. Owner session: includes the compatible features in the compatibility register (OS-A23) | no |
Validation needs added by the owner session (5 October 2026). This page mints no U IDs; the owner of open questions §3 assigns them. Each follows the one-window rule above. Evidence IDs are the UX spec's unless stated.
| Need | Consuming build | Tasks and explain questions | Evidence |
|---|---|---|---|
| Eligibility explanation | SP history release (timeline behind its UI flag) | As an admin, explain why a Study was reviewed in a stage it no longer matches, and why another was never reviewed; as a reviewer, explain why a Study is not available | UX-AE18, UX-AE19 |
| Reviewer-pool browsing and Saved work | R3c (opt-in per stage) | Find a Study in the browse list, explain why one is unavailable, finish started work from Saved work | SP spec §11 |
| Active-work impact preview | R2c (first consumer) | Predict what a capacity reduction does to people working now; use Apply anyway; respond to a changed impact | UX-AE22 to UX-AE24 |
| Training setup and attempt | Lane TR1 | A designer sets up a training step with references, policy and admission; a trainee fails, retries and passes | TI-AE14, TI-AE15 |
| Contribution exclusion and project deletion | Per ACD spec §10 | Exclude a member's work from one form and predict the effect; delete and restore a project | ACD-AE05 to ACD-AE16, ACD-AE28 |
| Consent for pilot timing | R2a pilots | Read the consent card; decline; withdraw later | UX-AE16, UX-AE17 |
12. Change management¶
- Three reviewer-visible bundles (
PROPOSAL): (1) "Versioned reviews" with R2a, R2b and R2c's reviewer-facing parts (kept changes, Save progress and Complete versions, history, Needs updating); (2) "Steps and screening" with R3a and R3b (step strip, screening renderer, derived decisions, reasons, keyboard path, My work badge from R3c); (3) "Workspace additions" with R2d, C1 and O1 (Fix, population chip, outcome schema entry) and R4a's VS1 display. Reconcilers get one bundle (R4a, R4p, R4b). Admin configuration changes are not bundled but get the panel. Anything reviewer-visible outside its bundle ships dark until the bundle's enablement. Owner session: bundle 1 shows Draft auto-saved, Version checkpoint saved and Complete (OS-A21); bundle 2 carries the step selector and, where profiles enable them, Unsure and the adjudication step; bundle 3's "VS1 display" becomes reconciled-answer hints with click-to-fill (OS-A04). Phone and tablet layouts ship with each bundle, not later (D3-05). - "What changed" panel from R2a (AC-ALL-06 extended): keyed by bundle, per-user dismissal stored with the review preferences, read at page load (no notification dependency), each item linking to the user guide page drafted under its target marker (brief §1.15).
- Anchored tour component built once at R3a (spotlight, popover, pause and resume as in
Review Prototype v4) and reused by every later bundle; not shown below
lt_sm. - Contextual help on every new screen through the existing
userGuideUrlpipe, enforced byno-hardcoded-help-urls.spec.ts; help links are placed consistently (WCAG 2.2 consistent help). - User-guide parity: pages drafted under target markers and published at enablement; the glossary parity check (§5.1) runs in docs CI.
13. Design QA process¶
13.1 Tier 1, per PR, agent-run (D3-02)¶
| Check | Tool or evidence |
|---|---|
| Theme guards | pnpm run check:theme-migration, pnpm run check:contrast, syrf-theme.spec.ts, the UI-10 guard spec |
| Screenshot matrix | light theme at the UI-6 widths (320, 390, 599, 600, 768, 904, 905, 925, 1239, 1240, 1439, 1440; 200% zoom; 400% reflow; short height), named states per pattern; dark via token checks per PR |
| axe | per-route and journey-state results, zero serious or critical |
| Keyboard journey transcript | the PR's main task by keyboard, with focus order |
| State coverage list | every state in the pattern spec shown |
| Copy-deck compliance | the guard spec plus a manual read of new strings |
| Design-QA checklist against the handoff | DONE, PARTIAL, NOT DONE with file:line; deviations with reasons |
| Second agent review | a fresh-context agent compares the evidence with the handoff and the pattern inventory |
13.2 Tier 2, Chris, per release¶
Chris accepts the release's bundle of screens on staging (dark mode through themeToggle, which
is on there) with the tier-1 evidence, plus spot checks on previews. Per-PR acceptance is
limited to new shared patterns (U43) and five high-risk surfaces: the publication flow, the
reconciliation workspace, the stage designer, Members & groups and guided setup (D3-02).
Assumption A-24 is rewritten accordingly (open questions §4).
Owner session: D3-02 is a brief item (T-UX-00): each release brief carries one integrated
staging design review, previews for new shared patterns and high-risk screens, and routine checks
per PR (UX-R42). Proposed additions to the high-risk list (PROPOSAL): the merge and unmerge
wizard, import acceptance, the eligibility explanation, large-form annotation on phones and the
active-work impact preview.
13.3 Materially changed¶
A screen is materially changed when any of these holds: a new route; a new or changed shared pattern; a changed primary action or its placement; changed copy for a core verb; a changed layout at any UI-6 width; a changed keyboard model or focus order. Colour-role swaps and copy fixes within the deck are not material.
14. Material 3 sequencing and dark mode (D3-01)¶
- Now: M3 roles over the current components (no component-generation islands), every new
route registered in FEAT-023's route inventory and baselines (UI-9), the UI-10 literal guard,
and
check:theme-migrationon every PR. UI-3 is rewritten so it is checked statically (review AC-17): roles and public APIs only, no M3 component islands, registered routes. Pending D3-01 the FEAT-023 light cutover is sequenced before R2a's reviewer UI where possible (join X-M3), otherwise before GA; new screens are verified on the path the preview renders plus the static checks (A-37). - Dark mode: evidence per PR is the token-contrast contract in both layers; evidence per
release is a dark screenshot set on staging with
themeToggleon; full dark screenshot sets per PR start only when FEAT-023 activates dark mode (Wave 6). V2-22's UI1 reading (production users see M3 roles on M2 components until the cutover) is put to Chris in D3-01. - Notification stack screens: inbox and preferences meet UI-1 to UI-11 before testers see them; conversation, issue and PDF screens before production (NS-10, D3-01).
- Legacy restyle: chrome and shared pages under D3-06, verified by U45. Owner session: D3-06 is decided-amended; the restyle carries every compatible new feature (§3.4, OS-A23).
- Owner session: D3-01 is a brief item (
T-UX-00): coordinate Material 3 roles and themes, staging dark-mode checks and visual baselines with the Material 3 programme, and record the cutover sequencing for the reviewer UI in the brief (UX-R41). The "Pending D3-01" markers above read as this brief treatment.
15. Decisions needed, engineering items, validations and assumptions¶
15.1 Batch D decisions this strategy rests on¶
D1-06 (tester panel; decided 3 October and named that night, with no external SyRF users yet), D2-07 (slot held by a draft), D2-08 (two-tab take-over), D2-10 (scoped pauses copy), D2-12 (alias presentation), D3-01 (UI1 before cutover; stack screens), D3-02 (acceptance cadence), D3-03 (copy deck terms, including the workflow names and Q-D4/Q-D5), D3-04 (button and type language), D3-05 (phone screening), D3-06 (legacy restyle), D3-07 (My work), D3-08 (participants and telemetry), D3-15 (browsers and touch), D3-17 (capacity cap copy), D3-19 (dependent-step claim), D3-20 (presence disclosure), D3-22 (email content), D3-23 (resolved notices), D4-01 (Unsure key), D4-13 (primary reason order in the reason picker), D4-18 (WCAG audit; answered 3 October, with the audit kept under the recorded reading Chris confirms in the G0 dossier), D4-19 (blinding and random serving as core behaviours).
Status after the owner session (5 October 2026). The list above is history.
| ID | Status | Note |
|---|---|---|
| D1-06 | Decided (3 October) | Panel unchanged; no extra external recruitment (D3-08) |
| D2-07 | Decided | Form-owned inactivity timeout and in-progress limit; expiry keeps the draft |
| D2-08 | Decided | One shared session and place across tabs and devices; take-over UX is a brief detail |
| D2-10 | Brief item | Tested publication active-work protection; measured pause and operation limits (proposed, not approved) |
| D2-12 | Replaced | Consolidated Study with reversible unmerge |
| D3-01 | Brief item | §14 |
| D3-02 | Brief item | §13.2 |
| D3-03 | Decided-amended | Illustrative draft and checkpoint labels (OS-A21); workflow names stay PROPOSAL |
| D3-04 | Decided | Sentence case |
| D3-05 | Decided-amended | Full annotation on phones, tablets and desktops at launch |
| D3-06 | Decided-amended | Compatible features on legacy screens (OS-A23) |
| D3-07 | Decided | My work, cross-project tab, global badge |
| D3-08 | Decided | Agreed panel; consent-based telemetry |
| D3-15 | Decided | Firefox, WebKit and touch |
| D3-17 | Brief item (carry-forward alignment) | Capacity cap separate from target; defaults proposed |
| D3-19 | Brief item | Dependent claim at personal Include |
| D3-20 | Brief item | Counts; names for Monitor holders; never across blinding |
| D3-22 | Decided-amended | Informative, permission-aware email |
| D3-23 | Brief item | Resolved notices with history |
| D4-01 | Decided (with OS-A16) | Unsure key where enabled |
| D4-13 | Decided-amended | Primary reason is guidance |
| D4-18 | Answered 3 October | Reading awaits G0-D1 |
| D4-19 | Decided-amended | Blinded by default; optional browsing |
15.2 Engineering items E82 to E87¶
| ID | Item | Lane | Gate |
|---|---|---|---|
| E82 | Save-status state machine, bounded local copy (IndexedDB) with sequence replay, conflict and take-over screens, typed-outcome recovery copy; lease by stable client tab ID with REST heartbeat; works with tracking off. Owner session: states renamed (OS-A21); the local copy waits on ambiguity A1; take-over is superseded by the shared session (D2-08), and the stable tab ID identifies connections | L5 with L1 | F1c (copy), R2a |
| E83 | Copy deck mechanism: deck document, typed message constants per feature, shared core-terms file, banned-string and import guard spec, user-guide glossary parity script in docs CI | L16 | F1c |
| E84 | Pattern inventory as shared components, spec gallery route behind a flag, handoff template, "What changed" panel with per-user dismissal, anchored tour component, contextual help on every new screen | L16 with L5 | F1c, R2a (panel), R3a (tour) |
| E85 | Accessibility and browser harness: @axe-core/playwright with baselines and journey-state checks, screenshot matrix at the UI-6 widths, forced-colours and reduced-motion runs, Firefox and WebKit smoke projects, native-drag guard spec, CDK drag for the question tree before R1a, browser floor (.browserslistrc, target, polyfills) |
L17 | W0 and S0; R1a precondition |
| E86 | My work: read-time counts endpoint over the four queues and admission-based work, project-level surface, global badge, cross-project tab, admin LC1 banner, deep links by task identity and alias; workflow version badge and panel, admission action, containment banner, legacy explainer | L16 with L6, L4, L0 | R0 (panel), R3c, R4a |
| E87 | Reviewer efficiency: keyboard screening path reconciled with DP3 and DP5, live completeness and jump on every host, input-latency budget under autosave, privacy-safe timing events (subject to D3-08) and the baseline measurement protocol. Owner session: telemetry approved with consent (D3-08); phone-profile latency budget (UX-AE06); whole-form validation independent of mounted rows (UX-R06) | L5 with L3 and L17 | R2a (count, latency), R3a, R3b (keys) |
15.3 UI validations U30 to U45¶
Listed with windows and pass bars in §11; the open-questions rows are in open questions §3.
15.4 Assumptions¶
| ID | Assumption | Basis | Cost if wrong |
|---|---|---|---|
| A-37 | FEAT-023's light cutover does not land before R2a's reviewer UI; new screens are built on M3 roles over the current components and verified on the Material 2 bridge plus the static checks (UI-3, UI-9, UI-10) | FEAT-023 README (Waves 0 to 4 open; Wave 5 unscheduled); D3-01 pending | If the cutover lands earlier, the screenshot matrix is re-run on the M3 path at cutover; no plan change |
| A-38 | The tester panel (D1-06) |
D1-06 (approved 3 October; named that night, with no external SyRF users yet, §9) and |
AC-UX-03 and AC-UX-04 are re-based on R2a's first summative session, which doubles as the baseline; the thresholds stay PROPOSAL until then |
16. PWA exploration beyond the MVP (owner session, 5 October 2026)¶
Decision (U2 exploration and scope clarification, OS-A22). Making SyRF a Progressive Web App is a feasibility exploration beyond the MVP, including whether allocated studies could be cached. It is not an approved PWA implementation, an offline review requirement or a launch commitment. Full phone, tablet and desktop annotation stays a launch requirement (D3-05). No offline writes are authorised, and protected study data is never cached as an accidental default (UX-R38 to UX-R40).
Repository finding (UX spec §3.11; re-checked read-only on 5 October 2026, source-status inventory §1 item 27):
| Item | Observed |
|---|---|
src/services/web/src/site.webmanifest |
Present; name and short_name empty; display: standalone; white theme and background; icons at /android-chrome-192x192.png and /android-chrome-512x512.png |
| Icon files | At src/assets/img/android-chrome-192x192.png and -512x512.png, so the manifest's root paths do not match where the build copies them |
src/services/web/angular.json assets |
src/favicon.ico, src/assets and library globs; the manifest is not listed, so it is probably not copied into the build |
src/services/web/src/index.html |
theme-color, viewport and apple-mobile-web-app-* tags; no <link rel="manifest"> |
| Service worker | No @angular/service-worker dependency, no ngsw-config.json, no service-worker reference in the web source |
The app is therefore very likely not installable as a PWA today. Nothing was built or run, so this stays UNVERIFIED. Existing metadata is not evidence of PWA readiness.
What the exploration must answer. Installability and standalone behaviour per browser (including iOS Safari's limits); update and caching behaviour, including service-worker version skew against the forced-reload contract (AC-T-04); authentication, token handling and cache clearing at logout or access removal; draft persistence and connectivity handling (ambiguity A1, §6.4); whether and how allocated studies could be cached (which data, protection at rest, eviction, revocation when access is removed, and blinding); and what a real offline review mode would need (version checks, publication rules, authorisation revalidation, conflicts).
Output. A feasibility report and a proposed scope for an owner decision (UX-AE25). No implementation, no feature flag, no protected-data caching by default and no offline writes. The exploration is PWA1 in the rollout plan, a non-MVP exploration timed so it never delays MVP work.
Resolution record¶
| Finding | Category | Where | Note |
|---|---|---|---|
| UX-01 | Adopted | §9, §10; acceptance criteria §2.3 and §5 | Research plan with baseline, formative, summative, diaries, card sort; AC-UX-01..09 carry the metrics and PE-05 is redefined through AC-UX-01 and 02; participants pending D1-06 (shape approved 3 October; names needed for G0) and D3-08, telemetry pending D3-08. Update: the panel was named late on 3 October (§9); external participants remain pending D3-08 |
| UX-02 | Adopted | §6.1 to §6.3, §10, E87; integrated plan R3a/R3b | Keyboard path and live completeness moved into R3a/R3b scope; AC-UX-03/04; AF2 parity exit set named in programme-integration (other drafter) |
| UX-03 | Corrected | §11; integrated plan §6.1 and §7 | Every U placed one window before its build; gate exit evidence lists U's |
| UX-04 | Adopted | §6.4, §6.5, E82, U31 | State machine, local copy, conflict screens; QM v2 §14 harvested; drafts model per brief §1.8 |
| UX-05 | Adopted | §5, E83, U42; contracts C17 | Copy deck at F1c with typed constants, guard spec and glossary parity; terms pending D3-03 |
| UX-06 | Adopted | §8.2, E85 | Accessibility harness in W0; screen-reader matrix; checklist per release |
| UX-07 | Adopted | §4, U43, E84 | Design system of record, pattern inventory, handoff template; button and type language pending D3-04 |
| UX-08 | Adopted | §3.1, E86, U30 | Project-level My work in R3c/R4a plus NS-07's badge, tab and banner; global landing post-GA; pending D3-07 |
| UX-09 | Adopted | §12 | Three bundles; "What changed" panel from R2a (AC-ALL-06 extended); tour at R3a; help links |
| UX-10 | Adopted | §7.4, U6 revised | Staged flow with preview and dry-run; comprehension in AC-UX-02 |
| UX-11 | Adopted | §3.3, §3.4, U32, U45 | Shared chrome, workflow version badge, explainer; legacy restyle pending D3-06 |
| UX-12 | Question | §14, A-37 | D3-01; dark evidence by token checks plus staging themeToggle |
| UX-13 | Adopted | §13 | Two-tier design QA; "materially changed" defined; cadence pending D3-02 |
| UX-14 | Adopted | §7.3, U36, U16 wording | Journey map, narrow layout, VS2 disclosure copy, next-task rule as PROPOSAL |
| UX-15 | Corrected | §8.2; acceptance criteria UI-6 | Widths from break-points.ts edges plus 320, 390, 925; touch targets; phone screening pending D3-05 |
| UX-16 | Adopted | §4.3, U40; acceptance criteria UI-2 | Shells and StatusView mandatory; long-running operations mapped to the job language |
| UX-17 | Adopted | §5.5, U31 | Error and recovery copy per typed outcome; AC-UX-06 |
| UX-18 | Adopted | §3.3, U32 | Workflow version panel and containment banner |
| UX-19 | Adopted | §7.7, U39, U11 moved to W1 | Interim checklist at R2a; AC-UX-07 |
| UX-20 | Adopted | acceptance criteria UI-2 | No debug components on reviewer-reachable routes unless the debug flag is on; review-completed page in R2b's revision |
| UX-21 | Question | §9 | D3-08; LogRocket and GA never used for UX metrics |
| UX-22 | Adopted | §5.3 | Reviewer progress vocabulary in the deck and R2b's progress-list revision |
| UX §3 strategy | Adopted | §3 to §13 | Incorporated with the amendments above |
| UX §4 Q1 to Q9 | Question | §15.1 | Q1 D3-01; Q2 resolved by the staging themeToggle evidence rule (§14); Q3 D3-04; Q4 D3-03; Q5 D3-08; Q6 D3-05; Q7 D3-06; Q8 D3-07; Q9 D3-02 |
| PH-13 | Adopted | §8.3, E85 | Browser and device matrix; CDK drag for the question tree and the browser floor as R1a preconditions |
| PH-19 | Adopted | §5.2 | Four-state vocabulary and "Save progress" reused; a distinct term per kind of draft |
| PH-35 | Adopted | §6.1, U17, U33 | One-key decisions reconciled with DP3 and DP5 |
| review AC-17 | Corrected | §14; acceptance criteria UI-3, UI-9 | UI-3 statically checkable; routes registered; D3-01 |
| review AC-19 | Adopted | §8; acceptance criteria AC-ALL-07 | Live regions, focus, forced colours, 400% reflow, short height, touch targets, screen-reader matrix, Firefox and WebKit; one width list |
| review AC-27 | Adopted | acceptance criteria UI-10 | Literal-colour guard spec over programme folders (no stylelint exists) |
| review AC-28 | Adopted | §4.3, §13.3; acceptance criteria UI-2, UI-5, UI-8 | Pattern checklist, handoff linked, "materially changed" defined |
| review AC-29 | Adopted | §11; acceptance criteria §5.3 and §5.4 | Tasks for every release, explain rubric, pass bar per U |
| SR-25 | Adopted | §4.3, U44 | Bibliographic blinding placeholder as a per-profile option, PROPOSAL, default off; provenance records it |
| DD-11 (glossary) | Adopted | §5.2 | User-facing terms aligned with the DD glossary; internal names unchanged |
| Q-D4, Q-D5 | Question | §5.2 | Covered by D3-03 ("Accepted answers (gold standard)", "Screening result") |
| V2-22 | Corrected | acceptance criteria UI-6, UI-8; §14 | 925px added; A-24 cited and rewritten; UI1 reading put to Chris in D3-01 |
| V2-25 | Corrected | acceptance criteria §5.3 | Tasks for R2b, R2d, R3c, R4b, R4p, R5c, P1, P2 and C2; O2's operations are covered by U40 |
| RT-10 | Adopted | §6.5, E82 | Lease by stable tab ID, take-over UI, works untracked; D2-08 |
| RT-14 | Adopted | §5.4, §4.3 (presence chip) | Counts and own place only; names with the Monitor capability; D3-20 |
| RT-22 | Adopted | §5.4 | Slot vocabulary and the D2-07 rule copy in the deck; slot states in U38 (extends U13) |
| Q-RT6, Q-RT7 | Question | §5.4, §6.5 | D3-20, D2-08 |
| NS-07 | Adopted | §3.1, E86, U30 | Flag-independent badge, cross-project tab and admin banner merged with UX-08 |
| NS-10 | Adopted | §7.9, §14, U37 | Stack screens meet UI1 before testers; M3 inbox redesign before R2c; timing D3-01 |
| NS-13 | Adopted | §7.9, U37 | Flood controls before R2c; resolved items per D3-23 |
| Q-N3, Q-N5 | Question | §7.6, §7.9 | D3-23, D3-01 |
Owner session, 5 October 2026: the "pending D3-0x" notes in this record are history. Current statuses are in §1.1 and §15.1; the round-2 categories stand.