You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(specializer): raw-dict output mode — output='dict' opt-in closes the python_dict gap (TASK-51)
The marshaller already builds the per-row dict the model would consume;
dict mode returns it and skips model construction. Typed default is
untouched; mutually exclusive with output_model; all four emit paths
honor it (marshaller / generic / reentrant / constant, the latter
copying per call). Parity gate extended: dict == typed field-for-field
before any timing. Bench gains the spec_dict row: 25-35% off the typed
path at n=1024, and the handcrafted python_dict floor shrinks from the
standing 1.3-2x caveat to 0.74-1.11x — spec_dict WINS house_prices;
what remains is input marshalling, not output.
TASK-50 Done-flip and TASK-51 ride this branch.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: backlog/tasks/task-50 - Specializer-SQL-support-join-forms-—-USING-residual-ON-semi-joins-comma-rewrite-wave-4.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,10 +3,10 @@ id: TASK-50
3
3
title: >-
4
4
Specializer SQL support: join forms — USING, residual ON, semi joins, comma
title: Specializer raw-dict output mode — close the python_dict gap (opt-in)
4
+
status: Done
5
+
assignee: []
6
+
created_date: '2026-07-26 20:17'
7
+
labels: []
8
+
milestone: m-7
9
+
dependencies:
10
+
- TASK-50
11
+
type: feature
12
+
ordinal: 45000
13
+
---
14
+
15
+
## Acceptance Criteria
16
+
<!-- AC:BEGIN -->
17
+
-[x]#1 output='dict' opt-in on DuckDBInferFn; typed default untouched; mutually exclusive with output_model; unknown values rejected
18
+
-[x]#2 All four emit paths honor it (marshaller, generic fallback, reentrant, constant engine) with fresh dicts per call
19
+
-[x]#3 Parity: dict mode == typed mode field-for-field, enforced in the serving parity gate + oracle tests
20
+
-[x]#4 Bench: spec_dict engine row lands the python_dict head-to-head
21
+
-[x]#5 gate green
22
+
<!-- AC:END -->
23
+
24
+
## Final Summary
25
+
26
+
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
27
+
Raw-dict output shipped as a strict opt-in: DuckDBInferFn(..., output="dict") returns per-row plain dicts, skipping model construction — the marshaller already built the dict the model would consume, so the modes agree field-for-field by construction (enforced in the serving parity gate and tests). All four emit paths honor the mode (generated marshaller, generic baseline, reentrant fallback, constant engine — the latter copying per call so caller mutation cannot leak). Guards: mutually exclusive with output_model, unknown values rejected, output getter exposes the mode. Measured at n=1024: 25-35% off the typed path; the handcrafted python_dict floor shrinks from the standing 1.3-2x caveat to 0.74-1.11x (spec_dict WINS house_prices) — the remaining gap is input marshalling, not output. Gate green (759 + 13 xfail); 6 new tests + parity-gate extension + spec_dict bench engine.
0 commit comments