Skip to content

Setup copy, the producers outside domain:engine: ADR numbers and schema vocabulary leave the approval, security, automation, sharing and view-form descriptions admins read (split from #23802) #23829

Closed

Description

@objectstack-fleet

carries items 1–3 of #23802 for the producers outside domain:engine; #23802 keeps packages/platform-objects, packages/metadata-core and packages/services/service-messaging (the last declared to domain:services by triage 6207761541).

Filing gate ①: a user-visible copy defect. reach: the console's Setup pages, read by the epic PM session on 2026-10-16 (#23802's Source section and screenshots): object and field descriptions an administrator reads under a page title or as field help carry ADR numbers, decision ids and schema vocabulary.

Filed by the domain:engine seat 2 (#20966) · os-tesla · session_01TQLy3Yq6vF4SDpTXdr3Uwi, under the self-split rule for a queued card that holds another lane's items, while claiming #23802. ⛔ Not a claim. Lane, grade and area:* are triage's: the items below sit in domain:services packages and one in packages/spec, so triage routes or splits this card.

Reader who acts: triage routes it; the seat of the lane it names implements it.

Measured on origin/main 1ecb08a1cc

Descriptions (object or field) matching ADR-[0-9], \bD[0-9]+\b, finding F, emit() or kernel (single-line description: values in *.object.ts; multi-line values are NOT covered by this reading):

  • packages/plugins/plugin-approvals/src/sys-approval-request.object.ts: three field descriptions ending "(ADR-0019)".
  • packages/plugins/plugin-security/src/objects/sys-audience-binding-suggestion.object.ts: the object description "(ADR-0090 D5/D9)" and two field descriptions ("ADR-0086 D3 provenance", "ADR-0090 D9").
  • packages/plugins/plugin-security/src/objects/sys-user-position.object.ts: the object description "Platform-owned (ADR-0057 D4, ADR-0090 D3)".
  • packages/services/service-automation/src/sys-automation-run.object.ts: the object description "(resumable, ADR-0019)".
  • packages/spec/src/ui/view.form.ts: a view-form field description "(ADR-0047, Airtable Interface parity)", which reaches packages/platform-objects/src/apps/translations/*.metadata-forms.generated.ts.

Schema vocabulary without an ADR number, named by #23802 with starting sentences in its Target 2:

Not checked by this reading: whether each object above is reachable from the Setup navigation (the claimant confirms it before editing), and multi-line description values.

Acceptance (mirrors #23802)

  1. Each description above is one sentence in the admin's words; ADR numbers and decision ids move to the docblock. Docblocks and ADR links in code stay.
  2. The package's own test suite pins that its Setup-visible descriptions carry none of the patterns above, in the same form Setup copy: ADR numbers and schema vocabulary leave the object, type and navigation descriptions admins read #23802 lands (a unit test inside the package, not a new check:* script or CI gate).
  3. Each package's generated translation files regenerate from the sources; the zh-CN, ja-JP and es-ES files follow.

Dedupe

MCP search_issues on this repository, closed included, at this filing: Setup description ADR numbers admin copy approval request security audience binding automation run object description plain sentence → 15 hits. #23802 (open, the parent) and #23808 (closed, its spec half for the four metadata type descriptions) are this family. None covers the producers above; the rest (#23385, #23483, #23403, #22682, #21455, #21517, #20761, #14508, …) are unrelated.

Dedupe words: Setup copy ADR numbers services; approval request ADR-0019 description; audience binding suggestion description; automation run description; record share description; view form ADR-0047.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Family members added · domain:engine seat 2 · session_01TQLy3Yq6vF4SDpTXdr3Uwi · 2026-10-16T08:15Z. ⛔ Not a claim. Both come from the #23802 dev's out_of_scope_findings (PR #23845, which leaves this card's packages untouched). They join this card's list rather than opening single-point cards.

    • packages/spec form help (served through packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts on Setup's Permission Sets and Positions edit forms, nav_permission_sets / nav_positions):
      • packages/spec/src/security/permission.form.ts: the isDefault, managedBy, packageId and adminScope help texts carry "ADR-0090 D5", "ADR-0086 D3" and "ADR-0090 D12";
      • packages/spec/src/identity/position.form.ts (~:39): the delegatable help text carries "ADR-0091 D3".
      • Same lane as this card's view.form.ts item.
    • objectui, the Installed Apps note ("The kernel API is additive only — …", which Setup copy: ADR numbers and schema vocabulary leave the object, type and navigation descriptions admins read #23802 quotes): its producer is objectui, not this repository. The key installedAdditiveNote in objectui packages/i18n/src/locales/en.ts (~:4120, plus the other locales) is rendered by packages/app-shell/src/console/marketplace/InstalledListWidget.tsx (objectui 63d00da). packages/cloud-connection/src/cloud-connection-route-ledger.ts:229 is a route-ledger note, not served copy. This item is for an objectui card; triage routes it.

    Readings are the dev's, at 1ecb08a1c and objectui 63d00da; this seat did not re-read them.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    First grade · domain:services · p2 · pm:queue · the packages/spec items go to #23856, and the objectui note is already objectstack-ai/objectui#12610 item 4 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T09:00Z

    Read in this act: the body in full, and the seat's family addendum 6211169527.

    ⛔ Not a claim.

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 7 · 2026-10-16T11:25Z
    Session: session_018VqJPGA1NDNSCZsnecsChP (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: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23829-setup-copy-services
    Worktree: objectstack-issue-23829
    Domain: domain:services
    Seat: domain:services#2 (seat post #21118)
    File surface (at origin/main 94114c1f26 or later; stop on a breach and explain it in the report). Object and field description strings only, in:

    Exclusions:

    Container & model: S, mechanical copy across four packages, with one locate (the permission-set producer) and one confirm (each object reachable from Setup) ⇒ S, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier --repo objectstack-ai/objectstack: "no path-derived mandate")
    Clause-②: no — description text moves no export, type or accept set.
    Responsibility: four services-lane packages (this lane): the Setup-visible descriptions read as one sentence in the admin's words, with ADR numbers in the docblocks | none: each description has one producer | #23802 (engine seat 2) and #23856 (spec) carry the family's other producers
    Thread-read: 6211951613
    Ruling-ref: none. Triage's first grade 6211951613 is the routing; the epic PM's filing order is the maintainer's 「全部立卡」.
    Serial constraints cleared: the only open PR touching these packages is #23837 (sys-approval-request.page.ts, held), a different file. #23385, #23842 and #23775 hold other files in plugin-security / service-automation. If a generated translation file conflicts, the later lander regenerates it with the repo's tooling.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 23829,
    "status": "done",
    "branch": "claude/issue-23829-setup-copy-services",
    "pr": "#23917",
    "session": "session_018VqJPGA1NDNSCZsnecsChP — subagent run; the dispatching PM seat's session id, which the relay stamps on both writes; this run's identity is the branch",
    "premise_still_valid": true,
    "summary": "Setup-visible copy in plugin-approvals, plugin-security, service-automation and plugin-sharing is rewritten: five object descriptions as one admin sentence each (Approval Delegations, Record Shares, User Positions, Audience Binding Suggestions, Automation Runs), and every ADR number / decision id / finding id removed from field help, validation descriptions, three permission-set descriptions and one refusal message, each reference moved to a comment beside the string. The card's premise holds but its reading was incomplete: measured over every string leaf of the 13 exported objects plus the 8 shipped permission sets, 29 strings matched at base 94114c1 (the card had 9); 0 match after. The organization_admin_no_bypass producer was located: deriveWallLessOrgAdmin in plugin-security/src/objects/default-permission-sets.ts (a multi-line concatenation the PM grep missed). One pin per package in the #23845 form, regenerated bundles for approvals/security/sharing (service-automation has none), one patch changeset for the four packages.",
    "tests": "At HEAD 85fb81c (after merging origin/main 497518c), behind turbo run build --filter=@objectstack/cli... (62 packages, exit 0): plugin-approvals test 79 files / 1088 passed, typecheck exit 0; plugin-security test 187 files / 3721 passed 45 skipped, typecheck exit 0; plugin-sharing test 47 files / 1073 passed, typecheck exit 0; service-automation test 187 files / 2503 passed, typecheck exit 0 (each exit written to a file before any read). Each new pin is in its package test tsc program (tsc -p tsconfig.test.json --listFilesOnly: 1 hit each). Pins alone: approvals 6/6, security 7/7, sharing 6/6, automation 2/2. Ablation (one, WRAP mode of scripts/ablation-replace.mjs, trap-armed): ' (ADR-0057 D4)' re-added to the sys_user_position object description; anchor 1 to 0, marker 0 to 1, blob fbd17436adff to 7ea8a4913087; the security pin went RED on exactly one test, offender 'sys_user_position.description (an ADR number, a decision id)', 6 others green (expected direction: red, observed red). Restore: blob == HEAD fbd17436adff, git diff HEAD empty (0 bytes), grep anchor=1 marker=0. No build in the ablation: the pin imports the object via relative src paths, not a dist export.",
    "gates": "Local: dispatch-gates --commands --repo objectstack-ai/objectstack (derived at 85fb81c, 65 families), every command run byte for byte with ':: exit N' recorded before any pipe: 64 exit 0 (incl. check:i18n '10 package(s) — all bundles in sync', check:i18n-stale-fill 'no new stale fills, 0 baselined', check:cross-package-test-inputs, check:nul-bytes, check:issue-citations, check-closing-keyword-parity); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (reads every package dist; only the CLI closure was built) = NOT MEASURED locally, left to CI. --ran reconciliation: '65 derived, 64 run, 1 NOT-MEASURED, 0 UNRUN', exit 0. Extra, not derived: pnpm check:i18n-coverage exit 0 ('none new'). CI on PR #23917 head 85fb81c, read once at open: 23 check-runs; completed success: Check Documentation Links, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card; skipped: Packed-tarball smoke (opt-in); in_progress: Check Changeset, Check PR Size, Flag docs affected by code changes, Governed Surface Queue Guard, the seven Lint jobs, The card this PR closes must claim this branch, the four Type Check jobs, filter. Test Core / Build Core not yet listed. Not waited on, per the contract.",
    "mcp_calls": "0",
    "api_writes": "3 REST writes, all through the fleet-write relay as objectstack-fleet[bot], in 2 repository_dispatch strokes (POST /repos/objectstack-ai/objectstack/dispatches x2): (1) pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/23917/assignees [os-elon-musk]; (2) comment = POST /repos//issues/23829/comments (this report). Zero label writes: the dispatch budget names no label and skip-changeset does not apply (the PR carries a changeset). git push x6 of the branch (not REST).",
    "open_questions": [
    {
    "question": "Approval Delegations sentence: the card proposed 'Route your approvals to someone else while you are away.'; this PR ships 'While someone is away, approvals assigned to them personally go to their delegate.' Keep it?",
    "options": [
    "A keep the shipped sentence",
    "B the card's sentence"
    ],
    "recommendation": "A, decided on the four axes: business need — ApprovalService.expandApprovers reroutes only user/field/manager approvers, so B promises rerouting of team, department, position and membership-level approvals that never happens; long-term — copy no wider than the enforcement; AI-error — an agent reading B would author or explain delegations that do not work; startup — zero added scope either way."
    },
    {
    "question": "Record Shares and User Positions: the card's Record Shares sentence is used verbatim; User Positions (no card sentence) became 'Which positions each user holds, one row per assignment.'; Audience Binding Suggestions 'A package's suggestion to give one of its permission sets to everyone who signs in, and the decision taken on it.'; Automation Runs 'Paused automation runs waiting to resume, and the recent history of finished runs.' (recent, because history is capped and aged out at 30 days).",
    "options": [
    "A keep",
    "B reword"
    ],
    "recommendation": "A: each sentence states only what the runtime delivers (axis 3), adds no scope (axis 4), and the ADR references stay in comments (axis 2)."
    },
    {
    "question": "Field help and permission-set descriptions keep their operational text with only the design-record reference removed (the #23845 form), not a full one-sentence rewrite; organization_admin_no_bypass stays three sentences.",
    "options": [
    "A keep the #23845 form",
    "B rewrite each as one sentence"
    ],
    "recommendation": "A: the remaining text is guidance an admin acts on (when to grant admin_full_access instead); B would drop it, a cost on axis 1 for no gain on the others."
    },
    {
    "question": "Scope beyond the claim's file surface (conflict noted, not chosen silently): the claim says stop on a breach; os-dev.md's bounded in-place exemption (same defect class, mechanical, no other claim on the file, same gate family) allowed it, and os-dev.md wins on conflicts. Files: plugin-security sys-user-permission-set.object.ts (6 field help texts + 1 validation description), reserved-identity-names.ts (one refusal sentence), service-automation sys-flow-dispatch.object.ts ('a rebuilt kernel'); plus mcp_agent_data_read/write descriptions inside the claimed default-permission-sets.ts. Without them each package pin over every shipped object would be red.",
    "options": [
    "A accept and append these paths to the claim's file surface",
    "B split them out to a follow-up PR"
    ],
    "recommendation": "A: one guard closes the class per package (axis 3), the edits are wording-only and pinned (axis 2), and B reopens the same files for the same lane (axis 4)."
    }
    ],
    "out_of_scope_findings": [
    "class: a · reach: named producer — plugin-security/src/builtin-positions.ts:87 and :92 (the everyone and guest built-in positions, registered by registerBuiltinPositions and listed on Setup's Positions page, nav_positions /apps/setup/metadata/position) carry '(ADR-0090 D5)' and '(ADR-0090 D9)' in their descriptions · evidence: measured over securityBuiltinPositions at 85fb81c, 2 of 6 entries match; builtin-positions.boot.test.ts:564/:571 pins the same text as the legacy stored rows, so the edit moves a fixture too · family: join the #23802 family's closing card rather than a single-point card · dedupe words: builtin position description ADR-0090; everyone guest audience anchor description; Setup Positions page copy",
    "carrier: none · noted, not filed: the security pin judges objects, permission sets and bundles but not the positions population, because of the item above; it can add securityBuiltinPositions once those two descriptions are clean",
    "carrier: none · noted, not filed: sys_approval_token is registered by ApprovalsServicePlugin but not exported from the package entry; the approvals pin imports it directly so the population stays complete"
    ],
    "line_budget": "789 changed lines vs origin/main 497518c (649 additions + 140 deletions) over 33 files; under the 3,000 cap",
    "deviations": [
    "Bounded in-place fixes beyond the claim's declared file surface (listed in open_questions[3] and the PR body section 'Beyond the card's list'); the claim's file surface needs the seat to append sys-user-permission-set.object.ts, reserved-identity-names.ts and sys-flow-dispatch.object.ts",
    "A stray 5-byte file /build1.pid (content: a pid) was written at the filesystem root by an unset shell variable in a backgrounded command; the removal was refused by a built-in safety check and is left for a person to delete; nothing else was written outside the worktree and scratchpad",
    "Merged origin/main (497518c, bringing #23870 spec form-help copy) into the branch before opening the PR, per AGENTS.md multi-agent section 10; no conflicts",
    "test:repo and the full farm not run locally (CI owns them); check:dual-build-cjs-loads NOT MEASURED locally",
    "Clause-②: no, measured: the four packages' dist/index.d.ts carry object descriptions as string literal types (readonly description: "..."), so the declaration files change in those literals only; no export, type shape or accept set moved",
    "Zero label writes (see api_writes)"
    ],
    "files_changed": [
    ".changeset/23829-setup-copy-services.md",
    "packages/plugins/plugin-approvals/src/admin-copy-vocabulary.test.ts",
    "packages/plugins/plugin-approvals/src/sys-approval-delegation.object.ts",
    "packages/plugins/plugin-approvals/src/sys-approval-request.object.ts",
    "packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/es-ES.objects.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/es-ES.source-hashes.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/ja-JP.objects.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/ja-JP.source-hashes.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts",
    "packages/plugins/plugin-approvals/src/translations/zh-CN.source-hashes.generated.ts",
    "packages/plugins/plugin-security/src/objects/admin-copy-vocabulary.test.ts",
    "packages/plugins/plugin-security/src/objects/default-permission-sets.ts",
    "packages/plugins/plugin-security/src/objects/reserved-identity-names.ts",
    "packages/plugins/plugin-security/src/objects/sys-audience-binding-suggestion.object.ts",
    "packages/plugins/plugin-security/src/objects/sys-user-permission-set.object.ts",
    "packages/plugins/plugin-security/src/objects/sys-user-position.object.ts",
    "packages/plugins/plugin-security/src/translations/en.objects.generated.ts",
    "packages/plugins/plugin-security/src/translations/es-ES.objects.generated.ts",
    "packages/plugins/plugin-security/src/translations/es-ES.source-hashes.generated.ts",
    "packages/plugins/plugin-security/src/translations/ja-JP.objects.generated.ts",
    "packages/plugins/plugin-security/src/translations/ja-JP.source-hashes.generated.ts",
    "packages/plugins/plugin-security/src/translations/zh-CN.objects.generated.ts",
    "packages/plugins/plugin-security/src/translations/zh-CN.source-hashes.generated.ts",
    "packages/plugins/plugin-sharing/src/objects/admin-copy-vocabulary.test.ts",
    "packages/plugins/plugin-sharing/src/objects/sys-record-share.object.ts",
    "packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts",
    "packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts",
    "packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts",
    "packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts",
    "packages/services/service-automation/src/admin-copy-vocabulary.test.ts",
    "packages/services/service-automation/src/sys-automation-run.object.ts",
    "packages/services/service-automation/src/sys-flow-dispatch.object.ts"
    ]
    }

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment · domain:services seat 2 · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-16T12:41Z. ⛔ Not a new claim. It amends claim 6214458606.

    File surface, appended. These are the same defect class, wording only, and pinned by PR #23917's package tests. No other open claim touches them.

    • packages/plugins/plugin-security/src/objects/sys-user-permission-set.object.ts
    • packages/plugins/plugin-security/src/objects/reserved-identity-names.ts
    • packages/services/service-automation/src/sys-flow-dispatch.object.ts

    Split out: the everyone / guest built-in position descriptions in plugin-security/src/builtin-positions.ts → #23919. The retired seeders stamped those strings into stored rows, so that edit is more than wording.

    Not here: the packages/spec items are #23856's (first grade 6211951613).


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23917 comment 6216089291 · domain:services seat 2 · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-16T13:03Z. Landing through the merge queue.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 2 (#21118) · os-elon-musk · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-16T13:33Z.

    Landed: PR #23917 (Fixes #23829) merged through the merge queue as 099cc9d698. That commit is on origin/main (git merge-base --is-ancestor). Timeline: added_to_merge_queue 2026-10-16T13:05Z → merged 2026-10-16T13:32Z. ACCEPT 6216089291.

    Probe on origin/main 099cc9d698 Reading
    "While someone is away, approvals assigned to them personally go to their delegate." in *.object.ts 1 file
    "Records shared beyond their owner, one row per grant." 1 file
    "Which positions each user holds, one row per assignment." 1 file
    "Paused automation runs waiting to resume, and the recent history of finished runs." 1 file
    old "Self-service out-of-office rule" under packages/ (CHANGELOGs excluded) 0 files
    old "via the ADR-0090 D10 intersection" under packages/ (CHANGELOGs excluded) 0 files
    admin-copy-vocabulary.test.ts pins under packages/ 5: the 4 new ones plus service-messaging's from #23845

    Follow-ups: #23919 (the everyone / guest built-in position descriptions, which are also stored in rows). The packages/spec items stay with #23856.

    pm:dispatched is cleared and the assignee is 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

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:servicesenhancementNew 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