v1.0.0 - First Stable Release
This is the first stable release of complyctl.
Since the v1.0.0-alpha.0 in March -- which introduced the core redesign from OSCAL to Gemara -- the project has gone through three pre-release milestones (alpha, beta, RC) with contributions from 11 people across 200+ commits. This release marks the point where the CLI surface, configuration format, provider gRPC API, and output formats are considered stable under semantic versioning.
Thank you to everyone who tested pre-release builds, reported issues, and contributed code during this maturity cycle.
What's New Since the Core Redesign
Sigstore signature verification -- complyctl get verifies OCI artifact signatures via sigstore-go before content reaches the local cache. Supports keyless verification (OIDC issuer + identity) and keyed verification (public key). Per-policy and per-complypack verification overrides in complytime.yaml. complyctl list shows verification status, and complyctl doctor includes verification diagnostics.
Complypack OCI pipeline -- complyctl get fetches complypack artifacts from OCI registries alongside policies. Cache versioning with configurable retention (COMPLYTIME_CACHE_VERSIONS). Digest-based freshness tracking prevents stale generation artifacts. complyctl doctor reports cache health, disk usage, and orphaned versions.
XDG Base Directory paths -- User-scoped paths now follow the XDG Base Directory Specification. Cache goes to ~/.cache/complytime/, data to ~/.local/share/complytime/. The workspace-local .complytime/ directory is unchanged. Legacy ~/.complytime/ triggers a deprecation warning with migration guidance. This aligns complyctl with Linux packaging standards.
Redesigned markdown report -- --format pretty produces a report with summary metadata, pass rate, grouped controls table with messages, findings grouped by result type with recommendations and collapsible evidence. Emoji status indicators make reports directly usable as GitHub Actions Step Summaries.
Bundle metadata visibility -- complyctl list displays EVALUATOR, CONTROLS, and DIGEST columns. complyctl get prints a post-sync summary showing policy title, evaluator, control count, and assessment count. Users can see what they have without running a scan.
Machine-readable doctor output -- complyctl doctor --format text|json for CI pipelines. Text format produces grep-stable [PASS]/[FAIL]/[WARN] labels. JSON format provides structured output with a blocking_failure field for programmatic gates. NO_COLOR auto-detection selects the text renderer automatically.
Workspace configuration -- --workspace flag and COMPLYTIME_WORKSPACE environment variable allow running commands from any directory. Configuration moved to .complytime/complytime.yaml with backward compatibility.
Scan improvements -- complyctl scan [target] positional argument for scoping to a single target. --show-passing flag to include passing controls in the terminal summary. Non-zero exit codes on operational errors. Evidence and Recommendation fields in the provider gRPC API.
Providers repository split -- Providers moved to the complytime-providers repository. complyctl is now the core CLI runtime, and providers are standalone binaries with independent release cycles. The repository currently includes the OpenSCAP, Ampel, and OPA providers.
Gemara bundle-format support -- The policy resolver handles both split-layer and bundle-format OCI artifacts, keeping complyctl forward-compatible with evolving Gemara packaging.
RPM packaging -- Updated spec for core-only complyctl after the provider split. Go 1.25, go-rpm-macros, Packit, and Testing Farm (TMT/FMF) support.
Testing infrastructure -- Container-based acceptance tests with a real zot OCI registry. Cross-repo integration tests validating the full complyctl + providers pipeline. EvaluationLog schema validation against Gemara CUE schemas. Devcontainer environment for interactive testing during PR reviews.
Debug visibility -- --debug now outputs to stderr in addition to the log file, with a hint showing the log file path.
Notes for Early Adopters
If you used a pre-release version, the following changes may require attention:
- XDG paths:
~/.complytime/is replaced by~/.cache/complytime/and~/.local/share/complytime/. A deprecation warning with migration steps is printed automatically. - Collector export removed: The
collector:config block,COMPLYTIME_EXPORT_ENABLEDenv var, and Export RPC were removed. These were speculative and will be redesigned when the backend shape is known. - Doctor output format: Default output now includes text labels alongside emoji. Use
--format jsonfor stable machine parsing. - Config location:
complytime.yamlmoved to.complytime/complytime.yaml. The legacy location still works but triggers a deprecation warning.
Changelog (since v1.0.0-rc.0)
New Features
- 194c871: feat(doctor)!: add --format text|json flag with NO_COLOR auto-detection (@trevor-vaughan)
- e7997dc: feat(doctor): add --format human flag, consolidate result counting (@trevor-vaughan)
- 28c84a8: feat(doctor): redesign output with grouped sections and nested children (@sonupreetam)
- d8840f7: feat(proto,doctor): add optional_target_variable_groups for one-of target variables (@sonupreetam)
- 9f74db4: feat: add emoji status indicators to markdown report for CI step summary (@em-redhat)
- 902dfcf: feat: add policy verification pipeline and list integrity display (#641) (@hbraswelrh)
- b938ed9: feat: adopt XDG Base Directory Specification for user-scoped paths (@em-redhat)
- b25f079: feat: complypack cache version management (#702) (@yvonnedevlinrh)
- 250c7ed: feat: implement sigstore-go verification for policies and complypacks (#670) (@hbraswelrh)
- 5323b11: feat: support per-entry verification config for multi-publisher registries (@marcusburghardt)
- 6530bed: feat: surface Gemara bundle metadata in list and get commands (@yvonnedevlinrh)
- 437eea7: feat: validate digest format at state ingestion layer (#774) (@yvonnedevlinrh)
Bug Fixes
- 7b8ec4c: fix!: prevent signature verification from resolving against Docker Hub (@trevor-vaughan)
- b2e388a: fix(cache): add missing id field in seedComplypackWithTag test helper (@yvonnedevlinrh)
- f08a9f1: fix(ci): grant pull-requests: read to fix reusable_ci.yml startup_failure (@sonupreetam)
- 868f6fb: fix(ci): set persist-credentials: false on release preflight checkout (@marcusburghardt)
- e50f60e: fix(ci): work around $HOME expansion bug in carabiner-dev/actions v1.2.3 (@yvonnedevlinrh)
- 0c4b40f: fix(cli): address PR #711 review feedback (@yvonnedevlinrh)
- 2274a0c: fix(cli): collect errors across policy and complypack sync groups (@marcusburghardt)
- 5e1c4b3: fix(cli): emit per-entry warning to stderr on sync failure (@marcusburghardt)
- 426d0af: fix(devcontainer): scope GITHUB_TOKEN to providers clone (@sonupreetam)
- 24b4593: fix(policy): add version field to catalog warning log (@marcusburghardt)
- 17277bf: fix(policy): warn when split-layer catalog load fails (@marcusburghardt)
- c8b107b: fix(scan): warn on unresolved assessment IDs (@trevor-vaughan)
- 7d29afd: fix: adapt to go-gemara v0.8.0 Bundle API changes (@yvonnedevlinrh)
- 00b8ecd: fix: add go.mod compat patch for Fedora 43 in RPM spec (@marcusburghardt)
- f61e943: fix: add missing required Gemara schema fields to policy fixtures (#707) (@yvonnedevlinrh)
- a3f627c: fix: add text labels alongside emoji in terminal scan summary (@marcusburghardt)
- b042bbb: fix: address review council findings (@sonupreetam)
- cdcfce8: fix: address review council findings from PR #771 (@marcusburghardt)
- f06e3e2: fix: address review feedback on CHANGELOG and test naming (@em-redhat)
- 57ef9ff: fix: adds required fields to gemara artifacts (@trevor-vaughan)
- 4d9015a: fix: also patch vendor/modules.txt for Fedora 43 Go compat (@marcusburghardt)
- 3f646cf: fix: complypack cache reliability — version eviction and generation state accuracy (#661) (@sonupreetam)
- afdf326: fix: correct day-of-week in RPM spec changelog entry (@marcusburghardt)
- 89d0c1d: fix: invalidate generation cache when complypack is re-fetched (@sonupreetam)
- 8853c58: fix: move fail-closed check before DefinitionVersion in SyncPolicy (@marcusburghardt)
- 129ef08: fix: output debug logs to stderr when --debug is active (#614) (@em-redhat)
- 2ccd3f3: fix: reject duplicate evaluator-ids and self-heal missing complypack cache (@sonupreetam)
- 50f243a: fix: remove extra blank line flagged by goimports (@em-redhat)
- 0b35db7: fix: remove unused test helpers flagged by golangci-lint (@em-redhat)
- 6b0da52: fix: review council findings for schema validation CI (@sonupreetam)
- e10b7e3: fix: separate assessment log plan IDs (@sanmaxdev)
- 82f7c88: fix: suppress spinner escape sequences on non-TTY output (@yvonnedevlinrh)
- f1686ba: fix: update acceptance test paths to XDG layout (@em-redhat)
- ee50f3d: fix: use 0700 permissions for XDG provider dir in test helpers (@em-redhat)
- 9f41ed4: fix: use canonical .complytime/complytime.yaml location in test scripts (@sonupreetam)
- 03d1ad6: fix: use config.Version for complypack state to match on-disk directory (@yvonnedevlinrh)
- 0a147f7: fix: use os.Root to prevent symlink TOCTOU in WalkDir callback (#671) (@trevor-vaughan)
- 9a2436e: refactor(doctor): extract StatusUnknown constant from inline emoji (@marcusburghardt)
- fffb19c: refactor(doctor): extract shared tree-walk from human/text renderers (@marcusburghardt)
- a83682b: refactor(doctor): use %q in format error message and table-driven tests (@marcusburghardt)
- edd7f34: refactor(test): reuse seedTestPolicy helper in ListCachedPolicies test (@marcusburghardt)
Dependency Updates
- bc1331e: chore(deps): Update go module directive to v1.26.5 (@complytime-renovate[bot])
- 5d71496: chore(deps): bump complypack to v0.0.6 and update tests (@marcusburghardt)
- f0b9314: chore(deps): bump github.com/complytime/complypack from 0.0.6 to 0.0.7 (@dependabot[bot])
- 20f606d: chore(deps): bump github.com/complytime/complypack from 0.0.7 to 0.0.8 (@dependabot[bot])
- 1d8484d: chore(deps): bump github.com/defenseunicorns/go-oscal (#754) (@dependabot[bot])
- ca12b04: chore(deps): bump github.com/mattn/go-isatty from 0.0.20 to 0.0.22 (#689) (@dependabot[bot])
- cb7dbfd: chore(deps): bump github.com/mattn/go-isatty from 0.0.22 to 0.0.23 (@dependabot[bot])
- 552db67: chore(deps): bump github.com/mattn/go-isatty from 0.0.23 to 0.0.24 (@dependabot[bot])
- f416506: chore(deps): bump github.com/sigstore/sigstore-go from 1.2.1 to 1.2.2 (@dependabot[bot])
- a6a3ab4: chore(deps): bump google.golang.org/grpc from 1.81.1 to 1.82.0 (#688) (@dependabot[bot])
- 85e98ae: chore(deps): bump google.golang.org/grpc from 1.82.0 to 1.82.1 (@dependabot[bot])
- 8d6aa3a: chore(deps): bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2 (@dependabot[bot])
Infrastructure Updates
- 76ccfe1: ci(deps): bump actions/checkout from 7.0.0 to 7.0.1 (@dependabot[bot])
- f1c1512: ci(deps): bump actions/setup-go from 6.5.0 to 7.0.0 (@dependabot[bot])
- c93dd32: ci(deps): bump actions/setup-go in /.github/actions/setup-complyctl (@dependabot[bot])
- 350c2a6: ci(deps): bump carabiner-dev/actions from 1.2.1 to 1.2.3 (@yvonnedevlinrh)
- 9017543: ci(deps): bump complytime/org-infra reusable workflows from v0.6.0 to v0.7.0 (@marcusburghardt)
- 66c1517: ci(deps): bump complytime/org-infra reusable workflows from v0.7.0 to v0.7.1 (@marcusburghardt)
- c19b1d8: ci(deps): bump complytime/org-infra/.github/workflows/reusable_ci.yml (#733) (@dependabot[bot])
- 817a67c: ci(deps): bump complytime/org-infra/.github/workflows/reusable_compliance.yml (#739) (@dependabot[bot])
- 596f727: ci(deps): bump complytime/org-infra/.github/workflows/reusable_crapload_analysis.yml (#729) (@dependabot[bot])
- a0103de: ci(deps): bump complytime/org-infra/.github/workflows/reusable_dependabot_reviewer.yml (#732) (@dependabot[bot])
- ff46a75: ci(deps): bump complytime/org-infra/.github/workflows/reusable_deps_reviewer.yml (#731) (@dependabot[bot])
- cf2722b: ci(deps): bump complytime/org-infra/.github/workflows/reusable_scheduled.yml (#738) (@dependabot[bot])
- 46b60ef: ci(deps): bump complytime/org-infra/.github/workflows/reusable_security.yml (#730) (@dependabot[bot])
- 615beae: ci(deps): bump complytime/org-infra/.github/workflows/reusable_sonarqube.yml (#740) (@dependabot[bot])
- 6cd6c7f: ci(deps): bump complytime/org-infra/.github/workflows/reusable_vuln_scan.yml (#741) (@dependabot[bot])
- 7a4e311: ci(deps): bump github/codeql-action/upload-sarif from 4.36.2 to 4.36.3 (@dependabot[bot])
- 06afb00: ci(deps): bump github/codeql-action/upload-sarif from 4.36.3 to 4.37.0 (#704) (@dependabot[bot])
- dc0f2c0: ci(deps): bump github/codeql-action/upload-sarif from 4.37.0 to 4.37.1 (@dependabot[bot])
- 3668be7: ci(deps): bump github/codeql-action/upload-sarif from 4.37.1 to 4.37.3 (@dependabot[bot])
- 4ff48bf: ci: use Makefile test targets in unit and e2e workflows (@trevor-vaughan)
- 2759e7d: ci: validate EvaluationLog schema in cross-repo integration test (@sonupreetam)
Documentation Updates
- 09e76cb: docs(proto): document Result enum semantics and Gemara mappings (#728) (@trevor-vaughan)
Other Work
- 371b3cd: Fix review council findings: sentinel errors, binding assertions, spec artifact (@trevor-vaughan)
- da52f1e: TestSync_FailureOnMissingPolicy previously passed for the wrong reason: (@trevor-vaughan)
- 204bb9d: chore: add markdownlint configs and fix violations (#709) (@trevor-vaughan)
- b537471: chore: adopt org-infra reusable release workflows (#726) (@yvonnedevlinrh)
- 61fd9a7: chore: migrate doctor_test.go to testify assertions (@sonupreetam)
- 55da181: chore: post-removal cleanup for export infrastructure (#650) (@sonupreetam)
- 5c31143: chore: remove boilerplate openspec/config.yaml (@marcusburghardt)
- cacaf0f: chore: sync repository standards ()
- 1dc7e9f: spec: doctor-grouped-output change artifacts (@sonupreetam)
- 556c12e: test(cli): add positive assertions to resolution tests (@trevor-vaughan)
- 2dd2f92: test(complytime): add tests for utility functions and duplicate policy validation (@trevor-vaughan)
- 3e18486: test(doctor): verify grandchildren appear in JSON output (@marcusburghardt)
- 578fb37: test(output): add NeedsReview, execution plan, OSCAL, and content tests (@trevor-vaughan)
- 3971108: test(policy): add happy-path loader tests and content assertions (@trevor-vaughan)
- 3a0e041: test(provider): add proto mapping tests and strengthen RouteScan assertions (@trevor-vaughan)