Migration Playbook (Make/Just -> Broski)
This guide is for teams migrating real projects without downtime.
What problems Broski solves
- Rebuild ambiguity:
--explaingives concrete cache miss reasons. - Timestamp fragility: graph fingerprints are content-based.
- Split tooling: one runner for graph and interactive flows.
- Hidden environment drift: explicit
@env,@secret_env,@load. - Manual dependency ordering: explicit task graph.
What Broski does not solve
- Remote/distributed cache orchestration.
- Automatic semantic dependency inference.
- Full Windows parity for every strict isolation path.
Migration strategy
- Keep current Make/Just runner while bootstrapping Broski.
- Port one CI-critical flow (
build,test,ci) first. - Add strict contracts (
@in,@out) to graph tasks. - Validate behavior using
--dry-runand--explain. - Port developer workflows (
dev,watch,serve) as interactive tasks. - Switch CI entrypoint to Broski after parity.
- Remove old runner after two green cycles.
Concept mapping
| Existing concept | Make | Just | Broski |
|---|---|---|---|
| Task | target | recipe | task header |
| Dependency edge | target deps | recipe deps | task: dep_a dep_b |
| Parameters | variables | recipe args | [arg] and [arg="default"] |
| Env injection | shell env | shell env | @env, @secret_env, @load |
| Long-running dev task | recipe | recipe | @mode interactive |
| Deterministic artifact cache | not first-class | not first-class | graph mode + manifest fingerprints |
| Rebuild reason | limited/manual | limited | --explain |
Conversion patterns
Pattern A: Make CI chain
build:
cargo build --release
test:
cargo test
ci: build test
version = "0.5"
build:
@in src/**/* Cargo.toml Cargo.lock
@out target/release
cargo build --release
test: build
@in src/**/* tests/**/* Cargo.toml Cargo.lock
@out .broski/stamps/test.ok
cargo test
touch .broski/stamps/test.ok
ci: test
@mode interactive
echo "ci complete"
Verify:
broski run ci --dry-run --explain
broski run ci --explain
Pattern B: Just args -> Broski params
build target mode="release":
cargo build --bin {{target}} --{{mode}}
build [target] [mode="release"]:
@in src/**/* Cargo.toml
@out dist/{{ target }}
cargo build --bin {{ target }} --{{ mode }}
Run:
broski build api
broski build api debug
Pattern C: setup + dev workflow
setup:
pip install -r requirements.txt
npm install
dev:
docker compose up
setup:
@mode interactive
@requires python3 npm
pip install -r requirements.txt
npm install
dev:
@mode interactive
@requires docker
docker compose up
Anti-pattern reference
Detailed anti-pattern guidance now has dedicated pages:
CI migration checklist
-
broski run ci --dry-runsucceeds -
broski run ci --explainshows deterministic reasons - build/test tasks declare
@inand@out - interactive tasks explicitly use
@mode interactive - required binaries covered by
@requires - old CI runner removed only after parity and green history
Local developer checklist
-
broski listshows clean public task surface - destructive tasks protected with
@confirm - helper tasks hidden with
@private - onboarding path documented in
READMEand quickstart
Rollback plan
If migration fails in CI:
- keep old runner as fallback entrypoint;
- disable Broski entrypoint for one cycle;
- run
broski run ci --explainon failing commit; - fix contracts (
@in/@out/env) and re-enable.