v0.78.0
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