Here’s a small moment every developer knows. A teammate asks in Slack: “Hey, is the auth refactor done?” You know the answer is technically knowable — there are commits, there’s a PR, CI ran on it — but the official answer lives in a ticket that says “In Progress,” last touched four days ago. So you stop what you’re doing, reconstruct the state from three different tabs, and type a paragraph that will be stale by lunch.
That moment happens dozens of times a week on a typical team. It’s not a communication problem. It’s an architecture problem: the work and the record of the work live in two different systems, and your team is the integration layer.
“Cool, cool, cool.” — the team, every time this happens.
The two-system problem
Every small dev team runs the same split-brain setup:
-
GitHub holds the truth — what was actually built, reviewed, merged, and shipped.
-
A tracker (Jira, Trello, Linear, a spreadsheet, a Notion doc) holds the story — what people said was happening.
Both systems are fine at their jobs. The problem is the seam between them, because someone has to manually ferry state across it: move the card when the PR opens, move it again when review starts, again when it merges, again when CI passes. Nobody enjoys this work, so it’s done late, in batches, right before meetings — or not at all. The board drifts from reality, and then the team builds compensating rituals (standups, status threads, “quick syncs”) to paper over the drift.
We wrote about the drift itself in Jira shows tickets, not truth. This piece is about the fix, and why it’s architectural rather than disciplinary.
Why “just be more disciplined” never works
The standard advice is process: ticket IDs in branch names, PR templates, automation rules, a bot that nags people. These help at the margins, but they all share a flaw — they ask humans to maintain a second copy of information that already exists in the repo, accurately and forever, as a tax on their real work.
Taxes on real work get evaded. Not out of laziness; out of correct prioritization. When it’s 6 PM and the choice is “fix the flaky test” or “update three tickets,” the tickets lose, and they should. Any system whose accuracy depends on engineers choosing bookkeeping over shipping will be inaccurate. That’s not a people problem to fix — it’s a design constraint to respect.
What “commits next to tasks” actually changes
The alternative is simple to state: instead of asking people to report status into the tracker, pull the artifacts into the tracker. Put commits, pull requests, and CI status directly beside the tasks they belong to, streaming, so the board reads the repo rather than waiting to be told about it.
This sounds like a small UI decision. It changes at least four things in practice:
1. “Is it done?” becomes a look, not a question. The task has the PR next to it. The PR is merged. CI is green. Nobody asked anyone anything, and the answer was true — not “true as of when someone last updated the card.”
2. Standups collapse into the useful 10%. When shipped work and in-flight work are visible on the board, the status-recital part of standup evaporates. What’s left is the part meetings are actually good at: blockers, decisions, disagreements. Our guide to running async standups from GitHub activity goes deep on this, but the short version is: the repo already wrote everyone’s update; the only question is whether the team reads it there.
3. Stalled work surfaces itself. A task with a card that says “In Progress” and a linked branch with no commits in five days is a contradiction the board can show you — no meeting required. In the two-system world, that stall is invisible until someone thinks to ask.
4. Trust stops depending on reporting discipline. Leads stop nagging, because they can see. Engineers stop feeling surveilled, because nobody’s asking for status — the artifacts speak. The surveillance feeling was never about oversight; it was about manual oversight. Reading the repo feels different from interrogating people, because it is different.
The objection: “my tracker already has a GitHub integration”
Most do, and they’re better than nothing. But there’s a difference between a tracker that links to GitHub and a workspace where GitHub activity is a first-class citizen. In the link model, the ticket is still the source of truth — the PR decorates it, and the human still decides when the card moves. The bookkeeping tax survives; it’s just slightly better labeled.
The question to ask of any tool: when a PR merges, does anything on the board change without a human touching it? If the answer is no, you have a link, not an integration, and the seam — and the tax — is still there.
What this looks like in Kahoona
This is the exact problem we built Kahoona to solve, so here’s the concrete version. Kahoona is a dev workspace — whiteboard, project board, and live GitHub activity in one place. You connect a repo and it builds your first project, populated with real work items, in about 30 seconds. From then on:
-
Tasks sit next to the commits and PRs that implement them.
-
CI status shows up beside the work, so “done” means passing, not moved.
-
The board updates from the stream of repo activity, not from anyone’s memory.
There’s no sync ritual, no ticket-ID discipline, no bot nagging people in Slack. The integration layer isn’t your team anymore — it’s the tool, which was the obvious place for it all along.
👉 Try it on your own repo — first project builds itself in ~30 seconds, free to start
The bottom line
Commits belong next to tasks for the same reason gauges belong on the dashboard instead of in a logbook: the people making decisions shouldn’t have to ask anyone what the machine is doing. Your repo already knows the status of everything your team is building. The only choice is whether your board reads that directly, or pays your engineers a daily bookkeeping tax to transcribe it — badly, late, and at the cost of the focus you hired them for.
Related: Jira shows tickets, not truth · Kahoona vs Jira: an honest comparison Jira Shows Tickets, Not Truth How to Run Async Standups From Your GitHub Activity