Inspiration
Most ML "safety" tools walk backward from a broken model. The question warehouses and fraud teams actually ask is the opposite: a data source went bad for three weeks — which deployed things learned from it, and which ones are still clean?
That answer lives across a gap we measured on DataHub GMS v1.6.0. get_lineage through the Agent Context Kit returns dozens of hops at the dataset layer… and zero hops from training set → model → deployment. The edges are stored in aspects. Agents just can't traverse them. An empty lineage result looks like "nothing's affected." That's a lie during an incident.
Recall exists to close that gap — and to make the answer operational, not a PDF.
What it does
- Notices when a source starts producing bad data (cheap thresholds — no LLM every tick).
- Investigates via DataHub's Agent Context Kit; every date boundary needs cited evidence.
- Decides with a deterministic kernel — no LLM in the blast-radius math. Example: 47 robots grounded, 71 spared; naive downstream stops 118.
- Gates autonomy with policy (max machines, max site share). Too big → escalate and wait.
- Writes back into DataHub:
recalledtag, banner on the model, deployments flipped toOUT_OF_SERVICE, recall Document via ACK. - Interlock — the unit reads catalog status URN-direct and refuses to arm.
- Recovers when the source is healthy and a clean model has shipped.
Same engine, second domain: labelling vendor → fraud scorer → API endpoints → 31 grounded / 54 naive / 23 spared, zero kernel changes.
Invariant: The agent proposes. A deterministic kernel decides. No model ever decides whether a machine is allowed to move.
How we built it
- DataHub Agent Context Kit for agent reads +
save_document/add_tags - Native aspects for
MLModelDeploymentstatus (IN_SERVICE/OUT_OF_SERVICE) - Pure deterministic kernel + policy + Sentinel loop
- Recall MCP server for the hops DataHub can't traverse
- DataHub Skill (
skills/datahub-recall/) teaching the workflow and the lineage gap - Offline-first path:
./run.sh, hosted demo, 39 tests — judges don't need Docker for the core claim
Challenges we ran into
- ACK /
get_lineagesilently returns empty across the ML hop — easy to misread as all-clear MLModelDeploymentisn't a GraphQL entity; UI pages 404 even when aspects are correct- Search index lags after writes — all status reads are URN-direct
- Keeping the LLM out of the decide path without turning the project into a report generator
Accomplishments that we're proud of
- End-to-end live loop: investigate → write-back → interlock GROUNDED (see
examples/sentinel-live-datahub.txt) - Measured lineage-gap finding with repro:
docs/upstream-finding.md - Upstream issue: datahub#19061
- Skills PR: datahub-skills#139
- Domain-general engine (robots and fraud endpoints), 39 tests, public Apache-2.0 demo
What we learned
Metadata only helps agents if they can traverse it. DataHub already stores model→deployment; projecting it into GraphQL and lineage would unlock a whole class of production safety agents. Until then: aspect-direct reads + write-back as a control plane is the workable pattern.
What's next for Recall
Land the skills PR, push the GraphQL / DeployedTo projection fix, and wire continuous perception against live assertion / run-event streams — not just synthetic fleet quality.
Log in or sign up for Devpost to join the conversation.