Repository navigation
v4.4.0
A check the gate cannot run reports SKIPPED instead of WARN, so a clean change can return PASS, and solumbe calibrate grades the gate's verdict against what happened next. No command or field was removed. A check's status gains the value SKIPPED and the verdict schemaVersion moves to 3, so a client that reads checks[].status must accept it.
Added
solumbe calibrate --gategrades the gate's verdict and the convergence band against history.- It replays the real local gate and the real convergence score on each commit, checked out into a temporary worktree, and joins the result to the same
repairedoutcomesolumbe calibrateuses for risk flags. - It reports the repair rate for PASS, WARN and FAIL, the alarm rate, the share of alarms on changes nothing repaired, a row for each check that warned, and the rate for each convergence band. Rates carry a Wilson 95% interval and are withheld under 30 commits.
- On this repository: 111 commits, PASS repaired 16.0%, WARN 36.7%, with overlapping intervals, and an alarm on 27.0% of changes.
- It shows whether a verdict separates repaired changes from the rest, not whether the gate prevents a repair. The optional analyzers are not run against historical trees.
- It replays the real local gate and the real convergence score on each commit, checked out into a temporary worktree, and joins the result to the same
solumbe calibrate --follow-throughreports how often a warning had cleared on the next run.- It reads the local usage log, pairs each WARN or FAIL with the next gate run on the same repository inside 60 minutes, and reports per check how often that check then passed. A convergence score below
alignedis paired with the next score of the same task. - Gate and convergence events in the usage log now record each check's status under its name, whether the gate was local or a pull request, and hashes of the repository root, the changed-file set and the request. No path or request text is logged, and none of it is shared.
- It reads the local usage log, pairs each WARN or FAIL with the next gate run on the same repository inside 60 minutes, and reports per check how often that check then passed. A convergence score below
SOLUMBE_CHECK_MODE=trialruns a trial with a control arm on the checks an agent makes before it commits.- Off by default. Each change falls in a shown or a withheld arm by a hash of the repository root and its head commit;
SOLUMBE_CHECK_SHOWN_SHAREsets the split. - In the withheld arm the MCP
convergence_scoreand localreview_gatetools compute and log the result and tell the agent only that it was recorded. A blocking FAIL is shown in both arms. The command line, the pre-commit hook, CI and the pull request gate are unaffected. solumbe calibrate --trialgrades the arms on the first commit made on each head.scripts/hooks/check-outcomes.mjsgrades them on corrections and rework in the same Claude Code session.
- Off by default. Each change falls in a shown or a withheld arm by a hash of the repository root and its head commit;
Changed
- A check that cannot run in the current mode is
SKIPPED, notWARN, and never moves the verdict.- Local
review_gatereportedReview stateas aWARNon every run, andCompliance controlsas aWARNwhenever bouncer runs only in CI. A clean local change could never returnPASS. - Both now report
status: "SKIPPED"with a "Not checked locally" summary.verdictis stillPASS,WARNorFAIL; only a check'sstatuscan beSKIPPED, so a client that readschecks[].statusmust accept the new value. - A configured bouncer whose binary cannot be found stays a
WARN: that install is actionable. Staged mode still reportsReview stateasPASS. - The terminal, markdown,
review_verdict,solumbe pass-prand herdr trust-pane reports show a skipped check on its own line (info, not warning). A clean local run now ends "ready for a PR; skipped checks run there". solumbe eval --gate-effectivenessacceptsSKIPPEDinexpectedChecks.- The pull request gate reports it too, for evidence GitHub did not supply:
Review decisionwhen GitHub returns none,CODEOWNERSwhen the file cannot be read or an owner cannot be matched to a reviewer, andBranch protectionwhen the base branch or the protection API is unavailable. A clean pull request ends "ready to merge once review decision is confirmed". - The
companyandhigh-riskprofiles are unchanged: they require those checks to bePASS, so aSKIPPEDone still fails them. An unprotected base branch, a missing CODEOWNERS file, missing status checks and a missing approval under solo governance stillWARN. - The verdict
schemaVersionis now 3, for the new check status.
- Local
Fixed
Release disciplinefires only when aversionfield changes.- It read the version from the working tree and compared it with the base, so under
--head,--stagedor a PR whose checkout had moved on, anypackage.jsonedit looked like a version bump. 20 of the 22FAILs in a 495-PR backtest were dependency edits. - It now reads the version from the exact subject: the head commit tree, the staged index tree, or the PR head commit. It falls back to the working tree only when that copy is unavailable.
- A
package.jsonwith noversion, and a version mismatch or non-SemVer value the change did not introduce, no longer trip it. - In a Release Please repository (a
release-please-config.jsonor.release-please-manifest.jsonat the base), a version change outside a release PR is reported as "Version bumped by hand in a Release Please repository", not as a missing changelog entry. A release PR is recognised by itsrelease-please--*branch or by a change to the manifest.
- It read the version from the working tree and compared it with the base, so under
Secret safetystops flagging placeholders..env.production.local.exampleand every other*.example,*.sample,*.templateor*.distfile are templates, not secret files. Only.env.exampleand its three siblings were exempt before.- The heuristic
hardcoded credentialrule no longer runs on test files (*.spec.*,*.test.*,__tests__/), documentation, fixture directories or templates, whereaccessToken: 'valid-access-token'is a made-up value. - Known secret formats (AWS, Stripe live, GitHub, Slack and the rest) still fail in every file, test files included.