Skip to content

build(deps): adopt Kensa v0.8.0 - #762

Merged
remyluslosius merged 1 commit into
mainfrom
feat/kensa-v0.8.0
Jul 28, 2026
Merged

build(deps): adopt Kensa v0.8.0#762
remyluslosius merged 1 commit into
mainfrom
feat/kensa-v0.8.0

Conversation

@remyluslosius

Copy link
Copy Markdown
Contributor

What

Adopts Kensa v0.8.0. This is v0.7 exit criterion 6, and it was deliberately blocked on the outcome vocabulary (#761) until now.

Bumping before #761 landed would have written audit rules to hardened RHEL hosts while telling the operator "No host change was committed" and refusing rollback. Verified reachable on 2 of 6 reachable dev-fleet hosts.

Payload

The frozen api/ change is additive and already handled by #761. Everything else is corpus-side:

Change Effect
STIG Ubuntu coverage ~6% to 84.0% (22.04) and 85.6% (24.04)
CIS Ubuntu 41.8% (22.04), 38.9% (24.04), campaign in progress
Corpus 748 to 769 unique rule ids
config_value dropin_dir pwquality read only the base file and false-FAILED a host hardened via pwquality.conf.d/, which is where CIS/STIG remediation writes
Exact audit-rule matching -F path=/usr/bin/su no longer substring-matches a loaded /usr/bin/sudo, which was a false-PASS on the su control
audit_rule_set staging Stages reboot-deferred on immutable-audit hosts instead of failing. This is the change #761 exists to handle
golang.org/x/text v0.38.0 to v0.39.0 (GO-2026-5970)

The guard was checked, not assumed

remediation.OutcomeOf maps every TransactionStatus v0.8.0 can produce, verified by running AC-11 against the real module. Nothing falls through to the fail-closed branch.

That is the guard working as intended: a Kensa bump that introduced an unmapped terminal status would now fail the build here rather than mis-report a mutated host.

Expect score movement on the first scan

The verdict corrections are strictly more correct, but they do change shipped RHEL cis/stig results:

  • drop-in reads now see values set in *.conf.d/
  • maxrepeat / maxsequence now fail an explicit =0 (previously a false-PASS; =0 disables the check)
  • framework-divergent thresholds default to the stricter requirement (pwquality difok: CIS >= 2 vs STIG >= 8, ships 8). A CIS-only operator loosens with --var.

Hosts will flip state and drift alerts will fire. That is the corpus becoming honest, not a regression — but it is visible, and worth saying before someone opens a dashboard.

Doc counts

Applied the BACKLOG DOC-2 rule that a bare number is the bug. Every count now names its scope and version ("769 rules in the corpus, Kensa v0.8.0"), and the guides state explicitly that a single host is measured against the subset applying to its OS, not all 769.

That ambiguity is exactly what put three different rule counts into circulation (508, 539, 748) across the repo and the Context Plane.

Packaging

kensa-rules needs no manual bump: build-kensa-rules.sh derives its version from the module via stage-kensa-rules.sh. Verified resolving to 0.8.0 / 769 rules.

SDD

system-kensa-executor 2.7.0 -> 2.8.0 (AC-10 version pin). 116 specs, 116 passing.

Verification

gofmt, go vet, go build ./..., full go test ./internal/..., spec gate.

@github-actions github-actions Bot added documentation Improvements or additions to documentation size/M labels Jul 28, 2026
Unblocked by the remediation outcome vocabulary (#761). Bumping before that
landed would have written audit rules to hardened RHEL hosts while reporting
"No host change was committed" and refusing rollback, on 2 of 6 reachable
dev-fleet hosts.

Payload, all corpus-side (the frozen api/ change is additive and already
handled):

  - STIG Ubuntu coverage ~6% -> 84.0% (22.04) and 85.6% (24.04)
  - CIS Ubuntu 41.8% (22.04) and 38.9% (24.04), campaign in progress
  - corpus 748 -> 769 unique rule ids
  - config_value gains opt-in dropin_dir: the pwquality family read only the
    base file and false-FAILED a host hardened via pwquality.conf.d/, which is
    where CIS/STIG remediation writes
  - exact audit-rule matching: -F path=/usr/bin/su no longer substring-matches
    a loaded /usr/bin/sudo, which was a false-PASS on the su control
  - audit_rule_set stages reboot-deferred on immutable-audit hosts instead of
    failing, which is the change #761 exists to handle
  - golang.org/x/text v0.38.0 -> v0.39.0 (GO-2026-5970)

The AC-11 guard was checked against the real module rather than assumed: every
TransactionStatus v0.8.0 can produce is mapped by remediation.OutcomeOf, so
nothing falls through to the fail-closed branch.

EXPECT SCORE MOVEMENT ON FIRST SCAN. The verdict corrections are strictly more
correct but they do change shipped RHEL cis/stig results: the drop-in reads,
maxrepeat/maxsequence now failing an explicit =0 (previously a false-PASS), and
framework-divergent thresholds defaulting to the stricter requirement (e.g.
pwquality difok, CIS >= 2 vs STIG >= 8, ships 8). A CIS-only operator loosens
via --var. Hosts will flip state and drift alerts will fire; that is the
corpus becoming honest, not a regression.

Doc counts follow the BACKLOG DOC-2 rule that a bare number is the bug: every
count now names its scope and its Kensa version ("769 rules in the corpus,
Kensa v0.8.0"), and the guides state explicitly that a single host is measured
against the subset applying to its OS, not all 769. That ambiguity is what put
three different rule counts into circulation (508, 539, 748).

kensa-rules needs no manual bump: build-kensa-rules.sh derives its version from
the module via stage-kensa-rules.sh, verified resolving to 0.8.0 / 769 rules.

Spec: system-kensa-executor 2.7.0 -> 2.8.0 (AC-10 version pin).
Verified: gofmt, go vet, go build, full go test ./internal/..., 116 specs
116 passing.
@remyluslosius
remyluslosius merged commit b82b0c9 into main Jul 28, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant