organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

Description

@claude

Found while correcting the managed-object-write-denies.ts docblock for #13822
(PR #14028). Comment-only card; this is a behaviour observation deliberately
left out of that PR and filed instead. Read from source on origin/main at
c54d4d3d7; not reproduced against a running kernel.

The gap

MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
applyManagedWriteDenies matches on it exactly:

const targets = new Set(MANAGED_DENY_TARGET_SETS);
...
if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;

organization_admin_no_bypass is not one of the four. It nevertheless holds a
write-granting wildcard: deriveWallLessOrgAdmin (end of
objects/default-permission-sets.ts) copies organization_admin and removes
only the two superuser bits —

const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
(objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
// survive GitHub's body sanitizer
objects['*'] = wildcardWithoutBypass;

— so allowCreate / allowEdit / allowDelete stay true on its '*'.

The derived variant IS in the array the injection walks: defaultPermissionSets
inserts it directly after its parent, and SecurityPlugin's
bootstrapPermissionSets defaults to that array
(options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
variant is walked and skipped, not absent.

And the derivation cannot inherit the injection later: it is a shallow copy
taken at module load
({ ...(base.objects ?? {}) }), while the injection is an
in-place mutation of the parent's objects at kernel:ready. Entries injected
into organization_admin therefore never reach the variant.

Why it matters

The variant does carry the static baseline, because organization_admin's
literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
is exactly the one the registry-driven module exists to close: a schema that
declares managedBy: 'better-auth' but is not in the hand-maintained
BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
organization_admin and nothing in organization_admin_no_bypass, where
the wildcard then grants create / edit / delete on it.

That is ADR-0092's drift, one posture over. And it is not an obscure posture:
auto-org-admin-grant grants this variant precisely when the deployment
enforces no organization wall, i.e. where the bits are least bounded.

There is no gap today — the static list covers the 30 managed tables the
tree currently declares. The gap opens on the next managedBy: 'better-auth'
schema that lands without an edit to that list, which is the scenario the module
was written for.

Why it reads as an oversight rather than a decision

The one set deliberately excluded from the target list is documented as such in
the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
unqualified wildcard so an admin can rescue data directly). The derived variant
is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
whose stated contract is the opposite: "everything else (object grants,
managed-write denies, anti-escalation RBAC read-only rules, system
permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
only intended delta is the superuser bits". Carried over verbatim is true of the
compile-time baseline and false of the registry union.

Nothing pins it

  • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
    contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
    over objects/default-permission-sets.test.ts returns four, so the search is
    live).
  • default-permission-sets.test.ts's managed-denies pin iterates
    MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
    structurally unable to see a fifth set that should have been one.

Options, not a recommendation to apply blind

  1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
    matches the module's stated intent. Needs a look at whether the variant's own
    sys_api_key-style explicit entries still survive (they should: the
    injection skips any object the set already names).
  2. Derive the variant AFTER the union instead of at module load, so
    "carried over verbatim" becomes true again. Larger, and it moves a
    module-load constant into kernel:ready ordering.
  3. Rule it deliberate and say so in the docblock, the way admin_full_access
    is. This is the option that needs a maintainer, not a dev: it means the
    wall-less variant is allowed to write identity tables the walled one cannot.

Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
to check membership — a list checked against itself is the reason this survived.

Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
prose only.

Generated by Claude Code


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

    Description

    @claude

    Found while correcting the managed-object-write-denies.ts docblock for #13822
    (PR #14028). Comment-only card; this is a behaviour observation deliberately
    left out of that PR and filed instead. Read from source on origin/main at
    c54d4d3d7; not reproduced against a running kernel.

    The gap

    MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
    applyManagedWriteDenies matches on it exactly:

    const targets = new Set(MANAGED_DENY_TARGET_SETS);
    ...
    if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
    

    organization_admin_no_bypass is not one of the four. It nevertheless holds a
    write-granting wildcard: deriveWallLessOrgAdmin (end of
    objects/default-permission-sets.ts) copies organization_admin and removes
    only the two superuser bits —

    const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
    (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
    // survive GitHub's body sanitizer
    objects['*'] = wildcardWithoutBypass;
    

    — so allowCreate / allowEdit / allowDelete stay true on its '*'.

    The derived variant IS in the array the injection walks: defaultPermissionSets
    inserts it directly after its parent, and SecurityPlugin's
    bootstrapPermissionSets defaults to that array
    (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
    what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
    variant is walked and skipped, not absent.

    And the derivation cannot inherit the injection later: it is a shallow copy
    taken at module load
    ({ ...(base.objects ?? {}) }), while the injection is an
    in-place mutation of the parent's objects at kernel:ready. Entries injected
    into organization_admin therefore never reach the variant.

    Why it matters

    The variant does carry the static baseline, because organization_admin's
    literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
    is exactly the one the registry-driven module exists to close: a schema that
    declares managedBy: 'better-auth' but is not in the hand-maintained
    BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
    organization_admin and nothing in organization_admin_no_bypass, where
    the wildcard then grants create / edit / delete on it.

    That is ADR-0092's drift, one posture over. And it is not an obscure posture:
    auto-org-admin-grant grants this variant precisely when the deployment
    enforces no organization wall, i.e. where the bits are least bounded.

    There is no gap today — the static list covers the 30 managed tables the
    tree currently declares. The gap opens on the next managedBy: 'better-auth'
    schema that lands without an edit to that list, which is the scenario the module
    was written for.

    Why it reads as an oversight rather than a decision

    The one set deliberately excluded from the target list is documented as such in
    the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
    unqualified wildcard so an admin can rescue data directly). The derived variant
    is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
    whose stated contract is the opposite: "everything else (object grants,
    managed-write denies, anti-escalation RBAC read-only rules, system
    permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
    only intended delta is the superuser bits". Carried over verbatim is true of the
    compile-time baseline and false of the registry union.

    Nothing pins it

    • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
      contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
      over objects/default-permission-sets.test.ts returns four, so the search is
      live).
    • default-permission-sets.test.ts's managed-denies pin iterates
      MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
      structurally unable to see a fifth set that should have been one.

    Options, not a recommendation to apply blind

    1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
      matches the module's stated intent. Needs a look at whether the variant's own
      sys_api_key-style explicit entries still survive (they should: the
      injection skips any object the set already names).
    2. Derive the variant AFTER the union instead of at module load, so
      "carried over verbatim" becomes true again. Larger, and it moves a
      module-load constant into kernel:ready ordering.
    3. Rule it deliberate and say so in the docblock, the way admin_full_access
      is. This is the option that needs a maintainer, not a dev: it means the
      wall-less variant is allowed to write identity tables the walled one cannot.

    Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
    to check membership — a list checked against itself is the reason this survived.

    Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
    prose only.

    Generated by Claude Code


    Generated by Claude Code

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

      Description

      @claude

      Found while correcting the managed-object-write-denies.ts docblock for #13822
      (PR #14028). Comment-only card; this is a behaviour observation deliberately
      left out of that PR and filed instead. Read from source on origin/main at
      c54d4d3d7; not reproduced against a running kernel.

      The gap

      MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
      applyManagedWriteDenies matches on it exactly:

      const targets = new Set(MANAGED_DENY_TARGET_SETS);
      ...
      if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
      

      organization_admin_no_bypass is not one of the four. It nevertheless holds a
      write-granting wildcard: deriveWallLessOrgAdmin (end of
      objects/default-permission-sets.ts) copies organization_admin and removes
      only the two superuser bits —

      const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
      (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
      // survive GitHub's body sanitizer
      objects['*'] = wildcardWithoutBypass;
      

      — so allowCreate / allowEdit / allowDelete stay true on its '*'.

      The derived variant IS in the array the injection walks: defaultPermissionSets
      inserts it directly after its parent, and SecurityPlugin's
      bootstrapPermissionSets defaults to that array
      (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
      what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
      variant is walked and skipped, not absent.

      And the derivation cannot inherit the injection later: it is a shallow copy
      taken at module load
      ({ ...(base.objects ?? {}) }), while the injection is an
      in-place mutation of the parent's objects at kernel:ready. Entries injected
      into organization_admin therefore never reach the variant.

      Why it matters

      The variant does carry the static baseline, because organization_admin's
      literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
      is exactly the one the registry-driven module exists to close: a schema that
      declares managedBy: 'better-auth' but is not in the hand-maintained
      BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
      organization_admin and nothing in organization_admin_no_bypass, where
      the wildcard then grants create / edit / delete on it.

      That is ADR-0092's drift, one posture over. And it is not an obscure posture:
      auto-org-admin-grant grants this variant precisely when the deployment
      enforces no organization wall, i.e. where the bits are least bounded.

      There is no gap today — the static list covers the 30 managed tables the
      tree currently declares. The gap opens on the next managedBy: 'better-auth'
      schema that lands without an edit to that list, which is the scenario the module
      was written for.

      Why it reads as an oversight rather than a decision

      The one set deliberately excluded from the target list is documented as such in
      the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
      unqualified wildcard so an admin can rescue data directly). The derived variant
      is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
      whose stated contract is the opposite: "everything else (object grants,
      managed-write denies, anti-escalation RBAC read-only rules, system
      permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
      only intended delta is the superuser bits". Carried over verbatim is true of the
      compile-time baseline and false of the registry union.

      Nothing pins it

      • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
        contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
        over objects/default-permission-sets.test.ts returns four, so the search is
        live).
      • default-permission-sets.test.ts's managed-denies pin iterates
        MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
        structurally unable to see a fifth set that should have been one.

      Options, not a recommendation to apply blind

      1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
        matches the module's stated intent. Needs a look at whether the variant's own
        sys_api_key-style explicit entries still survive (they should: the
        injection skips any object the set already names).
      2. Derive the variant AFTER the union instead of at module load, so
        "carried over verbatim" becomes true again. Larger, and it moves a
        module-load constant into kernel:ready ordering.
      3. Rule it deliberate and say so in the docblock, the way admin_full_access
        is. This is the option that needs a maintainer, not a dev: it means the
        wall-less variant is allowed to write identity tables the walled one cannot.

      Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
      to check membership — a list checked against itself is the reason this survived.

      Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
      prose only.

      Generated by Claude Code


      Generated by Claude Code

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

        Description

        @claude

        Found while correcting the managed-object-write-denies.ts docblock for #13822
        (PR #14028). Comment-only card; this is a behaviour observation deliberately
        left out of that PR and filed instead. Read from source on origin/main at
        c54d4d3d7; not reproduced against a running kernel.

        The gap

        MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
        applyManagedWriteDenies matches on it exactly:

        const targets = new Set(MANAGED_DENY_TARGET_SETS);
        ...
        if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
        

        organization_admin_no_bypass is not one of the four. It nevertheless holds a
        write-granting wildcard: deriveWallLessOrgAdmin (end of
        objects/default-permission-sets.ts) copies organization_admin and removes
        only the two superuser bits —

        const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
        (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
        // survive GitHub's body sanitizer
        objects['*'] = wildcardWithoutBypass;
        

        — so allowCreate / allowEdit / allowDelete stay true on its '*'.

        The derived variant IS in the array the injection walks: defaultPermissionSets
        inserts it directly after its parent, and SecurityPlugin's
        bootstrapPermissionSets defaults to that array
        (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
        what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
        variant is walked and skipped, not absent.

        And the derivation cannot inherit the injection later: it is a shallow copy
        taken at module load
        ({ ...(base.objects ?? {}) }), while the injection is an
        in-place mutation of the parent's objects at kernel:ready. Entries injected
        into organization_admin therefore never reach the variant.

        Why it matters

        The variant does carry the static baseline, because organization_admin's
        literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
        is exactly the one the registry-driven module exists to close: a schema that
        declares managedBy: 'better-auth' but is not in the hand-maintained
        BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
        organization_admin and nothing in organization_admin_no_bypass, where
        the wildcard then grants create / edit / delete on it.

        That is ADR-0092's drift, one posture over. And it is not an obscure posture:
        auto-org-admin-grant grants this variant precisely when the deployment
        enforces no organization wall, i.e. where the bits are least bounded.

        There is no gap today — the static list covers the 30 managed tables the
        tree currently declares. The gap opens on the next managedBy: 'better-auth'
        schema that lands without an edit to that list, which is the scenario the module
        was written for.

        Why it reads as an oversight rather than a decision

        The one set deliberately excluded from the target list is documented as such in
        the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
        unqualified wildcard so an admin can rescue data directly). The derived variant
        is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
        whose stated contract is the opposite: "everything else (object grants,
        managed-write denies, anti-escalation RBAC read-only rules, system
        permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
        only intended delta is the superuser bits". Carried over verbatim is true of the
        compile-time baseline and false of the registry union.

        Nothing pins it

        • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
          contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
          over objects/default-permission-sets.test.ts returns four, so the search is
          live).
        • default-permission-sets.test.ts's managed-denies pin iterates
          MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
          structurally unable to see a fifth set that should have been one.

        Options, not a recommendation to apply blind

        1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
          matches the module's stated intent. Needs a look at whether the variant's own
          sys_api_key-style explicit entries still survive (they should: the
          injection skips any object the set already names).
        2. Derive the variant AFTER the union instead of at module load, so
          "carried over verbatim" becomes true again. Larger, and it moves a
          module-load constant into kernel:ready ordering.
        3. Rule it deliberate and say so in the docblock, the way admin_full_access
          is. This is the option that needs a maintainer, not a dev: it means the
          wall-less variant is allowed to write identity tables the walled one cannot.

        Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
        to check membership — a list checked against itself is the reason this survived.

        Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
        prose only.

        Generated by Claude Code


        Generated by Claude Code

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

          Description

          @claude

          Found while correcting the managed-object-write-denies.ts docblock for #13822
          (PR #14028). Comment-only card; this is a behaviour observation deliberately
          left out of that PR and filed instead. Read from source on origin/main at
          c54d4d3d7; not reproduced against a running kernel.

          The gap

          MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
          applyManagedWriteDenies matches on it exactly:

          const targets = new Set(MANAGED_DENY_TARGET_SETS);
          ...
          if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
          

          organization_admin_no_bypass is not one of the four. It nevertheless holds a
          write-granting wildcard: deriveWallLessOrgAdmin (end of
          objects/default-permission-sets.ts) copies organization_admin and removes
          only the two superuser bits —

          const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
          (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
          // survive GitHub's body sanitizer
          objects['*'] = wildcardWithoutBypass;
          

          — so allowCreate / allowEdit / allowDelete stay true on its '*'.

          The derived variant IS in the array the injection walks: defaultPermissionSets
          inserts it directly after its parent, and SecurityPlugin's
          bootstrapPermissionSets defaults to that array
          (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
          what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
          variant is walked and skipped, not absent.

          And the derivation cannot inherit the injection later: it is a shallow copy
          taken at module load
          ({ ...(base.objects ?? {}) }), while the injection is an
          in-place mutation of the parent's objects at kernel:ready. Entries injected
          into organization_admin therefore never reach the variant.

          Why it matters

          The variant does carry the static baseline, because organization_admin's
          literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
          is exactly the one the registry-driven module exists to close: a schema that
          declares managedBy: 'better-auth' but is not in the hand-maintained
          BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
          organization_admin and nothing in organization_admin_no_bypass, where
          the wildcard then grants create / edit / delete on it.

          That is ADR-0092's drift, one posture over. And it is not an obscure posture:
          auto-org-admin-grant grants this variant precisely when the deployment
          enforces no organization wall, i.e. where the bits are least bounded.

          There is no gap today — the static list covers the 30 managed tables the
          tree currently declares. The gap opens on the next managedBy: 'better-auth'
          schema that lands without an edit to that list, which is the scenario the module
          was written for.

          Why it reads as an oversight rather than a decision

          The one set deliberately excluded from the target list is documented as such in
          the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
          unqualified wildcard so an admin can rescue data directly). The derived variant
          is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
          whose stated contract is the opposite: "everything else (object grants,
          managed-write denies, anti-escalation RBAC read-only rules, system
          permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
          only intended delta is the superuser bits". Carried over verbatim is true of the
          compile-time baseline and false of the registry union.

          Nothing pins it

          • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
            contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
            over objects/default-permission-sets.test.ts returns four, so the search is
            live).
          • default-permission-sets.test.ts's managed-denies pin iterates
            MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
            structurally unable to see a fifth set that should have been one.

          Options, not a recommendation to apply blind

          1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
            matches the module's stated intent. Needs a look at whether the variant's own
            sys_api_key-style explicit entries still survive (they should: the
            injection skips any object the set already names).
          2. Derive the variant AFTER the union instead of at module load, so
            "carried over verbatim" becomes true again. Larger, and it moves a
            module-load constant into kernel:ready ordering.
          3. Rule it deliberate and say so in the docblock, the way admin_full_access
            is. This is the option that needs a maintainer, not a dev: it means the
            wall-less variant is allowed to write identity tables the walled one cannot.

          Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
          to check membership — a list checked against itself is the reason this survived.

          Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
          prose only.

          Generated by Claude Code


          Generated by Claude Code

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

            Description

            @claude

            Found while correcting the managed-object-write-denies.ts docblock for #13822
            (PR #14028). Comment-only card; this is a behaviour observation deliberately
            left out of that PR and filed instead. Read from source on origin/main at
            c54d4d3d7; not reproduced against a running kernel.

            The gap

            MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
            applyManagedWriteDenies matches on it exactly:

            const targets = new Set(MANAGED_DENY_TARGET_SETS);
            ...
            if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
            

            organization_admin_no_bypass is not one of the four. It nevertheless holds a
            write-granting wildcard: deriveWallLessOrgAdmin (end of
            objects/default-permission-sets.ts) copies organization_admin and removes
            only the two superuser bits —

            const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
            (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
            // survive GitHub's body sanitizer
            objects['*'] = wildcardWithoutBypass;
            

            — so allowCreate / allowEdit / allowDelete stay true on its '*'.

            The derived variant IS in the array the injection walks: defaultPermissionSets
            inserts it directly after its parent, and SecurityPlugin's
            bootstrapPermissionSets defaults to that array
            (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
            what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
            variant is walked and skipped, not absent.

            And the derivation cannot inherit the injection later: it is a shallow copy
            taken at module load
            ({ ...(base.objects ?? {}) }), while the injection is an
            in-place mutation of the parent's objects at kernel:ready. Entries injected
            into organization_admin therefore never reach the variant.

            Why it matters

            The variant does carry the static baseline, because organization_admin's
            literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
            is exactly the one the registry-driven module exists to close: a schema that
            declares managedBy: 'better-auth' but is not in the hand-maintained
            BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
            organization_admin and nothing in organization_admin_no_bypass, where
            the wildcard then grants create / edit / delete on it.

            That is ADR-0092's drift, one posture over. And it is not an obscure posture:
            auto-org-admin-grant grants this variant precisely when the deployment
            enforces no organization wall, i.e. where the bits are least bounded.

            There is no gap today — the static list covers the 30 managed tables the
            tree currently declares. The gap opens on the next managedBy: 'better-auth'
            schema that lands without an edit to that list, which is the scenario the module
            was written for.

            Why it reads as an oversight rather than a decision

            The one set deliberately excluded from the target list is documented as such in
            the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
            unqualified wildcard so an admin can rescue data directly). The derived variant
            is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
            whose stated contract is the opposite: "everything else (object grants,
            managed-write denies, anti-escalation RBAC read-only rules, system
            permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
            only intended delta is the superuser bits". Carried over verbatim is true of the
            compile-time baseline and false of the registry union.

            Nothing pins it

            • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
              contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
              over objects/default-permission-sets.test.ts returns four, so the search is
              live).
            • default-permission-sets.test.ts's managed-denies pin iterates
              MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
              structurally unable to see a fifth set that should have been one.

            Options, not a recommendation to apply blind

            1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
              matches the module's stated intent. Needs a look at whether the variant's own
              sys_api_key-style explicit entries still survive (they should: the
              injection skips any object the set already names).
            2. Derive the variant AFTER the union instead of at module load, so
              "carried over verbatim" becomes true again. Larger, and it moves a
              module-load constant into kernel:ready ordering.
            3. Rule it deliberate and say so in the docblock, the way admin_full_access
              is. This is the option that needs a maintainer, not a dev: it means the
              wall-less variant is allowed to write identity tables the walled one cannot.

            Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
            to check membership — a list checked against itself is the reason this survived.

            Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
            prose only.

            Generated by Claude Code


            Generated by Claude Code

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

              Description

              @claude

              Found while correcting the managed-object-write-denies.ts docblock for #13822
              (PR #14028). Comment-only card; this is a behaviour observation deliberately
              left out of that PR and filed instead. Read from source on origin/main at
              c54d4d3d7; not reproduced against a running kernel.

              The gap

              MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
              applyManagedWriteDenies matches on it exactly:

              const targets = new Set(MANAGED_DENY_TARGET_SETS);
              ...
              if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
              

              organization_admin_no_bypass is not one of the four. It nevertheless holds a
              write-granting wildcard: deriveWallLessOrgAdmin (end of
              objects/default-permission-sets.ts) copies organization_admin and removes
              only the two superuser bits —

              const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
              (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
              // survive GitHub's body sanitizer
              objects['*'] = wildcardWithoutBypass;
              

              — so allowCreate / allowEdit / allowDelete stay true on its '*'.

              The derived variant IS in the array the injection walks: defaultPermissionSets
              inserts it directly after its parent, and SecurityPlugin's
              bootstrapPermissionSets defaults to that array
              (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
              what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
              variant is walked and skipped, not absent.

              And the derivation cannot inherit the injection later: it is a shallow copy
              taken at module load
              ({ ...(base.objects ?? {}) }), while the injection is an
              in-place mutation of the parent's objects at kernel:ready. Entries injected
              into organization_admin therefore never reach the variant.

              Why it matters

              The variant does carry the static baseline, because organization_admin's
              literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
              is exactly the one the registry-driven module exists to close: a schema that
              declares managedBy: 'better-auth' but is not in the hand-maintained
              BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
              organization_admin and nothing in organization_admin_no_bypass, where
              the wildcard then grants create / edit / delete on it.

              That is ADR-0092's drift, one posture over. And it is not an obscure posture:
              auto-org-admin-grant grants this variant precisely when the deployment
              enforces no organization wall, i.e. where the bits are least bounded.

              There is no gap today — the static list covers the 30 managed tables the
              tree currently declares. The gap opens on the next managedBy: 'better-auth'
              schema that lands without an edit to that list, which is the scenario the module
              was written for.

              Why it reads as an oversight rather than a decision

              The one set deliberately excluded from the target list is documented as such in
              the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
              unqualified wildcard so an admin can rescue data directly). The derived variant
              is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
              whose stated contract is the opposite: "everything else (object grants,
              managed-write denies, anti-escalation RBAC read-only rules, system
              permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
              only intended delta is the superuser bits". Carried over verbatim is true of the
              compile-time baseline and false of the registry union.

              Nothing pins it

              • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
                contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
                over objects/default-permission-sets.test.ts returns four, so the search is
                live).
              • default-permission-sets.test.ts's managed-denies pin iterates
                MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
                structurally unable to see a fifth set that should have been one.

              Options, not a recommendation to apply blind

              1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
                matches the module's stated intent. Needs a look at whether the variant's own
                sys_api_key-style explicit entries still survive (they should: the
                injection skips any object the set already names).
              2. Derive the variant AFTER the union instead of at module load, so
                "carried over verbatim" becomes true again. Larger, and it moves a
                module-load constant into kernel:ready ordering.
              3. Rule it deliberate and say so in the docblock, the way admin_full_access
                is. This is the option that needs a maintainer, not a dev: it means the
                wall-less variant is allowed to write identity tables the walled one cannot.

              Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
              to check membership — a list checked against itself is the reason this survived.

              Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
              prose only.

              Generated by Claude Code


              Generated by Claude Code

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029

                Description

                @claude

                Found while correcting the managed-object-write-denies.ts docblock for #13822
                (PR #14028). Comment-only card; this is a behaviour observation deliberately
                left out of that PR and filed instead. Read from source on origin/main at
                c54d4d3d7; not reproduced against a running kernel.

                The gap

                MANAGED_DENY_TARGET_SETS is an exact-match allowlist of four names, and
                applyManagedWriteDenies matches on it exactly:

                const targets = new Set(MANAGED_DENY_TARGET_SETS);
                ...
                if (!set || !targets.has((set as { name?: string }).name ?? '')) continue;
                

                organization_admin_no_bypass is not one of the four. It nevertheless holds a
                write-granting wildcard: deriveWallLessOrgAdmin (end of
                objects/default-permission-sets.ts) copies organization_admin and removes
                only the two superuser bits —

                const { viewAllRecords: _v, modifyAllRecords: _m, ...wildcardWithoutBypass } =
                (objects['*'] ?? {}) as ...; // Record cast elided: angle brackets do not
                // survive GitHub's body sanitizer
                objects['*'] = wildcardWithoutBypass;
                

                — so allowCreate / allowEdit / allowDelete stay true on its '*'.

                The derived variant IS in the array the injection walks: defaultPermissionSets
                inserts it directly after its parent, and SecurityPlugin's
                bootstrapPermissionSets defaults to that array
                (options.defaultPermissionSets ?? securityDefaultPermissionSets), which is
                what runBootstrap hands to applyManagedWriteDenies at kernel:ready. So the
                variant is walked and skipped, not absent.

                And the derivation cannot inherit the injection later: it is a shallow copy
                taken at module load
                ({ ...(base.objects ?? {}) }), while the injection is an
                in-place mutation of the parent's objects at kernel:ready. Entries injected
                into organization_admin therefore never reach the variant.

                Why it matters

                The variant does carry the static baseline, because organization_admin's
                literal spreads ...denyWritesOnManagedObjects() and the copy takes it. The gap
                is exactly the one the registry-driven module exists to close: a schema that
                declares managedBy: 'better-auth' but is not in the hand-maintained
                BETTER_AUTH_MANAGED_OBJECTS list gets an injected deny in
                organization_admin and nothing in organization_admin_no_bypass, where
                the wildcard then grants create / edit / delete on it.

                That is ADR-0092's drift, one posture over. And it is not an obscure posture:
                auto-org-admin-grant grants this variant precisely when the deployment
                enforces no organization wall, i.e. where the bits are least bounded.

                There is no gap today — the static list covers the 30 managed tables the
                tree currently declares. The gap opens on the next managedBy: 'better-auth'
                schema that lands without an edit to that list, which is the scenario the module
                was written for.

                Why it reads as an oversight rather than a decision

                The one set deliberately excluded from the target list is documented as such in
                the MANAGED_DENY_TARGET_SETS docblock (admin_full_access keeps its
                unqualified wildcard so an admin can rescue data directly). The derived variant
                is named nowhere in that rationale, nor in deriveWallLessOrgAdmin's docblock,
                whose stated contract is the opposite: "everything else (object grants,
                managed-write denies, anti-escalation RBAC read-only rules, system
                permissions, the 15 identity RLS carve-outs) is carried over verbatim" and "the
                only intended delta is the superuser bits". Carried over verbatim is true of the
                compile-time baseline and false of the registry union.

                Nothing pins it

                • managed-object-write-denies.test.ts and bootstrap-platform-admin.test.ts
                  contain no reference to the variant (git grep -n 'ORGANIZATION_ADMIN_NO_BYPASS\|no_bypass' over both: zero hits; the same grep
                  over objects/default-permission-sets.test.ts returns four, so the search is
                  live).
                • default-permission-sets.test.ts's managed-denies pin iterates
                  MANAGED_DENY_TARGET_SETS itself, so it asserts the four members and is
                  structurally unable to see a fifth set that should have been one.

                Options, not a recommendation to apply blind

                1. Add ORGANIZATION_ADMIN_NO_BYPASS to MANAGED_DENY_TARGET_SETS. One line,
                  matches the module's stated intent. Needs a look at whether the variant's own
                  sys_api_key-style explicit entries still survive (they should: the
                  injection skips any object the set already names).
                2. Derive the variant AFTER the union instead of at module load, so
                  "carried over verbatim" becomes true again. Larger, and it moves a
                  module-load constant into kernel:ready ordering.
                3. Rule it deliberate and say so in the docblock, the way admin_full_access
                  is. This is the option that needs a maintainer, not a dev: it means the
                  wall-less variant is allowed to write identity tables the walled one cannot.

                Whichever way it goes, the pin should stop iterating MANAGED_DENY_TARGET_SETS
                to check membership — a list checked against itself is the reason this survived.

                Filed unassigned, for triage. Behaviour-class, out of scope for #13822, which is
                prose only.

                Generated by Claude Code


                Generated by Claude Code

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions