DR-126: A guide is a human-authored skeleton with producer-derived membership
DR-126 — A guide is a human-authored skeleton with producer-derived membership, and it stays a Platform DB table
Section titled “DR-126 — A guide is a human-authored skeleton with producer-derived membership, and it stays a Platform DB table”Context
Section titled “Context”corpus-reframe-review.html states “Guides are concepts. Product/service guides are
curated concept-clusters.” The client gap-analysis tracker’s items B.1 and B.2
specify guides at the column level and carry recorded owner decisions. The two appeared to
conflict, and guides were the S528 census’s last surviving requirement-backed consumer of
primary_domain / primary_subtopic.
S529’s lane A2 found they do not conflict at the requirement level. B.1 is a presentation requirement (audience-appropriate depth co-present and ordered) and is explicitly anti-filter — its own words are that “currently layers are metadata tags used for filtering, not for UI hierarchy”, which is the complaint, not the spec. B.2 is a vocabulary and completeness requirement. The classification columns appear only in B.2’s design section, never in its recorded decision: the census read the design as the requirement.
The genuine collision was narrower and structural: who authors a cluster’s structure?
B.2’s decision is “align naming to mind map for ALL sections + add ALL missing sections” —
a human curating a structure the corpus does not yet contain, including deliberately-empty
sections. But bundle-doctrine.md’s Path 1 derives client-business concepts from promoted
L-records. The reframe’s own phrase, “curated concept-clusters”, names the tension
without resolving it.
Measured alongside: no concepts table exists — concepts are typed markdown in the
client-owned bundle repo (DR-016) — while guide types already overlap the closed concept-type
set outright ({product, company} match; sector ≈ topic).
Decision
Section titled “Decision”A guide is a hybrid, and the seam has three layers:
| Layer | Owner | Artefact |
|---|---|---|
Cluster skeleton — which sections exist, names, order, nesting, is_required | Human, in the UI | guides + guide_sections (Platform DB) |
| Cluster membership — which promoted L-records populate each section | Producer, derived | resolved at produce time |
| Published projection | Producer output | bundle repo, never edited in place (DR-060) |
guides / guide_sections remain Platform DB tables.
Alternatives considered
Section titled “Alternatives considered”- Fully producer-derived, guides as a bundle projection only. Rejected on a structural ground: the reframe states the bundle “is a product of the second loop — it is never fed back in as pipeline input.” If guides lived only as bundle files, editing one in the UI would write to the bundle and reverse the loop. Guides must have DB tables to be editable.
- Fully human-curated, including membership. Rejected: it discards the derivation Path 1 exists to provide and makes gap-surfacing manual.
- Declare a winner between “guides are concepts” and B.1/B.2. Rejected: forcing one discards a live requirement in either direction. Both hold at different layers.
Consequences
Section titled “Consequences”- Gap-surfacing falls out for free. A required section with zero derived members is the
gap. This unifies B.2’s
is_requiredsemantics with R8’s “strongest week-1 deliverable” — they stop being two features. - Guides need a membership predicate, but nothing requires it to be
primary_domain/primary_subtopicspecifically. The census’s last anchor does not hold in the form the census stated it, though the requirement underneath it is live. lib/guide-section-mapping.tsis the only implementation of that predicate today — and of client feedback Item 2’s secondary-tag reach. It has zero production callers and 74 green tests, which makes it look exactly like a safe delete. It is not, and it was held back in S529 for that reason.- B.1’s nesting requirement currently has no substrate on the document or answer grain:
layersurvives only onreference_items. Whether to re-point it there was flagged in the S451 migration header and remains unevaluated.