Skip to content

#470 — raw_dag nodes + node_map.compiled (N→1, omit-on-ambiguous) - #476

Merged
cmbays merged 2 commits into
mainfrom
adapters-470-raw-dag-nodes
Jun 23, 2026
Merged

cmbays merged 2 commits into
mainfrom
adapters-470-raw-dag-nodes

Conversation

@cmbays

@cmbays cmbays commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

What landed

S2 of the raw⇄compiled DAG spine (epic #468): the raw structural DAG nodes

  • the N→1 node_map.compiled correspondence, projected once from the
    assembled SourceMap into code_map. New Serialize-only PODs in
    src/adapters/render.rs beside CodeMapPayload/gather_raw_zones:
    RawDagNodePayload { id, role, is_zone, presence }, RawDagPayload { nodes },
    NodeMapPayload { compiled } — all omit-when-empty so pre-Raw structural DAG nodes + node_map.compiled (N→1, partial) #470 goldens stay
    byte-stable.

The three honesty rules

  • omit-on-ambiguous — a compiled node with no UNIQUE raw origin omits its
    key (covered by macro-CTE-no-unique-origin-omits + ambiguous-two-zones).
  • sound literal nodes — every raw node is a real lexical region of
    raw_code, never a predicted/fabricated node (nodes-sound).
  • WITH-less terminal totality + fanned→one-template — one terminal raw node
    for a WITH-less model (with-less-single-terminal); all fanned compiled CTEs
    map back to the ONE zone (fanned-nodes-map-to-one-template).
  • A pruned {% if is_incremental() %} zone is compiled_out, never
    compiled_in (incremental-guard-compiled_out).

TDD tests (before impl)

raw_dag_nodes_are_sound_literal_regions_with_a_compiled_in_cte ·
with_less_model_emits_exactly_one_terminal_raw_node ·
fanned_compiled_nodes_map_to_one_template_zone ·
compiled_node_with_no_unique_origin_omits_its_key ·
ambiguous_two_containing_zones_omits_the_key ·
incremental_guard_zone_node_is_compiled_out_never_compiled_in ·
no_raw_structure_omits_both_keys_for_byte_stable_goldens ·
raw_dag_and_node_map_serialize_with_stable_wire_shape.

Goldens note

All example reports flipped: code_map JSON grew with raw_dag.nodes +
node_map.compiled. Regenerated + byte-verified (deterministic re-render
confirmed). The jaffle-shop chrome insta snapshot was accepted — the diff is
only the additive raw_dag/node_map blocks. The source-map completeness
guard stays green (it asserts dag.nodes ⊆ code_map.node_spans, unaffected).

Dogfood fixture

New incremental-showcase GOLDEN — a synthetic manifest whose fct_events
wraps an inner CTE inside {% if is_incremental() %} and whose compiled_code
is the fresh-build shape (guard pruned). The regenerated golden shows the
verbatim base CTE as compiled_in and the pruned guard as a first-class
compiled_out zone raw node — the honest incremental-CTE visibility the spine
was built for. compiled_code is hand-authored (no real dbt compile) → no
root_path/username leak. Listed in MANIFEST.toml (synthetic_only), wired
as an example-report-check matrix row.

Edges deferred to S3

Edges + node_map.raw (1→N, observed) are S3 (#471) and are not built here
— the payloads carry only nodes + node_map.compiled, never a faked edge or
empty-but-faked field. The projection (code_map JSON) is the S2 consumer;
tests assert its shape.

Closes #470

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added incremental SQL example showcase demonstrating incremental model patterns with generated report output
    • Enhanced model reports with structured DAG information and detailed node mapping from compiled to source code
  • Documentation

    • Updated example reports with refreshed dbt artifact data reflecting current model definitions
  • Tests

    • Added comprehensive test fixtures for incremental SQL rendering and model analysis scenarios

…n-ambiguous)

S2 of the raw⇄compiled DAG spine (epic #468). Delivers the raw structural
DAG NODES + the N→1 compiled⇄raw correspondence, projected once from the
assembled SourceMap into code_map. Edges + node_map.raw (1→N, observed) are
S3 (#471) and are deliberately ABSENT here — never faked.

What landed (in src/adapters/render.rs, beside CodeMapPayload/gather_raw_zones):
- RawDagNodePayload { id, role: cte|terminal|zone, is_zone, presence } +
  RawDagPayload { nodes } + NodeMapPayload { compiled } — Serialize-only
  projections, omit-when-empty so pre-#470 goldens stay byte-stable.
- build_raw_dag_and_node_map: every node a SOUND literal raw_code region —
  verbatim WITH CTEs (via the SHARED #469/#473 masking scan, presence
  compiled_in), the #448 zone entries (honest 3-state presence), and a
  WITH-less model → exactly ONE terminal raw node (mirrors from_cte_graph's
  terminal synthesis) so node_map.compiled stays total.
- node_map.compiled (compiledId → rawId, N→1): verbatim-CTE identity, the
  WITH-less terminal, else a unique structural-containment fold to the ONE
  template zone (the {% for %}-fanned CTEs). unique_containing_zone returns
  None on zero-or-multiple → the key is OMITTED, never a guessed rawId.

The three honesty rules:
- omit-on-ambiguous: a compiled node with no UNIQUE raw origin omits its key.
- sound literal nodes: every raw node is a real lexical region of raw_code
  (never a predicted/fabricated node).
- WITH-less terminal totality + fanned→one-template: one terminal raw node
  for a WITH-less model; all fanned compiled CTEs map back to the ONE zone.
A pruned {% if is_incremental() %} zone is compiled_out (NEVER compiled_in).

TDD (tests before impl, render.rs test module):
nodes-sound · with-less-single-terminal · fanned-nodes-map-to-one-template ·
macro-CTE-no-unique-origin-omits · ambiguous-two-zones-omits ·
incremental-guard-compiled_out · no-raw-structure-omits-both (byte-stable) ·
serialize-wire-shape.

Dogfood fixture: incremental-showcase GOLDEN — a SYNTHETIC manifest whose
fct_events wraps an inner CTE inside {% if is_incremental() %} and whose
compiled_code is the fresh-build shape (guard PRUNED), so the regenerated
golden shows the verbatim `base` CTE as compiled_in and the pruned guard as a
first-class compiled_out zone raw node. Hand-authored compiled_code (no real
dbt compile) → no root_path/username leak; listed in MANIFEST.toml,
synthetic_only.

Goldens: all example reports flipped (code_map JSON grew with raw_dag.nodes +
node_map.compiled); regenerated + byte-verified. jaffle-shop chrome snapshot
accepted (additive raw_dag/node_map only). Source-map completeness guard,
fixture-manifest gate, fmt, clippy --all-targets --locked, full nextest, BDD,
cargo doc -D warnings, cargo deny, crap4rs all green.

Closes #470

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199AmBCec5kyVEEF1Qd7TSF
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai

coderabbitai Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@cmbays, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 30 minutes and 21 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses rolling per-developer review limits. Reviews become available again as older review attempts age out of the rolling limit window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: be92212c-644b-4094-b2c6-2da9f955b4ff

📥 Commits

Reviewing files that changed from the base of the PR and between f69080a and 46e4a4f.

📒 Files selected for processing (1)
  • src/adapters/render.rs
📝 Walkthrough

Walkthrough

Adds raw_dag and node_map optional fields to CodeMapPayload in src/adapters/render.rs. New structs synthesize raw structural DAG nodes (verbatim CTEs, terminal for WITH-less models, zone nodes with Presence) and fold compiled nodes back to unique raw origins. New incremental-showcase fixture files and a CI matrix entry validate the incremental-CTE path. Affected golden HTML examples are regenerated.

Changes

Raw DAG projection and incremental-showcase validation

Layer / File(s) Summary
New payload types and CodeMapPayload extension
src/adapters/render.rs
Imports Presence, adds RawDagNodePayload, RawDagPayload, NodeMapPayload structs, and extends CodeMapPayload with optional raw_dag and node_map fields omitted when empty.
Raw DAG construction and node_map folding logic
src/adapters/render.rs
Implements build_raw_dag_and_node_map: synthesizes verbatim CTE raw nodes, one terminal for WITH-less models, zone nodes with Presence-derived strings, and folds compiled nodes to unique raw origins via unique_containing_zone, omitting keys on ambiguity or absence.
Unit tests for raw DAG and node_map projection
src/adapters/render.rs
Adds tests for serialization shape, verbatim CTE vs WITH-less terminal synthesis, zone-folding, omission on ambiguous containment, compiled_out presence for pruned incremental guard zones, and byte-stability on empty payloads.
Incremental-showcase fixture content
tests/fixtures/incremental-showcase-current.json, tests/fixtures/incremental-showcase-pr-diff.patch, tests/fixtures/incremental-showcase-source/models/...
Adds fixture JSON (fct_events incremental model, stg_events, unit test rows), PR diff patch for fct_events.sql, and working-tree SQL sources for both models.
Fixture MANIFEST entries and CI matrix wiring
tests/fixtures/MANIFEST.toml, .github/workflows/ci.yml
Registers four new incremental-showcase fixture files in MANIFEST.toml and adds a new example-report-check CI matrix row running in report/pr_diff mode outputting examples/incremental-showcase-report.html.
Regenerated golden HTML examples
examples/jaffle-shop-report.html, examples/comments-showcase-report.html, examples/explore-seed/tests.html, examples/prdiff-minidag-report.html, examples/seed-showcase-report.html
Updates embedded cute-dbt-data JSON payloads: jaffle-shop gains raw_dag/node_map fields; other examples reflect upstream data changes (rename, field additions, span offset shifts, seed diff updates).

Sequence Diagram(s)

sequenceDiagram
    participant Renderer as CodeMapPayload::from_source_map
    participant Builder as build_raw_dag_and_node_map
    participant SourceMap as SourceMap / node_spans
    participant Payload as CodeMapPayload (JSON output)

    Renderer->>Builder: call with assembled SourceMap + compiled node_spans
    Builder->>SourceMap: iterate CteBody raw spans (verbatim anchors)
    SourceMap-->>Builder: verbatim CTE raw nodes
    Builder->>SourceMap: check for WITH-less model
    SourceMap-->>Builder: synthesize single terminal raw node
    Builder->>SourceMap: iterate SpanRole::Zone entries
    SourceMap-->>Builder: zone nodes with Presence strings
    Builder->>SourceMap: fold each compiled DAG node via unique_containing_zone
    SourceMap-->>Builder: compiledId → rawId (omit on zero/multiple matches)
    Builder-->>Renderer: RawDagPayload + NodeMapPayload
    Renderer->>Payload: attach raw_dag + node_map (skip if empty)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • #470 (Raw structural DAG nodes + node_map.compiled): This PR directly implements all acceptance criteria from #470 — raw_dag.nodes POD with id/role/is_zone/presence, WITH-less single terminal synthesis, node_map.compiled with omit-on-ambiguous folding, fanned compiled nodes mapping to one template raw node, and goldens regenerated with new incremental-showcase fixtures.

Possibly related PRs

  • breezy-bays-labs/cute-dbt#63: Both PRs modify the example-report-check CI job — the retrieved PR introduced the matrix structure that this PR extends with the new incremental-showcase row.
  • breezy-bays-labs/cute-dbt#453: This PR adds raw_dag/node_map fields on top of the CodeMapPayload/node_spans rendering spine introduced in the retrieved PR.
  • breezy-bays-labs/cute-dbt#465: The new zone raw node construction explicitly consumes SpanRole::Zone and Presence machinery from the raw-Jinja zone projection work in the retrieved PR.

Poem

🐇 Hop hop, the DAG is raw and real,
With zones and CTEs I can feel.
No ambiguous keys shall pass my gate —
Unique match only, or omit its fate!
The incremental guard sits compiled_out,
And goldens gleam without a doubt. ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: implementing raw structural DAG nodes and N→1 node_map.compiled correspondence, directly matching the substantial work in src/adapters/render.rs and the PR objectives.
Linked Issues check ✅ Passed All acceptance criteria from #470 are met: raw_dag nodes with id/role/is_zone/presence implemented, WITH-less models emit exactly one terminal node, node_map.compiled uses unique-match fold with omit-on-ambiguous, {% for %}-fanned nodes map to one template, TDD tests created, goldens regenerated and byte-verified.
Out of Scope Changes check ✅ Passed All changes are directly scoped to #470 objectives: render.rs implements the core stage-2 DAG spine logic, fixture updates enable testing of incremental CTEs, workflow and example reports are regenerated goldens reflecting the new payloads.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch adapters-470-raw-dag-nodes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

📄 Rendered report preview

All golden examples regenerated cleanly.

🟡 Golden examples

Committed to examples/ and byte-identity gated — the canonical reports contributors and consumers browse. Stable across PRs.

Report View Download
prdiff-minidag-report.html ▶ Open ↗ ⬇ Download
playground-report.html ▶ Open ↗ ⬇ Download
macro-heavy-report.html ▶ Open ↗ ⬇ Download
seed-showcase-report.html ▶ Open ↗ ⬇ Download
diff-showcase-report.html ▶ Open ↗ ⬇ Download
jaffle-shop-report.html ▶ Open ↗ ⬇ Download

🐶 Live dogfood preview

This PR doesn't touch dbt-project/, so there's no live dogfood preview.

🧭 Explore preview

The two-page cute-dbt explore explorer — dag.html (model lineage) + tests.html (unit-test viewer). Same golden/live split as the report.

🟡 Golden explore

The committed examples/explore/ playground golden (the full synthetic playground manifest). Byte-identity gated in Example report check. Stable across PRs.

Page View Download
explore/dag.html ▶ Open ↗ ⬇ Download
explore/tests.html ▶ Open ↗ ⬇ Download

🐶 Live explore

This PR doesn't touch dbt-project/, so there's no live explore preview.

▶ Open ↗ opens the report or explorer in your browser in one
click — published to this repo's GitHub Pages under
/pr-476/.
⬇ Download fetches the same self-contained HTML as a workflow
artifact (auth-gated; works fully offline). Either way the report
makes zero external resource requests.

The Pages preview may take ~1 min to update after this comment
posts. On PRs from forks the Open link is unavailable (read-only
token) — use Download.

Alternative: GitHub CLI
# gh CLI >= 2.63 extracts into ./report-preview-playground/.
gh run download 28005704936 -R breezy-bays-labs/cute-dbt -n report-preview-playground
open report-preview-playground/playground-report.html

Posted by report-preview.yml for 46e4a4fec5dbeffee9e575f953dc12bf33cba473. Affordance only — never blocks merge.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a raw structural DAG representation and a compiled-to-raw node mapping (node_map.compiled) to capture literal raw_code regions before Jinja expansion, such as verbatim CTEs, WITH-less terminals, and control zones. It includes comprehensive unit tests and synthetic test fixtures to validate these changes. The review feedback focuses on performance optimizations in src/adapters/render.rs to eliminate unnecessary string allocations and clones. Specifically, the reviewer suggests refactoring unique_containing_zone to return a zone index (Option) rather than an owned String, storing only Option in zone_compiled, and formatting the zone_id on the fly.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread src/adapters/render.rs
Comment thread src/adapters/render.rs Outdated
Comment thread src/adapters/render.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/adapters/render.rs`:
- Around line 555-568: The issue is that entry.compiled (which is just a single
anchor span from resolve_zone_compiled) is being stored in zone_compiled and
later used by unique_containing_zone for containment checking, but this anchor
does not represent the full compiled expansion of the zone. This causes {% for
%}-fanned CTEs to not be properly contained by the zone span, resulting in
missing mappings in node_map.compiled. Store or derive a true compiled expansion
span for each zone before pushing to the zone_compiled vector instead of using
entry.compiled. Additionally, add an end-to-end test that builds the SourceMap
through append_zone_entries rather than hand-authoring the full zone_compiled
span to ensure all {% for %}-fanned compiled CTEs properly map back to their raw
nodes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 334952ef-81b2-4871-afcf-a8d33b10998f

📥 Commits

Reviewing files that changed from the base of the PR and between 593c10f and f69080a.

⛔ Files ignored due to path filters (1)
  • tests/snapshots/render_integration__rendered_chrome_jaffle_shop.snap is excluded by !**/*.snap
📒 Files selected for processing (17)
  • .github/workflows/ci.yml
  • examples/comments-showcase-report.html
  • examples/diff-showcase-report.html
  • examples/explore-macro/tests.html
  • examples/explore-seed/tests.html
  • examples/explore/tests.html
  • examples/incremental-showcase-report.html
  • examples/jaffle-shop-report.html
  • examples/playground-report.html
  • examples/prdiff-minidag-report.html
  • examples/seed-showcase-report.html
  • src/adapters/render.rs
  • tests/fixtures/MANIFEST.toml
  • tests/fixtures/incremental-showcase-current.json
  • tests/fixtures/incremental-showcase-pr-diff.patch
  • tests/fixtures/incremental-showcase-source/models/marts/fct_events.sql
  • tests/fixtures/incremental-showcase-source/models/staging/stg_events.sql

Comment thread src/adapters/render.rs Outdated
…efer fanned→zone mapping to S3 (CodeRabbit Major)

`build_raw_dag_and_node_map` folded compiled CTEs to a template zone via
`unique_containing_zone`, which checked whether a zone's `entry.compiled`
span CONTAINS the compiled node. But `entry.compiled` (from
`resolve_zone_compiled`) is a single unambiguous literal ANCHOR (one
≥3-char fragment), NOT the zone's compiled EXTENT — so it can never
contain the separate fanned CTE bodies. The branch was dead in every real
golden, and the test `fanned_compiled_nodes_map_to_one_template_zone`
masked this by hand-authoring an unrealizable span covering two CTE
bodies. CodeRabbit (Major) flagged it correctly.

Honest rescope: S2 now maps ONLY uniquely-locatable origins — a verbatim
CTE (same id) and the WITH-less terminal. Fanned/macro CTEs have no
uniquely-locatable raw origin in S2 and are honestly OMITTED (never a
guessed rawId). The observed fanned→zone mapping needs the zone's
compiled EXTENT + node_map.raw, so it lands in S3 #471.

- Remove the zone-containment fold branch + the `zone_compiled` vec it fed
  (the zone raw NODES are still emitted, unchanged).
- Delete the now-unused `unique_containing_zone` fn.
- Rewrite `fanned_compiled_nodes_map_to_one_template_zone` →
  `fanned_cte_with_no_verbatim_raw_origin_is_omitted_in_s2` (a realistic
  anchor, asserts the fanned CTEs are OMITTED + the zone node is present).
- Delete `ambiguous_two_containing_zones_omits_the_key` (tested the deleted
  fn; the omit-on-ambiguous concern moves to S3's observed mapping).

All goldens stay byte-identical (the branch was dead in all real goldens).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199AmBCec5kyVEEF1Qd7TSF
@cmbays

cmbays commented Jun 23, 2026

Copy link
Copy Markdown
Contributor Author

Revision — honest rescope (CodeRabbit Major, 46e4a4f)

CodeRabbit's Major flag was correct and I verified it against the code: a zone's entry.compiled (from resolve_zone_compiled) is a single unambiguous literal anchor, not the zone's compiled extent — so unique_containing_zone's containment check could never contain the separate {% for %}-fanned CTE bodies. The fold branch was dead in every committed golden, and the original fanned_compiled_nodes_map_to_one_template_zone test hand-authored an unrealizable span (rs(0, 51) covering two CTE bodies) — i.e. it validated a fiction.

The product was always honest (it omits, never fabricates — never-a-false-claim held), but S2's fan-out mapping was not actually delivered and the test misled. Rather than ship that, I rescoped to match the design's own "omit when not uniquely locatable" principle:

  • S2 now maps only uniquely-locatable origins — verbatim-CTE identity + the WITH-less synthesized terminal. A fanned/macro compiled CTE has no uniquely-locatable raw origin in S2, so it is honestly omitted from node_map.compiled (never a guessed rawId).
  • Removed the dead unique_containing_zone fold + the zone_compiled tracking (this also moots the three gemini perf/style notes on that code).
  • The observed fanned→zone mapping moves to S3 (raw_dag edges + node_map.raw (1→N, observed) #471) — which must derive the zone compiled extent anyway for node_map.raw (1→N observed). S3 builds the extent once and can populate both directions.
  • Tests: replaced the fiction test with an honest fanned_cte_with_no_verbatim_raw_origin_is_omitted_in_s2; removed ambiguous_two_containing_zones_omits_the_key (it exercised the deleted fn). All other S2 tests retained.
  • Goldens byte-identical (the removed fold was dead — confirmed git diff --exit-code -- examples/ clean). All gates green by raw exit.

Zone raw nodes are still emitted with their honest 3-state presence; only the unsound compiled→zone fold is deferred. Net: S2 delivers what it can prove, S3 delivers the observed fan-out.

@cmbays
cmbays merged commit eaaa9c7 into main Jun 23, 2026
46 checks passed
@cmbays
cmbays deleted the adapters-470-raw-dag-nodes branch June 23, 2026 06:07
github-actions Bot added a commit that referenced this pull request Jun 23, 2026
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.

Raw structural DAG nodes + node_map.compiled (N→1, partial)

1 participant