chore: release v0.0.9#12
Merged
Merged
Conversation
clfhhc
added a commit
that referenced
this pull request
May 27, 2026
…res + hash refresh Adversarial /qa surfaced 2 design questions + 7 mechanical fixes. Two subagents (Blind Hunter + Edge Case Hunter) ran in parallel against the 5 graphrefly-rs commits + 1 graphrefly-ts commit. Substrate behavior of D298/D300/D301 verified clean by both reviewers; this commit lands the QA follow-ups. # G1.1 — D301 B.a/B.b coupling failure (Blind #12, major behavioral) Pre-/qa framing treated B.a (drop `NameError::ReservedPrefix` guard) and B.b (keep `_anon_<rawid>` snapshot marker) as orthogonal sub-decisions. They aren't: B.a let users register `_anon_42` as a node name; B.b emitted `_anon_42` for unresolvable cross-mount deps with NodeId(42). `SnapshotError::UnresolvableDeps` Debug-format diagnostic became ambiguous. **Fix (Q4-B.b post-/qa user-locked option (c)):** change snapshot marker format to `_anon::<rawid>` instead of `_anon_<rawid>`. The `::` is the canonical `PATH_SEP` which `validate_name` rejects — user-named nodes CANNOT register names containing `::`, so the marker is **structurally impossible as a user node name**. Restores marker uniqueness without re-adding the user-name guard (B.a's "true convergence" story preserved). Pre-lock micro-check confirmed `validate_name` only rejects `::` (not `<>:` individually) so the sigil-with-`::` form is the only structurally-rejected option. # G1.2 — D300 cascade scope rustdoc (Blind #5, minor) Add invariant-scope note on `Core::set_deps` block "2b": the cascade heals only staleness introduced by THIS `set_deps` call (one-call-at- a-time, NOT global-after-every-call). Pre-D300 set_deps calls that left consumers with stale ranks are NOT healed unless n's own rank changes — unreachable on a clean main-branch but worth pinning. Speculative full-scan debug-assert rejected per D196 + value #11. # G2.6 — D300 BFS self-edge symmetric defense (Blind #8, minor) Add `if child_id == n { continue; }` after `visited.insert(child_id)` to make seed-step defense symmetric with the inner recompute's `filter(|dr| dr.node != child_id)`. Defense-in-depth even though set_deps rejects self-loops structurally. # G2.7 — D300 saturating_add overflow debug-canary (Blind #6, minor) Add `debug_assert!(max_dep_rank < u32::MAX, ...)` in the BFS recompute. Practically unreachable (~4B-deep dep chain) but catches silent glitch-free-scheduling degradation in test builds rather than silently saturating. # G2.3 — Bench bindings rustdoc updated for empty-string render `crates/graphrefly-bindings-js/src/core_bindings.rs:1953-1956` previous rustdoc claimed "JS wrapper renders them as `_anon_<id>`, matching `describe_inner`'s unnamed-dep rule" — stale post-D301 (`describe_inner` now renders `""`). Updated to reflect the post-D301 empty-string convention + persistence-vs-presentation split. `index.d.ts` will regenerate on next napi build. # G2.4 — profile.rs:183 comment updated Comment cited "describe()'s `_anon_<id>` fallback path" — stale post-D301. Rewrote to "describe-shape invariant skip" with explicit post-D279 + post-D301 reference framing. # G2.5 — Drop stale line numbers in D301 rustdocs Per user preference: symbol citations (`describeNode`, `edges_in`, `crate::snapshot::snapshot_of`, `crate::SnapshotError::UnresolvableDeps`) are durable; line numbers drift with every refactor. Dropped citations to `describe.rs:229` + `graph.rs:1055` + `packages/pure-ts/src/core/meta.ts:257` from D301 rustdocs in `describe.rs::NodeDescribe.deps` + `describe.rs` unnamed-dep map closure + `graph.rs::edges_in` closure. # G2.2 — Stage 1 sweep follow-on: 3 D301-adjacent porting-deferred entries Edge Case Hunter F2/F3/F4 — the initial Stage 1 sweep missed three entries D301 closes/supersedes: - `porting-deferred.md` "Anonymous Core nodes surface as `_anon_<NodeId>`" — CLOSED by D301 B (describe converges to `""`) + D301 B.b (snapshot retains marker as `_anon::<rawid>`); pre-D301 "lift point" (`describe({ include_anon: true })` mode) obsoleted. Struck through. - `porting-deferred.md` "`_anon_<id>` deps could collide with a user-named node" — Slice V3 resolution MECHANISM superseded by D301 /qa. Original "RESOLVED 2026-05-13 (Slice V3)" preserved with a 2026-05-26 supersession note: the `NameError::ReservedPrefix` guard was deleted by D301 B.a; the collision invariant is now preserved by the `_anon::<rawid>` marker's structural rejection via `::` PATH_SEP. - `porting-deferred.md` "D1 — `edges()` cross-graph deps surface as `_anon_<id>` for sibling-graph nodes" — namespace-scoping concern unchanged; format wording updated (`_anon_<id>` → `""`) per D301 B. # G2.1 — Stale commit hashes (Blind #16/#17, minor) The graphrefly-rs commits got rebased on top of `dda5dab chore: release v0.0.9` between the original landing and this /qa pass. Original hashes `6fadc5d` / `7d2721d` / `1f7c5c7` are now orphans; canonical main-branch hashes are `e9d1e7a` / `a89e519` / `9267779` (D298 / D300+D299 / D301). `docs/migration-status.md` snapshot updated. Companion graphrefly-ts commit updates `docs/rust-port-decisions.md` D298-D301 entries + `docs/cross-track-ledger.md` §1 D298 + D301 rows + adds anti-pattern #12 (orthogonality-sketch micro-check) to the decision-guard skill. # Gate cargo nextest -p graphrefly-core 308/308 + -p graphrefly-graph 139/139 GREEN. cargo clippy clean. cargo fmt clean. `#![forbid(unsafe_code)]` preserved. No new tests landed — all 7 fixes are defensive doc/marker/ assertion updates exercised by the existing D300 + D301 + observe test suites. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🤖 New release
graphrefly-core: 0.0.8 -> 0.0.9graphrefly-graph: 0.0.8 -> 0.0.9Changelog
graphrefly-coregraphrefly-graphThis PR was generated with release-plz.