ADR-067: The strategy substrate gets one home — ADR-061’s placement reopens

Status: accepted (decision); extraction is an implementation task sequenced after the pool-construction work.

Context

ADR-061 made pool-state provisioning a plane capability and placed the substrate — pool ingress, the planning workspace, executor hop views, the connector index — in degenbot-bot::bot_core, with strategies composing it (StrategyKit, per the strategy-seams substrate map). The architecture review measured the cost of that placement across the crate line:

  • At review start: five degenbot-strategy files imported degenbot_bot::bot_core.

  • After the frame un-split (pass B): eight files, eighteen import statements (backrun.rs, backrun_driver/{driver_boot,tests}.rs, backrun_engine.rs, candidate_projection.rs, frame_pipeline.rs, market_context.rs, strategy_kit.rs). The direction is growth: strategy-plane work pulls more substrate across the crate line, not less.

The substrate’s own upstream neighbors set the pattern — pool identity lives in degenbot-pools, path enumeration in degenbot-pathfinding; the substrate layer is where shared mechanics belong. Holding it inside the arbitrage application crate inverts the leverage: every PoolIngress signature change ripples into a sibling crate’s eight files, and a Rust-only strategy author reaches core composition through the arb engine’s internals.

Decision

D1 — ADR-061’s capability claim stands; its placement half reopens. State provisioning remains a plane capability consumed by StrategyKit; the files move to a home both consumers compose (a degenbot-bot-independent crate or module at the substrate layer, beside pools/pathfinding).

D2 — The extraction follows the pool-construction work. The construction entry (card 2) is reworking the same core-adjacent surface; sequencing avoids fabricating a second rippling change.

D3 — Acceptance is measured. Post-extraction degenbot-strategy carries ZERO use degenbot_bot::bot_core imports; the strategy seam map and CONTEXT.md point at the new home; degenbot-bot composes it as a peer, and the pure-Rust consumer path (just check-rust-consumer) proves a strategy can be authored without the application crate.

Consequences

  • StrategyKit’s provision cell keeps its interface; only its join address changes.

  • ADR-061 remains the record of the capability decision; this ADR owns the placement.

  • If the extraction measures WORSE (e.g. the substrate proves entangled with BotState pointers), the evidence returns here and the placement stands — this ADR then records why.