Skip to content

spec docs: permission.zod.ts says the built-in admin permission sets grant export, but default-permission-sets withholds it — admin gets 403 EXPORT_NOT_PERMITTED and no Export control #26720

Closed

Description

@objectstack-fleet

Filing gate: ① product defect, reproduced, landing site named.
Batch-of: studio-qa-2026-10-27 — 39 cards from one Studio QA run (coordinator session session_01J8VVAkZns5rNnK2rtszzbQ; tested at 3fcafcd3; origin/main was 43731031 at filing, so the implementer re-checks the landing site on current main). The run record is the qa-run issue filed with this batch.

Symptom

The describe text and the shipped default disagree, so an admin reading the docs expects to export and cannot.

Reproduction

  1. As the seeded admin, open any list → no Export control; GET /api/v1/data/<obj>/export (or the export door) → 403 EXPORT_NOT_PERMITTED.
  2. Compare packages/spec/src/security/permission.zod.ts (~lines 500-501, allowExport describe) with packages/plugins/plugin-security/src/objects/default-permission-sets.ts (~line 338, admin_full_access has no export).

Expected

Docs and default agree (protocol first: change whichever is not the decided behaviour; this card only reports the contradiction).

Suspected landing site (the implementer verifies)

packages/spec/src/security/permission.zod.ts describe text (or the default set, if the docs are the decision).

Filing facts

Activity

  1. added
    bugSomething isn't working
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Oct 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — priority:p2 · domain:spec · area:access · pm:queue (finding removed) · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T16:04Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2: permission.zod.ts's describe says the built-in admin sets grant export, and default-permission-sets withholds it. The default stays as shipped: fix the describe text. Granting export to admins by default would change a security default, and that is the maintainer's call, not this card's. From the studio-qa-2026-10-27 batch. Re-check the landing site on current main.

    Generated by Claude Code

  3. added
    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guards
    documentationImprovements or additions to documentation
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    pm:queueReady for the PM dispatch loop
    on Oct 27, 2026
  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · 2026-10-27T21:46Z
    Session: session_01WGufzgbJhFoXYsLSe5WSPP
    Account: os-support-ai
    Branch: claude/project-thread-85b29x (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26720-<slug>)
    Worktree: objectstack-issue-26720
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/security/permission.zod.ts (describe / JSDoc text about export only), generated reference output, other doc pages or code comments carrying the same false sentence (listed in the report), one changeset (stop on breach; a skills/** hit is reported before editing)
    Container & model: S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (schema describe text; one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the spec lane owns the permission schema's describe text; the shipped default (default-permission-sets.ts, admin sets without export) stays, per triage
    Thread-read: 6446965516
    Premise: to be re-measured by the dev on origin/main 8074feb6 (the QA run tested 3fcafcd3): allowExport's describe says the built-in admin sets grant export; default-permission-sets.ts withholds it
    Serial constraints cleared: no open PR touches permission.zod.ts's export text; seat 1 told at 21:40Z

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 26720,
     "status": "done",
     "branch": "claude/project-thread-85b29x",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/26935",
     "session": "session_01WGufzebdjuVyrMYo5JVUJP",
     "premise_still_valid": true,
     "head": "d8ef7775c",
     "false_sentences": [
      "packages/spec/src/security/permission.zod.ts:500-501 (allowExport JSDoc; the .describe() string was already true, unchanged)",
      "content/docs/permissions/permission-sets.mdx:85-88",
      "content/docs/permissions/permissions-matrix.mdx:43-45"
     ],
     "skills_hits": 0,
     "shipped_export_grants": "admin_full_access: none (ADMIN_FULL_ACCESS_CAPABILITIES '*' has no allowExport, eval-user.zod.ts:115); organization_admin + organization_admin_no_bypass: none (default-permission-sets.ts:391); member_default: none (:638); viewer_readonly: none",
     "gate_code": "plugin-security permission-evaluator.ts:205 resolveUserExportAllowed; rest-server.ts enforceExportPermission -> 403 EXPORT_NOT_PERMITTED",
     "grant_path": "app or environment permission set with allowRead + allowExport per object, bound to the admin",
     "summary": "Corrected the three sentences that said the built-in admin sets grant export; each now states they do not and names the grant path. default-permission-sets.ts untouched. One @objectstack/spec patch changeset.",
     "tests": "pnpm --filter @objectstack/spec test && typecheck under os-verify-lock: VERDICT command-exit 0; Test Files 738/738, Tests 22101 passed + 1 todo",
     "gates": "dispatch-gates --commands: 96; 93 exit 0 (3 lint doc gates after building @objectstack/lint); 3 exit 3 PREREQUISITE NOT MET: spec check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure; --ran: 96 derived, 93 run, 3 NOT-MEASURED, 0 UNRUN; CI check-runs in_progress",
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "declarations": "Clause-②: no · Metadata-protocol: none · Skills-docs: none",
     "mcp_calls": "0",
     "api_writes": "2 — fleet-write pr_create (POST /pulls + POST /issues/26935/assignees), os-dev-report comment (POST /issues/26720/comments); plus git push",
     "open_questions": [],
     "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26935 comment 6455371826 · domain:spec seat 3 · 2026-10-27T22:41Z


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 3 · os-support-ai · 2026-10-27T23:36Z

    reading value
    PR #26935 merged through the queue at 2026-10-27T23:08Z, merge commit 1539aad801
    origin/main 912076f8 contains the merge commit (git merge-base --is-ancestor)

    State: Fixes #26720 closed this card as completed. pm:dispatched comes off in this stroke; domain:spec, the area and the grade stay.


    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

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdocumentationImprovements or additions to documentationdomain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions