prompt: Mixxx personal integration system — worktree-per-branch development, automated rebase/build/test, three-tier promotion chain, CI-conscious push policy
Last updated: 2026-08-10 (session 16, outline restructure + deere PR + archive) URL: https://gist.github.com/mxmilkiib/5fb35c401736efed47ad7d78268c80b6 RFC 2119
One git database, many worktrees. Each feature or bugfix lives in its own worktree under ~/src/mixxx-dev/, branched from upstream main. A script rebases all branches, builds test binaries, and runs the test suite. Branches that pass are merged into an integration branch and promoted through three gates: integration (working scratchpad) → integrating (locally tested) → integrated (CI confirmed). Pushes to open PR branches happen only when the patch content has actually changed — pure rebases are never pushed, to avoid wasting shared CI resources.
Run these checks automatically at the start of every session, before any other work:
- Promotion check — promotion is now automated via
auto-promote.yml. Verify it is working:gh run list --workflow auto-promote.yml --repo mxmilkiib/mixxx --limit 1 --json status,conclusion. If the last auto-promote run failed orintegratedlags behind a passingintegrating, investigate and manually run--promote-integratedif needed. - URGENT scan — check the Branch Status Outline for any entries marked
URGENTand report them. - Stale sentinel check — for any branch whose sentinel SHA (
~/.cache/mixxx-integration/<name>.tested) does not match its currentgit rev-parse HEAD, note it as needing a re-test before the next--push-integrating.
- Purpose: This living document tracks Milkii's personal Mixxx development setup, for creating and testing feature and bugfix branches, and MUST be updated as the workflow evolves.
- Last updated: The "Last updated" date at the top of this file MUST be updated whenever this file is edited
- Gist sync: This file,
mixxx-milkii-integration-update-branches.sh,mixxx-milkii-integration-pre-push.sh, andmixxx-milkii-integration-gdb-run.shMUST be kept in sync with the Gist (https://gist.github.com/mxmilkiib/5fb35c401736efed47ad7d78268c80b6).- To sync INTEGRATION.md:
gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename INTEGRATION.md INTEGRATION.md. - To sync the script:
gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-update-branches.sh mixxx-milkii-integration-update-branches.sh. - To sync the pre-push hook:
gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-pre-push.sh mixxx-milkii-integration-pre-push.sh. - To sync the GDB runner:
gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-gdb-run.sh mixxx-milkii-integration-gdb-run.sh. - All files MUST be updated whenever they change.
- To sync INTEGRATION.md:
- Dual dir: All source trees share the SAME
.gitdatabase rooted at~/src/mixxx/.git. Registered worktrees are not separate clones —git log,git branch -a, etc. show all branches from any path.~/src/mixxx/— checked out onmain; synced withmixxxdj/mixxxmain (see Main sync rule)~/src/mixxx-dev/integration/— checked out onintegration; all[x]-marked branches merged here; script and helper files live here; this is where./mixxx-milkii-integration-update-branches.shis run from;build/mixxxhere is the daily-driver binary~/src/mixxx-dev/<branch>/— individual feature/bugfix worktrees
- Main sync: The project repo MUST maintain a
mainbranch that is synced withmixxxdj/mixxxmain.origin/mainMUST be kept as a fast-forward mirror ofupstream/main— rungit push --no-verify origin mainafter everygit fetch upstream && git merge upstream/mainonmain. The upstreamrelease.ymlworkflow (triggers on push tomain, runs full build matrix withpublish: true+ Flatpak publishing) is disabled on the fork viagh workflow disable 169770132 --repo mxmilkiib/mixxx—mainis a mirror, not a release branch, so running the release pipeline on it would waste runner time and fail on missing publishing secrets. Re-enable withgh workflow enable 169770132 --repo mxmilkiib/mixxxonly if the fork ever needs to act as a release source. - Main read-only: The
mainbranch MUST NOT receive any local commits — not INTEGRATION.md updates, not patches, nothing. All commits go onintegrationor a worktree branch. Any stray commits onmainMUST be removed by force-pushing the cleanupstream/maintip. - Worktrees: All development MUST use worktrees, keeping individual branches clean for upstream PRs. The
integrationworktree at~/src/mixxx-dev/integration/is the script's operating base and where the daily-driver binary is built;~/src/mixxx/MUST remain onmainsynced withupstream/main. - Branch tiers: The
mixxxrepo MUST maintain three promotion-chain branches:integration— working merge branch; script operates here; may be broken at any time. Rebuilt from scratch on each run by mergingupstream/mainthen all[x]-marked worktree branches in order — it is intentionally ephemeral and MUST NOT be treated as stable.integrating— locally-tested-clean tier; promoted fromintegrationonly after ALL non-skipped worktrees have passing test suites (--push-integrating); triggers GA CI. Local tests run against the same kernel/libraries/ccache as the build; they catch logic regressions but not environment or flag differences.integrated— CI-confirmed-clean tier; promoted fromintegratingonly after GA CI passes onorigin/integrating(--promote-integrated); no dedicated worktree — the script updates the ref remotely viagh apiand force-pushes fromMIXXX_MAIN. GA CI runs a full build + unit test suite on a clean runner with no shared cache, catching missing-dependency or build-flag issues invisible to local tests. CI failures matchingKNOWN_INFRA_FAILURESin the script (Flatpak xvfb-run, Windows checksum mismatch, macOS x64 SEGFAULT) are treated as infra/flaky and do not block promotion. Three tiers exist because local-passing does not imply clean-environment-passing: a missing system header, a flag difference, or a locally-installed library can mask a real breakage.integratingis the staging gate;integratedis the confirmed-clean consumption tier.integrationcombines all[x]-marked branches frommixxx-devworktrees.
- Dev location: All individual branch development should be done using the
mixxx-devworktree directory - Integration edits:
mixxxcan have some edits for testing purposes, but should be kept minimal - Clean commits: A branch in
mixxx-devMUST have clean commits before first being linked with a GitHub PR - Stability: This dual setup SHOULD provide consistency for a stable bleeding-edge build without interference from local development.
- "Updating" the system: When the user asks to "update" or says the system has been updated, this MUST include all of the following post-update checks and tasks in order:
- Fetch
upstreamand check for new commits onupstream/main - Check all
[x]branches: for each, verify whether its commits are already present inupstream/main(git log upstream/main --oneline | grep <keyword>); if fully merged, move the entry to the "Merged to Upstream" section, remove the[x]marker, and record the merge date — do this BEFORE rebasing or rebuilding so merged branches are excluded from both - Rebase all non-merged worktree branches on new
upstream/main(stash any WIP first); skip branches identified as merged in step 2; clean any branches with INTEGRATION.md or other cruft commits. Rebasing does NOT push — use--push-changedexplicitly when PR branches need updating (e.g. after addressing review feedback, or to clear stale-bot) - Rebuild the
integrationbranch: mergeupstream/mainthen re-merge all[x]branches in order, resolving any conflicts - Build the integration branch (
CCACHE_BASEDIR=~/src/mixxx-dev/integration nice -n 15 cmake --build ~/src/mixxx-dev/integration/build --target mixxx -- -j$(nproc --ignore=2)) and verify it succeeds - All local tests must pass across ALL non-skipped worktrees. Run
--build-all-teststo configure cmake and build any missing binaries (also rebuilds stale ones), then--run-teststo confirm 0 failures. Both steps are done automatically by--full(or--full-promoteto also poll CI and promote in one command). Once clean, run--push-integratingto promoteintegration→origin/integrating. This triggers GA CI. 6b. Wait for GA CI onorigin/integrating. Theauto-promote.ymlworkflow fires automatically when CI completes — it checks each failed job againstKNOWN_INFRA_FAILURESand promotesintegrating→integratedif all failures are known infra/flaky (Flatpak, Windows checksum, macOS x64 SEGFAULT). If any failure is unknown, auto-promote blocks; investigate whether it is pre-existing onupstream/mainor integration-introduced, and add the job pattern toKNOWN_INFRA_FAILURES(in both the script andauto-promote.yml) only after confirming it is infra/flaky. For manual control,--promote-integratedpolls GA CI with per-job status reporting and promotes in one command;--full-promotechains steps 1–6b into a single command. - Check all open PRs for new review feedback (CHANGES_REQUESTED, new comments) and update INTEGRATION.md statuses accordingly
7b. If any PR branches have actual content changes (review feedback addressed, conflict resolutions), run
--push-changedto push only those branches whose patch differs from origin — pure rebases are skipped to conserve upstream CI resources - Update the "Last updated" timestamp and rebuild log entry in INTEGRATION.md, commit, and sync to Gist
- Fetch
- Merge process: The integration merge process MUST follow the steps in the Integration Merge Process section below.
- Rebase hygiene: All branches SHOULD be kept up-to-date and rebased with
mixxxdj/mixxxmain to minimize merge conflicts, except merged branches - Rebase first: A branch MUST be rebased as an initial step before any new change is made to said branch
- Incremental PRs: Changes to
mixxxdj/mixxxPRs MUST be incremental so as to be easy to review, and MUST NOT completely reformulate a system in a single commit. - Outline currency: The integration status outline MUST reflect the state of all branches, related issues, PRs, and dates, and MUST be updated after changes are committed — PR URLs SHOULD be checked first to catch new feedback
- Non-interactive git: Git operations MUST be non-interactive using
GIT_EDITOR=trueandGIT_PAGER=catto avoid vim/editor prompts - Issues: Most branches MAY have related upstream issues; related issues SHOULD be listed in the outline
- Sections: Feature and fix branches should be in the correct outline sections
- Secondary patches: Secondary patches are small fixes that either (a) resolve a residual problem that only became visible after a larger fix landed, or (b) are a prerequisite that a main fix branch depends on. They MUST be tracked in the Secondary Patches section of the outline, with a
Depends-onorResolves-residual-fromnote linking them to the related primary branch - Secondary patch upstream: A secondary patch SHOULD be submitted upstream independently if it stands alone; if it only makes sense in context of the primary fix, it MAY be folded into that PR
- Dates: Dates for branch creation, last PR comment, and last update MUST be recorded in the status outline
- Standalone branches: Each feature/fix branch SHOULD work standalone without depending on other local branches (except where noted)
- History: Feature/fix branch history MUST NOT be rewritten (no squash, no interactive rebase) without explicit permission from Milkii. "Complete" means the upstream PR has been merged or the branch has been deliberately closed. The integration branch MAY have merge commits.
- No cherry-pick: ALWAYS use
git mergeto bring branches into integration, NEVERgit cherry-pick— cherry-picking creates duplicate commits with different SHAs, severs the branch relationship, makes bisect/revert unreliable, and hides what is actually in the build fromgit log - Dependencies: Any fix or feature branch that relies on another local branch MUST be noted in the Branch Dependencies section
- Local-only: Some features (UTF-8 string controls) MUST NOT be submitted to
mixxxdj/mixxxupstream as they are local-only/personal use - PR flow: PRs SHOULD be submitted to
mxmilkiib/mixxx, and Milkii will create a further PR from there tomixxxdj/mixxx. - Merged cleanup: Once the PR is fully merged into
mixxxdj/mixxx, the branch entry MUST be moved to the "Merged to Upstream" section of the outline and its[x]marker removed, so it is excluded from future integration rebuilds. - Upstream-resolved cleanup: If an upstream commit (by any contributor) fully resolves the problem a local branch was addressing — rendering the local branch redundant or superseded — the branch entry MUST also be moved to the "Merged to Upstream" section and marked RESOLVED (not MERGED), with a note identifying the upstream commit or PR that resolved it. The worktree MUST then be pruned per the Worktree pruning rule.
- Upstream verification before closing: Before closing or marking a PR/branch as RESOLVED, the fix MUST be verified by reading the actual code in
upstream/mainandupstream/2.5—git show upstream/main:path/to/file.cpp | grep -A N "function". A verbal claim that the fix is upstream is NOT sufficient. If verification fails, do not close the PR. - Commit messages: Commit messages must not be too verbose, and should be concise and descriptive.
- Conflict resolution: When resolving merge conflicts — whether during rebases or integration merges — conflicts MUST be resolved and the operation continued non-interactively
- Code quality: Code quality MUST be verified before pushing — code should be proper, straight to the point, robust, and follow Mixxx coding style
- Push permission: Permission MUST be sought from the user before pushing commits to GitHub. Once the user has confirmed a push in a session, further pushes in that same session MAY proceed without asking again, to reduce friction.
- Worktree pruning: When a branch is merged upstream, closed, or abandoned, its worktree MUST be removed (
git worktree remove ~/src/mixxx-dev/<name>) and the local branch ref MAY be deleted. This keepsmixxx-dev/lean and preventsmixxx-milkii-integration-update-branches.shfrom wasting time on dead branches. - Schema exclusion: Branches that introduce database schema migrations MUST NOT be merged into the integration branch unless all schema-changing branches use compatible, non-conflicting revision numbers. Schema branches are tracked in a dedicated "Schema-Changing Branches" section of the outline.
- Local-only backup: All local-only branches MUST be pushed to
origin(mxmilkiib/mixxx) for off-machine backup, even if they will never be PRed upstream. All worktrees share a single.gitdirectory — losing it means losing every unpushed branch. - LOCAL_ONLY dependency chains: When rebasing branches that form a LOCAL_ONLY dependency chain, the dependency root MUST be rebased first, then each dependent in topological order. If the root bitrots or conflicts, all dependents are broken until the root is fixed.
- mixxx-milkii-integration-update-branches.sh: The script MUST exist as a committed file in the
integrationbranch and MUST be run from~/src/mixxx-dev/integration/. All${MIXXX_DEV}/*/loops in the script MUST guard with[[ "$name" =~ ^[0-9]{4}\. ]] || continueso promotion-chain worktrees (integration,integrating,integrated) — which lack theYYYY.date prefix — are never treated as feature branches. It MUST skip worktrees whose branches have been merged upstream, closed, or abandoned. - Test binary staleness: After any system library upgrade (e.g. protobuf, Qt, libstdc++), the
build/mixxx-testbinary in each worktree MUST be rebuilt before pushing — stale binaries will fail the pre-push hook with a dynamic linker error, not a test failure. Runldd <worktree>/build/mixxx-test | grep 'not found'to detect staleness without rebuilding. Usemixxx-milkii-integration-update-branches.sh --rebuild-teststo rebuild all stale test binaries serially. - Single-branch build: When the user asks to build a specific branch or worktree, ALWAYS build the full
mixxxexecutable (cmake --build <worktree>/build --target mixxx), NOT justmixxx-test. The test binary is built separately by the integration script; a user-requested build means they want a runnable binary. Build command:CCACHE_BASEDIR=~/src/mixxx-dev/<name> nice -n 15 cmake --build ~/src/mixxx-dev/<name>/build --target mixxx -j$(nproc --ignore=2). - Isolated test profiles: When running a worktree build for manual testing, use
--settingsPath /tmp/mixxx-test-<branch-name>to isolate config, library DB, and state from the main profile. Mixxx auto-creates the directory. Run:<worktree>/build/mixxx --settingsPath /tmp/mixxx-test-<branch-name>. Add--controller-debug --developerfor diagnostic logging. - Build type: All worktree builds MUST use
CMAKE_BUILD_TYPE=RelWithDebInfo. Debug builds abort onDEBUG_ASSERTcalls, causing tests to crash with non-zero exit that looks like a test failure (e.g.SoundSourceProxyTest.openEmptyFilefiringFileInfo::canonicalLocationassert). Release builds suppress the crash but lose debug symbols.RelWithDebInfois the correct balance. Check:grep CMAKE_BUILD_TYPE <worktree>/build/CMakeCache.txt. Reconfigure with:cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo <worktree>/build. - Test serialisation: Local tests MUST be run serially (
run_tests_serial), not in parallel. Multiple concurrentmixxx-testprocesses share the same audio device mocks, ControlObject registry, and SQLite test databases — parallel runs cause non-deterministic failures and resource exhaustion. Serial execution ensures reproducible results. Build compilation IS parallel within each worktree (-j$(nproc --ignore=2)) and configure steps are parallelised across worktrees. - Build parallelism: NEVER launch multiple full worktree builds simultaneously — 5 ×
-j$(nproc)on a 32-core machine means 150 competing jobs and effectively no progress. Worktree builds MUST be run serially using-j$(nproc --ignore=2). With ccache + CCACHE_BASEDIR correctly set, each subsequent build is mostly cache hits making serial runs fast. - Killing builds:
pkill -f cmakeonly kills the cmake wrapper — ninja/make/cc1plus children survive and saturate the CPU. To kill a full build tree:ps aux | grep -E 'cc1plus|ninja|/usr/bin/make' | grep -v grep | awk '{print $2}' | xargs -r kill -9. In the script, Ctrl-C triggers akill 0trap that kills the whole process group cleanly. - ccache: All worktree builds MUST be configured with
-DCCACHE_SUPPORT=ON. Cache size SHOULD be 15 GB or more. To enable on an existing build:cmake -DCCACHE_SUPPORT=ON <worktree>/build(in-place reconfigure).- Cross-worktree sharing requires
CCACHE_BASEDIR: worktrees are at different paths, so preprocessor#linemarkers embed different absolute paths in the hash. SettingCCACHE_BASEDIR=<worktree-root>at build time strips that prefix, making paths relative — identical upstream files then produce the same hash across worktrees. This is set automatically bymixxx-milkii-integration-update-branches.sh; manual builds MUST also set it:CCACHE_BASEDIR=~/src/mixxx-dev/<name> cmake --build .... hash_dir = falsein~/.config/ccache/ccache.confprevents the build directory path from entering the hash (complementary to CCACHE_BASEDIR). Both settings are needed for robust cross-worktree sharing.
- Cross-worktree sharing requires
- Skip list vs integration markers:
SKIP_BRANCHESinmixxx-milkii-integration-update-branches.shcovers only branches whose worktrees are removed, merged, or abandoned — these are skipped in ALL operations. LOCAL_ONLY and schema-excluded branches are NOT in SKIP_BRANCHES; they are still rebased and tested. They are excluded only from integration merges, tracked via[ ]vs[x]markers in the Branch Status Outline (manual step). - Upstream test filter scope: When filtering known-failing upstream tests, filter the ENTIRE affected test suite (e.g.
ControllerScriptEngineLegacyTimerTest.*) not just the specific failing cases. Individual tests in the suite that nominally pass can still corrupt shared QTimer/ControlObject state, causing unrelated downstream tests (e.g.MidiMappings/MappingTestFixture) to hang indefinitely. Root cause:coTimerId ControlPotmeter max=50clamps any QTimer ID > 50, producing collisions that prevent timer callbacks from firing. Filtering the entire suite prevents state poisoning. Remove when upstream fix lands. - Pre-push hook timeout: The hook runs
timeout 420 ./mixxx-testto prevent indefinite hangs. If the timeout fires, it reports the last test name and blocks the push. Investigate the hanging test by running it in isolation first (./mixxx-test --gtest_filter=SuiteName) — if it passes alone, it is a state-poisoning issue from a preceding test. - Monitoring progress:
mixxx-milkii-integration-update-branches.sh --full(or--full-promote) writes timestamped phase/branch updates toSTATUS_FILE=/tmp/mixxx-integration-status. In a second terminal:tail -f /tmp/mixxx-integration-status. Individual test suite logs:tail -f /tmp/mixxx-test-logs/<worktree>.log. During test runs, a heartbeat prints test count every 30 s to the main terminal so it never appears frozen. During CI polling (--promote-integratedor--full-promote), per-job status is printed with OK/FAIL/CXL/SKIP/.. icons each time a job state changes. - File edits: All file changes to tracked files MUST be made with the IDE's
edit/write_to_filetools (showing diffs in the editor), NEVER via shell commands (echo >,tee,sed -i, etc.) which bypass the diff view entirely. - Promotion currency:
integratedMUST NOT lag behind a passingintegrating. Promotion is now automated via theauto-promote.ymlworkflow — whendevelop.ymlCI completes onintegrating, it checks job results and promotes automatically if all failures are known infra. At the start of any session, verify promotion is working:gh run list --workflow auto-promote.yml --repo mxmilkiib/mixxx --limit 1 --json status,conclusion. If auto-promote failed or was blocked by an unknown failure, investigate and manually run--promote-integratedafter confirming the failure is infra. Lettingintegratedsit stale means the Manjaro release pipeline is packaging an out-of-date build. - Branch tier semantics:
integration≠integrating≠integrated. These are three distinct promotion gates, not aliases:integrationis a working scratchpad — never guaranteed to build or pass tests.integratingis locally-tested-clean — every non-skipped worktree passed its test suite with 0 failures. This is NOT CI-confirmed.integratedis CI-confirmed-clean — GA confirmedorigin/integratingpassed all platform checks. No dedicated worktree; the ref is updated remotely by the script. The Manjaro release pipeline fires on pushes to this branch.integrated≠ "guaranteed to build everywhere" — CI may still filter some known-upstream test failures viaKNOWN_FAILING, and known infra/flaky CI jobs viaKNOWN_INFRA_FAILURESin the script. Its guarantee is: locally clean + GA Linux/macOS/Windows builds passed.
- Test binary completeness: Before
--push-integratingcan succeed, ALL non-skipped worktree branches MUST have abuild/mixxx-testbinary AND each must have a per-branch passing sentinel for its current HEAD.--fulluses--build-all-testswhich: (1) launches all cmake configures in parallel (configure is I/O-bound; 16 configures take ~5s instead of ~70s serial), then (2) buildsmixxx-testserially with-j(nproc-2), then (3) prints accache -ssummary. Standalone:--build-all-teststhen--run-tests. The script lists all blocking branches when--push-integratingis blocked.--rebuild-testsstill exists but only handles stale binaries (ldd-detected) — it does NOT configure unconfigured branches. - Per-branch test status: Each active branch entry in this document SHOULD carry a
Test binary:field with one of:[no-build],[build-only],[test-pass YYYY-MM-DD],[test-fail YYYY-MM-DD]. This is updated manually after each--run-testsrun. The field reflects the LAST KNOWN state; the script is authoritative for the current live state. - CI-conscious pushing: Feature branch force-pushes to
origintrigger full CI matrix onmixxxdj/mixxx. A pure rebase (same patch, different base) has zero CI value — it wastes shared runner time and annoys reviewers who monitor PR activity.rebase_all()no longer pushes; use--push-changedto push only branches whosegit diff upstream/main..HEADdiffers fromgit diff upstream/main..origin/<branch>. Manual pushes (e.g. after addressing review feedback) bypass this — push directly from the worktree as needed. - Per-branch test sentinel: After each test run,
run_tests_serialwrites~/.cache/mixxx-integration/<name>.testedcontaining<branch-HEAD-SHA> pass|fail. Sentinels survive reboots (unlike/tmp/).run_tests_serialis selective: branches whose sentinel matches their current HEAD SHA and status ispassare skipped, so re-runs after a single branch rebase only re-test that branch (~3 min vs ~65 min).push_integratingGate 2 checks each branch's sentinel individually — reports exactly which branches need attention. A global summary sentinel is also written to~/.cache/mixxx-integration/tests-passedfor auditing. Invalidation is automatic: when a branch rebases its HEAD SHA changes, making the sentinel stale. - Manjaro release pipeline:
.github/workflows/manjaro-release.ymlis a release-packaging workflow distinct from thebuild.ymlCI matrix — it produces an installable Manjaro/Arch package from the CI-confirmedintegratedbranch and publishes it as a pre-release GitHub Release onmxmilkiib/mixxx. See the Manjaro/Arch Release Pipeline section for full details. - Auto-promote:
.github/workflows/auto-promote.ymlfires viaworkflow_runwhen thedevelop.ymlCI ("Pull request or branch build") completes onintegrating. It fetches the run's job results, checks each failure againstKNOWN_INFRA_FAILURES(same patterns as the script), and if all failures are known infra/flaky (or the run passed cleanly), promotesintegrating→integratedviagh apiref update. This eliminates the need to manually run--promote-integratedafter CI completes. The workflow MUST exist on the default branch (integrated) forworkflow_runto fire — this is why the fork's default branch was changed frommaintointegrated. - Default branch: The fork's default branch is
integrated(changed frommainviagh api repos/mxmilkiib/mixxx -X PATCH --field default_branch=integrated). This is required becauseworkflow_runtriggers only fire for workflows defined on the default branch.mainremains a read-only mirror ofupstream/mainbut is no longer the default.
CRITICAL: mixxx-dev/ worktrees MUST only contain commits belonging to their named feature.
- NEVER commit INTEGRATION.md, integration merge commits, or unrelated fixups into a fix or feature worktree
- INTEGRATION.md MUST NOT be committed to any feature branch in
mixxx-dev/ - Before making any edit in
mixxx-dev/, confirm the active worktree matches the intended branch:git -C ~/src/mixxx-dev/<worktree>/ branch --show-current
- To verify a worktree is clean (only its own commits ahead of upstream/main):
git -C ~/src/mixxx-dev/<worktree>/ log --oneline upstream/main..HEAD
- If a worktree has accumulated cruft, reset it:
- No real feature commits yet:
git reset --hard upstream/main - Has real commits mixed with cruft: rebase only the feature commits onto upstream/main, then force-update the branch ref
- No real feature commits yet:
- ALWAYS create new feature branches from
upstream/main, never from localmain— defence-in-depth: ifmainever accumulates stray commits (violating Main read-only), branching fromupstream/mainguarantees a clean base:git fetch upstream git worktree add ~/src/mixxx-dev/<name> -b feature/<branch-name> upstream/main
- Before committing WIP in any worktree, verify the branch is correct AND that the diff contains only changes belonging to that feature:
git -C ~/src/mixxx-dev/<worktree>/ diff --stat git -C ~/src/mixxx-dev/<worktree>/ branch --show-current
- If WIP from another feature is present in a worktree, stash it before committing:
git -C ~/src/mixxx-dev/<worktree>/ stash push --include-untracked -m "<description of what it is and where it belongs>"
- Before opening or updating a PR, verify the branch contains only its own commits relative to
upstream/main(not localmain):git log --oneline feature/<branch-name> --not upstream/main
| Path | Purpose |
|---|---|
~/src/mixxx/ |
Worktree checked out on main — synced with mixxxdj/mixxx main |
~/src/mixxx-dev/ |
Worktrees: integration/ (script base) + individual feature/fix branches |
Branch promotion chain (all branches live in the single shared .git at ~/src/mixxx/):
integration →[all worktrees pass --run-tests]→ integrating →[GA CI green]→ integrated
(working, may break) (locally clean) (CI-confirmed)
utf8-string-controls (LOCAL_ONLY)
├── hotcue-labelling (LOCAL_ONLY)
└── hotcue-label-options (LOCAL_ONLY)
Branches with dependencies on local-only branches cannot be submitted upstream as-is. They MUST be refactored to remove the dependency or the dependency MUST be upstreamed first.
Some active branches modify the same source files. The script merges branches in worktree directory order (alphabetical by date prefix), which happens to be correct for these overlaps. If the order is ever changed, the following dependencies MUST be respected:
src/waveform/renderers/waveformoverviewrenderer.cpp and .h — 3 branches touch these:
2025.10oct.20-hotcues-on-overview-waveform(adds hotcue rendering to overview)2025.10oct.21-stacked-overview-waveform(adds StackedRGB enum + renderer)2026.02feb.20-simple-waveform-top-and-overview(adds Simple overview type)
Each builds on the previous — merging out of order will cause conflict resolutions that silently drop changes.
src/preferences/dialog/dlgprefwaveform.cpp — 4 branches touch this:
2025.10oct.21-stacked-overview-waveform(adds Stacked to combobox)2026.02feb.20-simple-waveform-top-and-overview(adds Simple to top of combobox)2026.02feb.26-waveform-menu-order(reorders combobox via kValues, removes sort lambda)2026.05may.03-extend-waveform-zoom-range(extends zoom range entries)
waveform-menu-order MUST merge after simple-waveform — it removes the sort lambda that simple-waveform relies on being absent. The current alphabetical order satisfies this.
src/library/library.cpp, src/library/sidebarmodel.cpp, src/library/sidebarmodel.h — only restore-last-library-selection touches these. No ordering concern, but if the branch is rewritten after being merged into integration, the next --full rebuild may resolve merge conflicts in favour of the stale already-merged version. After rewriting a branch, re-merge it manually into integration before running --full.
Summary: 7 CHANGES_ADDRESSED, 9 REVIEW_REQUIRED, 2 schema-excluded, 9 merged/resolved upstream, 4 local-only, 2 secondary patches, 1 archived, 1 build-broken
- 🔴 Awaiting Review from Others
- feature/2025.11nov.04-controller-wizard-quick-access - #15577 - CHANGES_ADDRESSED
- Issue: #12262
- Created: 2025-11-04, Last comment: 2026-02-18, Rebased: 2026-08-08, Updated: 2026-02-22
- Note: rebased with wmainmenubar.cpp/h conflict resolved (Controller+KeyboardEventFilter both included)
- Next: Awaiting re-review — ronso0 CHANGES_REQUESTED (Nov 16) addressed Feb 18; fix-learning-wizard folded in Feb 22 (ffc28f8)
- Specifics:
devicesChanged not updating menu post-startupfixed — connected to mappingAppliedrange-for style on m_controllerPagesdone- fix-learning-wizard folded in: emit mappingStarted() before show() so prefs dialog hides before wizard appears
- Tested?: yes
- feature/2025.10oct.21-stacked-overview-waveform - #15516 - DRAFT - CHANGES_ADDRESSED
- Issue: #13265
- Created: 2025-10-21, Last comment: 2026-02-22 (mxmilkiib), Rebased: 2026-08-08, Updated: 2026-02-18
- Next: Stale bot fired (Feb 22); our naming comment (Feb 17) + clarification (Feb 22) are latest — re-request review to unstale; no new reviewer feedback
- Specifics:
Remove redundant Stacked HSV and Stacked LMH renderersdoneRemove unnecessary static_castdoneRename "Stacked (RGB)" to "Stacked"done- All feedback addressed
- Left comment 2026-02-17 re: Filtered/Stacked naming confusion — see #15996
- Tested?: yes
- feature/2025.10oct.20-restore-last-library-selection - #15460 - DRAFT - CHANGES_ADDRESSED
- Issue: #10125
- Created: 2025-10-08, Last comment: 2026-08-08 (mxmilkiib), Rebased: 2026-08-08, Updated: 2026-08-08
- Next: Redone as two commits, confirmed working — awaiting re-review; mxmilkiib left update comment 2026-08-08
- Specifics:
Separate commits for changesdone - 4 commits with explanationsStore selection with debounced savesdone - 3 second debounce timerUse VERIFY_OR_DEBUG_ASSERTdoneRoot node crash in saveSelectionToConfigfixedscheduleSelectionSave never called from clicked()fixedDataRole mismatch in restoreLastSelectionfixed — uses Qt::DisplayRoleactivateDefaultSelection overwriting restorefixed — conditional fallbackFeature not activated on restorefixed — activate()/activateChild() called- Track row selection save/restore added via WTrackTableView
- Tested?: yes
- feature/2025.11nov.05-hide-unenabled-controllers - #15580 - CHANGES_ADDRESSED
- Issue: #14275
- Created: 2025-11-05, Last comment: 2025-11-17 (ronso0), Rebased: 2026-08-08, Updated: 2026-02-28
- Next: Awaiting re-review — ronso0 Nov 17 feedback addressed Feb 28: removed redundant null checks, confirmed rename already done
- Specifics:
Rename "unenabled" to "disabled" everywhere — config keys, function names, and UI text (ronso0)doneRemove unnecessary null checks on tree items — always valid post-construction (ronso0)done
- Tested?: yes
- feature/2025.11nov.04-controller-wizard-quick-access - #15577 - CHANGES_ADDRESSED
- 🔧 Secondary Patches
- bugfix/2026.05may.01-fix-timer-test-potmeter-clamping — upstream test bug
- Created: 2026-05-01, Rebased: 2026-08-08
- coTimerId ControlPotmeter max=50 clamped QTimer IDs (10000+ in full suite); replaced with ControlObject
- Next: open upstream PR to mixxxdj/mixxx
- Workaround: pre-push hook and script filter
ControllerScriptEngineLegacyTimerTest.*(entire suite —beginTimer_repeatedTimercorrupts clamped-ID-50 state, causingMidiMappingsJS tests to hang; filtering onlysingleShot*is insufficient) andTrackMetadataExportTest.keepWithespaceKey(getKeyText()returnsB_FLAT_MINORinternal string instead ofB♭mdisplay format, fails in all worktrees). Remove filters once upstream fix lands.
- bugfix/2026.02feb.21-hid-init-race-on-enumeration
- Created: 2026-02-21, Rebased: 2026-08-08, Updated: 2026-08-05
- Note: originally tracked as residual from midi-makeinputhandler (#16003, merged upstream 2026-06-18) — stands alone
- PR: #16838 — REVIEW_REQUIRED, opened 2026-08-04
- Next: Await review on #16838
- Merged into integration: 2026-08-05 (mutex fix merged — conflict in hidenumerator.cpp comment resolved)
- Specifics:
- The hidraw backend of hidapi is not thread-safe;
hid_open()/hid_open_path()internally callhid_enumerate()→udev_enumerate_scan_devices() - Upstream PR #15692 (Joerg,
loadHidReportDescriptorAtEnumeration2) made eachHidControllerconstructor spawn aQtConcurrent::runbackground thread infetchReportDescriptorInBackground()that callshid_open* - With 3+ HID devices (Launchpad Pro MK3, MPD218, BeatMix4) those background threads race inside udev, corrupting the heap — manifests as
free(): chunks in smallbin corruptedfrom an unrelatedfree()later (e.g. library scannerRecursiveScanDirectoryTaskdestructor) - Fix part 1: call
hid_init()explicitly on the main thread inHidEnumerator::queryDevices()beforehid_enumerate()and before anyHidControllerobjects are constructed - Fix part 2 (added 2026-08-05): guard the
hid_open*calls infetchReportDescriptorInBackground()with a globalstd::mutex s_hidOpenMutexso only one background fetch thread touches udev at a time —hid_init()alone was insufficient
- The hidraw backend of hidapi is not thread-safe;
- Tested?: yes (crash no longer reproduced; library scan completes cleanly, 33091 tracks)
- bugfix/2026.05may.01-fix-timer-test-potmeter-clamping — upstream test bug
- 🐛 BUG FIXES - Open PRs (REVIEW_REQUIRED)
- bugfix/2026.02feb.19-textured-waveform-fbo-resize - #16010 - REVIEW_REQUIRED
- Created: 2026-02-19, Last comment: none, Rebased: 2026-08-08, Updated: 2026-02-19
- Next: Await review
- Specifics:
- Improved: defer FBO reallocation to paintGL via m_pendingResize flag
- Tested?: yes
- bugfix/2026.02feb.19-openglwindow-resize-repaint - #16012 - DRAFT - REVIEW_REQUIRED
- Created: 2026-02-19, Last comment: none, Rebased: 2026-08-08, Updated: 2026-02-19
- Next: Await review
- Specifics:
- Restores m_dirty flag: defers extra paintGL+swapBuffers from resizeGL to next vsync
- Does not fix Wayland resize lag (compositor-level issue)
- Tested?: yes
- bugfix/2026.02feb.19-wayland-opengl-resize-warning - #16014 - CHANGES_ADDRESSED
- Issue: #16013, related #13814
- Created: 2026-02-19, Last comment: 2026-08-03 (daschuer), Rebased: 2026-08-03, Updated: 2026-08-03
- Next: Await review — rebased onto 2.6 per daschuer, daschuer CHANGES_REQUESTED addressed 2026-08-03, marked ready for review
- Note: NOT in integration merges — branch now targets upstream/2.6, merging into main-based integration would drag in the 2.6↔main delta
- Specifics:
- Wayland + QOpenGLWindow subsurface resize causes synchronous compositor buffer realloc on every pixel of drag
- Workaround: QT_QPA_PLATFORM=xcb (XWayland)
- Adds qWarning at startup when Wayland detected with OpenGL waveforms and spinny widgets
- Warning fires once per session (static flag), not per OpenGLWindow construction
- Detection uses
startsWith("wayland")to cover Qt5 variants (wayland-egl, wayland-generic, wayland-xcomposite-egl, wayland-xcomposite-glx) - MIXXX_USE_QOPENGL guard removed per daschuer — getSurfaceFormat callers are already GL-gated
- References issues #16013 (slow resize), #14492 (sticky mouse on waveform) and #13814 (resize mouse defocus, GLSL types)
- Tested?: yes (1174 tests pass on 2.6 base, 2026-08-03; stale pre-rebase mixxx-test binary was hanging the pre-push hook — rebuilt)
- bugfix/2026.02feb.19-textured-waveform-fbo-resize - #16010 - REVIEW_REQUIRED
- 🟡 NEW FEATURES - Open PRs (REVIEW_REQUIRED)
- feature/2026.05may.03-extend-waveform-zoom-range — No PR yet
- Created: 2026-05-03, Rebased: 2026-08-08, Updated: 2026-05-03
- Next: Test, then open upstream PR
- Specifics:
- Extends
s_waveformMinZoomfrom 1.0 → 0.5 (allows 200% zoom-in, twice as detailed) - Extends
s_waveformMaxZoomfrom 10.0 → 80.0 (allows 1.25% zoom-out, 8× more overview) - Fixes
DlgPrefWaveformcombo box to handle sub-1.0 zoom entries without integer cast div-by-zero - Index↔zoom mapping generalised via
subOneCountoffset
- Extends
- Tested?: no
- feature/2026.02feb.26-waveform-menu-order - #16046 - CHANGES_ADDRESSED
- Created: 2026-02-26, Last comment: 2026-05-26 (daschuer), Rebased: 2026-08-08, Updated: 2026-07-16
- Next: Await re-review — addressed daschuer: removed lambda + alphabetical sort; order now set via
kValuesinwaveformwidgettype.h - Specifics:
- Reorders
kValuesinWaveformWidgetType: Simple, Filtered, HSV, RGB, Stacked, VSyncTest - Removes alphabetical combobox sort from
DlgPrefWaveform— factory order is display order - Old: Simple, Filtered, HSV, VSyncTest, RGB, Stacked → New: Simple, Filtered, HSV, RGB, Stacked, VSyncTest
- Reorders
- Tested?: yes (1203 tests pass)
- feature/2026.02feb.20-simple-waveform-top-and-overview - #16021 - REVIEW_REQUIRED
- Issue: #16020
- Created: 2026-02-20, Last comment: 2026-05-28 (mxmilkiib, stale-bot reset), Rebased: 2026-08-08, Updated: 2026-07-16
- Next: Address daschuer upgrade-path issue — RGB selected before update becomes Simple after; default should remain RGB; likely combobox position stored instead of enum value
- Specifics:
- Adds Simple as an overview waveform type (amplitude envelope, signal color, stereo mirrored)
- Moves Simple to top of overview waveform combobox
- daschuer CHANGES_REQUESTED: upgrade path alters waveform selection — RGB becomes Simple after update
- ninomp inline: unused StackedRGB enum entry — mxmilkiib confirmed cruft from branch overlap
- Tested?: yes (2026-07-16)
- feature/2025.10oct.21-replace-libmodplug-with-libopenmpt - #15519 - DRAFT - REVIEW_REQUIRED
- Issue: #9862
- Created: 2025-10-25, Last comment: 2026-02-22 (stale-bot), Rebased: 2026-08-08, Updated: 2026-01-30
- Next: Address daschuer architecture feedback
- Specifics:
- DSP in SoundSource is "foreign to Mixxx" — daschuer wants bit-perfect decode, move DSP to effect rack instead
- Rename constants to
kXBassBufferSizestyle naming (daschuer) - Remove VS Code minimap
// MARK:comments - Review comments on
trackerdsp.cppandtrackerdsp.h - Windows CI test failure (
screenWillSentRawDataIfConfiguredtimeout) — may be flaky or platform-specificQImagebehavior - Test fix 2026-02-19:
taglibStringToEnumFileTypenow excludes all openmpt tracker formats (mod, s3m, xm, it, mptm, 669, amf, ams, dbm, dmf, dsm, far, mdl, med, mtm, mt2, psm, ptm, ult, umx) — none are taglib formats
- Tested?: no
- feature/2025.10oct.20-hotcues-on-overview-waveform - #15514 - DRAFT - REVIEW_REQUIRED
- Issue: #14994
- Created: 2025-10-20, Last comment: 2026-02-22 (stale-bot), Rebased: 2026-08-08, Updated: 2026-01-30
- Next: Check recent comment, await review
- Specifics:
- PR marked stale (Jan 19 2026) — needs activity to unstale
- Paint hotcues on scaled image (option b) not full-width — scaling happens in OverviewCache so fixed pixel widths don't translate
- Remove
// MARK:comments - Get cue data from delegate columns instead of SQL queries (done)
- Review feedback from ronso0 on marker rendering approach
- Tested?: no
- feature/2025.11nov.17-deere-channel-mute-buttons - #15624 - DRAFT - REVIEW_REQUIRED
- Issue: #15623
- Created: 2025-11-17, Last comment: 2026-02-15, Rebased: 2026-08-08, Updated: 2026-02-15
- Next: On hold - marked as DRAFT by ronso0
- Specifics:
- Marked as DRAFT by ronso0 (Feb 9)
- daschuer (Feb 9): "mute this PR until we have demand and good plan for this turntableist feature"
- Needs visual feedback for mute state in Mixxx
- daschuer suggests "unmute by cue" is more accurate term than "silent cue"
- ronso0 questions necessity — "Why is the Vol fader not sufficient?"
- daschuer suggests broader approach: knob widget with integrated kill/mute feature, explore Tremolo effect for "Transformer" effect
- Needs stronger justification or pivot to the broader knob-with-kill approach
- Tested?: yes
- feature/2025.11nov.16-playback-position-control - #15617 - CHANGES_ADDRESSED
- Issue: #14288
- Created: 2025-11-16, Last comment: 2026-05-26 (mxmilkiib), Rebased: 2026-08-08, Updated: 2026-07-16
- Next: Await re-review — all ronso0 CHANGES_REQUESTED addressed 2026-05-26; CI failures are pre-existing flaky (Flatpak aarch64 network timeout, macOS x64 BeatsTranslateTest SEGFAULT — unrelated to our changes)
- Specifics:
- daschuer (Feb 9): "this feature already exists" (pref option) — clarified: pref has no CO for runtime control
- ronso0 confirmed: if it's about changing marker pos on the fly, the pref option has no CO
- Adds
[Waveform],PlayMarkerPositionControlPotmeter (0.0–1.0) for runtime control
- Tested?: no
- feature/2025.11nov.05-deere-waveform-zoom-deck-colors - #16874 - REVIEW_REQUIRED
- Created: 2025-11-05, Rebased: 2026-08-10, Updated: 2026-08-10
- Next: Await review
- Specifics:
- Sets WaveformZoomContainer background to DeckBackgroundColor (was hardcoded #333333)
- Changes zoom button icon fills from #d2d2d2 to #000000 for visibility on deck-colored background
- Removes hardcoded background-color from style.qss (now set via XML BgColor)
- Deere-only change, 5 files, 4 insertions / 4 deletions
- Tested?: yes (2026-08-10)
- feature/2026.05may.03-extend-waveform-zoom-range — No PR yet
⚠️ Schema-Changing Branches (Excluded from Integration)- feature/2025.10oct.17-library-column-hotcue-count - #15462 - REVIEW_REQUIRED
- Issue: #15461
- Created: 2025-10-17, Last comment: 2026-02-22 (stale-bot), Rebased: 2026-08-08, Updated: 2026-01-30
- Next: Check recent comment, await review
- Specifics:
- PR marked stale (Jan 17 2026) — needs activity to unstale
- Broad discussion about whether hotcue count column is the right approach vs a "prepared" state flag (daschuer, ronso0)
- Potential pie chart icon instead of plain number (daschuer suggestion)
- Related to hotcues-on-overview-waveform PR #15514 (acolombier suggested rendering hotcues in overview column instead)
- Schema change v39→v40 — will conflict with other schema changes
- Removed from integration: cross-thread SQLite crash (Qt::DirectConnection cuesUpdated lambda runs updateTrackHotcueCount on engine thread)
- Crash fixed in branch: cuesUpdated now uses AutoConnection + DB-counting overload; CueDAO::updateTrackHotcueCount(TrackId) made public
- Tested?: no
- feature/2025.11nov.16-catalogue-number-column - #15616 - REVIEW_REQUIRED
- Issue: #12583
- Created: 2025-11-16, Last comment: 2026-02-15, Rebased: 2026-08-08, Updated: 2026-02-15
- Next: Await review
- Specifics:
- acolombier left review comment 2026-02-14; replied 2026-02-15
- Schema migration revision 40 — will conflict with hotcue-count branch (also schema change)
- Removed from integration: schema change; keeping integration at upstream schema v40 until schema branches are stable
- Uses MusicBrainz Picard tag mapping conventions
- Tested?: no
- feature/2025.10oct.17-library-column-hotcue-count - #15462 - REVIEW_REQUIRED
- 🔵 Local Only (No PR)
- feature/2026.02feb.17-mono-waveform-option — SKIP_BRANCHES (build-broken)
- Created: 2026-02-17, Rebased: 2026-08-03, Updated: 2026-02-17
- Test binary: [build-fail 2026-05-13]
- Next: Fix base class — add
MonoSignaltoWaveformRendererSignalBase::Optionenum and storem_optionsas protected member; both were expected by the branch but never committed or were lost in rebase - Specifics:
waveformrendererfiltered.cppandwaveformrendererhsv.cppreferencem_options(line 89/90) andOption::MonoSignal— neither declared anywhere in the current base class- Base class
WaveformRendererSignalBaseOption enum only has:None,SplitStereoSignal,HighDetail,AllOptionsCombined - Fix: add
MonoSignal = 0b100to Option enum, storem_optionsin protected block, handle in both .cpp files
- feature/2025.10oct.14-waveform-hotcue-label-options
- Created: 2025-10-14, Rebased: 2026-08-08, Updated: 2026-01-30
- Next: Maintain for personal use
- feature/2025.10oct.08-utf8-string-controls
- Dependency for: hotcue-labelling, hotcue-label-options
- Created: 2025-10-08, Rebased: 2026-08-08, Updated: 2026-01-30
- Next: Maintain for personal use (not for upstream)
- feature/2025.09sep.25-hotcue-labelling
- Created: 2025-09-25, Rebased: 2026-08-08, Updated: 2026-02-20
- Next: Maintain for personal use
- draft/2025.10oct.21-tracker-module-stems — ARCHIVED
- Created: 2025-10-21, Rebased: 2026-08-03, Updated: 2026-08-10, Archived: 2026-08-10
- Test binary: [build-fail 2026-05-13]
- Next: Archived —
openmpt::module::set_channel_mute_statusis absent from the stable C++ API (verified against libopenmpt 0.8.6); no alternative mute/channel-render method found. Depends on replace-libmodplug-with-libopenmpt (#15519) being accepted first. Worktree removed.
- feature/2025.02feb.17-waveform-blend-customization — LOCAL_ONLY — not in integration (branch name year typo: should be 2026)
- Created: 2026-02-17, Rebased: 2026-08-08 (empty — no commits), Updated: unknown
- Note: untracked worktree in mixxx-dev; branch has zero commits; placeholder or lost work
- Next: Decide whether to populate, repurpose, or remove worktree
- bugfix/2026.02feb.19-wglwidget-xcb-resize-gap — ABANDONED
- Created: 2026-02-19, Updated: 2026-02-19
- Next: Archive or delete branch
- Specifics:
- Attempted WA_PaintOnScreen on WGLWidget to reduce XCB resize gap
- Abandoned: WGLWidget lacks paintEngine(), WA_PaintOnScreen causes heap corruption abort
- Gap is inherent to QOpenGLWindow+createWindowContainer; no viable fix
- feature/2026.02feb.17-mono-waveform-option — SKIP_BRANCHES (build-broken)
- ✅ Merged to Upstream
-
bugfix/2026.02feb.20-fix-learning-wizard-from-prefs-button- #16018 CLOSED 2026-02-28 — fix folded into #15577 (commit ffc28f8); bug only manifested in context of wizard menu changes; not a standalone upstream issue -
bugfix/2026.02feb.18-midi-makeinputhandler-null-engine- #16003 MERGED 2026-06-18 — daschuer APPROVED; merged upstream (PR base 2.5); worktree removed 2026-06-18 -
feature/2025.06jun.08-deere-deck-bg-colourMERGED — commitcca2285b36in upstream/main (change deck bg to subtle shade of deck colour, landed with Deere stems work); worktree removed 2026-05-11 -
feature/2025.05may.14-fivefourths- #16026 MERGED 2026-03-11 — merged upstream as Swarnadip-Kar's PR with fourfifths + BPM lock -
bugfix/2026.02feb.20-controlpickermenu-quickfx-deck-offset- #16019 MERGED 2026-03-11 — ronso0's fix merged to main -
bugfix/qt6-guiprivate-missing-componentRESOLVED 2026-02-19 — fixed upstream, branch deleted -
feature/2025.11nov.05-waveform-cache-size-format- #15578 MERGED 2026-02-16 -
bugfix/2025.11nov.04-reloop-shift-jog-seek- #15575 MERGED 2026-02-15 -
bugfix/2025.11nov.16-reloop-beatmix-mk2-naming- #15615 MERGED 2026-02-11 -
bugfix/2025.11nov.04-fx-routing-persistence- #15574 MERGED 2025-11-14
-
- Integration rebuilt 2026-02-19: applied waveform FBO + openglwindow resize fixes; fixed hotcue-labelling merge (missing setLabel/slotHotcueLabelChangeRequest); merged midi-makeinputhandler-null-engine bugfix (was missing, caused SIGSEGV/SIGABRT on controller shutdown)
- Integration rebuilt 2026-02-19 (second time): removed hotcue-count and catalogue-number branches — both require schema changes (v41, v42) that caused a cross-thread SQLite crash (SIGSEGV in BaseTrackCache::updateIndexWithQuery via Qt::DirectConnection on engine thread). Schema kept at upstream v40.
- Integration patched 2026-02-19: midi-makeinputhandler-null-engine fix was missing from the rebuild — caused repeated SIGSEGV/SIGABRT on controller shutdown (MidiControllerJSProxy::makeInputHandler null shared_ptr). Re-merged.
- Wayland root cause identified 2026-02-19: QOpenGLWindow subsurface resize blocks on compositor buffer realloc; workaround QT_QPA_PLATFORM=xcb
- XCB resize gap 2026-02-19: WA_PaintOnScreen approach abandoned — WGLWidget lacks paintEngine(), causes heap corruption abort; gap is inherent to QOpenGLWindow+createWindowContainer
- Integration updated 2026-02-20: added controlpickermenu-quickfx-deck-offset (#16019), fix-learning-wizard-from-prefs-button; fixed hotcue-labelling missing setLabel/slotHotcueLabelChangeRequest; build clean
- Integration updated 2026-02-21: merged simple-waveform-top-and-overview (Simple to top of main waveform list; Simple overview type)
- Integration updated 2026-02-21 (2): added Layered (LMH tail-to-tail) and Stems (stem channels) as main waveform types; build clean
- Integration updated 2026-02-21 (3): added CQT spectrogram main waveform type (frequency-band heatmap, showcqt-style hue mapping); build clean
- Integration updated 2026-02-21 (4): added Layered RGB (RGB colours, tail-to-tail); fixed CQT missing from mixxx-lib CMake target; build clean
- Integration patched 2026-02-21 (5): added hid-init-race-on-enumeration secondary patch (explicit hid_init() before hid_enumerate prevents concurrent re-init crash from background descriptor fetch threads); WaveformRendererCQT zero visualIncrementPerPixel guard
- Integration rebuilt 2026-02-28: rebased all branches on upstream/main (new upstream commits include stems model crash fix, MK2 LUT fixes, ringbuffer memory leak fix); resolved merge conflicts in waveformoverviewrenderer.cpp (StackedRGB vs Simple waveform ordering); added missing m_options member variables to waveformrendererfiltered.cpp and waveformrendererhsv.cpp; build clean
- Integration patched 2026-02-23: re-merged controller-wizard-quick-access (clazy range-loop-detach fix — std::as_const on all range-for loops over Qt containers); build clean
- Integration rebuilt 2026-03-11: rebased all branches on upstream/main (198 new upstream commits: fivefourths/fourfifths merged upstream as #16026, rating controls #15764, tuning field, BPM lock, key comparison effect, TS definitions); fivefourths and controlpickermenu-quickfx-deck-offset moved to Merged to Upstream; added waveform-menu-order (#16046); resolved conflicts in overviewtype.h + waveformoverviewrenderer.cpp/h + woverview.cpp (StackedRGB+Simple coexistence), dlgprefwaveform.cpp (moveWaveformTypeToIndex), cuecontrol.cpp/h (setLabel+slotHotcueLabelChangeRequest), dlgprefcontroller.h (showLearningWizard); build clean
- Integration rebuilt 2026-05-01: rebased all branches on upstream/main (349 new upstream commits: kbd-mapping-reload, sidebar expand-on-hover, Parser public method, overview leaveEvent fix, cue button DnD fixup, bulk controller async polling, pref sound stretch column, export loops to Engine DJ, QML enhanced settings, SQLite3 link fix); resolved conflicts in cuecontrol.cpp/h (setLabel+slotHotcueLabelChangeRequest), wmainmenubar.cpp/h (KeyboardEventFilter+Controller coexistence), dlgprefcontroller.h (showLearningWizard), waveformoverviewrenderer.cpp/h+woverview.cpp+overviewtype.h (StackedRGB+Simple coexistence), dlgprefwaveform.cpp (moveWaveformTypeToIndex lambda); build clean
- Integration updated 2026-05-11: merged upstream/main (13 new commits: Algoriddim djay support, Android output type name fix, beats preferences fix, 2.6 sync); resolved wmainmenubar.cpp/h conflict in controller-wizard-quick-access (KeyboardEventFilter+Controller coexistence); stripped cross-contamination commit from waveform-menu-order ("Add Simple overview waveform type" was a duplicate from simple-waveform branch); system protobuf upgraded v33→v34, stale test binaries block pre-push hook (not a code issue); feature branch pushes for controller-wizard and waveform-menu-order deferred pending test binary rebuild
- Integration updated 2026-05-26: rebased all 21 active branches on upstream/main; all test binaries up to date; 21/21 tests pass; integration + integrating pushed; GA CI triggered on origin/integrating
- Integration initiated 2026-06-18: 182 new upstream commits (SoundManager refactor, cmake4 fix, BPM-lock crash fix, non-latin char SoundSource test, FLAC recording fix, instantaneous-frequency detector, LateNightQML colour schemes + QML fixes, shout API warnings, library header assert crash fix); #16003 (midi-makeinputhandler-null-engine) merged upstream — moved to Merged to Upstream, worktree removed; simple-waveform-top-and-overview sentinel stale (updated 2026-05-28/29, needs re-test)
- Integration updated 2026-06-18: taglib 1.x→2.x system upgrade required full cmake cache wipe (CMakeCache.txt + libdjinterop ExternalProject stamp dirs) and Ninja reconfigure across all 21 worktrees; 21/21 rebuilt clean against taglib 2.3; 21/21 tests pass; integrating pushed (d4ac90d11b); GA CI queued
- Integration rebuilt 2026-07-16: rebased all 21 active branches on upstream/main; integration branch rebuilt from scratch (reset to upstream/main, merged all 20 [x] branches in order); resolved conflicts in overviewtype.h + waveformoverviewrenderer.cpp/h + woverview.cpp (StackedRGB+Simple coexistence), dlgprefwaveform.cpp (redundant sort+move code from simple-waveform dropped — waveform-menu-order already handles ordering), cuecontrol.cpp/h (setLabel+slotHotcueLabelChangeRequest), dlgprefcontroller.h (showLearningWizard); build clean (5m7s); 21/21 tests pass (42m14s); integration + integrating pushed (d318386f49); GA CI triggered — 3 failures (Windows: dependency checksum mismatch, Flatpak: xvfb-run exit 1, macOS: BeatsTranslateTest SEGFAULT — all infrastructure/flaky, none code-related); rerun requested
- wayland-opengl-resize-warning 2026-08-03: rebased onto upstream/2.6 per daschuer request (#16014 was main-based, PR retargeted to 2.6); [x] removed — excluded from main-based integration merges; addressed daschuer CHANGES_REQUESTED (dropped redundant MIXXX_USE_QOPENGL guard, warn-once static flag, linked #13814); replied to wayland-egl question; stale Jul-16 mixxx-test binary was hanging pre-push hook at 420s timeout — rebuilt against 2.6 base, 1174 tests pass; pushed (4557b82e49), PR marked ready for review; pre-commit CI then flagged two pre-existing long lines in 2.6's waveformwidgetfactory.cpp — wrapped locally, unpushed pending confirmation
- Integration rebuilt 2026-08-03: rebased 20 active branches on upstream/main (216 new commits incl. 2.6 sync, stem stacked waveforms, AutoDJ orientation); integration rebuilt from scratch (reset to upstream/main, merged 19 [x] branches — wayland excluded, now 2.6-based); resolved conflicts in dlgprefcontroller.h (showLearningWizard), overviewtype.h + waveformoverviewrenderer.cpp/h + woverview.cpp (StackedRGB+Simple coexistence — one resolution initially duplicated RGB enum, fixed), dlgprefwaveform.cpp (simple-waveform sort+move dropped, waveform-menu-order handles ordering); textured-waveform-fbo-resize + openglwindow-resize-repaint (no worktrees) rebased via temp worktrees; script gap fixed: build_all_tests now rebuilds binaries older than HEAD commit (stale binaries were previously tested after rebases); known gap: push_changed smart-diff compares against moving upstream/main so ALL branches push after any upstream sync (20 pushed) — needs range-diff-based comparison; ~/src/mixxx build dir needed taglib1 cache wipe (CMakeCache + libdjinterop stamps moved aside) before test binary rebuild; build clean; 20/20 tests pass; integration + integrating pushed (4d0590b836); GA CI triggered on origin/integrating
- Integrated promoted 2026-08-03: GA CI run #30852260900 completed — Flatpak (x86_64) xvfb-run exit 1, Flatpak (aarch64) cancelled (cascade); all other jobs green (coverage, clazy, clang-tidy, macOS arm64+x64, Android, Windows x64+ARM64, pre-commit, Ubuntu 24.04). Added
KNOWN_INFRA_FAILURESallowlist to script —promote_integrated()now fetches failed job names and promotes when every failure matches a known infra/flaky pattern, blocking on any unknown failure. Promoted integrating → integrated. - Integration patched 2026-08-05: merged hid-init-race-on-enumeration mutex fix (part 2 —
s_hidOpenMutexserialisinghid_open*calls infetchReportDescriptorInBackground()); resolved comment conflict inhidenumerator.cpp(incoming version references bothhid_init()and mutex); also bringsmixxx-controls.d.tsandstemcontrolobjecttest.cppchanges from upstream - Integration rebuilt 2026-08-08: fetched upstream (2 new commits — CrateFeature comment removal); rebased 20 active branches on upstream/main (3 skipped: tracker-module-stems, mono-waveform-option, wayland-opengl-resize-warning); 20/20 builds OK (ccache 64.62% hit rate, ~3 min serial); 20/20 tests pass (9 run + 11 sentinel-skipped, ~15 min); integration + integrating pushed (0a218c3489); GA CI triggered run #31240292131 on origin/integrating; PR #16838 (hid-init-race) opened upstream 2026-08-04; PR #15460 (restore-last-library-selection) updated with two-commit rewrite, mxmilkiib comment 2026-08-08
- CHANGES_ADDRESSED (7 PRs): controller-wizard-quick-access (#15577 — ronso0: disconnect logic + range-for, addressed Feb 18), stacked-overview-waveform (#15516 — ronso0: remove redundant HSV/LMH renderers, addressed), restore-last-library-selection (#15460 — daschuer+ronso0: size check, programmatic string, match() instead of manual iteration, addressed 2026-08-08), hide-unenabled-controllers (#15580 — ronso0: rename + null checks, addressed Feb 28), wayland-opengl-resize-warning (#16014 — daschuer: drop MIXXX_USE_QOPENGL guard, addressed 2026-08-03; rebased to 2.6), waveform-menu-order (#16046 — daschuer: don't sort combobox with lambda, adjust order in factory, addressed Jul 16), playback-position-control (#15617 — ronso0: tooltip wording + null check pattern, addressed 2026-05-26)
- REVIEW_REQUIRED (9 PRs): textured-waveform-fbo-resize (#16010), openglwindow-resize-repaint (#16012, DRAFT), deere-waveform-zoom-deck-colors (#16874 — opened 2026-08-10), extend-waveform-zoom-range (no PR yet), catalogue-number-column (#15616), replace-libmodplug-with-libopenmpt (#15519, DRAFT), hotcues-on-overview-waveform (#15514, DRAFT), deere-channel-mute-buttons (#15624, DRAFT), library-column-hotcue-count (#15462)
- CHANGES_REQUESTED (1 PR): simple-waveform-top-and-overview (#16021 — daschuer: upgrade path changes RGB to Simple, default should remain RGB; not yet addressed)
- Merged upstream: midi-makeinputhandler-null-engine (#16003 — MERGED 2026-06-18; worktree removed)
- CI status: GA CI run #31330828588 on origin/integrating (SHA 5996796cd1) — completed 2026-08-09; macOS x64 SEGFAULT (known infra); auto-promoted to integrated (ba4bb7a8e8) 2026-08-10. Auto-promote workflow now active.
- Architecture changes needed: replace-libmodplug-with-libopenmpt (daschuer: DSP to effect rack)
- Draft / on hold: deere-channel-mute-buttons (draft — needs broader plan)
- Secondary patches: hid-init-race-on-enumeration (#16838 — REVIEW_REQUIRED, opened 2026-08-04), fix-timer-test-potmeter-clamping (no PR yet)
- Archived: tracker-module-stems (libopenmpt API gap, worktree removed 2026-08-10)
Pre:
- Branch rebased on latest
mixxxdj/mixxxmain
During:
- Builds without errors
- No new compiler warnings
- Basic functionality tested
Post:
- No regressions in related features
This process updates all feature/bugfix branches in mixxx-dev/ to latest upstream:
- Upstream MUST be fetched first (from any worktree):
git fetch upstream - For each worktree directory in
~/src/mixxx-dev/:- The branch MUST be rebased on upstream/main:
git rebase upstream/main - Conflicts MUST be resolved if any occur
- The "Rebased" date in INTEGRATION.md MUST be updated
- The branch MUST be rebased on upstream/main:
- Rebased branches are NOT automatically pushed — use
--push-changedto push only branches whose patch content differs from origin (avoids wasteful CI on pure rebases) - Branches with unresolved conflicts SHOULD be noted for later attention
- After all branches are updated, the Integration Merge Process SHOULD be run
Automated via ./mixxx-milkii-integration-update-branches.sh --full (run from ~/src/mixxx-dev/integration/); the script has no rebase-only mode — --full rebases, builds test binaries, runs tests, and pushes integration/integrating. For manual rebase-only, run git rebase upstream/main in each worktree.
All scripts use the mixxx-milkii-integration- filename prefix. All are committed to the integration branch and synced to a single gist: https://gist.github.com/mxmilkiib/5fb35c401736efed47ad7d78268c80b6
| Script | Purpose |
|---|---|
mixxx-milkii-integration-update-branches.sh |
Rebase all worktrees (no push), configure+build test binaries (parallel configure, serial build, nice 15), run test suite with per-branch sentinels for selective re-runs, smart-diff push (--push-changed — only content changes trigger CI), push integration/integrating, poll GA CI with per-job status (--promote-integrated), end-to-end pipeline (--full-promote — rebase+build+test+push+CI poll+promote in one command), grand summary |
mixxx-milkii-integration-pre-push.sh |
Pre-push hook logic (versioned); .git/hooks/pre-push delegates here; runs clang-format check + test suite, blocks local-only files from reaching mixxxdj/mixxx |
mixxx-milkii-integration-gdb-run.sh |
Launch Mixxx under GDB with --developer --controller-debug --debug-assert-break; auto-detects the mixxx binary; logs to timestamped file, discards on clean exit; sets debuginfod enabled, suppresses SIG32/SIGPIPE/SIGUSR* |
This process merges all [x] marked branches into the integration branch for a combined bleeding-edge build.
-
Commit pending INTEGRATION.md changes (if any) before starting:
git add INTEGRATION.md && git commit -m "update INTEGRATION.md before integration"
-
Fetch upstream
git fetch upstream
-
Rebase all worktree branches on upstream/main — see the Batch Branch Update Process section. The script does not have a rebase-only mode; either rebase each worktree manually (
git rebase upstream/mainin each~/src/mixxx-dev/<branch>/) or run./mixxx-milkii-integration-update-branches.sh --fullwhich rebases + builds tests + runs tests + pushes (steps 4–9 below are the manual integration merge that--fulldoes NOT do —--fullonly pushes the existing integration branch). -
Checkout the integration branch
git checkout integration
-
Merge upstream/main into integration (merge, not rebase, to preserve integration history):
git merge upstream/main
-
Merge each
[x]branch from the outline — theNext:field is commentary, not a filter; ALL[x]-marked branches are merged:git merge <local-branch-name>
-
Resolve merge conflicts carefully. Common issues:
- Schema revisions: increment version numbers
- Enum IDs in
trackmodel.h: assign unique IDs - Header declarations vs implementations: keep both sides' additions
-
Update INTEGRATION.md:
- Change
[ ]to[x]for newly merged branches - Update "Rebased" and "Updated" dates to today
- Update the summary line counts
- Update the "Last updated" date at the top
- Change
-
Build and verify — integration branch MUST be rebuilt after any branch is added or modified:
Incremental rebuild (most common — after source changes):
CCACHE_BASEDIR=~/src/mixxx-dev/integration nice -n 15 cmake --build ~/src/mixxx-dev/integration/build --target mixxx -- -j$(nproc --ignore=2)
Full reconfigure (only needed when new branches add CMakeLists changes or new source files):
cmake -B ~/src/mixxx-dev/integration/build -S ~/src/mixxx-dev/integration -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCCACHE_SUPPORT=ON CCACHE_BASEDIR=~/src/mixxx-dev/integration nice -n 15 cmake --build ~/src/mixxx-dev/integration/build --target mixxx -- -j$(nproc --ignore=2)
Basic functionality SHOULD be tested after build.
-
Sync to Gist:
gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename INTEGRATION.md INTEGRATION.md gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-update-branches.sh mixxx-milkii-integration-update-branches.sh gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-pre-push.sh mixxx-milkii-integration-pre-push.sh gh gist edit 5fb35c401736efed47ad7d78268c80b6 --filename mixxx-milkii-integration-gdb-run.sh mixxx-milkii-integration-gdb-run.sh
gh pr view <PR-number>
gh pr list --repo mixxxdj/mixxx --author mxmilkiib.github/workflows/manjaro-release.yml is a release-packaging workflow separate from the build.yml CI matrix. It produces an installable Manjaro/Arch package from the CI-confirmed integrated branch and publishes it as a GitHub Release on mxmilkiib/mixxx.
pushtointegrated— fires automatically on every successful--promote-integrated.workflow_dispatch— manual run from the Actions UI against any branch/SHA.
Only the CI-confirmed tier is packaged; integration and integrating pushes do NOT trigger it. concurrency: group: manjaro-release with cancel-in-progress: true ensures rapid successive integrated promotions do not stack overlapping package builds; the newest promotion wins.
- Runner:
ubuntu-24.04with amanjarolinux/base:latestcontainer (--privileged). - Base deps installed via
pacman -Syu:base-devel git cmake ninja ccache sudo. makepkgrefuses to run as root, so a non-rootbuilderuser (inwheel, passwordless sudo) is created. Allmakepkginvocations run asbuilderviasu builder -c.- Mixxx build deps installed from the Manjaro repos: protobuf, vamp-plugin-sdk, chromaprint, libid3tag, rubberband, soundtouch, lame, libogg, libmad, libvorbis, libmp4v2, faad2, opusfile, wavpack, libshout, libsndfile, portmidi, portaudio, sqlite, upower, lilv, libebur128, libopenmpt, qt6-declarative, qtkeychain-qt6, qt6-svg, qt6-shadertools, qt6-5compat, qt6-multimedia-ffmpeg, qt6-scxml, microsoft-gsl, hidapi, ffmpeg, fftw, flac, glu, pipewire, pipewire-jack, libusb, jsoncpp, gtest, gmock.
taglib1is NOT in the Manjaro repos and is built from AUR (https://aur.archlinux.org/taglib1.git) as thebuilderuser withmakepkg -si --skippgpcheck. The PKGBUILDarcharray is patched to addaarch64. This is the only AUR dependency.
The workflow uses the same feature flags as the local integration build, with a few packaging-conscious differences. Notable flags: QT6=ON, QML=ON, BULK=ON, FFMPEG=ON, MAD=ON, MODPLUG=OFF, OPENMPT=ON, WAVPACK=ON, BATTERY=ON, BROADCAST=ON, HID=ON, KEYFINDER=ON, LILV=ON, OPUS=ON, QTKEYCHAIN=ON, VINYLCONTROL=ON, INSTALL_USER_UDEV_RULES=OFF (no root udev install in the container), WARNINGS_FATAL=OFF, DEBUG_ASSERTIONS_FATAL=OFF, CMAKE_BUILD_TYPE=RelWithDebInfo, ccache launchers on C/C++.
- Cache path
/ccache, 5 GB cap,hash_dir=false. - Keyed
ccache-manjaro-${{ github.sha }}withrestore-keys: ccache-manjaro-for fallback. Saved on every run (if: always()).
ctest --timeout 45 --parallel $(nproc) with the same exclusion regex used locally: AdjustReplayGainTest.AdjustReplayGainUpdatesPregain|MidiMappings/.*|HidMappings/.*|BulkMappings/.*|ControllerScriptEngineLegacyTest.*|ControllerScriptEngineLegacyTimerTest.*. These suites are excluded for the same state-poisoning / known-failing reasons documented in the Upstream test filter scope and Pre-push hook timeout rules. A test failure fails the workflow before any package is produced.
cmake --installinto a staging dir (DESTDIR=$GITHUB_WORKSPACE/staging), thenchmod -R a+rXso thebuilderuser can read it formakepkg.- A
PKGBUILDis generated dynamically:pkgname=mixxx-milkiib-integrated-manjaropkgver=${MIXXX_VERSION}_${PKGVER_TIMESTAMP}_${SHORT_SHA}(e.g.2.6_20260809_1430_abc1234)pkgrel=1,arch=('x86_64'),license=('GPL2'),url=https://mixxx.orgconflicts=('mixxx' 'mixxx-git'),provides=('mixxx')— installing it replaces a stockmixxx/mixxx-gitpackage.options=('!strip' '!emptydirs')— keeps debug symbols (matchesRelWithDebInfo) and avoids empty-dir warnings.depends=(...)is computed at build time by runninglddon the stagedmixxxbinary, mapping each shared lib to its owning pacman package viapacman -Qo, stripping version constraints, and excludinggcc/glibc. This keeps the dependency list accurate to what the binary actually links against on Manjaro.package()simplycp -as the stagedusr/local/tree into${pkgdir}/usr/.
makepkg -f --noconfirm --skippgpcheckruns asbuilder. On failure, the PKGBUILD and staging dir listing are printed for debugging before the step exits non-zero.- The produced
*.pkg.tar.zstis uploaded as a workflow artifact (manjaro-package,archive: false) and attached to a GitHub Release.
- Action:
softprops/action-gh-release@v2. - Tag:
mixxx-milkiib-integrated-${timestamp}-${short_sha}(timestampYYYYMMDD-HHMMUTC). - Name:
Mixxx MilkiiB Integrated Manjaro Build ${major.minor}-${short_sha}(major.minor extracted fromproject(mixxx VERSION ...)inCMakeLists.txt). prerelease: true,draft: false.- Release body includes install instructions:
sudo pacman -U <pkg>and a one-linercurl ... | sudo pacman -Uthat pulls the asset directly from the release URL. - Notes the build is unsigned, built on Manjaro, compatible with Manjaro and Arch derivatives, with deps resolved by pacman.
- Every
--promote-integratedtriggers a full Manjaro package build (~10–20 min depending on ccache hit rate). - The workflow does NOT block
integratedpromotion; it runs asynchronously after the push. Check status withgh run list --workflow manjaro-release.yml --repo mxmilkiib/mixxx --limit 3. - Releases accumulate as pre-releases. Prune old ones with
gh release delete <tag> --repo mxmilkiib/mixxx(andgit push origin :refs/tags/<tag>to drop the tag) when they are no longer needed — the workflow does not auto-prune. - The
builderuser creation is guarded byid builder >/dev/null 2>&1 || useradd ...so re-runs within a cached container layer do not fail. git config --global --add safe.directory "$GITHUB_WORKSPACE"is required becauseactions/checkoutinside a container runs as root but the checkout is owned by a different UID, triggering git's dubious-ownership check.git fetch origin --force --tagsensuresgit describe --always --first-parentproduces a meaningful version string for the release tag/body.
This section documents the structure of this file for AI assistants and future maintainers.
Branch naming convention: feature/YYYY.MMmon.DD-thing-descriptive-title
- [x] **branch-name** - [#PR](url) - STATUS
- Issue: [#ISSUE](url)
- Optional description
- Created: YYYY-MM-DD, Last comment: YYYY-MM-DD, Rebased: YYYY-MM-DD, Updated: YYYY-MM-DD
- Next: Action item
- Specifics:
- Details about the branch and what probably should happen next[x]= merged to integration,[ ]= not merged- Branch name in bold
- Issue link to related Mixxx issue/feature request (if applicable)
- Created date required for all branches
- Last comment date shows most recent PR comment ("none" if no comments), only for PRs
- Rebased date shows when branch was last rebased on
mixxxdj/mixxxmain ("none" if never) - Updated date tracks last modification to branch
- Next action describes what needs to be done for this branch
- Within each section:
[x](integrated) branches first, then[ ](not integrated) branches - Within each group (
[x]or[ ]), sort by updated date (newest first) - STATUS is one of: DRAFT, REVIEW_REQUIRED, CHANGES_REQUESTED, MERGED, RESOLVED, LOCAL_ONLY, ARCHIVED
- DRAFT: PR is a draft, not ready for review
- REVIEW_REQUIRED: PR is open and awaiting first review
- CHANGES_REQUESTED: reviewer has requested changes that have not yet been addressed
- CHANGES_ADDRESSED: reviewer requested changes, changes have been made, awaiting re-review (no reviewer comment since the changes were pushed)
- MERGED: PR has been merged into
mixxxdj/mixxx - RESOLVED: no PR, or PR closed because the problem was resolved upstream by another contributor
- LOCAL_ONLY: no PR, local-only feature that will not be submitted upstream
- ARCHIVED: branch/PR abandoned or shelved indefinitely; worktree removed
- Secondary patch entries use
Resolves-residual-fromorDepends-oninstead ofIssueto link to the primary branch
- Awaiting Review from Others (CHANGES_ADDRESSED or REVIEW_REQUIRED, feedback addressed or awaiting first review)
- Secondary Patches
- Bug Fixes — Open PRs (CHANGES_REQUESTED or REVIEW_REQUIRED)
- New Features — Open PRs (CHANGES_REQUESTED or REVIEW_REQUIRED)
- Schema-Changing Branches (Excluded from Integration)
- Local Only (No PR)
- Merged to Upstream / Archived
When updating integration: Update the "Last updated" date at the top of this file.
Update the summary line at the top when adding/removing branches:
**Summary**: X need attention, Y awaiting review, Z schema-excluded, W merged upstream, V local-only, U secondary patch