Open work organized by size. Each line is intentionally GitHub-issue-shaped: title + 1–2 line scope. Pick from the Suggested wave-1 list at the bottom for the highest-leverage starting set.
- K8s deploy mode —
mctf deploy --mode kubernetes. Generate K8s Deployment / Service / Ingress manifests from per-challenge compose,kubectl apply -f. Honorcfg.Deploy.Kubernetes.{Kubeconfig, Namespace, IngressClass}. - Plugin system — subprocess + JSON-RPC over stdio (Terraform-style), language-agnostic, crash-isolated. Foundation +
before_deploy/after_deployshipped (internal/plugin,docs/spec/plugins.md). Remaining:before_build/after_build,on_instance_spawn(two sites —cmd/instance.go+internal/instancer/server.go),on_health_failure(needs a health-monitoring loop — largest), dispatch ondown/kubernetes paths, and a blocking/requiredmode (a plugin that can veto). Prometheus / Grafana wiring —Shipped:mctf monitoring upbrings up prom + grafana + cAdvisor with prebuilt dashboards. Generate scrape config from challenge labels.mctf monitoring up/downrender and run the stack undermonitoring/stack/(seedocs/spec/monitoring.md).- Terraform wrapper —
mctf infra plan|apply|destroyfor VPS, clusters, networking, DNS. Templates for DigitalOcean, Hetzner, DOKS, EKS, GKE.
- rCTF + generic-webhook platforms — second + third platform targets behind the existing platform interface, ideally via plugin once the system lands.
- Per-team auth on the instancer — currently bearer tokens have full power; add team-scoped tokens (
POST /spawnonly allows the request when the token's team_id matches the body). - Native instancer: docker-network isolation — currently spawns share the event network; isolate each per-team instance to its own bridge.
mctf platform configureextensions — syncstart/endtimestamps (needs schema additionevent.start_at/event.end_at),ctf_description.mctf release— tag git, build via goreleaser, draft a release notes file from conventional-commits since last tag.
(All wave 1 small wins have been shipped!)
- Update
docs/spec/validation.mdto reflect every rule that shipped (D001–D003, SEC002–004, W006–W010, A007, etc.). - Update
docs/spec/CHANGELOG.mdwith the v0 → v0.1 delta. Architecture doc (Shipped — pipeline diagram, package map, archetypes, deploy modes, and the two instancer implementations.docs/spec/architecture.md) — how the packages fit together.Per-command man pages —Shipped viacobracan generate them; ship underdocs/man/.mctf gen-man/make man; generated at release time and bundled in the archives +.deb/.rpm(not committed, to avoid build-date drift).- Update CONTRIBUTING.md — new packages (
instancer,ingress,notify,solve,status,info,platform/ctfd). - Refresh
examples/sample-event/— add one challenge per core category (currently 5 challenges, 10 categories). Helps new contributors.
goreleaser — cross-platform binaries (darwin-arm64 / amd64, linux-amd64 / arm64, windows-amd64).Shipped (.goreleaser.yaml+ release workflow; seedocs/RELEASING.md).Homebrew tap — formula inShipped (Homebrew cask; needs one-time tap repo +MicroClub-USTHB/homebrew-tap.HOMEBREW_TAP_TOKEN).Shipped (nfpms)..deb/.rpm— via goreleaser.- Scoop bucket — for Windows (needs a bucket repo; config to follow).
Docker image ofShipped (goreleasermctfitself —ghcr.io/microclub-usthb/mctf:<version>for CI use.dockers→ GHCR; amd64, multi-arch to follow).
- golangci-lint in CI (
go vetis currently the only static check). - Coverage reporting —
go test -coverprofileupload to Codecov / similar. - Fuzz tests for the manifest loader and the compose port parser.
- End-to-end integration test — sample-event fixture: validate → generate → build → scan → deploy → solve → down. Real docker daemon, gated on an
e2ebuild tag.
- SEC005: capability allowlist enforcement — honor
deploy.security_opts.allow_capsso SEC004 only fires on caps not in the allowlist. - SEC006: image vulnerability scan — opt-in
mctf build --scan-vulnsvia trivy or similar. - Secret hygiene —
warn underShipped asmctf doctoronMCTF_*_TOKENpatterns.doctorcheckD043(scans the tracked working tree forMCTF_*_{TOKEN,KEY,SECRET,WEBHOOK}values, filtering placeholders/env-refs; never prints the value). Follow-up: deep git-history scan (left to a dedicated tool like gitleaks).
Highest leverage, smallest blast radius — pick from these to start:
- goreleaser + Homebrew tap — unlock distribution.
- K8s deploy mode — biggest deployment-flexibility win.
docs/spec/refresh — backfill what shipped this session.
- One PR per concern (see
CONTRIBUTING.md). - Spec moves with code: any change to on-disk shape touches
schema/,docs/spec/,make schemas, and tests in the same PR. - Validation rules use the established ID prefix scheme:
S###schema,A###archetype consistency,U###event-wide uniqueness,D###deployment,SEC###security,SOL###solution,W###warning,I###info. - New commands ship with their semantics documented under
docs/spec/.