Skip to content

Question Management: State of Play

Comprehensive analysis of the Question Management feature -- existing work, planned roadmap, open branches, and next steps.


Table of Contents

  1. Executive Summary
  2. What Exists Today
  3. What Is Planned
  4. Branch and PR Inventory
  5. GitHub Issues Tracker
  6. Developer Contributions
  7. Technical Architecture
  8. Design Resources
  9. Planning Documentation Index
  10. Considerations for Reimplementation

Executive Summary

Question Management (QM) is the project administrator's tool for defining, organizing, and assigning the questions that annotators answer during systematic reviews. Development has spanned from March 2021 to present, with the bulk of UI implementation work done in 2023-2024 by karmakarmala, followed by architecture/planning work in 2025-2026 by chrissena.

Current State

  • A functional v2 QM UI exists in main, behind the newQuestionManagement feature flag (currently false in staging/production, true in PR preview environments)
  • The legacy "Question Design" (v1) is the live interface users interact with today
  • The v2 implementation covers three tabs: Design (mostly complete), Assign (complete), Preview (basic)
  • No versioning, no question lifecycle management -- the v2 UI is still a "mutable question" editor, not the planned versioned system
  • 20 PRs have been created (7 merged, 2 open, 11 closed without merge)
  • 27 GitHub issues tracked (5 closed, 22 still open)
  • 15 remote branches with unmerged QM work exist
  • Comprehensive planning documentation exists in this branch under docs/features/question-management/, including the current Phase 1-9 implementation, migration, prototype, and UI specs

Key Decision Point

The existing v2 implementation was built with older Angular patterns (template-driven forms, ngrx SignalStore). The planned roadmap calls for modern Angular (signal forms, zoneless components, modern template syntax). A decision is needed on whether to extend the existing code or rebuild from scratch using the existing work as reference.


What Exists Today

Legacy Question Design (v1) -- In Production

  • Route: /project/:id/admin/question-design
  • Component: AnnotationQuestionDesignerComponent
  • Location: src/services/web/src/app/project/project-admin/annotation-question-designer/
  • Status: Active in production, fully functional but clunky UX
  • Capabilities: Create/edit annotation questions via dialog-based UI, basic question types, option management
  • Limitations: No tree visualization, no drag-and-drop, no inline editing, dialog-heavy workflow

New Question Management (v2) -- Behind Feature Flag

  • Route: /project/:id/admin/questions
  • Feature flag: newQuestionManagement (env var: SYRF__FeatureFlags__NewQuestionManagement)
  • Flag status: false in staging/production, true in PR previews only
  • Location: src/services/web/src/app/project/project-admin/question-management/

Design Tab (Most Complete)

Capability Status Notes
Category tabs (Study, Cohort, DMI, Treatment, OA, Experiment) Done MatTabGroup with per-category tree
Tree-based question hierarchy Done mat-tree with nested nodes
Per-question view states (collapsed/expanded/edit/preview) Done QuestionNodeComponent manages state
Inline editing with validation Done Template-driven forms + Vest validation
Question CRUD (add, save, copy, delete) Done With confirmation dialogs
Drag-and-drop reordering Done Custom SignalStore feature (23KB)
Conditional sub-questions Done Boolean or option-based parent conditions
Question locking (when annotations exist) Done Checks annotation answer tally
Revert-to-saved Done
Child question validation Partial Open PR #2387 adds isChildInvalid metadata
Save/delete backend linkup Partial Some stubs, not all operations wired

Assign Tab (Complete)

Capability Status Notes
Stage selector Done
Dual-tree view (all questions / stage questions) Done
Checkbox selection with ancestor/descendant auto-selection Done
Category-level select-all/deselect-all Done
Assign/Unassign workflows Done
Badge counts per category Done
Locked question warnings Done
Dirty check / unsaved changes guard Open branch QMAssignDirtyCheck branch, not merged

Preview Tab (Basic)

Capability Status Notes
Stage selector Done
Renders AnnotationFormComponent Done Shows exactly what annotators see
Read-only preview Done
Preview refinements (styling, IDs, buttons) Partial Issues #1531-#1533 partially addressed

Backend (API + Domain)

Capability Location Status
Upsert question PUT /project/{id}/annotationQuestion/{qId} Done
Reposition question PUT /project/{id}/annotationQuestion/{qId}/{destId} Done
Copy question POST /project/{id}/annotationQuestion/{qId}/copy Done
Delete question DELETE /project/{id}/annotationQuestion/{qId} Done
Update stage questions PUT /project/{id}/stages/{stageId}/questions Done
Annotation answer tally PUT /project/{id}/update-annotation-answer-tally Done
Placement validation rules AnnotationQuestionPlacementValidator.cs Done (PR #2234, merged)
Question versioning API -- Not started
Question set management API -- Not started

Data Model (Current)

Questions are embedded subdocuments within the pmProject collection. Each project has an AnnotationQuestions array. There are no separate collections for questions, versions, or question sets.


What Is Planned

The PR #2398 worktree contains comprehensive planning documentation defining a multi-phase roadmap.

Core Problem Being Solved

Three limitations of the current system:

  1. Editing locks after first answer -- once any annotator answers a question, it's permanently locked
  2. No version history -- edits happen in-place with no audit trail
  3. No stage configuration history -- impossible to know what form an annotator saw at any point

Solution: Two-Phase Question Lifecycle

Phase A -- Drafting (before stage activation): - Draft Questions (DQs) are fully mutable design-time objects on the Project aggregate - Admins iterate freely on everything - The existing v2 QM UI becomes the DQ editor

Phase B -- Activated (after stage goes live): - Annotation Questions (AQs) are committed production entities with frozen identity properties - Content changes create new AQVersions (immutable snapshots) - Question Set Versions (QSVs) track which question versions are assigned to a stage

Planned Data Model

Entity Collection Purpose
DraftAQ Embedded on pmProject Mutable design-time question
AnnotationQuestion (AQ) pmAnnotationQuestion (new) Stable identity + append-only version list
AQVersion Embedded in AQ Immutable content snapshot
QuestionSet (QS) pmQuestionSet (new) Named versioned collection of question versions
QuestionSetVersion (QSV) Embedded in QS Immutable ordered list of AQVersionId refs

Release 1 Delivery Phases

Phase Name Depends On Status
2 PRISMA Specification -- Approved
3 Collection Infrastructure 2 Planned -- new MongoDB collections
4 Question Lifecycle 3 Planned -- DQ-to-AQ activation, versioning
5 Annotation Form v2 4 Planned -- virtual scroll, per-question auto-save
6 Question Management UI 4 Planned -- version history, diff viewer, admin decision framework
6.1 Annotation Import 5, 6 Planned
7 Migration 4-6 Planned -- backfill existing questions as v1

Phases 5 and 6 can run in parallel (both depend on Phase 4 only).


Branch and PR Inventory

Open PRs (Active Work)

PR Title Branch Author Scope
#2398 docs: product roadmap, feature specs, and planning claude/describe-branch-work-TG5qs chrissena 284 files, planning docs including QM roadmap
#2387 feat: QM child question visualization and assign tree QMChildQuestionVisualize chrissena 46 files, child validation, flat assign tree, sticky headers

Merged PRs (Code in Main)

PR Title Branch Author Merged Aspect
#2234 MongoDB testing + annotation question validation -- chrissena 2025-12-27 Backend placement rules
#1633 Preview all question types in design component QMDesignPreview karmakarmala 2024-07-29 Design preview
#1627 QM Design Page - Copy, Delete Functionality -- karmakarmala 2024-07 Design CRUD
#1611 QM Assign Page changes as per MVP -- karmakarmala 2024-07 Assign MVP
#1585 QM Design Page Changes -- karmakarmala 2024-07 Design (closed 8 issues)
#1560 Question Management Preview component QDPreviewPage karmakarmala 2024-05-09 Preview tab
#1495 Question management assign page QuestionManagementAssignPage karmakarmala 2024-05-08 Assign tab
#1544 QM Layout changes -- karmakarmala 2024-05 Layout polish
#1344 Question management edit QuestionManagementEdit karmakarmala 2023-12-05 Edit mode
#1195 Question design hybrid mode QuestionDesignHybrid karmakarmala 2023-02-13 Hybrid view
#240 Add missing question-design component fix/addQuestionDesignComponent canayder 2021-03-23 Initial scaffolding

Closed PRs (Unmerged -- Work on Branches)

These contain code that was never merged into main. Some was superseded by later PRs, some represents abandoned work.

PR Title Branch Author Closed Notes
#2325 Annotation question mgmt & reconciliation specs feat/annotation-question-mgmt-reconciliation chrissena 2026-02-11 Docs only; superseded by #2398
#1676 QM Design preview changes QMPDesignPreviewChanges karmakarmala 2025-12 50 files, 1273+ lines -- major node visualization, system questions, tree collapse. Closed 6 issues. Not merged.
#1662 Assign Page dirty check & Project Redirection QMAssignDirtyCheck karmakarmala -- Dirty check guard, 5 files
#1649 Parent/child question validation QMChildQuestionVisualize karmakarmala 2025-12 46 files; branch reused by #2387
#1631 QM MVP Design page - preview question view QMDesignPreviewQuestion karmakarmala 2024-07 Superseded by #1633
#1586 QM Assign Page - system question lock icon QMAssignPageFix karmakarmala 2025-12 5 files, small fix
#1564 QM Wizards - Edit text & Edit Options QDWizards karmakarmala 2025-12 Dialog-based edit wizards, 10 files
#1494 Question management preview page QuestionManagementPreviewPage karmakarmala 2024-05 Superseded by #1560
#1430 QM Assign Component QuestionManagementAssignPage chrissena 2024-03 Superseded by #1495
#1227 Question design edit form QuestionDesignEditForm karmakarmala 2023-10 Superseded by #1344
#1217 Question design edit layout QuestionDesignEdit karmakarmala 2023-10 Superseded by #1344
#1194 Question rearrange mode preview EditQuestionRearrange Asit-GIT199 2023-09 Rearrange mode
#1181 Question design expand hybrid mode QuestionEditingHybridMode karmakarmala 2025-12 Superseded by #1195
#870 Create hybrid question viewing component feature/hybridQuestionViewing canayder 2025-12 WIP draft, never merged

Unmerged Branches with Significant Work

These branches contain code that is NOT in main and may need to be evaluated for salvage:

Branch Commits Ahead Files Key Work
QMPDesignPreviewChanges 22 50 System question visualization, tree node icons, collapse/expand, tooltips
QMChildQuestionVisualize 12 46 Child validation, flat assign tree (active PR #2387)
QuestionDesignEditForm 36 25 Edit form with validation (superseded but has logic)
QuestionManagementPreviewPage 18 28 Full preview page (superseded by #1560)
feature/hybridQuestionViewing 12 23 Hybrid view with category tabs
QDWizards 6 10 Dialog-based edit wizards
QMAssignDirtyCheck 4 5 Unsaved changes guard
QMAssignPageFix 3 5 Lock icon for system questions

GitHub Issues Tracker

Open Issues by Area (22 total)

Design Tab (16 open issues)

Issue Title Labels Linked PR
#1172 Edit Question Text & Description Wizard ui template #1564
#1197 Edit Mode Layout MVP, ui template #1344
#1519 "Add question" button functionality ui template #1585
#1520 Undo/save/duplicate backend functionality domain logic #1585
#1523 Change icon/button colours ui template #1585
#1524 "Revert changes" button functionality ui template #1585
#1561 Options Wizard (add/delete/change options) MVP, ui template #1564
#1568 Design page layout consistency ui template #1585
#1572 Save & Delete backend linkup back-end services link-up #1585
#1579 Bug fixes (split answers, checklist, checkbox) fix, ui template #1585
#1580 Hybrid view copy/delete + formatting ui template, domain logic #1585
#1593 Visualising edited children MVP, ui template #1649
#1607 Copy/Delete annotation question logic data logic #1627
#1624 Preview question view in Design ui template #1633
#1657 Switch preview to below question creation MVP, ui template #1676
#1660 Question preview / collapse mode MVP, ui template #1676
#1661 Child question validation errors MVP, ui template #1649
#1682 Replace "Add Question" with Disease Model/Treatment menu MVP, ui template, domain logic #1676
#1687 Question node visualization (expand/collapse, icons) MVP, ui template #1676
#1691 Root system question visual representation MVP, ui template #1676
#1694 Question node polish (lock icon, mat hint) MVP, ui template #1676

Assign Tab (3 open issues)

Issue Title Labels Linked PR
#1547 Placeholder text (no questions / no stage) ui template #1611
#1599 Assign MVP tasks ui template #1611
#1648 Intuitivity of assigning questions MVP, ui template #1649

Preview Tab (3 open issues)

Issue Title Labels Linked PR
#1531 Grey info boxes ui template #1560
#1532 Add IDs for URL navigation ui template #1560
#1533 Add save/revert/delete buttons ui template #1560

General / Performance (1 open issue)

Issue Title Labels
#1125 Annotation form slow/unresponsive with many units bug

Note on Issue Status

Many of these issues reference PRs that were merged, but the issues themselves remain open. Some may already be resolved in main. Others reference unmerged branches with the actual fixes. A triage pass is recommended before beginning new work.


Developer Contributions

Developer GitHub Handle Role PRs Contribution Areas
Mala Karmakar karmakarmala / Mala K Primary implementer 12 PRs (2023-2024) All three tabs (Design, Assign, Preview), edit forms, wizards, preview components, layout, MVP features
Chris Sena chrissena / Chris Architect, reviewer, implementer 5 PRs (2024-2026) Backend validation rules, child question visualization, assign tree improvements, all planning/spec docs, PR reviews
Can Ayder canayder Early contributor 2 PRs (2021) Initial component scaffolding, hybrid viewing prototype
Asit Asit-GIT199 Contributor 1 PR (2023) Question rearrange mode
Nuri Karakaya nurikarakaya Tangential 1 PR (draft) Responsiveness fixes mentioning QM
Alexandra Bannach-Brown abannachbrown Product owner 0 PRs Created majority of QM issues, defined MVP requirements, usability feedback
Grace Currie gcurrie768 Product contributor 0 PRs Created issues for wizards, layout, assign UX

Technical Architecture

Component Structure (Current v2)

QuestionManagementComponent (tab container: Design | Assign | Preview)
|
+-- DesignComponent (provides: DesignStore)
|   +-- mat-tab-group (one tab per category)
|       +-- mat-tree (nested question hierarchy)
|           +-- QuestionNodeComponent (per question)
|               +-- HybridComponent (collapsed/expanded summary)
|               |   +-- OptionsComponent (option chips)
|               +-- EditComponent (template-driven form + Vest validation)
|               +-- PreviewQuestionComponent (type-specific preview)
|                   +-- PreviewTextboxQuestionComponent
|                   +-- PreviewSelectQuestionComponent
|                   +-- PreviewCheckboxQuestionComponent
|                   +-- PreviewRadioQuestionComponent
|                   +-- PreviewAutocompleteQuestionComponent
|                   +-- PreviewChecklistQuestionComponent
|
+-- AssignComponent (stage selector + router-outlet)
|   +-- StageAssignComponent (dual-tree with checkboxes)
|   +-- NoStageComponent (empty state)
|
+-- PreviewComponent (stage selector + router-outlet)
    +-- StagePreviewComponent (renders AnnotationFormComponent)
    +-- NoPreviewComponent (empty state)

State Management

  • Design: ngrx signalStore() -- component-scoped, 817 lines, composes withAnnotationQuestionsFeature + withAnnotationQuestionTreeDragAndDropFeature + withRequestStateFeature
  • Assign: ngrx signalStore() -- root-scoped singleton, 836 lines, composes two withAnnotationQuestionTreeFeature instances
  • Global reads: Pulls from ngrx Store for annotation questions, stages, project context, feature flags
  • Forms: Template-driven with ngModel + Vest validation suite

Backend

  • Questions are embedded subdocuments in pmProject.AnnotationQuestions[]
  • Domain methods on Project aggregate: UpsertCustomAnnotationQuestion, CopyAnnotationQuestion, RepositionQuestion, DeleteAnnotationQuestion
  • Placement validation: AnnotationQuestionPlacementValidator.cs with 81 unit + integration tests
  • API controller: ProjectController.cs
  • DTOs auto-generated to api-client.generated.ts

Tests

QM tests are currently excluded from both vitest.config.ts and angular.json test configurations. No QM tests run in CI.


Design Resources

Figma Designs

  • Project: "SyRF Design v2" (file key: CVHEW6l1oCEehOkhl6SLGa)
  • Team: SyRF (Starter plan, Chris Sena's account)

"Question Editing" Page (Older Designs)

  • URL: https://www.figma.com/design/CVHEW6l1oCEehOkhl6SLGa/SyRF-Design-v2?node-id=4336-10929
  • Key frames:
  • Settings - Question Design (Collapsed Hybrid Mode) (4336:10930) -- Main design page with hybrid collapsed view for all question types (input, checkbox, checklist, autocomplete, radio, dropdown)
  • Settings - Question Design (rearrange mode) (4336:11186) -- Rearrange mode for reordering questions
  • Question type hybrid collapsed views: input box, checkbox, checklist, autocomplete, radio buttons, drop down list
  • Parent-child connector visualization

"Question Editing MVP" Page (Most Recent Designs)

  • URL: https://www.figma.com/design/CVHEW6l1oCEehOkhl6SLGa/SyRF-Design-v2?node-id=5841-17420
  • Key frames:
  • Settings - Question Management (Edit Mode) (5841:17511) -- Edit mode with inline form, question settings checkboxes, activation state
  • Settings - Question Design (Assign Stage) - Annotation Not Enabled (5841:19577) -- Assign tab showing stage assignment when annotation is not yet enabled
  • CSI Task 3 - Settings - Question Design (Assign Stage) - Annotation Not Enabled (12247:21245) -- Revised assign stage design iteration
  • Multiple additional frames covering assign page states, preview modes, and validation states

  • Note: The Figma designs predate the planned versioning workflow (AQVersions, Question Sets). They represent the "mutable question editor" that maps to the Draft Question phase. The versioning UI (version history, diff viewer, admin decision framework) has no Figma designs yet.

Legacy Question Design (v1)

The existing v1 "Question Design" dialog-based interface is the baseline that all users are currently familiar with. Located at src/services/web/src/app/project/project-admin/annotation-question-designer/.


Planning Documentation Index

The current planning set for this branch lives directly in docs/features/question-management/.

Core Planning Docs

Document Path Content
State of Play docs/features/question-management/state-of-play.md Current implementation status, branch inventory, and reimplementation guidance
Implementation Plan docs/features/question-management/implementation-plan.md Canonical Phase 1-9 delivery plan
Migration Strategy docs/features/question-management/migration-strategy.md Per-project migration, rollout, rollback, and production integrity checks
UI Specification docs/features/question-management/ui-specification.md Authoritative UI behaviour, layout, and terminology decisions
Publishing & Versioning UX docs/features/question-management/publishing-versioning-ux.md Publish mental model, entry points, and workflow details
Mental Model Review Decisions docs/features/question-management/mental-model-review-decisions.md Naming, lifecycle, and interaction-model decisions
Annotation Versioning Integration docs/features/question-management/annotation-versioning-integration.md How QM v2 aligns with later annotation/session versioning work

Design References & Validation Artifacts

Document Path Content
Prototype docs/features/question-management/prototype.html Interactive HTML prototype for Design / Assign / Preview flows
Figma Design Reference docs/features/question-management/figma-design-reference.md Links to source Figma frames and design context
Training Rounds docs/features/question-management/training-rounds.md Adoption / usability notes for validation and rollout planning

Key Design Decisions (from specs)

  1. Identity + Immutable Versions -- uniform pattern across AQ, QS, Annotation, Session
  2. Two-phase lifecycle -- free-form drafting, then controlled versioning after activation
  3. Structural properties frozen after activation -- dataType, parentQuestionId, groupAsSingle immutable
  4. Content versionable -- text, options, helpText, answerFilters evolve via new AQVersions
  5. Composite identity -- (rootId, versionNumber) for version entities
  6. Admin Decision Framework -- when QSV changes mid-session, admin decides per-session handling
  7. BreakingChange flag -- advisory from admin, system auto-detects actual breaks
  8. Layered validation -- Frontend (UX), API (FluentValidation), Domain (authoritative)

Considerations for Reimplementation

What to Keep

  • Backend API surface -- the 6 endpoints for CRUD, copy, reposition, and stage assignment are solid and well-tested
  • Backend placement validation -- AnnotationQuestionPlacementValidator.cs with 81 tests (PR #2234)
  • Domain model -- Project aggregate methods are functional
  • Planning documentation -- the feature specs and roadmap are comprehensive and should guide implementation
  • Component hierarchy concept -- the Design/Assign/Preview tab structure is sound
  • Business rules YAML -- annotation-question-rules.yaml as single source of truth

What Needs Modernization

Area Current Target
Forms Template-driven + ngModel + Vest Angular Signal Forms (@angular/forms/signals)
State management ngrx SignalStore (component features) ngrx Signal Store with modern patterns
Template syntax Legacy Angular templates Modern control flow (@if, @for, @switch)
Change detection Zone-based Zoneless (ChangeDetectionStrategy.OnPush minimum)
Testing Excluded from CI Full coverage with vitest

What Is Missing (Not Yet Built)

  • Question versioning (AQVersion lifecycle)
  • Question Set management (QS/QSV composition)
  • Version history viewer and diff display
  • Admin Decision Framework (handling in-progress sessions when questions change)
  • Stage activation workflow (DraftAQ -> AQ conversion)
  • pendingChanges buffer for auto-save
  • New MongoDB collections (pmAnnotationQuestion, pmQuestionSet)
  • Migration tooling (backfill existing questions as v1 AQVersions)
  • Annotation Form v2 (virtual scroll, per-question auto-save)

Unmerged Branch Work to Evaluate

The following branches contain work that was never merged but may inform the reimplementation:

Branch Value Risk
QMPDesignPreviewChanges (22 commits) System question visualization, tree node polish, collapse/expand Built on older patterns; UX concepts valuable, code likely needs rewrite
QMChildQuestionVisualize (12 commits, PR #2387 open) Child validation, flat assign tree Most recent work; closest to current patterns
QDWizards (6 commits) Dialog-based edit workflows Concept may not align with inline editing direction
QMAssignDirtyCheck (4 commits) Unsaved changes guard Small, useful pattern to incorporate
QMAssignPageFix (3 commits) System question lock icon Tiny fix, easy to incorporate

UX/UI Considerations

  • The existing v2 Design tab is tree-based with per-node view states -- this concept works well
  • The Assign tab's dual-tree with checkbox selection is functional but the UX for "intuitivity of assigning" (issue #1648) was never resolved
  • The Preview tab simply renders the existing AnnotationFormComponent -- when Annotation Form v2 is built, this will need to use the new component
  • The Figma designs in "SyRF Design v2" should be consulted but may need updating for the versioning workflow
  • Performance with many questions (issue #1125) is a known concern that the new implementation should address

Based on the analysis:

  1. Triage the 22 open issues -- close what's been resolved, update what's still relevant
  2. Evaluate PR #2387 -- decide whether to merge the child question work or incorporate it into the new implementation
  3. Implement against the current Phase 1-9 plan in implementation-plan.md, not the older PR2398 phase labels
  4. Start with Phases 1-3 (data model, migration infrastructure, backend API) because the new collections and publish semantics are prerequisites for the UI
  5. Build Phases 4-6 (Design, Assign, Preview) against the updated UX specs and prototype in this branch
  6. Treat Phase 7 (Annotation Form v2) and Phase 8 (Admin Decision Framework) as distinct investments with their own validation and rollout gates
  7. Use migration-strategy.md as the operational source of truth for rollout, system-question upgrades, and rollback planning

This document was compiled on 2026-03-30 from analysis of 20 PRs, 27 issues, 15 branches, and the current question-management planning docs in this branch.