john mark lowry
§ ai tools · 2026

Jira velocity intelligence

Jira forgets your velocity after six sprints. The fix was never a bigger context window.

built at team one. the spec excerpt below is sanitized.

Velocity dashboard feature-buckets view: story-point distribution by product feature across ten sprints, with per-team filters and a summary table
feature buckets — story-point distribution across sprints. permanent history, per-team filters, work-category toggles: everything jira wouldn't do
01 · the moment

Our group director of delivery was exporting Jira data to CSV and pushing it through Claude by hand — 420K tokens of it — and hitting context limits. Of course she was. Jira's built-in velocity reports only retain about six sprints, so anyone who wants real history ends up a manual spreadsheet operator. The teams also needed things Jira will simply never give them: per-person point thresholds, work-category exclusions for creative and QA, multi-team rollups.

My first message in the thread was the question I always ask: what's the goal of the tool?

02 · the reframe

The visible problem was a context window. The actual problem was architecture. If you are feeding 420K tokens of CSV to a model, the model is not what failed — the system around it never existed. Pull the ticket data programmatically, persist it in a database, and the six-sprint window stops mattering forever. Then the LLM queries structure instead of swallowing exports.

03 · the routes

The path already in flight — and the one nobody should take — was “use a model with a bigger context window.” It treats a missing system as a model limitation. The route taken was to build the missing system, and three choices inside it are worth narrating:

  • A typed sync service on a per-team cadence, running idempotent upserts over a rolling window — so the data model, not the export, is the source of truth, and a failed sync is a log entry instead of a corrupted spreadsheet.
  • Deterministic categorization first, AI second. Tickets map to work categories through prioritized title-prefix and label rules — boring, auditable, fast. The AI layer is separate: a model suggests feature buckets in batches, with confidence and reasoning cached, and a human approves every suggestion in a review queue. No silent reclassification.
  • Reports as configuration, not requests — category toggles and per-person thresholds live in the UI, so producers self-serve instead of filing tickets about tickets.
Before/after data flow: manual CSV export into a model hitting context limits, versus Jira API to typed sync to Postgres feeding reports and AI sprint reports
the 420k-token path vs. the system that replaced it
04 · the architecture

Jira API → typed sync service → PostgreSQL via Prisma, with a data model built for teams, sprints, tickets, people, work categories, and feature buckets — plus precomputed velocity snapshots so the dashboard reads aggregates, not raw tickets. When a sprint closes, the system generates a structured sprint report — model-written narrative merged with computed tables — and publishes it to the team's wiki automatically.

Entity-relationship diagram of the actual data model: teams, sprints, tickets, members, categories and rules, buckets, snapshots, reports
the data model, from the actual prisma schema — the part that makes the six-sprint ceiling permanently irrelevant
05 · the build

I reframed the problem in the Slack thread and delivered the full v2 spec the same afternoon — data model, phased roadmap, acceptance criteria, and a CLAUDE.md handoff written so an AI agent or a junior engineer could execute it without follow-up questions. Then it was built the way I build everything now: spec → agentic workflow → validate → ship.

The spec is the product artifact. You can read it below.

06 · the outcome

Velocity history became permanent instead of six sprints deep. Producers got out of the spreadsheet business. Today it tracks three scrum teams of 10–12 people each — built for the group director of delivery, and now used by scrum masters, POs, account, and business partners.

The dashboard has since graduated into a full internal sprint-intelligence product — automated, model-written sprint reports included, published to the wiki on sprint close. The spreadsheet became a dashboard; the dashboard became a product.

view the spec
jira velocity intelligence — spec v2 (excerpt, sanitized)

problem
  jira's native velocity reporting retains ~6 sprints.
  producers reconstruct history by hand in spreadsheets.
  bulk csv exports (420k+ tokens) exceed llm context windows.

architecture
  ingest    jira rest api -> typed sync service (node/ts)
  persist   postgresql via prisma — sprint, ticket, person,
            work category. retention: permanent.
  report    configurable velocity views:
            - work-category toggles (creative / qa exclusions)
            - per-person point thresholds (e.g. 8 pts minimum)
            - multi-team rollups
  classify  fuzzy-matching categorization engine for
            inconsistently labeled tickets
  phase 2   ai-generated anomaly detection and trend insights,
            querying persisted structure — never raw exports

handoff
  claude.md written for agentic execution. acceptance criteria
  precise enough that an ai agent — or a junior engineer —
  could build from it without follow-up questions.
excerpt from spec v2 — sanitized. the full spec and CLAUDE.md are the actual build artifacts; that is the point.

Token limits are an architecture smell, not a model limitation.

the insight
ran onNode/Express/TypeScript · React · PostgreSQL + Prisma · Jira API · OpenAI API · spec + CLAUDE.md → Claude Code · v1 on Railway → production on AWS

← all work