schema: roster-assistant proposal contract (types + JSON Schema) #1210
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/agent-hooks#1210
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Part of the Agents Roster AI Assistant feature. The assistant proposes complete fleets (one or more agents) as structured data; FE renders the preview and BE generates it from a Claude call. To keep accept-to-roster a direct write (no parsing), FE and BE must agree on a typed shape up front.
This is the contract ticket — it blocks every other ticket in the feature. Land this first.
Scope
Add a shared package (or shared module — wherever existing FE/BE types live in this repo) that exports:
ProposalEnvelopeproposal_id: string(uuid)parent_proposal_id: string | null— set on refinements so FE can diffsession_id: stringversion: number— bumped each refinementcreated_at: string(ISO)summary: string— short fleet-level narrative ("how these agents work together")agents: ProposedAgent[]refinements_used: numberrefinements_soft_cap: number(default 20)catalog_hash: string— snapshot identifier; FE warns if drifted at accept timeProposedAgentShape must match the existing
agent_configwrite path (audit the current roster store to confirm). Fields:name: stringrole: string(one sentence)system_prompt: stringmodel_tier: "haiku" | "sonnet" | "opus"+model_tier_reason: stringskills: string[](skill IDs from catalog)tool_permissions: { tool: string; mode: "allow" | "deny"; rationale?: string }[]— per-grant rationale, not whole-agentmcp_servers: { id: string; setup_required: boolean; setup_notes?: string }[]rationale: string— one line, why this agent is in the fleetCatalogSnapshotskills: { id: string; name: string; description: string }[]mcp_servers: { id: string; name: string; configured: boolean }[]tools: { id: string; sensitive: boolean }[]model_tiers: string[]hash: stringDeliverables
ProposalEnvelope— used by BE to constrain Claude's structured outputagent_configwrite path accepts aProposedAgentas-isOut of scope
Notes for implementer
Audit the existing roster store before finalizing
ProposedAgent— ifagent_confighas fields not listed above, mirror them. The goal is zero translation on accept.Blocks: all other tickets in the Agents Roster AI Assistant feature.
Depends on: none.