Episode 17

The Trunk-Based Experiment

"One branch. No gates. No excuses."
27 min read
Week of May 25 - 29, 2026

Katja puts a new DORA baseline beside Navigator's weekly synthesis and finds the same diagnosis from two directions: long-lived branches, rubber-stamp reviews, and Friday-night recovery work landing on the same people every week. They bring both kinds of evidence to Lukas in a conference room confrontation that reframes trunk-based development from ideology to survival. Then Stefan draws a line on the whiteboard and writes one word: main. Daniel calls it reckless. Mariana calls it the first honest proposal anyone's made in six months. Hassan just wants to stop spending Friday nights untangling merge conflicts created by people who left at five.

Previously: "The Code Review That Isn't a Review" — Stefan opened three weeks of pull request history and found approvals faster than anyone could have read the code. Tomasz walked them through his circuit breaker, the one that saved fourteen production deploys and was approved in eight minutes by someone who left a thumbs-up. Then Tomasz walked out. Same gray hoodie. Same quiet. The code stayed. The judgment didn't.

Monday, 09:22 — The Numbers and the Pattern

Katja and Stefan side by side at her desk, leaning toward the monitor showing a DORA baseline beside Navigator's weekly synthesis
"A DORA baseline on one side. Three weeks of written evidence on the other."

Katja intercepted Stefan before he’d even put his bag down.

He found her at her desk with both hands wrapped around a coffee mug she’d stopped drinking from. The Cult of Luna t-shirt was inside out. She hadn’t noticed. Her glasses were on, which meant she was reading something that mattered, and the reading glasses pushed up on her forehead meant she’d already read it twice and needed someone else to confirm she wasn’t hallucinating.

“Navigator finally has enough history to say something useful,” she said. “And the new DORA baseline says the same thing in numbers.”

Stefan pulled a chair over. The dev floor was filling up around them. Developers drifting in with headphones and coffees, settling into the Monday rhythm. Nobody was paying attention to Katja’s screen yet. The AC unit had kicked on early. Late May heat was arriving on schedule.

Her screen was split in two. On the left: Navigator’s weekly synthesis. Three weeks of daily logbooks pulled into one blunt narrative with highlighted excerpts and short summaries that kept circling the same problems from different angles. On the right: a fresh DORA baseline Katja had assembled for this narrow case.

Stefan leaned in.

“How far back does this go?” he asked.

“Three weeks of synthesis,” Katja said. She pointed at the first highlighted theme, then at the DORA panel. “Enough to stop calling this a bad week and start calling it a pattern. The numbers just make it harder to lie about.”

Stefan didn’t react. Not yet.

“Read this first,” Katja said.

She highlighted one synthesized line after another.

Reviews happen too quickly to transfer understanding.

Integration work accumulates in silence, then lands all at once under deadline pressure.

Friday evening recovery depends on the same two people often enough to count as structure, not coincidence.

The pattern was unmistakable. Nobody was integrating continuously. They were stockpiling changes in feature branches, letting them grow fat and dangerous, then merging everything in a panicked rush at the end of a sprint cycle. The DORA baseline showed the delivery symptoms. Navigator’s synthesis showed what it felt like to live inside them.

Stefan sat back.

“So the reviews still read like permission slips,” he said.

“Exactly.” Katja took off her glasses and rubbed her eyes. The bobby pins in her bun were losing their grip. “But now it’s not Tomasz’s last week and a few ugly pull requests. It’s a written pattern across the whole team, and the DORA baseline backs it up.”

Stefan pulled his notebook from his bag. The leather was sun-bleached where it had sat on cafe tables in Bogota and Mexico City. He opened it to a blank page and wrote four phrases:

Long-lived branches Reviews without understanding Friday-night recovery work Burst, silence, panic

Below that, he drew a line and wrote: “These aren’t code reviews. These are merge ceremonies.”

Katja read it upside down.

“You should save that line for Lukas,” she said.

“I intend to.”

