dbt-labs/dbt-core · error

the recorded model DDL should remain available after the…

Error message

the recorded model DDL should remain available after the probe mismatch

What it means

Test-only assertion: after a compile-time datediff probe mismatch consumed no event, the recorded model DDL write must still be available for later matching. Fires only if semantic-match consumption incorrectly eats recorded events on probe mismatch — a replay-engine regression.

Solutions

  1. Fix take_semantic_match so mismatched probes do not consume recorded events
  2. Re-run the event replay tests around probe/DDL ordering
  3. Treat failure as a replay determinism regression
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/dbt-adapter/src/time_machine/event_replay.rs:3162 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07). Data as JSON: /api/errors/09a1144475f4360f. Report an issue: GitHub.

Appendix: source

Thrown at crates/dbt-adapter/src/time_machine/event_replay.rs:3162

        }]);

        let actual_args = serde_json::json!([actual_date_spine_probe_sql]);
        let event = recording.take_semantic_match(
            node_id,
            "execute",
            &actual_args,
            SemanticCategory::Write,
        );

        assert!(
            event.is_none(),
            "date_spine's compile-time datediff probe should not consume the recorded model DDL write"
        );

        let model_args = serde_json::json!([recorded_model_sql]);
        let event = recording
            .take_semantic_match(node_id, "execute", &model_args, SemanticCategory::Write)
            .expect("the recorded model DDL should remain available after the probe mismatch");
        assert_eq!(event.args, model_args);
    }

    /// Recording has [SHOW_PARAMS, DATEDIFF_PROBE, CREATE_VIEW] but Fusion emits them
    /// as [DATEDIFF_PROBE, SHOW_PARAMS, CREATE_VIEW]. In semantic mode all three should
    /// still be matched correctly.
    #[test]
    fn test_semantic_mode_date_spine_ordering_mismatch() {
        let node_id = "model.project.date_details";
        let show_sql = "show parameters like 'query_tag' in session";
        let probe_sql =
            "select datediff(day, '2018-12-31'::date, sysdate()::date + interval '1 day')";
        let ddl_sql = "create or replace view analytics.public.date_details as (select 1)";

        let make_exec = |seq: u32, sql: &str| AdapterCallEvent {
            node_id: node_id.to_string(),
            seq,
            method: "execute".to_string(),

View on GitHub (pinned to 0267ce9170)