Status: Accepted
Date: 2026-07-07
Context
The .context/ frontmatter status enum was DRAFT | ACTIVE | DONE | SUPERSEDED.
Real items that are not done but cannot be actioned — date-gated (e.g. the
tessl-eval-decommission Bucket A, gated to ~15-07-2026) or externally blocked
(e.g. the plan-review execution-location lens, blocked on an eval-harness
limitation) — had no home but ACTIVE. Filed as ACTIVE, they surfaced as top
candidates in the “what’s next” read protocol despite being un-actionable, so the
protocol repeatedly recommended work that could not be picked up.
Decision
Add DEFERRED as a fifth lifecycle status: a real item that cannot be actioned
yet because it is date-gated or externally blocked, distinct from ACTIVE
(pick-up-next) and DRAFT (not yet reviewed).
- Scope is “cannot”, not “won’t”.
DEFERREDis reserved for work that is
genuinely un-actionable right now. Merely low-priority work staysACTIVEwith
value: LOW— that axis already sorts it last within tier 1. Overloading
DEFERREDwith “deprioritised” was considered and rejected: it would duplicate
thevalueaxis and blur the “can it be done now?” line the status exists to draw. - Read protocol ranks
DEFERREDin a strict second tier. Candidates split into
tier 1 (DRAFT/ACTIVE) and tier 2 (DEFERRED); tier 1 is always exhausted
before tier 2. Within each tier the existing sort applies (valuedescending,
effortascending,themes[0]). ADEFERREDitem never outranks a tier-1 item
regardless of itsvalue. Reactivate toACTIVEwhen the blocker clears. - Optional
deferred_untilreactivation date. A date-gated item may carry a
deferred_until: YYYY-MM-DDfield (only valid withstatus: DEFERRED, enforced by
the validator; the context index carries it so the protocol can filter without
opening files). The read protocol does not list an item whosedeferred_until
is still in the future — it is hidden from the pick until that date passes, then
surfaces as reactivation-eligible. The date takes precedence over the
blocked-but-visible default: an item can be both externally blocked and date-gated,
and when it is, the date governs visibility. Externally-blocked items with no known
ripen date omitdeferred_untiland stay visible in tier 2 (below all DRAFT/ACTIVE). value,themes, andeffortremain required onDEFERRED(same as
DRAFT/ACTIVE), enforced byvalidate-context-frontmatter.sh, so a parked item
re-ranks cleanly on reactivation. OnlyDONE/SUPERSEDEDare exempt.- Excluding
DEFERREDfrom the pick entirely (listing it separately) was considered
and rejected: the intent was “lower priority than active, still in the same queue”.
Consequences
- Easier: authors can keep gated or blocked work out of the pick, so the
ACTIVE
set once again means “work you would genuinely pick up next”; parked items stay
fully graded, ready to re-rank the moment they reactivate. - Harder: one more status to reason about, and a re-grade obligation on
ACTIVE ↔ DEFERREDtransitions (added to the ways-of-working re-grade rule). - Limitation — no forcing function. Nothing detects that an
ACTIVEitem is
actually blocked and forces it toDEFERRED; the benefit depends on author
discipline. This shares the gap recorded in
known-issues-lack-enforcement-2026-07-06
and is tracked forDEFERREDspecifically in
deferred-no-forcing-function-2026-07-07.
Thedeferred_untilconvention likewise has no automated sweep yet
(deferred-no-reactivation-sweep-2026-07-07);
reactivation currently happens at read time when an agent scans tier 2. - Adoption: the change delivers nothing until the actual blocked items are
migrated. The plan-review execution-location lens (blocked on the eval harness) is
re-statused toDEFERREDin the same changeset; the tessl-eval-decommission
Bucket A (date-gated to ~15-07-2026) is re-statused with its own branch to avoid a
cross-branch status conflict. - Scope: schema + validator + author/read-protocol docs only. The Go CLI does
not gate on the status enum, so it is unaffected. The.tesslmirror is gitignored
and regenerated from source in CI.