Skip to content

chore: release v0.0.9#12

Merged
clfhhc merged 1 commit into
mainfrom
release-plz-2026-05-27T04-44-26Z
May 27, 2026
Merged

chore: release v0.0.9#12
clfhhc merged 1 commit into
mainfrom
release-plz-2026-05-27T04-44-26Z

Conversation

@graphrefly-write-content
Copy link
Copy Markdown
Contributor

🤖 New release

  • graphrefly-core: 0.0.8 -> 0.0.9
  • graphrefly-graph: 0.0.8 -> 0.0.9
Changelog

graphrefly-core

0.0.9 - 2026-05-27

Fixed

  • d297
  • batch

graphrefly-graph

0.0.9 - 2026-05-27

Added

  • (graph) D301 — anon-dep empty-string convergence + B.a drop guard + B.b snapshot rustdoc
  • (graph) D298 — GraphObserveOne::up(messages) canonical R3.6.2 primary


This PR was generated with release-plz.

@clfhhc clfhhc merged commit 21a887e into main May 27, 2026
5 checks passed
@clfhhc clfhhc deleted the release-plz-2026-05-27T04-44-26Z branch May 27, 2026 04:54
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>
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