Section 9 — CI Pipeline
Companion to
musehub-production-readiness-checklist.md. "GitHub Actions" / "pull requests" / "CODEOWNERS" translate to MuseHub-native equivalents per the Decision Log — but this section's investigation found those equivalents mostly don't exist as product features yet, not just "unconfigured." That's a more significant gap than a typical checklist item.
What actually exists today
- A real, well-built internal background job queue (
musehub/services/musehub_jobs.py):claim_next_jobusesSELECT ... FOR UPDATE SKIP LOCKEDfor safe concurrent claiming across workers,reclaim_stale_jobsresets jobs stuck inrunningafter a crash, and there's a dependency barrier sofetch.mpack.prebuildwon't claim ahead of a same-repompack.index. This is genuinely good engineering — it directly answers Section 5's earlier "are background jobs idempotent/safely retryable" question (yes, confirmed). - But the only job types that exist are internal:
mpack.indexandfetch.mpack.prebuild— post-push indexing/prebuild work, not user-defined CI (tests, lint, type-check). - A
musehub-runnercontainer is provisioned (docker:24-dind, privileged, withRUNNER_TOKEN/MUSEHUB_URLenv vars) — infrastructure for running isolated CI jobs exists at the container level, but I could not find the client code that would poll MuseHub for jobs and execute them (searched forRUNNER_TOKEN/"runner" references inmusehub/— none found outside the compose file anddocs/infrastructure.md). This looks like scaffolding for a CI runner that isn't wired to a real job-execution client yet.
What doesn't exist yet (product gaps, not just configuration gaps)
- No branch protection. No code enforcing protected branches, required reviews, or blocking
direct pushes to
main/dev. - No required status checks. Nothing in
musehub_proposals.py'smerge_proposalgates on CI status — a proposal can merge regardless of whether any checks passed. - No CODEOWNERS-equivalent. No per-path required-reviewer concept found anywhere.
- No user-defined pipeline execution (formatting, linting, type-checking, unit/integration tests, migration checks, dependency/secret/container/IaC scanning) triggered by push or proposal.
This means Section 9 isn't "reconfigure GitHub Actions as MuseHub CI" — it's "these MuseHub
platform features don't exist yet." That's a materially bigger scope than the checklist implies,
and worth Gabriel knowing explicitly: closing this section means building product features in
musehub/, not just writing deployment config.
Checklist assessment
Given the above, nearly every item in this section is genuinely not started, and it's more honest to say so plainly than to mark partial credit:
- [ ] Require proposals for protected branches — not started (no branch protection exists)
- [ ] Protect
main/dev— not started - [ ] Require CI checks before merging — not started (no CI-status gating in
merge_proposal) - [ ] Require review from another maintainer for sensitive changes — not started
- [ ] Define required-reviewer paths (CODEOWNERS-equivalent) — not started
- [ ] Run formatting/linting/type-checking/unit/integration/migration-check/dependency-scan/
secret-scan/container-scan/IaC-scan — none of these run automatically anywhere today; they
exist as manual developer commands (
pytest, etc.) but nothing triggers them on push - [ ] Immutable versioned build artifacts with commit SHA — partially: Docker images are tagged
and pushed to ECR (
musehub/musehub:<tag>), which is a form of immutable artifact, but there's no automated build-on-push — images are built manually viapush.shon a laptop - [ ] Produce artifact once, promote through environments — not done,
IMAGE_TAGredeploy support exists inpush.sh(so promoting a specific tag is possible), but the default flow rebuilds for each environment rather than promoting the staging-tested image - [ ] SBOM generation — not started
- [ ] Dependency update automation — not started
- [ ] Urgent-patch workflow — not documented
- [ ] CI/deployment log retention — not applicable, no CI exists to log
- [ ] Prevent force-push/branch deletion on protected branches — not started
Recommendation for the later build phase
Given how much is missing, prioritize in this order:
- Required-status-check gating on
merge_proposal— the highest-leverage single feature, since everything else in Sections 9–11 assumes this exists. - Branch protection (block direct push to
main/dev, require proposals). - Wire the actual
musehub-runnerjob-execution client — decide whether it runs a fixed pipeline (lint/test/build) or user-defined config (more general, more work). - CODEOWNERS-equivalent, once 1–3 exist and there's a real merge gate to attach required reviewers to.