Skip to content

0.5.241: room membership is signed by the person, not the engine or node key - #827

Merged
emooreatx merged 1 commit into
mainfrom
fix/pair-room-founder
Oct 27, 2026
Merged

emooreatx merged 1 commit into
mainfrom
fix/pair-room-founder

Conversation

@emooreatx

@emooreatx emooreatx commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Why

Five-platform run 40542816916, on 0.5.240. The whole contact ladder went green, then every creator POST /v1/chat returned 500 chat.community_create_failed:

open_pair_room: found room chat:pair:v1:…: membership of "qa-node-…" … refused (membership_founding_member_unsigned) (CIRISPersist#955)

The chat routes signed the pair room's membership rows with st.node_signer, the engine key. On a split home, where an agent embeds the node (every production agent since 0.5.189), that is the agent key. An agent is its own self with no owner-binding, so persist could not count its signature as the founder's.

What

Membership is the person's act. Per Eric: invites come from people, not nodes, and in production the user's signing key is always available.

contacts_chat::membership_pen signs with the owner's own pen (owner_signer_capsule::acquire, the same way chat messages and widening are already signed). It covers:

  • the founding record and the proposal (open_pair_room);
  • the acceptance (accept_pair_proposal);
  • the joiner's intent (pair_intents::advance).

The background pair-room driver uses the owner pen it already holds. A delegated session is refused with chat.delegation_denied. MLS state, KeyPackages and message signing are unchanged.

(An earlier commit on this branch signed with the node key. That passes persist's check but is wrong in principle, so it was replaced.)

Tests

tests/split_home_pair_room.rs builds the split home: the engine on the agent key, an owner → node binding, and the agent anchored by self_at_login.

  • The agent key is refused with the exact production rule.
  • The person's own key founds the room and invites the peer.

All green locally:

  • clippy -D warnings
  • 634 lib tests
  • contacts_chat (41)
  • localization guard --strict
  • localization_gate, release_gates, field_conformance and log_citations

🤖 Generated with Claude Code

https://claude.ai/code/session_01QriZxPx5aJvHXCGaTZmvKF

With the contact ladder green on 0.5.240, every creator POST /v1/chat answered
500 chat.community_create_failed: `membership_founding_member_unsigned`
(CIRISPersist#955). The chat routes signed the pair room's founding record,
the acceptance of a proposal and the joiner's intent with st.node_signer, the
ENGINE key. On a split home (an agent embedding the node) that is the AGENT
key: its own self, no owner-binding, so persist's
admission_identity_for_writer could not lift it to the founder.

contacts_chat::membership_authority picks the held NODE key's signer (owned,
so persist resolves it to the person) and falls back to the engine key on a
standalone node, whose engine IS the node. MLS and KeyPackage signing is
unchanged. tests/split_home_pair_room.rs builds the split home and shows the
agent key refused with the production rule and the node key founding the room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QriZxPx5aJvHXCGaTZmvKF
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-27T17:24:45.641294Z
We couldn’t complete this review. Comment @codex review to try again.
9933b0c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@emooreatx
emooreatx merged commit 8d34662 into main Oct 27, 2026
17 checks passed
@emooreatx emooreatx changed the title 0.5.241: on a split home the node key signs room membership 0.5.241: room membership is signed by the person, not the engine or node key Oct 27, 2026
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