Skip to content

plan(v0.38): make v0.38.0 a YAML maintenance and technical-debt release - #931

Merged
avrabe merged 1 commit into
mainfrom
plan/v0.38-yaml-ownership
Sep 10, 2026
Merged

plan(v0.38): make v0.38.0 a YAML maintenance and technical-debt release#931
avrabe merged 1 commit into
mainfrom
plan/v0.38-yaml-ownership

Conversation

@avrabe

@avrabe avrabe commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Maintainer decision after varve reported serde_yaml unmaintained (#930). The review-surface trio moves to v0.39.0 so v0.38.0 has one theme.

What #930 got right, and what I got wrong

serde_yaml 0.90.9.34+deprecated, archived, and it reads every artifact: artifacts/, safety/stpa-sec and safety/tool-qualification are all generic-yamlGenericYamlAdapterserde_yaml::from_str (formats/generic.rs:191).

I initially claimed artifacts loaded through rivet's own rowan CST and posted that as a correction on the issue. It was wrong and is retracted there. extract_schema_driven is reached from import_with_schema, a route the configured sources don't take. My own reproduction printed [WARN rivet_core::formats::generic] — naming the module — and I read it as confirmation because the conclusion was already formed.

Three implementations, and rivet already owns the write path

path implementation share
read artifacts serde_yaml (archived) 711 (73%)
read stpa sources yaml_cst.rs rowan CST 265 (27%)
edit / write yaml_edit.rs — rivet's own, 2514 lines, 49 tests all writes

(An earlier count said the rowan path was 0% — wrong; STPA files use hazards: as top-level keys and my counter only looked for artifacts:.)

That narrows the work: the one thing serde_yaml does that rivet doesn't already do is deserialize into typed structs. A serde Deserializer over an existing CST, not a parser project.

Corrected supply-chain finding

#930 recommends unmaintained = "deny". It would not surface serde_yaml — there's no unmaintained advisory, only RUSTSEC-2018-0005 (patched in 0.8.4). Testing that revealed something larger: CI runs cargo deny check bans licenses sources — the advisories check isn't run at all, so deny.toml's thirteen reasoned ignores are dead config, and cargo-audit sits outside CI Gate's needs. Locally check advisories exits 1 today on bitmaps, im, sized-chunks.

Scope

v0.38.0 — REQ-332, 334, 343, 345, 346, 347, 348
→ v0.39.0 — REQ-333, 335, 336, plus REQ-252 out of backlog (rowan publication taken next)

REQ-349 records the varve handoff. The blocker found while planning it — rivet's CST sits on a permanent maintenance fork of rowan, so a handoff hands varve the fork it declined — was resolved by the maintainer: the fork is ours, a different proposition from forking an abandoned third-party crate. The handoff doesn't wait on crates.io. What survives is the crate boundary: consolidate with no rivet-CLI types crossing it, so extraction is later a move rather than a rewrite.

gate exit
fmt / clippy -D warnings (1.97.0) 0 / 0
cargo test --workspace 0 — 2368 passed
cargo test -p rivet-cli --test cli_commands 0 — 213 passed
validate / docs check / yamllint / diagnose_test.sh 0

Refs: FEAT-001

Maintainer decision after varve reported serde_yaml is unmaintained (#930).
The review-surface trio moves to v0.39.0 so v0.38.0 has one theme.

WHAT #930 GOT RIGHT, AND WHAT I GOT WRONG. serde_yaml 0.9 resolves to
0.9.34+deprecated, archived upstream, and it reads EVERY artifact — rivet.yaml
declares artifacts, safety/stpa-sec and safety/tool-qualification as
generic-yaml, which routes to GenericYamlAdapter and serde_yaml::from_str at
formats/generic.rs:191. I initially claimed rivet loaded artifacts through its
own rowan CST and posted that as a correction on the issue. It was wrong, and
has been retracted there. yaml_hir::extract_schema_driven is reached from
import_with_schema, a separate route the configured sources do not take. My own
reproduction printed `[WARN rivet_core::formats::generic]`, naming the module,
and I read it as confirmation because the conclusion was already formed.

THREE IMPLEMENTATIONS, NOT TWO, and rivet already owns the write path. Reading
artifacts goes through serde_yaml; editing and writing go through yaml_edit.rs,
rivet's own line-oriented editor at 2514 lines and 49 tests, whose only
serde_yaml use is one flow-mapping case; and yaml_cst.rs, a rowan CST at 1419
lines and 34 tests, serves stpa-yaml sources only. Measured split: 265
artifacts (27%) through the rowan path, 711 (73%) through serde_yaml. An
earlier count said 0% for the rowan path and was wrong — STPA files use
`hazards:` and similar as top-level keys, so a counter looking only for
`artifacts:` missed all 265.

That narrows the work considerably. The one thing serde_yaml does that rivet
does not already do itself is deserialize into typed structs for the store —
a serde Deserializer over an existing CST, not a parser project.

CORRECTED SUPPLY-CHAIN FINDING. #930 recommends setting `unmaintained = deny`.
That would NOT surface serde_yaml: there is no unmaintained advisory for it,
only RUSTSEC-2018-0005, a crash patched in 0.8.4. Testing that revealed
something larger — CI runs `cargo deny check bans licenses sources`, so the
advisories check is not run at all and deny.toml's thirteen reasoned RUSTSEC
ignores are dead configuration, while cargo-audit runs outside CI Gate's needs.
Locally `cargo deny check advisories` exits 1 today on bitmaps, im and
sized-chunks.

v0.38.0 scope: REQ-332, REQ-334, REQ-343, REQ-345, REQ-346, REQ-347, REQ-348.
Moved to v0.39.0: REQ-333, REQ-335, REQ-336, and REQ-252 out of backlog since
publishing the rowan fork is taken as the next piece of work.

REQ-349 records the varve handoff. The blocker found while planning it — that
rivet's CST is built on a permanent maintenance fork of rowan, so a handoff
would hand varve the fork it declined — was resolved by the maintainer: the
fork is ours, which is a different proposition from forking an abandoned
third-party crate, so the handoff does not wait on crates.io. What survives is
the crate boundary: consolidate behind a boundary with no rivet-CLI types
crossing it, so extraction is later a move rather than a rewrite.

Confirmed with fmt 0, clippy 1.97.0 --all-targets -D warnings 0, cargo test
--workspace 0 (2368 passed), cargo test -p rivet-cli --test cli_commands 0
(213 passed), rivet validate 0, rivet docs check 0, yamllint 0,
diagnose_test.sh 0. 318 artifacts, no duplicate ids, provenance present on all
four new artifacts.

Refs: FEAT-001
Trace: skip
@github-actions

Copy link
Copy Markdown

📐 Rivet artifact delta

Change Count
Added 4
Removed 0
Modified 0
Downstream impacted (depth ≤ 5) 0

Graph

graph LR
  REQ_346["REQ-346"]:::added
  REQ_347["REQ-347"]:::added
  REQ_348["REQ-348"]:::added
  REQ_349["REQ-349"]:::added
  classDef added fill:#d4edda,stroke:#28a745,color:#155724
  classDef removed fill:#f8d7da,stroke:#dc3545,color:#721c24
  classDef modified fill:#fff3cd,stroke:#ffc107,color:#856404
  classDef overflow fill:#e2e3e5,stroke:#6c757d,color:#495057,stroke-dasharray: 3 3
Loading
Added
  • REQ-346
  • REQ-347
  • REQ-348
  • REQ-349

📎 Full HTML dashboard attached as workflow artifact rivet-delta-pr-931download from the workflow run.

Posted by rivet-delta workflow. The graph shows only changed artifacts; open the HTML dashboard (above) for full context.

@avrabe
avrabe merged commit d9c21e9 into main Sep 10, 2026
33 checks passed
@avrabe
avrabe deleted the plan/v0.38-yaml-ownership branch September 10, 2026 06:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant