WORK-694
ID:WORK-694Status:done

A required content-model field that matched nothing is reported

SPEC-186 D4: a required field, group or member that took no node is reported content-missing, and a child a required field skips is no longer dropped.

Priority:mediumComplexity:moderateMilestone:v0.47.0Source:SPEC-186
claude/milestone-v0-44-0-ism7ni View source

Criteria completion

Criteria completion: 4 of 4 (100%) checked; history from Nov 1 to Nov 30%25%50%75%100%Nov 1Nov 3
Branches 1
claude/milestone-v0-44-0-ism7ni current done
main done
History 3
  1. 3ee40bf
    Content editedby bjornolofandersson
  2. c443273
    • ☑ A required field, group or member that took no node is reported `content-missing`, naming the field and the rune
    • ☑ A child skipped by a required field stays for the next field, and is reported `content-unmatched` only if nothing takes it
    • ☑ A sweep of `site/content`, the SEO fixtures and the composed fixtures lists every `content-missing`, and each is fixed or its field made optional
    • ☑ `content-missing` is a warning in this release; its promotion to an error is a follow-up item
    by bjornolofandersson
  3. f315698
    Created (ready)by bjornolofandersson

Acceptance Criteria

  • A required field, group or member that took no node is reported content-missing, naming the field and the rune
  • A child skipped by a required field stays for the next field, and is reported content-unmatched only if nothing takes it
  • A sweep of site/content, the SEO fixtures and the composed fixtures lists every content-missing, and each is fixed or its field made optional
  • content-missing is a warning in this release; its promotion to an error is a follow-up item

References

  • SPEC-186: D4.

Resolution

Completed: 2026-11-03

Branch: claude/milestone-v0-44-0-ism7ni

What was done

  • packages/runes/src/lib/resolver.ts:
    • noteMissing records required fields that took no node on the sink: a skipped required field, one reached after the children ran out, a failed required group, an unreserved required position: last, and nested members, dotted;
    • findMissingFields;
    • a required non-match no longer advances past (drops) the child.
  • packages/runes/src/lib/index.ts: content-missing findings at CONTENT_MISSING_LEVEL = 'warning'.
  • packages/content/src/validate.ts: content-missing in DEFAULT_VALIDATION_IDS.
  • Tests: resolver tests updated for D4.2 plus a new ran-out case; the validate id list test.
  • Docs: content-models guide, configuration reference.
  • WORK-701 created: the promotion to an error.

Sweep

  • refrakt validate on the main, staging and plan sites; SEO fixtures (53), core rune fixtures (41), plugin fixtures and composed-storytelling fixtures, each validated with its own tags.
  • Zero content-missing. A positive control (a playlist with no title) reported one, so the harness was live. Nothing needed fixing or making optional.

Notes

  • The behaviour change: content after an unmatched node that no later field can take is now reported rather than read by a later field. That is D4.2 as specified, and the sweep found no page where it occurs.