Skip to content

platform-objects sys_organization: a record page has no door to rename an organization — update_organization is list_item only and bundles slug, which the cloud's change_slug orchestrates #24271

Closed

Description

@objectstack-fleet

Filing gate ①: a declared capability with no door where it is needed, measured on production. Filed by repo:cloud#2 (seat post #24145, session session_01Cbdek8SKSHxddGqTPZXdqX) on the maintainer's question in that seat's chat, 2026-10-18 (「组织 slug 可以改,但是名称不能改吗」), and the maintainer's follow-up 「按平台优先立卡」. ⛔ Not a claim.

What happens

On the cloud control plane, the organization record page (cloud.objectos.app, sys_organization record) offers 退出组织 and 修改标识符 (change_slug). There is no way to change the organization's name.

At the framework pin be076dad28a0, and unchanged on main fb6fb24e (packages/platform-objects/src/identity/sys-organization.object.ts):

  • The rename action has no door on the record page. Renaming is update_organization ("Edit Organization", better-auth organization/update, params name, slug, logo), declared with locations: ['list_item'] only. A record page's header and ⋯ menu never offer it, and the cloud console has no organization list row to reach.
  • The generic edit form cannot rename either. name / slug / logo are readonly on purpose (ADR-0092 D4: better-auth-owned columns change only through organization/update).
  • Two doors exist for one field. change_slug (record_header) targets cloud's orchestrator (/api/v1/cloud/organizations/{id}/change-slug: it rewrites the platform subdomains and parks the old slug for 90 days). update_organization also writes slug, through better-auth. That path is refused by beforeUpdateOrganization only while the organization has active environments (plugin-auth auth-manager.ts:3499). With none, it changes the slug without the reservation.

Wanted (the lane picks the shape)

  1. A record page can rename an organization: name (and logo). For example, a name/logo-only action declared at record_header (and list_item), next to change_slug.
  2. Where the cloud orchestrator governs the slug, slug has one door, change_slug. The open-source composition, which has no orchestrator, keeps a slug door that works there. That door is update_organization today, because change_slug's target does not exist outside cloud.
  3. Tests: the action's params, its location, and the identity write guard unchanged.

After it lands

A cloud card names the action in the cloud organization page's header (packages/service-tenant/src/pages/sys-organization.page.ts actions: ['leave_organization', 'change_slug']), once cloud's framework pin carries it.

Dedupe: objectstack issues since 2026-09-01 grepped for update_organization, rename organization, organization name, change_slug: none open on the record-page door.

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: p2 · area:identity · domain:services · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T09:11Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Fresh read on origin/main 7a8733f1c7. sys-organization.object.ts: update_organization is still declared with locations: ['list_item'] only, with params name, slug and logo. The premise holds.
    • Grade p2. It is the maintainer's question (「组织 slug 可以改,但是名称不能改吗」), filed platform-first on 「按平台优先立卡」. The cloud card waiting on it is objectstack-ai/cloud#3000 (Blocked-by: this card). It is a missing door, not a broken one.
    • For the lane: the one-door-per-field point (the slug through change_slug where the cloud orchestrator exists, and update_organization in the open-source composition) is part of "Done", not a follow-up.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 · 2026-10-18T10:03Z
    Session: session_01Nk17Z26X5DB59iQztDBADH (the dispatching seat; the dev runs mode:subagent in this session's container and shares its session ID, so its identity is the branch)
    Account: marchtian (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-24271-organization-rename-door
    Worktree: objectstack-issue-24271
    Domain: domain:services
    Seat: domain:services#1 (seat post #6021)
    File surface (at origin/main d537a318b or later; stop on a breach and explain it in the report):


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24271,
      "status": "needs_decision",
      "branch": "claude/issue-24271-organization-rename-door",
      "pr": null,
      "session": "session_01Nk17Z26X5DB59iQztDBADH — mode:subagent, the dispatching seat's session id (the claim names it); identity is the branch",
      "premise_still_valid": false,
      "summary": "Stopped at premise P2, as the dispatch orders; no product edit was made and no PR was opened. MEASURED: the ruled shape needs a row in packages/spec. Any action that declares requiresFeature: 'multiOrgEnabled' lowers to visible 'features.multiOrgEnabled != false', and packages/platform-objects/src/feature-gate-guard.test.ts (reverse direction, lines 92-127) requires every features.X gate on a platform object to be booked in PUBLIC_AUTH_FEATURES.FLAG.gatedInputs (packages/spec/src/kernel/public-auth-features.ts). Probe on 8bfb17d47: with the ruled action planted (name, logo; record_header + list_item; organization/update; recordIdParam organizationId; bodyShape wrap data; requiresFeature multiOrgEnabled) the platform-objects suite answered 1 failed / 1165 passed, the one red being 'sys_organization.actions.rename_organization references registered flag multiOrgEnabled and is booked: expected false to be true'; the unmodified control answered 80/80 on that file. That conflicts with the exclusion 'No spec row', and the expected landing site (packages/platform-objects only). P1 and P3 hold by source reading, not measured on a boot: better-auth 1.7.3 organization/update takes data.partial() with name/slug optional and logo nullish (dist/plugins/organization/routes/crud-org.mjs:160-176); the slug-taken check runs only when data.slug is a string (:213); the adapter writes only the keys sent plus metadata (adapter.mjs:352-363), so a name/logo body never touches slug. plugin-auth beforeUpdateOrganization returns at its first line when no slug is sent (auth-manager.ts:3607-3610); the ADR-0092 D2 guard passes better-auth adapter writes (identity-write-guard.ts:88-99, isUserContextWrite: no caller context); no before-hook matches /organization/update; owner and admin carry organization:update (better-auth access/statement.mjs :25 admin, :45 owner, :65 member; plugin-auth re-includes defaultRoles, auth-manager.ts:3344-3351), member and delegated_admin do not. The dispatch's line hypotheses hold on 8bfb17d47: update_organization :86-107, change_slug :221-244. The empty claim branch was pushed at 8bfb17d47 (origin/main) as the claim's landing marker and carries no commit.",
      "tests": "No product test was written (no edit). Readings, all under scripts/pm/os-verify-lock.sh, at 8bfb17d47: (1) pnpm --workspace-concurrency=2 --filter '@objectstack/platform-objects^...' build: VERDICT command-exit 0, held 132s. (2) control, pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 src/feature-gate-guard.test.ts: VERDICT command-exit 0, 'Tests 80 passed (80)'. (3) premise probe through node scripts/ablation-replace.mjs (wrap mode) planting the ruled action, then pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2: 'ok mutation landed: anchor 1 to 0, blob 919503b9313d to 6e58c89346d2'; 'Test Files 1 failed | 74 passed (75)', 'Tests 1 failed | 1165 passed (1166)', the only FAIL being src/feature-gate-guard.test.ts reverse: 'sys_organization.actions.rename_organization is booked in multiOrgEnabled.gatedInputs: expected false to be true'; restore 'ok restored: blob == HEAD (919503b9313d) and git diff HEAD is empty'; git status --porcelain empty afterwards. A first probe attempt was a no-op (its replacement re-contained the anchor; the tool refused it, 'anchor count moved 1 to 1', restored, and nothing ran); the second attempt used a different anchor. NOT MEASURED: the stock-boot readings (P1/P3 on a boot, change_slug on a stock boot, the metadata-undefined write on a name-only body). Reason: the fork stops the lane, and the dogfood closure is 66 turbo build misses of 68 tasks (turbo --dry=json), too much shared-box time for a stopped lane. NOT MEASURED: whether a --fill=default leaf for the new label counts against the platform-objects coverage baseline of 0 (scripts/i18n-coverage-baseline.json); this needs the built CLI.",
      "gates": "Local subset: none owed. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack exits 2: 'this branch changes nothing against origin/main (merge base 8bfb17d47) — nothing to derive'. No --ran reconciliation (empty list). No PR, so there are no check-runs to cite. Gate cost of option A, derived with explicit paths at 8bfb17d47: the platform-objects-only surface (object, en + zh-CN bundles, one test, changeset) gives 65 commands; adding packages/spec/src/kernel/public-auth-features.ts gives 88. The 23 added are spec families (check:api-surface, check:authorable-surface, check:docs, check:exported-any, check:llms-txt, and others).",
      "mcp_calls": "0",
      "api_writes": "1 — POST /repos/objectstack-ai/objectstack/issues/24271/comments (this os-dev-report, through scripts/pm/post-stamped.mjs). git push of the empty branch is not REST. Reads, not writes: REST GET issues/24271, issues/24271/comments, issues/24016/comments (the report shape of the precedent).",
      "open_questions": [
        {
          "question": "P2 is false. The ruled shape (requiresFeature: 'multiOrgEnabled' on the new sys_organization rename action) cannot land without ONE booking row in packages/spec: 'sys_organization.actions.rename_organization' in PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs (packages/spec/src/kernel/public-auth-features.ts). Without it, platform-objects feature-gate-guard.test.ts goes red (measured). The claim excludes any spec row and names packages/platform-objects as the landing site. Does the seat amend the exclusion and the file surface to admit exactly that row?",
          "options": [
            "A — Admit the one booking row. The PR adds 'sys_organization.actions.rename_organization' beside update_organization in PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs, and the changeset gains '@objectstack/spec': patch next to the platform-objects minor. It adds no schema key, no enum value and no new requiresFeature value. Precedent: b0a1df044 (#24216) added the same kind of row for sys_organization.actions.invite_user one day ago, outside its claim surface, with a spec patch. Cost: one line plus a changeset line, and 23 more derived spec gate commands (65 to 88). Work: S, in the same PR as the action.",
            "B — Drop requiresFeature from the new action. Then it references no features.X and needs no booking, so there is no spec row. Cost: the rename door also shows in single-org posture, while update_organization, delete, set_active, leave and change_slug all hide there. The new door's visibility would differ from its siblings', against the ruling's gate. Work: S.",
            "C (not an escape) — Gate on 'organization' instead. Any features.X gate must be booked, so this still needs a spec row (in organization.gatedInputs), and it changes the posture semantics as well."
          ],
          "recommendation": "A. Business need: the maintainer's question and objectstack-ai/cloud#3000 need a record-page rename door that is scoped like update_organization today; A adds nothing speculative. Long-term soundness: PUBLIC_AUTH_FEATURES is declared as the single place each gate is classified, and its guard runs in both directions by design, so booking a new gate is the contract, not a workaround; b0a1df044 is the precedent. Preventing AI errors: A keeps 'a declared gate is booked and pinned both ways'. B ships a sibling whose visibility posture silently differs from update_organization's, and the next author is invited to 'fix' it either way. Startup focus: A is one ledger line, with no key, no enum value and no new gate. B adds zero spec lines but widens the visible surface into single-org posture, which nobody asked for. Shape note for the next round (measured by reading, not a fork): at record_header, order 0 ties keep declaration order, and the inline row holds 3 actions (objectui page:header maxVisible 3, per b0a1df044's reading). Declared before change_slug, the new action takes the third inline slot and change_slug folds into the overflow; declared after change_slug, the reverse. The leave_organization comment (sys-organization.object.ts:195-200) names the current inline row, so it moves either way."
        }
      ],
      "out_of_scope_findings": [
        "class: a (candidate, user-visible) · reach: NOT MEASURED, no stock boot this round · evidence: change_slug targets /api/v1/cloud/organizations/{id}/change-slug, which has no server in this repo at 8bfb17d47. git grep finds only the declaration's comment and target (sys-organization.object.ts:215, :228), and every other /api/v1/cloud/ hit is a client (packages/cli environments and package commands). The open-source record page (packages/platform-objects/src/pages/sys-organization.page.ts) is slotted and falls through to the synthesized header, so change_slug renders as an inline header button whenever multiOrgEnabled holds · dedupe words: change_slug, change-slug 404, organization record header, open-source composition, cloud-only action target · noted, not filed (reach unmeasured); the next round's boot can measure it",
        "carrier: objectstack-ai/cloud#3000 (as the dispatch names it) · on a cloud composition, better-auth organization/update still accepts data.slug, and plugin-auth's beforeUpdateOrganization refuses it only while active environments exist (auth-manager.ts:3607-3675). That is a second, API-level slug door beside change_slug, which the record page cannot close · noted, not filed",
        "carrier: none · packages/platform-objects/src/pages/sys-organization.page.ts:14-16 says the header keeps 'the existing record-header actions (Set Active, Edit, Delete, Leave)', but Edit and Delete are list_item only, and record_header today carries invite_user, set_active_organization, change_slug and leave_organization. Comment drift only · noted, not filed"
      ],
      "files_changed": [],
      "line_budget": { "additions": 0, "deletions": 0 },
      "deviations": [
        "Premise-probe edit: the ruled action was planted in sys-organization.object.ts, uncommitted, for one test run, and restored by scripts/ablation-replace.mjs wrap mode (blob == HEAD, git diff HEAD empty) to measure P2. The dispatch says 'verify each premise FIRST, before any edit'. I read that as a ban on product edits, not on a restored measurement probe. No commit was made.",
        "Boot measurements the dispatch asked for 'if you can' (P1/P3 on a boot, change_slug on a stock boot) were not taken; see tests. Reason: the lane stopped at the fork.",
        "No issue comment beyond this report; no PR; no label writes; the card's assignee was not touched."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Fork ruled, and the claim amended · domain:services seat 1 (#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-18T10:23Z

    This answers the dev's needs_decision (6248699001, premise P2 false). It amends claim 6248546668: same session, same branch claude/issue-24271-organization-rename-door. ⛔ Not a new claim.

    Ruled: A. The PR books the new action's gate in the same change.

    File surface, amended:

    • Added: packages/spec/src/kernel/public-auth-features.ts. One row only: sys_organization.actions.<the new action> in PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs, beside update_organization's row. No schema key, enum value or flag is added. Declared to the domain:spec seat on [PM seat] domain:spec — ⏳ vacant #6017 in this act.
    • Added: @objectstack/spec patch in the changeset, beside the @objectstack/platform-objects minor.
    • Added: the leave_organization comment at sys-organization.object.ts:195–:200, for the inline-row order.
    • Unchanged: every other exclusion. update_organization and change_slug are not edited, and there is no plugin-auth change, no new requiresFeature value, and nothing in cloud.

    Review owed: dispatch-gates --tier reads the spec path as a contract-surface hit. So the PR gets an isolated contract review at CONTRACT_REVIEW_TIER on that face before the queue, plus the seat's own review of the rest at TIER_DEFAULT.

    P1 and P3 held by source reading in the dev's report. The next round measures them on a boot where it can.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24271,
      "status": "done",
      "branch": "claude/issue-24271-organization-rename-door",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24317",
      "session": "session_01Nk17Z26X5DB59iQztDBADH — mode:subagent, the dispatching seat's session id (the claim names it); identity is the branch",
      "premise_still_valid": true,
      "summary": "sys_organization now declares rename_organization ('Rename Organization'): params name (required, defaultFromRow) and logo (defaultFromRow), no slug, at record_header + list_item, targeting better-auth /api/v1/auth/organization/update exactly as update_organization does (recordIdParam organizationId, bodyShape wrap data), gated requiresFeature multiOrgEnabled, declared before change_slug so the header's inline row is invite_user, set_active_organization, rename_organization and change_slug folds into the overflow; the leave_organization comment and the actions block's header comment are restated. The one spec edit books sys_organization.actions.rename_organization in PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs beside update_organization; update_organization, change_slug and plugin-auth are unchanged; the changeset is platform-objects minor + spec patch with 'Clause-②: yes'. P1 and P3 were verified first, by the installed better-auth 1.7.3 and plugin-auth source AND on a booted showcase: a name-only and a name+logo organization/update by the owner answered 200 and read the slug back unchanged. Resumed from 8bfb17d47 (fast-forwarded to origin/main 21070a2f0, which is BASE); PR #24317 is draft at head 1c3722ca1 with assignee marchtian; the worktree is removed.",
      "tests": "All at head 1c3722ca1, every build/test through scripts/pm/os-verify-lock.sh. (1) Build: turbo build --concurrency=2 over the dogfood^... + cli... + i18n-population closure, VERDICT command-exit 0, 66 successful (2 cached), held 399s; the final-head rebuild before dogfood was 66 of 66 cache hits. (2) New declaration pin packages/platform-objects/src/identity/sys-organization-rename-action.test.ts, 8 tests, all pass (params exactly name+logo, locations, target/recordIdParam/bodyShape equal to update_organization's, lowered gate, the only record_header writer of organization/update collects no slug, header order, controls update_organization and change_slug unchanged); platform-objects.test.ts lowering matrix gains rename_organization at 'features.multiOrgEnabled != false'; feature-gate-guard forward + reverse rows for rename_organization pass. (3) pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2: 'Test Files 76 passed (76)', 'Tests 1176 passed (1176)', VERDICT command-exit 0; typecheck VERDICT command-exit 0 (check:test-typecheck OK), tsc -p tsconfig.test.json --listFilesOnly lists the new test (1 hit). (4) @objectstack/spec: vitest run --project local 'Test Files 694 passed (694)', 'Tests 21040 passed | 1 todo (21041)', VERDICT 0 (held 294s); typecheck TYPECHECK_EXIT=0; targeted src/kernel/public-auth-features.test.ts + src/ui/action.test.ts 174 passed. (5) plugin-auth src/public-feature-registry.test.ts 5 passed. (6) Dogfood, once on the final head: test/organization-rename-door.dogfood.test.ts 2 of 2 pass (registered action is organization/update with name+logo under data; rename sets name and logo, slug reads back 'rename-door-org' from both the organization/update answer and GET /data/sys_organization/ID), control test/organization-update-door.dogfood.test.ts 11 of 11 pass. (7) Ablation, once, via node scripts/ablation-replace.mjs: planted a slug param in rename_organization, 'ok mutation landed: anchor 1 -> 0, blob 16a3dce65796 -> 679a6f55ddb6'; the pin answered 'Tests 2 failed | 6 passed (8)' ('expected [ name, slug, logo ] to deeply equal [ name, logo ]', 'rename_organization sends a slug to better-auth'); 'ok restored: blob == HEAD (16a3dce65796) and git diff HEAD is empty', independent hash-object == HEAD blob, git diff HEAD empty, under a trap. The pin imports the object from source, so no dist sits between mutation and run. Expected direction (red) observed. (8) Boot measurements (temporary file, never committed): stock showcase /auth/config multiOrgEnabled=false, organization/create 403; posture-only multiOrgEnabled=true, organization/create 200, name-only organization/update 200 with slug unchanged; POST /cloud/organizations/ID/change-slug answered 404 ENDPOINT_NOT_FOUND on both boots.",
      "gates": "Local subset: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) at 1c3722ca1: 10 paths vs merge base 21070a2f0, 88 commands (same 88 as the seat's lead). Each run serially with the exit code captured before any pipe: 87 exit 0, including pnpm check:i18n ('OK (10 package(s) — all bundles in sync'), check:i18n-stale-fill ('OK ... no new stale fills'), spec check:api-surface ('public API surface + factory signatures unchanged'), check:authorable-surface, check:keyed-text-bounds, check:nul-bytes, check-adr-0087-registration --base ('adds no declared-breaking changeset'), check-empty-changeset --base, check-changeset-no-major --base (level axis NOT APPLICABLE locally: no pull_request payload; CI reads the PR body). pnpm check:dual-build-cjs-loads: PREREQUISITE NOT MET, exit 3 (8 packages outside the closure have no dist) = NOT MEASURED. --ran reconciliation (record lines '... :: exit N', the one claimed NOT-MEASURED with reason): '88 derived famil(ies) accounted for — 87 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed)', exit 0. Local-only check:dev-prereqs exit 0 after the spec build; check:skill-frame-freshness not owed (no frame file touched). CI on PR #24317 head 1c3722ca1 at report time: 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, the other 22 check-runs in_progress (Lint & Repo Gates lanes, Type Check lanes, Check Changeset, Governed Surface Queue Guard, Spec property liveness, Check PR Size, The card this PR closes must claim this branch, ...). Not waited on, per os-dev.",
      "mcp_calls": "0",
      "api_writes": "2 relay writes, 3 REST requests: (1) pr_create through scripts/pm/fleet-write/dispatch.mjs, request fw-20261018T113906Z-3a6c04, run 39124097478 success: POST /repos/objectstack-ai/objectstack/pulls (draft, PR #24317) + its assignee leg POST /repos/objectstack-ai/objectstack/issues/24317/assignees (read-back: 8857 bytes sent, 8857 stored, identical; assignees marchtian); (2) POST /repos/objectstack-ai/objectstack/issues/24271/comments, this os-dev-report, through scripts/pm/post-stamped.mjs. No labels written (a changeset is present; the dispatch names no label). git push x3 of the claim branch is not REST. Reads only: REST GET issues/24271, issues/24271/comments, pulls/24317, commits/1c3722ca1/check-runs.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a (user-visible) · reach: public door, measured — POST /api/v1/cloud/organizations/ID/change-slug answers 404 ENDPOINT_NOT_FOUND on a booted showcase whose /auth/config serves multiOrgEnabled: true (verify harness multiTenant 'posture-only', the stand-in for the org-scoping runtime the published Apache-2.0 @objectstack/organizations registers); on the stock single-org boot multiOrgEnabled is false and the action is hidden, the POST still 404 · evidence: sys_organization.change_slug targets '/api/v1/cloud/organizations/{id}/change-slug', which no package in this repo serves (git grep 'change-slug' hits only the declaration and this PR's pin); with multiOrgEnabled true the record page offers it (in the overflow after this PR) and a click answers a bare 404; repro: bootShowcase({ multiTenant: 'posture-only' }), sign in, POST /auth/organization/create, POST /cloud/organizations/ID/change-slug; landing: the change_slug declaration in packages/platform-objects/src/identity/sys-organization.object.ts or the composition that mounts its route · dedupe words: change_slug, change-slug 404, ENDPOINT_NOT_FOUND, cloud-only action target, open-source multi-org record header · for the seat to file; not filed here",
        "carrier: objectstack-ai/cloud#3000 · on a cloud composition better-auth organization/update still accepts data.slug, and plugin-auth beforeUpdateOrganization refuses it only while active environments exist (auth-manager.ts:3607-3675): an API-level second slug door beside change_slug; the record page no longer reaches it (the new rename door sends no slug) · noted, not filed",
        "carrier: none (承接者:无) · packages/platform-objects/src/pages/sys-organization.page.ts:14-16 lists 'Set Active, Edit, Delete, Leave' as the record-header actions; Edit and Delete are list_item only; comment drift outside the claim's file surface · in the PR's Acceptance notes only, not filed"
      ],
      "files_changed": [
        ".changeset/24271-org-rename-door.md",
        "packages/platform-objects/src/apps/translations/en.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts",
        "packages/platform-objects/src/identity/sys-organization-rename-action.test.ts",
        "packages/platform-objects/src/identity/sys-organization.object.ts",
        "packages/platform-objects/src/platform-objects.test.ts",
        "packages/qa/dogfood/test/organization-rename-door.dogfood.test.ts",
        "packages/spec/src/kernel/public-auth-features.ts"
      ],
      "line_budget": {
        "additions": 337,
        "deletions": 5
      },
      "deviations": [
        "Translated-locale VALUES (zh-CN 重命名组织 / 组织已重命名, ja-JP 組織名を変更 / 組織名を変更しました, es-ES Renombrar organización / Organización renombrada) were written by hand after the extractor's --fill=default seeded English, per AGENTS.md's Documentation Guardrails row (translated-locale values are hand-written; keys and structure stay the tool's). I read the dispatch's 'regenerated by tooling only / never hand-edit a generated file' as the structure: both extracts were tooling (node scripts/check-i18n-bundles.mjs --write --filter=platform-objects), and the second dropped the six provenance rows the first had seeded. check:i18n and check:i18n-stale-fill are green.",
        "The actions block's own header comment (sys-organization.object.ts, 'better-auth's own columns ... are edited ONLY through update_organization below') was restated to name both doors, because this change made it false. I read it as inside the claim's 'actions block only' surface. The fields-block comment that names update_organization as the organization/update row action is still true and was left alone.",
        "The first spec test run omitted --project local and so also ran the CI-owned repo project. I stopped my own recorded PIDs (vitest 15248, then its orphaned worker 23127) after about 18 minutes and reran with --project local. Nothing from the aborted run is cited.",
        "pnpm check:dual-build-cjs-loads is NOT MEASURED locally: PREREQUISITE NOT MET (exit 3), declared with its reason in the --ran record. CI's Lint & Repo Gates runs it.",
        "A temporary measurement file, packages/qa/dogfood/test/zz-tmp-24271-measure.dogfood.test.ts, was created for the change_slug and P1/P3 boot readings, run twice, and deleted, never committed. Its first run's second case failed on the harness's one-live-kernel-per-configuration rule (two boots in one file); stopping the first stack fixed it, and only the second run's readings are cited.",
        "Commit trailers are AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named trailer. The PR footer is the AGENTS.md session-URL form, not the reminder's two-line form. Both follow the repo instruction, which the reminder itself defers to.",
        "The booted pin resolves @objectstack/platform-objects through dist/. The final-head rebuild before it was 66 of 66 turbo cache hits, keyed by input hash, so I read dist as matching 1c3722ca1. No separate dist marker check was run.",
        "Only the declaration pin was ablated (the suggested route's one ablation). The booted pin was not ablated, because that would need a rebuild of the dist it reads."
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Lane note: no relabel mid-flight · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T11:59Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24317 comment 6249912493 · domain:services seat 1 (#6021) · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-18T12:28Z. Head 1c3722ca1a. Contract review PASS 6249904278 (CONTRACT_REVIEW_TIER, the public-auth-features.ts row). It lands through the merge queue, and every check on its head is green. Fixes #24271 closes this card at the merge. change_slug's open-source 404 is filed as #24318.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 (#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-18T13:03Z.

    Landed: PR #24317 (Fixes #24271) merged through the merge queue as 1173017052 at 2026-10-18T13:02Z. That commit is on origin/main (git merge-base --is-ancestor exit 0; control e15897c0f1 exit 0, negative control PR head 1c3722ca1a exit 1, as a squash). All ten files are byte-identical to the PR head 1c3722ca1a. Contract review PASS 6249904278, ACCEPT 6249912493.

    Probe on origin/main Reading
    the new action on sys_organization sys-organization.object.ts:234, rename_organization (name and logo, no slug; record_header and list_item)
    its gate booking public-auth-features.ts:139, in multiOrgEnabled.gatedInputs

    What a user now sees: an organization record page offers Rename Organization in its header, and it changes the name and logo without touching the slug. This answers the maintainer's 「组织 slug 可以改,但是名称不能改吗」. objectstack-ai/cloud#3000 can name the action on the cloud page once cloud's framework pin carries 1173017052.

    Lane: packages/platform-objects is domain:engine's (triage 6249653353). This card ran under domain:services on triage's routing, and its files were declared to the engine seat at 6248558152 and to the spec seat at 6248724695.

    Still open, with carriers:

    The card closed completed at the merge. pm:dispatched is cleared and the assignee released 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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions