fix(inbox): a segment title is declared, never marked derived

A segment's title comes from the plan, so a human adjudicated it. But
structure derivation runs over the segment body, finds no title key and
no usable heading, falls back to a stem, and adds "title" to derived.
The concept then emitted a stated fact under an inferred marker, and a
consumer that distrusts derived fields would distrust exactly the thing
a human decided. An over-marked field is the same defect class as an
unmarked heuristic: the marker is only worth something if it is
accurate in both directions.

Scoped to title alone, and pinned that way by test: number stays in
derived on a segment, because nothing about segmentation makes an
inferred document number declared. Without a segment a derived title is
still marked, so only a plan makes a title declared.

The SEGMENTED_V1 golden moves, which is the intended consequence and
the only golden that may. The four existing goldens are byte-identical
to baseline 770d8d4, measured against the sha rather than inspected.

Co-Authored-By: Claude <claude-opus-5>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-01 19:29:46 +02:00
commit f65f5fc342
8 changed files with 80 additions and 8 deletions

View file

@ -22,7 +22,7 @@ from __future__ import annotations
import hashlib
import unicodedata
from collections.abc import Callable, Mapping
from dataclasses import dataclass
from dataclasses import dataclass, replace
from pathlib import Path, PurePosixPath
from .errors import IngestError, MaterializationError, SegmentationError, SourceError
@ -168,6 +168,16 @@ def render_inbox_concept(
"generated": "true",
}
if structure is not None and profile.index.facets is not None:
if segmented:
# A segment's title comes from the PLAN, so it is DECLARED by the
# adjudicator -- but derivation runs over the segment BODY, finds
# no title key and no usable heading, falls back, and marks it
# derived. The concept then emits a stated fact under an inferred
# marker, and a consumer that distrusts derived fields distrusts
# exactly the thing a human decided. Scoped to `title` alone: every
# other field here really was inferred from the body, and blunting
# the marker would be the opposite defect.
structure = replace(structure, derived=structure.derived - {"title"})
frontmatter.update(structure_frontmatter(structure, profile.index.facets.keys))
if segmented:
assert segment is not None