They sat with the report for another twenty minutes. Stefan asked questions. Katja pulled up the supporting excerpts and then the actual repository screens beside them. The Unity codebase was worse. Anton’s work touched everything, which meant his branches sat for days because nobody wanted to review a sprawling change on a Friday afternoon. The backend was better but not good. Mariana’s changes were usually smaller. Hassan’s infrastructure work still landed in heavy drops because everything around it was fragile and nobody wanted to touch it twice.

“The branch list,” Stefan said.

Katja navigated to the repository’s branch view. Forty-seven open branches. Some with names like feature/new-event-system-v3. Some with names like hotfix-temp-do-not-delete. One called hassan-friday-night-fix with a last commit date three weeks old.

Stefan pointed at it.

“Hassan’s Friday night,” he said.

Katja’s jaw tightened.

The branch told a story without words. Hassan, alone on a Friday evening, fixing something urgent enough to stay late for. Creating a branch because that’s what the process required. Committing a fix. Not merging it because the approval gates required two reviewers and nobody was online. Going home. Monday arriving. The branch sitting there, unmoved, while Hassan moved on to the next fire. Three weeks later: still open. Still unmerged. A fix that existed but wasn’t deployed, suspended in process limbo between the problem and the solution.

“Show this to Lukas,” Stefan said. “All of it.”

“When?”

“Today. Before standup turns it into a committee discussion.”

Katja looked across the floor. Developers were settling in, headphones going on, monitors flickering to life. Lukas’s desk was still empty. He usually got in around 09:30, bike locked to the rack by the entrance, cycling shoes swapped for Allbirds at his desk.

She picked up her phone and typed a message.

Lukas. Conference room when you get in. Bring coffee. You’ll need it.

Monday, 09:34 — The Gap

Lukas, Katja, and Stefan in a conference room reviewing Navigator synthesis and DORA baseline on a wall display
"When numbers and lived experience match, excuses run out."

Lukas was four minutes late. Cycling shoes replaced, Allbirds on, Apple Watch reflecting the conference room lights. He held his coffee with both hands the way people do when they suspect they’re about to hear something they don’t want to hear.

“What is this?” he said, looking at the screen.

Katja had connected her laptop to the wall display. Navigator’s weekly synthesis filled the left side of the sixty-five-inch panel. The new DORA baseline sat on the right. Highlighted themes ran down one side. Delivery signals sat on the other.

“Navigator synthesized three weeks of daily logs,” Katja said. “And for this one narrow case, I added a DORA baseline beside it. Not opinions. Not a one-off complaint. A repeated description of how work actually feels here, supported by delivery evidence.”

Lukas set his coffee down. He studied the screen the way a man studies a bank statement when he already knows the month went badly.

“This is every week?” he said.

“The synthesis is,” Katja said. “The DORA baseline is new. They point to the same problem.”

Lukas turned to Stefan.

Stefan had positioned himself near the screen. Not dominating it. Just close enough to point at things.

“Your competitors don’t live like this,” Stefan said. “The people writing logs in this report are describing the same cycle the DORA baseline is exposing: big branches, rushed merges, late-night fixes, relief when nothing catches fire. That’s not normal. It’s just familiar.”

Lukas’s jaw moved slightly. The Wooga tattoo on his inner wrist peeked out as his hand shifted on the table. He knew those companies. He’d worked at one of them. He knew what their deployment culture looked like. He just hadn’t measured the distance between that world and his own.

“The synthesis gives the problem a human voice,” Stefan said. “The DORA view gives it hard edges.”

Katja clicked to the supporting evidence. Open branch names. Review comments that said almost nothing. A Friday-night note from Hassan about untangling conflicts alone.

“This is not review,” Katja said. “This is permission theater with commit hashes attached.”

Lukas sat down.

“These are merge ceremonies,” Stefan said. “Not continuous integration. Teams build up changes in feature branches for days. Sometimes weeks. Then they merge everything at once. The merges conflict. The conflicts take hours to resolve. The resolution introduces bugs. The bugs go to production because nobody can review a bloated change fast enough to understand it. The deploys wobble. The recovery lands on the same people. The cycle repeats.”

Lukas was quiet for a long time. The AC pushed cold air through the conference room. Through the glass walls, the dev floor was filling up. Mariana’s cut-offs were visible at her standing desk. Hassan’s dark hoodie was already in place, headphones on.

“So the gates aren’t creating confidence,” Lukas finally said.

“No,” Stefan said. “They’re creating delay and the feeling of safety. Different thing.”

Lukas closed his eyes. Briefly. The gesture of a man doing arithmetic he didn’t want to do.

“What’s the fix?” he said.

“Trunk-based development,” Stefan said. “One branch. Developers commit to main multiple times a day. Small changes. Continuous integration. Automated tests run on every commit. No feature branches that live for weeks. No two-thousand-line PRs. No merge ceremonies.”

Lukas opened his eyes.

“No feature branches?”

“No long-lived feature branches. Short-lived branches for a few hours of work, merged the same day. Feature flags for incomplete features. Small, frequent commits instead of large, infrequent drops.”

Lukas looked at Katja.

“What does Daniel think about this?”

“He doesn’t know yet,” Katja said.

Lukas picked up his coffee again.

“He’s going to lose his mind,” he said.

“Probably,” Stefan said.

“Do it.”

Stefan nodded.

“Show him both,” Lukas said. “If he argues against a pattern the whole team keeps describing and the delivery evidence points to the same thing, that’s his problem.”

He stood up. Checked his Apple Watch. 09:52. The gesture automatic. Time was always running.

At the door he paused.

“How long before the competitors deploy ten times a day and we’re still doing merge ceremonies every three weeks?” he said.

“They already are,” Stefan said.

Lukas left. The glass door swung shut behind him.

Katja let out a breath.

“That went better than I expected,” she said.

“He’s scared,” Stefan said. “Scared is useful. Scared means he’ll let us try things he wouldn’t have approved three weeks ago.”

Katja looked at the synthesis still filling the wall display. The repeated language. The same pain, phrased three different ways. The pattern.

“Those gaps,” she said. “Each one is someone like Hassan working a Friday night to fix something and not being able to deploy it because of approval gates.”

Stefan wrote in his notebook:

The gap between fix and deploy is where frustration becomes resignation.

Tuesday, 14:17 — One Word on the Whiteboard

Team gathered around a whiteboard as Stefan presents a single mainline workflow
"One line on the board. One branch in the repo. No place left to hide."

Stefan drew a line on the whiteboard.

One line. Horizontal. Black marker.

Above it he wrote one word: main.

Then he capped the marker and turned around.

Twelve developers were looking at him. Some standing. Some sitting on desks. Some cross-legged in chairs they’d rolled over from their stations. The dev floor had been rearranged around the whiteboard like a lecture hall nobody planned.

Daniel was standing at the edge of the group. Arms crossed. Moleskine in his right hand, closed. His jaw was tight. Pale blue button-down, tucked. Khakis. Leather shoes. The only person in the room not in sneakers or barefoot.

“That’s it?” Daniel said.

“That’s it,” Stefan said. “One branch. main. Every commit goes to main. Every day.”

“That’s reckless,” Daniel said.

“Is it?” Stefan said.

Mariana was leaning against her standing desk four meters away. Sepultura tee so faded the band logo was more memory than print. Cut-offs. Bare brown feet on the office carpet. Arms crossed. The smirk was barely visible, but Stefan caught it.

“So we just push to main?” said Sofia from her chair. Cropped white tee. High-waisted jeans. The kind of question that comes from someone new enough to not have opinions yet and smart enough to ask anyway.

“You push to main through short-lived branches,” Stefan said. “Create a branch. Do a few hours of work. Open a PR. Get it reviewed. Merge within the day. The branch dies before it grows.”

“That’s what we do now,” Daniel said.

“No.” Stefan uncapped the marker again. Below the line, he drew a series of long diagonal branches, extending out from main like crooked fingers. Labels appeared: feature/new-match-system, feature/analytics-v2, hotfix-temp-do-not-delete, hassan-friday-night-fix. He drew them long, spreading apart, the gaps between them and main growing with each centimeter.

“This is what you do now,” Stefan said. “Feature branches that live for days. Weeks. One branch is three weeks old and unmerged. Seven branches have active merge conflicts. Your average branch lives for six days before it touches main again.”

He stepped back.

“By day six, the branch has diverged so far from main that merging it is a project in itself. It takes hours. It requires manual conflict resolution. The person who resolves the conflicts is usually not the person who wrote the code. They don’t understand it. They pick one side. Sometimes they pick wrong.”

Hassan shifted on the desk edge where he sat. Hood down. Headphones around his neck. His face didn’t change but his hands moved to his lap, fingers interlocking.

“I’ve spent four of the last six Fridays resolving merge conflicts,” Hassan said. Quiet. The kind of quiet that carries more weight than volume. “Not mine. Other people’s branches that conflicted with deployments. People who created the conflict left at five. I stayed.”

The room absorbed that.

“How long?” Mariana asked him.

“Three hours last Friday. Four the week before. The week before that, two hours, but production broke during the merge and I was here until midnight fixing it.”

Nine hours across three Fridays. Hassan, alone, unpicking the knots that long-lived branches tied into the codebase. While other developers went home, went to bars, went to clubs, slept.

Nobody said anything for several seconds.

Daniel’s crossed arms tightened.

“Approval gates exist for a reason,” he said. “Without them, untested code reaches production.”

Stefan turned to him. Not aggressive. Not dismissive. Just direct.

“Daniel, can you tell me the defect escape rate since you implemented the current approval gates?”

Daniel blinked.

“The what?”

“A point to one week in the last month where these gates created trust instead of delay.”

Silence.

“That’s not what the synthesis says,” Daniel said.

“No,” Stefan said. He glanced at the DORA baseline on Katja’s screen and then at Navigator’s synthesis. “What it says is worse. The DORA baseline shows the current gates are not producing the delivery safety you think they are. And week after week the synthesis says the same thing in plain language: approvals arrive fast but don’t answer the hard questions. Merges happen late. Fixes land on Fridays. People wait for permission and still don’t feel safe. The gates aren’t creating confidence. They’re creating delay.”

Daniel’s face went red. Not from anger. From the specific heat of having your certainty measured against evidence and finding a gap where the floor should be.

“That’s not fair,” Daniel said. “The gates catch things. You can’t prove what they prevent.”

“You’re right,” Stefan said. “I can’t measure what never happened. I can measure the delivery shape we do have, and I can read what the team keeps writing down anyway. They still don’t trust the result.”

Anton spoke from the back. Dark tee, arms folded, leaning against a pillar. His Russian accent thickened the consonants.

“The gates catch style issues and missing test files,” Anton said. “They catch typos in variable names. They don’t catch architectural problems because the reviewers don’t understand the architecture. That is the problem.”

Daniel turned to him.

“That’s not what gates are for,” Daniel said.

“Then what are they for?” Mariana said. Still leaning. Still smirking. But her voice was sharp.

Daniel opened his Moleskine. His hand moved toward the pen in his breast pocket. The automatic gesture of a man who documents everything because documentation is control and control is safety.

“They ensure that every piece of code is reviewed before it enters the system,” Daniel said. “That’s the fundamental principle.”

“Reviewed by whom?” Stefan said. “For what? In how much time? The comments say almost nothing. The understanding isn’t transferring. People are leaving thumbs-up emojis and LGTM comments and moving on. We proved this last week with Tomasz’s circuit breaker.”

Daniel’s pen stopped.

The circuit breaker. Last week. The one that protected production for eighteen months and was approved in eight minutes. The one nobody understood until Tomasz was in his last seventy-two hours at the company and explained it to a room that should have understood it the day it was written.

Nobody had to mention Tomasz’s name. The gray hoodie was visible to everyone. The empty desk where it used to hang over the chair back was ten meters away, cleared and reassigned.

“What are you actually proposing?” Daniel said. His voice had changed. Lower. The defensive edge replaced by something more careful. Not agreement. But the recognition that arguing against yesterday’s evidence with today’s theory was a losing position.

Stefan turned back to the whiteboard. He erased the long diagonal branches, leaving only the single horizontal line.

“Main,” he said. “One branch. Developers create short-lived branches that last hours, not days. PRs are small. Under two hundred lines. They get reviewed the same day. They get merged the same day. The branch dies.”

He drew short, almost vertical lines branching off main and immediately returning to it. Tiny arcs. Brief departures and quick returns.

“Continuous integration. Every merge triggers automated tests. The tests run in minutes, not hours. If they pass, the code is deployable. If they fail, the developer who broke them fixes them immediately. Not tomorrow. Not after standup. Now.”

“And the approval gates?” Daniel said.

“Replace them with automated checks. Linting. Test coverage thresholds. Build verification. The machine does the gate work. Humans do the understanding work. Pair reviews for context, not permission.”

Daniel looked at the whiteboard. The single line. The short arcs. The simplicity of it sat uncomfortably against the complexity he’d built into his approval process over two years.

“If someone pushes broken code to main, production breaks,” Daniel said.

“If someone pushes a bloated PR that nobody really reads and it gets approved anyway and it contains a bug, production breaks,” Stefan said. “That’s happening now. The DORA baseline gives you one angle. The synthesis gives you the lived one.”

Reader's note: Trunk-based development is not a new idea. High-performing teams have worked this way for over a decade. The research is clear: short-lived branches merged the same day, with commits to a shared mainline multiple times daily, produce fewer defects, faster recovery, and more frequent delivery than long-lived feature branches with extensive gate processes.

Pull requests were designed for open source projects where maintainers review contributions from strangers. Inside a cohesive company team, the same mechanism becomes a permission ritual. People who sit ten meters apart start behaving like anonymous contributors on the internet. The small same-day PR in this episode is a transition step, not the destination. The end state is no internal pull requests at all: direct commits to main, pairing for shared understanding, and automated checks doing the mechanical gatekeeping humans are bad at.

The resistance Daniel shows is common and understandable. Approval gates feel safe. They represent process discipline and accountability. But gates only work when people actually review what passes through them. When reviews become rubber stamps, the gate is an unlocked door with a sign that says "Security Checkpoint." Replacing that theater with automated checks and meaningful human collaboration isn't removing safety. It's relocating it from ceremony to practice.

Mariana pushed off her desk. Bare feet on the carpet. She walked to the whiteboard and looked at the single line.

“This is the first honest proposal anyone’s made in six months,” she said.

Not smirking anymore. Straight-faced. The Tupi-Guarani tattoo on her forearm dark against brown skin in the afternoon light.

“Last Friday,” she said, turning to the group, “I merged a 1,200-line PR from a branch that was nine days old. It took me forty minutes to resolve the conflicts. The conflicts existed because three other people had touched the same files during those nine days. I chose one version. I guessed. I was wrong about one of them. Hassan found it at eleven at night and fixed it in production.”

She looked at Hassan.

Hassan nodded once.

“Nine days,” Mariana said. “If that branch had been merged within a day, the conflicts never happen. I never guess. Hassan never stays until eleven.”

Stefan watched the room. The developers who hadn’t spoken were doing the math. Calculating how many hours they’d lost to merge conflicts, to stale branches, to the specific kind of cognitive overhead that comes from managing a branch that’s diverged so far from main that you can’t remember what state the code was in when you started.

Daniel was still standing. Still holding his Moleskine. But the pen was back in his pocket.

“I want to see the automated checks before we start,” Daniel said.

Not an objection. A condition.

Stefan nodded.

“We’ll set them up this week. Hassan and I will configure the CI pipeline. Automated tests, linting, build verification. When those are green, the code is ready for human review. The human review is about understanding, not permission.”

“How long for the trial?” Daniel said.

“Two weeks. The backend team. Mariana’s team. We start Thursday. We log the experiment in Navigator. Same-day merges, whether reviews become real, whether Hassan gets his evenings back. After two weeks, we compare the pattern.”

Daniel wrote something in his Moleskine. Short. Precise. Probably the word Thursday and a question mark.

“Fine,” Daniel said.

One word. Not enthusiastic. Not defeated. The word of a man who’d been shown a number that he couldn’t argue with and was choosing to trust the process of proving it wrong.

“Fine,” Stefan repeated.

Mariana was still at the whiteboard. She took the marker from Stefan’s hand and drew a small circle on the line where the word main sat.

“Thursday,” she said. The circle was a period at the end of a sentence the team had been trying to write for months.

Thursday, 10:03 — The First Commit

Mariana at her standing desk as the backend team watches the first small PR flow through CI
"The first commit changed the process faster than any argument ever could."

Mariana’s fingers hovered over the keyboard.

The terminal was open. The branch was called fix-leaderboard-cache-ttl. Seven files changed. Forty-three lines. The kind of change that would have been part of a larger PR two weeks ago. Bundled with three other fixes. Shipped as a 600-line commit. Reviewed by nobody. Approved by everybody.

Today it was alone.

Hassan had spent Tuesday and Wednesday rebuilding the CI pipeline with Stefan. Automated linting. Test suite running on every push. Build verification. Coverage threshold at seventy-eight percent, which was the current baseline. They’d raise it later. For now, the gate was: does it lint, does it test, does it build. Three questions. Three automated answers.

The green checkmarks appeared within four minutes of the push.

“That’s it?” Sofia said.

She was watching from her chair. Black crop tee. High-waisted jeans. The chair pushed back from her desk so she could see Mariana’s screen without standing.

“That’s it,” Mariana said. “CI passed. Lint. Tests. Build.”

“Now what?”

“Now someone reads it.”

Hassan was already reading it. He’d pulled the PR on his screen the moment it appeared. Seven files. Forty-three lines. He scrolled through them the way he always scrolled, fast and precise, stopping where the logic changed.

“Cache TTL was set to thirty minutes,” he said. “You changed it to five.”

“Leaderboard data goes stale at thirty minutes,” Mariana said. “Players see themselves at rank fifteen when they’re actually at rank eight. They file support tickets. Marcus’s team has been drowning in them.”

“Why five?”

“Looked at the query performance data. The cache query costs us twelve milliseconds. At five-minute intervals, we add maybe forty queries per minute. The database won’t notice.”

Hassan nodded. One nod. The nod of a man who understood both the change and the reasoning behind it, because the reasoning was included, and because the change was small enough to hold in his head without losing context.

“Approved,” Hassan said.

The PR merged. Twenty-seven minutes from branch creation to main.

Mariana’s Sepultura tee from Monday had been replaced by a sleeveless Kreator shirt, ripped at the shoulders. The studio heat was building toward summer. She’d shed shoes before nine o’clock. Her bare feet were silent on the carpet as she walked to the water cooler and back, the motion of someone who’d stopped waiting for permission.

By noon, the backend team had merged four small PRs. None were rubber-stamped. Each had at least one comment that demonstrated the reviewer had read the code.

Stefan sat at his desk and watched the floor instead of a dashboard. Questions were being asked earlier. Reviews were short enough to understand. Nobody looked hunted.

Daniel watched from his desk across the floor. He hadn’t closed his Moleskine all morning. The pen moved in small, controlled strokes. Whatever he was writing, it was detailed and probably organized by timestamp.

At 12:15, he walked to Stefan’s desk.

“The cache fix,” Daniel said. “Who verified it works in staging?”

“The automated tests cover the cache behavior,” Stefan said. “Hassan reviewed the query impact manually.”

“In staging?”

“We don’t have a staging environment that mirrors production,” Stefan said. “You know this.”

Daniel’s pen tapped against the Moleskine.

“That’s a gap,” Daniel said.

“Yes,” Stefan said. “It is.”

They looked at each other. Not hostile. Two men who saw the same gap from different sides. Daniel saw it as a reason to slow down. Stefan saw it as a problem to solve, but not a reason to stop.

“I’ve been saying we need proper staging for eight months,” Daniel said.

“You’re right,” Stefan said. “You’ve been right about that. Let’s build one.”

Daniel blinked. The response he’d prepared died somewhere between his Moleskine and his mouth. He’d expected resistance. He got agreement.

“Help me scope it after the two-week trial,” Stefan said. “Your QA requirements, Hassan’s infrastructure knowledge, Mariana’s team’s needs. A staging environment that actually reflects production.”

Daniel closed the Moleskine. Not a slam. A controlled close. The kind of close that means the conversation is finished but the thinking continues.

“After the trial,” Daniel said.

He walked back to his desk.

Mariana had watched the exchange from her standing desk. She caught Stefan’s eye and raised an eyebrow. The smallest possible question.

Stefan gave a slight nod.

He’ll come around, the nod said. Give him evidence, not arguments.

By 17:00, six PRs had been merged. Six developers had committed to main on the first day of the experiment. Nobody had broken the build. Nobody had rubber-stamped a review. Nobody had created a branch that would still exist on Monday.

Hassan left at 17:15.

On a Thursday.

Nobody remarked on it. But Stefan noticed. And Mariana noticed. And the fact that nobody remarked on Hassan leaving at 17:15 on a Thursday was itself remarkable, because the last time Hassan had left before six on a weekday, nobody could remember.

Friday, 16:48 — The Branch Graveyard

Mariana and Stefan review a branch graveyard on a shared screen as the Friday office empties
"The graveyard wasn't just stale branches. It was interrupted work made visible."

“How many are left?” Mariana asked.

She was standing at Stefan’s desk, looking at the GitHub branch list on his screen. Her Arch Enemy tank was thin enough to show the outline of her sports bra strap. Friday. The floor was emptying. Developers drifting out in pairs, making plans for the weekend. The after-work beer negotiations had started at four.

“Forty-three stale branches,” Stefan said. “Down from forty-seven on Monday.”

“We only killed four?”

“The team merged four that were close to ready. The other thirty-nine are the graveyard. Some are weeks old. Some are months.”

Mariana scrolled through the list. Names she recognized. Names she didn’t. Branches created by developers who’d since left the company. Branches created during crunch periods that were abandoned when the crunch ended and nobody went back to clean up.

feature/improved-matchmaking-v2 — last commit: March 14. Two months cold.

experiment/new-tutorial-flow — last commit: January 8. Five months. A ghost.

hotfix-temp-do-not-delete — last commit: April 22. The name was a warning that had become a lie. Nobody knew what it fixed. The developer who created it was on the Unity team and didn’t remember either.

“These are unfinished thoughts,” Mariana said. “Every single one is someone who started something, got pulled somewhere else, and never came back.”

“Priority fragmentation,” Stefan said. “Navigator’s been describing it for weeks. Too many urgent things, too many unfinished branches, too many people getting yanked sideways before they can finish anything. The branch becomes a monument to the interruption.”

Mariana’s thumb traced the tattoo on her forearm. The Tupi-Guarani geometric pattern. The gesture she did when she was thinking through something.

“Can we delete them?”

“Not yet. Some might have work we need. Let’s tag the owners, ask if they’re still relevant. If nobody answers in a week, we archive them.”

“And the new rule?”

“No branch lives longer than twenty-four hours. If it’s not merged by end of day, it gets discussed in standup the next morning. If it can’t be merged, it gets broken into smaller pieces or abandoned.”

Mariana nodded. Then she smiled. Not the smirk. A real smile. Quick and sharp, like she’d caught something she’d been chasing.

“You know what’s different?” she said.

“What?”

“I haven’t resolved a single merge conflict this week.”

Stefan let that sit.

Zero merge conflicts. In five days. After four of the last six Fridays had been consumed by them. After Hassan had spent nine hours across three weekends untangling other people’s branches.

Zero.

“Hassan went home at 17:15 yesterday,” Stefan said.

“I know. I watched him leave. He walked past my desk and said ‘Bis morgen’ and I almost fell off my standing desk.”

She laughed. Short. The kind that escapes before you can decide whether to contain it.

“That’s the thing that matters,” Stefan said. “Whether Hassan goes home before dark.”

Mariana’s smile faded into something more serious.

“Two days,” she said. “Two days of small PRs, same-day merges, automated checks. And already nobody’s staying late to clean up someone else’s mess.”

“Two days isn’t a trend,” Stefan said.

“No. But it’s a direction.”

Stefan closed his laptop. The screen went dark. The GitHub branch list disappeared, but the forty-three ghost branches didn’t. They were still there, suspended between intention and execution, waiting for someone to admit they were dead.

He put the laptop in his messenger bag. Canvas. Sun-faded.

“Next week,” he said. “We keep going. If the pattern holds, we expand to the Unity team.”

“Anton will want to see proof,” Mariana said.

“Good. Written evidence is all we need.”

The floor was almost empty now. Late May light poured through the south-facing windows. Golden hour in Kreuzberg. The U-Bahn rattled past below. Someone’s Bluetooth speaker was playing muffled jazz from the roof terrace, where the early arrivals for Friday drinks were setting up.

Hassan’s desk was dark. Monitor off. Chair pushed in. Headphones hanging on the monitor arm. Everything in its place. The desk of a man who’d left at a human hour and would come back Monday to a codebase that hadn’t ambushed him over the weekend.

Mariana headed for the stairs barefoot.

“Mari,” Stefan said.

She turned.

“Thanks for picking Thursday. The first commit mattered.”

Mariana’s mouth did the thing where a smirk tries to become something warmer and gets caught halfway.

“Someone had to go first,” she said. “Might as well be the person who’s been pissed off the longest.”

She took the stairs two at a time. Silent on bare feet. The Tupi-Guarani tattoo disappeared around the corner.

Stefan sat alone for a moment. The dev floor hummed with the sound of monitors going to sleep and the building’s HVAC cycling down for the weekend.

He opened his notebook and wrote:

Day 2 of trunk-based. Six small PRs. Real review comments. Zero merge conflict cleanup. Hassan left at 17:15.

The process didn’t change because someone argued better. It changed because someone committed first.

He closed the notebook. Picked up his bag. Left at 17:00.

On time. Like always.

Navigator — Katja Müller — 30 May 2026, 21:33

First week of trunk-based development on the backend team. Two days. Stefan proposed it Monday after we spent an hour reading Navigator’s weekly synthesis beside a new DORA baseline.

The report said what Tomasz’s departure had already made impossible to ignore: branches lived too long, reviews happened too fast to transfer understanding, and Friday-night recovery work kept landing on the same people. The DORA baseline did not replace that diagnosis. It confirmed, in a narrow and useful way, that the delivery symptoms matched the lived experience.

Stefan and I showed both to Lukas Monday morning. He asked, “This is every week?” and I could see him realizing that our delivery problem wasn’t one bad sprint. It was the operating system.

Tuesday, Stefan drew a line on the whiteboard and wrote one word: main. Daniel objected. Called it reckless. Stefan answered with the synthesis and the DORA baseline: the gates were slowing people down without giving them confidence. Daniel didn’t have a counter-argument. He had conditions instead: see the automated checks first. Fair enough.

Thursday, Mariana pushed the first small PR. Cache TTL fix that had been sitting in a bloated branch for a week. Hassan reviewed it carefully because the change was finally small enough to fit in a human brain. By end of day: six small PRs merged. No merge conflict cleanup. No Friday-night dread hanging over the room.

Hassan left at 17:15 on Thursday.

That’s the fact I’m going to remember from this week. Not because a chart is useless. Because Hassan left the building while the sun was still up.

Two days isn’t a trend. But I’ve watched Hassan work past dark for five months. I’ve read his Navigator logs about Friday nights fixing merge conflicts alone. I’ve seen the bags under his eyes get darker.

If trunk-based development means Hassan goes home before sunset, I don’t need two weeks of data. I need the rest of the team doing the same thing.

Daniel is watching from his desk. Moleskine open. Pen moving. He’ll have concerns to discuss on Monday. Good. His concerns about staging are valid. We do need a proper staging environment. Stefan agreed with him on that, which caught Daniel off guard. Nobody had told Daniel he was right about anything in months. Maybe that’s part of the problem.

Next week: full backend team on trunk-based. Week after: talk to Anton about the Unity team.

Navigator won’t tell me everything. Neither will a DORA baseline. But together they will tell me whether the same panic keeps showing up in the same old forms. For the first time in months, I think it won’t.

Next Episode: "When Tests Become Religion" Stefan introduces TDD to the backend team. Mariana writes her first test before her first line of code and discovers what she's been missing for three years. Anton watches from the Unity side and calls it theology. Sofia struggles with the pattern until something clicks at 16:00 on a Wednesday and she writes the cleanest code of her career. Daniel wonders why nobody told him that automated tests could replace half his approval gates.
×
×