Skip to content

Make the fan-out reduce step a real procedure - #72

Merged
yavorpanayotov merged 1 commit into
juxt:mainfrom
panayotovk:reduce-integration-step
Aug 23, 2026
Merged

Make the fan-out reduce step a real procedure#72
yavorpanayotov merged 1 commit into
juxt:mainfrom
panayotovk:reduce-integration-step

Conversation

@yavorpanayotov

Copy link
Copy Markdown
Collaborator

Why

For a big goal the loop already splits the work up and runs one distill or one loop per service. It works like a map reduce, and that fan-out is the map. This adds the reduce, the part where you bring those separate specs back together and check they still agree where they meet. Specs written apart tend not to line up. Something gets defined in two places, or one service waits for an event another service was supposed to send, or a contract gets asked for and nothing provides it. The loop already gathered these into an integration pass, and this makes that pass a real, concrete step.

How

Once the separate specs are done, the loop wires them together and picks one owner for anything shared. Then it runs allium analyse once over the whole set. The checker recently learned to trace behaviour across the joins between specs, so one call now tells the loop where the specs don't agree. That landed in the allium CLI 3.6.0, and it's what makes this step possible. The loop works through what it finds the same way it fixes anything else, then runs the tests that cross between services and a final check over the whole thing.

The checker does the reading and the existing steps do the fixing, so the loop only holds the results rather than every spec, and there's nothing new to add to it.

Fanning a large goal out into one distill (or one loop) per service is the map.
The reduce -- assembling the slices and driving the seams between them to
convergence -- was only a hand-wave in driving-the-loop §6: "run a whole-spec
integration pass". Slices distilled in isolation don't agree at their seams: the
same entity defined twice, a rule that depends on a trigger another slice was
meant to emit, a contract demanded with nothing to fulfil it.

Turn §6 into a concrete reduce: assemble and wire the slices (canonical owner
for a shared entity, use imports), cross-check the whole set with a single
`allium analyse` call (now cross-module aware, so it reasons across use seams and
returns the seams that don't line up), route each finding through the existing
taxonomy to tend/weed, then cross-service propagate and a final witness. The CLI
does the seeing and the existing phase agents do the edits, so the orchestrator
holds slice paths and JSON, never slice bodies -- and no new agent is added.

- New reference integrating-slices.md: the seam detail (canonical entity
  ownership, use wiring, contract matching, which findings signal a broken seam).
- driving-the-loop §6 rewritten as the four-step reduce, linking it.
- actioning-findings gains the cross-seam framing and documents
  allium.reference.unknownName as the seam signal to read from diagnostics.
- test-skills: a reduce group pinning the procedure's constructs and links.
@yavorpanayotov
yavorpanayotov merged commit fe9073e into juxt:main Aug 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant