Phase 4

Artifact Authoring

Formalize the retained patterns into the five CDS artifacts. Order matters — each artifact depends on decisions locked in the one before it.

Authoring order

Do not skip ahead
The rules bundle references specific subcategories values that must match component_type keys in the registry. The skill file references specific filenames that must exist in the taxonomy. Writing out of order produces broken references that the integrity check (Phase 5) will catch — but fixing them after the fact is slower than getting the upstream artifacts right first.
StepArtifactDepends on
4.1content_type_taxonomy.yaml / .jsonPattern set document from Phase 3
4.2component_registry.yaml / .jsonTaxonomy (family, atom, assembly structure)
4.3procedure_terminology.yaml / .jsonRegistry (component names to define as terms)
4.4{type}_rules_bundle.jsonTaxonomy, registry, terminology (all three must be stable)
4.5{type}-pattern_SKILL.mdAll four prior artifacts

"Stable enough" means the core structural decisions are made — it does not mean every field is complete. You can leave notes and TODOs in upstream artifacts, but the fields that downstream artifacts reference must be settled.

4.1   Taxonomy entry

Write one entry in content_type_taxonomy.yaml (and its .json twin) for each retained pattern. Follow the existing Procedure and KC Article entries as format templates — every field name and nesting level must match.

Decision to make first: does this content type have subtypes (like KC Types A–F) or is it a single pattern? If subtypes: one taxonomy entry per subtype, one shared skill file that routes to all of them via a classification decision tree.

Required fields per entry

FieldWhat to write
nameFormal CDS name (e.g. "KC Article — Type A (Multi-Cause Troubleshooter)")
familyProcedural / Conceptual / Reference / Structural / Hybrid
purposeOne sentence — what this type does for the reader
customer_needOne sentence — what the reader is trying to accomplish
distinguishing_criteriaOne entry per adjacent content type: vs_X: one sentence
classification_signals3–5 observable signals, in priority order
assembly_configurationsIf the type has variants — name, description, control tag
atomThe independently navigable or reusable unit (one sentence)
skill_refExact filename of the skill file you will write in step 4.5
rules_bundle_refExact filename of the rules bundle you will write in step 4.4
examples2–3 real published examples with titles and URLs

4.2   Component registry entries

For each structural component unique to the new content type, write an entry in component_registry.yaml and its .json twin.

Check existing components first
These generic components are already in the registry and should be reused rather than duplicated: title, introduction, section_title, section_intro_paragraph, prerequisite, code_example, troubleshooting_entry, code_block, link, placeholder, service_name, bulleted_list, related_information. Content-type-specific rules for these components go in your rules bundle's subcategories scope — not in a new registry entry.

Create a new entry only for components that are structurally distinct from existing ones (different composition, different reuse class, or different boundary conditions).

Required fields per entry

FieldWhat to write
component_typesnake_case unique key. Must match the subcategories value you'll use in the rules bundle: component-level:{component_type}
scopegeneric / {type}-specific
reuse_classreusable (same content verbatim on multiple pages) / non-reusable (page-unique)
description1–3 sentences including explicit distinctions from similar components in other types
boundary_conditionsList — when is this the right component vs. an adjacent one?
rules_refsubcategories=component-level:{component_type} — must resolve to ≥1 rule in the bundle. INT-02 checks this.
Write registry entries before the rules bundle
The registry entries define the subcategories scope values the rules bundle must populate. If you write the rules bundle first and get the component name wrong, INT-03 will catch it — but fixing it means updating both the bundle and the registry to agree.

4.3   Terminology entries

For each term that is either new to the CDS vocabulary or that has a different meaning in this content type than it does in existing types, add an entry to procedure_terminology.yaml (and its .json twin). This file is shared across all content types.

Required fields per entry

FieldWhat to write
termThe preferred form — exactly as authors and agents should use it
scopeContent type, component, component attribute, CDS schema, etc.
definitionPrecise. If the term means something different elsewhere in CDS, state the distinction explicitly.
prohibitedList of legacy terms, informal alternates, and easy confusions — with parenthetical context explaining why each is prohibited
note(Optional) Usage constraints or disambiguation for edge cases

When to add vs. annotate

4.4   Rules bundle

The rules bundle is the largest and most consequential artifact. Write it last among the first four, after the taxonomy, registry, and terminology are stable.

ID namespace

Establish a numeric range for this content type's rules. Do not reuse IDs from other bundles. Document the namespace in the bundle's metadata.id_namespace block (start and end values). INT-09 checks that all rule IDs are within range.

Current namespaces in use: Procedure = 68001–68125. KC Article = 124001–124208.

Rule authoring order

Write in subcategories order: doc-level rules first, then component-level rules grouped by component, then doc-level:classification rules last.

Required fields per rule

{
  "id":                   integer — unique in this bundle, within namespace,
  "severity":             300 | 400 | 500,
  "severity_reason":      "one sentence explaining the tier choice",
  "mitigation":           "Fix",
  "rule_category":        "ComponentCategory" | "ComponentRule",
  "subcategories":        "scope query matching a rules_ref in the registry",
  "rule":                 "the constraint — one sentence, imperative",
  "use":                  "RequiredElement" | "RequiredFormat" | "ProhibitedPattern"
                        | "ContentStructure" | "StylePattern" | "LengthLimit"
                        | "OrderingRule" | "Guidance",
  "content_types_applied_to": "YourContentTypeName",
  "confidential":         false,
  "examples":             ["positive example"],
  "negative_examples":    ["negative example"]
}

Severity calibration

SeverityMeaningUse for
300 Requires content strategist sign-off to publish in violation Rules where violating produces structurally wrong content: missing required section, wrong classification, broken assembly
400 Author's own call; no sign-off needed The majority of rules. Important conventions that can be relaxed with judgment.
500 Suggestion only; never blocks Readability metrics, best practices, anything where the correct answer is context-dependent

After writing the bundle, verify manually

These are also checked automatically by integrity_check.py in Phase 5 — but catching them mentally during authoring is faster than running the script and iterating.

4.5   Skill file

The skill file is the last artifact to write. It depends on all four prior artifacts being stable.

Required structure

Match the structure of procedure-pattern_SKILL.md exactly:

  1. YAML front matter: skill identity, pattern identity, rules_ref, human_only_sections, metadata (core + extension), assembly manifest, examples, additional_resources
  2. Overview section — what the content type is, how it differs from similar types
  3. Classification decision tree (if the type has subtypes) — full tree, key distinctions table, reclassification signals table
  4. Shared assembly rules — rules that apply across all subtypes
  5. Per-subtype assembly sections — when/title patterns/roles, numbered instructions, output structure template with annotated placeholders
  6. Validation criteria checklist — shared checks + per-subtype checklists
  7. Dependencies table + References table
Test every template against the rules bundle before finalizing

The output structure templates in the skill file must themselves satisfy the rules in the rules bundle. A template that omits a RequiredElement will cause every output that follows the template to fail that rule.

For each template: extract every component it contains, look up that component's rules_ref in the registry, find all RequiredElement and OrderingRule rules in the bundle for that subcategory, and verify the template satisfies each one in the correct position. This is the hardest class of defect to diagnose later — the evaluator correctly flags "known-good" output and it looks like an evaluator bug when it isn't.