CedarCopilot wants to merge 3 commits into staging from feat/drafter-system-agent
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 reached its 120s wall-clock budget before a tied verdict. Libra is keeping this intent verifying until the next check.
No positive production telemetry was found for the intended ref --apply --gate-prose-file operation or verify-drafter-migration since deployment: 0 matching OTEL spans, 0 spans from commit fea8aabaf6543572e3b07cfb7de386209a52fde9, and 0 CloudWatch matches for.
No verifiable production telemetry was found for the changed CLI surfaces since 2026-09-02T23:47:55Z. OTEL returned 0 spans matching drafter, stage4, backfill, or related routes in CedarCopilot/cedar-mail production, so success/error counts, latency, and distinct-user volume.
No production telemetry tied to backfill-drafter or --gate-prose-file was found since 2026-09-02T23:47:55Z: 0 matching CloudWatch log events and 0 matching production OTEL spans. Therefore there are no observed executions, success signals, validation errors, latency, volume, or.
No production telemetry tied to the intended surface was found since 2026-09-02T23:47:55Z (~58h): CloudWatch returned 0 executions containing '[backfill-drafter ref]', and OTEL returned 0 matching spans/routes/attributes/events for drafter or backfill-drafter. The alternate 74.
Libra has verdicts on 0 of 17 tracked behaviors on prod; 17 are still being checked. Libra has 2 low-confidence degraded or broken verdicts it is still confirming. Libra checks hourly for 3 days after each deploy.
Three commits, shipped together because the last one only becomes safe once the first two are true.
The fleet migration in commit 1 already ran against production on 2026-09-01. Commits 2 and 3 are the code that makes it whole.
5406a058d , port each account's own drafting rules into its gateThe ref step no longer appends a seeded default. It reads each account's <cross-cutting> and refuses unless that account's ported prose is supplied.
The first fleet pass showed why: it wanted to write "do not draft" onto 5 of 8 accounts that draft constantly, hardest on the highest-volume ones , zach@ would have been silenced at 193 drafts/30d, jihoon@ at 174. Three defects behind that, each regression-tested against the real prose that exposed it:
NEVER DRAFT section was treated as evidence drafting is off. Nearly every account forbids drafting somewhere.NEVER[ _-]?DRAFT had no leading \b, so it matched inside "whenever drafting" , turning seven LABEL RULES lines into seven prohibitions.DRAFTER_GATE_PROSE also no longer permits inbound reply drafting. Of 73 inbound-email-notifier documents, 66 only notify, 4 opt in, 2 forbid it , so permitting it by default contradicted every account the default reaches.
New: --aop-id (three users have two AOPs needing different gates), and --replace-gate for an account wired by the very run that appended a default over its own rules. stage4-plan.ts has no write path at all , no --apply, no writePlaybookXml import.
537d2f2d4 , restore review-conversation to the automation agentreview-conversation has not been callable since 2026-08-24, and the review path went dark with it:
| day | review-conversation | spawn-subagent |
|---|---|---|
| 08-24 | 401 | 9 |
| 08-25 | 86 | 61 |
| 08-26 | 0 | 0 |
| 09-01 | 0 | 534 |
4d8fb3437 moved the daily agenda into an automation-only skill for a good reason , its prose ends in a notify-user call and was being spliced into every tasks load. But reviewConversationTool moved with it, and getAllSkillTools() iterates skills only. The agent kept reading "call review-conversation, never spawn-subagent" and substituted the tool it could actually reach.
reviewConversationTool is the only caller of triggerType: 'conversation_review', so routeDrafter, runDrafterRef and the review-path tool strip have executed zero times since 08-26. The substitute is worse than a missing tool: a spawn-subagent child runs on createOrchestratorAgent, which hardwires save-draft and carries no drafter document , 428 such runs made 458 draft calls across 48 users in 7 days.
Tools and instructions are separate concerns, so they get separate gates. getAutomationSkillTools() = chat catalog + automation-only skills' tools. The skill stays unadvertised to chat.
7fcb859b2 , Stage 5: the ref is the only routerun-post-event-executor leaves orchestratorTools; drafting goes through run-subagent(@subagents/drafter). The seed gets the ref back, last in <trigger type="any">.
Gate, measured rather than assumed: of 60 playbooks that can actually draft , excluding no-op AOPs and users whose agent_settings.agentExecutionEnabled is false , 59 carry a drafter ref. The one that does not has had no <trigger> element since 2026-06-18 and dispatches nothing.
I got that denominator wrong twice before landing on it: getActiveUsers() gave 59 playbooks and missed 28 live ones; every live playbook gave 27 missing refs and would have blocked this outright. Neither is right , a playbook whose owner has execution off cannot lose drafting to this change.
Libra has not measured any production surfaces for this change yet.