Deferred by decision — filed so the reasoning is not lost. Depends on #27 (per-project state).
Why it is attractive
With one room and several projects, a bare approve is genuinely ambiguous. A4 anticipates this and prescribes reply-relation binding in Matrix, with the agent asking when a bare approval is unclear.
A room per project makes the disambiguation structural instead of protocol: an approve in project X's room can only mean project X. Channel identity carries the binding — nothing to parse, nothing for the operator or the model to get wrong. That is the same move A4 makes elsewhere, and it replaces work rather than adding to it: no reply-relation threading, no approve <project> syntax, no ambiguity test.
Note A1 gives each agent a room, not each project, so this is an extension rather than a requirement.
Work
MatrixTransport becomes multi-room: /sync already returns every joined room, so the change is removing a filter and tagging inbound messages with their room, plus a target on sends. InboundMessage gains a room.
The currently configured room becomes the control room, where use <project> and project onboarding happen — a project's room does not exist yet at that moment.
Room creation is an external side effect, so it takes the intent-log treatment like opening a PR. Make it idempotent with a deterministic canonical alias (#nisse-dev-<project>:<domain>): a crash between creating the room and recording its id then resolves by alias lookup instead of creating a second room. Same trick as deterministic document ids in A17.
Agent creates the room and invites the operator when a project is first taken up.
Unverified
Whether the bot may create rooms and claim aliases on the homeserver. Worth checking before leaning on the alias for idempotency.
Deferred by decision — filed so the reasoning is not lost. Depends on #27 (per-project state).
### Why it is attractive
With one room and several projects, a bare `approve` is genuinely ambiguous. A4 anticipates this and prescribes reply-relation binding in Matrix, with the agent asking when a bare approval is unclear.
**A room per project makes the disambiguation structural instead of protocol**: an `approve` in project X's room can only mean project X. Channel identity carries the binding — nothing to parse, nothing for the operator or the model to get wrong. That is the same move A4 makes elsewhere, and it *replaces* work rather than adding to it: no reply-relation threading, no `approve <project>` syntax, no ambiguity test.
Note A1 gives each **agent** a room, not each project, so this is an extension rather than a requirement.
### Work
- `MatrixTransport` becomes multi-room: `/sync` already returns every joined room, so the change is removing a filter and tagging inbound messages with their room, plus a target on sends. `InboundMessage` gains a room.
- The currently configured room becomes the **control room**, where `use <project>` and project onboarding happen — a project's room does not exist yet at that moment.
- Room creation is an external side effect, so it takes the intent-log treatment like opening a PR. Make it idempotent with a **deterministic canonical alias** (`#nisse-dev-<project>:<domain>`): a crash between creating the room and recording its id then resolves by alias lookup instead of creating a second room. Same trick as deterministic document ids in A17.
- Agent creates the room and invites the operator when a project is first taken up.
### Unverified
Whether the bot may create rooms and claim aliases on the homeserver. Worth checking before leaning on the alias for idempotency.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Deferred by decision — filed so the reasoning is not lost. Depends on #27 (per-project state).
Why it is attractive
With one room and several projects, a bare
approveis genuinely ambiguous. A4 anticipates this and prescribes reply-relation binding in Matrix, with the agent asking when a bare approval is unclear.A room per project makes the disambiguation structural instead of protocol: an
approvein project X's room can only mean project X. Channel identity carries the binding — nothing to parse, nothing for the operator or the model to get wrong. That is the same move A4 makes elsewhere, and it replaces work rather than adding to it: no reply-relation threading, noapprove <project>syntax, no ambiguity test.Note A1 gives each agent a room, not each project, so this is an extension rather than a requirement.
Work
MatrixTransportbecomes multi-room:/syncalready returns every joined room, so the change is removing a filter and tagging inbound messages with their room, plus a target on sends.InboundMessagegains a room.use <project>and project onboarding happen — a project's room does not exist yet at that moment.#nisse-dev-<project>:<domain>): a crash between creating the room and recording its id then resolves by alias lookup instead of creating a second room. Same trick as deterministic document ids in A17.Unverified
Whether the bot may create rooms and claim aliases on the homeserver. Worth checking before leaning on the alias for idempotency.