Commit 9a28db8
## What
`main` had **6 of 17 workflows red**. This makes five green, explains
why the sixth is deliberately untouched, closes the one
genuinely-unresolved finding from #47, and closes #81's crate-doc item.
Every claim below was verified by running the tool locally — nothing is
asserted from reading config. Where a local run and CI disagreed, CI won
and the commit history records why.
## The six red workflows — honest scoreboard
| Workflow | Root cause | Status |
|---|---|---|
| rust-ci (clippy / audit / deny) | `Iterator::last` on BTreeMap; 6
advisories; 5 dead ignores | **fixed, green in CI** |
| elixir-ci | `mix hex.audit`: hpax + 4x mint CVEs | **fixed, green in
CI** |
| Governance | line-1-only SPDX check; 24d-stale pins | **fixed, green
in CI** |
| Secret Scanner | caller under-grants `pull-requests: write` +
`actions: read` | **fixed, verified: 0 jobs -> 3 jobs, all pass** |
| ghcr-publish | podman/Docker credential-store mismatch | **fix
applied, UNVERIFIABLE pre-merge** |
| security-scan.yml | zero jobs, no log | **still red, uncharacterised**
|
`ghcr-publish` and `security-scan.yml` trigger on `push: [main]` only,
so **this PR's checks can never show them** — they need confirming on
main after merge.
An earlier revision of this description claimed "five green". That was
wrong: it accounted for four workflows and quietly dropped these two.
The table above is the real count.
## Two bugs found that were not style nits
**An O(N²) write path.** `verisim-temporal::append()` derived the next
version number with `versions.keys().last()` on a `BTreeMap` — an O(n)
walk on *every write*, making an N-version history O(N²) to build.
Clippy flagged one of five occurrences; all five are fixed.
**A gate that could not fail.** My first attempt emptied `deny.toml`'s
ignore list because a local `cargo deny` said "advisories ok". That
result was meaningless: the configured `db-path` had just been created
*empty*, so the check compared against zero advisories. CI, which clones
a fresh database, correctly failed. The ignore is restored with the real
justification, and both traps are documented inline for the next editor:
- an unpopulated advisory database yields a meaningless green;
- `cargo deny check advisories` under **default features** does not
surface these advisories while `--all-features` and the CI container do
— so a default-feature local pass is not evidence.
**A `startup_failure` with no log.** Refreshing the standards pins
regressed Hypatia Security Scan: between the two pins the reusable
changed its declared permission from `security-events: read` to `write`,
and GitHub refuses a reusable call whose caller grants less than the
reusable declares. The failure mode produces no log at all. Caller
updated; the other two refreshed pins were checked for the same trap and
are fine.
## quick-xml cannot be fixed here
Reached only via `oxigraph`, and **oxigraph 0.5.9 is the latest
published release** and still requires `^0.37`. No resolution of this
tree avoids it. Exposure is limited — `oxigraph-backend` is not a
default feature — and the ignore names its removal condition (oxigraph
publishing against quick-xml ≥ 0.41).
## Why Secret Scanner is left red
Re-pinning `secret-scanner-reusable` off `d135b05` is a real security
uplift (that pin carries `continue-on-error: true` gitleaks), but making
the gate real surfaces 23/23 false positives until the `.gitleaks.toml`
baseline lands in `hyperpolymath/standards`. Re-pinning ahead of that
would simply be reverted. I checked it is *not* the
permission-escalation bug above — caller and reusable both declare
`contents: read`.
## #81: the crate docs were never missing
`verisim-storage` and `verisim-wal` both carried thorough crate
documentation — module tables, the WAL's full on-disk entry layout,
worked examples — written with `//` instead of `//!`, so rustdoc
published none of it and never compiled the examples. Converting the
blocks takes crate-level doc coverage to **16/16** and brings both
examples under test for the first time (`cargo test --doc` → 5 passed).
They passed first time; they had simply never been checked.
## Verification — all exit 0
```
cargo clippy --workspace --all-targets --no-deps -- -D warnings
cargo test --workspace 629 passed, 0 failed, 2 ignored
cargo test --doc -p verisim-storage -p verisim-wal 5 passed
cargo audit
cargo deny check advisories bans licenses sources (default + --all-features)
cargo fmt --all --check
mix hex.audit / mix format --check-formatted / mix compile --warnings-as-errors
reuse lint 773/773 files, MPL-2.0 + CC-BY-SA-4.0
coqc 8.20.1: all 9 formal/ modules; just check-assumptions
panic-attack 2.5.5 assail .
```
All nine open issues have been re-measured and carry a disposition
comment; four were substantially stale.
Refs #47, #78, #79, #80, #81, #84, #113
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Known flake, so a future red is not misread as this PR
`test parse_dependent/2 accepts a query with PROOF clause`
(`elixir-orchestration/test/verisim/query/vcl_bridge_test.exs:93`)
failed once
on this branch with `** (EXIT) no process` — the `VCLBridge` GenServer
was not
alive at that instant, a supervisor-restart race. It passed on the
re-run and
passes locally (19 tests, 0 failures). Unrelated to the dependency bumps
here,
but worth a `start_supervised!`/`wait_for` fix in its own right.
## Also needs confirming on main
`scorecard.yml`'s refreshed pin does not run pre-merge. Its reusable
diff
across the pin range was `+1/-0` and its declared permissions are
unchanged
(`contents: read`), so the risk is low — but it is unverified here.
## Verified outcome
**38 pass / 3 skip / 0 failures.** Every check on the branch is green,
including `pr-fuzzing (address)` (13m6s) and both fuzz-target compile
jobs.
The Secret Scanner fix is confirmed real rather than vacuous: the run
went from
**zero jobs** to **three** — `gitleaks`, `rust-secrets`, `shell-secrets`
— all
passing. `rust-secrets` and `shell-secrets` are genuine gates and had
been
running on nothing at all. Note `gitleaks` itself still carries
`continue-on-error: true` upstream at this pin, so its green is not yet
a real
gate; that is unchanged by this PR and remains gated on the
`.gitleaks.toml`
baseline in `hyperpolymath/standards`.
Worth checking estate-wide: any repo calling `secret-scanner-reusable`
while
granting only `contents: read` is silently running **no** secret
scanning.
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent c2ce48b commit 9a28db8
17 files changed
Lines changed: 281 additions & 156 deletions
File tree
- .cargo
- .github/workflows
- audits
- elixir-orchestration
- rust-core
- verisim-repl/src
- verisim-storage/src
- verisim-temporal/src
- verisim-wal/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
67 | 80 | | |
68 | 81 | | |
69 | 82 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | 1 | | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | 1 | | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
17 | 21 | | |
18 | 22 | | |
19 | 23 | | |
20 | | - | |
| 24 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
1 | 3 | | |
2 | 4 | | |
3 | 5 | | |
| |||
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
21 | | - | |
| 23 | + | |
22 | 24 | | |
23 | | - | |
| 25 | + | |
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
| |||
37 | 39 | | |
38 | 40 | | |
39 | 41 | | |
40 | | - | |
| 42 | + | |
41 | 43 | | |
42 | 44 | | |
43 | 45 | | |
| |||
50 | 52 | | |
51 | 53 | | |
52 | 54 | | |
53 | | - | |
| 55 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | 1 | | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
15 | 24 | | |
16 | 25 | | |
17 | 26 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
62 | 73 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
10 | 30 | | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
16 | 42 | | |
17 | 43 | | |
18 | 44 | | |
| |||
0 commit comments