Explicit blockers: record them as structured linked context and derive the active set #63
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
docs/technical/domain-model.mdsays: "Blockers are explicit structured user facts in linked context, never a fabricated standard STATUS named BLOCKED."#22 implements the matching half of that (a candidate is excluded when a canonical composite
itm_…id appears inFilterContext.active_blockers) and tests it, but nothing in the tree derives that set: there is no way to record "this task is blocked by X" as a structured fact, so todayactive_blockersis always empty in practice and the exclusion never fires end-to-end. PR #62 discloses this honestly; this issue closes it.What to build
POST /v1/context/life context add, or an explicitkind/field on it) so a caller can assert "item A is blocked by B" as a fact, not as free text a model would have to interpret. Store the link by canonical composite item id, with the source event recorded as usual.FilterContext.active_blockersfor the policy filter (#22) from the journal — only explicit blocker facts count. Never infer a blocker from recalled prose, from a Jev judgment, or from an unresolved externalRELATED-TOlink, and never invent the standardBLOCKEDstatus.Acceptance criteria
RELATED-TOlinks never produce a blocker.BLOCKEDstatus is introduced anywhere.Notes
itm_— a compiled repro returned true foritm_!anditm_not-an-id. Since it gated both recording and derivation, a typo'dblocked_bywould have been journaled as a structured fact and then silently suppressed a real task inlife nextuntil explicit resolution. The item routes' rule is now one sharedsrc/api/types.rs::is_well_formed_id(itm_plus ≥8 RFC 4648 base32 characters, single shared alphabet const also used bybase32_push), called by the route, the context link and derivation; malformed input → 422invalid_inputwith no journal and no outbox row, and a malformed journal row is ignored rather than trusted.blockedreason, unchanged blocker-free fingerprints, and no fabricatedBLOCKEDstatus anywhere insrc/.docs/is excluded from git in this clone (.git/info/exclude:7), so the minimalcli-api.mdaddition documenting theblocked_bymember and blocker paragraph is local-only and not part of the commit. The tracked command reference (skills/life/references/commands.md) carries the change.Blocked by
None for the recording and derivation work; the end-to-end wiring in criterion 3 depends on #24 (
life next) landing first.Related
Refs #22 (implements the matching half), #18 (linked context and supersession), #24 (consumes the set).