HACKATHON SUBMISSION · ANTHROPIC · APRIL 2026 · BUILT ON CLAUDE OPUS 4.7

Vellum

v1 · single-user · deployed

“A durable investigation system where the dossier is the primary surface, not chat.”


“Vellum is for the kind of question that doesn’t belong in a chat window — a consequential decision with several unknowns, where the obvious answer may be dangerous if key facts are wrong. Layoff decisions. Housing decisions. Ransomware payment decisions. FMLA questions. Credit-card debt negotiations after a parent dies with no estate. Any high-stakes situation where a chatbot producing confident output against a mis-framed question is worse than no output at all, because the user acts on it.”

“The agent doesn’t start by answering the question. It starts by auditing what the question is smuggling in.”
— premise challenge, recorded on first turn

The problem

WHY CHAT IS WRONG FOR DECISIONS

“Durable thinking on consequential questions doesn’t fit in a chat window. The answer a user needs often depends on assumptions the question itself smuggles in — legal framing that may not apply, facts not yet established, a decision model the situation doesn’t actually fit. ‘What percentage should I open credit-card-debt negotiations at?’ has no responsible answer until you’ve confirmed the debt is actually owed, the statute of limitations hasn’t expired, and the collector owns the account. The same structural problem shows up in layoff decisions, housing decisions, ransomware payment decisions, FMLA questions, infrastructure migrations — any high-stakes situation with several unknowns where the obvious answer may be dangerous.”

“Chat, structurally, dumps all the state into one scrolling transcript. A dossier that evolves — typed, stateful, structured — is the shape this problem actually has.”

WHAT MAKES IT DIFFERENT

Three load-bearing behaviors

Features are easy. Product thesis is harder. These three are the ones Vellum won’t compromise.

01 · Premise Challenge

Challenge the premise.

Before answering, audit what the question smuggles in.

On a new dossier, the agent’s first move is almost never to answer the stated question. It produces a record_premise_challenge tool call with the question’s hidden assumptions, a safer reframe, and the evidence required before any answer would be responsible. The premise challenge renders at the top of the dossier, above everything else, and gates substantive work alongside plan approval.

Concrete: a user asks “what percentage should I open credit-card-debt negotiations at for my deceased mother’s accounts?” Vellum refuses to quote a number until it has audited FDCPA validation status, statute of limitations in each relevant state, and whether the surviving children are personally liable under probate law. Quoting a number on the original question could restart the SoL clock. The helpful answer is the one that does the most damage. Pushback is not a feature — it’s the whole product.

Premise Challenge · 2d ago

“What percentage should I open credit-card-debt negotiations at for my friend’s deceased mother’s accounts?”

Safer reframe

Before proposing a percentage, audit whether negotiation is the right move at all. Three gates: has the collector sent FDCPA § 1692g written validation; is each account still within SoL; is the surviving family personally liable given no estate. If any gate fails, the correct response is procedural pushback — not an opening offer.

02 · Structured Writes

Structured data, not prose.

Every meaningful write is a typed tool call.

Vellum’s agent cannot emit prose directly to the dossier. Every meaningful write goes through a closed set of typed tool calls. Free-text thinking evaporates at turn boundary; what persists is structure: sections with state, needs-input questions, decision points, working theory with confidence, sub-investigations with scope and findings.

This is the opposite of chat. Chat records every word. Vellum records only what survives the filter of “is this a structured update to the case file?” The transcript is gone by design. What remains is the dossier as it evolved — not a log of how it got there.

  • upsert_section(title, content, state, sources)
  • flag_needs_input(question, blocks_section_ids)
  • flag_decision_point(title, options, kind)
  • record_premise_challenge(original_question, hidden_assumptions, safer_reframe, …)
  • update_working_theory(recommendation, confidence, why, what_would_change_it)
  • spawn_sub_investigation(scope, questions, parent_section_id)
  • summarize_session(what_moved, confirmed, ruled_out, blocked_on)
  • mark_investigation_delivered(summary)
// prose without a tool call evaporates at turn boundary
03 · First-Class State

First-class state beyond ‘running’.

Confident, provisional, blocked. Active, paused, delivered.

Every section carries a state pip: confident, provisional, or blocked. Plan items have status: planned, in-progress, completed, abandoned. Dossiers carry status: active, paused, delivered. Needs-input and decision-points are first-class surfaces, not afterthoughts. A working theory carries a confidence level the user can read at a glance.

This matters because the user is returning after hours away. They need to see not just what the agent found but how sure it is — and what is currently blocked on them. State is a UI affordance, but it’s also the agent’s own scaffolding for what ‘progress’ means. Demotions happen: when a key fact becomes unknown, a confident section drops to blocked. Promotions happen when confirmation lands.

Confident Provisional Blocked
Sub-investigation · Running · 18h

California-specific protections beyond federal FDCPA — the Rosenthal Act, CA Civ. Code § 1788.18

Does Rosenthal give a private right of action on its own?

THE DOSSIER · /STRESS FIXTURE

This is what the agent produces.

A real case file, rendered from the product’s no-network fixture at /stress. Same components, same typography, same content the agent writes through tool calls.

Scroll the exhibit below — it’s a live HTML recreation, not a screenshot.

ACTIVE · DECISION MEMO · LAST VISITED 22h AGO · 2d OLD · 6 SUB-INVESTIGATIONS · 3 WORK SESSIONS

“Credit card debt negotiation — renegotiating deceased parent’s credit card debts when there’s no estate (CA/AZ jurisdiction)”

My close friend’s mother passed last October leaving two credit-card balances (Chase ~$8,400, Citi ~$3,100). There is effectively no estate. Collectors are calling my friend directly at her California number, and also reaching her brother in Arizona. She wants to handle it without a debt-settlement firm. She is asking what percentage to open at; before that, we need to confirm the debt is owed, validated under the FDCPA, and still within each state’s statute of limitations.


WAITING ON YOU 1 decision to resolve · 1 question to answer
PREMISE CHALLENGE · 47h AGO

“What percentage should I open credit-card-debt negotiations at for my friend’s deceased mother’s accounts?”

Before proposing a percentage, audit whether negotiation is the right move at all. Three gates: has the collector sent FDCPA § 1692g written validation; is each account still within its state’s statute of limitations; is the surviving family personally liable given no estate. If any gate fails, the correct response is procedural pushback — not an opening offer.

HIDDEN ASSUMPTIONS
  • the debts are actually owed by anyone the collectors can pursue
  • negotiation (rather than validation or SoL defense) is the correct tactic
  • the surviving children have personal liability for a parent’s unsecured debt
  • the collector currently calling is the actual current owner of the account
REQUIRED EVIDENCE BEFORE ANSWERING
  • written FDCPA validation notice on file for each account
  • date of last payment on each account, confirmed from statements
  • probate status — confirmation there are no probate assets to pursue
  • jurisdiction confirmation (CA vs AZ SoL) for both siblings
CURRENT WORKING THEORY · 45m AGO

Do not negotiate yet. Send the FDCPA validation-request letter by certified mail this week; hold the opening-offer question until validation returns and SoL on the Chase balance is confirmed as expired.

MEDIUM CONFIDENCE
WHY THIS IS THE CURRENT THEORY

The Chase balance is likely time-barred under CA CCP § 337 if the Q2 2021 last-payment estimate holds. Neither collector has sent written validation, which means the § 1692g 30-day window hasn’t even started. With no estate and no surviving spouse, CA probate law gives the surviving children no personal liability. Engaging with a percentage offer now could restart the SoL clock.

WHAT WOULD CHANGE IT

If the original Chase application shows a joint account (not authorized-user), community-property exposure comes back into play. If validation returns clean on both with original-creditor documentation, we reopen the opening-offer question — for the Citi balance only.

INVESTIGATION PLAN · APPROVED 2d AGO · REVISED 2×
  1. COMPLETED

    What is the statute of limitations on credit-card debt in California, and has it likely run on either balance?

  2. COMPLETED

    What is the SoL in Arizona, and does the brother’s Arizona residence pull AZ rules in for any reason?

  3. IN PROGRESS

    Under CA/AZ probate and community-property law, are the surviving children personally liable for these debts given there is no estate?

  4. IN PROGRESS

    Have either of the two collectors (Midland Credit Management, MRS BPO) been subject to recent CFPB enforcement that would change our leverage?

  5. PLANNED

    Given the likely validation and SoL picture, what’s a reasonable opening-offer range if we do decide to negotiate?

