## slothflowlabs/duckle — v0.7.1…v0.7.2

_186+ commits._

### Features
- **feat(excel): read every sheet, or a named set, and honour the cell range** (0fdcb58)
- **feat(csv): typable delimiter and the full encoding list on the CSV source** (159e962)
- **feat(oidc): enforce MFA, and document the SSO that already ships** (6e90d04)
- **feat(mysql): let the MySQL sink write without one giant transaction** (db69e7d)
- **feat(join): fill the reject port the join family already advertised** (2842e73)
- **feat(sort): sort by more than one column from the editor** (bcbd9ab)
- **feat(scheduler): catch up what a schedule missed, by policy (#296)** (fcfd986)
- **feat(subscribe): make a failed delivery visible and retryable (#325)** (4c24c32)
- **feat(retry): check and replay the parameters a run was given (#305)** (5307341)
- **feat(serve): record the occurrence a scheduled run came from (#296)** (25c7faf)
- **feat(scheduler): record every occurrence a schedule was due for (#296)** (56aae79)
- **feat(retention): prune the operational ledgers without breaking what is kept (#303)** (f28a830)
- **feat(retry): reuse a verified durable output instead of re-running upstream (#305)** (87a7992)
- **feat(subscribe): bind publication metadata to a consumer's parameters (#325)** (790dc31)
- **feat(subscribe): refuse a subscription that closes a trigger loop (#325)** (1728c0b)
- **feat(sequence): report and apply an ordered chain from the CLI (#326)** (860d817)
- **feat(sequence): block a slice whose predecessor has not landed (#326)** (d2ad82f)
- **feat(sequence): parse an ordered delta chain and prove its gaps (#326)** (ee6ef08)
- **feat(capabilities): report which components run a process (#313)** (292ecaa)
- **feat(capabilities): report that a component advances durable state (#313)** (633bfff)
- **feat(freshness): show the verdict on every surface (#304)** (cf34694)
- **feat(subscribe): run a pipeline when the data it reads is published (#325)** (816cfe1)
- **feat(materialize): a durable log of every successful publication (#325 step 1)** (983b354)
- **feat(spatial): declare the attribute encoding when writing a Shapefile** (c9d7f53)
- **feat(freshness): surface the verdict, route by owner and tag, and honour the schedule** (b1d2120)
- **feat(capabilities): generate the connector matrices from the registry** (0b394af)
- **feat(capabilities): one registry, reachable from MCP, with external components** (b2e1cce)
- **feat(freshness): evaluate on a clock, and alert on stale and recovered** (8781387)
- **feat(source): probe the key's extent, record rows, and stop claiming a pinned snapshot** (d87f1cc)
- **feat(console): a Backfills panel, and actually call the slice reconciler** (ff3c17c)
- **feat(csv): typable delimiter and encoding, with the encodings DuckDB accepts** (642a1cc)
- **feat(source): chunked, resumable extraction on the backfill slice lifecycle** (4d6d3d3)
- **feat(sql): dialect-neutral hints for SQL a source sends elsewhere** (77c391c)
- **feat(sqlcomplete): completion in the editor's SQL fields** (1793264)
- **feat(backfill): a slice knows what it is, and is not done twice** (23ffb97)
- **feat(backfill): addressable over the API and from MCP** (ce66c10)
- **feat(backfill): partition runs go through the normal resource pool** (0c65c1d)
- **feat(sqlcomplete): complete_node_sql, without running anything** (7349925)
- **feat(sqldiag): show the editor what DuckDB actually said** (997db27)
- **feat(runs): `runs logs <run_id>` for one historical run** (a5e94e5)
- **feat(plugin): Arrow IPC interchange, negotiated, with Parquet as the fallback** (0a99921)
- **feat(plugin): initialize, progress and cancel for external components** (81ad788)
- **feat(plugin): artifact URI and hash interchange for external components** (a3fdf13)
- **feat(plugin): a reject port for external components** (588e38e)
- **feat(plugin): a conformance kit that can actually fail a component** (85181ff)
- **feat(plugin): record external component hashes in the run manifest** (83775a2)
- **feat(plugin): external components in the palette and in MCP discovery** (261f509)
- **feat(plugin): external components with a Parquet and JSON protocol** (a6b76ea)
- **feat(pools): durable queued runs, and a Plan that holds no slot** (56eaa17)
- **feat(chunking): plan a bounded chunked extract, and refuse where it is unsafe** (9ccecbe)
- **feat(backfill): first-class partitions and a resumable backfill** (e1c7ef0)
- **feat(pools): named admission pools instead of one global run limit** (c794eef)
- **feat(release): an immutable control plane an environment points at** (69d1b4d)
- **feat(oidc): optional OpenID Connect login for the console** (69b4a87)
- **feat(parquet): optional Hilbert spatial ordering on export** (7d62805)
- **feat(follow): give the watcher an identity, and its work real run ids** (7af9104)
- **feat(params): keep where a parameter came from, and what it displaced** (1bf5f48)

### Fixes
- **fix(filelist): refuse an empty folder instead of globbing the filesystem root** (ada44ba)
- **fix(duckdb): refuse an unconfigured source instead of returning a placeholder** (a805026)
- **fix(sqlite): say which field is missing instead of asserting inside DuckDB** (9a0e069)
- **fix(forms): mask credential inputs, and keep them masked** (509759a)
- **fix(secrets): a token URL is not a token** (14abd4f)
- **fix(forms): keep src.salesforce.authHeader declared; exempt it by name** (ed2c6b7)
- **fix(arch): declare duckdb, and stop telling headless users to open Setup** (8a3047e)
- **fix(packaging): do not ship an invented maintainer address** (f26d410)
- **fix(packaging): set the desktop dependencies from the binary, not the docs** (e35ea99)
- **fix(packaging): stop the PKGBUILD fetching files the tag does not have** (a94d07d)
- **fix(rest): a REST source with no upstream is not broken** (0e4dcc6)
- **fix(quality): make an unconfigured gate refuse instead of passing everything** (5f19fca)
- **fix(src.git): stop a revision being read as a git option** (90cbfe3)
- **fix(traffic-badge): the token it needs, and a day count that was always 1** (7f1abb7)
- **fix(vault): stop asking the author to type the vault's secret** (833bc22)
- **fix(artifact,archive): options that could not act, and one that could not run** (464a5fe)
- **fix(gates,joins,dates): options that ran but did the wrong thing** (dd1f532)
- **fix(ip): stop offering IP fields DuckDB cannot compute** (85c6b2f)
- **fix(oracle): let Stop interrupt a running Oracle read** (3cc270b)
- **fix(secrets): redact an SSH key passphrase like every other credential** (26ad9b0)
- **fix(oracle): stop an empty upstream from emptying the target table** (f41ceee)
- **fix(rest): stop offering a fan-out to nodes that cannot be wired one** (49d5269)
- **fix(options): make five dropdown options do what their labels say** (7d349b5)
- **fix(quality): make "keep row" keep the row** (ccfb73d)
- **fix(fields): show the default the engine actually uses** (7857ec6)
- **fix(rest): make the REST response and paging settings reachable** (de605e5)
- **fix(manifests): give the engine's settings a field to set them** (10e91e5)
- **fix(fields): let a numeric field be cleared** (55c770f)
- **fix(sinks): refuse a file write mode the sink cannot honour** (13cde68)
- **fix(ports): only advertise a reject port on components that can fill one** (019a521)
- **fix(graphql): stop drawing the paging its arm hardcodes** (c4013ea)
- **fix(forms): close the remaining controls the engine never reads** (b2410e6)
- **fix(wasm): give code.wasm a form that can supply a module** (b774e56)
- **fix(pii): the redactor's form did not name a single prop its arm reads** (87cc2ff)
- **fix(forms): stop offering three controls the engine does not read** (4922713)
- **fix(setops): honour the column-match setting the four set operations offer** (d496072)
- **fix(ctl): offer the child-pipeline handoff instead of a switch nothing reads** (002d209)
- **fix(policy): fire the state-mutation permission when the node actually writes** (0b5424c)
- **fix(forms): sixteen components could not be configured from their own form** (44f511e)
- **fix(graphql): give the GraphQL sources the query they require** (5e7e53e)
- **fix(rest): send the incremental cursor when it is placed in a header** (c79e9ab)
- **fix(capabilities): ask the engine whether a source does incremental reads** (f444d02)
- **fix(sort): agree on what a sort key is, in both branches and the validator** (84cc5e0)
- **fix(cloud): offer the read options a cloud source already honours** (1bdee2f)
- **fix(synapse): draw the connection Azure Synapse actually makes** (f487913)
- **fix(ui): offer the node and sink settings the engine already reads** (9cb5309)
- **fix(runlock): stop a test failing on the environment it runs in** (9a8c480)
- **fix(s3): give the S3 source the credentials its sink has always had** (df04ffe)
- **fix(groupby): stop the "- column -" option emitting COUNT("")** (e22ab73)
- **fix(gizmosql): stop discarding the port typed into the panel** (35b7316)
- **fix(csv): offer the malformed-row options the engine has always read** (9890433)
- **fix(serve): hand a due schedule to its own thread instead of running it (#329)** (c04cbe8)
- **fix(freshness): stop a rolling history window inventing a stale asset (#304)** (a55153a)
- **fix(serve): stop the pool test asserting a scheduling coincidence** (c2e0411)
- **fix(serve): honour the schedule's zone and exclusion calendar when firing (#296)** (6739339)
- **fix(pools): stop the tests racing on a process-wide environment variable** (912ac25)
- **fix(ci): run the capability-matrix check where the workspace already builds** (a643d82)
- **fix(build): embed the extensions the engine actually loads, and report them** (1104ade)
- **fix(docs): correct the component counts, and check them against the catalog** (1fd5d0d)
- **fix(catalog): regenerate the MCP catalog, and make CI fail when it drifts** (f9ed6ff)
- **fix(policy): withhold state mutation from every component that advances state** (442a64c)
- **fix(autodetect): ask the run path what a source needs, instead of a second list** (bd649fd)
- **fix(csv): drop the Encoding control from file sinks, which never did anything** (68f985d)
- **fix(autodetect): load spatial for src.gdb, and derive the rule from the SQL** (b209257)
- **fix(autodetect): probe the component that was chosen, and never let it change anything** (4427454)
- **fix(sqldiag): bind SQL that names its upstream by alias, and name the other refusal** (1f9226b)
- **fix(plugin): external sinks, and a conformance kit that knew only transforms** (0843b06)
- **fix(plugin): a test fixture the interchange field broke** (7add683)
- **fix(release): store the content, so activation and rollback mean something** (ab27749)
- **fix(oidc): four defects an adversarial security review found** (aad0a72)
- **fix(spatial): read GeoParquet through read_parquet, not ST_Read** (4e76483)
- **fix(logs): log a run under the id its receipt was written with** (4915af0)

### Backend
- **release: v0.7.2** (af4e655)

### Tests
- **test(contract): catch a required prop however the arm refuses without it** (75c4d6d)

### Docs
- **docs(packaging): record that the version bump is automated** (29d1a49)
- **docs(security): testing program, governance, continuity; assert the public surface** (7f7da6c)
- **docs: regenerate the capability matrix for the S3 source credentials** (62a153a)
- **docs(changed): say that listing supports s3://, which it has all along** (0238306)

### Chore
- **ci(forms): fail the build on a field that can never be shown** (20fb6be)
- **chore(packaging): name the Arch package maintainer** (f9ddbcd)
- **ci(arch): do not assert a property the released binary cannot have yet** (dd83af4)
- **ci(arch): assert the install works, and prove the dependency matters** (df1ea83)
- **ci(arch): test what a clean Arch install actually does** (5b34856)
- **ci(arch): upload the .SRCINFO that was already being written** (594c87b)
- **ci(arch): publish .SRCINFO as an artifact** (cc1917e)
- **ci(arch): point the PKGBUILDs at each release automatically** (01eb1d8)
- **ci(arch): install the makedepend the build needs** (7f4996e)
- **ci(arch): build the PKGBUILDs in a real Arch container** (b05130f)
- **chore(packaging): complete the Linux desktop integration for Arch** (423a25a)
- **chore(packaging): draft Arch packages and the desktop entry Linux never had** (87c026b)
- **ci(supply-chain): scan dependencies, publish an SBOM and build provenance** (0f0fdb5)
- **chore(site): regenerate the component index after the ports change** (6452816)
- **chore(sdk): regenerate the component map after the set-operation fixes** (692c351)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/slothflowlabs/duckle?utm_source=github-action)._