diff --git a/smithers/workflows/rig-loop.tsx b/smithers/workflows/rig-loop.tsx index aa0d35f..22823ca 100644 --- a/smithers/workflows/rig-loop.tsx +++ b/smithers/workflows/rig-loop.tsx @@ -65,7 +65,7 @@ const { Workflow, Sequence, Parallel, Task, Loop, Branch, smithers, outputs } = export default smithers((ctx) => { const advisor = ctx.input.advisor !== false; - const seed = ctx.input.built.join(", ") || "(none)"; + const seed = (ctx.input.built ?? []).join(", ") || "(none)"; const pick = ctx.latest(outputs.pick, "pick"); const backlogDry = Boolean(pick && (pick.ready === false || (pick.ticketId ?? "") === "")); diff --git a/smithers/workflows/rig-sync.tsx b/smithers/workflows/rig-sync.tsx index 783b0de..807c627 100644 --- a/smithers/workflows/rig-sync.tsx +++ b/smithers/workflows/rig-sync.tsx @@ -64,7 +64,7 @@ const { Workflow, smithers, outputs } = createSmithers({ /** One reconciling lane: isolated worktree, coder↔reviewer until approved. * RED→GREEN→review for code — the rig-task loop, in-workflow. */ -function Unit({ ctx, u, baseBranch }: { ctx: any; u: z.infer; baseBranch: string }) { +function Unit({ ctx, u, baseBranch }: { ctx: any; u: z.infer; baseBranch: string; key?: string }) { const s = slug(u.id); return ( @@ -89,7 +89,7 @@ without it. Else return blockers. Set unitId: "${u.id}".`} export default smithers( (ctx) => { - const work = ctx.input.units.filter((u) => u.klass === "work"); + const work = (ctx.input.units ?? []).filter((u) => u.klass === "work"); // Gates are DECISION NODES; subsequent steps are gated on the recorded // decision (rig's EpicFlow convention) — nesting steps as Approval children // does not schedule them.