Read this if you have an open PR on Tenali. 21 of the open PRs change client/src/App.jsx. That is why so many of them are sitting.
Why everything conflicts
client/src/App.jsx is ~69,800 lines. There is no router: one App() at line 42396 and a Home() below it. Adding a feature means an import near line 114, a branch inside App(), and a tile in Home().
Every feature PR edits those same three places. So any two feature PRs conflict by construction, no matter how unrelated the features are. This is our design problem, not yours.
Merge order for the four that are ready
These four are mergeable today and go in this order:
Smallest change to App.jsx first, so each rebase lands on a file that has moved as little as possible. Reversed, the three behind #69 would each rebase onto a substantially rewritten file.
If your PR is in this list: expect one rebase after the PR ahead of yours merges. Please don't rebase before then, or you'll likely do it twice. We'll comment on each PR as it comes up, so you don't need to watch this thread.
One exception: #101 already conflicts with main and needs a rebase now to be mergeable — don't wait for your slot.
#69 also reformats large regions it doesn't functionally change: of 1,606 removed lines, most are added semicolons, collapsed alignment whitespace and trimmed blank lines across 182 hunks. Please split that reformatting into its own PR — it makes the feature hard to review and worsens every conflict behind it.
Unowned PRs
#173 (server route extraction, Phase 2 of #116) — the author's internship ended 2026-09-02, so it has no active owner. It is not in the order above. If you'd like to adopt it, say so on that PR.
If your PR is not in that list
These also touch App.jsx and are currently conflicting: #151, #132, #102, #99, #71, #67, #62, #60, #26, #25, #13.
Please rebase onto latest main now and get your PR to mergeable. We can't sequence a PR that doesn't merge cleanly, so conflicting PRs will keep being skipped over. If your rebase is genuinely unmanageable, say so on your PR and we'll help rather than let it sit.
These touch App.jsx and are currently mergeable but not yet in the order: #174, #162, #161, #73, #17. Hold your rebase — we'll sequence you in a follow-up once the four above have landed.
The actual fix
The merge order is a workaround. The fix is that adding a feature should stop editing App.jsx at all.
Features already live in their own files (WaterJugLab.jsx, BattleApp.jsx, and so on) — App.jsx only imports them and switches on them. So we want a feature registry: one entry per feature in a map of key to lazily-loaded component, with App() and Home() reading the registry instead of hard-coding each case. A new feature then adds one file plus one registry line, and two feature PRs stop touching the same lines.
This is the client-side mirror of #116, the epic that is already splitting server/index.js into per-feature route modules. #116 opened for the same reason we're writing this: two feature PRs both landed top-of-file declarations in one file and produced the duplicate-JWT_SECRET bug in the 2026-07-27 redeploy. App.jsx is that problem one layer up, and #173 was Phase 2 of the server half.
We'll follow #116's shape rather than invent one: a proof-of-concept extraction of a single feature first, then batched sub-issues, one PR per batch so review and rollback stay scoped. #69 already pulls in lazy and Suspense, so part of the pattern is in flight already.
We'll open a separate issue for the registry. It needs to land between merges, not during, so we'll sequence it explicitly rather than surprise anyone mid-rebase.
Summary
- Four PRs merge in the order above; we'll ping each in turn.
- Conflicting PRs: rebase now.
- Mergeable but unsequenced: hold.
- We're fixing the underlying file so this stops happening.
Thanks for the patience — the sequencing delay is on us.
Read this if you have an open PR on Tenali. 21 of the open PRs change
client/src/App.jsx. That is why so many of them are sitting.Why everything conflicts
client/src/App.jsxis ~69,800 lines. There is no router: oneApp()at line 42396 and aHome()below it. Adding a feature means an import near line 114, a branch insideApp(), and a tile inHome().Every feature PR edits those same three places. So any two feature PRs conflict by construction, no matter how unrelated the features are. This is our design problem, not yours.
Merge order for the four that are ready
These four are mergeable today and go in this order:
Smallest change to
App.jsxfirst, so each rebase lands on a file that has moved as little as possible. Reversed, the three behind #69 would each rebase onto a substantially rewritten file.If your PR is in this list: expect one rebase after the PR ahead of yours merges. Please don't rebase before then, or you'll likely do it twice. We'll comment on each PR as it comes up, so you don't need to watch this thread.
One exception: #101 already conflicts with
mainand needs a rebase now to be mergeable — don't wait for your slot.#69 also reformats large regions it doesn't functionally change: of 1,606 removed lines, most are added semicolons, collapsed alignment whitespace and trimmed blank lines across 182 hunks. Please split that reformatting into its own PR — it makes the feature hard to review and worsens every conflict behind it.
Unowned PRs
#173 (server route extraction, Phase 2 of #116) — the author's internship ended 2026-09-02, so it has no active owner. It is not in the order above. If you'd like to adopt it, say so on that PR.
If your PR is not in that list
These also touch
App.jsxand are currently conflicting: #151, #132, #102, #99, #71, #67, #62, #60, #26, #25, #13.Please rebase onto latest
mainnow and get your PR to mergeable. We can't sequence a PR that doesn't merge cleanly, so conflicting PRs will keep being skipped over. If your rebase is genuinely unmanageable, say so on your PR and we'll help rather than let it sit.These touch
App.jsxand are currently mergeable but not yet in the order: #174, #162, #161, #73, #17. Hold your rebase — we'll sequence you in a follow-up once the four above have landed.The actual fix
The merge order is a workaround. The fix is that adding a feature should stop editing
App.jsxat all.Features already live in their own files (
WaterJugLab.jsx,BattleApp.jsx, and so on) —App.jsxonly imports them and switches on them. So we want a feature registry: one entry per feature in a map of key to lazily-loaded component, withApp()andHome()reading the registry instead of hard-coding each case. A new feature then adds one file plus one registry line, and two feature PRs stop touching the same lines.This is the client-side mirror of #116, the epic that is already splitting
server/index.jsinto per-feature route modules. #116 opened for the same reason we're writing this: two feature PRs both landed top-of-file declarations in one file and produced the duplicate-JWT_SECRETbug in the 2026-07-27 redeploy.App.jsxis that problem one layer up, and #173 was Phase 2 of the server half.We'll follow #116's shape rather than invent one: a proof-of-concept extraction of a single feature first, then batched sub-issues, one PR per batch so review and rollback stay scoped. #69 already pulls in
lazyandSuspense, so part of the pattern is in flight already.We'll open a separate issue for the registry. It needs to land between merges, not during, so we'll sequence it explicitly rather than surprise anyone mid-rebase.
Summary
Thanks for the patience — the sequencing delay is on us.