Specification: stage pools, steps, capacity and history¶
Temporary planning specification, written on 5 October 2026 from the owner session of 4–5
October. It turns consolidation §3 and the stage-filters clarification into a design detailed
enough for the T-SP-00 brief ("stage pools, steps, capacity and history"). Owner decisions recorded
here are planning approval. Brief approval and implementation authorisation are separate decisions
taken per gate (D1-04), and both remain on hold. No work has started, no gate has passed and nothing
is enabled in production. Storage names, fields, indexes and numbers are PROPOSALs for the F1a
storage and naming ADRs and the F3 workflow freeze unless a decision ID is cited. Where this page
and an older package text disagree, the
consolidation wins,
then this page. §13 lists the package documents to amend.
Sources. Primary: consolidation §3; stage study filters and steps; the session register entries Q-15, Q-24, Q-28, Q-01, Q-02 (Batch B), D3-09, D3-13, D3-16 to D3-20 (Batch D3), D4-15 and D4-19, and every section appended after its sources note (pool-departure continuation, targeted pool history, eligibility explanation, historical coverage, entry justification, structured events, required queries and reviewer-pool browsing); the condensed packages O4 and E4, the carry-forward and brief tables and the browsing clarifications. Context: FEAT-008 stage filtering, the stage and step access-policy proposal (unapproved research input), the owner ledger (EW1, DP6, DP7, LC1, RX2), contracts C6, C7 and C12, the domain model, programme integration §3–§6 and the consistency model.
Sibling specifications. Sessions, targets and overrides: RD. Duplicate merge identities: DM. Outcome states, blinding, hints and adjudication: RS. Legacy conversion: BC. PRISMA use of history: RI. Screens: UX. Contribution exclusion and project deletion: ACD.
1. Summary in plain English¶
This specification explains five things:
- how SyRF decides which Studies a stage works on;
- how it decides which work each reviewer is offered;
- how steps inside a stage depend on each other;
- how capacity, timeouts and in-progress limits work when one form is used by several stages;
- how SyRF keeps structured history so that an admin can later explain why a Study was, or was not, reviewed.
Six ideas carry the design.
- A stage study filter defines the stage pool. The filter is a set of clauses joined by AND and OR groups. A clause asks about a Study's current screening result under a named screening profile, or about its accepted (reconciled) answer to a named annotation question. A Study is in the stage pool while its current evidence satisfies the filter. There is no other gate into a stage.
- Being in the pool says nothing about work. Allocation, batches, permissions, capacity, step rules and evidence that is already sufficient decide what work is offered, when and to whom. A Study can sit in a pool with nothing left to do.
- Steps live inside a stage. Each step contains screening, annotation or both. A step can depend on earlier steps. A separate exclusion-stop setting says whether an Exclude stops further progression. By default a reviewer moves on after their own Include while the team result is still pending. A stage setting can make everyone wait for the team's Include instead. Beside these review steps, SyRF adds a system adjudication step for screening ties, and a project may add training steps (§3.4).
- Evidence belongs to the project. A form or profile that is already sufficiently reviewed needs no repeat work when a new stage uses it. SyRF never invents a stage-local review to explain why nothing was asked.
- Current pools are calculated; history is recorded. SyRF calculates the current pool from current evidence whenever it is needed. Separately, it records immutable, structured events when membership actually changes, when a reviewer starts work and what made that start legitimate. Decisions about current access never read that history.
- Leaving a pool never erases evidence. A valid result recorded through a stage can make its own Study leave that stage's pool. SyRF accepts the result, records the departure and its cause, stops new offers and, by default, lets reviewers finish work they had already started. An authorised admin can restrict that.
The table shows the layers this page keeps apart.
| Layer | Plain question | How SyRF knows | Stored? |
|---|---|---|---|
| Project Study | Is this a current reviewable Study? | Study state, lifecycle status and search withdrawal | Yes, the Study document |
| Stage pool | Does the Study match this stage's filter now? | The filter evaluated against current evidence | No, calculated on read |
| Stage pool history | When and why did it enter or leave the pool? | StagePoolBaselineMember, StagePoolEntered and StagePoolDeparted events |
Yes, immutable events |
| Reviewer study pool | Which pool Studies can Alice work on in this stage now? | Stage pool, then Alice's allocation or assignment, then current availability | No, calculated on read |
| Offered work | Which step would Next or Browse give Alice now? | One admission decision per request | No; page queries are not logged |
| First release | When was work in this stage first released to anyone? | WorkFirstReleased event |
Yes |
| Started review | When did Alice begin, through which route, and why was that allowed? | ReviewStarted event carrying ReviewStartEligibility |
Yes |
| Saved and completed review | What did Alice submit? | Session versions and decision revisions | Yes, existing records |
| Saved work outside the pool | Can Alice finish what she started after the Study left? | Continuation rules; each completion records its basis | Derived, with the basis stored on the version |
A short example. In a stroke review, the "Full text" stage has the filter "title/abstract result is Included AND full-text result is not Excluded". Alice and Bob both Exclude Okafor 2021 at full text, so the full-text result becomes Excluded. SyRF saves Bob's decision first. It then sees that Okafor 2021 no longer matches the filter and records a departure that names Bob's decision as the cause and the failing clause. Nobody is offered new work on Okafor 2021 in that stage. Chandra had already started extracting outcomes for it. She sees it under Saved work and may finish. PRISMA still reports Okafor 2021 as excluded at full text.
Out of scope. A separate stage-entry gate. Filter clauses that depend on which reviewer is asking. Answer-based branching between steps (D4-15, deferred beyond MVP). A stored "current pool" table trusted for access. Any history invented for the time before tracking began.
2. Decisions covered¶
| ID | Decision in one line | Status | Section |
|---|---|---|---|
| Q-15 | The stage study filter defines the pool; there is no incoming stage gate; dependencies are between steps inside a stage; exclusion-stop is a separate step setting | Replaced | §3.3, §3.4, §5.1, §5.2 |
| Q-24 | Independent annotation stays independent unless a dependency is configured; legacy stages map to steps through the opt-in wizard; new combined steps stop extra screening at sufficiency, with Allow available; Apply anyway releases temporary reservations only | Decided | §3.4, §3.11, §7, §10.4 |
| Q-01 | A reviewer may progress after their own Include while the collective result is pending; a stage setting can require collective Include; exclusion-stop still applies | Decided | §3.4, §5.2 |
| Q-02 | Automatic completion follows remaining work; static completion stays until explicit authorised reopening; admin changes show the extra work first; merges change evidence and never change stage status directly | Decided | §3.10, §4.11, §5.9 |
| Q-28 (stage and capacity parts) | Saved work completes after screening exclusion by default and a step setting can prevent it; the form owns the inactivity timeout and per-reviewer in-progress limit; one shared place across tabs and routes; the form's capacity baseline applies to every route and a stage may be stricter | Decided | §3.9, §3.11 |
| D4-19 (serving and browsing parts) | Random serving stays the default; optional browsing of the reviewer study pool is dynamic, blinded and never grants broader rights | Decided-amended | §3.6, §4.5 |
| D4-15 | Accepted-answer branching between steps is outside MVP; reconciled-answer clauses in stage filters stay in scope | Deferred | §3.4, §10.3 |
| D3-09 | Align the paused eligibility programme with the filter and step model | Brief item | §12.1 |
| D3-13 | Allocation and batch contracts; WorkFirstReleased kept distinct from StagePoolEntered, review start and completion |
Brief item | §3.7, §12.1 |
| D3-16 | Production capacity route through admitted pilot projects | Brief item | §3.11, §12.1 |
| D3-17 | Capacity cap separate from the target; explicit defaults; no eviction | Brief item (carry-forward alignment) | §3.11, §12.1 |
| D3-18 | Form-owned timeout and in-progress limit; one shared place; stage-derived rules removed | Brief item (carry-forward alignment) | §3.11, §12.1 |
| D3-19 | Reserve the dependent annotation place at personal Include; keep the screening decision if no place is free | Brief item | §4.6, §12.1 |
| D3-20 | Reviewers see active counts and their own place; Monitor holders see names; blinding is never defeated | Brief item | §6, §12.1 |
| D2-07 | The form owns the inactivity timeout and per-reviewer in-progress limit; expiry keeps the draft (the RD spec owns sessions) | Decided | §3.11 |
| D2-08 | One shared session and place across tabs and devices (the RD spec owns sessions) | Decided | §3.11 |
| Amendment: results produced through a stage | Accept the valid result, recalculate membership, keep the evidence and its cause, stop new offers | Decided | §4.2, §9.2 |
| Amendment: finishing after pool departure | Started work may finish after any filter-driven departure by default; an authorised admin can restrict it; the setting's placement is still to specify | Decided | §3.9, §12.4 |
| Amendment: targeted pool history | Current pools stay query-time; actual membership changes are recorded through targeted reevaluation | Decided | §3.5, §4.1 to §4.4 |
| Amendment: explicit entry justification | Each entry records effective time, filter version, satisfied clauses, input versions, cause and actor | Decided | §3.5.3 |
| Amendment: structured events and required queries | Versioned, queryable event schemas; distinct entering and exiting Studies with episodes | Decided | §3.12, §3.13 |
| Amendment: eligibility explanation | A permission-aware admin timeline explains review and non-review honestly | Decided | §3.14 |
| Amendment: historical pool coverage, with the reporting-priority clarification | Retain baseline and transitions for audit; reporting prioritises actual review through the stage | Decided | §3.13, §12.2 |
| Amendment: reviewer study pool, browsing, dynamic pool and browsing blinding | The reviewer pool is a stage-specific subset; browsing is optional, dynamic and blinded | Decided | §3.6 |
| Tie adjudication amendment (step-model mapping; RS owns the policy) | A tie routed to adjudication is handled in a system adjudication step inside the stage, never as a stage-entry dependency | Decided (mapping PROPOSAL) |
§3.4, §5.12 |
| EW1, LC1, RX2, PV2, PR1, SF1, SF2, DP4 | Earlier owner decisions kept and applied (LC1's confirmation hold for automatic stages is superseded by Q-02, §3.10) | Decided | Throughout |
| DP6 and DP7 cross-stage part; A-06; A-18 | Cross-stage route policy and its interpretations | Replaced | §14 |
Scope of the counts. Of the 74-entry session register, this page places Q-15, Q-24, Q-01, Q-02,
Q-28, D4-19 and D4-15 among the 52 resolved, replaced, removed or deferred entries. It owns 7 of
the 22 alignment and brief entries: D3-09, D3-13, D3-16, D3-17, D3-18, D3-19 and D3-20. In the
repository universe of 89 those 7 sit inside the 25 alignment, brief and validation entries. D2-07
and D2-08 are among the 11 decisions outside the register that the owner session decided; the RD
spec owns them. The amendments are outside the register count, and the integration document gives
them OS-A IDs.
3. Concepts, entities and storage¶
3.1 How to read this section¶
Each entity block answers the same questions: what it is, its identity, its versions and pointers,
whether it changes, its proposed storage and what it is not. Storage is PROPOSAL throughout. The
design adds one append-only history store and a few fields on existing documents. Every other
concept is derived on read.
3.2 Stage and StageSettingsVersion (existing, amended)¶
- What it is. A stage is a named piece of workflow, such as "Full text". Its settings version is the immutable description of how the stage works from a point in time: its filter version, the forms and profiles it binds, its steps and its stage-level defaults.
- Identity.
stageId, the ID already embedded in Project. Versions are(stageId, seq). - Versions and pointers. The Stage head holds the current settings pointer. Lifecycle status and mode live in the lifecycle part (V2-17).
- Mutability. Versions never change. Publication raises the
settingsChangefence, drains, switches the pointer and releases (consistency model §7.6). A Completed stage accepts a new settings version only through an approved change request (LC1). - What changes from the package. Removed: the incoming cross-stage route policy (the DP6 and DP7 cross-stage part, replaced by Q-15's model). Moved to the form: the target-enforcement switch (now a capacity cap), the inactivity timeout and the in-progress limit (Q-28, D3-18). Moved to the form or profile, specified by the RS spec: reconciliation identity blinding and the reconciled-answer visibility baseline, which a step may only narrow (Q-28). Added: the filter version (§3.3), the progression basis (Q-01), the exclusion-stop, saved-work and started-work settings (§3.4, §3.9), an optional stricter route capacity cap (§3.11) and the browsing setting (§3.6).
- Storage (
PROPOSAL). The existing planned collectionspmReviewStageandpmStageSettingsVersion(domain model §4.4). - What it is not. A stage owns no evidence, target or session. Two stages that bind one form share one session per reviewer and one target (SF1, SF2).
3.3 StageStudyFilter and StageStudyFilterVersion¶
- What it is. The stage study filter is the rule that decides which current Studies are in the stage pool. The owner decided that it may combine clauses on screening-profile outcomes and on reconciled answers to specified annotation questions, using AND/OR groups (consolidation §3, item 1). A filter version is one immutable published form of that rule.
- Structure. A filter version is a tree.
| Node | Fields | Reads | Notes |
|---|---|---|---|
| Group | logic (AND or OR), children (groups or clauses) |
Its children | Groups nest; proposed depth limit 4 (not approved) |
| Profile outcome clause | profileId, op (in or notIn), states |
The Study's current outcome under that profile | States Included, Excluded and Unresolved, with optional unresolved sub-states equal to the RS spec's resolutionState values (Pending, AwaitingExtraReview, InDiscussion, PendingAdjudication; RS §3.8). A collective all-Unsure state is not offered until RS §5.10 decides it |
| Accepted answer clause | questionId, the accepted question versions, op (in, notIn, anyOf, allOf, hasAcceptedAnswer, hasNoAcceptedAnswer), option identities or typed values, an optional authority restriction |
The Study's current accepted answer to that question | Whole-Study answer context in MVP; entity-scoped clauses are ambiguity SP-AMB-06 |
| Base predicate (implicit) | None | Study state, lifecycle status, search withdrawal |
Always joined to the root with AND; not editable |
"Current outcome" means the final facet when an adjudicated or merge-resolved final result exists
(RS §3.8 finalSource), including one flagged "inputs changed" (RS-R58), and otherwise the
candidate collective facet evaluated by the profile rule (ScreeningOutcome,
domain model §4.2). It never means one reviewer's own decision. "Current
accepted answer" means the answer in the Study's current AcceptedResultVersion of any authority
(SingleAnnotator, HumanReconciled, Adjudicated, MergeResolved) unless the clause restricts
authority (ambiguity SP-AMB-02). Option identities follow VA-05, so a wording change to an option
never breaks a clause.
- Clause kinds left out on purpose. A reviewer's own decision or progress (the owner did not approve reviewer-dependent pool clauses). Membership of another stage's pool. Remaining work, capacity or allocation facts. These omissions keep the filter the same for every reviewer and make recursion impossible, because a filter only reads preserved project evidence.
- Evaluation. Three-valued. A clause is True, False or Unknown. It is Unknown when its input
cannot be evaluated, for example an accepted answer recorded under a question version that the
clause does not accept. Groups combine values with the usual three-valued AND and OR. A Study is a
member only when the root is True. Unknown therefore fails closed, and the explanation shows which
clause was Unknown and why (
PROPOSAL). - Identity.
filterVersionId, deterministic over(stageId, filterSeq). A stage has exactly one filter, so the filter needs no identity of its own beyond the stage. - Versions and pointers. A new
filterSeqis minted whenever the clause tree changes. Each stage settings version references exactly one filter version. A settings version that changes only steps keeps the samefilterVersionId. The filter version'sactivatedAtis the HLC stamp of the settings version that first activated it. - Dependency set. Computed at publication and stored with the version: the profile IDs and question IDs that its clauses read. Targeted reevaluation uses it (§4.2, §4.3).
- Validation at publication. Referenced profiles and questions exist and are published. Groups
are not empty. FEAT-008's same-profile simplifier runs before compilation; it stays a correctness
rule for matching
screeningOutcomes[]entries. A tree that is always False or always True warns and needs confirmation. A clause that reads a profile or question bound in the same stage shows the feedback notice: "Results recorded in this stage can remove Studies from its pool. Reviewers keep their evidence, and by default they can finish work they have started." (The wording is aPROPOSAL; the owner asked that configuration explain this feedback effect.) - Mutability. Immutable once published. Edits happen in the stage designer's draft and write no history.
- Storage (
PROPOSAL). Embedded inpmStageSettingsVersionasfilter {filterVersionId, seq, root, dependencySet, digest}. No collection of its own. FEAT-008's Filter Set JSON (schema v2) becomes filter schema v3: accepted-answer clauses keyed by option identity, the implicit base predicate and three-valued evaluation. A legacy stage without a filter keeps FEAT-008's "no Filter Set means all project studies" until conversion maps it (§10.4). - What it is not. It is not an admission rule for a reviewer. It does not decide whether work is needed. A filter failure is not a screening exclusion.
Example filters used in §9:
| Stage | Filter | Plain meaning |
|---|---|---|
| Title and abstract | Base predicate only | Every current Study |
| Full text | TA in {Included} AND FT notIn {Excluded} |
The team included it at title/abstract, and full-text screening has not excluded it |
| Rodent synthesis | FT in {Included} AND (Species anyOf {rat, mouse} OR Model in {MCAO}) |
Included at full text, and the accepted species is rat or mouse or the accepted model is MCAO |
3.4 Review steps¶
- What it is. A step is one unit of reviewer work inside a stage. It contains a screening activity (a screening profile), an annotation activity (a form) or both.
- Identity.
stepId, stable across settings versions so that provenance and history can follow a step. Steps are stored inside the stage settings version. - Mutability. Changed only by publishing a new stage settings version.
Step kinds (added in the 5 October harmonisation; kinds other than review steps are PROPOSAL).
| Kind | Contents | Dependencies | Exclusion-stop | Source |
|---|---|---|---|---|
| Review step | A screening activity, an annotation activity or both | Configured explicitly by the designer (this section) | Its own settings (table below) | Q-15 (owner) |
| Adjudication step | System-defined. The adjudication activity for one screening profile: its open AdjudicationTasks for any trigger (RS-R52, RS-R59); for decision triggers the outcome is PendingAdjudication. It accompanies each screening step whose profile can route work to adjudication, which in practice is every profile (RS-R51) |
Designers add none to or from it. Downstream steps depend on the screening step and read its outcome | None of its own. The screening step's collective exclusion-stop applies once the adjudicated outcome is a definite Exclude | Tie amendment ("a separate explicit adjudication step ... not a separate hidden stage-entry dependency"); mapping PROPOSAL |
| Training step | Practice on bound form or profile versions against training references (TI §3.1) | None by default. A live step may depend on "passed this training step" only if TI-R23's optional PROPOSAL is adopted |
None | S4 expansion (owner); step mechanics PROPOSAL |
An adjudication step is shown only to eligible adjudicators (RS-R17, RS-R53, RS-R54). Adjudication
resolves decisions already submitted, as reconciliation does, so its tasks are not limited to the
stage's current pool: a reason disagreement on a Study that the Excluded outcome moved out of the
pool stays reachable (PROPOSAL). This is not a new review outside the pool (SP-R34). Open
adjudication work is remaining work for automatic completion of each stage that binds the profile
(§3.10). Discussion and extra review are not steps; they stay inside the screening step's
resolution route (RS §3.10, RS-R51). Training attempts create no live work, claims or pool events
(TI-R04). Rules SP-R91 and SP-R92 (§5.12) state these kinds.
Step and stage settings.
| Setting | Level | Values | Default | Source |
|---|---|---|---|---|
| Activities | Step | Screening profile, form, or both | None | Q-15; stage filters §2 |
| Display order | Step | Integer | None | Never creates a dependency (stage filters §2) |
| Depends on | Step | AND/OR group of prerequisite steps | None | Stage filters §2 |
| Progression after own Include | Stage | OwnIncludeSufficient or CollectiveIncludeRequired |
OwnIncludeSufficient |
Q-01 (owner) |
| Tighten-only progression override | Step | CollectiveIncludeRequired |
Inherit | Q-01's original recommendation (PROPOSAL) |
| Extra screening after sufficiency | Step with screening | Stop or Allow |
Stop for new combined steps; legacy value preserved by mapping |
Q-24 (owner) |
| Exclusion-stop: personal | Step with screening | A reviewer's own Exclude stops that reviewer's progression in scope: on or off | On (PROPOSAL) |
Stage filters §3 requires stated defaults; the within-stage handoff table (C6) |
| Exclusion-stop: collective | Step with screening | A collective Exclude is terminal for new work in scope: on or off | On (PROPOSAL) |
Q-01; DP6 veto |
| Exclusion-stop scope | Step with screening | DependentSteps (direct and transitive dependants) or an explicit step list |
DependentSteps (PROPOSAL) |
Stage filters "apply the configured termination scope" |
| Saved work after screening exclusion | Stage default, step override | AllowCompletion or PreserveOnly |
AllowCompletion |
Q-28; EW1 (owner) |
| Started work after leaving the pool | Placement open | Allow or Restrict |
Allow |
Owner amendment; placement is SP-AMB-01 |
| Reconciled-answer visibility | Step | Hide-only narrowing of the form baseline | Inherit | Q-28 (the RS spec owns it) |
| Compulsory, handoff allowed | Step | Carried from C6 | As C6 | C6 (PROPOSAL) |
When a dependency is satisfied for reviewer R (owner basis cited; mechanics PROPOSAL).
| Prerequisite activity | Basis in force | Satisfied when |
|---|---|---|
| Screening under profile P | OwnIncludeSufficient (stage default, Q-01) |
R's current decision under P is Include (or Unsure, under the RS-R47 PROPOSAL), even while the collective result is pending. Or R has no decision and P's current outcome is Included, in which case SyRF records collective satisfaction and invents no vote |
| Screening under profile P | CollectiveIncludeRequired (stage setting, Q-01) |
P's current outcome is Included |
| Annotation with form F | Either | R's current session for F is Completed, or F is already sufficient for the Study through qualifying evidence from any route (collective satisfaction, no duplicate work) |
| Both | Either | Both rows above hold |
Exclusion-stop then applies on top. With the personal setting on, R's own current Exclude under P
blocks R from the scope even when collective satisfaction would otherwise admit R. With the
collective setting on, a collective Exclude under P stops new work in the scope for everyone; an
adjudicated Exclude is a collective Exclude, while a pending outcome (AwaitingExtraReview,
InDiscussion, PendingAdjudication) never triggers exclusion-stop (RS-R57). Steps outside the
scope are untouched. Own Unsure (PROPOSAL, consistent with D4-01, identical to RS-R47). Under
OwnIncludeSufficient, a reviewer's own current Unsure satisfies the dependency exactly as their own
Include does and tries the dependent claim as an own Include does (D3-19). It never satisfies
CollectiveIncludeRequired, never counts as a definite Include and never triggers personal
exclusion-stop. The single confirm item is in RS §12; SP-AMB-04 is retired into it.
Pending never means ignoring an Exclude. Alice may move to the extraction step after her own Include while the team result is pending. If the team result later becomes Excluded and the collective exclusion-stop is on, no new work is offered in the scope. Work Alice already started becomes saved work under the saved-work setting (§3.9).
Already-sufficient evidence. Step eligibility uses the current applicable evidence for the
Study across the whole project. A form whose effective target is already met, or a profile whose
sufficiency rule is already met, offers no new work in any step, whichever stage collected the
evidence. Binding such a form or profile into a new stage creates no new evidence target. If every
activity in the stage is sufficient, the Study stays in the pool with nothing to do. SyRF records no
stage-local review, vote or submission to explain this. Extra screening after sufficiency is offered
only where a step says Allow. Effective targets (RD spec) and publication treatment still apply,
so an authorised target or requirement change can later create work.
Terminal exclusion before offering. When a governing screening step's profile is already
collectively Excluded and its collective exclusion-stop is on, SyRF applies that result before
offering any work in the scope. This holds even if nobody reviewed the Study through this stage.
The governing step's own extra screening is not offered either (PROPOSAL). The Study stays in the
pool unless the filter itself excludes it.
Remaining work. For reviewer R, a step activity has remaining work when the dependency is satisfied, exclusion-stop does not apply, the activity is not yet sufficient (or extra screening is allowed) and R has not completed it. For "anyone", the same test runs without the per-reviewer parts. Automatic stage completion (§3.10) and the "no remaining work" explanation use the "anyone" form.
- What it is not. A step owns no evidence and no target. No step-level target override exists (consolidation §1). Display order is never a dependency. Branching on accepted answer values between steps is deferred beyond MVP (D4-15).
3.5 The stage pool and its history¶
3.5.1 The current stage pool (derived)¶
- What it is. The set of current Studies whose evidence satisfies the stage's current filter version right now.
- How it is read. Selection, browsing, admission, counts and Monitor views compile the current
filter version into a predicate over the Study document and its canonical summary
(
screeningOutcomes[]andfilterInputs[], §3.5.2). The predicate carries the current binding and definition vector as constants, so a Study whose projection is stale is not offered (consistency model §8.2). Nothing reads history or the tracking marker for this. - Storage. None. A stored membership cache is allowed only if every read proves it current for
its input vector, and only if the F3 benchmark shows the compiled predicate cannot meet the
selection budget (
PROPOSAL). - What it is not. It is not a count of reviewed Studies, it does not grant any reviewer access and it does not prove that work existed.
3.5.2 Filter inputs on Study¶
- What it is.
Study.CanonicalSummary.filterInputs[]: a small projection of the Study's current accepted answers for the questions that any current filter version in the project reads. Each entry holds the question ID, the accepted answer (option identities or typed value), theAcceptedResultVersionID, its authority and its stamp. - Written by. The command that changes the accepted result (gold publication, target-one automatic acceptance, merge resolution), in the same transaction as the Study write that CR-1 already requires. When a new filter version starts reading a question that no current filter read before, a preparation operation fills the entries before that version activates (§4.1).
- Storage (
PROPOSAL). A new part ofStudy.CanonicalSummary. The alternative, a lookup into the gold store at query time, is kept as a fallback for the F3 benchmark.
3.5.3 Pool transition events and entry justification¶
Three event types record membership. Each is a HistoryEvent (§3.12).
| Event | Written when | Carries |
|---|---|---|
StagePoolBaselineMember |
Tracking starts for a stage whose pool already existed (conversion, or the first release of history for an existing canonical stage) | The matching filter version and clause evaluation; coverage BaselineAtTrackingStart; no earlier entry time and no invented cause |
StagePoolEntered |
Membership changes from out to in | Entry justification (below) |
StagePoolDeparted |
Membership changes from in to out | The failing clauses, the causal change, reason codes and the evidence versions |
Entry justification (owner amendment). Every entry records:
- the effective time (when the cause became current) and the recorded time;
- the exact filter version and the full clause evaluation tree, marking which groups and clauses were satisfied;
- the supporting input versions: the screening outcome versions and accepted result versions read by each clause, and the Study version;
- the causal change: import, a screening outcome change, an accepted answer change, a filter version activation, a merge or unmerge, a search reinstatement or a lifecycle change, with the command or operation ID and the cause record's ID;
- the actor where one exists: the member, the system rule, an AI screening model (named as such), or the operator.
Entry justification records filter eligibility only. Permission, allocation and capacity
eligibility to review belong to ReviewStartEligibility (§3.8).
Departure reasons distinguish:
| Reason code | Meaning |
|---|---|
SCREENING_OUTCOME_EXCLUDED |
A failing profile outcome clause whose input changed to Excluded |
SCREENING_OUTCOME_CHANGED |
A failing profile outcome clause whose input moved to another state, for example back to Unresolved after a correction |
ACCEPTED_ANSWER_NOT_MATCHING |
A failing accepted answer clause whose accepted value changed |
ACCEPTED_ANSWER_ABSENT |
The accepted answer the clause needs no longer exists in the current result |
CLAUSE_UNKNOWN |
A clause could not be evaluated and failed closed |
FILTER_RECONFIGURED |
Unchanged evidence fails a new filter version |
STUDY_NOT_CURRENT_MERGED |
The Study stopped being current because of a StudyMerge |
STUDY_NOT_CURRENT_UNMERGED |
A consolidated Study stopped being current because of a StudyUnmerge |
HIDDEN_BY_SEARCH_WITHDRAWAL |
Withdrawal hid the Study and no other current search supports it |
LIFECYCLE_NOT_ACTIVE |
The Study's lifecycle status left Active |
A departure is labelled SCREENING_OUTCOME_EXCLUDED only when that is the actual failing input.
Filter failure is never automatically a screening exclusion.
3.5.4 Episodes and the per-study tracking marker¶
- Episode. Each entry (or baseline membership) opens an episode for the Study in that stage, and the next departure closes it. Episodes are numbered per (Study, stage). A re-entry opens episode 2. It never creates a second distinct Study.
- Tracking marker (
PROPOSAL).Study.CanonicalSummary.stagePoolTracking[], one entry per tracked stage, holdingstageId,filterVersionId,member,episodeSeq,lastEventSeq,lastEvaluatedStampandinputDigest. It is the last recorded membership. Commands and operations use it to detect transitions exactly once and to order them. No admission, selection or count ever reads it. - Why it works. Every filter input changes through a Study write (CR-1): decisions, outcomes, accepted results, imports, merges, withdrawals and lifecycle changes all write the Study. Each such transaction can therefore compare the marker with the new evaluation and record the difference in the same commit.
3.5.5 Baseline¶
Tracking for a newly created canonical stage starts when the stage first becomes Active. Its
members at that moment get StagePoolEntered with cause StageActivated, because coverage is
complete from that point. StagePoolBaselineMember is used only when a pool existed before tracking
could observe it: baseline conversion of a legacy stage (BC spec) or the first release of pool
history for a canonical stage created earlier. Baseline events carry the tracking start as their
effective time and say that earlier history was not recorded.
3.6 Reviewer study pool, offered work and browsing¶
- Reviewer study pool (owner definition). The reviewer study pool is stage-specific. It is the subset of the stage's current pool allocated or assigned to that reviewer and currently available under the applicable review rules. It is derived on read and never stored.
- Allocation scope. Until AL1, canonical stages refuse proportional allocation (D3-13a), so every eligible member's allocation scope is the whole stage pool. Explicit assignments (for example an additional-review request naming Bob) add or narrow scope as recorded.
- Currently available. At least one step activity passes the admission decision for this reviewer: permission, stage Active, batch access, dependency satisfied, exclusion-stop not applying, remaining work, a place already held or obtainable, and the in-progress limit.
- Offered work. Next serves randomly from the reviewer pool by default (D4-19). Explicit assignment is an audited exception. Browse lists the pool when enabled. A direct link opens one Study. All three call the same admission decision, which is evaluated again at start and at submit.
- Dynamic. A Study that leaves the stage pool also leaves the reviewer pool at once. A Study that becomes unavailable to the reviewer (no place, batch not open, dependency unmet) leaves it too. Assignment records, review history and drafts stay. SyRF keeps the recorded causes of availability changes (pool events, assignments, allocation regime and batch records, settings versions, permission audit) with stage and reviewer context, and derives a reviewer's availability history from them. Whether per-reviewer availability changes also need their own events is ambiguity SP-AMB-13.
- Saved work outside the pool. Started work that may continue after a departure appears in a separate Saved work list (§3.9). It is not in either current pool.
Browsing (owner addition and clarifications).
| Aspect | Rule |
|---|---|
| Enablement | Optional and explicitly enabled. PROPOSAL: a stage setting, off by default, under the Design stage capability. The owner left configuration ownership to the brief |
| Content | The reviewer pool only, never an unrestricted assignment list |
| Per row | Bibliographic details (hidden where the profile's bibliographic blinding is on), the reviewer's own status per step (Not started, Draft auto-saved, Version checkpoint saved, Completed; final wording per U1), the reviewer's step availability ("Available", "Waiting for the team's screening result", "Enough reviewers", "Stopped by exclusion"), applicable accepted results under their visibility rules, and the active reviewer count (D3-20) |
| Never shown | Other reviewers' candidate decisions, candidate answers, vote tallies, identities or identity-revealing metadata such as their submission times |
| Ordering | PROPOSAL: a stable per-reviewer shuffle or bibliographic sort. Never an order derived from other reviewers' activity |
| Freshness | Re-evaluated on load and on invalidation hints. Starting or resuming re-checks admission on the server |
| Stale items | Opening a Study that left the pool returns a typed reason, rendered under blinding (for example "No longer available in this stage") |
| Rights | Browsing grants nothing. Pool membership alone never allows starting or submitting |
- What it is not. The browse list is not a reservation and not a permission. Removing an item never revokes permitted continuation.
3.7 Work release, allocation and batches¶
WorkFirstReleased. The first time work in a stage was released to anyone for a Study. This renames the round-2StudyEnteredPool(FEAT-011's pool-entry event), so that it no longer clashes with stage pool entry. Exactly one per (Study, stage), withreleaseKind:
releaseKind |
Written by |
|---|---|
SharedBatchOpened |
The shared batch opening command (CAS on the batch plan); a large batch runs as an operation |
PersonalBatchGrant |
The personal grant command (CAS on the access row) |
ExplicitAssignment |
An assignment that releases work for a Study nobody could take before |
UnbatchedAvailability |
For a stage without batches, the transaction that first makes the Study a member of an Active stage's pool while some step activity has remaining work for anyone. The trigger can be a pool entry, a stage activation or a target increase that creates work (PROPOSAL; ambiguity SP-AMB-10) |
InheritedThroughMerge |
The activation of a StudyMerge, for each stage where an input had already been released; the event links the earliest input release, so the consolidated Study is never delayed behind work already released (DM §3.8; PROPOSAL). Restored Studies after an unmerge keep their original release records |
Later shared openings and personal grants for the same Study stay in the batch plan's own durable
records. Only the first release becomes WorkFirstReleased.
- What it is not. It is not pool entry, a review start or a completion (D3-13 treatment). A Study can enter a pool and never be released, because its evidence is already sufficient.
- Allocation (D3-13a, brief). Proportional allocation stays refused on canonical stages until AL1. AL1 then restricts the reviewer pool through the form-keyed regime.
- Additional reviews (consolidation §1; D3-13 context update). A request for additional
reviews raises the effective Study and form target through
StudyTargetOverride(RD spec), may name people or groups and counts qualifying reviewers once across routes. The original D3-13© "bypass once, audited, target unchanged" is superseded. With the capacity cap following the effective target (§3.11), the requested reviewer has a place. - "Who is offered what" (D3-13d). Pool-level counts by refusal reason until the out-of-request resolver (X-AUTH-RESOLVER) exists. Per-reviewer rows follow it.
- Batches (D3-13b, e, f). Batch membership is defined over stage pool episodes
(
StagePoolEnteredand baseline members). Late entrants join as separately shuffled cohorts. Sufficiently excluded Studies stay in the denominator and count as finished, and restored scope returns to its original membership (the #3939 disposition, still to be recorded in the ledger). Departures for other reasons are ambiguity SP-AMB-09. Openings and grants are durable CAS transitions; status reads never mutate. A performance gate precedes any enablement.
3.8 ReviewStartEligibility and the completion basis¶
- What it is. The record of why a reviewer was allowed to start work at the moment they started. Pool membership alone does not show why a particular reviewer was offered work, so this is recorded separately (owner amendment).
- When. On the first start of a session through a route, meaning the first command that creates the reviewer's work for that Study activity through that stage and step. For a form that is the first autosave, which creates the FormSession, or the first explicit Save if that comes first. For a screening-only step it is the first draft of eligibility answers, or the decision submission itself. Reaching the same shared session later through another stage writes one more start for that route.
- Fields.
| Group | Fields |
|---|---|
| Route | stageId, stageSettingsVersionId, stepId, activity (profileId or formId), sessionId |
| Pool basis | filterVersionId, compact clause evaluation, input versions (outcome and accepted result versions), current episode reference |
| Step basis | Each dependency's result and basis (own decision revision ID, collective outcome version or sufficiency facts); exclusion-stop evaluation; progression basis in force |
| Allocation basis | Allocation regime ID and version (or "none"), batch plan ID, revision and ordinal or personal grant, assignment ID, StudyTargetOverride or additional-review request ID |
| Availability basis | Capacity cap version, places before start, claim reference, or NotEnforced (tracking off); in-progress limit version and count; the capability evaluated and the authorization audit reference |
| Decision | Admission decision digest; actor (the reviewer); effective and recorded time |
- Storage (
PROPOSAL). AReviewStartedHistoryEventwhose payload is theReviewStartEligibility. Its ID is deterministic over (session, route stage, route step) and it is inserted with$setOnInsert, so a start is written exactly once. It is written outside the Study transaction when the start is an autosave (autosave never writes Study). - Completion basis (
PROPOSAL). Each explicit session version and decision revision gainsadmissionBasis, which lists every basis that applied:InPool,ContinuationAfterExclusion {outcomeVersion, settingVersion}andContinuationAfterDeparture {departureEventId, settingVersion}. When both continuation triggers applied, both entries are present. The RD spec owns the version records; this page adds the field. It gives the admin the explicit explanation the owner asked for when started work was completed after departure. - Reconciliation starts keep the existing
ReconciliationStartedrecord with its readiness basis (RS spec) and appear in the same timeline through the envelope adapter. Adjudication claims (RS §4.11) appear the same way. - What it is not. It is not an offer log. Opening a Study and leaving without editing records no start.
3.9 Finishing started work after exclusion or pool departure¶
Two triggers can end new work on a Study while a reviewer has work in progress.
| Trigger | Default | Restriction | Source |
|---|---|---|---|
| A screening exclusion inside the stage stops progression (exclusion-stop) | Saved work may be completed | PreserveOnly on the step (stage default with step override) keeps drafts and refuses completion |
Q-28; EW1 (owner) |
| Any filter-driven departure from the stage pool | Started work may continue and be completed | An authorised admin can configure a restriction that prevents continuation and completion | Owner amendment (4 October) |
Rules for both:
- "Started" means a
ReviewStartedexists for that session and route before the trigger, so a draft counts (PROPOSAL). Opening without editing does not count. - Continuation never restores pool membership and never admits new reviews. Permissions and capacity still apply. A reviewer whose place lapsed on timeout must re-acquire one when the cap is on (D2-07; Q-28).
- Drafts are preserved in every case.
- Continuation work is shown in Saved work with its reason, rendered under blinding.
- When both triggers apply, completion is allowed only if every applicable setting allows it
(
PROPOSAL). - Before an admin changes either setting, SyRF shows which active reviewers are affected. Affected reviewers are told afterwards. The change, its actor and its time are recorded in the settings version.
Placement of the departure setting. The owner said the exact placement is not yet specified and must not be inferred silently. Options and a recommendation are in §12.4 (SP-AMB-01).
3.10 Stage lifecycle: automatic and static completion¶
- Modes. Automatic or manual (static), in the lifecycle part (RX2, LC1).
- Automatic readiness. No current pool member has remaining work for anyone (§3.4), and no
adjudication work is open in the stage's adjudication steps (RS-R59). No unresolved drafts,
outstanding corrections or pending change requests remain (LC1). Permitted continuation drafts
count as unresolved work while continuation is allowed (
PROPOSAL). Pool membership alone never counts as remaining work (Q-02). - Recalculation. A durable intent re-evaluates readiness for the affected stages after any change that can alter remaining work: pool entries and departures, outcome and accepted-answer changes, target changes, step setting changes and continuation changes. Completion keeps the two-step protocol (Completing fence, drain, verify, Completed).
- Static completion. A manually completed stage stays Completed even when more work appears. Reopening is a separate authorised action (Q-02).
- Admin changes. Before an admin confirms a change that adds Studies with remaining work (an import, a filter edit, a target increase), SyRF shows the additional work per stage and the completion effect, and rechecks at commit (Q-02). A protected change acting on a Completed stage itself (its settings, filter, Fix or corrections) also needs that specific change approved, as LC1's change request already provides; Q-02 calls this "approve the specific protected change".
- When remaining work appears (decided, Q-02; consolidation §3). An automatic Completed stage is recalculated as soon as remaining work appears, whether the cause is a confirmed admin change or evidence recorded elsewhere. It goes back through the two-step lifecycle with no further confirmation hold, and admins of the stage are told. A manually or statically completed stage stays Completed until an explicit authorised reopening. A pool entry into a Completed stage never blocks the upstream command. This supersedes LC1's "obtain confirmation before admitting a change that would reopen a Completed stage" for automatic stages (AC-R3c-03 amendment in §13); SP-AMB-05 is closed.
- Merges. A merge changes review evidence. Stage membership changes only through ordinary reevaluation, and status changes only through these readiness rules (Q-02).
3.11 Places, capacity cap, inactivity timeout and in-progress limit¶
- Place. A reviewer's held position on a Study for one form (or profile). One shared session
holds one place across every tab, device and stage route (D2-08, Q-28). Places are held by a
draft-backed claim while the reviewer is active, and by saved-incomplete, completed and Needs
updating sessions; withdrawal frees the place (C7,
PROPOSAL). Claims follow claim contract v2, keyed by form identity, never by version. - Effective target and capacity cap. The effective target (RD spec) is the minimum evidence. The
CapacityCapis the maximum number of places. They are separate concepts (D3-17; consolidation §1).
| Setting | Owner | Values | Default | Status |
|---|---|---|---|---|
CapacityCap |
Form baseline, applied through every route | Off, EffectiveTarget, EffectiveTargetPlus(n) |
Off; when enabled, EffectiveTarget |
Separation and baseline decided (Q-28, D3-17); defaults proposed, not approved |
| Route capacity cap | Stage, per bound form | Stricter than the form baseline only | None | Q-28 allows stricter stage rules (owner); shape PROPOSAL |
| Inactivity timeout | Form | Minutes | Today's idle-timeout default, value to read from code | Ownership decided (D2-07, Q-28); default not approved |
| Per-reviewer in-progress limit | Form | Count or unlimited | Unlimited | Ownership decided (D2-07, Q-28); default not approved |
- Shared count. One place count per Study and form across all routes. A route cap only refuses admission through that route.
- No eviction. Lowering or enabling a cap never removes a held place. New acquisitions are
refused until the count falls below the cap. Temporary reservations that conflict can be released
only through explicit Apply anyway (Q-24, §7). A cap never falls below a Study's effective target,
so authorised target increases and requested reviews are never blocked (
PROPOSAL, following D3-17's "respect study-specific target changes"). - In-progress.
PROPOSAL: a Study counts as in progress for a reviewer and form while they hold a place there without a completed version. A shared session counts once. LegacyMaxInProgresssemantics are verified during conversion. - Timeout. Activity on any connection keeps the shared place. An idle or closed tab never releases it while another connection is active (Q-28). When the session times out, SyRF releases the place and keeps the draft (D2-07). Completing it later re-checks capacity.
- No stage override for timeout or limit. The old rules ("the most restrictive bound stage sets the cap and the idle timeout; the stage in use sets the in-progress limit") are removed (D3-18).
- Screening. Screening capacity follows the profile's collective rule (eligibility D6). Who owns the timeout and limit for screening-only work is ambiguity SP-AMB-03.
- Dependent places (D3-19). No place is held on a dependent form while the reviewer is still
screening. The reviewer's own Include (or own Unsure, under the RS-R47
PROPOSAL) tries the dependent claim atomically in the decision transaction. If no place is free, the step shows "Enough reviewers are already working on this" and the screening decision stands. UnderCollectiveIncludeRequired, the claim is tried when the reviewer next opens the step after the collective Include (PROPOSAL). - Enforcement exists only when tracking is on. Claims and capacity guards exist only while
active reviewer tracking is effective, which is off in every deployed environment. The production
route is D3-16 (§12.1). Where tracking is off, the admin UI says "capacity not enforced", and
ReviewStartEligibilityrecordsNotEnforced (tracking off). - Storage (
PROPOSAL). Form-level settings live in the AnnotationForm's audited operational settings record (not pinned by sessions; D2-05 classification). The route cap lives in the stage settings version. Claims stay on Study. - What it is not. The cap is not the target. A timeout never deletes a draft. The in-progress limit never blocks completing work already held.
3.12 The HistoryEvent envelope¶
- What it is. The common, versioned shape for structured history records (C20, new contract).
New facts that no existing immutable record carries are stored as
HistoryEvents: pool transitions, first release and review start. Existing immutable records (session versions, decision revisions, outcome history entries, adjudication versions, accepted result versions, stage settings versions, lifecycle and change-request entries, assignments,StudyTargetOverride,ContributionExclusion,StudyMerge,StudyUnmerge, search withdrawals, external screening runs) stay where they are. Timeline and reporting projections read them through adapters into the same shape, so nothing is copied and source history never changes. - This is not an event-sourced application. Current state keeps its own authoritative records.
Fields.
| Field | Content |
|---|---|
eventId |
CSUUID, deterministic: SHA-256 over (event type, project, idempotency key) |
eventType |
Closed string set, extended only through C20: StagePoolBaselineMember, StagePoolEntered, StagePoolDeparted, WorkFirstReleased, ReviewStarted (adapters add the types of existing records; see the note below the table) |
family |
PoolTransition, WorkRelease, ReviewerEligibility, ReviewActivity, Configuration |
schemaVersion |
Integer per event type; old versions stay readable forever |
projectId, studyId |
Always present for the event types above |
lineage |
StudyMerge or StudyUnmerge reference and the related Study IDs, where identity changed |
stageId, stepId, activity |
Structured and indexed; the owner requires stage identity and event type as queryable fields |
subjectReviewerId |
Whose work or eligibility the event concerns, if any |
actor |
{kind: Member, SystemRule, AIScreeningModel, ExternalSource or Operator; id}. An AI screening model is a source identity, never a member login |
effectiveAt |
{hlc, utc}: when the causal change became current |
recordedAt |
{hlc, utc}: when this record was written |
cause |
{kind, commandId or operationId, causeRecordRefs}. Kinds: Import, ScreeningOutcomeChanged, AcceptedAnswerChanged, FilterVersionActivated, StageActivated, StudyMerged, StudyUnmerged, SearchWithdrawn, SearchReinstated, LifecycleChanged, ContributionExcluded, ProfilePublicationApplied, FormPublicationApplied, ExternalScreeningAccepted, TargetChanged, BatchOpened, PersonalGrant, AssignmentCreated, ReviewerAction, TrackingBaseline, BaselineConversion |
sourceVersions |
Filter version, stage settings version, profile and form versions, outcome versions, accepted result versions, regime, batch plan, capacity and continuation setting versions, as relevant |
before, after |
For pool events {member, episodeSeq}; for others the relevant state |
reasonCodes |
Ordered, closed set (§3.5.3 for departures; entries use ALL_CLAUSES_SATISFIED plus the cause) |
clauseEvaluation |
Tree mirroring the filter: {nodeId, kind, result (True, False or Unknown), inputs [{kind, ref, version, observedValue}], children} |
coverage |
Complete, BaselineAtTrackingStart, ReconstructedFromRetainedInputs, NotRecordedInLegacy or CurrentSnapshotOnly |
seq |
Per (Study, stage) monotonic sequence taken from the tracking marker |
explanationText |
Optional plain text. It supplements the structured fields and never replaces them |
Event types named in other specifications. RD, DM, RS, BC, TI, RI and AC name further event types
(for example FormVersionPublished, StudyMerged, AcceptedResultVersionCreated,
BaselineConverted, TrainingAttemptStarted, ContributionExcluded; all PROPOSAL names). Each is
either an adapter type over the existing immutable record that already carries the fact, or, where
no such record exists, a new HistoryEvent type added to the closed set through the C20 contract.
The C20 freeze lists which is which (PROPOSAL, added in the 5 October harmonisation).
Ordering. Events order by effectiveAt.hlc, then studyId, then stageId, then seq.
Because every filter-input change writes the Study (CR-1), stamps and sequences on one Study
increase strictly. A filter sweep that reaches a Study after a later evidence change has already
recorded the filter transition (§4.1) never inserts out of order.
Idempotency keys.
| Event | Key |
|---|---|
StagePoolEntered, StagePoolDeparted |
(Study, stage, cause command or operation ID, filter version, episode) |
StagePoolBaselineMember |
(Study, stage, tracking start ID) |
WorkFirstReleased |
(Study, stage) |
ReviewStarted |
(session, route stage, route step) |
A duplicate key on insert is success. Retries, re-executions and operation takeovers therefore never create duplicates.
Effective and recorded time. Events written in the transaction that changed the evidence have
effectiveAt equal to recordedAt. Events written by a filter sweep take the filter version's
activation stamp as effectiveAt and the item's stamp as recordedAt. Baseline events take the
tracking start. Converted legacy facts take the conversion time with coverage
NotRecordedInLegacy for anything earlier. Wall-clock values are shown to people; HLC stamps order
records.
Current reads never trust delayed history. Admission, selection, counts and readiness read authoritative current inputs or a cache proven current. History explains the past and is never a second source of current truth.
Storage (PROPOSAL). One append-only collection, pmHistoryEvent, replacing the planned
pmStudyPoolLedger. Indexes: unique _id;
{projectId, stageId, eventType, effectiveAt.hlc}; {projectId, studyId, effectiveAt.hlc};
{projectId, subjectReviewerId, eventType, effectiveAt.hlc}. The F1a storage ADR may instead split families into collections. Inserts only,
no TTL, retained while the project exists (reversible deletion retains it; permanent erasure is an
unapproved policy).
3.13 Event queries and projections¶
| Query | Returns | Counting rule |
|---|---|---|
| Entered stage pool | Distinct Studies with StagePoolEntered in the period (optionally with baseline members), each with its episodes and reasons |
One row per distinct Study, whatever the number of entries |
| Exited stage pool | Distinct Studies with StagePoolDeparted in the period, with episodes and departure reasons |
As above |
| Ever in pool during a period | Members at the period start (from the last event at or before it) plus Studies entering during it | Distinct Studies |
| Membership as of T | Members at T | Distinct Studies |
| Episodes for a Study | Every entry and departure with justification | All rows |
| Departure reasons | Distinct Studies per reason in the period | Reasons can overlap and are labelled as overlapping; never summed as a distinct total |
| Reviewed through the stage | Distinct Studies with a ReviewStarted or completed version routed through the stage, with eligibility provenance |
Separate from pool membership; evidence collected elsewhere is listed as "satisfied elsewhere" and never counted as reviewed here |
- Identity modes.
RecordedIdentitycounts the Study IDs as recorded.ConsolidatedLineageresolves Studies tombstoned by a merge to the consolidated Study current at the report point. Which mode a PRISMA box uses is a specialist decision (T-SI-05, with the DM and RI specs; SP-AMB-08). - As-of watermark for history. An as-of view at T is offered only when the C11 watermark allows
T and no filter sweep with an activation at or before T is still running or stalled (
PROPOSAL). Frozen report snapshots store their computed result and watermark and never change. - Projections. Start with indexed queries over events. A rebuildable episode projection is added only if the benchmark requires it, and it must rebuild identically from events.
- Access. Stage pool history and other reviewers' eligibility need the Monitor capability. Reviewers see their own starts and the explanations for their own availability (§6).
3.14 The admin eligibility explanation¶
- What it is. A permission-aware Study timeline that explains why a Study was available, reviewed, not reviewed or no longer available, so that apparent inconsistencies are not mistaken for platform errors (owner goal).
- Inputs. Pool events with their clause trees;
ReviewStartedrecords and completion bases; session versions, decisions, outcomes and accepted results through adapters; relevant configuration versions (filter, steps, exclusion-stop, sufficiency, continuation, capacity, allocation regime, batches, assignments, permission audit) when they explain a change in work eligibility; and a current evaluation of the admission decision. - Current reason categories (closed set, extending
AccessDenialReasonappend-only):OutsidePool,NoRemainingWork(already sufficiently reviewed, possibly through another stage),TerminatedByExclusion,AwaitingPriorStep,AwaitingCollectiveInclude,StageNotActive,StageCompleted,PublicationInProgress,NotAllocatedToReviewer,BatchNotOpen,NoPermission,AtCapacity,InProgressLimitReached,ContinuationRestrictedandSavedWorkOnly. - Honesty rules. Historical explanations use the versions in force at the time and never substitute current settings. A recorded block reason is shown as recorded. When the Study was eligible and nobody reviewed it, the timeline says "No review is recorded" and invents no cause. Historical availability for a specific reviewer is reconstructed only from retained inputs. Claims and refused page queries are not retained, so a past "no place free" cannot be shown and the gap is stated. Periods before tracking are labelled ("Pool history before 20 September 2026 is not recorded; this project was converted then").
- What it is not. It does not log page queries, and it is not a second source of current access truth.
3.15 Storage summary¶
| Concept | Stored as (PROPOSAL) |
New collection? |
|---|---|---|
| Filter version | Embedded in pmStageSettingsVersion |
No |
| Steps and stage-level settings | Embedded in pmStageSettingsVersion |
No |
| Current stage pool | Not stored | No |
| Filter inputs | Study.CanonicalSummary.filterInputs[] |
No |
| Tracking marker | Study.CanonicalSummary.stagePoolTracking[] |
No |
| Pool events, first release, review start | pmHistoryEvent (replaces pmStudyPoolLedger) |
One, replacing a planned one |
| Completion basis | admissionBasis on existing version records |
No |
| Capacity, timeout and limit | AnnotationForm operational settings record; route cap in the stage settings version | No |
| Reviewer pool, offered work, explanation | Derived on read | No |
4. What loads and writes when¶
Every interactive command follows the consistency model's commit shape: ledger check, uncached snapshot reads, refusals before any write, pure derivation, one bulk write per collection and one transaction (consistency model §4.1). The tables below add what this specification needs.
4.1 An admin publishes a filter change¶
| Step | Reads | Writes | Notes |
|---|---|---|---|
| Preview | Current settings version, the draft filter, compiled old and new predicates over Study summaries, lifecycle status, started work on departing Studies, capacity settings | Nothing | Shows Studies entering and departing with reasons, started work affected (counts; names only for Monitor holders), and the completion effect on automatic and manual stages |
| Prepare | Questions the new version reads that no current filter reads | filterInputs[] entries on Studies with an accepted answer to them (version-guarded Study writes in an operation) |
Activation waits until preparation completes. Accepted-answer commands read the running preparation operation and also write entries for the questions it is preparing |
| Commit | Stage head, fence state, preview digest | Fence, drain, digest recheck; then one transaction: insert the settings version with its embedded filter version, CAS the pointer, write the sweep operation record (durable intent), release | If the digest changed, release and ask the admin to confirm again. The commit stamp is the activation stamp |
| Immediately after | None | None | Selection, browsing and admission read the new filter at once |
| Sweep | Studies matching the old or the new predicate (or all current Studies), in stable studyId order |
Per Study, one short transaction: read the marker; skip if already at the new version; evaluate the new version and compare it with the marker's recorded membership (no marker entry means not a member); on a difference insert StagePoolEntered or StagePoolDeparted (effectiveAt = activation stamp, cause FilterVersionActivated, both clause trees); update the marker; Study version CAS |
Operation record with lease, generation and final pass; locked Studies are deferred |
| Derived | Readiness for the stage | Readiness intent; notices to reviewers with started work on departing Studies (when notification delivery is enabled) | Automatic and manual stages follow §3.10 |
A Study that enters only under the new version is found, because the sweep reads the new predicate as well as the old one. Evaluating against current evidence is correct for the activation time: if the Study's evidence had changed since activation, that change's own transaction would already have caught the marker up to the new version (§3.5.4), and the sweep would skip the Study.
4.2 A reviewer submits a screening decision¶
This walkthrough covers the case where the reviewer's own result makes the Study leave the pool.
| Phase | Content |
|---|---|
| Reads | Study (summary, outcomes, tracking marker, clock, claims), stage settings pointer and version (filter, steps), profile version, membership facts, the reviewer's own session, drafts |
| Refusals before writing | The consistency model's set, plus StepLocked (dependency unmet for a new start), TerminatedByExclusion (new start in a terminal scope) and ContinuationRestricted (started work after a trigger, restricted) |
| One transaction | Decision revision; profile session version with admissionBasis; ScreeningOutcome recomputed by the collective outcome policy; Study summary. If the outcome's current value changed, then for each filter whose dependency set contains the profile: first record any filter-version catch-up from the marker, then evaluate before and after, insert pool events (cause ScreeningOutcomeChanged, command ID, decision revision ID) and update the marker. Also ReviewStarted on a first start, the dependent form claim at own Include (D3-19), WorkFirstReleased for entries into an Active unbatched stage with remaining work, and the command ledger record |
| What is not done | The submission is never rejected because its own result removes the Study. Evidence is never rolled back. No other filters are evaluated |
| After commit | Claims of reviewers with no started work on the departed Study are released through the revocation outbox; notices to reviewers with started work; readiness intent; invalidation hints |
Concurrent submissions on the same Study serialise on the Study document (CR-1). A command that
loses re-executes from a fresh snapshot. If the Study has meanwhile left the pool, its work counts as
started work under the continuation rules: accepted with basis ContinuationAfterDeparture, or
refused with ContinuationRestricted and the draft kept.
4.3 Accepted answers change¶
| Phase | Content |
|---|---|
| Writers | Gold publication (HumanReconciled), target-one automatic acceptance (SingleAnnotator), adjudication of profile-owned screening annotations (Adjudicated), merge resolution (MergeResolved), explicit reconsideration after a correction or contribution exclusion |
| One transaction | The accepted result version and pointer; Study summary including filterInputs[] for referenced questions; pool events for filters whose dependency set contains a changed question; marker update |
| Pre-commit warning | A reconciler who can see the evidence is told which stages the Study would leave or enter and how many reviewers have started work there (counts only, D3-20) |
4.4 Imports, withdrawal, lifecycle, merge, unmerge and publication treatments¶
| Cause | Writer | Pool effect | Events |
|---|---|---|---|
| Import of new Studies | Import job (batches) | New Studies evaluated against every current filter | StagePoolEntered (cause Import, effectiveAt = Study creation stamp), written in the Study creation write or by a durable intent per batch |
| Search withdrawal or reinstatement | Withdrawal command | Base predicate changes for Studies with no other current search | Departure HIDDEN_BY_SEARCH_WITHDRAWAL, or re-entry |
| Lifecycle change | Lifecycle policy | Base predicate | Departure LIFECYCLE_NOT_ACTIVE, or re-entry |
| Merge | StudyMerge operation (DM spec) |
Tombstoned originals stop being current; the consolidated Study is evaluated | Departures STUDY_NOT_CURRENT_MERGED with lineage; entries for the consolidated Study with cause StudyMerged where it matches |
| Unmerge | StudyUnmerge operation |
The consolidated Study is tombstoned; restored originals are evaluated | Departure STUDY_NOT_CURRENT_UNMERGED; entries for restored originals with cause StudyUnmerged |
| Contribution exclusion (O1) | ACD spec command | Candidate facets are recomputed; adjudicated final facets and accepted results stay current, flagged, and change only through explicit reconsideration (RS-R58; ACD §3.2) | As §4.2 when an outcome changes |
| Profile or form publication treatment | Publication phase 2 items | Outcomes or accepted values change under the recorded treatment, including results suspended below a raised target, which filters read as absent (RS-R10) | Pool events per study item, cause ProfilePublicationApplied or FormPublicationApplied |
| AI or external screening decisions accepted (E3) | Import acceptance command | Outcomes change under the declared profile source policy | As §4.2, with the actor kind AIScreeningModel or ExternalSource and the importer recorded separately |
| Project deletion and restoration | ACD spec | None per Study; review is blocked while the project is deleted | None per Study. Restoration rechecks availability and capacity |
4.5 A reviewer asks for the next Study, opens one or browses¶
| Phase | Content |
|---|---|
| Reads | Compiled pool predicate, the reviewer's membership facts, step settings, batch and allocation records, capacity and limit settings, permissions |
| Next | Random choice from the reviewer pool (D4-19); with tracking on, a claim acquisition in one conditional Study update (AtCapacity, EnoughReviewers or StepLocked if refused); no study left means "No more studies available" |
| Browse | The same predicate and admission per row, without claims; a payload containing no other reviewers' candidate data |
| Direct open | The same admission for one Study; a typed reason if refused |
| Writes | A claim only. No history event: page queries and offers are not logged |
4.6 A reviewer starts work, and an own Include reserves the next step¶
| Phase | Content |
|---|---|
| First autosave on a form | The FormSession is upserted by its deterministic ID with $setOnInsert and the draft is written (no Study write). Admission is evaluated in the snapshot, and ReviewStarted is inserted with its eligibility payload |
| Own Include on a screening step with a dependent form | Inside the decision transaction (§4.2), an atomic conditional claim for the dependent form is attempted. If refused, the decision commits, the dependent step shows "Enough reviewers are already working on this", and the refusal reason is returned (D3-19) |
Under CollectiveIncludeRequired |
No dependent claim at own Include. The dependent step shows "Waiting for the team's screening result" |
4.7 A reviewer saves or completes, inside the pool or by continuation¶
| Situation | Admission at commit | Writes |
|---|---|---|
| Study in the pool, step available | Normal admission | Session version with admissionBasis = InPool |
| Study in the pool, exclusion-stop applies, work started before the exclusion | Saved-work setting | ContinuationAfterExclusion if allowed; otherwise ContinuationRestricted with the draft kept |
| Study left the pool, work started before the departure | Departure continuation setting, permissions, capacity | ContinuationAfterDeparture with the departure event ID; or ContinuationRestricted |
| Study left the pool, no start recorded | Refused: no new reviews outside the pool | Nothing; the draft (if any) is kept |
4.8 An admin changes a continuation, capacity, timeout or limit setting¶
| Phase | Content |
|---|---|
| Preview | Affected active reviewers and sessions: continuation work that would be refused; places above a new cap; temporary reservations that conflict; sessions that a shorter timeout would release; reviewers over a lower limit (counts, with names for Monitor holders) |
| Choice | Cancel, or Apply anyway where temporary reservations conflict (Q-24) |
| Commit | Recheck the impact against current state; in one transaction write the new settings version and release only the affected temporary reservations (revocation intents); drafts and completed work are kept |
| After | Affected reviewers are told; the settings version records actor, time and whether Apply anyway was used |
4.9 A shared place times out¶
The PM timer reads draft activity and every connection for the session in one snapshot. If no connection is active beyond the form's timeout, it releases the claim (a Study claim-set update) and keeps the draft. No history event is written. A later Complete records its own admission basis, including any re-acquired place.
4.10 An admin opens the eligibility explanation¶
It reads the Study's events, the adapters over existing records, configuration versions that explain eligibility changes, coverage metadata and a current admission evaluation. That evaluation is pool-level, or per reviewer once X-AUTH-RESOLVER exists. It renders an ordered timeline with plain sentences generated from structured fields and a details view of each clause tree. It writes nothing.
4.11 Stage completion and reopening¶
A readiness intent per affected stage runs the two-step completion for automatic stages, and runs the reopening of an automatic Completed stage as soon as remaining work appears (§3.10; Q-02). A manual Reopen is an authorised command that writes status history.
4.12 Reporting and audit queries¶
Queries run against pmHistoryEvent indexes and adapters, at a watermark (§3.13). Frozen snapshots
store their results. Nothing on the interactive path reads them.
5. Rules¶
5.1 Filter and pool¶
- SP-R01 The stage study filter alone defines the stage pool. No separately configured incoming dependency gate into a stage exists. Owner decision Q-15 (consolidation §3, item 1; stage filters §1).
- SP-R02 Filter clauses read current screening-profile outcomes and current accepted answers to specified annotation questions, combined with nested AND/OR groups. Owner decision Q-15.
- SP-R03 No filter clause depends on the reviewer asking, on another stage's pool, on remaining
work, on capacity or on allocation. The reviewer-dependent part is the owner's boundary (stage
filters, Q-15 section); the other exclusions are
PROPOSAL. - SP-R04 Every filter includes the implicit base predicate: the Study is current, its lifecycle
status is Active and search withdrawal does not hide it.
PROPOSAL, following the existing rule that only Active Studies appear in stage pools and Q-33/D3-12. - SP-R05 Evaluation is three-valued and fails closed on Unknown, and explanations show the
Unknown clause.
PROPOSAL. - SP-R06 Filter versions are immutable. A filter change publishes a new filter version inside a
new stage settings version under the
settingsChangefence, and its activation stamp is its effective time.PROPOSAL, consistent with PV2. - SP-R07 Pool membership means neither that review is needed nor that it occurred. Owner decision (consolidation §3, item 3).
- SP-R08 Current pools are calculated at query time from authoritative current inputs, or from a cache proven current for its input vector, and never from history. Owner amendment: targeted pool history.
- SP-R09 Filters and step eligibility read project-wide evidence. Stages that use one profile share its outcome (DP4). Owner decision (stage filters, "pool membership versus actual review").
- SP-R10 The designer explains the feedback effect whenever a clause reads an activity bound in
the same stage. Owner requirement (stage filters, "results produced through a stage"); wording
PROPOSAL. - SP-R11 A filter failure is not a screening exclusion. Every departure carries its actual reason. Owner requirement (historical pool coverage).
- SP-R12 Leaving a pool never erases, invalidates or rolls back the evidence that caused the departure. Owner decision (consolidation §3).
5.2 Steps and progression¶
- SP-R13 A step contains screening, annotation or both. Dependencies are configured explicitly, and display order creates none. Owner decision Q-15 (stage filters §2).
- SP-R14 Dependencies exist only between steps inside a stage. Owner decision Q-15.
- SP-R15 By default a reviewer progresses after their own Include while the collective result is pending. Owner decision Q-01.
- SP-R16 A stage setting can require collective Include before progression. It is off by default. Owner decision Q-01.
- SP-R17 A step may tighten progression to collective Include, and can never loosen it.
PROPOSAL(Q-01's original recommendation, retained with pilot validation). - SP-R18 Pending never ignores an eventual Exclude. When a collective Exclude arrives, the configured exclusion-stop applies. Owner decision Q-01 and consolidation §3.
- SP-R19 Exclusion-stop is a separate step setting with an explicit personal basis, collective basis and scope. Owner decision Q-15 (stage filters §3).
- SP-R20 Exclusion-stop defaults: personal on, collective terminal on, scope
DependentSteps.PROPOSAL(from the confirmed within-stage table in C6 and Q-01; the owner requires stated defaults). - SP-R21 Independent steps stay independent unless a dependency is configured. Termination never silently blocks activities outside its scope. Owner decision Q-24 and stage filters ("termination scope").
- SP-R22 Collective satisfaction admits a reviewer without a decision and records no vote. Confirmed within-stage table (C6); stage filters ("do not fabricate").
- SP-R23 An annotation prerequisite is satisfied by the reviewer's own completed session or by
the activity already being sufficient.
PROPOSAL. - SP-R24 New combined steps stop offering extra screening once the profile's sufficiency rule is met. A designer can choose Allow, and annotation follows its own target and dependencies. Owner decision Q-24.
- SP-R25 No step dependency conditions on accepted answer values in MVP. Deferred, D4-15.
- SP-R26 When access or activity settings change, newly disallowed actions are refused while drafts and saved work are kept, subject to continuation rules and current permissions. Owner decision Q-24.
5.3 Sufficiency and terminal exclusion¶
- SP-R27 Already-sufficient forms and profiles need no duplicate work in any stage. Binding them into a new stage creates no new evidence target. Owner decision (stage filters, "already sufficient evidence"; consolidation §3).
- SP-R28 A Study with no remaining work stays in the pool and is not offered. SyRF fabricates no stage-local review, vote or submission. Owner decision (stage filters).
- SP-R29 A terminal collective exclusion applies before any offer in its scope, even if nobody reviewed the Study through this stage, and the Study stays in the pool. Owner decision (consolidation §3; stage filters, "existing collective exclusion").
- SP-R30 Explanations and counts distinguish no remaining work, terminal exclusion and temporarily unavailable work. Owner decision (stage filters).
- SP-R31 Effective targets and publication treatment still apply. An authorised target or requirement change can create new work later. Owner decision (stage filters).
5.4 Finishing started work¶
- SP-R32 Saved work may be completed after a screening exclusion by default. A step setting can prevent it while keeping drafts. Owner decision Q-28; EW1.
- SP-R33 Already-started work may continue after any filter-driven departure by default. An authorised admin can configure a restriction that prevents continuation and completion. Owner amendment: finishing after pool departure.
- SP-R34 Continuation never restores membership of either current pool and never admits new reviews. Permissions and capacity still apply. Owner amendment.
- SP-R35 Continuation work is shown separately as saved work. Owner definition of the reviewer study pool.
- SP-R36 "Started" means a
ReviewStartedrecorded before the trigger.PROPOSAL. - SP-R37 When both triggers apply, completion needs every applicable setting to allow it.
PROPOSAL. - SP-R38 A change to either setting first shows its effect on active reviewers, then notifies them, and records actor and time. Owner amendment.
5.5 Pool history and structured events¶
- SP-R39 SyRF records initial tracking membership, every entry, departure and re-entry, with causes and exact filter and evidence versions. Owner decision (consolidation §3, structured justification).
- SP-R40 When a current outcome or accepted answer changes, SyRF reevaluates only the filters whose dependency set contains the changed profile or question, and it evaluates the whole filter. Owner amendment: targeted pool history.
- SP-R41 Ordinary draft saves and page queries trigger no reevaluation and no history. Owner amendment.
- SP-R42 A filter change evaluates the potentially affected Studies under both the old and the new version, and never omits entering Studies. Owner amendment.
- SP-R43 Every other filter input triggers its dependent filters: import, merge, unmerge, withdrawal, lifecycle, contribution exclusion, publication treatments and accepted external or AI screening decisions. Owner amendment ("changes to any other inputs").
- SP-R44 Each entry records its effective time, filter version, satisfied clause and group evaluation, input versions, causal change and actor. Owner amendment: explicit entry justification.
- SP-R45 Departures distinguish a screening Exclude from other clause failures, filter reconfiguration, withdrawal, merge, unmerge and lifecycle changes. Owner requirement.
- SP-R46 Effective time is when the causal change became current, and recorded time is kept separately. Owner amendment.
- SP-R47 Processing is ordered and idempotent: deterministic IDs, a per-(Study, stage)
sequence and marker catch-up. Owner requirement; mechanism
PROPOSAL. - SP-R48 Events are immutable, keep their original schema versions and are queried through projections that never change source history. Owner requirement (structured events).
- SP-R49 Admission, selection, counts and readiness never read history or the tracking marker. Owner amendment.
- SP-R50 Baseline events never invent an earlier entry time or cause, and coverage limits are disclosed. Owner amendment.
- SP-R51 A Study tombstoned by a merge departs. Current Studies are reevaluated, lineage is kept, and a merge changes evidence without directly changing membership or status. Owner decisions (consolidation §3; historical coverage).
- SP-R52 Access control and blinding apply to event queries and to displayed provenance. Owner requirement.
5.6 Reviewer pool, serving and browsing¶
- SP-R53 The reviewer study pool is the stage-specific subset of the current stage pool allocated or assigned to the reviewer and currently available. Owner definition.
- SP-R54 A Study leaving the stage pool leaves the reviewer pool. The reviewer pool is re-evaluated dynamically. Assignment records, review starts and the recorded causes of availability changes are kept with stage and reviewer context. Owner clarification; the granularity of availability history is SP-AMB-13.
- SP-R55 Random serving is the default, and explicit assignment is an audited exception. Owner decision D4-19 through O4.
- SP-R56 Browsing is optional and explicitly enabled. Owner addition; the stage-level, off by
default placement is
PROPOSAL. - SP-R57 Browsing grants no rights beyond the reviewer's scope, and starting re-checks current eligibility. Owner addition and clarification.
- SP-R58 Browsing hides other reviewers' candidate decisions, answers and identity-revealing metadata. Reconciled results appear only under their visibility rules. Owner clarification.
- SP-R59 Removal from the browse list never silently revokes permitted continuation, and the reason is shown. Owner clarification.
5.7 Release, allocation and batches¶
- SP-R60
WorkFirstReleased,StagePoolEntered,ReviewStartedand completion are distinct events. D3-13 treatment (brief item); owner requirement. - SP-R61 First release to anyone is recorded once per Study and stage, with shared openings and personal grants recorded separately. D3-13e recommendation (brief item).
- SP-R62 Proportional allocation stays refused on canonical stages until AL1. D3-13a recommendation (brief item).
- SP-R63 Additional-review requests raise the effective Study and form target, may name people or groups, and count reviewers once across routes. No invisible bypass exists. Owner decision (consolidation §1; D3-13 context update).
- SP-R64 Sufficiently excluded Studies stay in a batch's denominator and count as finished, and restored scope returns to its original membership. D3-13b (brief item; the ledger record is still pending).
- SP-R65 "Who is offered what" shows pool-level counts by refusal reason until X-AUTH-RESOLVER exists. D3-13d (brief item).
5.8 Places, capacity, timeout and limits¶
- SP-R66 The capacity cap is separate from the effective target, and the target stays a minimum. Owner decision (consolidation §1); D3-17.
- SP-R67 The form owns the capacity baseline, applied through every route. A stage may be stricter, and one shared count applies. Owner decision Q-28.
- SP-R68 The cap is off by default, and an enabled cap defaults to the effective target. Proposed, not approved (D3-17).
- SP-R69 No cap evicts existing work, and caps respect authorised Study-specific target changes and requested reviews. D3-17 (brief item); owner decision on targets.
- SP-R70 The form owns the inactivity timeout and the per-reviewer in-progress limit across all stages and tabs, with no stage override. Owner decisions Q-28 and D2-07; D3-18 alignment.
- SP-R71 One shared session and place covers all tabs, routes and devices. An idle tab never releases the place while another connection is active, and timeout releases the place but keeps the draft. Owner decisions Q-28, D2-07 and D2-08.
- SP-R72 The dependent annotation place is reserved at personal Include (and at personal Unsure
under the RS-R47
PROPOSAL), never while screening is underway, and a refusal keeps the screening decision. D3-19 (brief item). - SP-R73 Reviewers see active counts and their own place. Names require the Monitor capability, and nothing defeats reconciliation identity blinding. D3-20 (brief item).
- SP-R74 Apply anyway releases affected temporary reservations only, atomically with the setting, and never bypasses authorisation, allocation constraints or invalid configuration. Owner decision Q-24.
- SP-R75 Capacity protection reaches production through admitted pilot projects first and is never silently enabled fleet-wide. D3-16 recommendation (brief item).
5.9 Stage lifecycle¶
- SP-R76 Automatic completion follows remaining-work rules, and pool membership alone is never remaining work. An automatic Completed stage is recalculated as soon as remaining work appears, with no further confirmation hold. Owner decision Q-02; consolidation §3 (supersedes LC1's hold for automatic stages).
- SP-R77 A manually or statically completed stage stays Completed until an explicit authorised reopening. Owner decision Q-02.
- SP-R78 Admin changes that add work show the additional work and completion effect before confirmation, and are rechecked at commit. Owner decision Q-02.
- SP-R79 A merge changes review evidence and never directly changes stage membership or status. Owner decision (consolidation §3; Q-02 context).
- SP-R80 A pool entry into a Completed stage never blocks the upstream command.
PROPOSAL, consistent with Q-02 (§3.10).
5.10 Explanation and reporting¶
- SP-R81 The admin eligibility explanation combines pool events, review starts and submissions with their routes, the relevant configuration changes, current reason categories and explicit continuation explanations. Owner goal.
- SP-R82 Historical explanations use the versions in force at the time. Owner goal.
- SP-R83 "No review is recorded" is shown when the Study was eligible and unreviewed, and no cause is invented. Owner goal.
- SP-R84 Coverage gaps are shown honestly, and pre-tracking history is never fabricated. Owner goal and historical coverage requirement.
- SP-R85 Queries return the distinct Studies that entered or exited a stage pool, with optional periods and access to every episode and reason, and re-entry never double counts. Owner requirement (required event queries).
- SP-R86 Actual review through the stage is measured separately from pool history, and evidence collected elsewhere is never counted as reviewed there. Owner clarification (reporting priority).
- SP-R87 Frozen report snapshots never change, and as-of views are reproducible at a watermark. Owner requirement.
5.11 Legacy mapping¶
- SP-R88 Legacy stages have no steps. The opt-in wizard maps their actual behaviour to steps and invents no historical step settings. Owner decision Q-24.
- SP-R89 The wizard preserves and maps the actual excluded-work policy, stage mode and Allow or Stop value explicitly, and explains behaviour changes for authorised confirmation. Owner decision Q-24.
- SP-R90 Conversion starts pool history with labelled baseline events, and earlier history is marked as not recorded in legacy. Owner direction R4 (BC spec); owner amendment on baselines.
5.12 Step kinds (added in the 5 October harmonisation)¶
- SP-R91 Besides review steps (screening, annotation or both), a stage may hold a system-defined
adjudication step beside each screening step (RS-R59) and training steps (TI §3.1). Neither kind
creates an evidence target or a stage-entry dependency. A live step depends on a training step
only if TI-R23's optional dependency is adopted. Owner: tie amendment ("a separate explicit
adjudication step ... part of the configured workflow"); S4 expansion ("a dedicated training
step"); placement and mechanics
PROPOSAL. - SP-R92 An adjudication step offers its profile's open
AdjudicationTasks, only to eligible adjudicators, including tasks whose Study left the stage pool because of the outcome being adjudicated. Designers add no dependency edge to or from it; downstream steps depend on the screening step and read its outcome. It has no exclusion-stop setting; the screening step's collective exclusion-stop applies once the adjudicated outcome is a definite Exclude. Open adjudication work is remaining work for automatic completion.PROPOSAL(the tie amendment asks the brief to map adjudication into the step model; RS-R57, RS-R59).
6. Authorisation, blinding and provenance¶
- Who configures. Editing a filter, steps, exclusion-stop, progression basis and browsing needs the Design stage capability. Restricting continuation, completing and reopening stages need Manage stage. Changing form capacity, timeout and limit settings needs the form's design or publish authority. The exact capability IDs come from the C10 catalogue (Q-03); this page names no new role.
- Who sees history. Stage pool history, other reviewers' starts and per-reviewer explanations need the Monitor capability. Reviewers see their own starts, saved work and the reasons for their own availability. Monitor holders may see personal votes (OD5); reviewer-facing messages never reveal them.
- Clause inputs. Pool events cite collective outcomes and accepted results, never one reviewer's candidate decision. When shown to reviewers, they follow the configured visibility of reconciled screening decisions and the form baseline with step hide-only narrowing (RS spec).
- Reconciliation identity blinding (form- or profile-owned, RS spec) applies to timelines,
presence, browse rows and notices.
PROPOSAL: the Monitor capability never reveals candidate identities for a Study whose blinded reconciliation the viewer holds or is assigned (SP-AMB-07). - Predictive warnings to reviewers. A candidate reviewer is never told in advance that their
decision will complete an outcome or move the Study out of a pool when that would reveal other
candidates' decisions. The designer's static explanation covers that case. Admins and reconcilers,
who can already see the inputs, get full previews (
PROPOSAL). - Presence (D3-20). Presence payloads carry counts and the recipient's own place. Names go only to Monitor holders, and never across reconciliation blinding (AC-T-08).
- Actor provenance. Every event names its actor kind. An AI-model-generated screening decision names the AI screening model as its source, separately from the importing user (E3). System rules name the rule and its version.
- Exports. History events are a versioned dataset exportable under the audit and export permission with the manifest rules of C11 (RI spec for reporting use).
7. Active-work impacts¶
| Action | Warned before commit | Rechecked at commit | Told afterwards | Apply anyway |
|---|---|---|---|---|
| Filter edit | Entering and departing Studies with reasons; started work on departing Studies; completion effects | Preview digest under the fence | Reviewers with started work on departing Studies; admins of affected stages | Not needed: temporary reservations on departing Studies are released as part of the change |
| Progression basis or exclusion-stop change | Reviewers whose dependent steps would lock; started work becomes saved work under the continuation settings | Digest under the fence | Affected reviewers | Releases temporary reservations on newly locked steps only |
| Continuation restriction (either trigger) | Active reviewers whose continuation would be refused; drafts are kept | Current continuation work | Those reviewers | Not applicable |
| Enabling or lowering a capacity cap | Places above the cap (kept); conflicting temporary reservations | Current claims | Reviewers whose reservations were released | Releases conflicting temporary reservations only (Q-24) |
| Shorter timeout | Sessions a shorter timeout would release at the next check (counted from the change, never retroactively) | Current activity | None until a release happens | Not applicable |
| Lower in-progress limit | Reviewers over the new limit (they keep their work; new acquisitions are refused); temporary reservations above the new limit | Current counts | Those reviewers | Optional: releases temporary reservations above the new limit only (Q-24); without it, held work stays and new acquisitions are refused |
| Accepted-answer publication | Stages the Study would leave or enter; count of reviewers with started work | Inputs and gold pointer | Reviewers with started work there | Not applicable |
| Reviewer decision | Nothing that reveals other candidates' decisions (§6) | Standard admission | Reviewers with started work, after a departure | Not applicable |
| Manual completion or reopening | Remaining work and drafts | Readiness | Stage reviewers | Not applicable |
| Merge or unmerge (DM spec) | Pool effects per stage, as part of the DM preview | Inputs | Affected reviewers | Per DM spec |
Apply anyway never bypasses permissions, allocation constraints or invalid configuration, and never deletes drafts or completed work (Q-24). General active-work previews are specified in the ACD spec; the screens are in the UX spec.
8. Failure and recovery¶
| Failure | Effect | Handling |
|---|---|---|
| Sweep operation crashes | History lags behind; current pools are correct | Lease takeover with generation fencing; idempotent items; the marker skips done Studies; as-of views refused until the sweep has applied |
| Sweep stalls at its limit | As above | stalled state; the owner is notified; current reads unaffected; as-of views for later T refused |
| Event insert retried | Possible duplicate | Deterministic ID; duplicate key treated as success |
| Study transaction aborts | No evidence and no event | Re-execution from a fresh snapshot (C18) |
| Indeterminate commit | Unknown | Command ledger returns the original result or OutcomeUnknown |
filterInputs[] stale or missing |
Clause Unknown, not a member | Vector check fails closed (StaleProjection); preparation or the sweep repairs it |
| Clock skew between hosts | Ordering risk | HLC stamps with the drift refusal (A-28) |
| Restore from backup | Events after the restore point are lost | History-discontinuity record per project; the integrity checker compares markers with events and rebuilds markers from events; current pools are recomputed |
| Marker and events disagree | Possible missed transition | Integrity checker detects it; repair records the transition with coverage ReconstructedFromRetainedInputs |
| Study left the pool between listing and click | Stale browse row | Typed reason on open; list refresh |
| Continuation restricted while a reviewer edits | Save or Complete refused | ContinuationRestricted; draft kept; the form becomes read-only with an explanation |
| Batch opening partly applied | Partial release | CAS on the plan; large openings run as operations with deterministic WorkFirstReleased IDs |
| Capacity race between routes | Over-allocation risk | Atomic claim filter on Study (AtCapacity, EnoughReviewers) |
| Legacy writer touches a canonical scope | Inconsistent history | Refused by the ownership marker (C16) |
| Episode projection corrupted (if built) | Wrong query results | Rebuild from events and verify parity |
9. User flows and examples¶
Cast. Dev is the project admin (Design stage and Manage stage). Ellen is a reconciler with the Monitor capability. Alice, Bob and Chandra are reviewers. Femi is the methodologist who prepares reports.
Project. A stroke neuroprotection review. Profiles: TA (title/abstract; two agreeing
decisions; Unsure on; extra review with a bound of one) and FT (full text; two agreeing decisions;
extra review with a bound of one; RS-R50 requires the tie policy to be explicit). Forms: Design
(effective target 2), Outcomes (target 1 with automatic acceptance), Funding (target 1) and Risk of
bias (target 2).
| Stage | Filter | Steps |
|---|---|---|
| 1 Title and abstract | Base predicate only | 1.1 TA screening |
| 2 Full text | TA in {Included} AND FT notIn {Excluded} |
2.1 FT screening with the Design form (combined); 2.2 Outcomes, depends on 2.1; 2.3 Funding, independent. Exclusion-stop on 2.1: personal on, collective on, scope DependentSteps (2.2) |
| 3 Rodent synthesis | FT in {Included} AND (Species anyOf {rat} OR Model in {MCAO}) |
3.1 Risk of bias |
9.1 Own Include and the collective-Include setting (Smith 2019)¶
- Alice opens Smith 2019 in stage 2. The step strip shows 2.1 as available (state: loading, then available). She records Include under FT and completes the Design form. Bob has not screened yet, so the FT result is pending.
- With the default
OwnIncludeSufficient, step 2.2 opens for Alice at once. Tracking is still off in this project, so no claim is made and capacity is not enforced. With tracking on, her Include would try the Outcomes claim in the same transaction (D3-19). - If Dev had set stage 2 to
CollectiveIncludeRequired, step 2.2 would show "Waiting for the team's screening result" (state: pending), and no Outcomes place would be held. - Bob later Includes. FT becomes Included. Smith 2019 enters stage 3 only if its accepted species is rat or its model is MCAO. Stage 2 membership does not change (it was already a member).
9.2 A result recorded through a stage makes its own Study leave (Okafor 2021)¶
- Okafor 2021 is in stage 2. Chandra Included it under FT on 2 October and started step 2.2. Her
ReviewStartedrecords the pool basis (filter version 3, TA outcome version 5), her own Include revision as the step basis, and "capacity not enforced (tracking off)". - On 4 October Alice Excludes. The FT result stays unresolved with one Include and one Exclude
(state:
AwaitingExtraReview, one more decision needed, hidden from candidates). - Bob Excludes. His command validates against the current state and commits his decision. The collective outcome policy sets FT to Excluded (two agreeing Excludes).
- In the same transaction SyRF looks up the filters that read FT: stages 2 and 3. Stage 2 now
fails (
FT notIn {Excluded}is False), so SyRF insertsStagePoolDepartedwith causeScreeningOutcomeChanged, Bob's command and decision revision as cause records, reasonSCREENING_OUTCOME_EXCLUDED, the clause tree and the input versions. Stage 3 was not a member, so nothing is written for it. Bob's decision is not rejected and nothing is rolled back. - Bob sees "Decision saved". Okafor 2021 leaves his reviewer pool. He is not told in advance that his decision would complete the result, because that would reveal Alice's vote.
- Chandra's Saved work list shows "Okafor 2021: no longer in the Full text stage. You can finish
your saved work." Both triggers apply: the collective exclusion-stop covers 2.2, and the Study
left the pool. The saved-work setting (
AllowCompletion) and the departure continuation setting (Allow) both allow completion, so she may finish. Her Complete on 6 October records both continuation bases, with the departure event ID (state: completed, historical). - Step 2.3 (Funding) is independent, but Okafor 2021 is out of the stage 2 pool, so no new Funding work is offered either. Only started work may continue.
- PRISMA reports Okafor 2021 as excluded at full text (PR1). Chandra's extraction is preserved as evidence and is not counted as an inclusion.
9.3 A restricted continuation (Okafor 2021, variant)¶
Dev restricts continuation after departure for stage 2. The preview says "1 reviewer has started work that would no longer be completable; their drafts are kept". Dev confirms. Chandra's form turns read-only with "An admin has restricted finishing work on Studies that left this stage. Your draft is kept." (state: unavailable). Her draft stays recoverable. If Dev later lifts the restriction, she can complete it and the version records the setting version that allowed it.
9.4 Leaving and re-entering through accepted answers (Lindqvist 2018)¶
- Lindqvist 2018 is in stage 3 because its accepted species is rat.
- Ellen reconciles a correction. The accepted species becomes zebrafish and the model is not MCAO.
Before publishing, she sees "This Study will leave Rodent synthesis; 1 reviewer has started work
there". She publishes. In the same transaction SyRF records
StagePoolDepartedwith reasonACCEPTED_ANSWER_NOT_MATCHING, closing episode 1. - A query later shows the species was rat after all. Ellen publishes a new accepted result. SyRF
records
StagePoolEntered, episode 2, with causeAcceptedAnswerChanged. - Femi's query "Studies that entered Rodent synthesis in October" returns Lindqvist 2018 once, with episodes 1 and 2 listed beneath it.
9.5 A filter edit finds newly matching Studies (stage 3)¶
- Stage 3 is automatic and Completed. Dev edits the filter from
Species anyOf {rat}toSpecies anyOf {rat, mouse}. - The preview shows 14 Studies entering and none departing. Nine of the 14 have remaining Risk of bias work. Stage 3 is automatic, so the preview says it will reopen when Dev confirms (Q-02). Dev's confirmation of this preview is the approval of the specific protected change; no second confirmation is asked before the stage reopens.
mouseuses the Species question already read by the current filter, so no preparation is needed. Dev confirms. The fence, drain and digest check pass, and filter version 2 activates at 10:02.- Selection uses version 2 at once. The sweep records 14
StagePoolEnteredevents witheffectiveAt10:02 andrecordedAtbetween 10:02 and 10:04. An as-of view for 10:03 is refused until the sweep has applied (state: pending), then becomes available. - Stage 3 reopens through the two-step lifecycle. Bob sees the new work in My work.
9.6 Evidence that is already sufficient (Tanaka 2020)¶
Dev adds stage 4 "Risk of bias review" with the filter FT in {Included}, binding the Design form
and a new Risk of bias form. Tanaka 2020 enters stage 4. Alice and Bob completed the Design form
through stage 2, which meets its target of 2, so no Design work is offered in stage 4. Risk of bias
work is offered. If Risk of bias were also already sufficient, Tanaka 2020 would stay in the stage 4
pool with nothing to do. The explanation would read "Already sufficiently reviewed (evidence
collected through Full text)". Femi's "reviewed through stage 4" query would list it as satisfied
elsewhere, never as reviewed in stage 4 (state: empty, meaning no work).
9.7 Terminal exclusion in a one-stage design (Reyes 2017)¶
Another project uses one stage "Screening and extraction": its filter is the base predicate, 1.1 is
TA screening, 1.2 is the Design form depending on 1.1 and 1.3 is an independent Funding form.
Exclusion-stop on 1.1 has collective on and scope DependentSteps. Reyes 2017 is collectively
Excluded under TA. It stays in the pool, but step 1.2 is never offered to anyone, and step 1.1's
extra screening is not offered either. Step 1.3 is still offered because it is outside the scope.
The explanation for 1.2 reads "Progression stopped by exclusion: TA team result Excluded (profile
version 2)".
9.8 Places, timeout and the dependent claim¶
This example follows §9.1 and §9.6: Smith 2019 is Included at full text, and stage 4 exists. By now the project is an admitted tracked pilot (D3-16), so places and caps are enforced. Chandra's start in §9.2 came earlier and recorded "not enforced".
- The Design form is bound in stage 2 (step 2.1) and stage 4. Garcia 2019 is Included at full text by others, so only its Design work remains. Alice has a Design draft for Garcia 2019 open through stage 2 in one tab and through stage 4 in another. She holds one place.
- Alice closes the stage 2 tab and keeps typing in the stage 4 tab. Her place stays, because the other connection is active.
- Dev enables the Outcomes form's cap at
EffectiveTarget(1). Places already held stay; the cap evicts nobody. - On Novak 2022, Alice has a saved-incomplete Outcomes session, which holds the only place. Bob records his own FT Include on Novak 2022 at step 2.1. His Include tries the Outcomes claim in the same transaction and is refused. Step 2.2 shows "Enough reviewers are already working on this", and his FT decision stands.
- Alice leaves her Garcia 2019 draft for an hour, beyond the Design form's timeout. Her place is released and her draft kept (state: Draft auto-saved). When she returns, her Complete re-checks capacity. The Design form has no cap, so it succeeds as an extra contribution if the target is already met (D2-07). With a cap and no free place, she would be told and could keep or discard the draft.
9.9 Browsing (Bob)¶
Dev enables browsing for stage 2. Bob opens Browse and sees his reviewer pool: Smith 2019 ("Draft auto-saved"), Novak 2022 ("Version checkpoint saved" for 2.1; "Enough reviewers" for 2.2) and Patel 2016 ("Not started"; 2.1 available). He sees the accepted TA result "Included" because reconciled screening results are visible in this project. He never sees Alice's or Chandra's decisions, names or times. While he browses, Okafor 2021 leaves the pool. When he clicks its stale row, SyRF says "No longer available in this stage" (state: unavailable). It does not explain why, because the FT result is not visible to candidates in this project.
9.10 The admin explanation (Okafor 2021 and Ibrahim 2015)¶
Dev asks why Chandra completed Okafor 2021 on 6 October when it is not in stage 2. The timeline reads:
- "1 Oct 09:14: entered Full text. TA team result Included (outcome version 5, decisions by 2 reviewers); FT not Excluded. Filter version 3."
- "2 Oct 11:40: Chandra started Outcomes through Full text, step 2.2. Allowed because the Study was in the pool, her own FT Include (revision 1) satisfied the dependency, and capacity was not enforced (tracking off)."
- "4 Oct 16:05: left Full text. FT team result became Excluded (Bob's decision). Clause
FT notIn {Excluded}failed." - "6 Oct 10:22: Chandra completed Outcomes. Allowed as work started before the Study left the pool (continuation setting version 1: Allow)."
For Ibrahim 2015, in another project converted on 20 September, the timeline reads "Pool history before 20 September 2026 is not recorded (converted from legacy). 20 Sep: in Full text at conversion (baseline). In pool since; no review is recorded." It suggests no reason for the absence of review.
9.11 Merging duplicates (Ahmed 2020a and Ahmed 2020b)¶
Both duplicates were in stage 2. Dev merges them (DM spec). SyRF records StagePoolDeparted for each
original with reason STUDY_NOT_CURRENT_MERGED and the StudyMerge reference. The consolidated
Study is evaluated, matches and gets StagePoolEntered with cause StudyMerged and lineage to both
originals. Stage 2's status does not change because of the merge itself. Femi's "entered stage 2"
count is 3 in RecordedIdentity mode and 1 in ConsolidatedLineage mode. Which one a PRISMA box
uses is T-SI-05's decision.
9.12 Reporting (Femi)¶
Femi runs three queries for stage 2 for October. "Entered": 412 distinct Studies (Lindqvist-style
re-entries counted once). "Exited": 37 distinct Studies, broken down by reason (31
SCREENING_OUTCOME_EXCLUDED, 4 STUDY_NOT_CURRENT_MERGED, 2 FILTER_RECONFIGURED). "Reviewed
through Full text": 298 distinct Studies, each with its start eligibility. The PRISMA mapping of these
datasets awaits T-SI-05. The report snapshot she freezes keeps its numbers whatever happens later.
9.13 A failure (sweep stalls)¶
A filter sweep on a 100,000-Study project stalls when a bulk-update lock holds 2,000 Studies past the operation's limit. Dev sees "Pool history is catching up (stalled; 2,000 Studies deferred)". Reviewers are unaffected because selection uses the new filter. As-of views after the activation are refused until the operation completes on retry (state: failure, then recovered).
10. Rollout and adoption¶
10.1 Baseline and MVP placement¶
| Capability | Release | Depends on | Flag decision (PROPOSAL) |
|---|---|---|---|
HistoryEvent envelope, idempotency, ordering and effective/recorded time |
Contract at F1a (with C18 and C19); stage-pool and eligibility event types at F3 | C18 HLC stamps; C19 | No flag: a contract |
| Shared place across tabs and routes; form-owned timeout and in-progress limit; capacity cap separate from target | R2b (claims v2, form-keyed); production enforcement through X-CLAIMS | Claim contract v2 at F1a; D3-16 route | Rides R2b's per-project enrolment; enforcement needs tracking on |
| Stage study filter with profile-outcome clauses and AND/OR groups; filter versions | R3a | F3; R2a; X-ELIG for production | Rides R3a's per-project enrolment; legacy stages unchanged |
| Steps, dependencies, own-Include default, exclusion-stop, Stop/Allow extra screening, saved work after exclusion | R3a | F3 (C6 rewrite) | As above |
| Continuation after pool departure (default Allow) and its restriction setting | R3a (default behaviour); restriction UI once SP-AMB-01 is answered | SP-AMB-01 | As above |
| Pool history (entries, departures, baseline), tracking marker, targeted reevaluation, filter-change sweep | R3a | F3; consistency-model amendments | History writes are not flagged inside canonical scopes: switching them off would create unexplainable gaps |
ReviewStartEligibility and completion basis |
R3a (optionally from R2a for pilot coverage; the rollout drafter decides) | C5 version records (RD spec) | Not flagged, as above |
WorkFirstReleased |
R3a (unbatched), R3c with X-BATCH (batched) | X-BATCH | As above |
| Required event queries and the basic admin explanation | R3a (API); the timeline screen behind a UI flag until staging acceptance | X-AUTH-RESOLVER for per-reviewer rows | UI flag stageEligibilityTimeline |
| D3-19 dependent claim at Include; D3-20 disclosure | R3a | Claims v2 | With claims |
| Collective-Include stage setting (Q-01) | R3c, after pilot validation (SP-AMB-11) | R3a | Behind R3c's designer flag |
| Automatic and static completion, reopening (Q-02, LC1) | R3c | R3a; readiness seam | Existing R3c gating |
| Reconciled-answer filter clauses | With or after R4a (accepted results must exist); the delivery timing is a separate rollout decision (owner) | R4a, filterInputs[] |
Release flag stageFilterAcceptedAnswerClauses |
| Reviewer pool browsing | After R3a as a small opt-in slice (candidate R3c; the rollout drafter places it) | R3a | Release flag reviewerPoolBrowsing plus the per-stage setting, off by default |
| As-of pool membership and reporting use | R5a (as-of), R5b (PRISMA, after T-SI-05) | C11 watermark; T-SI-05 | Existing R5 gating |
| Allocation restricting the reviewer pool | AL1 | Allocation Phase 2; X-AUTH-RESOLVER | Existing AL1 gating |
10.2 Optional and opt-in¶
Reviewer pool browsing is opt-in per stage. The collective-Include setting is optional per stage. Both default off. Neither is a beta of the engine; both are ordinary settings once shipped.
10.3 Deferred¶
- Accepted-answer branching between steps (D4-15): a later lane after R4a, with no delivery commitment until its brief is approved.
- Entity-scoped accepted-answer clauses (SP-AMB-06).
- Retained claim and refusal history for reconstructing past per-reviewer availability (§3.14).
- A stored current-membership cache, unless the F3 benchmark needs it.
10.4 Adoption and legacy stages¶
- New canonical stages start full coverage at activation (§3.5.5).
- Existing canonical stages created before pool history ships get baseline events when it ships.
- Legacy stages map through the opt-in wizard (Q-24), and later the universal baseline conversion
waves (R4 direction, BC spec). The wizard inspects actual stage behaviour: mode, implicit or
explicit filter, Allow or Stop for extra votes (a missing value maps as Allow per eligibility D1,
to be verified), excluded-work policy (D5), the hide-excluded setting,
MaxInProgress, the target, enforcement and idle timeout. It shows the step mapping and the behaviour changes, and an authorised admin confirms. A-16 (combined stages map to steps without a dependency edge) is a candidate mapping to verify per project, never an assumed rule. - Where a mapping converges several legacy stages on one shared form with different timeouts or
limits, the wizard shows the conflict and asks for an explicit choice (
PROPOSAL). - Conversion writes baseline events with coverage
BaselineAtTrackingStart, and earlier history is labelledNotRecordedInLegacy.
10.5 Pilots and dependencies¶
Production pilots need X-ELIG (R3a) and, for capacity promises, X-CLAIMS through the D3-16 route. Pilots run on admitted projects only (D1-07). Capacity is piloted on shared forms before broader opt-in (D3-16 treatment). The tester panel is unchanged (D3-08). Staging seeds add a "stage pools" seed project with the §9 cast and studies (D3-14 allows additive seeds).
11. Acceptance evidence¶
| ID | Evidence | Method | Amends |
|---|---|---|---|
| SP-AE01 | The filter evaluator gives the expected result for every row of a truth table covering nested AND/OR groups, three-valued logic, profile-outcome clauses (including unresolved sub-states) and accepted-answer clauses; the compiled query and the in-memory evaluator agree on a shared corpus | Unit, integration | New |
| SP-AE02 | Filter versions are immutable; a settings version that changes only steps keeps its filterVersionId; a Completed stage refuses a filter change outside a change request |
Integration | New |
| SP-AE03 | A clause reading an activity bound in the same stage shows the feedback notice in the designer | E2E, user test | New |
| SP-AE04 | The filter schema has no reviewer-dependent, pool-membership, remaining-work, capacity or allocation clause kinds (schema test) | Inspection, unit | New |
| SP-AE05 | A decision under profile P evaluates only filters whose dependency set contains P (instrumented evaluation count) and evaluates the whole filter | Integration | New |
| SP-AE06 | Autosave, draft saves and page queries write no pool events and evaluate no filter | Integration | New |
| SP-AE07 | Self-departure: the valid submission commits; the outcome changes; one StagePoolDeparted names the command, the decision revision, SCREENING_OUTCOME_EXCLUDED and the clause tree; the evidence is intact; no new offers follow; started work appears as saved work |
Integration, E2E | AC-R3a-05 |
| SP-AE08 | Re-entry opens episode 2; the "entered" query returns the Study once with both episodes | Integration | New |
| SP-AE09 | A filter edit's preview counts equal the events the sweep records; a Study matching only the new version is entered | Integration | New |
| SP-AE10 | At least 1,000 randomised interleavings of a filter activation and an evidence change on one Study yield the filter transition before the evidence transition in seq, with no duplicates |
Integration | New |
| SP-AE11 | Retries, re-executions and operation takeovers create no duplicate events | Integration | New |
| SP-AE12 | An architecture test proves that admission, selection, counts and readiness never read pmHistoryEvent or the tracking marker; after activation, selection uses the new filter while the sweep is still running |
Inspection, integration | New |
| SP-AE13 | Sweep events carry the activation stamp as effectiveAt and the item stamp as recordedAt; an as-of request is refused while a sweep with an earlier activation is running |
Integration | New |
| SP-AE14 | Every StagePoolEntered has a filter version, a clause tree marking satisfied nodes, input versions, a cause and, where applicable, an actor (schema validation over fixtures) |
Unit | AC-R3a-19 |
| SP-AE15 | Tracking start writes one StagePoolBaselineMember per current member with coverage BaselineAtTrackingStart and no earlier time |
Integration | New |
| SP-AE16 | Departure reasons are classified correctly for screening Exclude, other outcome change, accepted-answer change, Unknown, reconfiguration, withdrawal, merge, unmerge and lifecycle fixtures | Unit, integration | New |
| SP-AE17 | The entered, exited, ever-in-pool, as-of, episode, reason and reviewed-through-stage queries match fixture expectations, including re-entries and merges; p95 under the proposed budget (not approved) at 100,000 Studies on Bramble | Integration, benchmark | New |
| SP-AE18 | The RecordedIdentity and ConsolidatedLineage modes give the fixture counts on a merge and unmerge fixture |
Integration | New (default pending T-SI-05) |
| SP-AE19 | ReviewStartEligibility is written once per session and route at first start with every field group; with tracking off, the capacity basis reads NotEnforced (tracking off) |
Integration | New |
| SP-AE20 | A completion after departure records ContinuationAfterDeparture with the departure event ID and setting version; after an exclusion it records ContinuationAfterExclusion |
Integration | New |
| SP-AE21 | Continuation after a filter-driven departure is allowed by default; with the restriction on, Save and Complete are refused with ContinuationRestricted and the draft is kept; no new review starts outside the pool; the Study is in neither current pool |
Integration, E2E | New |
| SP-AE22 | Saved work after a screening exclusion completes by default; PreserveOnly refuses completion and keeps the draft; neither admits new work nor invents votes |
Integration, E2E | AC-R3a-35 |
| SP-AE23 | The step truth table holds: own-Include progression while the result is pending; the collective-Include setting waits; collective satisfaction admits unvoted reviewers with no vote; personal Exclude stops that reviewer; collective Exclude is terminal in scope; independent steps are unaffected; results are identical for selection, reservation, direct access and submit | Unit, integration | AC-R3a-02, AC-R3a-22 |
| SP-AE24 | New combined steps default to Stop extra screening; Allow offers extra screening; a mapped legacy value is preserved | Integration | AC-R3a-07 |
| SP-AE25 | Binding a sufficient form into a new stage offers no work and writes no stage-local record; the explanation reads NoRemainingWork; "reviewed through the stage" lists it as satisfied elsewhere |
Integration | New |
| SP-AE26 | A collectively Excluded Study with a terminal rule is never offered in scope, including extra screening at the governing step, while it stays in the pool; an independent step is still offered | Integration, E2E | AC-R3a-22 |
| SP-AE27 | The reviewer pool equals the stage pool restricted by allocation or assignment and current availability; a departing Study leaves it at once; continuation work appears only in Saved work | Integration | New |
| SP-AE28 | Browsing is off by default; when on, it lists exactly the reviewer pool; payload inspection finds no other reviewers' candidate decisions, answers, tallies, identities or times; starting re-checks admission; a stale row opens with a typed reason | Integration, E2E | New |
| SP-AE29 | Next serves randomly by default; explicit assignment is audited | Integration | AC-R3a-41 |
| SP-AE30 | WorkFirstReleased is written once per Study and stage with the right releaseKind, separately from StagePoolEntered; shared openings and personal grants are distinguished; an entry with no remaining work writes no release |
Integration | AC-R3a-10, AC-R3c-17 |
| SP-AE31 | The capacity cap is separate from the target; off by default (proposed); an enabled cap follows the effective target; enabling or lowering it never evicts; an additional-review request raises the effective target and its reviewer is admitted | Integration | AC-R2b-16, AC-R4a-38 |
| SP-AE32 | Two tabs through two stages hold one place; an idle tab does not release it while the other is active; timeout releases it and keeps the draft | Integration, E2E | AC-R2b-03 |
| SP-AE33 | The form's in-progress limit counts a shared session once across routes, with no stage override; every former per-stage setting behaves as the new placement table says when stages bound to one form differ | Integration | AC-R2b-10, AC-R3a-37 |
| SP-AE34 | An own Include tries the dependent claim atomically; a refusal shows "Enough reviewers" and the decision stands; no dependent place is held while screening is underway | Integration | AC-R3a-25 |
| SP-AE35 | Presence carries counts and the recipient's own place; names go only to Monitor holders; nothing crosses reconciliation blinding | Integration | AC-T-08 |
| SP-AE36 | A settings change that conflicts with temporary reservations shows the exact impact; Apply anyway releases only those reservations, atomically with the setting; drafts and completed work are kept | Integration | New |
| SP-AE37 | An automatic Completed stage reopens through the two-step lifecycle as soon as remaining work arrives, with no confirmation hold, whether the cause is a confirmed admin change or evidence recorded elsewhere; a manual stage stays Completed until an explicit Reopen; an admin change preview lists additional work per stage; a merge changes no stage status directly | Integration, E2E | AC-R3c-03, AC-R3c-08 |
| SP-AE38 | For the §9 fixtures, the explanation gives the expected reason categories, uses historical versions, says "No review is recorded" where eligible and unreviewed, and labels coverage gaps; in a user test with three admins, nobody reads a fixture as a platform error | Integration, user test | New |
| SP-AE39 | Stage history needs Monitor; reviewers see only their own starts and reasons; blinding holds in timelines | Integration | New |
| SP-AE40 | Each legacy stage fixture maps to steps that reproduce its behaviour; no step setting is invented; an authorised admin confirms; converging stages with different timeouts need an explicit choice | Integration, rehearsal | AC-R3a-16, AC-R6-14 |
| SP-AE41 | The generated eligibility truth table gains filter, step, exclusion-stop and continuation columns and loses the DP6/DP7 cross-stage columns; a disabled or non-Active stage blocks only its own route | Unit | AC-R3a-03 |
| SP-AE42 | Selection p95 ≤ 400 ms at 100,000 Studies with a compiled filter (existing proposal); filter-sweep throughput and explanation latency within proposed budgets (not approved) | Benchmark | AC-R3a-26 |
| SP-AE43 | If an episode projection is built, it rebuilds from events with identical results | Integration | New |
| SP-AE44 | Every filter-input writer records transitions, one test each: decision submit, correction, adjudication, gold publication, target-one automatic acceptance, import, merge, unmerge, withdrawal, lifecycle, contribution exclusion, profile publication phase 2 and external screening acceptance | Integration | New |
| SP-AE45 | "Reviewed through the stage" counts a Study once across routes and re-entries and never counts evidence collected elsewhere | Integration | New |
| SP-AE46 | The stage settings schema holds review, adjudication and training step kinds; an adjudication step accepts no designer dependency edge or exclusion-stop setting and offers exactly its profile's open adjudication tasks to eligible adjudicators (shared fixture with RS-AE33) | Unit, integration | New |
| SP-AE47 | A merge activation writes WorkFirstReleased with releaseKind = InheritedThroughMerge for each stage where an input was already released, linking the earliest input release |
Integration | New |
AC-R3a-14 and AC-R3a-21 retire (cross-stage options replaced by Q-15). AC-R3c-07 is rewritten
for the decided Q-01 stage setting. AC-R3a-15 and AC-R3a-23 move to the RS spec's form- and
profile-owned blinding. AC-R3a-40 is rewritten for form-owned settings and the continuation rules.
12. Brief items, specialist inputs and unapproved proposals¶
12.1 The seven brief entries this specification owns¶
| ID | Required treatment (consolidation §7) | This page's proposal for the brief |
|---|---|---|
| D3-09 | Align the paused eligibility programme with the step and filter model; preserved work and early reconciliation stay distinct | R3a absorbs S6b (browser consumption) and, if the programme stays paused at F3, S4-B, S4-C and S6a as far as canonical stages need them. D8 maps as follows: a disabled or non-Active stage blocks its own route only (a shared session stays reachable through another active stage); hidden excluded saved work is a display sub-setting kept separate from the saved-work and continuation settings; authorised early reconciliation with a warning stays in R4a; deletion becomes versioned withdrawal; claim release carries over. The truth table gains filter, step, exclusion-stop and continuation columns (SP-AE41) |
| D3-13 | Allocation and batch contracts, denominators and performance gates; first release, pool entry, review start and completion as distinct events | §3.7. Allocation refused on canonical stages until AL1; additional reviews raise the effective target (the original D3-13c bypass is superseded); pool-level "Who is offered what" until X-AUTH-RESOLVER; WorkFirstReleased with release kinds; batch membership over pool episodes; #3939 sliced with the performance gate (Next p95 at 100,000 Studies and 2,500 batches, proposed). The denominator for non-exclusion departures is SP-AMB-09 |
| D3-16 | Pilot shared-form capacity before broader opt-in; validate load and statistics integration | Enable tracking per admitted pilot project, never fleet-wide; API and PM switched together; orphan backstop; load and failover on Bramble (AC-T-03 to AC-T-07); FEAT-024 mode coordination. PROPOSAL: for canonical projects the tracking scope is the project's admission record. The binding-scope shape and "tracked if any bound stage is" are obsolete now that capacity is form-owned (SP-AMB-12) |
| D3-17 | Capacity versus target, explicit defaults, audited reservation effects | §3.11. Cap defaults (off; enabled = effective target) are proposed, not approved. No eviction; caps never below the effective target; Apply anyway for temporary reservations |
| D3-18 | Form-owned timeout, limit and shared connection rules; remove obsolete stage-derived rules | §3.11. Remove "most restrictive bound stage sets the cap and the idle timeout; the stage in use sets the in-progress limit; the form is tracked if any bound stage is". Default values for timeout and limit are proposed, not approved |
| D3-19 | Annotation reservation at personal Include, preserving screening if capacity is unavailable | §3.11, §4.6. Under CollectiveIncludeRequired, the claim is tried at the next open after the collective Include (PROPOSAL) |
| D3-20 | Active counts and own place for reviewers; Monitor names without defeating blinding | §6. SP-AMB-07 settles the overlap of Monitor and reconciliation blinding |
12.2 Specialist inputs¶
- T-SI-05, PRISMA box mapping. Which boxes use "actual review through the stage" with its eligibility provenance, which use pool-history datasets, how distinct identity is counted across merge lineage (SP-AMB-08), and how coverage limits are disclosed. The owner has made actual review through the stage the reporting priority and kept pool history for audit. Owner: RI spec with methodologists.
12.3 Proposed numbers (not approved)¶
| Number | Proposal | Where |
|---|---|---|
| Capacity cap default | Off; when enabled, equal to the effective target | §3.11 |
| Inactivity timeout default | Today's idle-timeout default (value to read from code) | §3.11 |
| In-progress limit default | Unlimited | §3.11 |
| Filter group depth | 4 levels | §3.3 |
| Selection latency | p95 ≤ 400 ms at 100,000 Studies (existing proposal, AC-R3a-26) | SP-AE42 |
| Pool-history query latency | p95 ≤ 1 s at 100,000 Studies and 4 stages | SP-AE17 |
| Filter-sweep throughput | 100,000 Studies in 15 minutes on Bramble | SP-AE42 |
| As-of watermark lag | 5 minutes (existing C11 proposal) plus "no running sweep" | §3.13 |
| Batch performance gate | Next p95 at 100,000 Studies and 2,500 batches (existing proposal) | §12.1 |
12.4 Ambiguities, with options and a recommendation¶
| ID | Question | Options | Recommendation |
|---|---|---|---|
| SP-AMB-01 | Where does the "started work after leaving the pool" restriction live? The owner said the placement is unspecified | (a) One stage setting. (b) A step setting beside the saved-work setting. © A stage default with a step-level restrict-only override, matching EW1's pattern | ©. Present both continuation settings together as "Finishing work already started". Needs owner or brief confirmation |
| SP-AMB-02 | Do accepted-answer clauses count SingleAnnotator results as "reconciled answers"? |
(a) Any authority. (b) Human-reconciled, adjudicated and merge-resolved only. © (a) by default with an optional per-clause restriction | © |
| SP-AMB-03 | Who owns timeout, limit and capacity for screening-only work? | (a) The profile, mirroring the form. (b) The stage. © Project-wide | (a). In a combined step each activity follows its own owner |
| SP-AMB-04 | Retired as a separate ambiguity (5 October harmonisation). Own-Unsure progression is now one PROPOSAL stated identically in §3.4 and RS-R47 |
The options are listed once, in RS §12 ("Own Unsure and progression") | See RS §12 (the single confirm item) |
| SP-AMB-05 | Closed (5 October harmonisation): decided by Q-02 and consolidation §3 | An automatic Completed stage is recalculated as soon as remaining work appears, with an impact preview before admin-initiated changes; a manually or statically completed stage stays Completed until an explicit authorised reopening; LC1 change requests remain for protected changes acting on the Completed stage itself | No owner question remains. §3.10, SP-R76, SP-R77 and SP-R80 apply; the AC-R3c-03 amendment is listed in §13 |
| SP-AMB-06 | Should accepted-answer clauses address entity-scoped answers (for example "any cohort is rat")? | (a) MVP. (b) Later, with explicit any or all quantifiers | (b) |
| SP-AMB-07 | Can a Monitor holder who is also the blinded reconciler see candidate names for that Study? | (a) Yes, Monitor wins. (b) No, blinding wins for a task the viewer holds or is assigned | (b). RS-R28, ACD-R36 and UX-R37 already state that names never cross reconciliation blinding; confirm in the brief |
| SP-AMB-08 | Default identity mode for distinct counts across merges | (a) RecordedIdentity. (b) ConsolidatedLineage. © Support both; PRISMA default set by T-SI-05 |
© |
| SP-AMB-09 | How do batch denominators treat departures other than sufficient exclusion? | (a) Count as finished. (b) Remove from the denominator. © Show as "no longer in pool", excluded from remaining work, kept in the membership record | ©; settle with the batch owner in the D3-13 brief |
| SP-AMB-10 | When is work first released in a stage without batches? | (a) At the first pool entry while the stage is Active. (b) At the first moment there is also remaining work for anyone | (b), so that already-sufficient Studies are never reported as released |
| SP-AMB-11 | Does the collective-Include stage setting ship in R3a or R3c? | (a) R3a. (b) R3c after pilot validation | (b), per Q-01's original recommendation; the setting itself is decided |
| SP-AMB-12 | Tracking scope for canonical projects (D3-16 alignment) | (a) Binding-scope setting (#3876 reshaped). (b) Project scope through the admission record | (b), because capacity is now form-owned |
| SP-AMB-13 | How granular must reviewer availability history be? The owner asked to retain assignment and availability history and reasons, and also to avoid logging every page query | (a) Derive it from recorded causes (pool events, assignments, regimes, batches, settings, permission audit); capacity at a past moment stays a stated gap. (b) As (a), plus an event whenever a Study becomes unavailable to a reviewer who holds an explicit assignment or started work. © An event for every reviewer-pool change | (a) for MVP, with (b) as the first extension if pilots show admins need it. © would log near page-query volume |
12.5 Policies not approved¶
This page relies on no unapproved policy. History events are retained while the project exists. A permanent physical erasure policy (T-POL-01) and an identity-erasure process (T-POL-02) are not approved and would need their own design for history. Automatic acceptance of multiple agreeing candidates (T-POL-03) is not assumed; accepted-answer clauses read whatever accepted result exists.
12.6 Harmonisation notes (5 October 2026)¶
- §3.10, §4.11, SP-R76, SP-R77, SP-R80, SP-AE37: stage completion and reopening treated as decided by Q-02 and consolidation §3 (automatic stages recalculated when remaining work appears; manual or static completion kept until explicit reopening). SP-AMB-05 is closed, LC1's hold for automatic stages is superseded, and the AC-R3c-03 amendment is listed in §13.
- §3.4, §3.11, SP-R72 and SP-AMB-04: own-Unsure progression (and the D3-19 dependent claim it
triggers) is one
PROPOSAL, identical to RS-R47; the confirm item moved to RS §12. - §3.4 (new "Step kinds" table), §5.12 (new SP-R91, SP-R92), SP-AE46, §3.10: the system adjudication step and the training step now fit the step model, matching RS-R57, RS-R59 and TI §3.1. Adjudication tasks stay reachable when the adjudicated outcome moved the Study out of the pool, and open adjudication keeps automatic completion open. §2 gained a row for the tie adjudication amendment's step mapping.
- §3.3: profile-outcome sub-states now use RS's
resolutionStatenames; "current outcome" now reads the adjudicated or merge-resolved final facet (RS §3.8), including a flagged one (RS-R58). - §3.7 and SP-AE47: added
releaseKind = InheritedThroughMergeso DM §3.8's merge-time first release has a kind. - §3.12: other specifications' event types are adapter types or C20 additions; the closed set is extended only through C20.
- §3.9: replaced the superseded "D2-07 middle ground" citation with D2-07 and Q-28.
- §4.3, §4.4: adjudication writers and contribution-exclusion effects aligned with RS-R58 and ACD §3.2; publication treatments include RS-R10's suspended results, which filters read as absent.
- §2: D3-17 and D3-18 labelled carry-forward alignment entries, as in the brief. §9: the example profiles state their tie policy (RS-R50) and the §9.2 state uses RS's names. SP-AMB-07 notes that RS-R28, ACD-R36 and UX-R37 agree.
- §13: added the AC-R3c-03 amendment, the C6 step kinds and the LC1 ledger annotation. §14: added the superseded LC1 hold.
- §7: a lower in-progress limit now offers the optional Apply anyway for temporary reservations above the limit (Q-24), matching ACD §7 and RD §7; without it held work stays.
13. Amendments to existing package documents¶
- contracts.md → C6. Replace "incoming cross-stage route policy (Collective Include required by default, own Include sufficient as advanced …)" with the filter version reference and the stage progression basis (Q-01). Add the exclusion-stop basis and scope, the saved-work and departure continuation settings and the route capacity cap to the review step element. Add the step kinds of §3.4 (review, system adjudication, training) with SP-R91 and SP-R92. Replace the DP6/DP7 evaluation table (with A-06 and A-18) by §3.4's dependency satisfaction table and exclusion-stop rules. In "Shared-evidence policies", move BL1 to the form or profile (RS spec), make VS1 a form baseline with step hide-only narrowing, and evaluate EW1 and departure continuation as §3.9 says. The admission decision returns reasons from §3.14's closed set. Retire conformance rows for A-06 and A-18.
- contracts.md → C7. "Capacity and target" row: form-owned baseline through every route, stage
stricter, one shared count, cap off by default (proposed), enabled default equal to the effective
target (proposed); delete the D3-18 sentence about the most restrictive bound stage. "Requested
review (RA5)" row: an additional-review request raises the effective target through
StudyTargetOverride; delete "never changes the target" and "bypass". "Progressive batches" row: membership over stage pool episodes; release recorded asWorkFirstReleased. "Tracking mode" row: note the project-scopePROPOSAL(SP-AMB-12). - contracts.md → C12. "Entering screening" uses
WorkFirstReleased; stage pool history is a separate dataset; reporting prioritises actual review through the stage (T-SI-05). - contracts.md → new C20 Structured history events. Envelope fields (§3.12), event families, closed reason and cause sets, idempotency keys, ordering, effective and recorded time, the history watermark rule, adapters over existing records, access and blinding, required queries (§3.13) and conformance tests SP-AE05 to SP-AE19 and SP-AE44. Freeze: envelope at F1a, stage-pool and eligibility types at F3.
- contracts.md → C19. Pool events are facts written in the commit transaction; the filter sweep is an operation record (class b).
- domain-model.md → §4.2. Replace the
StudyPoolLedgerrow withHistoryEvent(pmHistoryEvent), holdingWorkFirstReleased(renamed fromStudyEnteredPool) and theStagePool*events. - domain-model.md → §4.4. Stage row: remove the route policies (DP6/DP7, Q-15) and BL1; add the
filter version, progression basis, exclusion-stop, continuation settings, route cap and browsing
setting. Placement table: target enforcement → form capacity cap;
MaxInProgressand idle timeout → form; blinding → form or profile; VS1 → form baseline with step hide-only narrowing; tracking → project scope (PROPOSAL). - domain-model.md → §6.2 and §6.3.
StudyEnteredPoolbecomesWorkFirstReleasedplus theStagePool*events;SubmitScreeningDecision,AdjudicateProfileDecision,PublishGold, merge, unmerge and import write pool events and the marker;PublishStageSettingswrites the sweep operation; add theSweepStagePoolHistoryoperation; addContinuationRestrictedandTerminatedByExclusionto the typed refusal catalogue. - domain-model.md → §7.1. Add pure policies
StageFilterEvaluator,StepProgressionPolicy,ContinuationPolicyandPoolTransitionPolicy, each with fixtures. - domain-model.md → §8. Add "stage pool", "reviewer study pool", "saved work outside the pool"
and "work first released"; replace "pool availability (
StudyEnteredPool)". - domain-model.md → §10 and §12. Collection list:
pmStudyPoolLedger→pmHistoryEvent. R3a row:HistoryEventinstead ofStudyPoolLedger; Study gainsfilterInputs[]andstagePoolTracking[]. - consistency-model.md → §3.3. Add
filterInputs[]andstagePoolTracking[]to the canonical summary. - consistency-model.md → §4.2 and §4.3. Decision submit, adjudication, gold publication,
import, merge, unmerge and withdrawal rows write pool events and the marker; stage settings
publication writes the sweep operation; batch opening writes
WorkFirstReleased. - consistency-model.md → §7.6. Add the preparation step and the sweep.
- consistency-model.md → §11.2 and §11.4. Add the history watermark rule;
HistoryEventis a versioned dataset. - consistency-model.md → §12 and §13.2. Rewrite the pool-entry capture paragraph for
WorkFirstReleasedandStagePool*; the integrity checker compares markers with events. - programme-integration.md → §3.2. Update the RA5 scoped admission paragraph: additional reviews raise the effective target.
- programme-integration.md → §4.2. X-BATCH criterion 2 uses stage pool episodes; PRISMA pool
entry becomes
WorkFirstReleased. - programme-integration.md → §5.2. D8 mapping row (4) points to the saved-work and continuation settings; the truth table adds filter, step, exclusion-stop and continuation columns and drops the cross-stage columns.
- programme-integration.md → §6.2. Rewrite "Capacity versus target" and "Shared-form tracking
settings" for form ownership (D3-17, D3-18); add the project-scope tracking
PROPOSALto D3-16. - acceptance-criteria.md. Amend AC-R3a-02, 05, 07, 10, 16, 19, 22, 25, 26, 35, 37 and 41; AC-R3c-03, 08 and 17; AC-R2b-03, 10 and 16; AC-R4a-38; AC-T-08 and 09; AC-R6-14. Retire AC-R3a-14 and AC-R3a-21. Rewrite AC-R3c-07 and AC-R3a-40. Move AC-R3a-15 and 23 to the RS spec. Add SP-AE01 to SP-AE47 to the traceability file.
- acceptance-criteria.md → AC-R3c-03 (Q-02 amendment). Replace "New arrivals to a Completed stage go through the same gate; manual mode needs an explicit Reopen" with "New arrivals with remaining work recalculate an automatic Completed stage at once, with no confirmation hold; admin-initiated changes show the additional work and completion effect before commit and are rechecked at commit; a manually or statically completed stage stays Completed until an explicit authorised Reopen (Q-02; consolidation §3)". Sources: LC1 → Q-02; status confirmed.
- integrated-plan.md → §2 and §5.5. R3a row: "Collective Include
across stages by default" becomes "stage study filter; steps; own-Include default progression;
pool history". R3a MVP boundary: replace the DP6/DP7 policies with the filter and step model and
StudyPoolLedgerwithHistoryEvent. R3c: strict mode is the decided Q-01 stage setting, and the lifecycle follows Q-02. Coverage rows: stages and steps. - prisma-amendments.md → A. Rename
StudyEnteredPooltoWorkFirstReleased; add stage pool history datasets; record the reporting priority and T-SI-05. - versioning-model.md → §2 and §5.3. The stage settings version embeds the filter version; capacity, timeout and limit move to the form's operational settings.
- decision-register.md → §1.3 and §1.4. Mark the DP6/DP7 cross-stage part as replaced by Q-15; EW1 refined by Q-28 and the departure continuation amendment; LC1's flow per Q-02; BL1 moved (RS spec); update the D3b supersession row and the access-policy row; OD1 settled by Q-15 and Q-01.
- open-questions-and-assumptions.md. Retire A-06 and A-18; restate A-16 as a candidate mapping verified by the wizard; mark Q-15, Q-24, Q-01, Q-02 and Q-28 answered; list D3-17 and D3-18 as carry-forward and D3-09, D3-13, D3-16, D3-19 and D3-20 as brief items under T-SP-00.
- Owner ledger. Header note: the DP6/DP7 cross-stage routing is superseded by the stage study filter model (Q-15 replaced, 4 October). Annotate EW1 (Q-28 and continuation), BL1 (form or profile ownership) and LC1 (its confirmation hold before an automatic Completed stage reopens is superseded by Q-02; protected changes to a Completed stage still need approval).
- Access-policy proposal. Status note: "Incoming dependencies / progression between stages" and its personal/collective table are superseded by Q-15's model.
- FEAT-008 stage filtering. Feature-doc input for
its own PR: Filter Set becomes the filter version schema v3; the Selection Subset becomes the
reviewer study pool;
HideExcludedStudiesFromReviewers,MaxInProgressandSessionCountTargetas stage settings are superseded for canonical stages; the circular-reference check becomes the no-recursion rule; the annotation rule type's timing is the separate rollout decision. - ux-strategy.md. Copy deck terms: "Saved work", "No longer in this stage", "Waiting for the team's screening result", "Enough reviewers are already working on this", "Stopped by exclusion", "Already sufficiently reviewed", "No review is recorded". The timeline and browse screens are specified in the UX spec.
14. Superseded wording¶
| Old wording | New wording | Where it appears today |
|---|---|---|
| "Cross-stage default is Collective Include required, with an advanced own Include sufficient option" (DP7) | The next stage's study filter defines its pool. No cross-stage progression setting exists. Dependencies are between steps inside a stage | decision-register §1.4 (DP7); contracts C6; owner ledger DP6 and DP7; integrated-plan §2 and §5.5 (R3a); AC-R3a-05, 14 and 21 |
| "Stage → Incoming dependencies → Progression between stages" | No incoming dependency into a stage | Access-policy proposal |
| Q-15 parts (a) and (b), A-06 and A-18 | Replaced by Q-15's recorded model; neither alternative is approved | open-questions; C6 evaluation table; AC-R3a-21 |
| "The most restrictive bound stage sets the cap and the idle timeout; the stage in use sets the in-progress limit; the form is tracked if any bound stage is" (original D3-18) | The form owns the timeout and in-progress limit; the form's capacity baseline applies through every route and a stage may be stricter; one shared count | C7; domain-model §4.4 placement table and §4.11; programme-integration §6.2; AC-R2b-10 |
| "Optional capacity cap (stage or route policy)" | Form-owned baseline with stricter route caps | C7; domain-model §4.11; programme-integration §6.2; AC-R2b-16 |
| "Task blinding uses the most restrictive bound stage"; "BL1 is stage-owned" | Form-owned (profile-owned for screening reconciliation) | C6; domain-model §4.4; decision-register §1.3; AC-R3a-15 and 23 |
StudyEnteredPool in StudyPoolLedger as the pool-entry event |
WorkFirstReleased for first release; StagePoolEntered for stage pool membership; separate events |
prisma-amendments A; domain-model §4.2, §6.2, §6.3, §8 and §10; consistency-model §4.2 and §12; programme-integration §4.2; AC-R3a-05 and 10; AC-R3c-17 |
"A requestedReview claim … never changes the target"; "RA5 requested reviewer bypasses allocation buckets and the enforced target, once" (D3-13c) |
An additional-review request raises the effective Study and form target, may name people or groups and counts across routes | C7; domain-model §4.3; programme-integration §3.2; AC-R4a-38 |
| Every-ever-in-pool membership used as the PRISMA reviewed count | Actual review through the stage is the reporting priority; pool history is separate audit data | prisma-amendments A; C12 |
| "Strict within-stage collective mode is a proposal only" (Q-01 open) | Decided: a stage setting can require collective Include; off by default | decision-register DP7 row; AC-R3c-07; integrated-plan §5.5 (R3c) |
"Exact flow is PROPOSAL (Q-02)" |
Decided per Q-02 | decision-register LC1 row; AC-R3c-08 |
| "Obtain confirmation before admitting a change that would reopen a Completed stage", applied to automatic stages and new arrivals ("the same gate") | An automatic Completed stage is recalculated as soon as remaining work appears; admin-initiated changes show their impact first; protected changes to the Completed stage still need approval; manual completion stays until explicit reopening (Q-02) | Owner ledger LC1; AC-R3c-03 |
| "Circular references … are detected at save time" | Filters read preserved evidence only, so recursion cannot arise | FEAT-008 |
| The interim recommendation to omit continuous membership history | Targeted transition history with query-time current pools | Session register only; no package text found |
15. Existing work reused¶
No earlier work is reused in this specification. The QM v2 stack modelled per-stage question
sets, stage-keyed publication and a leased stage-transition job that rewrote sessions (PR-A #2572,
PR-B #2573, PR-C #2574), and its designer and #2387 selected questions per stage. Here a stage owns
no evidence, target or session (§3.2), its filter alone defines its pool (SP-R01), and a filter
change sweeps pool history without touching sessions (§4.1). Those pieces are therefore superseded.
Only PR-B's "transition in progress" refusal survives, as a concept: the typed
PublicationInProgress per form in the RD specification
and the stage settings fence. The harvest map is authoritative.
| Entries | Verdict | Target section |
|---|---|---|
| H-DOM-18 | Avoid | §3.3 stage study filter (SP-R01) |
| H-SVC-11, H-API-08 | Avoid | §4.1 filter sweep; the consistency model's operation family |
| H-SVC-13 | Avoid | §4.1 (selection reads the new filter at once; reviewers keep saving) |
| H-WEB-09, H-TREE-03 | Avoid | §3.2 (a stage binds forms; it selects no questions) |
| H-WEB-14 | Avoid | §3.11 form-owned timeout and limits |
| H-SVC-12 | Reference only | RD §3.8 publication operation; consistency model §7.6 settings fence |
What this specification requires that the earlier work lacks. A stage binds form identities and owns no evidence, target or session. Its filter alone defines its pool. Filter changes sweep pool history with structured events and never rewrite sessions. Capacity, timeout and in-progress limits are form-owned. Operations are generation-fenced, with a stable cursor and a stalled state, which PR-B's job lacked.