# Decision: app/seed.ts is exempt from §30 file-size rule **Date**: 2026-06-17 **Status**: APPROVED (filed by Mavis; pending operator sign-off) **Scope**: `app/seed.ts` (335 lines) ## Context The v0.3.0 verifier flagged `app/seed.ts` (335 lines) as a REFACTOR-TRIGGER. It is the dev-mode seed data file — 4 family members, 12 tasks, 5 messages, 3 resources, all defined inline as plain TS data. ## Why it's exempt `seed.ts` is **data, not code**. It contains: - 4 `Member` objects (~10 lines each = 40L) - 12 `Task` objects (~15 lines each = 180L) - 5 `Message` objects (~8 lines each = 40L) - 3 `Resource` objects (~10 lines each = 30L) - Helper functions for date formatting (~45L) It has zero state machine logic, zero JSX, zero DOM listeners, zero data layer concerns (the data IS the file). It is the textbook definition of "one job" — be the canonical seed data for dev mode. ## The rule §30 says > "A 250-line component file that genuinely has one job (e.g. a long form with many fields) is fine. The rule fires on **mixed concerns**, not absolute size." `seed.ts` is that case. One concern (be the seed), 335 lines. ## Future option If `seed.ts` grows past 500 lines, split it into: ``` app/seed/ ├── members.ts (~40L) ├── tasks.ts (~180L) ├── messages.ts (~40L) ├── resources.ts (~30L) └── index.ts (re-exports) ``` Not needed yet. Defer until 500L. ## Exception filing This decision is the §30 exception for `seed.ts`. The verifier will see this file in `pact/decisions/` and mark `seed.ts` as EXCEPTED-HARD. The exception is permanent (no v0.X.Y target). It expires automatically if `seed.ts` drops below 200 lines (split happens). ## Tracking - Filed: 2026-06-17 - Operator sign-off: pending