Linked investigation questions

SUB-INVESTIGATION · DELIVERED · 18h

CA statute of limitations — CCP § 337 governs (4 years, written contract)

Verbal acknowledgment CAN restart the clock per Martinez v. Portfolio Recovery (Cal. App. 2019).

SUB-INVESTIGATION · DELIVERED · 14h

Probate + community-property: do surviving children have any theory of personal liability?

No. No CA filial-responsibility statute reaches consumer credit; community-property reaches spouse only.

SUB-INVESTIGATION · RUNNING · 18h

California-specific protections — Rosenthal Act, CA Civ. Code § 1788.18

Running. 18h elapsed.

SUB-INVESTIGATION · DELIVERED · 6h

CFPB enforcement history — Midland CM and MRS BPO

MRS BPO has a live 2023 consent order requiring itemization on request — directly relevant.

SECTIONS · 8 OF 8
Where this stands
CONFIDENT

Your friend is being contacted by two debt collectors on balances left behind when her mother passed. There is no estate. The core question is not what percentage to open at — it is whether she has to, or should, engage at all. Three gates before any negotiation: FDCPA validation, SoL check in CA and AZ, personal-liability check under CA probate.

Statute of limitations — California (4 years, written contract) and Arizona (3 years, open account)
CONFIDENT

California treats credit-card debt as a written contract under CCP § 337 — four years. Arizona treats it as an open account under A.R.S. § 12-543 — three years. Chase last payment ~Q2 2021 puts that balance past CA’s window. Citi last payment ~Q1 2022 is still live today.

leginfo.ca.gov nclc.org
Open: was your friend ever on either card as a joint account holder?
BLOCKED

Blocked pending user answer; don’t start calls until this is answered. Authorized-user status is common and does NOT create personal liability. Joint account holder DOES. Everything downstream turns on this.

NEEDS YOUR ANSWER · 8h AGO · BLOCKS 2 SECTIONS

Were you ever on either the Chase or Citi card as a joint account holder — i.e. did you sign the original cardholder agreement yourself — or were you strictly an authorized user who could use the card but wasn’t on the contract? Check the original application paperwork if you still have it; a phone call to each card’s customer service line will also confirm.

DECIDE · 4h AGO

Parallel validation requests on both accounts, or sequential — Midland first, wait for response, then MRS BPO?

SEND BOTH VALIDATION LETTERS THE SAME WEEK (PARALLEL) RECOMMENDED

Both 30-day windows run simultaneously. Cleaner follow-up calendar. Slightly higher cost ($16 vs $8). If both collectors ignore, single CFPB complaint can reference both.

SEND MIDLAND FIRST, WAIT 30 DAYS, THEN MRS BPO

Simpler to track one window at a time. Lower initial cost. But doubles the calendar time before either is resolved and gives MRS BPO another month of unchallenged call volume.

Every block above is a rendered output of a typed tool call. The agent cannot write anything else — no chat reply, no loose prose, no ‘thoughts’. The dossier is the transcript.

UNDER THE HOOD

How it actually works.

No framework magic. A manual agent loop over the Anthropic Messages API, 24 Pydantic-typed tools, a 30-second scheduler, and SQLite-backed durability. Listed here because judging what’s real in a demo is the point.

The turn loop

STUCK DETECTION BUDGET SIGNAL PROGRESS-FORCING SYSTEM PROMPT PER-TURN STATE SNAPSHOT CLAUDE claude-opus-4-7 TOOL CALLS SQLITE NEXT TURN regenerate from SQLite

Every turn starts with a freshly serialized state snapshot — dossier, sections, open needs-input, open decision-points, budget, recent tool calls — injected as a single system-level message. The model reasons, emits tool calls, and the turn closes. Prose without a tool call evaporates. The state snapshot regenerates from SQLite on every turn, which is what makes pause/resume boring: it’s always a cold start against current truth.

Sleep-mode scheduler

A single asyncio coroutine polls every 30 seconds. It picks up dossiers where wake_pending=1 (someone just resolved a decision-point or answered a needs-input) or wake_at <= now (the agent asked to sleep until a wall-clock time). It starts a work-session. That’s the whole thing. On app boot, a lifecycle reconciliation sweep finds orphaned work-sessions — processes that died mid-turn — and marks them interrupted_crash, returning the dossier to a resumable state.

The agent can call schedule_wake(reason, at) when a real-world interval is the blocker: waiting on a certified-mail response, a collector’s 30-day FDCPA window, a business opening in the morning. User actions trigger reactive wake within one tick. The scheduler never terminates the agent mid-thought — crossing a budget cap surfaces a decision-point the user can steer; it does not kill the run.

Sub-investigations

When the plan calls for a narrow, scoped question — “What’s the CFPB enforcement history on this collector?”, “Is there a CA filial-responsibility statute that reaches consumer debt?” — the agent calls spawn_sub_investigation. This runs a scoped sub-agent loop with a narrower tool surface (no plan edits, no new premise challenges), executes synchronously against the parent turn, and returns a return_summary plus concrete findings_section_ids that land back in the parent dossier. Depth is capped at one. Sub-runs are bounded and cheap; parent runs remain coherent.

The tool surface

24 TYPED TOOLS · PYDANTIC-BACKED · CLOSED SET

record_premise_challengeAudit the question’s hidden assumptions before substantive work.
update_investigation_planDraft or revise the investigation plan.
update_working_theoryA one-sentence belief + confidence + why + what would change it.
upsert_sectionWrite or revise a finding, summary, or evidence into the dossier body.
update_section_statePromote/demote confident · provisional · blocked with a reason.
delete_sectionRemove an obsolete section with a reason.
reorder_sectionsRearrange section order.
flag_needs_inputAsk the user one crisp factual question; block on the answer.
flag_decision_pointPresent a choice between structured options; block on the pick.
append_reasoningPrivate note for coherence across work sessions.
mark_ruled_outRecord a rejected hypothesis with reason.
mark_considered_and_rejectedFull cost-of-error argument for a path not taken.
check_stuckLoop-/budget-detection surface (v1).
declare_stuckTyped stuck escalation with recommended default (v2).
request_user_pasteAsk the user to paste a specific document.
add_artifactAttach a reusable artifact (letter, script, checklist).
update_artifactRevise an artifact with a change-note.
spawn_sub_investigationLaunch a scoped sub-agent loop; returns synchronously.
update_sub_investigationRefresh a running sub-investigation’s current finding.
complete_sub_investigationDeliver a sub-investigation’s findings to the parent.
log_source_consultedLog a source without writing it into the dossier.
summarize_session“While you were away” summary: confirmed, ruled-out, blocked.
mark_investigation_deliveredClose out the dossier with a deliverable summary.
schedule_wakeAsk the scheduler to wake the agent at a wall-clock time.

Stuck escalation and soft-signal budgets

The agent escalates when it notices itself looping or missing progress over a turn window. Tier 1: a reasoning-trail note. Tier 2: a decision-point the user resolves. Tier 3: a recommended-default decision-point that auto-picks if the user doesn’t pick within an interval. Progress-forcing prevents section-edit loops from counting as work.

Budget tracking is soft-signal. Per-session and per-day USD caps and warn fractions are DB-backed and editable in /settings. Crossing a warn fraction surfaces a heads-up. Crossing the cap surfaces a decision-point — “Mark what I have as delivered,” “Keep going,” “Redirect” — it never terminates the agent mid-thought. Every turn is real money; the product treats it that way without being precious about it.

Stack

BACKEND
Python · FastAPI · Pydantic · SQLite
FRONTEND
React · TypeScript · Tailwind · Vite
AGENT
Direct Anthropic Messages API, manual agent loop (not Claude Agent SDK)
MODELS
claude-opus-4-7 (main loop) · claude-sonnet-4-6 (intake) · claude-haiku-4-5 (session-summary synthesis, reserved)
RUNTIME
asyncio scheduler (30s poll) · SQLite-backed work-session durability · lifecycle reconciliation on boot
SCOPE
v1 single-user · local development plus API-token-enforced production behind a reverse proxy

Out of scope: multi-user, auth, notifications, mobile, rich-text editor, LLMs other than Claude.