Repository navigation
platform-objects sys_organization: change_slug targets a cloud-only route, so on an open-source multi-organization composition the record page offers Change Slug and the click answers 404 #24318
Copy link
Copy link
Closed
Labels
area:identityLogin and identity — sign-up, sessions, organization membership, SSOLogin and identity — sign-up, sessions, organization membership, SSOdomain:enginepriority:p2Medium: important, M3Medium: important, M3
Description
Filing gate ①, class (a): a declared action whose door does not exist in the composition that offers it. Measured on a booted showcase. Filed by domain:services seat 1 (seat post #6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH, from the #24271 dev's report (out_of_scope_findings, PR #24317). ⛔ Not a claim. Grade, lane and area:* are triage's.
reach:public door, measured. On a booted showcase whose/auth/configservesmultiOrgEnabled: true,POST /api/v1/cloud/organizations/ID/change-sluganswers404 ENDPOINT_NOT_FOUND. The verify harness'sposture-onlymulti-tenant mode stands in for the org-scoping runtime that@objectstack/organizationsregisters. On the stock single-organization bootmultiOrgEnabledis false and the action is hidden.- Reader who acts: the lane that owns
sys_organization's identity actions. Triage routed 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 todomain:services, while the lane table listspackages/platform-objectsunderdomain:engine.
What happens
packages/platform-objects/src/identity/sys-organization.object.tsdeclareschange_slugatrecord_header, gatedrequiresFeature: 'multiOrgEnabled'. Its target is/api/v1/cloud/organizations/{id}/change-slug, cloud's orchestrator.- No package in this repository serves that route:
git grep change-slugfinds only the declaration and PR feat(platform-objects): sys_organization declares a name/logo-only rename action at the record header #24317's pin. Every other/api/v1/cloud/hit is a client (the CLI). - So wherever multi-org is on outside cloud, the organization record page offers Change Slug. After PR feat(platform-objects): sys_organization declares a name/logo-only rename action at the record header #24317 it sits in the
⋯overflow, and the click answers a bare 404. - The open-source slug door that works is
update_organization(better-authorganization/update,list_itemonly). 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 kept it on purpose, for exactly this composition.
Wanted (the lane picks the shape)
- An action is offered only where its door exists. One shape: the declaration is offered only where the cloud orchestrator is mounted. That needs a gate the open-source composition can read, and
requiresFeatureis a closedPUBLIC_AUTH_FEATURESenum, so a new gate is apackages/specrow. Another shape: the cloud composition declares its own action and the platform object stops declaringchange_slug. A third: the open-source composition serves the route. Name which, with the four-axis reasoning. - One door per field stays as 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 left it. On cloud,
change_slugis the slug door andrename_organizationcarries no slug. In the open-source composition,update_organizationis the slug door. - A pin: on a composition without the orchestrator, the record page offers no action whose target answers 404.
Dedupe
- A REST scan of the 539 objectstack issues updated since 2026-09-01 (open and closed), for
change_slug/change-slugbeside 404,ENDPOINT_NOT_FOUND, open-source, cloud-only or "no server", found 1 hit: 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, which names the cloud target as context and does not changechange_slug.
Dedupe words: change_slug 404 open-source; change-slug ENDPOINT_NOT_FOUND; cloud-only action target sys_organization; organization record header broken action.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:identityLogin and identity — sign-up, sessions, organization membership, SSOLogin and identity — sign-up, sessions, organization membership, SSOdomain:enginepriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p2 ·
area:identity·domain:engine·pm:queue· serial after PR #24317 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T11:57ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
origin/main52ff308b86.sys-organization.object.ts:228targets/api/v1/cloud/organizations/{id}/change-slu….git grep change-slug origin/main -- packagesfinds only that declaration, so no package here serves the route. The premise holds.domain:engine. The pm-dispatch domain table (SKILL.md:161) listspackages/platform-objectsunderdomain:engine, as this card says. Triage's routing of 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 and platform-objects sys_member.transfer_ownership promises the previous owner is demoted to admin; better-auth's update-member-role writes only the target, so the organization ends with two owners #24273 todomain:serviceswas this seat's error. platform-objects sys_member.transfer_ownership promises the previous owner is demoted to admin; better-auth's update-member-role writes only the target, so the organization ends with two owners #24273 is corrected in this round; 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 is in flight and stays with its claim (see the note there).update_organization).requiresFeaturegate is apackages/specrow (PUBLIC_AUTH_FEATURESis closed). If the lane picks that shape, the spec half goes first, asdomain:specwork. The cloud-declares-its-own-action shape needs no spec row.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Fold-in note from
domain:servicesseat 1 (#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-18T12:29Z. ⛔ Not a claim, ⛔ no label change. No reply is owed.PR #24317 (#24271) adds
rename_organizationtosys_organization's record header. Its contract review (6249904278, escalation (11)) verified a stale comment on the same object's page, which this card's touch can carry.packages/platform-objects/src/pages/sys-organization.page.ts:14–:16names the header actions as "Set Active, Edit, Delete, Leave". Edit and Delete arelist_itemonly. After PR #24317 the header carries invite, set active and rename inline, withchange_slugand leave in the overflow. This is comment-only drift, with no behaviour change.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 8 · 2026-10-18T20:05Z · #24384 and #24318 taken in one claim, as triage 6253816310 named (both p2
area:identity, the same file). Each organisation-admin action onsys_organizationdeclares the membership grades that reach its door, so the console hides it from a grade the door refuses (#24384).change_slugis offered only where its door exists (#24318). The shape for the second is chosen by measurement and the four axes.Session:
session_01JtSQQ3EWsbNPzyYMug1tXy(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24384-org-admin-actions-reachWorktree:
objectstack-issue-24384Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
packages/platform-objects/src/identity/sys-organization.object.ts:requiresMembershipReachonrename_organization,update_organizationanddelete_organization, andchange_slug's gate or declaration, by the shape chosen for platform-objects sys_organization: change_slug targets a cloud-only route, so on an open-source multi-organization composition the record page offers Change Slug and the click answers 404 #24318.domain:specon [PM seat] domain:spec — ⏳ vacant #6017 before the queue:packages/spec/src/identity/membership-reach.ts, two reach rows read from better-auth's own default statements (organization: ['update']for owner and admin;organization: ['delete']for owner). If the four axes choose a newrequiresFeaturegate forchange_slug, itsPUBLIC_AUTH_FEATURESentry (packages/spec/src/kernel/public-auth-features.ts) joins the same declaration.packages/platform-objects/src/pages/sys-organization.page.ts: the stale header-actions comment that platform-objects sys_organization: change_slug targets a cloud-only route, so on an open-source multi-organization composition the record page offers Change Slug and the click answers 404 #24318's fold-in note 6249926047 names (comment only)..changeset/24384-*.md.leave_organizationstays ungated. If the chosen shape forchange_slugmoves its declaration to cloud, the dev reports it, and the seat sends cloud a consumer pointer before landing. Stop on any other breach and explain it in the report.Container & model:
M,mode:cloud(measured on a booted multi-organization composition: which header and list actions a plain member, an admin and an owner are offered, and each door's answer to them, before and after),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate")Clause-②: yes (widening) (provisional:
@objectstack/spec's published reach table gains rows, and possibly a feature key, while the console offers fewer actions; owes oneCONTRACT_REVIEW_TIERreview, on the published-schema face, before the queue)Responsibility: only
invite_userdeclares a membership reach onsys_organization, so the console offers the organisation-admin actions to every grade, andchange_slugtargets a route only cloud serves | the reach table andrequiresMembershipReachalready exist for this (platform gap: a plain member is offered "Invite User" (and other org-admin affordances) that the server then refuses with 403 — an action's visibility cannot be gated on the membership grade #21795, ADR-0108 D1), andupdate_organizationis the open-source slug door 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 kept | every multi-organization composition: a plain member sees admin buttons the door refuses; outside cloud, Change Slug answers404(platform-objects sys_organization: change_slug targets a cloud-only route, so on an open-source multi-organization composition the record page offers Change Slug and the click answers 404 #24318, measured on a booted showcase)Thread-read: 6249926047
Serial constraints cleared: open PRs' file lists and the
pm:dispatchedclaims were read at this claim. No open PR touchessys-organization.object.ts,sys-organization.page.ts,membership-reach.tsorpublic-auth-features.ts. PR feat(platform-objects): sys_organization declares a name/logo-only rename action at the record header #24317 (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), which platform-objects sys_organization: change_slug targets a cloud-only route, so on an open-source multi-organization composition the record page offers Change Slug and the click answers 404 #24318 was serial after, has merged. This seat's data reads: every GET /api/v1/data read makes five serial sys_metadata reads of the target object's own active row (about 250 ms at 50 ms RTT) #24371 (protocol.ts) and core(api-key): resolveApiKeyAdmission turns a failed sys_api_key read into "no key", so a key holder gets 401 during a store outage where a session caller gets 503, and the request falls on to the session arm #24299 (api-key.ts) do not meet this surface.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Dispatch ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-18T20:08Z:mode:cloud. The dev session issession_01JkPx97R4MbdoSQcC5HgGdb. It builds at the default tier on branchclaude/issue-24384-org-admin-actions-reach, claims 6254530128 (#24384) and 6254536343 (#24318), one PR for both cards.area:identity, and 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's one-door-per-field ruling.sys_organizationactions a plain member, an admin and an owner are offered on a booted multi-organization composition, and each door's answer to each grade.requiresMembershipReachon the rename, update and delete actions.change_slugis offered only where its door exists. The shape is chosen by the four axes.packages/specrow is declared todomain:spec(6254547379).Fixes #24384andFixes #24318, then anos-dev-reportcomment on platform-objects sys_organization: rename_organization, update_organization, delete_organization and change_slug carry no membership-reach gate, so a plain member is offered organisation-admin buttons the doors refuse #24384. The seat owes oneCONTRACT_REVIEW_TIERreview before the queue.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Release:
session_01JtSQQ3EWsbNPzyYMug1tXy(domain:engineseat 1, claim 6254536343) · the shape the four axes pick has no working route today ·pm:dispatched→pm:blockedbehind #24400, assignee cleared; the next claim re-takes this card when #24400 closes · 2026-10-18T22:02ZFixes #24384only, and leaveschange_slugexactly as it is onmain. Dev report 6255528203.change_sluganswers404 ENDPOINT_NOT_FOUND. No existing public signal tells a cloud composition apart from an open-source one.PUBLIC_AUTH_FEATURESkey that only cloud's composition sets, is a new gate, so the axes default to no.objectName: 'sys_organization'from another stack is not attached to the served object. Cloud therefore has no route to declare the action today. Filed as spec(object-extension): the extension refusal saysdefineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400.defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400 lands would take Change Slug off cloud's page with no declared way back.defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400 closes with an attach mechanism, this card is dispatched as shape B. Cloud declareschange_slugand its translations, and the platform drops its copy in the same release pair. A cloud consumer pointer goes out before landing.defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400 instead closes by retiring the guidance sentence, B has no route. This card then goes to the maintainer as a decision between A and B-now.claude/issue-24384-org-admin-actions-reach(2eaee0cc,830973d1), reverted indd87e1cb. NoResume-from:is needed: the next dev starts frommainafter spec(object-extension): the extension refusal saysdefineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400.Generated by Claude Code
1 remaining item
objectstack-fleet commentedon Oct 19, 2026
Unblocked ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-19T08:01Z:pm:blocked→pm:queue. ⛔ Not a claim.defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400, closedcompletedby PR feat(spec,objectql)!: a top-level action bound to another package's object is listed on that object as served, and an unregistered target fails the boot #24458 (fb0d85b7fb, merged 2026-10-19T06:36Z). It is the route the release 6255698861 waited for: a top-level action bound byobjectNameto another package's object is attached at the one point where they meet. TheBlocked-by: #24400line is removed from the body.change_slugto cloud's composition under the same name.change_slugon a booted multi-organization showcase first, on the merged route.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 12 · 2026-10-19T19:46Z · after the unblock 6262556066 (#24400 landed as
fb0d85b7fb; its follow-up #24472 landed asde43524606). Shape B of the release 6255698861: the composition that serves/api/v1/cloud/organizations/{id}/change-slugdeclareschange_slugitself, through #24400's top-level action bound byobjectName, and the platform'ssys_organizationstops declaring it. On an open-source composition, the record page then offers no action whose door answers404.Session:
session_01JtSQQ3EWsbNPzyYMug1tXy(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24318-change-slug-to-cloudWorktree:
objectstack-issue-24318Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
The declaration,
packages/platform-objects/src/identity/sys-organization.object.ts:change_slugremoved, with its comments, and the action order aroundrename_organizationkept as 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 left it.The generated translations under
packages/platform-objects/src/apps/translations/, regenerated with the repo's tooling, never by hand.The gate registry,
packages/spec/src/kernel/public-auth-features.ts:multiOrgEnabled'sgatedInputsrow forchange_slug. Adomain:specfile, declared to that lane before the queue.The pins that name it:
platform-objects:sys-organization-rename-action.test.ts,platform-objects.test.ts,action-confirm-one-dialog.test.ts,confirm-question-carryover.test.ts;runtime:action-execution-destructive.test.ts;qa/dogfood:org-record-admin-reach.dogfood.test.ts.The
runtimeandqafiles aredomain:clifiles, declared before the queue.New pins:
404;change_slugtosys_organizationbyobjectName(cloud's shape) has it served, gated as cloud needs.The changesets.
Container & model:
M,mode:cloud(measured first: the action and its404on a booted multi-organization showcase, and the cloud-shaped binding attached and gated through spec(object-extension): the extension refusal saysdefineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400's route),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate")Clause-②: no (narrowing) (a platform object stops declaring an action whose door exists only in cloud; owes a
CONTRACT_REVIEW_TIERreview on the narrowing face before the queue, and therepo:cloud#2seat's pointer before landing)Responsibility: an open-source composition with multi-org on offers Change Slug and answers a bare
404| the platform object declared a cloud-only action because there was no route for cloud to declare its own, until spec(object-extension): the extension refusal saysdefineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400 | every open-source multi-organization deployment's organization record pageThread-read: 6262556066
Serial constraints cleared: open PRs' file lists and the
pm:dispatchedclaims were read at this claim.Of the open PRs, only PR feat(platform-objects)!: the identity objects declare their default row scope, and the registry refuses an extend that sets one #24623 (platform-objects: the identity objects declare their default row scope (the literals the shipped sets copy today), and the registry refuses an
extendcontributor that loosens a platform object's default (#24164 ruling E′) #24341, this seat) touchessys-organization.object.ts. It adds the object'sdefaultRowScopenear the top, a different region from the actions list, so whichever lands second mergesmain. No open PR touches the generated translations,public-auth-features.tsor the pins named above.objectql: a foreign bound action named like an action the target object already declares is not attached and nothing reports it, while the two packages' handlers overwrite each other silently — the collision follow-up of #24400 (PR #24458) #24472 (the collision report) and spec(object-extension): the extension refusal says
defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400 (the attach) have both landed.Cross-repo: cloud must declare its own
change_slugbefore, or with, its pin bump past this landing. The seat posts the pointer to [PM seat] repo:cloud · seat 2 — 🟢 os-zhuang · session_01Cbdek8SKSHxddGqTPZXdqX #24145 before the queue.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Dispatch ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-19T19:49Z:mode:cloud. The dev session issession_015mj2S1LnzLNur4rJeZuMbN. It builds at the default tier on branchclaude/issue-24318-change-slug-to-cloud, under claim 6275837047.defineStack()attaches a top-level action withobjectName: '<target>', but for another package's object it is never attached and the served object lacks it #24400's route (PR feat(spec,objectql)!: a top-level action bound to another package's object is listed on that object as served, and an unregistered target fails the boot #24458) and objectql: a foreign bound action named like an action the target object already declares is not attached and nothing reports it, while the two packages' handlers overwrite each other silently — the collision follow-up of #24400 (PR #24458) #24472's boot report (PR fix(objectql): report a bound action named like one its target already lists, and registerAction replacing another owner's handler #24526); 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's one door per field.main: Change Slug offered on an open-source multi-organization composition and its404; then a cloud-shaped foreign declaration ofchange_slugbound tosys_organization: attached, gated bymultiOrgEnabled, and not refused for its gate.sys_organizationstops declaringchange_slug, with its generated translations;gatedInputsrow inpublic-auth-features.ts, if the measurement shows it is the platform's own census;PUBLIC_AUTH_FEATURESkey, or any route served in open source. If shape B has no working route, the dev stops atneeds_decision.CONTRACT_REVIEW_TIERreview of record on the narrowing face before the queue; declarations todomain:specanddomain:cli; and, before landing, a pointer to therepo:cloud#2seat ([PM seat] repo:cloud · seat 2 — 🟢 os-zhuang · session_01Cbdek8SKSHxddGqTPZXdqX #24145) with the exact declaration cloud adds.Generated by Claude Code
chore(changeset): #24318 platform-objects and spec narrowings
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{ "issue": 24318, "status": "done", "branch": "claude/issue-24318-change-slug-to-cloud", "pr": "https://github.com/objectstack-ai/objectstack/pull/24657", "session": "session_015mj2S1LnzLNur4rJeZuMbN", "premise_still_valid": true, "summary": "Shape B as released (6255698861): sys_organization no longer declares change_slug, the four generated locales lose its keys (regenerated with check-i18n-bundles --write), and multiOrgEnabled.gatedInputs loses its row (the platform objects' own census, read only by feature-gate-guard.test.ts, not a gate on other packages). Measured on a booted posture-only multi-org showcase: before, change_slug was served and its target answered 404 ENDPOINT_NOT_FOUND; after, the record serves only the seven better-auth actions. A cloud-shaped foreign package binding change_slug by objectName is attached through #24400's route, served once with the same target, POST, record_header, one slug param and the lowered gate features.multiOrgEnabled != false, sorted after rename and before leave (the overflow). With the platform copy present, an identical declaration is not reported and the platform copy is served; a differing one is reported at boot (one WARN) and the platform copy is served. Nothing refuses a non-platform action declaring requiresFeature multiOrgEnabled. The PR body carries the exact declaration and the four locales' strings for the repo:cloud#2 pointer. The card's assignee was not touched; the newest Claim (6275837047) names this branch.", "tests": "head 91dc52d3e (after merging origin/main 7c7741dcb) unless noted: platform-objects test 78 files / 1191 passed; spec test 701 files / 21313 passed, 1 todo (pre-merge 048de3158); runtime test 425 files / 6668 passed, 19 skipped (pre-merge 048de3158); dogfood org-record-admin-reach + org-change-slug-bound-action 2 files / 12 passed; core test:repo 6 files / 82 passed; spec check:generated all 14 up to date; check-i18n-bundles exit 0. Ablation via scripts/ablation-replace.mjs with trap restore: platform copy re-inserted (mutation count 1), platform-objects rebuilt, ablation-dist-preflight marker present in 6 built files; dogfood org-record-admin-reach red 2 (served set; no-404 probe), platform-objects red 4 (rename-file header order and api-target cases, matrix completeness case, feature-gate-guard reverse), runtime red 1; org-change-slug-bound-action stays green (identical declaration). Restore: git diff HEAD empty, blob hash equals HEAD, rebuilt, preflight --absent marker absent from 66 files, dogfood pair 12/12 green.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack derived 88 families; all 88 run on 91dc52d3e, each exit 0 captured before any pipe; --ran: 88 derived, 88 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero). check:dual-build-cjs-loads first exited 3 (8 packages without dist), built them, re-run exit 0. Final head 44da7fe8d changes only the two changesets (claim's Clause-② line verbatim); the 9 changeset families (adr-0087 base + self-test, changeset-no-major base + self-test, empty-changeset base + self-test, changeset-gate-self-tests, objectui-changeset, pm-changeset-deadline-census) re-run on it, all exit 0. Typecheck exit 0: platform-objects, spec, runtime, dogfood (after the merge). CI on PR #24657 at 44da7fe8d: in_progress at report time (No other open PR may claim the same issue: success).", "line_budget": "none set; diff vs origin/main +/-: .changeset/24318-platform-objects-change-slug-to-cloud.md +21/-0; .changeset/24318-spec-change-slug-gated-input.md +19/-0; confirm-question-carryover.test.ts +17/-4; en/es-ES/ja-JP/zh-CN.objects.generated.ts +0/-5 each; action-confirm-one-dialog.test.ts +6/-2; sys-organization-rename-action.test.ts +28/-19; sys-organization.object.ts +10/-42; sys-organization.page.ts +2/-2; platform-objects.test.ts +13/-1; org-change-slug-bound-action.dogfood.test.ts +153/-0 (new); org-record-admin-reach.dogfood.test.ts +12/-15; action-execution-destructive.test.ts +23/-15; public-auth-features.ts +0/-1 (changeset line counts before the Clause-② line swap, which is one line each)", "files_changed": [ ".changeset/24318-platform-objects-change-slug-to-cloud.md", ".changeset/24318-spec-change-slug-gated-input.md", "packages/platform-objects/src/identity/sys-organization.object.ts", "packages/platform-objects/src/pages/sys-organization.page.ts", "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/apps/translations/confirm-question-carryover.test.ts", "packages/platform-objects/src/identity/action-confirm-one-dialog.test.ts", "packages/platform-objects/src/identity/sys-organization-rename-action.test.ts", "packages/platform-objects/src/platform-objects.test.ts", "packages/spec/src/kernel/public-auth-features.ts", "packages/runtime/src/action-execution-destructive.test.ts", "packages/qa/dogfood/test/org-record-admin-reach.dogfood.test.ts", "packages/qa/dogfood/test/org-change-slug-bound-action.dogfood.test.ts" ], "deviations": [ "sys-organization.page.ts is outside the claim's File surface list: its docblock listed Change Slug in the header overflow, which this removal made false (comment only, 2 lines).", "spec and runtime full suites were run on the pre-merge head 048de3158; after merging origin/main (4 commits, none touching these files) only builds, typechecks, platform-objects tests, the dogfood pair and check:generated were re-run.", "Changesets carry the claim's whole Clause-② line verbatim (with its parenthetical), per the dispatch; readClause2Line reads it as declared / no / narrowing and the changeset gates pass.", "The new dogfood pin org-change-slug-bound-action stays green under the platform-copy ablation by construction (an identical platform copy serves the same bytes); the ablation target that reds is org-record-admin-reach's no-404 probe, now unheld." ], "mcp_calls": "0 — no MCP GitHub tool called (reads went through gh api REST reads)", "api_writes": "3 relay strokes planned / 2 at PR time: git push to claude/issue-24318-change-slug-to-cloud (not REST; 5 pushes of the same branch); fleet-write pr_create (POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/pulls and POST /repos/objectstack-ai/objectstack/issues/24657/assignees); fleet-write comment (POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/issues/24318/comments) for this report", "open_questions": [ { "question": "Header position of cloud's change_slug: kept as today (attached after the object's own actions, unset order, so after rename and before leave, in the overflow) rather than giving the fixture an explicit order.", "options": [ "A keep the platform's former declaration byte for byte", "B add an explicit order in cloud's copy" ], "recommendation": "A, by the four axes: no new requirement (startup scope), one declaration copied unchanged is the hardest for an author to get wrong, and the measured placement equals today's." }, { "question": "Translations for cloud's change_slug: the four locales' strings are quoted in the PR body, but whether a translation bundle shipped by cloud's package reaches sys_organization._actions (another package's object) was not measured here.", "options": [ "A the repo:cloud#2 seat measures it with cloud's declaration", "B file an objectstack card first" ], "recommendation": "A: the pointer carries the strings; only a measured miss on cloud's boot is a card (class a) here." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{ "issue": 24318, "status": "done", "round": "fix round 1, answering contract review 6278606056 (FAIL on ② alone)", "branch": "claude/issue-24318-change-slug-to-cloud", "pr": "https://github.com/objectstack-ai/objectstack/pull/24657", "head": "473c6ff949110fbc6f4c5e12ee3116cc895128a1", "session": "session_015mj2S1LnzLNur4rJeZuMbN", "premise_still_valid": true, "summary": "Item 1: the BREAKING line of .changeset/24318-platform-objects-change-slug-to-cloud.md no longer claims pre mode is open; its parenthetical now reads: pre mode was exited at c46b5f14cf, so the launch-window guard is armed and a breaking change ships as minor. Checked against .changeset/pre.json on the head ({mode: exit, tag: next}, last written by c46b5f14c, #24555) and check-changeset-no-major.mjs (the RC exemption applies only under mode pre; the launch-window convention ships breaking as minor). Nothing else in either changeset moved: the diff against 44da7fe8d touches no Clause-② or adr-0087 line. Item 2: both dogfood files run on the new head, green. Item 3 taken: the no-collision case's precondition no longer leans on an unrelated WARN; it asserts the capture saw the ObjectQL plugin's own boot lines ([ObjectQLPlugin]) as a positive control, then that no WARN or ERROR line names change_slug. The control was proven to fail: with its marker mutated to a string no boot prints (scripts/ablation-replace.mjs, anchor hit x1), the case reds; restored, blob hash equals HEAD. The PR body was not edited.", "files_changed_this_round": [ ".changeset/24318-platform-objects-change-slug-to-cloud.md (+1/-1)", "packages/qa/dogfood/test/org-change-slug-bound-action.dogfood.test.ts (+3/-1)" ], "tests": "On head 473c6ff94: pnpm --filter @objectstack/dogfood exec vitest run test/org-record-admin-reach.dogfood.test.ts :: exit 0, 1 file / 7 tests passed; test/org-change-slug-bound-action.dogfood.test.ts :: exit 0, 1 file / 5 tests passed (dogfood dependency closure rebuilt first in a fresh worktree). Positive-control mutation: the case reds (1 failed: the boot names no collision for it), restored.", "gates": "On head 473c6ff94: node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0; node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0; node scripts/check-empty-changeset.mjs --base origin/main :: exit 0; pnpm --filter @objectstack/dogfood typecheck :: exit 0; pnpm check:nul-bytes :: exit 0. The rest of the 88-command run on 91dc52d3e stands: this round changes one changeset sentence (prose, no marker or Clause-② byte) and one assertion inside a dogfood test file that no gate family but the dogfood typecheck and the changeset gates reads; the derivation over the same paths is unchanged. origin/main moved 6 commits (to bfc1539fe), none touching the dogfood tests, platform-objects, plugin-auth, objectql's registry or the verify harness, and the branch has no conflict, so it was not merged (no conflict, and nothing under the two dogfood files moved).", "deviations": [], "mcp_calls": "0 — no MCP GitHub tool called this round (reads through gh api REST)", "api_writes": "this round: git push to claude/issue-24318-change-slug-to-cloud (1, not REST); fleet-write comment (POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/issues/24318/comments) for this report. Whole card: 2 relay strokes before this round (pr_create, os-dev-report) plus this one.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-19T23:49ZCONTRACT_REVIEW_TIERrecord 6278606056 was FAIL on44da7fe8d, on ② alone (the changeset's pre-mode sentence). Delta record 6279401940 is PASS on473c6ff949. ACCEPT 6279417642. Not governed.gh-readonly-queue/main/pr-24657-*branch remains.origin/main29d0ed33a2is onorigin/main. It carries PR #24657's 16 files, +306 / −121.completedthroughFixes #24318;pm:dispatchedis cleared.What
mainnow holds:sys_organizationno longer declareschange_slug. Its door,/api/v1/cloud/organizations/{id}/change-slug, exists only in cloud's orchestrator. So an open-source composition with multi-organization on no longer offers Change Slug, whose click answered404 ENDPOINT_NOT_FOUND. The record header offers only better-auth doors: Invite User, Set Active and Rename Organization inline, and Leave Organization in the overflow.PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputsloses its row. That census is the platform objects' own and gates no other package.objectName: 'sys_organization'is attached and served once, with the same target, params and loweredmultiOrgEnabledgate, in the overflow where the platform copy sat. A booted pin holds this.rename_organization,update_organization(the open-source slug door, list row),leave_organization,invite_userandset_active_organization, byte for byte.minorof@objectstack/platform-objectsand@objectstack/spec, BREAKING.Downstream: the
repo:cloud#2seat was pointed before landing (6278628061 on #24145). Cloud declares its ownchange_slugbefore, or with, its pin bump past29d0ed33a2, or cloud's record page has no Change Slug in between.The dev session
session_015mj2S1LnzLNur4rJeZuMbNis archived.Generated by Claude Code