CedarCopilot wants to merge 3 commits into staging from feat/f8-route-signature-events-to-counterparty
Live on prod, no production signal yet
Verification reached its 130s outer budget before the verifier returned. Libra is keeping this intent verifying until the next check.
Verification showed no counted post-deploy activity, so Libra has no positive runtime evidence for how much traffic exercised this change. Original assessment: Post-deploy CloudWatch telemetry shows repeated concrete e-signature routing through assignEventToConversation.
Libra has verdicts on 0 of 2 tracked behaviors on prod; 2 are still being checked. Libra checks hourly for 3 days after each deploy.
Step 5 of the F8 workstream. In the design doc this is
docs/design/f8-vendor-conversation-routing.md
§4.3 "Phase 3: route signature events to the counterparty"; its verification list (§6.4) is
exactly the eval below.
domain-identification.ts told the agent that every automated notification goes to the sender's
vendor bucket , "do NOT open a deal, even if the body names a company." That rule is correct
for a meeting recap (Cedar already has the meeting from calendar sync, so the company in the
subject adds nothing) and wrong for a signature/transaction event, which reports a contract
state change Cedar cannot learn from calendar, email or CRM sync.
What made it fail is the tool's argument order, not the agent's judgment.
lookupCompanyFuzzyTool resolves domain first and returns on a hit
(lookupCompanyFuzzyTool.ts:357-408),
so passing the vendor's domain hands back the vendor's own bucket before the counterparty name is
ever tried.
{ domain: 'pandadoc.net', companyName: null } → the PandaDoc bucket.{ companyName: '<counterparty>', domain: null } → the counterparty's deal.In a real production trace the agent called the tool with companyName: null on an email about a
specific customer's order form and returned the PandaDoc bucket. 38 select-primary-company calls
resolved that way.
apps/server/src/mastra/skills/crm/domain-identification.ts, instructions only:
companyName with domain: null.No code paths changed. pnpm --filter @zero/server run types clean, pnpm deps:check clean
(1751 modules, no violations).
playbook-instruction-eval, model gpt-4o (the real workload model). Baseline is this file
as it stands on origin/staging , verified byte-identical to the frozen fixture, so the A/B
isolates only this diff. Counts are aggregated over repeat 8-trial runs on identical fixtures.
Tuned set , visible while the instructions were being edited:
| case | baseline | candidate |
|---|---|---|
pandadoc-calderon | 4/16 | 13/16 |
docusign-merrowbank , the case a regex fails | 0/16 | 15/16 |
pandadoc-ashcombe-nomatch , no counterparty exists | 15/16 | 16/16 |
otter-volante , recap control | 4/16 | 16/16 |
warm-intro-northcloud , pre-existing case | 16/16 | 16/16 |
one-way-intro-orivance , pre-existing case | 5/8 | 6/8 |
Held out , written from production before any iteration, scored afterwards, two signature vendors this change was never tuned against:
| case | baseline | candidate |
|---|---|---|
hellosign-formwork , counterparty named first | 0/32 | 21/32 |
ironclad-kestrelbank | 0/16 | 16/16 |
fellow-marlowe-recap , recap control | 15/16 | 16/16 |
The unit of analysis is the case, not the trial. Trials within a case are repeats of one prompt, so they are not independent; there is no pooled N here and no p-value on n
Libra has not measured any production surfaces for this change yet.