Submatter/packages/shared/src/convoy-lifecycle/schemas.ts
Randall Stillwell 86155455a7 feat(worker): close Epic 7 — draft PR + operator notes + doc-writer
- Draft PR via forge (apps/worker/src/git/pr.ts) push branch + createPullRequest draft with echodo-convoy marker, expose prUrl in Mission Control (convoy-service, convoys router, detail panel)
- Operator notes mid-build: convoy_operator_messages (0016), tRPC post/list, worker poll between tool rounds (queued) and before generateText (direct), detail panel thread for in_progress
- Doc-writer: harness doc-writer examples (docs/examples/research-pipeline.md), SOP template (docs/templates/doc-sop.md), role-doc-writer wiring

Convoy: .convoys/worker-closeout-docwriter

Co-authored-by: orchestrator
2026-08-25 16:56:02 -05:00

94 lines
2.5 KiB
TypeScript

import { z } from "zod";
import { convoyModelPolicySchema } from "../model-routing/schemas";
export const convoyStatusSchema = z.enum([
"draft",
"convoy_review",
"ready",
"in_progress",
"pr_review",
"doc_review",
"merged",
"published",
"released",
"blocked",
"cancelled",
]);
export type ConvoyStatus = z.infer<typeof convoyStatusSchema>;
export const convoyClassificationSchema = z.enum([
"feature",
"hotfix",
"docs-only",
"infra-only",
"server-only",
"config-only",
]);
export type ConvoyClassification = z.infer<typeof convoyClassificationSchema>;
export const convoyFileStatusSchema = z.enum([
"open",
"in-progress",
"merged",
"shipped",
"abandoned",
]);
export type ConvoyFileStatus = z.infer<typeof convoyFileStatusSchema>;
export const convoyActorSchema = z.string().min(1).max(64);
export const convoyEventTypeSchema = z.enum([
"role_complete",
"status_change",
"brief_created",
"reconcile",
]);
export type ConvoyEventType = z.infer<typeof convoyEventTypeSchema>;
export const convoyObjectContentSchema = z.object({
convoySlug: z.string().min(1).max(120),
classification: convoyClassificationSchema,
skipFlags: z.array(z.string()).default([]),
successMetric: z.string().min(1),
modelPolicy: convoyModelPolicySchema.optional(),
backlogItemId: z.string().uuid().optional(),
repoPath: z.string().min(1).optional(),
planSlug: z.string().min(1).optional(),
epicSlug: z.string().min(1).optional(),
briefFiles: z.array(z.string()).optional(),
prUrl: z.string().url().optional(),
prNumber: z.number().int().optional(),
});
export type ConvoyObjectContent = z.infer<typeof convoyObjectContentSchema>;
export const briefObjectContentSchema = z.object({
briefNumber: z.number().int().positive(),
files: z.array(z.string()).default([]),
sliceDependencies: z.array(z.number().int().positive()).default([]),
acceptance: z.string().optional(),
});
export type BriefObjectContent = z.infer<typeof briefObjectContentSchema>;
export const transitionConvoyInputSchema = z.object({
convoyId: z.string().uuid(),
toStatus: convoyStatusSchema,
actor: convoyActorSchema,
reason: z.string().min(1).max(2_000).optional(),
});
export type TransitionConvoyInput = z.infer<typeof transitionConvoyInputSchema>;
export const convoyTransitionErrorCodeSchema = z.enum([
"INVALID_TRANSITION",
"FORBIDDEN_ACTOR",
"REASON_REQUIRED",
]);
export type ConvoyTransitionErrorCode = z.infer<typeof convoyTransitionErrorCodeSchema>;