Skip to content

### Blocking needs a producer contract or a model-judged emptiness rule — regex-ising an LLM-written list field repeats the #316 round-1 error #336

Description

@kiki830621

Problem

### Blocking has no producer contract. idd-update writes it from the template - {blocker 1, or "(none)"}, the {} is model-filled, and across this repo's 55 real sections the 48 semantically-empty values use 35+ spellings (- (none), - (none — closed), - (none) — diagnosed, awaiting pickup, (無), - (none — ready for /idd-implement #107) …).

On main the emptiness of this section was read as prose by the model (idd-list Step 3.7) and judged correctly. PR #318 round 2 replaced that with a regex in idd_blocking_section — which misjudged 31 of 48 empty sections as live blockers — and at the same time promoted the signal from an idd-list display grouping to a hard abort in four skills. Round 3 of that PR stops the bleeding with a leading-token rule plus a frozen corpus-blocking.json, but the Devil's Advocate lens made the structural point: stacking character classes on an LLM-written field is the same category error round 1 made on ### Complexity, and two attempts at the regex each grew a new hole.

Source

Expected

Pick one of two shapes and record the decision in references/actionability-gate.md:

  1. Producer contract: idd-update (and every writer of ### Blocking) emits a machine-checkable token — e.g. an empty section contains no bullet at all, or exactly - (none) with annotations moved to the next line — and the reader is then allowed to be strict. Needs a migration note for the 48 existing values (or a one-time normalisation pass).
  2. Model judgement: the shared helper returns the section's raw lines; the four consumers keep a single shared extraction but the emptiness verdict is made by the executing model against a written rubric, with the raw lines surfaced.

Either way: the choice must be validated against the 55-row corpus-blocking.json shipped by #316, and the signal-3 row of §Risk posture must state which failure direction the chosen shape accepts.

Acceptance criteria

  • Decision recorded in references/actionability-gate.md with the rejected alternative and why
  • If (1): producer template updated, existing values handled, reader tightened, corpus fixture updated
  • If (2): helper exposes raw lines, rubric written, four consumers updated, corpus fixture remains the regression baseline
  • corpus-blocking.json 0 FP / 0 FN under the chosen shape

Complexity

Plan — cross-file (helper + 4 consumers + idd-update template + reference), decision-heavy between two valid shapes, no new published API.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions