Skip to content

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