Release Notes — v1.6¶
Release date: March 2026
This release adds audit column injection — automatic governance and traceability columns appended to thread outputs via configuration, with additive cascade inheritance across loom, weave, and thread levels.
Audit Columns¶
Configuration¶
Define audit_columns as name-expression pairs at any config level.
Expressions use Spark SQL syntax and support context variables.
Loom level (applied to all threads):
# my-project.loom
defaults:
audit_columns:
_weevr_loaded_at: "current_timestamp()"
_weevr_run_id: "'${param.run_id}'"
_weevr_loom: "'${loom.name}'"
Weave level (extends loom columns):
Thread level (extends loom + weave columns):
# stg_orders.thread
target:
alias: silver.stg_orders
audit_columns:
_weevr_thread: "'${thread.name}'"
_weevr_source: "'${thread.source}'"
Additive Cascade¶
Unlike standard config inheritance where child values replace parent
values entirely, audit_columns uses additive merge:
- Each level extends the column set from higher levels
- Same-named columns at a lower level override the expression
- Columns cannot be removed from the inherited set
In the example above, stg_orders would receive all seven audit columns
from loom + weave + thread.
Context Variables¶
Audit column expressions can reference execution context:
| Variable | Description |
|---|---|
${thread.name} |
Thread name |
${thread.qualified_key} |
Fully qualified key (e.g. staging.stg_orders) |
${thread.source} |
Primary source alias |
${thread.sources} |
JSON array of all sources with type metadata |
${weave.name} |
Weave name |
${loom.name} |
Loom name |
Context variables are resolved before Spark SQL evaluation. Parameter
variables (${param.*}) and runtime variables (${var.*}) are resolved
during config loading, before audit column injection.
Write Mode Support¶
Audit columns are injected for all write modes: append, overwrite,
merge, and CDC merge. They bypass target mapping mode — always included
in the output regardless of whether mapping_mode is auto or
explicit.
Column Conflict Validation¶
If an audit column name conflicts with an existing DataFrame column, the
engine raises an ExecutionError before writing. Rename either the
audit column or the business column to resolve the conflict.
Telemetry¶
ThreadTelemetry now includes an audit_columns_applied field listing
the names of audit columns injected during execution.
New Public Exports¶
The following are now exported from weevr.operations:
AuditContext— execution context for audit column variable resolutioninject_audit_columns— resolve variables and inject audit columns into a DataFrameresolve_audit_columns— merge audit column dicts additively across config levelsbuild_sources_json— build the${thread.sources}JSON array from thread source definitions
Compatibility¶
No breaking changes. The previously unused Target.audit_template field
has been replaced by Target.audit_columns. Since audit_template was
never implemented, this is not a breaking change — no existing
configurations referenced it.
| Component | Version |
|---|---|
| Python | 3.11 |
| PySpark | 3.5.x |
| Delta Lake | 3.2.x |
| Microsoft Fabric Runtime | 1.3 |