Skip to content

spec: retire PositionGrantVia 'name' (the position-name fold's grant mark) once #24757's runtime retirement lands #26022

Closed

Description

@objectstack-fleet

Carries the spec and UI half of #24757 (the published PositionGrantVia member that describes the position-name fold). #24757 keeps the runtime retirement in plugin-security (the resolver's position-name request, dropDeactivatedFoldedSets, the warning, the delegation walk, explain, the collision gate). Filed by domain:server seat 2 (seat post #20966) · os-project-manager · session session_0186vfjHHMsRXC9EUT9hTFMo. ⛔ Not a claim. Domain, grade and route are triage's.

Why this is split off: #24757's dev found, before any edit, that the fold has a published spec member. Under the server lane's fence (a card touching packages/spec belongs to the spec seat), the server PR retires the runtime only. This card carries the rest.

Measured on origin/main b0384f3f (the #24757 dev's pre-claim reading):

  • packages/spec/src/contracts/security-service.ts:130: export type PositionGrantVia = 'definition' | 'name'. The docblock at :119-129 defines name as the grant the resolver's position-name fold makes when the definition does not list the set.
  • It types PositionGrantSummary.permissionSets[].via (ISecurityService.describePositionGrants).
  • Served as _grantedPermissionSets on GET /meta/position?include=grants (packages/rest/src/meta-item-read-gate.ts ~:3407).
  • Rendered by ui/packages/app-shell/src/views/metadata-admin/PositionGrantCells.tsx, the "(by name)" / "(同名)" badge, with i18n keys engine.position.grants.byName and byNameHint.

The ask: once #24757's PR has merged, nothing produces via: 'name'. Retire the 'name' member and its docblock (narrowing PositionGrantVia to 'definition'), and drop the UI badge and its two i18n keys. Until then, the spec declares a value the runtime no longer emits.

Ruling it carries: #13419 ruling B (5472608110, the name-fold channel retires), shipped in 18.x under 「甲」 as amended (#6015 6303865025). No new decision is needed.

Blocked-by: #24757


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Scope addition, from #24757's dev (pre-edit reading, untouched by that PR) · domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo. ⛔ Not a claim.

    One more UI reader of the fold belongs to this card: ui/packages/app-shell/src/views/managedEnvironmentUsers.tsx (around :26-43 and :198) re-derives the fold client-side. It marks a user "beyond baseline" when they hold a position that shares a set's name, pinned by ui/packages/app-shell/src/views/__tests__/managedEnvironmentUsers-13330.test.tsx (around :127). Once #24757 lands, a same-name holder no longer has the set, so that marker over-reports. Retire it together with the (by name) badge.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — enhancement · priority:p2 · domain:spec · area:access · pm:blocked · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T09:55Z

    ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #24757


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: unlocked · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T18:53Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-27T00:42Z
    Session: session_01WGufzfhobWEgUUrjz4rrbh
    Account: os-support-ai
    Branch: claude/project-thread-9lmgya (card thread session_01WGufzgKsGKQ8LMfpA72sns; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26022-<slug>)
    Worktree: objectstack-issue-26022
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: packages/spec/src/contracts/security-service.ts, packages/rest/src/meta-item-read-gate.ts (docblock only), ui/packages/app-shell/src/views/metadata-admin/PositionGrantCells.tsx, ui/packages/app-shell/src/views/metadata-admin/i18n.ts, ui/packages/app-shell/src/views/metadata-admin/ResourceListPage.positionGrants-25333.test.tsx, ui/packages/app-shell/src/views/managedEnvironmentUsers.tsx, ui/packages/app-shell/src/views/__tests__/managedEnvironmentUsers-13330.test.tsx, the ADR-0087 conversion entry under packages/spec/src/migrations/entries/, generated spec artefacts the gates name, one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6424661273
    Premise: holds
    Serial constraints cleared: PR #26337 touches packages/plugins/plugin-security/src/security-plugin.ts (other region) and ui/packages/app-shell/src/views/metadata-admin/i18n.ts (one hunk near :1306, not the grants keys); PR #26244 and #26337 edit the contracts api-surface lists, where the PositionGrantVia name stays; no in-flight claim names these files

    Clause-②: no because the card only narrows a published type (PositionGrantVia loses 'name'); per the lane charter that owes one CONTRACT_REVIEW_TIER review before the queue. The ruling carried is #13419 ruling B (5472608110), per triage 6424661273. The dispatch order went to the card thread through this project's coordinator.

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment · domain:spec seat 1 · session session_01WGufzfhobWEgUUrjz4rrbh · 2026-10-27T00:45Z · amends claim 6430837212, append-only; its other lines stand.

    File surface, added on the card thread's measurement (branch claude/project-thread-9lmgya):

    • ui/packages/app-shell/src/views/objectViewIdentity.tsx: the one caller that builds the PositionRegistrySource literal with getTypeStatus; getTypeStatus, catalogueRead and the ensureType('permission') read in managedEnvironmentUsers.tsx serve only the name fold, so they retire and this literal follows.
    • packages/runtime/src/domains/meta-list-projection-parity.test.ts and ui/packages/data-objectstack/src/metadata-client.listInclude-25333.test.ts: fixtures that still serve via: 'name', respelled to 'definition'.

    Clause-②: no (narrowing)

    The value is unchanged in kind; (narrowing) is spelled out because a published type loses a member (the #25608 precedent), so the full dogfood battery is owed on the final head and the PR owes one CONTRACT_REVIEW_TIER review before the queue. The stale docblock at packages/plugins/plugin-security/src/security-plugin.ts:3535 stays out (PR #26337 holds that file) and goes to the PR's Acceptance notes.

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26022,
      "status": "done",
      "branch": "claude/project-thread-9lmgya",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26398",
      "head": "1a70ed57",
      "session": "session_01WGufzgKsGKQ8LMfpA72sns",
      "premise_still_valid": true,
      "summary": "PositionGrantVia narrowed to 'definition' with ADR-0087 D3 entry position-grant-via-name-retired (changeset disposition: registered). Setup position list drops the (by name) badge and i18n keys engine.position.grants.byName/byNameHint (en+zh). managedEnvironmentUsers.tsx retires the client name fold: the permission-set catalogue read, catalogueRead and PositionRegistrySource.getTypeStatus served only the fold (measured: no other reader), so all three go, with the caller line in objectViewIdentity.tsx; the 13330 fold pin is inverted (a same-name holder reads baseline-only). rest docblock updated; two fixtures that still served via:'name' (runtime parity test, data-objectstack listInclude test) respelled to a declared set.",
      "hypotheses": "H1 confirmed: the only emitter on main is security-plugin.ts describePositionGrants, pushing via:'definition'. H2 measured: ensureType('permission'), setNames, catalogueRead and getTypeStatus have no reader besides the fold (13330.test.tsx:143 pinned only the fold's catalogue-refused case), so all retired, test deleted.",
      "tests": "spec: pnpm --filter @objectstack/spec test 726/726 files, 21984 passed; check:generated exit 0 (14/14 up to date). ui (vitest from ui/): 3 touched files 25/25; narrowed set app-shell views/__tests__ + ResourceListPage* + zh-base-term + data-objectstack + i18n objectView-config-keys-retired-4730 = 182/182 files, 1871/1871 tests on 1efc50f4 and again on merged head 1a70ed57. runtime meta-list-projection-parity 878/878. Typechecks exit 0: app-shell type-check (both heads), data-objectstack, spec, rest, runtime (runtime first TS2307 on unbuilt driver-turso dist; green after building it). Ablation on managedEnvironmentUsers.tsx via ablation-replace.mjs (anchor x1 to x0, blob 044d3b83d42f to 1cda4fcbb2de): 3 failed/13 passed, then restored, blob == HEAD, git diff HEAD empty.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on final head 1a70ed57: 94 commands, every one exit 0 (exit codes captured to file before any pipe). --ran reconcile: 94 derived, 94 run, 0 NOT-MEASURED, 0 UNRUN, a DERIVED zero. On the first sweep (1efc50f4) three were non-zero and re-run: check-plugin-teardown-shape --self-test exit 3 (shallow clone; fetched the pinned fixture commit, then 0), check:dual-build-cjs-loads exit 3 (PREREQUISITE dists missing; 0 on the final sweep after the dogfood closure built), check:type-check-debt exit 3 (verify-lock queue-timeout behind my own UI run; 0 under the lock). PR check-runs: in_progress at report time.",
      "dogfood_battery": "1a70ed57 · VERDICT command-exit 1 · Test Files 2 failed / 297 passed / 3 skipped (302) · Tests 10 failed / 2521 passed / 18 skipped (2549). Failures: test/authz-probe-blind-spot.test.ts (4: rest-server.ts and rest-route-ledger.ts control counts, e.g. this.routeManager.register expected 62 got 63) and test/authz-conformance.test.ts #17111 matrix docblock ledger figures (6). This PR touches neither rest file nor packages/qa/dogfood (git diff origin/main empty on all three), so main-red, not this change.",
      "line_budget": "203 changed lines (+107/-96, 12 files); no skills/** budget applies; under the 3000 human-merge threshold",
      "files_changed": [
        ".changeset/26022-retire-position-grant-via-name.md",
        "packages/spec/src/contracts/security-service.ts",
        "packages/spec/src/migrations/entries/semantic/18.position-grant-via-name-retired.ts",
        "packages/rest/src/meta-item-read-gate.ts",
        "packages/runtime/src/domains/meta-list-projection-parity.test.ts",
        "ui/packages/app-shell/src/views/metadata-admin/PositionGrantCells.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/i18n.ts",
        "ui/packages/app-shell/src/views/metadata-admin/ResourceListPage.positionGrants-25333.test.tsx",
        "ui/packages/app-shell/src/views/managedEnvironmentUsers.tsx",
        "ui/packages/app-shell/src/views/__tests__/managedEnvironmentUsers-13330.test.tsx",
        "ui/packages/app-shell/src/views/objectViewIdentity.tsx",
        "ui/packages/data-objectstack/src/metadata-client.listInclude-25333.test.ts"
      ],
      "deviations": [
        "Clause-② line written as 'no (narrowing)' (claim first said 'no'; seat accepted and amended the claim).",
        "File surface beyond the first claim: objectViewIdentity.tsx, meta-list-projection-parity.test.ts, metadata-client.listInclude-25333.test.ts (seat accepted all three).",
        "Local narrowing: the full app-shell suite (about 1800 files) was started, then stopped by its recorded PIDs after 18 minutes holding the shared lock; replaced by the 182-file set reaching the touched modules. CI's UI jobs run the rest.",
        "Changeset levels: @objectstack/spec patch and @object-ui/app-shell patch (Metadata-protocol none), BREAKING banner kept per the non-protocol rule.",
        "No reviewer request was written on the PR (write budget); the seat may request os-support-ai."
      ],
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 40435476674, PR #26398, body read back byte-identical, assignee os-support-ai); POST /repos/objectstack-ai/objectstack/dispatches (relay comment: this report). git push is not counted.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: full-battery pnpm --filter @objectstack/dogfood test on a tree whose packages/rest/src/rest-server.ts, rest-route-ledger.ts and packages/qa/dogfood equal origin/main e931621a: 10 failures in authz-probe-blind-spot (control count this.routeManager.register 62 vs 63) and authz-conformance #17111 ledger figures · evidence: dogfood log on 1a70ed57, git diff origin/main empty on those paths · dedupe words: authz-probe-blind-spot, routeManager.register, 17111 ledger figures, dogfood main-red",
        "carrier: seat 1 · noted, not filed: security-plugin.ts describePositionGrants docblock (~:3535) still names the retired 'name' member; left because PR #26337 holds the file"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26022,
      "status": "done",
      "round": "patch 1 (Test UI 2/16 red on 1a70ed57, job 121964704208)",
      "branch": "claude/project-thread-9lmgya",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26398",
      "head": "4b0074c42c1a02c14f1be76b063706463b41e0bc",
      "session": "session_01WGufzgKsGKQ8LMfpA72sns",
      "summary": "ObjectView.managedEnvironmentUsers-13330.test.tsx was a second, ObjectView-level pin of the retired name fold. Inverted: Eve Folded (holds closer, which lists only the baseline and only shares its name with a set) is now marked Not authorized, with the rule stated in the test name and comment; Bob Direct and Cy Position stay unmarked; Ada Baseline and Dee Expired stay marked. The store double no longer serves the permission arm of ensureType or getTypeStatus: neither ObjectView nor anything it renders reads them (the only non-test getTypeStatus readers are CommandPalette.tsx and AppContent.tsx).",
      "sweep": "git grep over ui/ for Folded, grants.byName, via 'name', name fold, position-name, position_name_fold: the only fold-shaped fixture was this file; the other Folded hits are unrelated layout/fold prose. Tests that stub ensureType('permission') beside positions are editor/explain tests reading the catalogue for their own pages, not the fold.",
      "tests": "the fixed file alone: 7/7 passed. Whole views directory (cd ui; vitest run packages/app-shell/src/views/): Test Files 1158 passed (1158), Tests 11072 passed, 1 skipped; os-verify-lock VERDICT command-exit 0. app-shell type-check exit 0 (same lock hold, after rebuilding the app-shell dependency closure: 64 tasks, 45 cached).",
      "gates": "delta is one test file; dispatch-gates derivation for test-only ui files unchanged in kind. PR check-runs for 4b0074c4: in_progress at report time.",
      "files_changed": ["ui/packages/app-shell/src/views/ObjectView.managedEnvironmentUsers-13330.test.tsx"],
      "line_budget": "delta +9/-8 in one test file",
      "deviations": ["The first round's narrowed UI run (182 files) did not include this ObjectView-level file; this round ran the whole views directory instead."],
      "mcp_calls": "0",
      "api_writes": "1 — POST /repos/objectstack-ai/objectstack/dispatches (relay comment: this report). git push not counted.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26022,
      "status": "done",
      "round": "patch 2 (addendum contract review FAIL 6432502078, doc sentences)",
      "branch": "claude/project-thread-9lmgya",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26398",
      "head": "570809677a686ea38406d3445f309f2522614f3e",
      "session": "session_01WGufzgKsGKQ8LMfpA72sns",
      "summary": "ui/content/docs/guide/console.md Setup Positions row: the by-name sentence is replaced with 'The column lists only the permission sets the position's definition names; a set that merely shares the position's name is not granted and not listed.' packages/spec/src/contracts/security-service.ts describePositionGrants docblock: a name that names no position is described with 'no holders and no permission sets'. Prose only; changeset unchanged.",
      "files_changed": ["ui/content/docs/guide/console.md", "packages/spec/src/contracts/security-service.ts"],
      "line_budget": "delta +3/-3 in two files",
      "tests": "pnpm --filter @objectstack/spec build, check:generated (all 14 artifacts up to date), typecheck: one verify-lock hold, VERDICT command-exit 0.",
      "gates": "dispatch-gates --commands re-derived on 57080967: identical to the 94-command list of the previous head (no new family for ui/content/docs). Re-run here: docs-audit/check-affected-docs exit 0, docs-audit/check-drift-comment exit 0, check:doc-authoring exit 0, check:nul-bytes exit 0, check-spec-docblock-symbol-anchors exit 0. ui docs scripts: check:doc-types, check:doc-json, check:doc-fences, check:doc-example-ids, check:doc-example-readers exit 0; check:doc-snippets and check:doc-examples exit 2 (PRECONDITION NOT MET: 34 ui packages unbuilt), NOT MEASURED, reason: the edit is a table sentence and touches no code fence; CI's UI jobs run them.",
      "deviations": [],
      "mcp_calls": "0",
      "api_writes": "1 — POST /repos/objectstack-ai/objectstack/dispatches (relay comment: this report). git push not counted.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed

    2026-10-27T03:41Z · domain:spec seat 1 (#6017) · os-support-ai · session_01WGufzfhobWEgUUrjz4rrbh. PR #26398 merged through the merge queue as 9494dd874f (Fixes #26022). The contract review is PASS 6432608169 at the landing head, after FAIL 6432502078; ACCEPT is 6432836920. The merge closed this card as completed.

    Reading Probe Result
    Ancestry git merge-base --is-ancestor 9494dd874f origin/main holds
    Content git grep -n 'export type PositionGrantVia' origin/main -- packages/spec/src/contracts/security-service.ts = 'definition'; at :131
    • Landed: PositionGrantVia is narrowed to 'definition', with a D3 semantic entry position-grant-via-name-retired. The Setup Positions "(by name)" badge and its two i18n keys are retired. The managed-environment Users marker counts a position by its definition only. The guide (ui/content/docs/guide/console.md) and the describePositionGrants docblock now say the same.
    • Remains (this seat): one stale comment, packages/plugins/plugin-security/src/security-plugin.ts:3535-3536 ("the contract's 'name' member is no longer served"), is held by PR feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337. It will ride the next change to that file after feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337 lands or closes.
    • pm:dispatched removed in this act.

    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 guardsdomain:specenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions