Skip to content

Groups and topology control (v0.5.0) - #13

Merged
happyren merged 1 commit into
masterfrom
feat/groups
Aug 15, 2026
Merged

happyren merged 1 commit into
masterfrom
feat/groups

Conversation

@happyren

Copy link
Copy Markdown
Owner

Sixth roadmap item — and it adds no new tool, which matters given tool-surface pressure was the top risk in the last verdict.

Design

  • Membership on the capability card. A session's groups are part of what it is for, which the card already answers. A join tool would have added surface for a fact with a natural home.
  • Addressing through peer_send with to: "#backend".
  • Topology in operator config, not emergent from who happens to be running:
groups:
  backend: { topology: star, lead: tech-lead }
maxFanout: 8

star routes a member's message to the lead alone and lets the lead broadcast — one message in costs one turn instead of N. That asymmetry is the entire saving, and it's why denser topologies aren't automatically better.

Each recipient is an ordinary send, so inbound policy, loop control and accounting apply per recipient. A group address is a convenience for the sender, never a way around the receiver. Fan-out is bounded, and the refusal names the cheaper shape rather than just saying no.

The defect live testing found

A test would never have caught this. The operator configures lead: tech-lead — but display names are folded from session titles, which are generated and change. So tech-lead resolved to nobody and every star send failed:

failed → #backend
The configured lead "tech-lead" is not in this group.

The operator had no stable handle to configure against. Cards now carry a self-declared alias — a short name that doesn't move — and lead lookup matches it. Re-ran live:

delivered → #backend
1/1 delivered (star via tech-lead): tech-lead=delivered

Also fixed a cosmetic follow-on: the outcome reported the relay by alias but the recipient by folded title, so one session appeared under two names in one line.

20 new tests, 286 total.

Adds group addressing without adding a tool. Membership is declared on the
capability card, because a session's groups are part of what it is for,
which the card already answers; addressing is "#name" through peer_send.
A join tool would have added surface for a fact with a natural home.

Topology is an operator decision in config rather than something that
emerges from who happens to be running. Denser is not automatically better
and every extra recipient costs a turn, so an implicit all-to-all degrades
as sessions multiply. star routes a member's message to the lead alone and
lets the lead broadcast: one message in costs one turn instead of N.

Each recipient is an ordinary send, so inbound policy, loop control and
accounting apply per recipient. A group address is a convenience for the
sender, never a way around the receiver. Fan-out is bounded, and the
refusal names the cheaper shape rather than just saying no.

Live testing found a defect that no test would have: an operator configuring
"lead: tech-lead" had nothing stable to name. Display names are folded from
session titles, which are generated and change, so the lead resolved to
nobody and every star send failed. Cards now carry a self-declared alias —
a short handle that does not move — and lead lookup matches it. The group
outcome also reports recipients by alias, so one session never appears
under two names in one line.

20 new tests, 286 total. Version 0.5.0.
@happyren
happyren merged commit 01c5af0 into master Aug 15, 2026
1 check passed
@happyren
happyren deleted the feat/groups branch August 15, 2026 05:27
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