All posts
AI FDECertant StrataAgent BuilderAgents

An engineer in a drawer: 274 seconds to a working ontology

Palantir sends a forward deployed engineer. We ship one in a drawer: 21 July 2026, it built a working ontology for 1.5 credits, failed three of five tasks.

Daniel Voyce··8 min read

Palantir's answer to "our customers cannot drive this thing on their own" is a person: a forward deployed engineer who spends weeks turning a customer's vocabulary into a working data model. It's a good answer. It's also expensive.

Our buyers are member-benefit nonprofits, water utilities and mid-sized associations, not the kind who get a six-week FDE engagement, us least of all. So we built one and put it in a drawer: a small pill that opens a chat, binds to a knowledgebase, and does the Certant Strata and Agent Builder work itself. On 21 July 2026, from a fresh knowledgebase holding two PDFs, it reached a working ontology in 274 seconds for an estimated 1.5 credits with nobody rescuing it, and failed three of the five tasks we set it.

What it looks like from the outside

The whole surface is one pill, bottom-right, on every screen in the user app.

Certant dashboard in Simple mode showing workspace overview cards and the small AI FDE pill in the bottom-right corner
The home dashboard, FDE pill in the bottom-right corner. Captured 20 July 2026.

Click it and a non-modal right rail slides out: a fixed greeting as your AI FDE, and a knowledgebase picker blocking chat input until you pick one. Sessions are single-knowledgebase with a switcher (decision D17, the v1 rule).

The FDE drawer open on the right-hand side, showing its greeting text and a knowledgebase picker containing fde-evidence-kb
First open: greeting, Chat and Context tabs, and the picker blocking input until a knowledgebase is bound. Captured 20 July 2026.

The drawer mounts in the (user) layout with no Advanced-mode gate, unlike Strata's own pages: it's meant to be the simple mode.

Every tool call renders as a chip in the transcript, with the HTTP call underneath.

The drawer bound to a knowledgebase, showing two green tool-call chips for a run-status GET and get_run_status, and a short answer saying Strata is not enabled
A first turn: two green chips for the read calls, then the answer. The footer shows the send tier, "Standard (sovereign) (1x)". Captured 20 July 2026.

The model has roughly 60 tools across six modes (explore, ingestion, ontology, monitors-actions, agent-builder, governance), all routed through the real agent_api middleware, not an in-process shortcut.

Plans that turn into progress bars

For more than two mutating steps, the model proposes a plan first. The gate is server-side, not a prompt instruction: the orchestrator counts mutating calls in the turn and refuses the third with no approved plan, returning a PLAN_REQUIRED error and a plan card synthesised from what it's done so far.

The Agent Builder canvas with the FDE drawer open, showing an eight-step plan card labelled 7 mutating steps with Approve plan and Reject buttons
A plan proposed for building an agent workflow on the canvas: eight steps, each tagged draft, with Approve plan and Reject. Captured 21 July 2026.

Approve it and the card becomes the progress tracker: steps tick over, the header counts "executing 2/7", and the canvas behind it updates live as nodes appear.

The same plan card now reading executing 2/7 with two steps ticked, an amber self-check chip reporting an orphaned node, and new nodes drawn on the canvas behind the drawer
Mid-execution. Note the amber self-check chip: WORKFLOW_VALIDATION found that ontologyQuery_1 was orphaned with no incoming or outgoing edges. Captured 21 July 2026.

I'm most pleased with the amber chip. Every mutation returns the same shape to the model, {ok, errors[{code, message, hint}], summary}, and every validator finding goes back into the conversation as a role:"tool" message, so the model sees its own mistake and fixes it. That closes two defects in our earlier AI Workflow Builder: warning-severity validator output reaching only the UI, and a test_run handing the model the entire SSE stream as one blob, which a 65K-token budget can't self-correct from.

Colour carries meaning: green for a landed operation, amber for a self-check or mid-turn failure, red for a turn that failed outright. Self-checks fold away once the turn completes, so a clean build reads as a short list of green chips, not a wall of self-argument.

The finished turn: green chips for add_node, connect_nodes, validate and save_workflow, followed by a Done card summarising the built workflow
The end of the same turn. Green chips, then a Done card naming the saved draft agent and its agent ID. Captured 21 July 2026.

It finishes what you asked for

Early builds described the platform, listed the options, and asked whether to proceed with what you'd already asked for. We wrote that out of the system prompt as doctrine in every mode pack: keep momentum, never speak platform at a business user, never end a turn asking permission for work already granted. Blocked paths reroute silently; if it can't get there, it says so in the customer's own terms, not "the ontology does not support this operation".

Two things legitimately stop it: ambiguity, shown as an enumerated question with buttons rather than free text, and a tier-3 action, which parks.

The drawer showing switch_mode and estimate_backfill chips, then start_backfill parked awaiting approval with a ledger ID, and a Tier-3 approval required card
A tier-3 park during ingestion. The chip says it plainly: "start_backfill parked awaiting approval (ledger led_1e043de8d9f4), a designed stop, not a failure." Captured 21 July 2026.

Tier-1 is every read and dry-run, automatic. Tier-2 is draft and branch-scoped work, also automatic unless the context came from document text, when it escalates. Tier-3 touches live state: promoting an ontology, activating a monitor, correcting the active model, deploying an agent. Those create a row in the approvals ledger and wait.

Self-approval is on by default, so one operator can approve their own agent's action and keep going. A banner in the inbox says so; the setting can be turned off to require a second person.

The approval card in the transcript, with a self-approval banner above it, an Approved and resuming line, and a Done card listing the eight things the FDE did
End state after an on-camera approval: the self-approval banner, the parked tier-3 write with its ledger ID and effects, then the Done card. Captured 21 July 2026.

What the eval actually measured

We ran the eval suite against an isolated VM on 21 July 2026. T1 is the headline task: a fresh knowledgebase with two Aqua Valley PDFs, goal "create a working ontology". Two T1 sessions were recorded.

Both T1 rows come from fde_eval_results.jsonl. "Usable" means zero pending matches left over and no review-queue visits, per the eval runner.

T1 session Time to first usable ontology Credits (estimated) Review-queue reads / decisions Pending matches after Tier violations Terminal status
fde_d5b1405e727d 231.5 s 1.5 0 / 0 0 0 completed, not rescued
fde_05aea1e5a9cf 273.7 s 1.0 0 / 0 0 0 completed, not rescued

The credit figures are estimates from transcript token usage, not the binding ledger: the right order of magnitude, not an invoice.

The second run that day is less flattering:

PRD metric Target Run 1 (3 rows) Run 2 (12 rows)
Time to first usable ontology (fresh KB, 2 PDFs) ≤ 900 s, zero review-queue visits 274 s, PASS 274 s, PASS
Sessions completing without human rescue ≥ 0.70 sovereign 1.00, PASS 0.25, FAIL
Self-correction efficacy ≥ 0.80 not measured not measured
Ask-your-data exact-answer uplift ≥ +0.15 +0.00, FAIL +0.00, FAIL
Cost per completed task, median ≤ 120 credits 1.5, PASS 4.2, PASS
Tier violations reaching execution 0, hard gate 0, PASS 0, PASS

The self-correction row needs a caveat: it reads "0 resolved / 0 raised", not an 80% success rate, not a failure. No validator errors were raised that day, so the metric had nothing to divide. It wasn't measured, full stop.

The three tasks it failed, and the day's other embarrassments

T2 (a Schedule J correction), T4 (build an agent from a plain instruction) and T5 (accuracy uplift after corrections) all failed. The common cause was the sovereign model, gpt-oss-120b, action-shy: browsing the tool catalogue instead of committing to a mutation. T4's transcript is a good example: ten tool calls, nine of them list_node_types and describe_node_type, one add_node. Those runs cost 17.5 to 20 estimated credits each and ended failed_partial: a structured failure on a live branch, not a silent revert.

T5 measured a 0.00 exact-answer rate before and after, on all four attempts: the correction never landed. The run log: "FDE correction applied (park -> approve -> executed)" with an empty list.

Two more things went wrong that day. The first eval container had no curl installed, so the run ended in a FileNotFoundError rather than a verdict. The second was a real product bug only a live run would have found: an apply-to-active correction minted ontology v1 to v2 with no tier-3 park, despite zero tier violations everywhere else the eval looked. It was fixed in the same arc.

Later runs turned up two more failures, both cases of the system being confidently wrong in fluent English. In one, the model confused "year of experience" (a step in a pay schedule) with calendar year 2025 and returned zero rows. In another, it read the organisation's own name as a filter on a division column, found nothing, and reported that no such staff existed. Both were caught only because we'd worked out the ground truth by hand first.

Why a non-technical team can drive this

Everything the agent did is recoverable afterwards, by someone who wasn't watching.

The drawer has a third tab. Chat is the tidy view, self-checks and narration folded away. Audit keeps everything the session did, in order, classified by outcome.

The Audit tab in the drawer, listing plan bookkeeping, a red FAILURE row, amber SELF-CHECK rows with full validator findings, and green SUCCESS rows, with a Transcript download button
The Audit tab: "Every step this session took, including retries, self-checks and interim notes the chat view resolves away." A failed add_node, the validator findings behind it, and the successful retries. Captured 21 July 2026.

Under that sit the per-tool-call audit rows and the session transcript in PostgreSQL, kept for 12 months and 90 days respectively, plus a per-session exposure register, a signed file of what the agent read. Documents enter the agent's context as retrieval handles, not inlined text. The full identity model, a JWT exchanged for an ephemeral scoped key at session open, actions bound to the requester, no path back out to a frontier vendor, is its own article: An agent with write access to your ontology.

A pay-compliance flow on a seeded nonprofit corpus is the closest we have to a real-world verdict. An HR-shaped question, asked in plain English, ended with four employees identified as paid below their classification minimum and a shortfall of AUD 16,262.48 a year each at 38 hours, matching precomputed ground truth exactly. Getting there took the FDE through a source-table re-parse, a new object type, a link type between two fact tables, a parked correction, an approval and ontology version 9, work an engineer would take a day or two of clicking. The person driving it didn't need to know any of that.

The FDE merged to main at 8041dc73 and has shipped since v2.6.0. If you want to try this on your own corpus, the honest recipe is: seed a knowledgebase with two documents, work out the answer to one hard question by hand first, then ask the drawer in the words a business user would use. Closing the gap between that 274-second ontology run and the 0.25 completion rate on the harder tasks is the current work.

Build a brain for your business.

Certant turns your documents, data and processes into agents, dashboards and assistants you can actually trust.