Skip to content

Tutorial: Full CRA Walkthrough

This tutorial walks through the complete CRA Module A assessment lifecycle using SyncPad — a collaborative document editor — as the example product. SyncPad is the reference product from Risk, Evidence and Conformity: The Cyber Resilience Act for Default Products.

SyncPad v2.0 is a web-based collaborative editor:

  • Stack: Node.js/Express backend, React frontend, PostgreSQL, Redis
  • Features: Real-time collaboration, file upload, PDF export, user accounts
  • Deployment: Cloud-hosted SaaS (RDPS applicable)
  • Classification: Default product (Module A self-assessment)
  1. Scan the codebase:

    Terminal window
    fleet scan --path ./syncpad \
    --output json --output-file syncpad-scan.json \
    --sbom --cbom \
    --report syncpad-module-a.md
  2. Review the summary:

    Findings: 238
    Pass: 67
    Fail: 45
    Review: 126
    SBOM: 1,247 components
    CBOM: 52 crypto primitives (46 approved, 3 deprecated, 3 prohibited)
  3. Register the product on the platform:

    Terminal window
    curl -X POST /api/v1/assessment/products \
    -d '{
    "name": "SyncPad",
    "version": "2.0.0",
    "ruleset_id": "default-ruleset-uuid",
    "repo_url": "https://github.com/syncpad/syncpad"
    }'
  4. Upload scan results:

    Terminal window
    curl -X POST /api/v1/assessment/products/{id}/scans \
    -d @syncpad-scan.json

These are already assessed. Review the failures:

Category Failures Examples
Crypto 3 MD5 in avatar hash, SHA-1 in legacy import
Network 5 HTTP URL for analytics, hardcoded Redis password
Auth 2 Password logged in debug mode
Config 1 Debug mode enabled in default config
Supply chain 2 Missing lockfile integrity, no vuln scanning in CI
Vuln handling 3 No security.txt, no SECURITY.md, no disclosure policy
Terminal window
fleet scan --path ./syncpad --llm claude --output json --output-file syncpad-llm.json

Claude reviews the 126 needs_review findings and produces evidence:

After LLM review:
Pass: 143 (was 67)
Fail: 52 (was 45)
Review: 43 (was 126)
LLM reviewed: 83

Use bulk triage for the 43 remaining needs_review findings:

Terminal window
curl -X POST /api/v1/assessment/products/{id}/triage \
-d '{
"triaged_by": "security-team",
"actions": [
{ "requirement_id": "NET-SVC-01-R2", "action": "accept",
"justification": "Authorization checks verified in code review" },
{ "requirement_id": "INPUT-04-R1", "action": "false_positive",
"justification": "Node.js is memory-safe, bounds checking N/A" },
{ "requirement_id": "UPD-FW-01-R1", "action": "false_positive",
"justification": "SaaS product, no firmware updates" }
]
}'

Create remediations for the confirmed failures:

Terminal window
# Fix MD5 usage
curl -X POST /api/v1/assessment/products/{id}/remediations \
-d '{
"requirement_id": "CRYPTO-01-R1",
"description": "Replace MD5 with SHA-256 for avatar hashing",
"assigned_to": "backend-team",
"ticket_url": "https://linear.app/syncpad/ENG-501"
}'
# Add security.txt
curl -X POST /api/v1/assessment/products/{id}/remediations \
-d '{
"requirement_id": "VH-ID-01-R1",
"description": "Create .well-known/security.txt with contact info",
"assigned_to": "devops",
"ticket_url": "https://linear.app/syncpad/ENG-502"
}'

Phase 5: Document Processes (Doc Evidence)

Section titled “Phase 5: Document Processes (Doc Evidence)”

Start a questionnaire session for the 187 Doc requirements:

Terminal window
# Start session
curl -X POST /api/v1/assessment/products/{id}/questionnaire
# Answer vulnerability handling questions
curl -X POST /api/v1/assessment/questionnaire/{session}/answer \
-d '{
"requirement_id": "VH-REG-01-R1",
"answer": "ENISA notification process: 1) Security team assesses severity within 4 hours. 2) If notifiable, early warning submitted within 24 hours via ENISA portal. 3) Full notification within 72 hours. Process owner: CISO. Last drill: 2026-03-15."
}'
# Answer update support questions
curl -X POST /api/v1/assessment/questionnaire/{session}/answer \
-d '{
"requirement_id": "UPD-LIFE-01-R1",
"answer": "SyncPad v2.0 support period: 5 years from December 2026. Security updates provided free of charge. Published at https://syncpad.com/support-policy."
}'
  1. Re-scan after fixes:

    Terminal window
    fleet scan --path ./syncpad --llm claude --ci \
    --api-url https://fleet.example.com \
    --api-key $KEY
  2. Check gap analysis:

    Terminal window
    curl /api/v1/assessment/products/{id}/gap-analysis

    Target: 0 non_compliant, minimal needs_evidence.

  3. Generate final Module A report:

    Terminal window
    fleet scan --path ./syncpad --report syncpad-module-a-final.md
  4. Verify remediations:

    Terminal window
    curl -X POST /api/v1/assessment/remediations/{id}/verify \
    -d '{"verified_by": "qa-team", "scan_id": "latest-scan-uuid"}'
.github/workflows/fleet-cra.yml
name: CRA Compliance
on:
push:
branches: [main]
schedule:
- cron: '0 6 * * 1' # Weekly full scan
jobs:
cra-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: fleet scan --path . --ci --llm off --sbom --cbom
env:
FLEET_API_URL: ${{ secrets.FLEET_API_URL }}
FLEET_API_KEY: ${{ secrets.FLEET_API_KEY }}

Every commit now produces timestamped evidence. The dashboard shows compliance trajectory over time.

At the end of this process, SyncPad has:

  • Risk assessment mapped to all applicable Annex I requirements
  • Evidence records for each assessed requirement (SHA-256 hashed)
  • SBOM (1,247 components, CycloneDX 1.6)
  • CBOM (52 crypto primitives, all approved after remediation)
  • Module A technical documentation report
  • Vulnerability handling process documentation
  • Support period commitment documentation
  • Continuous CI scanning with evidence retention
  • Finding overrides with documented justification
  • Remediation records with verification