From 2b5696de820ba0a45bc65b46dceb5adf31338fa7 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Wed, 24 Jun 2026 23:29:32 +0200 Subject: [PATCH] fix(schema): enforce 4-digit ids --- src/core/schema.ts | 6 +++--- tests/schema.test.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/core/schema.ts b/src/core/schema.ts index 451bb22..0229385 100644 --- a/src/core/schema.ts +++ b/src/core/schema.ts @@ -8,7 +8,7 @@ export const Role = z.enum(['architect', 'implementer', 'reviewer', 'tester']); export const DelegationMode = z.enum(['manual', 'suggest', 'auto']); export const TaskSchema = z.object({ - id: z.string().regex(/^TSK-\d+$/), + id: z.string().regex(/^TSK-\d{4}$/), title: z.string().min(1), description: z.string().default(''), status: TaskStatus, @@ -24,7 +24,7 @@ export const TaskSchema = z.object({ }); export const HandoffSchema = z.object({ - id: z.string().regex(/^HOF-\d+$/), + id: z.string().regex(/^HOF-\d{4}$/), fromRole: z.string().min(1), toRole: z.string().min(1), fromAgent: z.string().optional(), @@ -39,7 +39,7 @@ export const HandoffSchema = z.object({ }); export const DecisionSchema = z.object({ - id: z.string().regex(/^DEC-\d+$/), + id: z.string().regex(/^DEC-\d{4}$/), title: z.string().min(1), status: DecisionStatus.default('accepted'), context: z.string().default(''), diff --git a/tests/schema.test.ts b/tests/schema.test.ts index 2583f59..509ac21 100644 --- a/tests/schema.test.ts +++ b/tests/schema.test.ts @@ -25,4 +25,16 @@ describe('schemas', () => { }); expect(result.success).toBe(false); }); + + it('rejects a task id without exactly 4 digits', () => { + const result = TaskSchema.safeParse({ + id: 'TSK-1', + title: 'Implement DNS cache', + description: '', + status: 'open', + createdAt: '2026-06-24T10:00:00Z', + updatedAt: '2026-06-24T10:00:00Z', + }); + expect(result.success).toBe(false); + }); });