Core runner + output parse substrate

This document defines the core primitives introduced for:

  • #460 — extension runner helper contract
  • #464 — generic output parsing primitive

Runner contract (core)

src/core/extension/runner_contract.rs

  • RunnerStepFilter { step, skip }
  • should_run(step_name) for deterministic include/skip semantics
  • to_env_pairs() maps to exec context vars:
    • HOMEBOY_STEP
    • HOMEBOY_SKIP

execution.rs now aliases legacy ExtensionStepFilter to RunnerStepFilter to keep command API stable while moving behavior to a reusable core primitive.

Output parse primitive (core)

src/core/engine/output_parse.rs

Generic parser with declarative rule spec:

  • HOMEBOY_STEP
  • HOMEBOY_SKIP

Aggregates supported:

  • HOMEBOY_STEP
  • HOMEBOY_SKIP

Expressions support + and - over numeric literals and parsed field names.

Initial wiring

  • ParseRule { pattern, field, group, aggregate }
  • DeriveRule { field, expr }
  • ParseSpec { rules, defaults, derive }
  • parse_output(text, spec) -> HashMap<String, f64>

This keeps extension contracts minimal while centralizing normalization/policy in core.