Knowledge about the Compliance Trestle authoring workflow: the generate-edit-assemble cycle for converting OSCAL documents to markdown and back. Use when users ask about authoring catalogs, profiles, SSPs, or component definitions, editing control markdown, YAML headers, or the roundtrip workflow between JSON and markdown.
From compliance-trestlenpx claudepluginhub ethanolivertroy/compliance-trestle-skillsThis skill is limited to using the following tools:
Provides backend patterns for REST/GraphQL APIs, repository/service layers, middleware, DB optimization (N+1/indexing), caching (Redis) in Node.js, Express, Next.js.
Trestle's authoring tools convert OSCAL JSON to markdown for human editing, then back to JSON:
JSON (OSCAL) → generate → Markdown (edit) → assemble → JSON (OSCAL)
This cycle is continuous: after initial generation, you repeatedly edit markdown and reassemble.
trestle author catalog-generate --name <catalog> --output <md_dir> → markdown per controltrestle author catalog-assemble --markdown <md_dir> --output <catalog> → JSON catalogtrestle author profile-generate --name <profile> --output <md_dir> → markdown with profile additionstrestle author profile-assemble --markdown <md_dir> --output <profile> → JSON profiletrestle author profile-resolve --name <profile> --output <resolved> → resolved profile catalogtrestle author component-generate --name <compdef> --output <md_dir> → markdown per component/controltrestle author component-assemble --markdown <md_dir> --output <compdef> → JSON component-definitiontrestle author ssp-generate --profile <profile> --compdefs <comp1,comp2> --output <md_dir> → markdown per controltrestle author ssp-assemble --markdown <md_dir> --output <ssp> → JSON SSPtrestle author ssp-filter --name <ssp> --profile <profile> --output <filtered> → filtered SSPEach control gets its own .md file with:
# control-id - [Group Title] Control Title## Control Statement with labeled parts## Control guidance| Tag | Purpose |
|---|---|
x-trestle-set-params | Parameter values for the control |
x-trestle-global | Global metadata (sort-id, profile title) |
x-trestle-sections | Map of section short names to display names |
x-trestle-add-props | Properties to add to the control |
x-trestle-comp-def-rules | Rules from component definitions |
x-trestle-comp-def-rules-param-vals | Rule parameter values |
x-trestle-inherited-props | Properties inherited from upstream |
x-trestle-leveraging-comp | Leveraged component information |
x-trestle-statement | Statement-level metadata |
In catalog markdown (x-trestle-set-params):
x-trestle-set-params:
ac-1_prm_1:
values:
- organization-defined value
label: descriptive label
In profile markdown (adds profile-values):
x-trestle-set-params:
ac-1_prm_1:
values:
- catalog value
profile-values:
- profile-specific value
In SSP markdown (adds ssp-values):
x-trestle-set-params:
ac-1_prm_1:
values:
- resolved value
ssp-values:
- ssp-specific value
| Option | Commands | Purpose |
|---|---|---|
--set-parameters | catalog-assemble, profile-assemble | Apply parameter changes from YAML header |
--overwrite-header-values | all -generate | Overwrite existing header values with provided YAML |
--force-overwrite | all -generate | Erase existing markdown before regenerating |
--yaml / -y | all -generate | Provide external YAML header to merge |
--version | all -assemble | Set version in assembled model |
--regenerate | all -assemble | Generate new UUIDs |
--sections | profile-assemble | Define allowed sections |
--required-sections | profile-assemble | Sections that must be present |
--compdefs | ssp-generate | Comma-separated component definitions |
Controls track implementation status with these values:
implemented - Fully implementedpartial - Partially implementedplanned - Implementation is plannedalternative - Alternative implementationnot-applicable - Control is not applicableorganization - Organization-levelsystem-specific - System-specificcustomer-configured - Customer configuredcustomer-provided - Customer providedinherited - Inherited from another systemThe authoring tools are designed for CI/CD pipelines:
--set-parameters limits what can change during automated assembly--required-sections and --allowed-sections enforce document structureLarge organizations split OSCAL artifacts across multiple Git repositories aligned to ownership boundaries. Trestle's authoring tools support this through CI/CD-driven propagation.
catalog-repo (Regulators)
|
v imports
profile-repo (Compliance Officers)
|
v references
compdef-repo (Vendors / Control Providers)
|
v combined into
ssp-repo (System Owners)
Each repository contains its own trestle workspace (.trestle/ directory) and manages
artifacts independently with its own CI/CD pipeline.
When an upstream artifact changes:
trestle author *-assemble to rebuild OSCAL JSONThis pattern uses repository_dispatch events (GitHub Actions) or cross-project triggers
(GitLab CI) to connect repositories.
| Factor | Single Repo | Multi-Repo |
|---|---|---|
| Team size | Small (1-5 people) | Multiple teams or organizations |
| Ownership | Same team owns all artifacts | Different teams own different artifacts |
| Release cadence | Artifacts change together | Independent versioning needed |
| Access control | Same permissions for all | Different access per artifact type |
| Complexity | Simpler setup and maintenance | Better separation of concerns |
Start with a single repo. Split when ownership boundaries emerge or when independent versioning is required.
Component definitions combine structured rule data with narrative prose. Trestle supports a two-phase authoring pattern that uses the best tool for each type of content.
# CSV contains structured mappings: rules, parameters, control associations
trestle task csv-to-oscal-cd
The CSV captures:
Rule_Id, Rule_Description — the technical ruleControl_Id_List — which regulation controls this rule implementsParameter_Id, Parameter_Value_Alternatives — configurable parametersComponent_Type — Service (control-to-rule) or Validation (rule-to-check)Vendors manage this CSV in spreadsheet tools. It is committed to Git and
converted to OSCAL JSON via the csv-to-oscal-cd task.
# Generate markdown from the Phase 1 component definition
trestle author component-generate --name my-service --output md_compdefs/my-service
# Markdown shows rules (read-only) + editable prose sections
# Edit: write implementation descriptions per control per component
# Then reassemble
trestle author component-assemble --markdown md_compdefs/my-service --output my-service
The markdown includes:
implemented, partial, planned, etc.)Trestle's authoring tools are designed for Git-based collaboration with CI/CD automation.
trestle validate on the PR to catch errors earlytrestle author *-assemble to rebuild OSCAL JSONAssemble commands only write output if content changed. This prevents:
| Branch | Protection | Who Can Merge |
|---|---|---|
main | Require PR review + CI/CD pass | Artifact owner (per persona) |
| Feature branches | No protection | Any contributor |
Individual control markdown files enable fine-grained git tracking — reviewers can see exactly which controls were modified in a PR diff.
Not all OSCAL models have trestle author generate/assemble commands. The following models use a JSON-based workflow instead:
| Model | trestle author Support | Workflow |
|---|---|---|
| Catalog | catalog-generate / catalog-assemble | Markdown roundtrip |
| Profile | profile-generate / profile-assemble | Markdown roundtrip |
| Component Definition | component-generate / component-assemble | Markdown roundtrip |
| SSP | ssp-generate / ssp-assemble | Markdown roundtrip |
| Assessment Plan | None | create → split → edit → merge → validate |
| Assessment Results | None | create → split → edit → merge → validate |
| POA&M | None | create → split → edit → merge → validate |
For assessment plans, assessment results, and POA&M:
# 1. Create a new model with placeholder fields
trestle create -t <model-type> -o <name>
# 2. Split into editable sections
trestle split -f <model-file>.json -e '<model-type>.<element1>,<model-type>.<element2>'
# 3. Edit the resulting JSON files directly
# 4. Merge sections back together
trestle merge -e '<model-type>.<element1>,<model-type>.<element2>'
# 5. Validate the final model
trestle validate -t <model-type> -n <name>
For detailed workflows, see the trestle-assessment skill (assessment plans and results) and the trestle-poam skill (plan of action and milestones).