Skip to content

#57 — source() binding: extend messy-import-CTE fallback to dbt source() references - #204

Merged
cmbays merged 8 commits into
mainfrom
domain-57-source-binding
Jun 11, 2026
Merged

cmbays merged 8 commits into
mainfrom
domain-57-source-binding

Conversation

@cmbays

@cmbays cmbays commented Jun 11, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Extends the messy-import-CTE fallback (#34 / PR 17) to dbt source('a', 'b') references — the v0.2-deferred half of #34. dbt compiles {{ source('a','b') }} into the resolved relation at compile time, so binding resolves the authored pair through the manifest's top-level sources block instead of the compiled SQL.

Closes #57

What changed

  • Domain — SourceNode POD (separate type, not a Node kind-variant: sources carry no checksum, and fusion keeps them a distinct type end-to-end) + Manifest.sources map. Manifest::with_sources builder (the Node::with_column_descriptions precedent — 40 existing Manifest::new call sites untouched); source_by_name resolves the authored (source_name, name) pair case-insensitively.
  • Adapter (manifest) — WireSource tolerant projection: every field #[serde(default)] Option per the feat: surface incremental-model unit-test semantics (incremental badge + expect=merged-rows tooltip) #145 engine-divergence rule (dbt-core emits explicit nulls; fusion omits keys entirely). A degenerate entry never fails the manifest (ADR-5) — it just never matches, fail-open.
  • Adapter (render) — parse_source_ref, the exact sibling of parse_ref_name (both engines serialize given[].input verbatim; source() takes exactly two args — fusion-source-verified, SHA-pinned in the research note). Binding flow: resolve the pair → derive the leaf token (identifier → last segment of relation_name → name, quote-stripped) → feed through the existing two-pass find_import_node_id. No new matching machinery, no preflight change, no new PreflightError variant (sources are referenced by models, never analyzed).
  • Node detail panel — surfaces the bound given via the existing bound_to_node + interaction.js filter; zero template changes (kept clear of builder-198's surface).
  • Fixture — tests/fixtures/ref-and-source-import-cte.json: a model with BOTH a ref-based and a source-based import CTE, unit test mocking both, sources block in both engine dialects (core-style explicit nulls + fusion-style absent keys). Registered in tests/fixtures/MANIFEST.toml (synthetic_only = true, SHA-256 pinned).
  • Docs — README: removed the now-closed "source() references are not bound" fidelity limit (replaced with the residual authored-form caveat) and documented the sources-resolution hop in the Import-CTE binding section. AUDIT.md has no messy-import-CTE narrative section — its §4 fixture-provenance index picks the new fixture up mechanically via MANIFEST.toml, so no AUDIT.md edit was needed.

Tests

  • Domain: POD accessors, serde round-trips (incl. fusion-minimal absent keys), pre-feature: source() binding — extend messy-import-CTE fallback to dbt source() references #57 manifests deserialize to an empty sources map, pair-lookup hit/miss/case-insensitivity.
  • Adapter: core-style (explicit-null) entry, fusion-style (absent-key) entry, degenerate-entry tolerance.
  • Render: full parse_source_ref suite mirroring parse_ref_name's, token-derivation fallbacks (identifier override, embedded-quote "GROUP" case, relation-name fallback, name fallback), payload binding (canonical with source as (…) shape, identifier override, fusion-minimal entry, unresolvable pair → unbound, no-sources-map → unbound, ref+source mixed test binding each given to its own CTE).
  • Integration: file → Stage-1 → sources → payload binding against the committed fixture.
  • Headless (Chrome, verified locally): clicking the source-bound CTE renders the given's fixture card in the Node-detail panel — input name, mocked rows, no empty-state copy.

Gates (all run directly — lefthook skips in fresh worktrees)

Gate Result
cargo fmt --check pass
cargo clippy --all-targets --locked -- -D warnings pass (exit 0)
cargo nextest run 1079 passed
cargo test --test bdd 14 features / 109 scenarios / 684 steps passed (no new scenarios → feature-count gates untouched)
cargo test --test headless_zero_egress --locked -- --ignored 2 passed
cargo test --test headless_toggle --locked -- --ignored 37 passed (incl. the new #57 test)
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --locked pass
cargo deny check pass
cargo llvm-cov + crap4rs --config crap4rs.toml PASS — 0 above threshold 25, worst 23.0

Goldens

All three golden examples (jaffle-shop, playground, diff-showcase) regenerated per the example-report-check matrix — zero byte diff, as expected: no committed example carries a source() given yet, and the binding adds no payload keys to ref-only reports.

Coordination

Real-fixture verification vs the regenerated playground pair lands when #64 merges; this PR will rebase + verify then (the playground at c8270a4 carries test_stg_synthea__patients_renames_and_hashes_source_columns with input: source('synthea_raw', 'patients') — exactly the canonical shape this PR's synthetic fixture mirrors). This PR deliberately does not touch tests/fixtures/playground-*, examples/playground-report.html, or any template/CSS surface.

🤖 Generated with Claude Code


Open in Stage

Summary by CodeRabbit

Release Notes

  • New Features

    • Added support for binding source() calls in unit test givens, enabling unit tests to resolve source-based import CTEs alongside existing ref() support.
  • Documentation

    • Updated documentation clarifying source() parsing limits in unit test givens (positional single-quoted form only) and refined Import-CTE binding behavior for source resolution with fallback handling.

github-actions Bot and others added 4 commits June 10, 2026 21:49
…, name) lookup

The cute-dbt#57 domain widening: a separate SourceNode POD (not a Node
kind-variant — sources carry no checksum and dbt keeps them a distinct
type end-to-end), keyed by the wire map key in a new
Manifest.sources map. Manifest::with_sources follows the
Node::with_column_descriptions builder precedent so the 40 existing
Manifest::new call sites stay untouched; source_by_name resolves the
authored (source_name, name) pair case-insensitively, symmetric with
the ref binding contract.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ns to import CTEs

Adapter half of cute-dbt#57. WireSource is the tolerant projection of a
top-level sources entry — every field #[serde(default)] Option per the
cute-dbt#145 engine-divergence rule (core emits explicit nulls, fusion
omits keys; a degenerate entry never fails the manifest, ADR-5).

