The checklist item: one row, several independent facts
A checklist item is not just a label and a checkbox. It’s a small record that carries several independent pieces of information at once:- Label — the visible text of the item, such as “Peer review completed.”
- Result state — the current outcome recorded for this item: Empty (default), OK, NOK, or Pending (plus a separate, non-selectable Information row type).
- Mandatory flag — whether this item must be checked for the checklist to be considered complete.
- Description — static guidance text, typically written once by whoever authored the template, explaining what the reviewer should actually check.
- Note — free text a reviewer adds while working the item, distinct from the description.
- Template origin — whether the item was populated from a checklist template or added directly on this instance.
An item with no result set is still meaningfulAn item that has never been touched defaults to the
Empty / none state rather than to some arbitrary value. This matters when you’re reasoning about “why does this checklist show as incomplete” — an item nobody has looked at yet is indistinguishable, at the data level, from one explicitly reset.The result states
A plain checkbox collapses reality into two states: checked or not. A compliance-grade checklist needs more resolution than that, because “reviewed and accepted”, “reviewed and explicitly rejected”, and “nobody has looked at this yet” are materially different facts — and an audit needs to be able to tell them apart.Pending depends on a feature toggle
Pending corresponds to the underlying “Conditional” result state, which is only offered to users when the nextedy.checklist.conditional_enabled configuration property is set to true — it defaults to false, so a fresh installation does not show Pending as an option until an administrator enables it. See Configuration Property Hierarchy for where this toggle fits among other checklist-wide properties, and Icon, Feature-Toggle, and Baseline Properties for the full reference entry, including the companion conditional_sign icon property.i) that carries guidance text but is excluded from every count and completion calculation. Think of it as a section header or a comment embedded in the checklist rather than a thing to check — it never blocks a mandatory-item gate and never appears in progress statistics, because it isn’t a decision anyone needs to make.
For example, a checklist with two Information rows (“Section: Code Quality” and “Section: Documentation”) plus three actionable rows (one OK, one Empty, one Pending) counts only those three actionable rows toward completion — the two Information rows are excluded entirely.
Mandatory vs. “all checked”: two different gates
Two related but distinct questions get asked of a checklist, and conflating them is a frequent source of confusion when setting up workflow gates:- Is every mandatory item checked? — satisfied when all items flagged mandatory hold a checked-equivalent result (
OKorPending). - Is every item checked, mandatory or not? — a stricter requirement that only passes when nothing is left in
NOKorEmpty, regardless of the mandatory flag.
The text syntax: why raw field content matters
Because a checklist is ultimately stored as text in a custom field, that text has a syntax — and understanding it explains why hand-editing a checklist field directly, or letting some other integration write to it, can silently corrupt the checklist:- Each item is one line that starts with its result state in square brackets —
[_]Empty,[X]OK,[O]NOK,[+]Pending,[i]Information — followed by a tab and then the label. - A
!placed immediately after the closing bracket (before the tab) marks the item mandatory, e.g.[X]!⇥Label. - A leading
/marks a description line, attached to the item above it. - A leading
>marks a note line, attached to the item above it.
Where items come from: manual entry vs. templates
An item’sfromTemplate flag records whether it arrived via a checklist template or was typed directly into this specific instance. This isn’t just metadata — it’s the hook that makes template-driven updates possible. When a checklist is re-parsed against its template, matching items are updated in place by identifier rather than duplicated, which is what allows a template author to add or reword a review step centrally and have it reflected everywhere the template is referenced, without wiping out notes or results reviewers have already recorded on other, unrelated items.
Template edits reach existing itemsOn a template-driven merge, an item’s label, mandatory flag, and description are refreshed from the template while only the recorded result is preserved. So editing a template to change which items are mandatory (or to reword an item) does propagate to already-existing checklists the next time each one is parsed — you can rely on template edits to retroactively change mandatory flags and labels.