Skip to content

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):

# staging.weave
defaults:
  audit_columns:
    _weevr_weave: "'${weave.name}'"

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 resolution
  • inject_audit_columns — resolve variables and inject audit columns into a DataFrame
  • resolve_audit_columns — merge audit column dicts additively across config levels
  • build_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