Skip to content

Commit ca9fe50

Browse files
hyperpolymathclaude
andcommitted
fix(ci): repair two silently-rotted crates and close the CI coverage gaps
vcl-ut has FIVE cargo workspace roots. CI covered three of them, and the two it missed had stopped compiling without anyone noticing. WHAT ROTTED `ast::Statement` gained the S1 consonance field `verb` (Select / Inspect / Verify / Assert / Declare / Retract / Merge / Split / Normalise) — the consonance turn itself. Two downstream crates were never updated: src/interface/attest E0063: missing field `verb` src/interface/recompute-wasm E0063: missing field `verb` In both cases only the in-file `#[cfg(test)]` module was stale; the libraries still built. That is why nothing downstream complained — 12 tests had simply stopped running, in the crates carrying the attestation and recompute boundaries. Fixed by supplying `verb: Verb::Select` at both sites. Both constructions are the bare `SELECT * FROM STORE "s"` case and both already used the full eight-modality `OctadSchema`, so the octad was already correct there; only the verb was missing. attest 9 tests, now green recompute-wasm 3 tests, now green Their Cargo.lock files had also drifted (recompute-wasm's recorded only the two in-repo path crates and no external deps at all — it had not been resolved since its manifest grew dependencies). Regenerated and committed. WHY IT ROTTED — coverage map, measured 2026-07-21 / e2e.yml PARTIAL (see below) /src/interface/parse parse-gate.yml full /src/interface/echidna-client backend-matrix.yml needs echidna sibling /src/interface/attest NOTHING /src/interface/recompute-wasm NOTHING New satellite-crates-gate.yml gates the last two: clippy `-D warnings` plus tests, over a matrix. Both were verified to pass `-D warnings` cleanly before the gate was added, so this is a real gate that is green, not an aspirational one. It mirrors parse-gate.yml's deliberate use of preinstalled rustup over a third-party toolchain action. `--locked` is deliberately omitted there for now, and the reason is recorded in the workflow: the lockfiles are freshly regenerated after a long ungated drift. It should be restored once a Dependabot cycle has run against them. ALSO FIXED IN e2e.yml 1. The root job ran `--test property_test` + `--test integration_test` only: 69 of the root workspace's 102 tests. Every test in tests/e2e_test.rs (20) and tests/fuzz_test.rs (13) was skipped. Now `cargo test --workspace --all-targets --locked`, verified locally at 102 passed / 0 failed. 2. Removed both "Provide echidna sibling" steps, which cloned a whole repository on every run for nothing. `src/interface` — the member that carries the external `echidna-core` path-dep — is deliberately not a root workspace member, so neither the root tests nor tests/e2e.sh ever resolve it. Verified with no sibling present: 102 tests pass, e2e.sh reports 19/19. echidna-client remains gated by backend-matrix.yml, which does need it. CORRECTION TO AN EARLIER FINDING An earlier read of this repository recorded "0 unit tests; root cargo test is a fake gate". That was wrong, and was an artefact of truncating the log to its last lines. The root crate is a re-export facade over fmt + lint, so per-crate UNIT counts are legitimately zero and the entire surface lives in tests/. The README's `tests-102 pass` badge is exact. Recorded in the e2e.yml header so the same misreading is not repeated. Verification: reuse lint -> compliant, 459/459 23 workflows -> 0 malformed cargo test --workspace --locked -> 102 passed cargo test (parse) -> 36 passed cargo test (attest) -> 9 passed cargo test (recompute-wasm) -> 3 passed bash tests/e2e.sh -> 19/19, no echidna sibling 150 tests total Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 3ba8988 commit ca9fe50

6 files changed

Lines changed: 256 additions & 11 deletions

File tree

.github/workflows/e2e.yml

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,30 @@
11
# SPDX-License-Identifier: MPL-2.0
2+
#
3+
# e2e.yml — Root-workspace test gate.
4+
#
5+
# The root workspace has four members (vcl-total, vcltotal-fmt, vcltotal-lint,
6+
# vcltotal-core) and its whole test surface lives in `tests/`, because the root
7+
# crate is a re-export facade over fmt + lint. Per-crate UNIT counts are
8+
# therefore all zero, which makes a truncated `cargo test` log look like an
9+
# empty gate; it is not. Measured 2026-07-21: 102 tests.
10+
#
11+
# tests/e2e_test.rs 20
12+
# tests/fuzz_test.rs 13
13+
# tests/integration_test.rs 59
14+
# tests/property_test.rs 10
15+
#
16+
# This job previously ran only property_test + integration_test, so 33 of the
17+
# 102 — every e2e and fuzz test — never ran in CI. It now runs the whole
18+
# workspace.
19+
#
20+
# The former "Provide echidna sibling" steps have been removed. They cloned a
21+
# whole repository on every run for nothing: `src/interface` (the member that
22+
# carries the external `echidna-core` path-dep) is deliberately NOT a root
23+
# workspace member, so neither `cargo test --workspace` nor `tests/e2e.sh`
24+
# ever resolves it. Verified 2026-07-21 by running both with no sibling
25+
# present: 102 tests pass, e2e.sh reports 19/19. echidna-client is gated
26+
# separately in backend-matrix.yml, which does need the sibling.
27+
228
name: E2E, Property and Aspect Tests
329
on:
430
push: { branches: [main] }
@@ -15,27 +41,22 @@ jobs:
1541
- name: Install Rust
1642
uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 # stable
1743
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2
18-
# echidna-core path-dependency (src/interface/Cargo.toml) — provide as sibling.
19-
- name: Provide echidna sibling
20-
run: git clone --depth 1 https://github.com/hyperpolymath/echidna ../echidna
2144
- name: Run E2E validation
2245
run: bash tests/e2e.sh
2346
property:
24-
name: Property and integration tests
47+
name: Root workspace tests
2548
runs-on: ubuntu-latest
2649
timeout-minutes: 15
2750
steps:
2851
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2952
- name: Install Rust
3053
uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 # stable
3154
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2
32-
# echidna-core path-dependency (src/interface/Cargo.toml) — provide as sibling.
33-
- name: Provide echidna sibling
34-
run: git clone --depth 1 https://github.com/hyperpolymath/echidna ../echidna
35-
- name: Run property tests
36-
run: cargo test --test property_test
37-
- name: Run integration tests
38-
run: cargo test --test integration_test
55+
# Whole workspace, all targets — not a hand-picked subset. Previously
56+
# `--test property_test` + `--test integration_test` only, which silently
57+
# skipped tests/e2e_test.rs and tests/fuzz_test.rs.
58+
- name: Run root workspace tests (expect 102)
59+
run: cargo test --workspace --all-targets --locked
3960
aspect:
4061
name: Aspect tests
4162
runs-on: ubuntu-latest
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# SPDX-License-Identifier: MPL-2.0
2+
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
3+
#
4+
# satellite-crates-gate.yml — Gates the self-contained satellite workspaces.
5+
#
6+
# vcl-ut has FIVE cargo workspace roots, not one. Before this workflow, CI
7+
# covered only three of them:
8+
#
9+
# / e2e.yml
10+
# /src/interface/parse parse-gate.yml
11+
# /src/interface/echidna-client backend-matrix.yml (needs echidna sibling)
12+
# /src/interface/attest NOTHING <- gated here
13+
# /src/interface/recompute-wasm NOTHING <- gated here
14+
#
15+
# The cost of that gap was measured on 2026-07-21: both ungated crates had
16+
# stopped compiling. `ast::Statement` gained the S1 consonance field `verb`
17+
# (DECLARE / ASSERT / RETRACT / MERGE / ...), and neither crate's test module
18+
# was updated, so both failed with E0063 `missing field 'verb'`. Their
19+
# libraries still built, so nothing downstream noticed; 12 tests had simply
20+
# stopped running. Silent rot in exactly the crates that carry the
21+
# attestation and recompute boundaries.
22+
#
23+
# Both crates are self-contained (in-repo path deps only), so unlike
24+
# echidna-client they need no sibling checkout and can be gated cheaply.
25+
#
26+
# Tracked: vcl-ut#25.
27+
28+
name: Satellite Crates Gate
29+
30+
on:
31+
pull_request:
32+
branches: ['**']
33+
push:
34+
branches: [main, master]
35+
36+
permissions:
37+
contents: read
38+
39+
concurrency:
40+
group: ${{ github.workflow }}-${{ github.ref }}
41+
cancel-in-progress: true
42+
43+
jobs:
44+
satellite-gate:
45+
name: ${{ matrix.crate }} — clippy / tests
46+
runs-on: ubuntu-latest
47+
timeout-minutes: 15
48+
49+
strategy:
50+
fail-fast: false
51+
matrix:
52+
crate: [attest, recompute-wasm]
53+
54+
steps:
55+
- name: Checkout repository
56+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
57+
58+
# rustup is preinstalled on ubuntu-latest; no third-party action
59+
# (avoids the action-pinning / deprecated-cache hazards). Mirrors
60+
# parse-gate.yml deliberately.
61+
- name: Pin toolchain + components
62+
run: |
63+
set -euo pipefail
64+
rustup show active-toolchain || rustup default stable
65+
rustup component add clippy
66+
cargo --version && cargo clippy --version
67+
68+
# Operate via the manifest path so CI never traverses the parent
69+
# virtual workspace, whose `src/interface` member carries an external
70+
# path-dep that does not resolve in a standalone checkout.
71+
#
72+
# `--locked` is deliberately NOT used: these two lockfiles drifted while
73+
# the crates were ungated. They are regenerated and committed as part of
74+
# the repair; once a Dependabot cycle has run against them, `--locked`
75+
# should be restored here to make lockfile drift itself a gate.
76+
- name: Clippy — warnings are errors
77+
run: |
78+
set -euo pipefail
79+
cargo clippy --manifest-path src/interface/${{ matrix.crate }}/Cargo.toml \
80+
--all-targets -- -D warnings
81+
82+
- name: Tests
83+
run: |
84+
set -euo pipefail
85+
cargo test --manifest-path src/interface/${{ matrix.crate }}/Cargo.toml

src/interface/attest/Cargo.lock

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/interface/attest/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ mod tests {
226226
linear_annot: None,
227227
epistemic_clause: None,
228228
requested_level: SafetyLevel::ParseSafe,
229+
// S1 consonance verb. A bare `SELECT * FROM STORE "s"` is the
230+
// epistemically-neutral read, so `Select` is the right witness
231+
// here; the attestation path is verb-agnostic.
232+
verb: Verb::Select,
229233
}
230234
}
231235

src/interface/recompute-wasm/Cargo.lock

Lines changed: 98 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/interface/recompute-wasm/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ mod tests {
181181
linear_annot: None,
182182
epistemic_clause: None,
183183
requested_level: SafetyLevel::ParseSafe,
184+
// S1 consonance verb — see the comment above: this is the plain
185+
// `SELECT` read, the neutral case for the recompute boundary.
186+
verb: Verb::Select,
184187
};
185188
let m = |modality, fields| ModalitySchema { modality, fields };
186189
let sc = OctadSchema {

0 commit comments

Comments
 (0)