Review eligibility truth table¶
Generated from ReviewEligibilityTruthTable in SyRF.Testing.Common; do not edit by hand.
ReviewEligibilityPolicyTests.MarkdownExportIsCurrent fails when this export is stale; rerun it
with UPDATE_REVIEW_ELIGIBILITY_TRUTH_TABLE=1 to regenerate. The contract is described in
Screening and annotation eligibility.
Each row is an explicit set of facts. Unless a row says otherwise the reviewer holds the stage
Review grant but not Reconcile, the stage is active, the study still needs screening and is not
sufficiently excluded, screening and annotation places are free, the study is under its annotation
target (the new-annotation selection rule), the reviewer has no decision,
session or claim, allocation is off, excluded saved work is not hidden, and the study lacks enough
completed sessions to reconcile. ✓ means allowed; otherwise the stable reason code is shown. ⚠ marks a
non-blocking warning. Selection columns (newScreeningPool to reconciliationPool) are separate
from actions. annotationClaim says whether a leftover annotation claim must be released.
| Case | Configuration | submitNewScreening | correctOwnScreening | startAnnotation | saveOwnAnnotation | completeOwnAnnotation | reopenOwnAnnotation | removeOwnAnnotation | startReconciliation | saveOwnReconciliation | newScreeningPool | newAnnotationPool | resumeSaved | directAccess | reconciliationPool | annotationClaim |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Screening-only, study needs screening, new reviewer | ScreeningOnly | ✓ | NotFound | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | NotFound | Forbidden | Forbidden | ✓ | ActivityUnavailable | ActivityUnavailable | ✓ | Forbidden | keep |
| Screening-only is implicitly strict: sufficient, new reviewer | ScreeningOnly; screening sufficient | ScreeningComplete | NotFound | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | NotFound | Forbidden | Forbidden | ScreeningComplete | ActivityUnavailable | ActivityUnavailable | ScreeningComplete | Forbidden | keep |
| Screening-only, sufficient, reviewer corrects own decision | ScreeningOnly; screening sufficient; own decision | ExistingDecisionUseCorrection | ✓ | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | NotFound | Forbidden | Forbidden | ExistingDecisionUseCorrection | ActivityUnavailable | ActivityUnavailable | ✓ | Forbidden | keep |
| Screening-only, screening places full | ScreeningOnly; screening places full | AtCapacity | NotFound | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | NotFound | Forbidden | Forbidden | AtCapacity | ActivityUnavailable | ActivityUnavailable | AtCapacity | Forbidden | keep |
| Screening-only, screening places full, reviewer holds a screening claim | ScreeningOnly; screening places full; own screening claim | ✓ | NotFound | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | NotFound | Forbidden | Forbidden | ✓ | ActivityUnavailable | ActivityUnavailable | ✓ | Forbidden | keep |
| Combined Stop, sufficient, new reviewer | Combined (ScreeningAndAnnotation selection, Stop); screening sufficient | ScreeningComplete | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | ✓ | NotFound | ✓ | Forbidden | keep |
| Combined Allow, sufficient, new reviewer | Combined (ScreeningAndAnnotation selection, Allow); screening sufficient | ✓ | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | ✓ | NotFound | ✓ | Forbidden | keep |
| Combined with no stored policy resolves to Allow: sufficient, new reviewer | Combined (ScreeningAndAnnotation selection, Allow); screening sufficient | ✓ | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | ✓ | NotFound | ✓ | Forbidden | keep |
| Combined Allow, sufficient, screening places full (no capacity veto) | Combined (ScreeningAndAnnotation selection, Allow); screening sufficient; screening places full | ✓ | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | ✓ | NotFound | ✓ | Forbidden | keep |
| Combined Stop, sufficient, annotation full, no own work | Combined (ScreeningAndAnnotation selection, Stop); screening sufficient; annotation places full | ScreeningComplete | NotFound | AtCapacity | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | AtCapacity | NotFound | AtCapacity | Forbidden | keep |
| Combined Allow, sufficient, annotation full, no own work | Combined (ScreeningAndAnnotation selection, Allow); screening sufficient; annotation places full | ✓ | NotFound | AtCapacity | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ScreeningComplete | AtCapacity | NotFound | ✓ | Forbidden | keep |
| Combined Stop, study needs screening, screening places full | Combined (ScreeningAndAnnotation selection, Stop); screening places full | AtCapacity | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | AtCapacity | ✓ | NotFound | ✓ | Forbidden | keep |
| Combined Stop, own incomplete annotation, annotation full | Combined (ScreeningAndAnnotation selection, Stop); own Incomplete annotation; annotation places full | ✓ | NotFound | DuplicateSession | ✓ | ✓ | NotFound | ✓ | Forbidden | Forbidden | ✓ | DuplicateSession | ✓ | ✓ | Forbidden | keep |
| Combined Stop, own completed annotation | Combined (ScreeningAndAnnotation selection, Stop); own Completed annotation | ✓ | NotFound | DuplicateSession | ✓ | ✓ | ✓ | ✓ | Forbidden | Forbidden | ✓ | DuplicateSession | NotFound | ✓ | Forbidden | keep |
| Combined Allow with Annotation selection: selection is not an action prohibition | Combined (Annotation selection, Allow) | ✓ | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ✓ | ✓ | NotFound | ✓ | Forbidden | keep |
| Annotation-only has no screening policy: new reviewer | AnnotationOnly | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ✓ | NotFound | ✓ | Forbidden | keep |
| Annotation-only, study sufficiently excluded | AnnotationOnly; sufficiently excluded | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ExcludedFromNewAnnotation | NotFound | ✓ | Forbidden | keep |
| Annotation-only, annotation full | AnnotationOnly; annotation places full | ActivityUnavailable | ActivityUnavailable | AtCapacity | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AtCapacity | NotFound | AtCapacity | Forbidden | keep |
| Annotation-only, annotation full, reviewer holds an annotation claim | AnnotationOnly; annotation places full; own annotation claim | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ✓ | NotFound | ✓ | Forbidden | keep |
| Annotation target reached but not enforced: opening still starts annotation, Next does not offer it | AnnotationOnly | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AnnotationTargetMet | NotFound | ✓ | Forbidden | keep |
| Zero annotation target, no tally (historical exception): Next still offers the study | AnnotationOnly | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ✓ | NotFound | ✓ | Forbidden | keep |
| Zero annotation target, no tally, target enforced: selected by the legacy rule, refused by capacity | AnnotationOnly; annotation places full | ActivityUnavailable | ActivityUnavailable | AtCapacity | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AtCapacity | NotFound | AtCapacity | Forbidden | keep |
| Allocation assigned, new work | AnnotationOnly; allocation Assigned | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ✓ | NotFound | ✓ | Forbidden | keep |
| Allocation not assigned, new work | AnnotationOnly; allocation NotAssigned | ActivityUnavailable | ActivityUnavailable | AllocationNotAssigned | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AllocationNotAssigned | NotFound | AllocationNotAssigned | Forbidden | keep |
| Allocation not assigned, own incomplete session resumes and saves | AnnotationOnly; own Incomplete annotation; allocation NotAssigned | ActivityUnavailable | ActivityUnavailable | DuplicateSession | ✓ | ✓ | NotFound | ✓ | Forbidden | Forbidden | ActivityUnavailable | DuplicateSession | ✓ | ✓ | Forbidden | keep |
| Allocation not assigned, reconciliation is unaffected | AnnotationOnly; Reconcile grant; enough completed sessions to reconcile; allocation NotAssigned | ActivityUnavailable | ActivityUnavailable | AllocationNotAssigned | NotFound | NotFound | NotFound | NotFound | ✓ | NotFound | ActivityUnavailable | AllocationNotAssigned | NotFound | AllocationNotAssigned | ✓ | keep |
| Allocation not assigned, leftover annotation claim, no slot left: released with a warning (D8 decision 2) | AnnotationOnly; own annotation claim; allocation NotAssigned; no slot left for own claim | ActivityUnavailable | ActivityUnavailable | AllocationNotAssigned | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AllocationNotAssigned | NotFound | AllocationNotAssigned | Forbidden | release ⚠ AnnotationClaimReleased |
| Allocation not assigned, leftover annotation claim, a slot remains: kept, the held study continues (D8 decision 2) | AnnotationOnly; own annotation claim; allocation NotAssigned | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | AllocationNotAssigned | NotFound | ✓ | Forbidden | keep |
| Stage disabled (D4): saved and draft work stays stored; only removal remains | Combined (ScreeningAndAnnotation selection, Allow); stage disabled; Reconcile grant; own decision; own Incomplete annotation; own Incomplete reconciliation | StageDisabled | StageDisabled | StageDisabled | StageDisabled | StageDisabled | StageDisabled | ✓ | StageDisabled | StageDisabled | StageDisabled | StageDisabled | StageDisabled | StageDisabled | StageDisabled | keep |
| Mode changed to screening-only (D4): own decision and incomplete annotation | ScreeningOnly; own decision; own Incomplete annotation | ExistingDecisionUseCorrection | ✓ | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ActivityUnavailable | ✓ | Forbidden | Forbidden | ExistingDecisionUseCorrection | ActivityUnavailable | ActivityUnavailable | ✓ | Forbidden | keep |
| Mode changed to annotation-only (D4): own decision is kept but not corrected here | AnnotationOnly; own decision | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | Forbidden | Forbidden | ActivityUnavailable | ✓ | NotFound | ✓ | Forbidden | keep |
| No stage review access, with own work | Combined (ScreeningAndAnnotation selection, Allow); no Review grant; own decision; own Completed annotation | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | keep |
| Reconciler without the stage Review grant deliberately opens a not-ready study (D8 warning) | AnnotationOnly; no Review grant; Reconcile grant | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | Forbidden | ✓ ⚠ ReconciliationNotReady | NotFound | Forbidden | Forbidden | Forbidden | Forbidden | ReconciliationNotReady | keep |
| Reconciler continues own incomplete reconciliation on a ready study | Combined (ScreeningAndAnnotation selection, Stop); Reconcile grant; enough completed sessions to reconcile; own Incomplete reconciliation | ✓ | NotFound | ✓ | NotFound | NotFound | NotFound | NotFound | DuplicateSession | ✓ | ✓ | AnnotationTargetMet | NotFound | ✓ | ✓ | keep |
| Reconciler continues own reconciliation after the study stopped being ready (D8 warning) | AnnotationOnly; Reconcile grant; own Incomplete reconciliation | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | DuplicateSession | ✓ ⚠ ReconciliationNotReady | ActivityUnavailable | ✓ | NotFound | ✓ | ReconciliationNotReady | keep |
| Reconciler re-saves own completed reconciliation: idempotent resave allowed (production), no warning | AnnotationOnly; Reconcile grant; enough completed sessions to reconcile; own Completed reconciliation | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | DuplicateSession | ✓ | ActivityUnavailable | AnnotationTargetMet | NotFound | ✓ | ReconciliationNotReady | keep |
| Another reconciler already completed: starting again is early reconciliation (D8 warning) | AnnotationOnly; Reconcile grant; enough completed sessions to reconcile; another reconciler completed | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | ✓ ⚠ ReconciliationNotReady | NotFound | ActivityUnavailable | AnnotationTargetMet | NotFound | ✓ | ReconciliationNotReady | keep |
| Own completed reconciliation alongside another reconciler's: resave warns, pool excludes | AnnotationOnly; Reconcile grant; enough completed sessions to reconcile; another reconciler completed; own Completed reconciliation | ActivityUnavailable | ActivityUnavailable | ✓ | NotFound | NotFound | NotFound | NotFound | DuplicateSession | ✓ ⚠ ReconciliationNotReady | ActivityUnavailable | AnnotationTargetMet | NotFound | ✓ | ReconciliationNotReady | keep |
| Hidden excluded saved work (D8): absent from resumption, still opens and saves | AnnotationOnly; sufficiently excluded; hide excluded saved work; own Incomplete annotation | ActivityUnavailable | ActivityUnavailable | DuplicateSession | ✓ | ✓ | NotFound | ✓ | Forbidden | Forbidden | ActivityUnavailable | DuplicateSession | ExcludedSavedWorkHidden | ✓ | Forbidden | keep |
| Excluded saved work with hiding off resumes as usual | AnnotationOnly; sufficiently excluded; own Incomplete annotation | ActivityUnavailable | ActivityUnavailable | DuplicateSession | ✓ | ✓ | NotFound | ✓ | Forbidden | Forbidden | ActivityUnavailable | DuplicateSession | ✓ | ✓ | Forbidden | keep |