Libra CodeHub

CedarCopilot/cedar-mail

Branch: staging

test(eval): three instruction-eval harnesses and their negative results

closed#2714CedarCopilot

CedarCopilot wants to merge 2 commits into staging from chore/f8-eval-harnesses

Not deployedTimeline and evidence
  1. Opened
    Sep 6, 2026, 10:30 PM
  2. Sep 6, 2026, 10:35 PM
  3. Merged, live on staging, live on prod, observed
    Pending
  4. Not deployed

    Not deployed

    Pending

Libra has no production signal for this change yet because it has not deployed. Libra checks hourly for 3 days after each deploy.

Three harnesses built during the F8 workstream. Each one answered a question we were about to ship a fix for, and each time the answer was "not that". Committing them so the evidence outlives the session , the harnesses are reusable and the findings are the expensive part.

aop-classification-eval

Question: why do vendor-notification conversations get typed Deals? (290 correctly-typed vendor conversations produce 1 task between them; 117 typed Deals produce 10.)

Answer: the classifier isn't confused, it's answering a different question. Of 126 Deals classifications on vendor-dominated conversations, only 3 mention the sender being automated. It classifies the deal described inside the notification body , and it's right about the content and wrong about the object. A Fathom recap genuinely is a sales-meeting summary, and the Deals procedure literally lists "product demos [COMPANY] is giving to prospects." The instructions never say whose conversation it is.

The template gap is real and propagated , 0 of 97 Vendor AOPs mention PandaDoc, 26 still carry the seed's exact (Zoom, Gong, ChiliPiper) line , but it is not the driver. Where the vendor category was considered it was rejected on content grounds, never for lack of the tool's name.

A candidate <automated_notification_rule> fixes 3 of 5 positives with all 4 controls at 6/6, and still fails the commonest production shape (recap stream) at 0/6.

Also surfaced: selection is one-event, not just one-shot , 84% of classifications run with a single event visible, on streams that later grow to 400+. And finalize-steps.ts:144 classifies without calling logToolCall, so onboarding backfills leave no trace at all.

deal-close-task-cancel-eval

Question: is "cancel open tasks when a deal closes" safe as a playbook instruction?

Answer: only after the linked-deal blocks shipped. Before that the best variant was 7/45 false cancellations and a blanket rule wiped 10/10 reactivations. After, one variant reaches 0/45 with every control clean , but under-cancels at 5/15 recall. Safety objection answered; effectiveness not.

domain-return-shape-eval

Question: can prompt or schema wording stop company NAMES being stored where a domain belongs?

Answer: no. Schema-only moved one case by one trial in eight. Schema+instruction fixed one case while its near-identical sibling stayed at 0/8 , the difference was the case, not the variant.

Two conventions worth keeping

Customer-side data is anonymised to .example; vendor names stay real. A fictional signing tool measures brand recognition rather than the classification rule.

The unit of analysis is the CASE. Trials within a case are repeats of one prompt, never pooled into an N, and no p-values , every one of these samples is far too small.

No production code changes. No database writes.

šŸ¤– Generated with Claude Code

https://claude.ai/code/session_01NVHnt2pEEjhVwSyhkcaxoC

Greptile Summary

This PR adds three reusable instruction-evaluation harnesses, frozen prompt baselines, and production-derived cases for AOP classification, closed-deal task cancellation, and domain return shapes.

  • The deal-close harness currently evaluates a severely truncated system prompt.
  • AOP scoring treats invalid selections more favorably than production does.
  • Failed cancellation trials are included as favorable kept outcomes.
  • The domain-return fixture contains production customer data that has not been anonymized according to the PR's stated convention.

Confidence Score: 1/5

The PR is not safe to merge until the invalid prompt extraction, divergent AOP scoring, and committed production customer data are corrected.

The deal-close results are generated without most of the production system prompt, invalid AOP selections can be counted as successful no-ops, and the domain

Show production surfaces and changed-file mapping

Production surfaces

Libra has not measured any production surfaces for this change yet.

Changed files → surfaces

  • apps/server/.claude/skills/playbook-instruction-eval/aop-classification-eval.tsno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/deal-close-task-cancel-eval.tsno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/domain-return-shape-eval.tsno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/fixtures/aop-classification-cases.tsno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/fixtures/aop-selection-baseline.mdno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/fixtures/deal-close-next-steps-baseline.mdno production surface mapped
  • apps/server/.claude/skills/playbook-instruction-eval/fixtures/deal-close-task-cancel-cases.tsno production surface mapped
  • docs/design/f8-agent-log.mdno production surface mapped