Skip to content

Deterministic Metric Catalog and Feature DAG

P5 exposes three JSON-only data-layer capabilities: metric_catalog, feature_dag_execute, and multi_source_comparison. They do not accept formula text, source code, Python, Bash, notebooks, templates, or HTML. A caller can only select a registered (formula_id, formula_version) and bind its declared inputs to PIT facts or earlier DAG nodes.

Catalog contract

Every formula declares its input schema and value kinds, output kind, frequency, unit, currency semantics, missing-value policy, time semantics, resource cost, operator id, semantic version, and at least one test vector. Catalog version metric-catalog-v1 contains the migrated neutral metrics and the fixed margin_gap compatibility formula. Formula vector tests run the same fixed operator implementations used by the DAG.

Execution and identity

The DAG rejects duplicate ids, undeclared parameters, unknown formulas or versions, missing bindings, cycles, future-known/future-effective facts, missing evidence, and resource overruns. Limits cover facts, nodes, edges, depth, cost, and array items. Ready nodes are ordered lexicographically, numbers use Decimal, and request/output serialization uses sorted compact canonical JSON. Cache keys bind the tenant, as-of time, facts, evidence, formula versions, graph, outputs, limits, and catalog version.

Errors are structured codes: feature_dag_cycle, feature_resource_limit_exceeded, unknown_feature, feature_version_not_found, missing_pit_input, feature_input_schema_mismatch, and feature_calculation_error.

Derived lineage and comparison

Each derived value carries its formula id/version, direct inputs, transitive input fact ids, every evidence id, every provider id, request as_of, maximum input known_at, and a canonical content hash. Nested nodes never collapse lineage.

Multi-source comparison groups by field, preserves all provider observations, time, evidence, quality, and coverage, then emits every pairwise equality and numeric delta. selection is always null: the payload never decides which source or view is best and never silently overwrites a disagreement.

Only scalar, array, matrix, enum, and metadata fields are valid metric outputs. The service produces no narrative interpretation, report, prediction, signal, score, recommendation, target weight, optimization, or strategy conclusion.