Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

.nornir/funnel-cards.md

Funnel Cards — "JIRA + YouTrack" over the idea funnel

Makes the funnel (the Jira half of "JIRA + Maven = nornir") feel like a real issue tracker: YouTrack-style cards, a kanban board, a smart query, the funnel triggerable from nornir (not just CLI), and a view of how components connect to the DAG plan. Grounded in web research (JIRA / YouTrack / Maven) + the existing funnel + facett facets. Status of each piece marked DONE / NEXT / LATER.

0. The framing — what JIRA, YouTrack, and Maven each give us

Tool What it does nornir equivalent
JIRA Epic → Story/Task → Sub-task hierarchy; typed links (blocks, relates to); Scrum/Kanban boards; sprints; backlog; burndown/velocity The funnel plan DAG (Plan{nodes,edges}) + items (Idea/Error/Test) + lineage (history.rs)
YouTrack Same agile boards plus natural-language smart query (for:me state:Open sort:updated), drag-drop board/swimlane editor, in-project workflow scripting Smart query over cards (this doc), board lanes from HistoryStatus, workflow = the NodeStatus lifecycle
Maven Reactor build/dependency DAG, build order, coverage report WorkspaceGraph (src/warehouse/dep_graph.rs) + nornir coverage (coverage-maven.md)

So nornir already is "JIRA + Maven"; this work makes the JIRA/YouTrack surface first-class and ties it to the Maven DAG. Crucially, in nornir the Maven DAG plans the Jira DAG: plan_from_component (src/funnel/planner.rs) derives the plan's nodes from a change's blast radius through WorkspaceGraph::affected_by_change.

Sources: JetBrains YouTrack vs Jira comparison; Atlassian Jira issue-hierarchy docs; AMD/JetBrains agile-board feature write-ups (June 2026 web research).

1. The card model — DONE (src/funnel/card.rs)

A pure, additive, event-free projection over the funnel's existing HistoryItems — no funnel_events / proto / Iceberg schema change, so it works against the live funnel today and is migration-safe. Fully deterministic (FC-7): same items + query string → bit-identical output, golden-testable with no warehouse, GPU, or clock.

Tests (cargo test --lib funnel::card, 6 green): facet projection + label mining, every smart-query operator, the three sorts, board grouping + deterministic json, and an empty-funnel honest-empty board (RAGNARÖK). A functional_status row (nornir::funnel::card / board_projection_groups_lanes) emits under --features testmatrix so the 🧪 Test matrix sees the surface run.

Re-exported from src/funnel/mod.rs.

2. Roadmap — what's next, in priority order

P0 · Surface the cards (NEXT — small, high value)

P1 · Make the funnel triggerable from nornir (NEXT)

Today funnel demo (the big-project simulator, src/funnel/demo.rs), decompose, and plan-from are CLI + viz only — not over MCP/RPC. To "trigger it from nornir" (server/agent/remote):

P1 · Visualize component ↔ DAG-plan (NEXT)

The link is already in the data: PlanNode.targets / params["component"] name the component each plan node touches. What's missing is the view. Add a panel/sub-view in src/viz/funnel_tab.rs (or sibling funnel_components.rs) that overlays WorkspaceGraph::component_names() component nodes onto the plan DAG, drawing a link from each plan node to its targets. Natural plug-ins: src/viz/funnel_view.rs (NodeView.targets is already carried) and src/viz/funnel3d.rs (add a component layer + cross-edges). Expose under state_json["funnel"]["components"] + a *_for_test hook for robotui.

P2 · The facett-board facet + card glue (LATER — in the facett repo)

facett already ships the pieces (per the facet inventory): facett-card is a YouTrack-style issue card (Card/CardField/FieldValue with User/Enum/Tags/ Date/Progress/Link); facett-graph::DepGraphView is a layered DAG with click→drill- down; facett-pipeline/facett-jobview model the build/job side. The two genuine gaps:

P2 · Persist richer card fields (LATER — migration)

When cards need real assignee / labels / workflow-state / comments (beyond the derived projection), add them as new optional funnel_events columns the same migration-safe way item_kind (col 28) landed — see funnel-intake.md. New events: CardAssigned, CardLabeled, CardCommented, CardStateChanged. The projection in §1 keeps working for legacy rows (null → derived defaults).

P3 · Agile reporting (LATER)

Sprints/iterations, story-point rollup, burndown/velocity — JIRA's structured side. Sprint = a tag/iteration field on cards; burndown = a time-series over NodeStatus→Done transitions already in funnel_events (NodeStatusChanged).

3. What was implemented this pass vs. deferred

4. Key files