feat(channels): add audited owner recovery - #2948
Conversation
Co-authored-by: Jreevo <jerry.ytp@gmail.com> Signed-off-by: Jreevo <jerry.ytp@gmail.com>
Co-authored-by: Jreevo <jerry.ytp@gmail.com> Signed-off-by: Jreevo <jerry.ytp@gmail.com>
Co-authored-by: Jreevo <jerry.ytp@gmail.com> Signed-off-by: Jreevo <jerry.ytp@gmail.com>
|
Rolling-deployment remediation is pushed at exact head What changed:
Exact-head validation:
The PR remains draft. Exact-head GitHub CI and Docker runs are currently |
Review —
|
Problem
The community was transferred to Jerry's current identity, and the former community owner then left the community. Ownership of
#generaldid not transfer with the community; it remained assigned to that former owner identity after the identity had left the community.This left Jerry seeing two same-display-name
Jerrycandidates in#general@-mention autocomplete: his current identity and the former owner identity still holding channel ownership.Deleting and recreating
#generalto repair channel ownership or related associations is not safe because it would discard channel history and stable bindings.This proposal is only a narrowly audited channel-ownership continuity path. It does not claim to fix mention-autocomplete ranking, remove the duplicate identity, or recover a lost/deleted key that did not record prior self-consent.
Summary
This draft implements a reviewable proposal for #2928 without widening ordinary channel-role management:
9038recovery command across the SDK, CLI, relay, Tauri, and Desktopselfarchive consent naming the same existing human member as replacement9005and NIP-09 kind5Maintainer security decision required
This is intentionally a draft proposal, not an assertion that the authorization policy is approved.
Proposed predicate:
all_current_human_owners_self_archived_for_target_v1Every current human owner must already have a durable archive row with:
consent_path = selfactor = ownerreplaced_by = nominated targetAny active human channel admin or owner/admin agent blocks recovery. The signer must independently be the active, known human community owner.
This does not recover a lost or deleted key that never recorded self-consent, so it does not solve the incident that motivated #2928. Maintainers must approve, revise, or reject this predicate and the pre-storage command architecture before the PR can be considered merge-ready.
Data and audit guarantees
member|guest -> owneronlyValidation
Exact head:
c0d444d3a88370f60d5147aaba4f1b893d877accPassed on that exact head:
cargo fmt --all -- --checkand workspace Clippy with warnings deniedjust test-unit: buzz-core, buzz-auth, buzz-db lint/unit, conformance, and push gateway9005and kind5immutability, visibility, and persistenceschema/schema.sqlbootstrap and embedded relay migration bootstrapKnown validation and governance blockers:
just cistops at the unchanged Desktop file-size guard:desktop/src-tauri/src/managed_agents/runtime.rsis reported as 2,220 lines against a 2,216 limit. This branch does not modify that file. All preceding pinned formatting, workspace Clippy, and Biome checks passed; later CI recipes were run individually and passed.api::mesh_demo::tests::demo_join_forwarded_arm_round_trips_echo504 race. That exact test passes in isolation, and the full touched-package suite passes when only that separately validated test is skipped.action_requiredfor the fork head and have not executed. A maintainer must authorize them.The PR remains draft. No merge or deployment is authorized.
Refs #2928.