2026-04-03: Organizational Model + Qwen Strategy

journal-2026-04-03-org-model-qwen Doc

private journal

Context

Session started with Marcus unable to see phone numbers on the admin player profile. Led to three connected threads: fixing the bug, reviving Nemo, and rethinking how we organize work for small model execution.

The Phone Bug (DONE)

  • API contract mismatch: /players/{id} returns nested parent: { phone }, frontend expects flat parent_phone
  • /admin/players list endpoint missing parent_phone entirely
  • Two PRs merged: basketball-api#277, westside-landing#204
  • Validated live via Playwright. Sandra Apaisa's phone (385) 232-9501 visible on admin profile.
  • Marcus notified via GroupMe DM with the phone number.

API Contract Audit (IN PROGRESS)

  • Spike #278 found 9 mismatches, 4 HIGH severity
  • Root cause: API returns nested objects, frontend expects flat fields
  • Decision: fix at API layer (flatten responses)
  • 7 tickets created (#280-#286), 5 reviewed READY, 2 re-scoped and approved
  • 8 dev agents dispatched in parallel — PRs arriving
  • All touch different files so no conflicts until merge — then sequential rebase needed

Nemo Revival (SCOPED)

  • Pod running but dead — Anthropic credits at $0 since March 31
  • Model: switching to qwen3.5:4b (3.4 GB, downloaded locally, being pulled to cluster Ollama)
  • Architecture decision: purpose-built tools with typed I/O, not generic api_get
  • Architecture decision: tools inside Nemo for V1, extract to MCP server for V2 when second consumer exists
  • Architecture decision: use basketball-api REST endpoints (not direct SQL) — single source of truth
  • Two tickets: #30 infra (APPROVED, agent running), #29 app (NEEDS_REFINEMENT — oversized, decided to keep as one)
  • Superseded: #16 (provider flag) and #27 (SQL tool) — both closed

Nemo Tool Schemas (defined)

  • search_player(name: str) → str — player + parent contact info
  • list_roster(team_name: str) → str — all players on a team
  • payment_status(name?: str) → str — payment/subscription info
  • program_stats() → str — dashboard numbers
Tool handlers call basketball-api and return pre-formatted strings. qwen3.5:4b never sees raw JSON.

Organizational Model Brainstorm

Current system feels like bloat. 20 templates, 20+ conventions, 7 label categories. It works but the mental model is unclear.

Proposed hierarchy (Lucas's words)

  • Projects = collections of user stories. "Projects are actually users and what I do to make a user happy."
  • User Stories = collections of repos and kanban
  • Kanban = organized tickets
  • Tickets can have child tickets or child kanban if scope increases

Schema thesis (Lucas's key insight)

"If there is a schema of defined inputs and outputs then we can have good measurements of what is happening." The ticket IS the input schema. The PR IS the output schema. The review gate IS the validation layer. When every boundary has a typed interface, you can swap the executor (Claude → qwen) without changing the pipeline. All pressure is on ticket quality, not model quality.

DORA connection

The pipeline is a schema-driven execution chain: User Story → Ticket → Forgejo Issue → Agent → PR → QA → Validation. Every arrow is a typed interface. DORA metrics fall out naturally from measuring time through the chain.

Session Stats

  • 2 bug fix PRs merged and validated
  • 1 spike completed (9 mismatches found)
  • 9 tickets created (7 API contract + 2 Nemo)
  • All 9 reviewed through gate
  • 8+ dev agents dispatched
  • 1 GroupMe DM sent to Marcus
  • 2 superseded tickets closed

Next Session

  • Merge API contract PRs (sequential rebase needed)
  • QA + validate each
  • Close spike #278
  • Fix Nemo app ticket #29 scope, review, dispatch
  • Validate Nemo end-to-end: "What's the phone number for Apaisa?" in GroupMe
  • Organizational model redesign — continue from brainstorm
  • DORA reasoning for qwen — Lucas to articulate fully