← All posts

A data room that fills itself

The collector files fresh material into the room it belongs to, with its score and the evidence behind it, and a Remove that undoes it for good. It had never once worked in production — until today.

Vocion Teamvocion-v2.123.1

A data room is only worth opening if it is current. The whole promise of one — the document is written from the room, so what the agent writes from is what you can check — collapses the moment the room is a folder somebody has to remember to drag things into.

So the room has a collector: after every source sync it looks at what has come in, works out which room each piece belongs to, and acts on how confident it is. No queue to work, no "file this?" for every transcript.

Here is the part we owe you first. It had never actually worked in production. The mechanism was right and the bug was one line: the collector's candidate query only ever looked at documents the sync had just changed, so on an incremental hourly sync there was nothing to consider but that hour's handful of deltas. A room opened this morning could never reach back to the email thread that named its client last week. The 30-day window the code documented was unreachable. It is fixed, and the rest of this post is what the thing does now that it runs.

What it looks at

Not only what the sync just touched — that was the bug. The candidate set is the source's last 30 days: everything that run touched, plus everything in the window whose title or metadata names an open room by domain, client, codename or alias. Newest-touched first, so the per-run cap is deterministic rather than arbitrary.

Re-reading the same documents every hour sounds wasteful and is in fact the point. A room opened today has to be able to collect material that arrived before it existed. The dedupe machinery only makes sense if a run re-sees the same documents: a filed document is skipped, one a person took out is remembered, and an ask is an upsert on the document, so the same question can never be raised twice.

Material means transcripts, threads and shared documents — Zoom recordings, Granola notes, Gmail threads, Drive files, uploads. A CRM record is not material: it is the anchor's side of the room, not something filed into it.

How a filing is scored

One score between 0 and 1, built from signals that each write down their own evidence:

SignalAddsEvidence it writes
A sender or attendee on a domain the room collects0.6, plus 0.1 per extra domain, to 0.8domain northwind.example
The client, codename or an alias in the title0.5"northwind" in the title
…or in the body instead0.3"northwind" in the text
Someone on the room's cast on the thread0.3amy@northwind.example is on the cast

Then the confidence decides, and the confidence is the whole behaviour:

At 0.75 or above, and at least 0.2 clear of the next-best room, it files. The source lands in the room as an automatic filing carrying its score and its evidence, and the room shows both: Kestrel Capital — Q4 rollout call · filed automatically · 92%. The export bundle an agent reads carries the longer form — filed automatically at 92% (domain kestrel.example, "kestrel" in the title) — so the claim and the reason for it travel together.

At 0.45 or above, it asks instead of filing. That becomes a Choice on Review: File "Third call — Larkfield Systems" into Larkfield Systems — platform build?, with the top candidate rooms listed and the recommended one marked, plus the option to open a new room. A near-tie between two rooms lands here too, even at a high score, because a document that matches Contoso Supply and Contoso Logistics equally well is not a clear match — it is a question.

Below that, nothing happens. A transcript of an internal stand-up is not a new opportunity, and a sync is no place to ask about every document it saw.

The entity side is kept the same way. A CRM deal a sync shows at a Proposal stage that no room is anchored to gets a room, with the deal as its anchor, the stage in the CRM's own words, and the deal's name as an alias so its calls file themselves from then on.

The Data rooms list: one room per entity — its anchor, its source and open-item counts, its date and its stage

The undo is the whole reason it can file at all

Every automatically filed source has a Remove on the room page. No confirmation dialog. The row goes, the document stays in the knowledge base, and — this is the part that matters — the collector remembers the removal and will never file that document there again on its own. Putting it back is a deliberate act: a person, or file_to_data_room with the room named.

That is what makes filing-by-default defensible rather than reckless. An agent that files a hundred things and cannot be told "not that one, not ever" is not doing work for you, it is making work for you. The same is true one level up: closing a room is the undo for a room the collector opened from a deal.

This is the standing rule across Vocion, and the collector is one of its clearest cases. Above the bar it acts and shows what it did, with the undo one click away. Below the bar it asks, with a recommendation. An approval gate on every filing would be a queue nobody works — and a room that grows only as fast as the person with the most meetings can remember to feed it.

What to check

If you are running the data-rooms plugin, the first sync after upgrading is the interesting one: the collector can finally see the last 30 days, so a room that has been sitting empty should stop being empty. Every row it adds says how confident it was and why, and every one of them has a Remove.

Two smaller fixes rode along, both found by reading real data next to the code. Email addresses were being taken from the From header verbatim, so a header like Amy Larkin <amy@northwind.example> produced the domain northwind.example> — a trailing angle bracket that matched nothing, silently disabling the strongest signal the scorer has. And the query terms that select candidate documents now use the room's identity — its domains, client, codename and aliases — and never its cast. Half a cast is your own side, and "every message naming our own partner" is the entire mailbox. Identity selects; people score.

Data rooms has the full behaviour, including the rules, notes and open items a room keeps beside its sources.