Skip to main content

V1 to V2 Transition Guide

HatiData V2 adds a Governed Runtime layer on top of V1's analytical infrastructure. V1 continues to work — V2 is additive, not a replacement.

V2 Is Additive

Your existing V1 queries, memory storage, and CoT ledger continue to work unchanged. V2 adds new tables under the hd_runtime schema and new /v2/ API endpoints. No V1 code needs to change immediately.

What Changes

New Schema: hd_runtime

V2 introduces 7 new tables in the hd_runtime schema:

TablePurposeV1 Equivalent
tasksIntent: what needs to be doneagent_task_queue (partial)
task_attemptsExecution: each run of a taskagent_task_logs (partial)
model_decisionsLLM routing decisions with reasoning(none)
llm_invocationsActual API calls with tokens/cost/latency(none)
artifact_instancesProduced outputs with content hashesagent_memories (partial)
artifact_validationsSchema + contract verification results(none)
workflow_eventsImmutable audit trail (append-only)agent_states + reasoning_steps

New API Endpoints

All V2 endpoints live under /v2/runtime/:

GET  /v2/runtime/tasks/:id           # Task with attempts
GET /v2/runtime/attempts/:id # Attempt detail
GET /v2/explain/:attempt_id # Full ExplainBundle
POST /v2/runtime/tasks/:id/claim # Claim queued task
POST /v2/runtime/attempts/:id/fail # Report failure
POST /v2/recovery/:attempt_id # Initiate recovery

V1 endpoints (/v1/*) continue to work. You can run V1 and V2 in parallel.

New Visibility Modes (Branching)

V1 branching used a single branch_id column with implicit fallback to mainline. V2 introduces explicit visibility modes:

ModeBehaviorUse Case
MainOnlyRead only from mainline (branch_id IS NULL)Verification agents that need canonical state
BranchLocalRead only from this branchIsolated experimentation
BranchWithFallbackRead branch first, fall back to mainlineNormal branch development
ExactKeyRead exact key match (no fallback)Contract-driven lookup

What Stays the Same

These V1 features are unchanged:

  • SQL proxy (port 5439) — Postgres wire protocol, Snowflake transpilation, DuckDB execution
  • MCP server — All 24 tools continue to work via /mcp
  • Agent memoriesstore_memory, search_memory, load_memory_exact unchanged
  • Chain-of-Thoughtlog_reasoning_step with SHA-256 hash chains unchanged
  • Semantic triggersregister_trigger, evaluate_triggers unchanged
  • Branch operationscreate_branch, merge_branch unchanged
  • ABAC policiesenforce_abac_policy unchanged
  • Python/TypeScript SDKs — Existing SDK methods continue to work

Migration Path

For Platform Builders (like Marviy)

If your platform manages its own task queue and agent lifecycle:

Step 1: Shadow Writes (Week 1)

Start writing to V2 tables alongside V1. This is non-blocking — if V2 writes fail, V1 continues.

# Before (V1 only)
hatidata.insert_agent_task_log(project_id, agent_type, result)

# After (V1 + V2 shadow)
hatidata.insert_agent_task_log(project_id, agent_type, result) # V1 unchanged
hatidata.v2_create_task(project_id, agent_type, task_class) # V2 shadow write

Step 2: Dual Read (Week 2-3)

Start reading from V2 for new features (lineage, explain bundles) while keeping V1 reads for existing features.

# Lineage query — new in V2
bundle = hatidata.v2_explain(attempt_id)
print(f"Cost: ${bundle.total_cost_usd}, Model: {bundle.model_decision.primary_model}")

Step 3: State Pivot (Week 4+)

Once V2 shadow writes are stable, migrate your task queue to V2:

# Before: platform manages its own agent_task_queue
task = my_queue.pop_next()
result = agent.execute(task)
my_queue.mark_done(task.id)

# After: HatiData V2 manages the lifecycle
attempt = hatidata.v2_claim_task(task_id)
result = agent.execute(attempt)
hatidata.v2_complete_attempt(attempt.id, result)

Step 4: Delete Local Tables

Once all reads and writes go through V2, you can drop your local task management tables:

-- Safe to drop after V2 migration is complete
DROP TABLE IF EXISTS agent_task_queue;
DROP TABLE IF EXISTS active_phase_runs;

For Agent Developers

If you're building agents that connect to HatiData:

SDK Upgrade:

# Python
pip install --upgrade hatidata-agent>=2.0

# TypeScript
npm install hatidata-sdk@latest

No Code Changes Required — The SDKs detect V2 automatically and use the new endpoints when available. Your existing store_memory(), search_memory(), and log_reasoning_step() calls work unchanged.

New Capabilities:

from hatidata import HatiDataClient

client = HatiDataClient(host="api.hatidata.com", api_key="hd_agent_...")

# V2: Get lineage for an attempt
bundle = client.explain(attempt_id="att-001")
print(bundle.model_decision.primary_model) # "deepseek-ai/deepseek-v3.2-maas"
print(bundle.total_cost_usd) # 0.0031

# V2: Query with visibility mode
results = client.search_memory(
query="architecture decisions",
visibility="MainOnly", # Only mainline, no branch leakage
)

SQL Compatibility

V2 introduces the hd_runtime.* schema. These tables are queryable via the SQL proxy:

-- Query V2 tables directly
SELECT * FROM hd_runtime.tasks WHERE project_id = 'proj-abc';

-- Join V1 and V2 data
SELECT
t.agent_type,
a.status,
m.memory_key,
m.value
FROM hd_runtime.tasks t
JOIN hd_runtime.task_attempts a ON a.task_id = t.id
LEFT JOIN agent_memories m ON m.project_id = t.project_id
WHERE t.project_id = 'proj-abc';
Postgres Passthrough

hd_runtime.* queries bypass DuckDB and use Postgres passthrough — they execute directly against the control plane database. This means they don't benefit from DuckDB's columnar query optimization but have lower latency for transactional reads.

Breaking Changes

V2 has no breaking changes to V1 APIs. The following are behavioral changes to be aware of:

ChangeImpactAction
workflow_events is append-onlyCannot UPDATE/DELETE event rowsUse V2 event queries instead of V1 state mutations
One active attempt per taskCannot have two agents on same taskEnsure your dispatcher doesn't double-assign
Lease heartbeat requiredAgents must send heartbeats every 60sSDK handles this automatically

Rollback

If V2 causes issues:

  • Sprint 1: DROP SCHEMA hd_runtime CASCADE — complete removal
  • Sprint 2+: Feature flag disable only (schema preserved for audit)

V1 continues to work regardless of V2 state.

Next Steps

Stay in the loop

Product updates, engineering deep-dives, and agent-native insights. No spam.