Skip to content

PlanOrchestratorConfig has no reader: nothing accepts it, its spec tests the orchestrator, and its defaults describe an orchestrator that does not exist #69

Open

Description

@minerva-sky

Hypothesis

PlanOrchestratorConfig is a leftover from the first orchestrator design that nothing constructs, nothing accepts, and nothing tests, and its defaults describe an orchestrator that does not exist. A reader who finds it in the gem builds PlanOrchestratorConfig.new(continue_on_failure: false) expecting fail-fast and gets neither fail-fast nor an error, because there is no way to hand the object to anything.

Evidence

  • lib/agentic/plan_orchestrator_config.rb (57 lines, added 2025-05-20, shipped in 0.2.0). Zero references in lib/, exe/, README, docs/. grep -rn PlanOrchestratorConfig lib exe README.md docs returns only the file itself.
  • PlanOrchestrator.new takes plan_id:, concurrency_limit:, retry_policy:, lifecycle_hooks: as plain keywords (plan_orchestrator.rb:24). There is no config: parameter and no .from_config. The CLI builds the orchestrator with keywords (cli.rb:656).
  • spec/agentic/plan_orchestrator_config_spec.rb looks like coverage and is not: it is RSpec.describe Agentic::PlanOrchestrator, "configuration" and tests the orchestrator's retry_policy: keyword. The config class has no spec.
  • The defaults lie about the runtime. continue_on_failure: true is the default, but the orchestrator's real failure policy is skip-the-dependents (Add :skipped terminal state for dependents of failed tasks #34), and Per-task failure tolerance: on_failure: continue (#23 C2) #40 adds the actual per-task knob as on_failure: :continue. async: true is the default and there is no synchronous path: execute_plan always runs under Async. to_h emits a retry_config shape (max_retries/backoff_strategy/backoff_options) that omits retryable_errors, which is the key the orchestrator's retry_policy: actually branches on.
  • GitHub code search for Agentic::PlanOrchestratorConfig outside this repo: no hits.

Same shape as #44, #46, #60: a declaration with no reader. This one is worse than dead code because it is dead code with a contract, and the contract contradicts the live one.

Experiment that would validate it

Write the test the class has never had: construct the config, pass it to the orchestrator, assert the behaviour the field names promise. It cannot be written, which is the finding. The remaining question is only "wire or remove", and the measurement is the GitHub search above (zero consumers) plus a note in the next release's CHANGELOG to catch anyone we missed.

Cost

Class: public-api-change (L0)
Minerva's lean: Deprecate now and remove next minor; #40's per-task on_failure: is the right shape for failure tolerance, and a plan-level boolean on top would be the speculative abstraction the CONSTITUTION forbids.

Labels: loop:self, status:analyzed


Origin: loop:self session 2026-10-15, declared-but-never-read audit. Checked closed and deferred issues: nothing on this class. Related: #34 (skip state), #40 (per-task on_failure), #60 (same audit shape).

Activity

  1. added
    loop:selfForward-thinking improvement loop (WORLD.md-aligned)
    on Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    loop:selfForward-thinking improvement loop (WORLD.md-aligned)status:analyzedAnalyzed, awaiting decision

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions