You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The showcase seeds 4 of 5 projects and 9 of 10 tasks are silently rejected on every boot. The running app has exactly one project and one task. Nothing in the boot log says so.
The platform is behaving correctly — this is a self-contradictory fixture plus a surfacing gap.
Root cause
showcase_project declares its own FSM entry gate (#3165):
// project.object.tsevents: ['insert','update'],initialStates: ['planned'],// "without it a project could be born already completed"
The project seed in the same repo creates 5 projects with status:
Project
seeded status
legal on insert?
Website Relaunch
active
✗ rejected
Data Platform
active
✗ rejected
Compliance Audit
on_hold
✗ rejected
Mobile App
planned
✓ survives
Legacy Sunset
completed
✗ rejected
Seeds deliberately run validation — SeedLoaderService.SEED_OPTIONS = { isSystem: true, skipTriggers: true }, commented "Lifecycle HOOKS (derived/default fields, validation) still run." So the gate fires and correctly rejects the four.
showcase_task.project is a master-detail to project, and 9 of the 10 seeded tasks point at the three projects that were never created. Only App wireframes → Mobile App survives.
showcase_project_membership (references team + project) lands 0 of 3 for the same reason.
Evidence
Built artifact is correct — the loss is at load time:
knex debug on a wiped DB shows exactly one single-row insert per table:
insert into `showcase_project` (…) values (?, …) returning * ← 1 statement
insert into `showcase_task` (…) values (?, …) returning * ← 1 statement
insert into `showcase_account` (…) select ? … union all select ? ← batched, 14 rows ✓
Impact
The showcase's own seed docstring says it is "sized to feed every view: every Kanban column is populated, tasks carry due/start/end/created dates (calendar, gantt, timeline) and a work location (map)". None of that is true at runtime:
Chart Gallery — "One widget per chart family… honest visual coverage" — renders 14 charts on a single data point. Total Tasks 1, every bar/pie/funnel/radar/treemap/sankey degenerate, both month-bucketed trend lines a single point.
Kanban: 1 card in 1 column (5 columns were intended).
Gantt / timeline / calendar / map: one item each.
Project list: 1 row of 5; no status or health variety, so the health-progression FSM demo has nothing to show either.
SeedLoader does record each rejection (this.logger.warn('[SeedLoader] …'), and buildResult carries the errors), but not one [SeedLoader] line reaches os dev output — I ran with OS_LOG_LEVEL=debug LOG_LEVEL=debug DEBUG=* (19k lines of knex tracing) and grepped case-insensitively: zero hits. The boot banner's only seed mention is seeded on empty DB · dev only.
So a fixture can lose 90% of its rows with no signal at all. Even if the fixture below is fixed, a boot-time summary of seed inserts/rejections would have caught this immediately — and would catch the next one.
Options for the fixture
Two-phase seed (respects and demonstrates the FSM). Insert all 5 as planned, then walk them to their target status via mode: 'update' datasets. The transition map allows planned→active and active→{on_hold, completed}, so it needs two update passes (a single pass cannot do the 2-hop jumps). Needs confirmation that ordering between multiple datasets on the same object is deterministic.
Seed everything as planned. One-line fix, but the project list loses all status/health variety and several demos flatten.
I'd take (1) if same-object dataset ordering is guaranteed, otherwise (2) plus a follow-up. Flagging rather than picking, since it's a showcase-design call.
Summary
The showcase seeds 4 of 5 projects and 9 of 10 tasks are silently rejected on every boot. The running app has exactly one project and one task. Nothing in the boot log says so.
The platform is behaving correctly — this is a self-contradictory fixture plus a surfacing gap.
Root cause
showcase_projectdeclares its own FSM entry gate (#3165):The project seed in the same repo creates 5 projects with
status:activeactiveon_holdplannedcompletedSeeds deliberately run validation —
SeedLoaderService.SEED_OPTIONS = { isSystem: true, skipTriggers: true }, commented "Lifecycle HOOKS (derived/default fields, validation) still run." So the gate fires and correctly rejects the four.showcase_task.projectis a master-detail to project, and 9 of the 10 seeded tasks point at the three projects that were never created. OnlyApp wireframes→Mobile Appsurvives.showcase_project_membership(references team + project) lands 0 of 3 for the same reason.Evidence
Built artifact is correct — the loss is at load time:
knex debug on a wiped DB shows exactly one single-row insert per table:
Impact
The showcase's own seed docstring says it is "sized to feed every view: every Kanban column is populated, tasks carry due/start/end/created dates (calendar, gantt, timeline) and a work location (map)". None of that is true at runtime:
1, every bar/pie/funnel/radar/treemap/sankey degenerate, both month-bucketed trend lines a single point.Silent failure
SeedLoaderdoes record each rejection (this.logger.warn('[SeedLoader] …'), andbuildResultcarries the errors), but not one[SeedLoader]line reachesos devoutput — I ran withOS_LOG_LEVEL=debug LOG_LEVEL=debug DEBUG=*(19k lines of knex tracing) and grepped case-insensitively: zero hits. The boot banner's only seed mention isseeded on empty DB · dev only.So a fixture can lose 90% of its rows with no signal at all. Even if the fixture below is fixed, a boot-time summary of seed inserts/rejections would have caught this immediately — and would catch the next one.
Options for the fixture
planned, then walk them to their target status viamode: 'update'datasets. The transition map allowsplanned→activeandactive→{on_hold, completed}, so it needs two update passes (a single pass cannot do the 2-hop jumps). Needs confirmation that ordering between multiple datasets on the same object is deterministic.planned. One-line fix, but the project list loses all status/health variety and several demos flatten.initialStates. Cheapest, but it deletes the point of enhancement:state_machine校验规则在 INSERT 上是 no-op —— 无法强制记录的初始状态(declared ≠ enforced) #3165 — "a project could be born alreadycompleted" is exactly what the gate exists to prevent.I'd take (1) if same-object dataset ordering is guaranteed, otherwise (2) plus a follow-up. Flagging rather than picking, since it's a showcase-design call.
Found during the #3358 v16 browser sweep (§3).