Skip to content

ADR-052: Content-Authoring Taxonomy Import and Form DeliveryΒΆ

Attribute Value
Status Proposed
Date 2026-06-12
Deciders Architecture Team
Extends ADR-050, ADR-051
Related ADRs ADR-045 (Multi-part Session/Part), ADR-044 (Content-driven Lifecycle), ADR-053

1. ContextΒΆ

The legacy Track Manager owns the certification-authoring domain β€” a strict, versioned taxonomy from an abstract Track down to the scored FormItems on a specific Form. LCM's session model selects content by form-qualified name (FQN) but has never modelled the taxonomy that produces those forms. Without it, the meaning of a PartDefinition's selector ("Exam CCIE * * DES*") and its admissibility requirements is implicit, and there is nowhere to attach exam content, blueprints, or per-item scoring.

2. DecisionΒΆ

2.1 Import the taxonomy as content_package definitionsΒΆ

Model the authoring taxonomy as ResourceDefinitions with provisioning_source = content_package, ids as deterministic slugs derived from the parent chain (so re-sync is idempotent β€” a duplicate id is a conflict, not a new node):

erDiagram
    Track ||--o{ TrackItem : "canonical items"
    Track ||--o{ Exam : "versions"
    Exam ||--o| Blueprint : "active revision"
    Blueprint ||--o{ BlueprintNode : "topic tree"
    BlueprintNode ||--o{ BlueprintNode : "parent of"
    Exam ||--o{ Module : "split into"
    Module ||--o{ Formset : "groups"
    Formset ||--o{ Form : "versions"
    Form ||--o{ FormItem : "composed of"
    TrackItem ||--o| FormItem : "realized by"
    FormItem }o--o{ BlueprintNode : "tagged with"
    SessionPart }o--|| Form : "delivers (by FQN)"
  • Track / TrackItem β€” the certification line and its canonical item catalogue.
  • Exam β€” a versioned realisation (Draft β†’ Released β†’ Retired) with an optional Blueprint.
  • Blueprint / BlueprintNode β€” the weighted, self-referential topic tree.
  • Module β†’ Formset β†’ Form β†’ FormItem β€” the section β†’ form-family β†’ form β†’ scored-item path. A FormItem references its TrackItem, carries type-driven scoring, and is tagged with BlueprintNodes.

2.2 Form delivery β€” no runtime Form instanceΒΆ

A Form is authored content, not a running resource. A SessionPart (the timed instance) delivers a Form by binding its FQN; there is no separate "Form instance" in the runtime tree. A PartDefinition's requirements are admissibility filters (ported from the legacy SessionPartRequirement) constraining which Form may fill the slot: track_types, track_levels, track_acronyms, exam_versions, module_acronyms, parts_count, requires_pod.

2.3 FQN as the join keyΒΆ

The six-token FQN ({Type} {Level} {Acronym} v{version} {module} {form}) is the stable key a PartDefinition selector resolves against, and the same key LDS / SE / the environment resolver already use. The taxonomy makes that key first-class rather than an opaque string.

2.4 Seeding & syncΒΆ

Authored content is synced through the existing content-package flow (ADR-023/024); per-part automation (JobDefinition, ReportDefinition) and the part lifecycle (ADR-044) travel in the same package. The denormalised, queryable read side is preserved (each node's ancestor coordinates are projected down) so list/filter endpoints work without joins.

3. ConsequencesΒΆ

Positive β€” selectors and requirements now have a concrete referent; exam content, blueprints, and scoring have a home; idempotent slug ids make re-sync safe; one taxonomy serves authoring, selection, and grading.

Negative / trade-offs β€” a sizeable domain to port (nine node types + projections); strict slug/FQN rules must be preserved exactly to keep ids stable across services.