Featured

The Distributed Monolith Tax: When One Jira Story Needs Pull Requests in Five Repositories

Microservices promised independent teams. In many enterprises, a single Jira story still needs coordinated pull requests in four or five repositories. Learn what engineering leaders on Reddit say about distributed monoliths, lockstep releases and cross-repository changes, and how Keypup MCP links Jira issues to the pull requests that resolve them to measure how many changes span several repositories, what each extra repository costs in cycle time, and which repositories always change together.

Arnaud Lachaume
Arnaud Lachaume LinkedIn
• 13 min read
The Distributed Monolith Tax: When One Jira Story Needs Pull Requests in Five Repositories

Table of Contents

TL;DR: Many enterprises split their platform into dozens or hundreds of repositories and services, yet a large share of their Jira stories still need coordinated pull requests in several repositories to ship. This is the distributed monolith tax: the coupling of a monolith with the coordination cost of microservices. It rarely shows up on a dashboard, because Git analytics look at one repository at a time and Jira doesn't look at repositories at all. The Keypup MCP Server links each Jira issue to the pull requests that resolve it, with their repository, authors, merge dates and lines changed. Your AI assistant can then measure how many issues span several repositories, what each extra repository adds to cycle time, how long repositories wait for each other between the first and last merge, which repository pairs always change together, and which half-shipped changes to unblock this week.

Every architecture review shows the same slide: clean boxes, one per service, each owned by one team, each deployable on its own. Then a product manager writes a story for a new checkout option, and five teams open five pull requests in five repositories, and the release waits for the slowest of them. The boxes are independent on the slide. The work isn't.

The Friction: Independent Services, Lockstep Changes

Splitting a platform into services is supposed to let teams ship without waiting for each other. In large organizations, several forces quietly undo that promise:

  • Shared contracts move together. A shared schema, protobuf or client library repository means any contract change lands in the contract repository, then in every producer and consumer.
  • Boundaries follow the org chart of five years ago. Services were cut along team lines that have since changed. Today's features cross those lines by default.
  • Front ends and gateways sit in the middle. A new field in a back-end service needs the gateway, the web app and the mobile app to follow.
  • Nobody measures it. Git analytics report per repository; Jira reports per project. A story that needed five repositories looks like five small, healthy pull requests and one slow ticket.

The result is a platform that has the operational cost of microservices and the coordination cost of a monolith.

Why This Matters: The Real Cost of the Distributed Monolith

The Lead Time Problem

When a change needs several repositories, its cycle time is the cycle time of the slowest one. Every review queue, every failing pipeline and every on-call interruption in any of the repositories adds to the whole story. Adding repositories multiplies the number of places the story can wait.

The Release Risk Problem

Pull requests in different repositories rarely merge on the same day. In between, one side runs new code against a partner that hasn't changed yet. Teams compensate with feature flags, version negotiation and "deploy in this order" instructions — the kind of process that fails at 2 a.m.

The Architecture Investment Problem

Platform teams spend quarters extracting services, and leadership approves the budget on the promise of team autonomy. Without delivery data, no one can tell whether the new boundaries actually reduced coordination — or simply added one more repository to every change.

The Enterprise Discussion: What Engineering Leaders Are Actually Saying

"We built a distributed monolith", "every feature touches six repos" and "we can't deploy one service without the others" come up again and again wherever architects, staff engineers and engineering directors compare notes. The quotes below are representative of recurring threads on r/ExperiencedDevs, r/softwarearchitecture, r/EngineeringManagers and r/devops.

Principal Engineer, Retail Platform (r/softwarearchitecture)

"We have 140 microservices and I can't remember the last feature that touched only one of them. Every story is a coordinated release across four teams. We got all the network hops of microservices and kept all the coupling of the monolith."

Director of Engineering, Fintech (r/EngineeringManagers)

"Our DORA numbers look great per repo: small PRs, fast reviews, daily merges. Product still says features take forever. It took us months to realize the delay is between the repos, not inside them. No dashboard we had could show it."

Staff Engineer, Insurance Group (r/ExperiencedDevs)

"The shared models library is the real monolith. Any change there means a PR in the library, a version bump and then PRs in every service that uses it. Half our 'quick fixes' are actually five-repo changes with a release order written in the ticket comments."

The pattern holds: organizations invest heavily in service boundaries, but almost none of them measure how often their work actually crosses those boundaries.

How Keypup MCP Measures Cross-Repository Changes

The Keypup Model Context Protocol (MCP) Server gives your AI assistant structured access to the data Keypup imports from Jira and from GitHub, GitLab, Bitbucket and Azure DevOps. For this analysis, what matters is that each Jira issue carries the list of pull requests that resolve it, and for those pull requests: their repositories, their authors, the dates of their first and last merge, and the lines changed. Each issue also has its creation and closure dates, type, parent and Jira project, and each pull request has its own state and creation date.

A pull request is linked to an issue when it references the issue key with a closing keyword such as "fixes", "closes" or "resolves". An issue touches a repository when at least one of its linked pull requests belongs to that repository. Cycle time is the number of business days from the issue's creation to its closure. Merge spread is the number of business days between the first and the last merge of its linked pull requests. All figures below cover the last 12 full months, October 2025 to September 2026.

1. Measuring How Much Work Crosses Repository Boundaries

The first question: how many of your changes need more than one repository, and how much of your code do they account for?

MCP Prompt:

For Jira issues closed in the last 12 full months that have at
least one linked pull request, show the number of issues, Jira
projects and repositories, the share of issues whose linked pull
requests touch 2 or more repositories, the share of lines changed
those issues account for, and the median cycle time for issues
touching one repository vs three. Split issues by repositories
touched: 1, 2, 3, 4+.

Output: How Many of Our Changes Span Several Repositories?

Four KPI cards and a split bar for Jira issues closed in the last 12 full months with linked pull requests: 18,420 issues in 46 Jira projects resolved by pull requests in 312 repositories; 27% touch 2 or more repositories (4,970 issues); those issues account for 58% of lines changed; median cycle time is 2.4 times longer for issues touching 3 repositories (14.2 business days) than one (5.8); split of 73% one repository, 15% two, 7% three and 5% four or more

Key Insight: 27% of issues need pull requests in more than one repository, and they account for 58% of all lines changed. Cross-repository work isn't the exception at the edges of the system; it's where most of the code goes.

2. Pricing Each Extra Repository

If coordination has a cost, cycle time should rise with every repository a change touches.

MCP Prompt:

As a line chart, show the median and 85th percentile cycle time in
business days of Jira issues closed in the last 12 full months, by
the number of repositories their linked pull requests touch (1, 2,
3, 4, 5, 6+). Add the median business days between the first and
the last merge of their linked pull requests, and the number of
issues per group.

Output: What Each Extra Repository Costs

Line chart of cycle time by number of repositories touched: median cycle time of 5.8 business days for 1 repository, 9.6 for 2, 14.2 for 3, 18.9 for 4, 23.5 for 5 and 31.0 for 6 or more; 85th percentile from 13.1 to 61.0 business days; median merge spread from 0.2 to 10.2 business days; issue counts from 13,450 for one repository to 150 for six or more

Key Insight: Each additional repository adds roughly four to five business days to the median issue, and the 85th percentile climbs twice as fast. The merge spread line explains a large part of it: at four repositories, the last pull request merges 5.6 business days after the first. That's time spent waiting on other teams, not writing code. Cycle time also depends on scope — bigger features naturally touch more repositories — so compare issues of the same type before drawing conclusions about a specific team.

3. Tracking Whether Coupling Is Improving

Architecture programs are long. The trend tells you whether they are working.

MCP Prompt:

By month of closure over the last 12 full months, show as an area
chart the share of Jira issues with linked pull requests that
touch 2 or more repositories, and as a line the median business
days between the first and last merge of their linked pull
requests.

Output: Is Coupling Getting Better or Worse?

Area chart by month of closure from 2025-10 to 2026-09: the share of issues touching 2 or more repositories rises steadily from 22% to 32%, and the median merge spread of those issues rises from 2.1 to 3.1 business days

Key Insight: The share of cross-repository issues rose from 22% to 32% in a year, and their merge spread from 2.1 to 3.1 business days. If your organization extracted services over the same period, this is the chart to bring to the next architecture review: more repositories didn't mean more independent work.

4. Finding the Repositories That Always Change Together

The most actionable view is the co-change matrix: which pairs of repositories keep appearing on the same issue.

MCP Prompt:

For Jira issues closed in the last 12 full months whose linked pull
requests touch 2 or more repositories, list the repositories of
each issue, then show as a heatmap how many issues touched each
pair, for the 8 repositories involved in the most such issues.

Output: Which Repositories Always Change Together?

Heatmap of closed Jira issues per repository pair for 8 repositories: web-app and api-gateway changed together on 538 issues, shared-proto and api-gateway on 412, orders-svc and billing-svc on 389, shared-proto and orders-svc on 344, shared-proto and billing-svc on 301; catalog-svc and billing-svc only 22 and catalog-svc and accounts-svc 38

Key Insight: web-app and api-gateway changed together on 538 issues; orders-svc and billing-svc on 389. shared-proto appears in almost every row: a shared contract repository that turns each schema change into a multi-team release. These pairs are your real service boundaries — or the places where the boundaries are wrong. Behind the heatmap, the assistant pulls each issue's list of repositories and counts the pairs itself; Keypup returns the per-issue lists.

5. Scoring Each Repository's Independence

The matrix shows pairs. Leaders also need one number per repository to decide where to invest.

MCP Prompt:

For each repository, over the last 12 full months, show as a
horizontal bar chart the share of the Jira issues it has linked
pull requests for that also have linked pull requests in another
repository. Show the 10 repositories with the most issues, with
their issue count.

Output: How Independent Is Each Repository?

Horizontal bar chart of the coupling share of 10 repositories against an organization average of 27%: shared-proto 94% of 1,240 issues, api-gateway 71% of 1,480, billing-svc 52% of 1,140, web-app 48% of 3,120, orders-svc 45% of 1,610, accounts-svc 39% of 1,690, mobile-app 36% of 1,290, catalog-svc 21% of 1,480, search-svc 12% of 760 and notifications-svc 9% of 690

Key Insight: A shared contract repository and a gateway are expected to be coupled; that's their job. billing-svc is not: it's nominally an independent service, yet 52% of its issues need a change elsewhere. search-svc and notifications-svc ship on their own nine times out of ten. When you plan the next service extraction or consolidation, start with the red bars that aren't supposed to be red.

6. Measuring How Long Repositories Wait for Each Other

The merge spread is the window during which one part of a change is live and the other isn't.

MCP Prompt:

For Jira issues closed in the last 12 full months whose linked pull
requests touch 2 or more repositories, show a histogram of the
business days between the first and last merge of their linked
pull requests (under 1, 1-3, 3-10, 10+). Add the share closed
before their last linked pull request merged and the median number
of distinct pull request authors for issues touching 3+
repositories.

Output: How Long Do Repositories Wait for Each Other?

Histogram of merge spread for 4,970 cross-repository Jira issues: 31% under 1 business day, 26% between 1 and 3, 28% between 3 and 10 and 15% over 10 business days; side cards show 11% of these issues were closed in Jira before their last linked pull request merged, and a median of 3 distinct pull request authors on issues touching 3 or more repositories against 1 for single-repository issues

Key Insight: 43% of cross-repository issues take three business days or more between their first and last merge. And 11% were closed in Jira before their last linked pull request merged: the board says done while code still waits in another repository. Issues touching three or more repositories involve a median of three pull request authors — three people who need to land their work in the right order.

7. Listing the Half-Shipped Changes to Unblock This Week

The last step turns the analysis into a list for this week's cross-team sync.

MCP Prompt:

List open Jira issues whose linked pull requests touch 2 or more
repositories, where at least one linked pull request is merged and
another is still open. Show the key, type, parent, repositories
touched, merged vs total linked pull requests, the repositories
with open pull requests, business days since the first merge and
the age of the oldest open pull request. Sort by business days
since the first merge.

Output: Half-Shipped Changes to Unblock This Week

Table of six open Jira issues with partly merged linked pull requests across repositories, sorted by business days since the first merge: ORD-4412 Story, 4 repositories, 3 of 5 pull requests merged, still waiting in billing-svc and mobile-app, 9.4 business days since first merge; ACC-1873 Story, 2 of 3 merged, waiting in shared-proto, 8.7; BIL-2290 Bug, 1 of 4 merged, waiting in orders-svc and web-app, 7.2; CAT-0961 Story, waiting in api-gateway, 6.5; WEB-5530 Task, 4 of 6 merged, 5.1; MOB-3318 Story, 1 of 2 merged, waiting in api-gateway, 4.3
IssueTypeParentReposPRs mergedStill waiting inSince 1st merge (bd)Oldest open PR (bd)
ORD-4412StoryORD-430043 / 5billing-svc, mobile-app9.412.1
ACC-1873StoryACC-182032 / 3shared-proto8.79.0
BIL-2290BugBIL-220131 / 4orders-svc, web-app7.27.8
CAT-0961StoryCAT-090022 / 3api-gateway6.511.3
WEB-5530TaskWEB-540254 / 6mobile-app, accounts-svc5.16.4
MOB-3318StoryMOB-329021 / 2api-gateway4.34.9

Key Insight: ORD-4412 merged in three repositories 9.4 business days ago and is still waiting on billing-svc and mobile-app. Each row is code already merged that depends on code that isn't. Behind the table, the assistant runs two queries — open issues with their linked pull requests, and open pull requests with the issues they reference — and joins them by issue.

The Technical Implementation: What Keypup MCP Actually Reads

Every number above comes from fields Keypup already imports from Jira and your Git platforms. It helps to be precise about what they are — and what they aren't.

Keypup links a pull request to a Jira issue when the pull request references the issue key with a closing keyword such as "fixes", "closes" or "resolves". Each issue then carries the list of its linked pull requests and the repositories they belong to. If many pull requests don't reference an issue that way, cross-repository work will be undercounted: check the share of merged pull requests linked to an issue, by repository, before reading the rest, and agree on a convention where it's low.

Repositories Are Git Repositories, Not Services

Keypup sees repositories, not deployable services. In a monorepo, a change touching five services is one repository and won't appear here; split by directory isn't available from pull request data. In a polyrepo setup where some repositories hold infrastructure, documentation or configuration, ask your assistant to exclude them so the coupling numbers only cover application code.

Merge Dates Are Not Deployment Dates

Merge spread uses the merge dates of linked pull requests. Keypup doesn't import deployment events, so it doesn't know when each repository reached production. A short merge spread is a necessary condition for a coordinated release, not proof of one.

Cycle Time Depends on Your Jira Workflow

Cycle time runs from the issue's creation to its closure in Jira. If teams create issues long before work starts, or close them long after the last merge, cycle time will reflect that. Compare like with like: same issue types, same Jira projects.

Pair Counts Are Computed by the Assistant

Keypup returns, for each issue, the list of repositories its linked pull requests touch. The co-change heatmap is built by the assistant from those lists, counting each pair of repositories once per issue. For large organizations, ask for the top repositories first so the list stays manageable.

Business Days

Cycle time, merge spread and pull request age are counted in business days, Monday to Friday, with Keypup's BUSINESS_DAYS function, which accepts a time zone and working hours. It doesn't know about public holidays: Keypup doesn't import calendars.

Real-World Impact: Enterprise Case Studies

Case Study 1: European E-Commerce Group

Before Keypup MCP:

  • 600 engineers, 180 repositories after a three-year microservices migration
  • Per-repository metrics all green; product leadership still reporting slow feature delivery
  • An architecture roadmap planning ten more service extractions

After Keypup MCP:

  • The repositories-touched view showed 34% of issues needed two or more repositories, and those issues had a median cycle time 2.6 times longer
  • The co-change heatmap revealed that three "independent" order-management services changed together on most issues; they were merged back into one repository owned by one team
  • Two of the ten planned extractions were cancelled after the co-change data showed the target code changed with its neighbours on most issues

"We were about to spend a year splitting services that the data showed always changed together. The co-change matrix was the first architecture document that described how we actually work."

— VP Engineering, European E-Commerce Group

Case Study 2: North American Financial Services Platform

Before Keypup MCP:

  • 1,100 engineers across 46 Jira projects and more than 300 repositories
  • A shared contract repository used by every service, with frequent multi-team release trains
  • Incidents traced to partially deployed changes several times a quarter

After Keypup MCP:

  • The coupling bars made the shared contract repository's cost visible: 90% of its issues needed changes elsewhere, with a median merge spread of more than four business days
  • The platform team introduced backward-compatible contract versioning, and the share of cross-repository issues fell from 31% to 22% in three quarters
  • The half-shipped list became the agenda of a weekly cross-team sync, replacing release-order instructions written in ticket comments

"Everyone knew the shared models library was a bottleneck. Nobody could say how big. Once we had the number of issues waiting on it every week, the versioning project was approved in one meeting."

— Head of Platform Engineering, Financial Services Platform

Implementation: Getting Started with Keypup MCP

1. Connect Jira and Your Git Platforms

Connect Jira and GitHub, GitLab, Bitbucket or Azure DevOps to Keypup. Issues and pull requests are imported automatically, across all your repositories.

2. Check How Many Pull Requests Reference an Issue

Ask your assistant for the share of merged pull requests linked to an issue, by repository. Where it's low, agree on a convention: a closing keyword followed by the issue key in every pull request description.

3. Decide Which Repositories Count

List the repositories that hold infrastructure, documentation or configuration, and exclude them in every prompt so the numbers describe application coupling.

4. Connect the MCP Server to Your AI Assistant

Follow the MCP documentation to connect Keypup to Claude, ChatGPT, Cursor or any MCP-compatible assistant.

5. Bring the Data to Architecture Reviews

Run the co-change heatmap and the coupling bars before each architecture review, and check the trend after every service extraction or consolidation. Use the half-shipped list in the weekly cross-team sync.

Frequently Asked Questions

What is a distributed monolith?

A distributed monolith is a system split into separate services or repositories that still have to change and release together. It has the operational cost of microservices — networks, pipelines, versioning — without their main benefit, which is letting teams ship independently.

How do you measure coupling between microservices?

Count how often a single unit of work needs changes in several repositories. Linking each Jira issue to the pull requests that resolve it gives the list of repositories each change touched. The share of issues touching two or more repositories, and the pairs that change together most often, measure coupling as it shows up in delivery.

Why are DORA metrics good while features are still slow?

Because most DORA dashboards measure each repository on its own. Pull requests can be small and fast in every repository while the feature waits between them. Measuring cycle time and merge spread at the level of the Jira issue, across all its linked pull requests, shows the delay that per-repository metrics miss.

Should we merge services that always change together?

Not automatically, but it's the first question to ask. Repositories that change together on most issues either belong to the same service or share a contract that needs to be versioned. The co-change data tells you where to look; the decision still depends on ownership, scale and deployment needs.

The Bottom Line

Your architecture diagram shows how the system is split. Your delivery data shows how the work is split. Keypup MCP compares the two:

✅ Measuring how many changes cross repository boundaries and how much code they carry ✅ Pricing each extra repository in cycle time and merge spread ✅ Tracking whether coupling improves as the architecture evolves ✅ Mapping the repositories that always change together ✅ Scoring each repository's independence ✅ Showing how long repositories wait for each other ✅ Listing half-shipped changes to unblock this week

Ready to see how independent your services really are? Connect the Keypup MCP Server and ask your AI assistant.

Ready to Transform Your Analytics?

Join teams already using AI to make data-driven decisions faster than ever.

Most Recent Articles

6 Best Engineering Metrics Software for Board Reporting (2026)

6 Best Engineering Metrics Software for Board Reporting (2026)

Compare the 6 best engineering metrics software for board reporting in 2026 — Keypup, Swarmia, Code Climate Velocity, Jellyfish, Faros and LinearB — on board-ready reporting clarity, business context mapping, non-technical accessibility, DORA Metrics, customization and AI capabilities. Learn which metrics belong in an engineering board report and how to translate them into language your board understands.

Liam Davis
The Headcount Paradox: Why Hiring More Engineers Didn't Speed Up Delivery

The Headcount Paradox: Why Hiring More Engineers Didn't Speed Up Delivery

Engineering headcount grew 50%, yet merged pull requests and delivered Jira issues barely moved. Learn what engineering leaders on Reddit say about hiring that slows teams down, and how Keypup MCP uses pull request, review and Jira data to show where the extra capacity goes: review queues, overloaded reviewers and work that now spans several repositories.

Arnaud Lachaume
Timesheet Theater: Why Jira Time Logs Don't Match What Your Engineers Actually Built

Timesheet Theater: Why Jira Time Logs Don't Match What Your Engineers Actually Built

Software capitalization, client billing and R&D tax credits all run on Jira time logs that engineers fill in on Friday afternoon, from memory. Learn what engineering and finance leaders on Reddit say about time tracking nobody trusts, and how Keypup MCP compares Jira worklogs with linked pull requests, commits and merges to show when time is logged, how late it arrives, and which hours have code behind them.

Thomas Williams