v0.28.1 — dump omit-empty fix + example/doc coverage
Patch release following v0.28.0 (metric identity decomposition).
Fixed
dump_semantic_sourcenow omits emptydecompositions/drill_by. 0.28.0 emitted both keys on every metric even when empty, which diverged from the tools layer's omit-when-empty convention and changed a frozen contract'scontract_digestfor a source that declares no decompositions — re-freezing a pre-0.28 contract produced a different content address than under 0.27.x. A leaf metric now dumps byte-identically to the pre-0.28 format, socontract_digestis stable across the upgrade for contracts that don't use the new fields. Metrics that do declare decompositions/drill_by are unaffected and still round-trip.
Docs
- The
revenue_agentandgrowth_agentexamples now demonstrate the feature —revenue_agentaproductidentity (total_revenue = active_customers × revenue_per_customer) plus aregiondrill,growth_agentaratioidentity onconversion_ratethat exercises a mixed identity + influence graph fortrace_metric_impacts'skindsfilter. - Completed decomposition coverage in
docs/architecture.md(tool signature,lookup_metricfields,MetricDefinitionfield list).
Full suite green (724 tests); ruff / ruff format / ty clean.