RWS Architecture article

Architecture model sidecars

Architecture roadmap metadata lives in .model.yaml sidecar files next to, or near, the human-facing Markdown note. The Markdown note remains the narrative source for architects a

  1. Typefact
  2. Statusactive
  3. Domainplatform
On this page
  1. Summary
  2. Sidecar Placement
  3. How Capabilities Are Included
  4. Object Types
  5. Top-Level Attributes
  6. Version Attributes
  7. Schedule Attributes
  8. State Values
  9. Provided Capability Attributes
  10. Requirement Attributes
  11. Modeling Workflow
  12. Validation

Summary

Architecture roadmap metadata lives in .model.yaml sidecar files next to, or near, the human-facing Markdown note. The Markdown note remains the narrative source for architects and reviewers; the sidecar is the machine-readable source for capability dependency graphs, portal timeline views, and Gantt-style planning views.

The model is intentionally simple: start with an offering version, declare the capabilities it needs, then work downward until the chain reaches capabilities that are externally available or tracked elsewhere. The availability of an offering is derived from the latest required capability, not from a manually maintained hard timeline.

The portal and validators include sidecars automatically by scanning RWS-ARCH/**/*.model.yaml, excluding inbox, assets, templates, Obsidian configuration, reports, and dependencies. Capabilities are therefore not embedded in the Markdown note or in a central registry. Each capability comes from its own versioned sidecar file, and dependencies are connected by the id, provides.id, and requires.ref fields.

Sidecar Placement

Use the same basename as the Markdown document when the sidecar models that document directly. Offering sidecars live in the service offering catalog:


RWS-ARCH/70-togaf/offerings/clusters-as-a-service-offering.md

RWS-ARCH/70-togaf/offerings/clusters-as-a-service-offering.model.yaml

Capability sidecars currently live next to the SBB note that owns the implementation narrative, even when the sidecar models a capability rather than the SBB itself:


RWS-ARCH/70-togaf/sbb/red-hat-advanced-cluster-management.md

RWS-ARCH/70-togaf/sbb/fleet-hcp-cluster-provisioning.model.yaml

The sidecar document field must point to the Markdown note that owns or explains the modeled item. When multiple capabilities are explained by one SBB note, each capability may have its own .model.yaml file with the same document value. This keeps the dependency graph granular without forcing every capability to become a separate human-facing Markdown note.

This placement is deliberately pragmatic. A capability sidecar under RWS-ARCH/70-togaf/sbb/ means "this capability is explained by this SBB note", not "this capability is itself an SBB". If capability inventory grows beyond implementation-owned slices, introduce a dedicated capability catalog rather than overloading SBB folders indefinitely.

How Capabilities Are Included

Capabilities enter the roadmap through versioned sidecars, not through Markdown body sections. A capability sidecar normally has this shape:


kind: capability

id: capability.cluster-baseline-gitops

title: Cluster Baseline GitOps

document: openshift-gitops.md

owner: team-platform-architecture

domain: platform

organizational_domain: datacenters

versions:

  - version: 0.1.0

    label: Baseline cluster reconciliation

    state: planned

    target_window: 2026-Q3

    confidence: low

    basis: GitOps is the intended reconciliation path, but evidence still needs definition.

    adds:

      - Baseline GitOps reconciliation path for provisioned clusters.

      - Initial ownership boundary for baseline content.

    delivery:

      work_packages:

        - ref: "[wp-09-caas-platform](/vault/n/80-workpackages/wp-09-caas-platform/)"

          role: primary

          scope: Initial CLaaS baseline content and reconciliation delivery.

    provides:

      - id: cluster-baseline-gitops

        label: Cluster baseline GitOps

    requires:

      - ref: capability.dcs-cluster-runtime

        capability: dcs-cluster-runtime

        reason: GitOps control components need a runtime foundation.

The build turns this into graph nodes for the capability object and each version. Requirements become graph edges from the requiring version to the selected dependency version. If a requirement includes capability, validation confirms that the selected dependency version actually provides that capability.

For CLaaS, RWS-ARCH/70-togaf/offerings/clusters-as-a-service-offering.model.yaml is the entry point. Its requires list points to separate capability sidecars such as fleet HCP provisioning, identity access, ingress publication, GitOps baseline, observability baseline, and backup restore baseline.

Object Types

KindMeaningTypical Use
service_offeringConsumable service version exposed to users or platform consumers.CLaaS version that consumers can request.
capabilitySpecific feature or outcome needed by another model item.Provision HCP clusters with virtualized workers.
sbbConcrete solution building block when modeling the SBB itself is useful.Product or platform component with its own versioned availability.
exceptionTemporary non-target lane or exception.Transitional production exception.

Prefer service_offering and capability first. Add sbb entries only when the SBB itself needs versioned roadmap semantics. A sidecar in RWS-ARCH/70-togaf/sbb/ can still use kind: capability; the path only indicates where the explanatory note lives.

Top-Level Attributes

Every sidecar describes one versioned roadmap object.

AttributeRequiredAllowed ValuesMeaning
kindYesservice_offering, capability, sbb, exceptionThe model object type.
idYesPrefix with offering., capability., sbb., or exception.Stable model identifier used by dependencies. Use lowercase letters, numbers, dots, and hyphens.
titleYesTextHuman-readable name shown in portal views.
documentYesRelative Markdown filename ending in .mdMarkdown note that owns or explains the sidecar.
ownerYesTextOwning team, role, or architecture group responsible for maintaining the model entry.
domainYesTextArchitecture domain used for filtering and grouping.
organizational_domainNodatacenters, networking, platforms, eup, iam, securityOrganizational domain owner used for roadmap color coding and accountability views.
statusNoTextAuthoring or governance status, for example draft or active.
realizesNoList of stringsLogical ABBs, capabilities, or architecture concepts implemented by this model object.
versionsYesList of version objectsVersioned availability and dependency records.
related_notesNoList of stringsExtra Markdown notes relevant to the model object.

Version Attributes

Versions use comparable semantic versions in major.minor.patch format, for example 0.1.0 or 1.0.0. Human labels explain what the version means.

AttributeRequiredAllowed ValuesMeaning
versionYesmajor.minor.patchMachine-comparable version identifier.
labelYesTextShort human label.
stateYesSee State ValuesCurrent availability or execution state.
target_windowYesunknown, YYYY-Qn, or YYYY-HnExpected availability window for this version or capability.
confidenceYeslow, medium, highConfidence in the target window.
basisYesTextWhy this state and target window are currently believed.
descriptionNoTextShort explanation of what this version represents.
addsNoList of 1-5 short bulletsHuman-facing version delta shown in portal hovers.
scheduleYesObject with durations and optional start_afterDuration-based planning input used to derive Gantt dates.
deliveryNoObject with work_packagesWork packages expected to deliver, support, or validate this version.
timelineNoObject with start and target datesDeprecated fixed planning dates; prefer schedule.
providesNoList of provided capability objectsCapabilities or features made available by this version.
requiresNoList of requirement objectsCapabilities or versions that must be available first.

Use adds for concise reviewer-facing bullets that explain what becomes new in this version. Keep adds separate from provides: provides is for machine-readable dependency targets, while adds explains the version increment in plain language.

Use delivery.work_packages to connect a version to delivery scope. Gantt bars link to the primary work package when present, because the work package is the reviewable delivery unit for the block.


delivery:

  work_packages:

    - ref: "[wp-09-caas-platform](/vault/n/80-workpackages/wp-09-caas-platform/)"

      role: primary

      scope: Initial CLaaS provisioning and service readiness.

Allowed work package roles are primary, contributing, dependency, and validation.

Schedule Attributes

The schedule object is required for versions that appear in the roadmap model. It keeps the model dynamic by deriving Gantt dates from dependency availability plus the duration of each state segment.


schedule:

  start_after: 2026-06-01

  durations:

    planned: 20d

    validating: 10d

Use start_after only when a capability has an external earliest-start constraint. When omitted, the generated model starts the version after the latest required dependency is available. Durations use day values such as 10d.

AttributeRequiredAllowed ValuesMeaning
start_afterNoYYYY-MM-DDEarliest date this version can start, independent of dependencies.
durationsYesMap of state to day durationEstimated time spent in each relevant state segment.

The generated timeline used by portal Gantt views is derived from schedule, selected requirements, and any requirement lag values. Fixed timeline fields are retained only as a migration escape hatch and should not be used for new roadmap entries.

State Values

State is about availability or execution, not strategic lifecycle.

StateMeaning
not_startedIdentified, but no delivery or implementation work has started.
plannedAccepted into planning, but not materially underway.
in_progressImplementation, configuration, or design work is underway.
validatingImplemented enough for controlled validation or evidence collection.
availableAvailable for the dependency use described by this version.
blockedCannot progress until a blocker is removed.
pausedDeliberately stopped or deferred.
retiredNo longer valid for active dependency use.

Use available only when downstream dependencies can rely on this version or capability.

Provided Capability Attributes

Each item under provides describes a feature or capability exposed by the version.

AttributeRequiredAllowed ValuesMeaning
idYesLowercase identifierStable capability identifier within this version, for example provision-hcp-clusters-with-virtualized-workers.
labelYesTextHuman-readable capability name.
descriptionNoTextWhat the capability provides and why it matters.

Keep provides small. Add only capabilities that another offering, capability, or SBB needs to depend on.

Requirement Attributes

Each item under requires points to another model object and optionally to a specific provided capability.

AttributeRequiredAllowed ValuesMeaning
refYesExisting sidecar idModel object being depended on.
version_constraintNoSemver constraintAcceptable version range, for example >=0.1.0 <1.0.0. Defaults to any version when omitted.
capabilityNoCapability id from the target version's provides listSpecific capability needed from the dependency.
blocksNoavailability, production, scale, target, noneWhat is blocked if the requirement is not available. Defaults to availability.
lagNoQuarter lag like 0q or 1qDelay after dependency availability before this version can be treated as available.
reasonYesTextWhy the requirement exists.

Modeling Workflow

Model top down:

  1. Start with the offering version, for example CLaaS 0.1.0.
  2. List the capabilities the offering needs before it can be available.
  3. Put each modeled capability in its own .model.yaml file so the graph can show it as a separate dependency node.
  4. For each capability, model the provider capability and its own requirements.
  5. Stop when the chain reaches a capability treated as externally available or tracked elsewhere.
  6. Add target_window and confidence to dependencies so the portal can plot the chain.

The timeline should derive offering availability from the latest blocking requirement, plus any explicit lag.

Validation

CI validates sidecars with .schemas/capability-model.schema.json and .scripts/validate-capability-model.js.

Validation checks include:

  • sidecar YAML shape and allowed field values
  • unique model version IDs
  • semver-compatible versions and constraints
  • resolvable requirement references
  • required reason text on blocking requirements
  • high-confidence forecasts not being assigned to immature states
  • valid timeline date shape and target not earlier than start

The portal graph is generated from the sidecars during npm run build:model.