Release Notes — v1.7¶
Release date: March 2026
This release adds exports — declarative secondary output destinations that write thread data to additional locations in configurable formats, without duplicating pipeline logic.
Also includes enhanced flow SVG visualization with validation, quarantine, assertions, and export nodes, plus a new Sankey-style waterfall replacing the horizontal bar chart.
Exports (Secondary Outputs)¶
Configuration¶
Declare exports at the thread, weave, or loom level. Each export
writes the same post-mapping, audit-injected DataFrame as the
primary target.
exports:
- name: parquet_archive
description: "Daily archive for external consumers"
type: parquet
path: /lakehouse/archive/orders/${run.timestamp}/
partition_by: [region]
on_failure: warn
- name: csv_extract
type: csv
path: /lakehouse/exports/orders_latest/
options:
header: "true"
delimiter: "|"
Supported Formats¶
Five Fabric-native Spark formats are supported:
| Format | Path | Alias | Notes |
|---|---|---|---|
delta |
yes | yes | Metastore or OneLake path |
parquet |
yes | no | Compression via options |
csv |
yes | no | Header, delimiter via options |
json |
yes | no | One object per line |
orc |
yes | no | Hive-compatible columnar |
Cascade Inheritance¶
Exports cascade additively through loom → weave → thread,
following the same pattern as audit_columns:
- All levels contribute exports; collected by name
- Same-named exports at a lower level override the definition
enabled: falsesuppresses an inherited export
# loom defaults — archive for every thread
defaults:
exports:
- name: audit_archive
type: parquet
path: /archive/${thread.name}/${run.timestamp}/
# thread level — suppress for this thread
exports:
- name: audit_archive
enabled: false
Dynamic Path Naming¶
Export paths support context variables for unique-per-run outputs:
| Variable | Description |
|---|---|
${run.timestamp} |
ISO 8601 UTC timestamp of execution start |
${run.id} |
UUID4 unique per execution |
${thread.name} |
Thread name |
${weave.name} |
Weave name |
${loom.name} |
Loom name |
These are resolved at execution time, not config load time.
Error Handling¶
Each export has an on_failure setting (default: warn):
warn— log warning, continue to next export, thread succeedsabort— raiseExportError, thread fails, remaining exports skipped
Exports only execute after a successful primary write, watermark persistence, and assertions. Export failures never corrupt the primary target or watermark state.
Run Context Variables¶
Two new system-wide context variables are available in audit column expressions and export path templates:
${run.timestamp}— ISO 8601 UTC timestamp${run.id}— UUID4 identifier
These are generated once per execute_thread() call, ensuring
consistent values across audit columns and export paths within a
single execution.
Enhanced Flow SVG¶
The thread flow diagram now shows the complete data pipeline:
- Validation gate — appears after transforms when validations are configured
- Quarantine destination — branches down from validation
- Assertions checkpoint — appears after the target node
- Export destinations — fan out from the preparation stage as siblings of the target (not downstream of target)
When no validations, assertions, or exports are configured, the flow remains unchanged.
Sankey-Style Waterfall¶
The horizontal bar chart waterfall has been replaced with a proportional band-width Sankey flow:
- Rows read → after transforms → validation split → target + exports
- Quarantine branch shown with proportional band width
- Export bands shown alongside the target band
- Row counts labeled on each band
Observability¶
explain()lists exports with name, type, and target pathsummary()shows per-export results (rows, status, errors)ThreadTelemetry.export_resultscapturesExportResultfor each export (name, type, target, rows_written, duration_ms, status, error)
New Public Exports¶
From weevr.operations:
write_export— write a DataFrame to an export targetresolve_exports— resolve context variables in export pathsresolve_export_path— substitute variables in a single path
From weevr.telemetry:
ExportResult— per-export write result model
From weevr.model:
Export— export domain model
From weevr.errors:
ExportError— raised onon_failure: abortexport failure
Compatibility¶
No breaking changes. All new fields default to None or empty —
existing configurations work without modification.
| Component | Version |
|---|---|
| Python | 3.11 |
| PySpark | 3.5.x |
| Delta Lake | 3.2.x |
| Microsoft Fabric Runtime | 1.3 |