Org rename: decide rename-with-redirect vs display-name-only #360

Closed
opened 2026-09-12 00:48:55 +00:00 by crueber · 3 comments
Owner

Survey: crueber/walhub#349 candidate 1.

Evidence

  • Org id is immutable: keys are orgs// (OrgKey/MembersKey/TeamKey) with no rename service (grep RenameOrg|rename across internal/identity finds nothing); repos//* owner segments likewise pinned. DisplayName already exists on Org (internal/identity/orgs.go:29) and is editable via PUT, so display-name-only needs no work.
  • GitHub allows renaming with redirect; Forgejo allows renaming. A rename here must move org.json + members.json + teams + invites AND every repos//* repo — expensive and CAS-heavy.

Design (decision ticket)

  • Either: (a) rule display-name-only and document it (close with a docs note), or (b) implement rename-with-redirect (old name tombstone/redirect record, key moves under CAS, repo owner-segment moves).
  • Recommendation: rule display-name-only for v1 unless a concrete rename need appears; renames are rare and the move cost is high.

Acceptance criteria

  • Explicit ruling recorded (docs + comment here referencing #349).
  • If (b): rename endpoint + UI + redirect from the old name, with tests.
Survey: crueber/walhub#349 candidate 1. ## Evidence - Org id is immutable: keys are orgs/<org>/ (OrgKey/MembersKey/TeamKey) with no rename service (grep RenameOrg|rename across internal/identity finds nothing); repos/<org>/* owner segments likewise pinned. DisplayName already exists on Org (internal/identity/orgs.go:29) and is editable via PUT, so display-name-only needs no work. - GitHub allows renaming with redirect; Forgejo allows renaming. A rename here must move org.json + members.json + teams + invites AND every repos/<org>/* repo — expensive and CAS-heavy. ## Design (decision ticket) - Either: (a) rule display-name-only and document it (close with a docs note), or (b) implement rename-with-redirect (old name tombstone/redirect record, key moves under CAS, repo owner-segment moves). - Recommendation: rule display-name-only for v1 unless a concrete rename need appears; renames are rare and the move cost is high. ## Acceptance criteria - [ ] Explicit ruling recorded (docs + comment here referencing #349). - [ ] If (b): rename endpoint + UI + redirect from the old name, with tests.
crueber added this to the v1 milestone 2026-09-12 00:48:55 +00:00
Author
Owner

Ruling recorded per the survey recommendation (survey #349 candidate 1): display-name-only for v1 — see PR #367 (docs-only, no code changes). Org id stays immutable (keys orgs// + repos//* pinned; a rename-with-redirect would move all of those under CAS plus rewrite team: subjects — CAS-heavy for a rare operation). DisplayName is already editable via PUT /api/v1/orgs/{org} (verified in internal/identity/orgs.go: PutOrg), and no doc or web/src UI affordance promises a rename (verified by grep). Revisit only on a concrete rename need.

Ruling recorded per the survey recommendation (survey #349 candidate 1): **display-name-only for v1** — see PR #367 (docs-only, no code changes). Org id stays immutable (keys orgs/<org>/ + repos/<org>/* pinned; a rename-with-redirect would move all of those under CAS plus rewrite team: subjects — CAS-heavy for a rare operation). DisplayName is already editable via PUT /api/v1/orgs/{org} (verified in internal/identity/orgs.go: PutOrg), and no doc or web/src UI affordance promises a rename (verified by grep). Revisit only on a concrete rename need.
Author
Owner

Review of PR #367 (branch fix/issue-360, commit bbd475c) — docs-only ruling for org rename.

VERDICT: ready to merge.

What I checked (read-only; no worktree changes, no builds):

  • Scope: 1 file, 11 insertions, 0 deletions (git diff main...origin/fix/issue-360 --numstat = 11 0 docs/features/01_identity_permissions.md); git diff --check clean — pure addition, no whitespace contamination.
  • Ruling matches the ticket: issue #360 recommends display-name-only for v1 per survey #349 candidate 1; the entry records exactly that ('Revisit only on a concrete rename need').
  • Claims verified against main checkout:
    • PutOrg edits DisplayName: internal/identity/orgs.go:334 PutOrg is a full-document CAS replace, prev.DisplayName = e.DisplayName (line 348). No new surface needed — true.
    • No rename service: grep RenameOrg|rename-org across internal/identity finds nothing.
    • Key layout: OrgKey/MembersKey/TeamKey/OrgInviteKey all under orgs// (internal/identity/identity.go:160,170,173,179); team: subjects carry org/slug (gate.go, http_perms.go) — a slug rename would require moving all of those plus every repos//* owner segment under CAS. Cost claim stands.
    • No UI/doc promises rename: docs grep for org-rename finds no pre-existing promise; web/src rename hits are only diff tmp+rename, git rename detection, label delete+create, transfer+rename, and a Tree.jsx comment — no org-rename affordance. Entry's parenthetical audit is accurate.
  • Law 12 (AGENTS.md): entry appended to the ## Decisions section of 01_identity_permissions.md with issue (#360) + survey (#349) refs and rationale, in the same change as the decision. Satisfied (docs-only ruling = doc IS the change).
  • PR state: open, mergeable:true, base main @ d893adf (= local main), head bbd475c. No code, so no test tier applies beyond doc consistency.

No findings against merge.

Review of PR #367 (branch fix/issue-360, commit bbd475c) — docs-only ruling for org rename. VERDICT: ready to merge. What I checked (read-only; no worktree changes, no builds): - Scope: 1 file, 11 insertions, 0 deletions (git diff main...origin/fix/issue-360 --numstat = 11 0 docs/features/01_identity_permissions.md); git diff --check clean — pure addition, no whitespace contamination. - Ruling matches the ticket: issue #360 recommends display-name-only for v1 per survey #349 candidate 1; the entry records exactly that ('Revisit only on a concrete rename need'). - Claims verified against main checkout: - PutOrg edits DisplayName: internal/identity/orgs.go:334 PutOrg is a full-document CAS replace, prev.DisplayName = e.DisplayName (line 348). No new surface needed — true. - No rename service: grep RenameOrg|rename-org across internal/identity finds nothing. - Key layout: OrgKey/MembersKey/TeamKey/OrgInviteKey all under orgs/<org>/ (internal/identity/identity.go:160,170,173,179); team: subjects carry org/slug (gate.go, http_perms.go) — a slug rename would require moving all of those plus every repos/<org>/* owner segment under CAS. Cost claim stands. - No UI/doc promises rename: docs grep for org-rename finds no pre-existing promise; web/src rename hits are only diff tmp+rename, git rename detection, label delete+create, transfer+rename, and a Tree.jsx comment — no org-rename affordance. Entry's parenthetical audit is accurate. - Law 12 (AGENTS.md): entry appended to the ## Decisions section of 01_identity_permissions.md with issue (#360) + survey (#349) refs and rationale, in the same change as the decision. Satisfied (docs-only ruling = doc IS the change). - PR state: open, mergeable:true, base main @ d893adf (= local main), head bbd475c. No code, so no test tier applies beyond doc consistency. No findings against merge.
Author
Owner

Ruled by PR #367 (review clean; claims verified, pure addition, law 12 satisfied) — display-name-only for v1. Merged. Closing.

Ruled by PR #367 (review clean; claims verified, pure addition, law 12 satisfied) — display-name-only for v1. Merged. Closing.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#360
No description provided.