Skip to content

[Security] Access denied copy — the remaining 38 templates, classified: admin-surface should be RETAINED as developer copy, four end-user sites need their own decision #7475

Description

@os-zhuang

Successor to #7451, which is closed by PR #7471. Filed unassigned, no domain:* label — routing and grading are the triage seat's call.

#7451 was a ~40-template sweep card. PR #7471 implemented the end-user-facing half under a scope limit set at claim time, and produced an audience classification of every producer template with evidence. This card carries the remainder, so the classification does not die inside a merged PR.

The remainder is not one backlog. It splits into a decision and a short list of open questions, and conflating them is what made #7451 hard to price.

Part 1 — the admin-surface family: recommend RETAIN, do not translate (~30 templates)

delegated-admin-gate.ts (13), suggested-audience-bindings.ts (3), permission-set-projection.ts (1), system-write-guard.ts (1), plugin-auth/invitation-role-cap.ts (3), and security-plugin.ts's admin-door family (:2457, :3314, :3339, :3376, :3389, :3456, :3482, :3500).

These are reached from an admin console by someone administering the system, and most cite ADR clauses (ADR-0090 D5/D9 and D6/D12, ADR-0091 D3, ADR-0103). Localizing copy that cites an ADR clause destroys the citation without helping anyone: the reader is an operator who benefits from the clause number.

This is a decision to record, not work to schedule. The useful outcome is a written verdict — "this family is correctly developer-facing" — so the next census does not re-file it as a translation backlog. If triage agrees, closing this part as not planned with that sentence in the thread is a better artifact than a card that stays open forever.

Part 2 — four end-user-reachable sites that are NOT cleanly one situation

Each was measured as end-user reachable but declined conversion for a stated reason. None is a copy fix; each needs a decision first.

site why it was not converted
security-plugin.ts:3981 assertControlledByParentWrite Already filed as #7474. One deny() multiplexes six conditions, three of which are not access verdicts (a metadata defect, a not-found, a null master FK). User copy would tell a user they lack access when their app is misconfigured.
security-plugin.ts:1657 owner_id transfer grant Plausible end-user situation (record reassignment) but zero measured pull — allowTransfer appears in neither example app. Converting on speculation is the capability-expansion this repo defers.
security-plugin.ts:1069 / :1140 fail-closed End-user visible during degradation, but the situation is "the check could not run", not "you lack permission". Copy saying the latter would be false. Needs its own message key and arguably its own status.
:953 public-form grant · :1891 tenant wall · :1094 / :1265 on-behalf-of · predicate-guard.ts:122 Reached via a misbuilt or forged client, a configured agent integration, or a team-administration action — not an ordinary business operation.

What PR #7471 leaves for whoever takes any of this

Refs: #7451 (predecessor), PR #7471, #7414 / PR #7449, #7307 / PR #7423, #7450, #7474.

Activity

  1. claude commented on Aug 10, 2026

    @claude
    Contributor

    Triage: needs-user-decision + domain:identity.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. claude commented on Aug 11, 2026

    @claude
    Contributor

    Maintainer ruling — 2026-08-11. From the four-lens decision review (platform long-term coherence / measured business pull / AI-agent error-resistance / startup scope discipline); the maintainer accepted the recommendation set in full.

    Ruling: Part 1 approved — the admin-surface family (~30 templates across delegated-admin-gate.ts, suggested-audience-bindings.ts, permission-set-projection.ts, system-write-guard.ts, invitation-role-cap.ts, and security-plugin.ts's admin-door family) is correctly developer-facing: RETAIN as developer copy, do not localize. ADR-clause citations are load-bearing for operators; localizing destroys the citation without helping anyone.

    Closing this card not-planned per its own suggestion, so the next census does not re-file the family as a translation backlog. Part 2 is NOT swallowed by this close: :3981 lives on as #7474 (ruled separately today); :1657 stays unconverted (zero measured pull); the fail-closed sites :1069/:1140 remain a candidate for their own card if degradation UX becomes a priority; the remaining sites stay unconverted by design.

    Recorded by the triage seat Routine (#5474 pilot) on the maintainer's direct instruction — ruling record, not a claim.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions