Help us improve
Share bugs, ideas, or general feedback.
From compliance-trestle
Guides Trestle authoring workflow for OSCAL documents via generate-edit-assemble cycle: JSON to Markdown conversion and back for catalogs, profiles, SSPs, component definitions, with YAML header editing.
npx claudepluginhub ethanolivertroy/compliance-trestle-skills --plugin compliance-trestleHow this skill is triggered — by the user, by Claude, or both
Slash command
/compliance-trestle:trestle-authoring-workflowThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Trestle's authoring tools convert OSCAL JSON to markdown for human editing, then back to JSON:
Guides OSCAL document selection (SSP, Profile, AR, POA&M), authoring, validation error fixes, schema versioning, and integrations with FedRAMP, eMASS, Compliance Trestle.
Generates Pharaoh tailoring files (id-conventions.yaml, workflows.yaml, artefact-catalog.yaml, checklists/requirement.md) in .pharaoh/project/ from detected-conventions JSON after pharaoh-tailor-detect.
Encodes human-readable governance policies into machine-executable JSON constraints for AI agents and CI pipelines to validate automatically. Outputs rule files in .ai/governance/.
Share bugs, ideas, or general feedback.
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).