Skip to content

v0.78.0

Choose a tag to compare

@digitl-cloud-semantic-release digitl-cloud-semantic-release released this 14 Sep 16:07
· 186 commits to main since this release

v0.78.0 (2026-09-14)

Bug Fixes

  • app: Delete preview follows on_delete alone, matching the store (38bfbde)

  • app: Section the connection details form (963c714)

  • app: The graph repoints a single-valued upstream; cross-source wiring reports failures (b1b43d6)

  • assets: The matcher manifest no longer redeclares the job's destination; a test loads it (803a45f)

  • assets: The matcher reads campaign id and name across connector schemas (48c5c5d)

  • core: A missing CSV scope is DataNotFoundError, so upstream legs arrive as None (a836275)

  • core: A missing file-destination scope is DataNotFoundError (2b0eacc)

  • core: An optional inferred upstream detaches when its target is deleted (08cd0e5)

  • core: Fetch-provider validation handles kind-declared relations; name replaces slot (398137d)

  • core: Id-based trickle detection on copies; forbid unknown Relation kwargs; reject uncollected Component annotations (3620dd8)

  • core: One write path for bindings; assignment trickles and single relations repoint (8144955)

  • core: Read upstream data from the configured default destination (9a06d08)

  • core: Reject several upstreams on a single-valued slot (b35e46f)

  • core: Skip an optional upstream that is absent from the DAG instead of raising KeyError (a750f73)

  • db: A drifted child surfaces as ComponentDriftError; single-relation duplicates and drift are tested (a126762)

  • db: On_delete alone decides whether a referrer blocks a delete (cd07cbb)

  • db: Sibling rows come from Source.sibling_bindings; locks on every write; self-edge and cross-instance guards (b9284e7)

  • db: The relation store reads kinds, keys and local as properties (ec52ed4)

  • dev: The seed binds the demo job target by relation name (01a1291)

  • google-cloud: A BigQuery table created by a concurrent run is not an error (e517712)

  • realtime: Run and backfill notifications carry the target's identity (15ce631)

Chores

  • core: Remove the unraised DependencyContractError and sweep retired names (d51fad6)

  • deps: Upgrade every Python, frontend and tooling dependency (46a2ce1)

  • dev: Add the campaign matcher to the dev catalog (e213fd6)

  • platform: Migration round trip verified; sweep retired names and em-dashes (e5fbf21)

Code Style

  • agent: Drop the em-dashes from the collection agent's description (73e3a3d)

  • core: Drop the em-dash from the AssetIdentity docstring (f96ae5e)

  • db: Sort the relation store imports after the identity rename (c492386)

Documentation

  • Assets read self.connection; upstreams are il.Upstream everywhere the docs show one (750c4fd)

  • Campaign matcher manifest and fan-in guide section (dc21e3e)

  • Describe the Relation model, annotation and explicit forms, and spec references (cb99538)

  • Document depends_on, il.Dependency, upstreams and DAG resolution of declared keys (996b511)

  • Drop an em-dash and complete the DependencyContractError docstring (a9e709b)

  • Manifest examples stop redeclaring what cascades; the specs example is valid YAML (cf9776f)

  • State that missing upstream data yields None for every slot and name the ambiguity error (119473a)

  • State when an upstream leg is None and refresh stale dependency names (427d5c5)

  • The spec guide manifest parses; fan-in section without the duplicate block (c4f3632)

  • Writing a kind, step by step; the decorator section follows the engine (5143bb0)

  • core: Docstring corrections parked from the phase 1 review (3a9dca3)

Features

  • Filter runs by their target's kind, type and name (6497839)

  • Rename the asset-to-asset relation to upstream and its wiring field to upstreams (7117432)

  • agent: Bind source connections and destinations by relation name (ceb04a6)

  • agent: Expose bind_relation and unbind_relation on the collection agent (8722d78)

  • api: Relations are addressed by name; org-wide list filters by kinds (71c0fe6)

  • app: Components and executions hubs with routed views (9a43d73)

  • app: Components store addresses relations by name (0461492)

  • app: Graph pairs assets by relation name and key list (b52d06d)

  • app: Relation types keyed by name; resource and upstream views derived by kind (06770af)

  • app: Tab strip flush under the navbar on tabbed pages (5b7efe1)

  • app: Type and enabled filters on the entity pages (abe46ab)

  • app: Wizard, asset select and pages bind relations by name; many-valued upstream picker (a5998dd)

  • assets: Campaign matcher source with a many-valued wildcard upstream over every campaigns asset (f8dbeb7)

  • assets: Describe the campaign matcher's columns (38fabf3)

  • assets: The campaign matcher matches: normalised keys, stable match ids, platform and account (f15de6c)

  • core: Add the Relation primitive, ComponentIdentity and the Bound descriptor (43da1d8)

  • core: Assets infer relations from data() and inject bound instances and Upstream legs (9f9cdc4)

  • core: Component declares and binds relations through one Relation map (977cf22)

  • core: DAG edges from bound relations; bound upstreams outside the run join read-only (dc0808f)

  • core: Declare upstreams with depends_on and wire them as lists (090de31)

  • core: Kinds declare anchor relations; sources bind siblings and trickle (cacb052)

  • core: Manifests are to_spec() output; parented targets serialise as references (f0ab20d)

  • core: Match upstream keys through AssetIdentity.satisfies with a source wildcard (d8b234f)

  • core: On_rebind is the public hook for a binding change; unbind shares the write path (d94b142)

  • core: One decorator engine with three channels; destinations= becomes relations= (5a772ea)

  • core: Read every upstream slot through one path, missing legs as None (90fa530)

  • core: Rename RelationSlot to Dependency with optional and many flags (b88a3f7)

  • core: Require equal partition granularity across upstream edges (3de8acb)

  • core: Resolve declared upstreams in the DAG and check the whole contract at build (f1a8085)

  • core: Trickle, defaults, relation validation and definition on Component (9226b81)

  • db: Component store reads relations by name; guards through on_delete (8c297c0)

  • db: Hydrate relations by name; parented targets become references resolved through the store (2b242b0)

  • db: Key component relations by name; rewrite migration 017 (867e3e1)

  • db: RelationStore binds by name through Relation.accepts (815d84f)

  • toolkit: Lineage by asset kinds; generic bind_relation and unbind_relation tools (961b904)

Refactoring

  • app: Name the resource wizard steps and fetch providers after relations (f31172a)

  • app: Resource refs by dst_kind; clean the relation type comments and dead fields (fa3b8de)

  • assets: Campaign_matches drops source_key and source_id; descriptions read as product copy (8cd2f09)

  • assets: Declare connections by annotation and upstreams as il.Upstream (d11f609)

  • assets: Source-owned assets read self.connection instead of redeclaring it (d4476dc)

  • core: A database backend writes insert, delete, select and count in its dialect; reads are native (fc74b95)

  • core: A table type is one class; Conformer folds into Representation (9f1bffb)

  • core: Assets unwrap their return shapes once; Representation.of raises for unmatched data (07f7dc9)

  • core: Component reads top-down (aaea169)

  • core: Definitions are built once, in Component.definition (885cd4a)

  • core: Destination stores one partition at a time; PartitionedDestination folds into it (11c8427)

  • core: Drop _data_fn and _defer_validation from the component surface (ce2a43e)

  • core: Drop the unused public methods from the component surface (f733a72)

  • core: One conform pass; strategies are RECONCILE and STRICT (0d38be5)

  • core: One SerializationContext for writing and reading a manifest; kinds own no serialisation (7b482e2)

  • core: Reconstruction keeps its own state in a Document; Component drops the reference helpers (9f88818)

  • core: Relation completeness is checked where the graph is whole, not in init (9f81dd5)

  • core: Relation reads as a declaration: kinds and keys are properties, local, has_fallback (de6d687)

  • core: Relation.name and Relation.target are derived, not declared (67cc0fd)

  • core: Representation.of(data) returns a View bound to the data, with to(key) conversion (bb8bb60)

  • core: Source reads top-down; the hook body is the hook (c28576d)

  • core: The relation collector is a class-creation internal, not API (078d062)

  • core: The three destination hooks are abstract (ffe4bdc)

  • google-cloud: BigQuery loads every representation through one DataFrame path (fc6aa88)

  • google-cloud: Drop dispose() from the BigQuery and GCS destinations (5d4ebbb)

  • google-cloud: One type table for BigQuery, in standard SQL names (1ac036f)

  • scheduler: Hooks match on the watches relation; the DAG joins read-only upstreams (e5b6f7d)

Testing

  • agent: A source without connection relations rejects a connection (21b7631)

  • core: Pin sibling wiring and optional inference under depends_on (308bd72)

  • db: Hydration tests read bindings through the relation attributes (e0b0efc)


Detailed Changes: v0.77.0...v0.78.0