Skip to content

plan: migrate high-value plan inputs/settings away from stringly typed Value maps #3268

Description

@chubes4

Problem

HomeboyPlan gives Homeboy a shared plan shape, but high-value plan inputs, outputs, policies, and command settings are still largely string-keyed serde_json::Value maps.

That keeps important contracts implicit and lets domains reconstruct typed meaning by string key lookup or lossy conversion.

Evidence

  • src/core/plan.rs:11-49 defines PlanValues as HashMap<String, serde_json::Value> with convenience builders.
  • src/core/plan.rs:70-73 stores HomeboyPlan.inputs and HomeboyPlan.policy as raw maps.
  • src/core/plan.rs:218-225 stores PlanStep.inputs, outputs, and policy as raw maps.
  • src/core/issues/plan.rs:217-223 reconstructs typed reconcile actions by reading step.inputs.get("action") and deserializing the value.
  • src/commands/lint.rs:143-168 converts resolved settings through string_lossy_overrides() before dispatch.

Desired shape

Keep raw JSON as an extension/interoperability escape hatch, but introduce typed input/output/settings primitives for high-value native Homeboy domains first.

Good early targets:

  • deploy plan inputs/results
  • lab offload plan inputs/results
  • release plan steps
  • quality/lint/test/audit settings
  • issue reconciliation actions

Acceptance criteria

  • At least one high-value domain no longer stores its primary contract only as string-keyed JSON plan inputs.
  • Typed plan data can still serialize into the public HomeboyPlan JSON shape for CLI/API compatibility.
  • Reconstructing actions via magic keys like "action" is replaced by a typed adapter or domain plan wrapper.
  • Lossy string settings conversion is restricted to legacy shell/extension boundaries.
  • Tests cover typed-to-plan serialization and plan-to-typed reconstruction where round-tripping is required.

AI assistance

  • AI assistance: Yes
  • Tool(s): OpenCode (GPT-5.5)
  • Used for: Internal contract audit and issue drafting; Chris remains responsible for scope and review.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions