A sanitized, illustrative crosscut.config.yaml for three repos spread across two
products (the integration boundary):
- Product
platform— two repos that ship together:api— Python (kind: python), tests viapytest, lint viaflake8.web— Node.js (kind: nodejs), tests viajest, lint viaeslint.
- Product
web-mono— one repo, a solo product (noproduct:field → its product defaults to its name):web-mono— Node.js monorepo (kind: nodejs+ amonorepo:block,tool: nx) — acceptance runs Nx'saffected/run-manytargets instead of a fixedtest_cmd/lint_cmdpair. Seedocs/monorepos.mdfor the how-to anddocs/configuration.md§ Monorepo repos for the field reference.
Products matter because feature_id, depends_on, and integration-readiness are all
scoped per product — never across products. api and web share the platform
product, so the sample feature below (a plan in each) is allowed to link them.
Use this as a reference for the full config shape, alongside docs/configuration.md and
skills/crosscut/templates/crosscut.config.example.yaml.
crosscut.config.yaml— an illustrative config, with/path/to/...placeholders in place of real filesystem paths. The real config lives at one fixed global home,~/.crosscut/crosscut.config.yaml— this copy just shows its shape.ROADMAP.md— the plan index (same layout asskills/crosscut/templates/ROADMAP.template.md), grouped by product, with two sample rows underplatform: one plan inapi, one inweb, linked by a sharedfeature_id.README.md— this file.
You do not copy this config anywhere. There is exactly one config file, at
~/.crosscut/crosscut.config.yaml, and you build it by running
/crosscut init from inside each repo:
-
cdinto a repo and run/crosscut init. The first run creates the global home (~/.crosscut/), seeds the ROADMAP, and interviews you once for the global settings (language, git-safety). Every run — first or later — then asks the per-repo questions for the current directory ($PWD): which product it belongs to (join an existing one or start a new solo product), itskind,test_cmd/lint_cmd,plans_dir, and (python only)venv_isolation. It writes the repo into the single config, merging byname. -
Repeat for each repo. Run
/crosscut initfrom insideapi, thenweb(joining productplatformboth times), thenweb-mono(a solo product). Re-running it inside an already-registered repo safely updates that repo's entry. -
Run
/crosscutfrom anywhere to activate. It reads the global config, reconciles the ROADMAP against each repo's<plans_dir>/{completed,rejected}/, and shows a per-product status summary of the ready plans — then waits for you to choose which one to drive (or write a new plan, or just show status). Launched from inside a configured repo, it leads with that repo's product. Once you pick a plan, it drives that plan autonomously todone.
The crosscut.config.yaml here is what such a config looks like once all three repos
are registered — handy for reading the schema, or hand-editing if you prefer, but init
is the intended path (it rewrites the file from its own interview, so a later init
would overwrite a hand-edit for the same repo).
Both are shown at their defaults, to illustrate the fully-active shape end to end:
executor: ralphex(Phase 4, autonomous run) — one ofralphex(default; needs Docker + theghcr.io/umputun/ralphex:latestimage),claude(in-session subagent — no Docker/CLI), orcodex(codex execin a worktree). There is no enabled/disabled toggle: Phase 4 always runs the executor, andexecutor_options.*tunes the run. Seedocs/executors.md.plan_review: codex(Phase 3, pre-flight review) — needs acodexCLI onPATH. Set it tononeto skip Phase 3 entirely: the plan moves tovalidatedwith theplan_review_skippedflag instead of being reviewed first. Even withcodex, if the CLI is unavailable or its quota is exhausted on first use, Phase 3 degrades toplan_review_skippedrather than failing. Seedocs/validators.md.
Whatever plan_review is set to, the Phase 5b final review (the final_review scalar,
default in-session) reviews the produced code for every executor run unless
final_review: none — plan review checks the plan before execution, final review checks
the code after it, and neither waives the other.