New in 0.4
DRE 0.4 is about runs you can leave to a scheduler: they stop cleanly, say exactly what happened, never leave half a file behind and never send anything twice. It’s a minor release, so a few things change; read What changes before you update a scheduled job.
Readable diagnostics in 0.4.4
Section titled “Readable diagnostics in 0.4.4”0.4.4 keeps paths, hosts and other ordinary settings readable in messages again. Values that
profiles.yml reads through env_var() are masked when they fill a secret field (a password,
token, key or other field the plugin marks secret), as are all DRE_SECRET_* values. Put a
secret that lives inside an ordinary field, such as a URL, in a DRE_SECRET_* variable.
Security hardening in 0.4.3
Section titled “Security hardening in 0.4.3”0.4.3 is a security update; nothing in an existing project needs to change.
- Connection secrets passed through
env_var()inprofiles.ymlare now masked in DRE’s output, logs and errors, likeDRE_SECRET_*values (narrowed to secret fields in 0.4.4). dre queryis stricter about what a read-only query may do. With the duckdb plugin 1.2.1 or later, its DuckDB sessions are also sandboxed. A read-only database role is still the recommended boundary.- Companion installs are verified more strictly and always ask first.
- String variables in
var_schemacan declarepatternandmax_length. dre queryanddre catalogtake--output-file;--output-jsonstill works there, with a warning, until 0.5.
Secret masking fixes in 0.4.2
Section titled “Secret masking fixes in 0.4.2”Update to 0.4.2 if you use DRE_SECRET_* values. Earlier versions can expose those values in
logs or diagnostics after JSON or debug escaping, Markdown escaping, message-title whitespace
normalization, or message-summary truncation. History JSON now also redacts registered secrets
when reading older run records. The fix covers the CLI and core; existing plugins keep working.
Database inputs and report result files keep their original values, and mask_secrets: false
continues to disable masking. Review retained logs and run records from earlier versions; if a
credential was exposed, rotate it and restrict or remove the affected copies. Updating DRE does
not rewrite those historical files.
Thanks to xingf-msft for reporting the JSON text-log bypass in PR 154.
Additive context support in 0.4.1
Section titled “Additive context support in 0.4.1”Optional report descriptions, metadata layers and declared variable schemas let external tools
consume report context without changing existing projects. Isolated no-delivery row exports,
exact rendered-SQL hashes, live relation catalogs and single-SELECT queries provide generic
integration contracts. Companion executables can install separately through the extension
registry and receive a dre mcp handoff. See AI-ready reports,
manifest contracts, and the
commented MCP example.
- Exit codes an orchestrator can act on:
0success,1something failed (retry may help),2couldn’t start (fix it first),124the run’s timeout,130Ctrl-C and143a termination signal.dre validate --strictfails on warnings. - Clean cancellation: Ctrl-C or a termination signal stops the running query on the server
(Postgres, Databricks), records the Binding as
cancelled, delivers nothing and starts nothing more. A second Ctrl-C stops at once. - Timeouts:
dre run --timeout 2h(DRE_RUN_TIMEOUT,flags: run_timeout) stops a run that takes too long, astimed_out. Every plugin that talks to a server hasconnect_timeoutandtimeout, and downloads (the registry, plugins,dre system update) give up and try again when nothing arrives (flags: http_timeout). - Run folders: each run of a report and Set gets its own folder under
target/run/, with its files,run_results.jsonanddre.log, and acurrentpointer to the latest.flags: keep_runs(--keep-runs,DRE_KEEP_RUNS) keeps a history;dre historylists it, anddre unlockclears a run that died. Two runs of the same Binding at once are refused. See The target path. - Bindings at once: a connection entry’s
threads:runs that many Bindings on it at once;dre run --threads Ncaps the run. dre explain <code>describes any error code, and every problem DRE reports names its code.
Deliveries
Section titled “Deliveries”- No half-written files:
local,sftpandftpupload under a temporary name, then rename (atomic,temp_dir). if_existson every file destination:overwrite(as before),error, ornumberto keep both copies (report_2.xlsx).- Retries on temporary errors, everywhere, never sending anything
twice:
retries(default 3) on every plugin that talks to a server. A delivery that took several tries hasattemptsinrun_results.json. - RSA SSH keys (RUSTSEC-2023-0071): an RSA key warns once per
run;
allow_rsa_keyssilences or refuses it, anduse_agent: truesigns through your SSH agent.
Checks and configuration
Section titled “Checks and configuration”- Connection checks:
dre validateasks each profile entry’s plugin to check its settings without connecting: a missing field, a value of the wrong form, two settings that can’t go together.--all-targetschecks every entry. A misspelt key warns, with the nearest key. x-*keys in every YAML file, for anchors you reuse.- Jinja:
{% break %}and{% continue %}, and maps keep the order they’re written in. - xlsx 1.1.0: columns sized from their content (
autofit, on by default;width:per column) andstyle:on the output, a tab or a column (fonts, colours, fills, borders, header and totals rows, banded rows).
Docs and security
Section titled “Docs and security”- One page per plugin, in Plugins, with its fields and options generated from the plugin itself.
- Releases carry a CycloneDX SBOM and signed build provenance for every archive and wheel: see Verifying a download.
What changes
Section titled “What changes”- Exit codes: a run that couldn’t start (an invalid project or profile, bad flags, a missing
plugin) exits
2, not1. A job that treats any non-zero code as a failure is unaffected; one that retries on1now won’t retry what retrying can’t fix. - Output files move into run folders:
target/run/<report>/<set>/runs/<run id>/instead oftarget/run/<report>/<set>/, with acurrentfile naming the latest. Read the path fromrun_results.jsonordre history <report> --latest --pathrather than building it. The sharedlogs/dre.logis gone: each run has its owndre.log. --varvalues are YAML 1.2:--var flag=falseisfalseand--var n=5a number. Quote a value to keep it text:--var flag='"false"'.- Maps iterate in written order in templates, instead of sorted by key.
- Plugins: DRE 0.4 needs plugins built on protocol 1. Update them all with
dre plugin update(eachdre.lockpin moves to the new version): duckdb 1.2.0, postgres 1.3.0, databricks 1.3.0, csv, parquet and fixed_width 1.0.1, xlsx 1.1.0, object_store 1.1.0, sftp 1.2.0, ftp 1.1.0, email 1.2.0, slack 1.2.0, teams and google_chat 1.0.0-rc.2, bigquery and snowflake 1.0.0-alpha.2. An older plugin is refused with the command to update it. - Postgres
connect_timeoutdefaults to 30 seconds (before, no limit). - Skills 3.0.0 cover DRE 0.4 only.
The schemas for editor checks are at /schemas/v0.4/.