#[0.16.0] - 2026-04-17
Major release introducing the Skills system — a new primitive that bundles domain instructions with tools — alongside full Google Cloud Platform catalog coverage, a modular per-source normalizer architecture, agent-facing graph traversal tools, and a comprehensive exception hierarchy refactor.
#Added
-
Skills System (
daita/skills/)A new first-class primitive sitting between raw tools and full plugins. Skills bundle domain-specific instructions with related tools, carrying behavioral intelligence that plugins (infrastructure connectors) do not.
pythonfrom daita import Agent, Skill, tool @tool def format_report(data: list, title: str) -> str: """Render a markdown report.""" ... report_skill = Skill( name="report_gen", description="Produces polished analytical reports", instructions="Always render results as markdown with a title and bulleted rows.", tools=[format_report], ) agent = Agent(name="Analyst", llm_provider="openai", model="gpt-4o") agent.add_skill(report_skill)Subclass
BaseSkillfor dynamic instruction generation, plugin dependencies (viarequires()), or instructions loaded from a file. Skills areLifecyclePluginsubclasses, soon_before_runhooks automatically inject instructions into the system prompt. A newSkillErrorexception covers skill-specific failures (e.g., missing required plugins).BaseSkill,Skill, andSkillErrorare exported from the top-leveldaitapackage. -
GCP Catalog Support (
daita/plugins/catalog/gcp.py)Complete Google Cloud Platform infrastructure discovery, matching the AWS coverage introduced in 0.14.0. The new
GCPDiscovererenumerates resources across a project with per-service discoverers for:- BigQuery — datasets, tables, and column schemas
- Firestore — collections and document schemas
- Bigtable — instances, tables, and column families
- Cloud Storage (GCS) — buckets and inferred file schemas
- Pub/Sub — topics and subscriptions
- Memorystore — Redis instances
- API Gateway — APIs, configs, and gateways
pythonfrom daita.plugins import catalog cat = catalog() schema = await cat.discover_gcp( project_id="my-project", credentials_path="service-account.json", )Install with
pip install 'daita-agents[gcp]'. The[cloud]and[all]bundles now pull in the full GCP stack. -
Modular Normalizer Architecture (
daita/plugins/catalog/normalizer/)The monolithic
normalizer.py(746 lines) has been split into per-source modules, mirroring the discoverer/profiler pattern. Each normalizer is now a focused file undercatalog/normalizer/:_postgresql,_mysql,_mongodb,_dynamodb,_documentdb,_s3,_gcs,_sns,_sqs,_kinesis,_opensearch,_bigquery,_bigtable,_firestore,_memorystore,_pubsub,_apigateway,_gcp_apigatewayA shared
_common.pyholds cross-source helpers. The package__init__.pydispatches to the right normalizer based on source type, producing the same unifiedNormalizedSchemaoutput. -
Graph Traversal Tools for Agents (
daita/core/graph/tools.py)Generic, edge-type-agnostic graph primitives that agents can call directly. Registration is opt-in to keep unrelated agents' tool lists focused:
pythonfrom daita.core.graph import register_graph_tools agent = Agent(name="Impact Analyst", llm_provider="openai", model="gpt-4o") agent.add_plugin(lineage()) register_graph_tools(agent)Exposes two tools:
graph_subgraph(root, depth, edge_types?, direction?)— return nodes and edges reachable withindepthhops; covers neighbors and bounded expansions in a single primitive.graph_shortest_path(from_id, to_id, edge_types?)— return the shortest path between two nodes, or null when unreachable.
-
Graph Algorithms Expansion (
daita/core/graph/algorithms.py)New stateless traversal algorithms operating on
nx.MultiDiGraph:ancestors,descendants,find_paths,shortest_path,connected_component,impact_analysis,default_subgraph, andtraverse.Every traversal accepts an optional
edge_typesfilter, implemented once as a NetworkX edge-subgraph view (O(|E|) with no copy). A newLINEAGE_EDGE_TYPESconstant captures the semantic set of data-flow edges (READS,WRITES,TRANSFORMS,SYNCS_TO,DERIVED_FROM,TRIGGERS,CALLS,PRODUCES) so lineage tooling doesn't accidentally walk into structuralHAS_COLUMNorINDEXED_BYedges. -
Graph Resolution Layer (
daita/core/graph/resolution.py)Single source of truth for mapping bare table references (e.g.,
"orders") to fully-qualifiedResolvedTablevalues keyed bytable:<store>.<name>. Used byLineagePlugin.track(...),capture_sql_lineage(...), andDataQualityPlugin.report(...).A new
AmbiguousReferencePolicycontrols behavior when a bare name matches multiple stores:STRICT(default) — raisesAmbiguousReferenceErrorso callers don't silently clobber data across stores.LENIENT— returns the most-recently-updated candidate and logs a warning.UNRESOLVED_SENTINEL— returns a placeholder under a synthetic__unresolved__store; the catalog persister promotes it into a canonical node once discovery emits a matching table.
-
Structural Graph Types
NodeTypegainsINDEX;EdgeTypegainsINDEXED_BY,COVERS, andREFERENCES. These support richer catalog modeling (indexes, foreign-key references, covering indexes) while remaining excluded from default lineage traversals. -
Catalog Base Profiler (
daita/plugins/catalog/base_profiler.py)New
BaseProfilerabstract class formalizing the profiler contract across AWS and GCP services, matching the existingBaseDiscoverer. -
Code-Review Agent Example (
examples/deployments/code-review-agent/)New end-to-end deployment example showing the Skills system in practice: a code-review agent composed of a
SecurityReviewSkill(loaded from a markdown prompt file) and aCodeQualitySkill, plus a full test suite and deploy manifest. -
Integration Test Harness (
tests/integration/_harness.py)New harness and live integration suites exercising real backends for catalog (AWS, GCP, MongoDB, MySQL, PostgreSQL, GitHub), lineage, and deep graph-accuracy scenarios.
#Changed
-
Exception Hierarchy Refactor (
daita/core/exceptions.py)DaitaErrorand its subclasses have been restructured around a shared_enrich()helper that merges named fields (e.g.,agent_id,task,provider,model) into the context dict while skippingNonevalues. Subclass constructors are now 5–10 lines each instead of 20+, and domain-specific context is consistently propagated without boilerplate. The public API is unchanged — imports, attributes, andis_transient()/is_retryable()/is_permanent()all behave as before. -
Lineage Plugin Rewrite
LineagePluginnow delegates to the graph resolution layer for all bare-name lookups, uses the new edge-type-aware traversal algorithms, and exposes cleanertrack,analyze_impact, andfind_pathmethods. Configurable viaAmbiguousReferencePolicy. -
Catalog Tools Overhaul (
daita/plugins/catalog/tools.py)The catalog plugin's agent-facing tools were reworked for consistency with the new discoverer/profiler/normalizer split. Tool schemas, naming, and return shapes were aligned across AWS, GCP, and GitHub sources.
-
Catalog Persistence Expansion (
daita/plugins/catalog/persistence.py)Persistence layer extended for the new GCP sources and updated to handle
INDEX/REFERENCESnodes and edges, including unresolved-sentinel promotion during re-discovery. -
table_idon Graph ModelsGraph nodes and edges now carry explicit
table_idmetadata where applicable, enabling fast lookups across mixed-store catalogs without parsing node keys.
#Removed
-
daita/core/plugin_tracing.py(557 lines)The legacy plugin-tracing module has been removed. Tool-execution and LLM-call spans introduced in 0.15.1 (via
Agent._execute_and_emitandBaseLLMProvider.generate) fully supersede it, with less code and cleaner span semantics. -
daita/core/decision_tracing.pyDecision-tracing scaffolding removed; the remaining observability needs are covered by the standard tracing spans.
-
Legacy
daita/plugins/catalog/normalizer.pyReplaced by the modular
normalizer/package. External imports fromdaita.plugins.catalogare unaffected — the dispatcher continues to expose the samenormalize()entry point.