FastAPI + Claude orchestration backend for DevSync AI — an AI agent that keeps software projects in sync across GitHub, Linear, Notion, and Slack
DevSync AI Backend defines 13 tools with basic schemas and descriptions, but falls short of production quality. All tools have descriptions (10-100 chars, mostly adequate) and input schemas with type definitions. However, parameter descriptions are minimal or absent for many inputs, output schemas are undocumented, and error handling lacks recovery guidance. Tool naming follows verb_noun convention well (get_*, update_*, flag_*, post_*, add_*), but composition issues exist: flag_scope_creep and flag_blocker are write operations that only mutate context without returning actionable data; save_sync_event_tool requires manual JSON string serialization from the caller. No pagination support on list tools (get_notion_tickets, get_linear_issues, get_open_prs). Secrets (github_token, notion_token, slack_token, linear_token) are stored in SyncContext rather than injected server-side, violating secret-injection pattern. Average tool score: 58/100.
Add a comment to a Linear issue.
Add a discussion comment to a Notion page.
Flag a ticket as a blocker (no recent commit activity). Call once per stalled ticket.
Flag a commit as scope creep (no matching ticket). Call once per untracked commit.
Fetch recent commits from the GitHub repo. since = ISO-8601 date string (e.g. '2025-01-01T00:00:00Z').
Fetch the diff for a specific commit SHA (first 3000 chars).
Secrets stored in SyncContext instead of server-side injection. github_token, notion_token, slack_token, linear_token are passed as context fields, violating secret-injection pattern. These will appear in logs and traces.
Output schemas undocumented. Tools return JSON strings but callers cannot predict field structure. E.g., get_github_commits returns JSON but no schema describes commit object fields, forcing LLM to guess structure for downstream processing.
No pagination support on list tools. get_notion_tickets, get_linear_issues, get_open_prs return all results without limit or offset parameters. Large result sets will exhaust context window.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
List open issues from the Linear team.
List all tickets/pages from the Notion database.
List open pull requests in the GitHub repo.
Post a message to the configured Slack channel.
Save a sync event to the database. payload must be a JSON string.
Update the state of a Linear issue and record it as an updated ticket.
Update the Status property of a Notion page and record it as an updated ticket.
Parameter descriptions missing or minimal. 'since' in get_github_commits has description but many params lack context. 'page_id' in update_notion_status and add_notion_comment have minimal descriptions (just 'Notion page ID'). LLM cannot infer how to obtain page_id.
save_sync_event_tool requires caller to serialize payload as JSON string. This violates chat-data-model pattern, tool should accept structured object, not force manual JSON serialization. Increases error surface.