parse_source_ref is the exact sibling of parse_ref_name (verbatim
authored string in both engines; case-insensitive keyword, whitespace
tolerant, single-quoted positional args). Binding resolves the authored
(source_name, name) pair through the sources map, derives the leaf
token identifier → relation_name last segment → name (quote-stripped),
and feeds it through the existing two-pass find_import_node_id — no new
matching machinery, no preflight change (an unresolvable pair stays
unbound, fail-open like an unresolvable ref).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…inding coverage

The cute-dbt#57 AC fixture: stg_mixed carries BOTH a ref()-based and a
source()-based import CTE, the unit test mocks both inputs, and the
sources block ships both engine dialects (core-style explicit nulls +
fusion-style absent keys). Registered in tests/fixtures/MANIFEST.toml
(synthetic_only = true, SHA-256 pinned). render_integration proves the
file → Stage-1 → sources → payload-binding vertical; the headless test
proves the Node-detail panel renders the bound source() given's fixture
card (not the empty-state copy) on node click.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the 'source() references are not bound' v0.1 fidelity limit
(closed by cute-dbt#57) with the residual authored-form caveat, and
documents the sources-block resolution hop ahead of the two-pass match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 11, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

The PR extends cute-dbt's messy import-CTE fallback to handle dbt source('schema', 'table') references in unit-test givens. It adds a domain SourceNode type, parses dbt manifest sources, implements a source() parser and binding flow that resolves source pairs through the manifest to relation tokens, and validates the feature end-to-end with fixtures and integration tests.

Changes

Source binding for unit test givens

Layer / File(s) Summary
Domain sources model
src/domain/manifest.rs, src/domain/mod.rs
SourceNode POD type with owned fields (id, source_name, name, identifier, schema, database, relation_name) and #[serde(default)] optional handling. Manifest gains a sources map, with_sources(...) builder, and source_by_name(source_name, name) case-insensitive lookup accessor.
Manifest adapter sources parsing
src/adapters/manifest.rs
WireManifest ingests dbt's top-level sources block via tolerant WireSource struct with defaulting serde fields. During domain translation, sources map is built and attached to Manifest via with_sources(). Tests validate core-style, fusion-style, and degenerate source entries.
Source reference parser
src/adapters/render.rs (lines 145–186)
New exported parse_source_ref(input: &str) -> Option<(&str, &str)> extracts (source_name, table_name) from source('NAME','TABLE')-shaped strings; single-quoted args only, case-insensitive, whitespace-tolerant.
Source binding resolution
src/adapters/render.rs (lines 1536–1783)
build_test_payload tries ref binding first, then attempts source via new helpers: find_source_import_node_id resolves (source_name, table_name) through manifest, derives leaf relation token via source_relation_token (with identifier override and quote-stripping), and reuses find_import_node_id for CTE-leaf matching. Test helper manifest_with_sources(...) enables source binding tests.
Fixtures and integration tests
tests/fixtures/MANIFEST.toml, tests/fixtures/ref-and-source-import-cte.json, tests/render_integration.rs, tests/headless_toggle.rs
New ref-and-source-import-cte.json fixture exercises mixed ref + source import CTEs with unit test givens; two render integration tests validate end-to-end binding from committed fixtures, and a headless Chromium test asserts the Node-detail panel renders the source fixture card correctly.
Documentation
README.md
Updated "Known v0.1 fidelity limits" and "Import-CTE binding" sections document that source() parsing supports only single-quoted positional form, and that binding resolves via manifest sources with fail-open semantics for missing entries.

Sequence Diagram(s)

sequenceDiagram
  participant given as Given input
  participant parse as parse_source_ref
  participant manifest as Manifest.sources
  participant derive as source_relation_token
  participant cte as find_import_node_id
  given->>parse: source('a','b')
  parse->>parse: extract (a,b)
  parse-->>given: Some((a,b))
  given->>manifest: source_by_name(a,b)
  manifest-->>given: SourceNode
  given->>derive: compute leaf token
  derive->>derive: strip identifier quotes
  derive-->>given: unquoted_token
  given->>cte: match token in CTE body
  cte-->>given: matched_node_id
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • breezy-bays-labs/cute-dbt#38: Added the core renderer and initial ref('...')→CTE binding; this PR extends the same binding path to also parse and resolve source('...','...') through manifest sources.

Poem

🐰 A source by any name, when parsed just right,
flows through the manifest in CTE light,
ref and source now dance as one,
binding givens till the tests are done!

🚥 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 Title accurately summarizes the main change: extending source() binding support to the messy-import-CTE fallback mechanism, directly referencing issue #57.
Linked Issues check ✅ Passed All acceptance criteria from #57 are met: Manifest gains sources map with SourceNode, adapter parses sources block, parser recognizes source() shape, binding resolves via sources → relation_name match, synthetic fixture included, and README updated.
Out of Scope Changes check ✅ Passed All changes are directly scoped to #57 objectives: domain/adapter/render/test extensions for source() binding, fixture addition, and docs updates; no unrelated refactoring or peripheral changes detected.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch domain-57-source-binding

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 and usage tips.

@ghost

ghost commented Jun 11, 2026 •

Copy link
Copy Markdown

Ready to review this PR? Stage has broken it down into 5 individual chapters for you:

Title
1 Define SourceNode domain and Manifest extensions
2 Implement manifest adapter for source ingestion
3 Implement source reference parsing and binding
4 Add integration tests and fixtures
5 Verify UI rendering and update documentation
Open in Stage

Chapters generated by Stage for commit 478e7f8 on Jun 11, 2026 2:43am UTC.

@github-actions

github-actions Bot commented Jun 11, 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
playground-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.

▶ Open ↗ opens the report in your browser in one click —
published to this repo's GitHub Pages under /pr-204/.
⬇ 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 27320273995 -R breezy-bays-labs/cute-dbt -n report-preview-playground
open report-preview-playground/playground-report.html

Posted by report-preview.yml for 478e7f8251360872b07f8ce83bad808d04874da8. 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 implements support for binding source() unit-test inputs to leaf CTE nodes (cute-dbt#57). It introduces a new SourceNode domain model, updates manifest parsing to handle both dbt-core and dbt-fusion dialects of the top-level sources block, and adds logic to resolve and bind source('source_name', 'table_name') inputs. The review feedback suggests optimizing performance in src/adapters/render.rs by returning a &str slice from source_relation_token instead of an owned String to avoid redundant heap allocations, and consequently passing the token directly to find_import_node_id without double referencing.

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 Outdated
Comment thread src/adapters/render.rs
…view)

Gemini PR 204 finding: every branch of the token derivation is a
quote-strip view of the SourceNode's own fields, so the function can
return &str borrowed from the node and skip the .to_owned() heap
allocation; find_import_node_id takes the slice directly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actions Bot and others added 2 commits June 10, 2026 22:34
…#205) + golden re-render

The PR-body-promised verification now that cute-dbt#205 landed the
regenerated playground pair: the REAL dbt-core-1.11-compiled
test_stg_synthea__patients_renames_and_hashes_source_columns with
given input source('synthea_raw', 'patients') binds to the canonical
'source' import CTE through the manifest sources block — encoded as a
permanent integration test over the committed fixture (the fusion
rule's verify-vs-real-fixture requirement).

examples/playground-report.html regenerated per the example-report-check
recipe; the byte diff is exactly ONE payload field (non-payload HTML
byte-identical):
models[6].tests[0].given[0].bound_to_node: null -> "source"
(stg_synthea__patients / the source given). jaffle-shop and
diff-showcase are unchanged (the showcase patch does not scope
stg_synthea__patients into the pr-diff report).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cmbays

cmbays commented Jun 11, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 11, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cmbays
cmbays merged commit 3cd2441 into main Jun 11, 2026
31 of 32 checks passed
@cmbays
cmbays deleted the domain-57-source-binding branch June 11, 2026 02:47
github-actions Bot added a commit that referenced this pull request Jun 11, 2026
cmbays pushed a commit that referenced this pull request Jun 11, 2026
…mini fix delta)

All three examples re-rendered per the example-report-check recipe after
merging origin/main (#204/#205/#211/#212). Byte audit: every changed
line traces to the truthful fold-toggle/copy-outcome fix (a4c95d7) —
main's cross-join/source-binding golden content came through the merge
intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cmbays pushed a commit that referenced this pull request Jun 11, 2026
…mini fix delta)

All three examples re-rendered per the example-report-check recipe after
merging origin/main (#204/#205/#211/#212). Byte audit: every changed
line traces to the truthful fold-toggle/copy-outcome fix (a4c95d7) —
main's cross-join/source-binding golden content came through the merge
intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cmbays added a commit that referenced this pull request Jun 11, 2026
…ng, split-view folds, per-diff fold toggle, copy-icon buttons (#213)

* feat(render): design-2 fold steppers — gutter +/− steppers, expand-step setting, split-view folds, per-diff fold toggle, copy-icon buttons

Ports the pass-2 directional fold model onto the shipped diff renderers
(cute-dbt#199, design package design-return-2):

- settings.expandStep in cute-dbt.settings.v1 (default 20, clamp 0–500,
  0 = all; NaN-tolerant hydrate) + the static #settings-expand-step row
  (the #188 static-markup contract). Read live by expandFold/contractFold
  — no re-render on change.
- Unified renderer: data-fold-dir (leading fold expands UP toward the
  hunk, else DOWN), gutter .fold-steppers (+ by step / − by step,
  disabled at bounds), per-hunk .fold-collapse-all once anything is
  revealed, label progression Show N unchanged lines → All N lines
  shown, and updateFoldControl re-parks the control adjacent to the
  remaining hidden run (below the run when fully revealed). Reveal stays
  parent-scoped via closest(code, tbody) — the #132 duplicate-fold-id
  rule.
- Split renderer folds long context runs with the SAME fold model (fold
  row: stepper gutter + colspan label cell) and gains the
  ds-c-num/ds-c-code colgroup (3.8em/auto) for a true 50/50; setAllFolds
  drives both layouts from one control set, so __cuteExpandAllFolds /
  __cuteCollapseAllFolds keep mirroring every fold control (label +
  aria-expanded + steppers + collapse-all — the #136 symmetric-mirror
  invariant on the new anatomy).
- Per-diff fold toggle (buildFoldToggleBtn, aria-pressed) in the
  Model-SQL and Model-YAML diff code headers; the #132 top-of-report
  .diff-expand-all strip is removed (diffAllExpanded /
  renderExpandAllToggle / bindDiffViewControls retired with it).
- copyIconBtn (inline-SVG icon, aria-label Copy, copied-class flash,
  execCommand fallback) replaces the absolutely-positioned text Copy in
  the Model-SQL header and is added to the Model-YAML header; code-header
  padding per engine/base.css. Functional-SVG-only iconography (README
  §2.4) — no icon fonts, nothing external, zero-egress untouched.

No payload change; no src/domain change. Goldens + insta snapshots
regenerated — every changed byte traces to this delta.

Closes #199

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test: supersede the #132/#136 fold guards with the #199 step-expansion contract

Deliberate guard migration (never deleted, each replaced with the
new-behavior assertion):

- block_diff_folds_long_context_runs_and_reveals_on_activate: activate =
  expand-by-step (default step 20 >= hidden 4 still reveals all in one
  activation); the 'Hide N unchanged lines' relabel assertion is
  superseded by 'All N lines shown' + disabled + stepper + visible
  collapse-all; re-collapse moved from band-click to the explicit
  .fold-collapse-all. Kept: parent-scoped reveal, control stays visible,
  aria-expanded truth, Enter/Space keyboard activation, short-block
  never folds, new data-fold-dir/steppers markup assertions.
- global_expand_collapse_mirrors_every_fold: the #136 bidirectional
  mirror retained on the new control anatomy (label, stepper
  disabled-states, collapse-all visibility); now also pins the retired
  top-of-report .diff-view-controls strip at 0 nodes.
- settings_context_lines_refolds_block_diffs_live: contextLines
  re-render still live; extended with the expandStep no-re-render proof
  (a block mounted before the setting change steps by the new value).
- split_diff_renders_the_same_block_diff_as_unified: parity extends to
  folds — same directional control anatomy, count, colgroup geometry,
  band activation + setAllFolds mirror on the split tbody.
- model_sql_section_defaults_to_diff_and_toggles_to_raw /
  yaml_diff_drawer_defaults_to_diff_and_toggles_to_authored: assert the
  per-diff fold toggle + the inline-SVG copy-icon button (real focusable
  <button>, aria-label Copy) in both code headers.
- NEW expand_step_steppers_reveal_contract_directionally_and_persist:
  + reveals exactly step lines toward the hunk, − re-hides them
  mirroring direction, collapse-all restores, up/down direction proofs,
  control re-parking, and cute-dbt.settings.v1 persistence across
  reload.
- NEW per_diff_fold_toggle_drives_its_own_diffs_folds: the header
  toggle expands/restores every fold in its own diff (unified + split)
  with aria-pressed + label tracking.

render_block_diff_honors_a_configurable_fold_pad is unchanged — its
fold-pad arithmetic and labels survive the new model.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(render): truthful fold-toggle + copy outcome state (Gemini PR #213 findings)

Applies all three Gemini findings — each holds the new controls to the
same symmetric-DOM-mirror standard the #136 guards assert:

1. copyIconBtn signals failure truthfully: success flashes 'copied',
   failure flashes 'copy-failed' (title AND aria-label carry the
   outcome; both reset after the flash). Write strategy now mirrors
   copySql — writeText, then the shared execCommand fallbackCopy (which
   reports its own success) on rejection/absence. The .copy-failed CSS
   is no longer dead.
2. buildFoldToggleBtn is stateless: the click derives intent from the
   DOM at activation time (any hidden folded line in this diff =>
   expand-all, else collapse-all) instead of a cached boolean that
   desyncs under per-hunk stepping or the __cute hooks.
3. setAllFolds keeps the per-diff toggles truthful: every fold mutation
   funnels through updateFoldControl -> syncFoldToggles, which relabels
   each toggle (text + aria-pressed) from ITS OWN diff's DOM truth via
   the root accessor stored on the element. Per-root truth is
   deliberately stronger than relabeling 'toggles in scope' to one
   shared state: a partial-scope op never lies about an untouched
   sibling diff, and per-hunk steppers stay covered too.

New/extended guards (headless_toggle):
- per_diff_fold_toggle_drives_its_own_diffs_folds: (a) global
  __cuteExpandAllFolds flips the toggle's label/aria-pressed; a click
  after the global op acts on DOM truth and collapses; (b) stepping the
  unified fold fully keeps the toggle truthful while the split twin
  still holds hidden rows, and the next click expands the remainder.
- NEW copy_icon_button_signals_failure_truthfully: both write paths
  stubbed to fail in-page (writeText rejects, execCommand false) =>
  copy-failed + 'Copy failed' title/aria-label, never 'copied', reset
  to rest state after the flash.

insta render_integration snapshot regenerated (inlined interaction.js).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: regenerate goldens on the merged tree (main @ 3cd2441 + the Gemini fix delta)

All three examples re-rendered per the example-report-check recipe after
merging origin/main (#204/#205/#211/#212). Byte audit: every changed
line traces to the truthful fold-toggle/copy-outcome fix (a4c95d7) —
main's cross-join/source-binding golden content came through the merge
intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <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.

feature: source() binding — extend messy-import-CTE fallback to dbt source() references

1 participant