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.
Problem
HomeboyPlangives Homeboy a shared plan shape, but high-value plan inputs, outputs, policies, and command settings are still largely string-keyedserde_json::Valuemaps.That keeps important contracts implicit and lets domains reconstruct typed meaning by string key lookup or lossy conversion.
Evidence
src/core/plan.rs:11-49definesPlanValuesasHashMap<String, serde_json::Value>with convenience builders.src/core/plan.rs:70-73storesHomeboyPlan.inputsandHomeboyPlan.policyas raw maps.src/core/plan.rs:218-225storesPlanStep.inputs,outputs, andpolicyas raw maps.src/core/issues/plan.rs:217-223reconstructs typed reconcile actions by readingstep.inputs.get("action")and deserializing the value.src/commands/lint.rs:143-168converts resolved settings throughstring_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:
Acceptance criteria
HomeboyPlanJSON shape for CLI/API compatibility."action"is replaced by a typed adapter or domain plan wrapper.AI assistance