Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-147Done

2.7.7 Vitest — schema + default map + picker default-seeding + loader mapping + filter facet

Estimate: 50m · Depends on: 2.7.3, 2.7.4, 2.7.5, 2.7.6

Lock the whole type/executor model with tests over a real Postgres (the project convention; tests/helpers/db.ts truncates between tests; the only allowed vi.mock is getSession()). Cover every piece the story adds:

  • The default map (2.7.3). defaultExecutorForType returns the right executor for EVERY one of the ten enum members (a table test over the full enum — proves the TOTAL function has no hole and matches 2.7.2’s map: code/test/deploy → coding_agent; manual/decision/review → human; the four "either" types → coding_agent).
  • Schema + leaf-only enforcement (2.7.3). A leaf (task/subtask/bug) persists a type + executor; setting type on an epic/story is rejected with the typed error; type defaults to null on a row that omits it.
  • Picker default-seeding (2.7.4). The seeding logic: choosing a type yields the default executor (and an override sticks) — tested at the service/helper boundary the picker calls (not a DOM test; that’s 2.7.8’s E2E).
  • Loader mapping (2.7.5). Seeding a fixture plan leaf with a type/executor writes the STRUCTURED fields (asserted via a repository read) and the resulting description contains NO "Type:" / "Executor:" prose; a leaf with a type but no executor gets the default; an unknown type string aborts with a clear error.
  • Filter facet (2.7.6). A FilterAST with type = manual returns exactly the manual leaves; type in (code, test) composes; type is null returns epics/stories/untyped; a saved-view round-trip preserves the type predicate; an unknown type value in an AST is rejected.

Acceptance criteria

  • All the above pass over a real Postgres (no mocks beyond getSession()); the default-map test iterates the FULL enum (a new member with no mapping would fail the suite).
  • The loader-mapping test asserts BOTH the structured fields are set AND the prose is absent (the regression guard for 2.7.5’s "stop emitting prose").
  • New service/repo code (the leaf-only enforcement, the default helper, the filter translation) respects the per-file coverage gate (motir-core/CLAUDE.md § coverage) — every branch of the empty-input guards has a direct test.

Context refs

  • 2.7.3 / 2.7.4 / 2.7.5 / 2.7.6 — everything under test.
  • motir-core/CLAUDE.md § tests-use-real-Postgres + § coverage gate.
  • motir-core/lib/services/workItemsService.ts + the FilterAST translator — the units asserted against.