CedarCopilot wants to merge 0 commits into staging from fix/mcp-manufact-readiness
Live on prod, watching, 1 day left
No matching POST /mcp or MCP-labeled OTEL spans were found in staging for the post-deploy window beginning 2026-09-20T02:15:30Z. Source confirms the changed external MCP server is the stateless handler behind POST /mcp, but the exact runtime instrumentation identifiers could.
Since 2026-09-20T02:15:30Z, staging telemetry contains 0 OTEL spans matching /mcp, MCP, record-message, or record-tool-call across both repository-scoped and broader environment queries, and 0 matching CloudWatch API log records in /aws/ecs/aws-staging-api/api-service.
internal_only
single_user
single_user
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.
Reopens the work from #2828 (closed) on the same branch , all 10 commits carry forward unchanged, plus this description reflects the final state after Greptile's review passes.
Fixes all 7 issues from Manufact's automated app-directory readiness check against Cedar's public MCP server (https://api.mail.cedarcopilot.com/mcp), ahead of submission to the Claude and OpenAI (Codex) app directories, then addresses everything Greptile's review turned up across two rounds.
The 7 original issues:
title and real-behavior-matched annotations.{readOnlyHint,destructiveHint,openWorldHint} via EXTERNAL_TOOL_METADATA in server.ts.@armature-tech/mcp-analytics@0.6.36 so telemetry.agent_thinking reads as genuinely optional instead of coercive.document tool (one generic action selector spanning read alongside delete/share) is now document-read/document-write, the minimum split Manufact's finding asked for ("at minimum separating read/list/search from create/update, delete/restore, move, and share/revoke"), used identically by every internal and external consumer with zero special-casing , mirroring conversationTool.ts's existing conversation-read/conversation-write pattern. documentTool.ts's old single-tool id is fully retired.userId/orgId.What Greptile's review caught, verified and fixed (not just patched cosmetically):
document-write, ui-config, task under-claimed destructiveness; conversation-read under-claimed reaching an external CRM).buildSessionInstructions: an unbounded impersonated-user header that could exceed the 2KB budget with nothing to trim, and a UTF-16 surrogate-pair-splitting bug in the byte-truncation helper , both fixed with new regression tests that fail against the pre-fix logic.document.share → document-write.share in HUMAN_ONLY_ACTIONS (matched via a literal ${toolId}.${action} string) , without the rename, autonomous callers could mint/revoke public document share links with zero human-in-the-loop gate.document tool by name after the split , most seriously, workflows/chat/harness/subagents.ts's buildSubagentDefinitions() constructs the literal prompt handed to every configured chat subagent, telling it to load its own instructions via the now-nonexistent tool; every subagent delegation would have hit a tool-not-found error. Also fixed in draftCommsTool.ts and two skill markdown files.documentTool.schemas.ts added to the targetUserId-reaches-the-authority allowlist (a pure-schema file with no logic, split out of documentTool.ts purely for the 1,000-line budget , the real gating call is unchanged) , this was a CI failure, not a Greptile finding.jose peer-dependency regression: apps/server pinned jose@6.0.11, one minor below @better-auth/core@1.6.33's ^6.1.0 peer requirement. Diffed against staging's lockfile and confirmed this exact resolution slot correctly resolved jose@6.2.12 there and regressed to 6.0.11 on this branch (a side effect of the earlier pnpm patch triggering re-resolution). Bumped to 6.1.3 (already used elsewhere in this lockfile) and regenerated , jose@6.0.11 no longer appears anywhere in pnpm-lock.yaml.pnpm --filter @zero/server run types , cleanpnpm deps:check , no dependency-direction violationsLibra has not measured any production surfaces for this change yet.