Skip to content

runtime: a served read naming which package contributes to an installed base — extension fields, flows on its objects, navigation entries — so Studio can draw contributed items greyed with their source (ADR-0029 D7, ADR-0146 D3) #28722

Closed

Description

@objectstack-fleet

domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y

Filing gate: ④ server gap a ui card is ruled to leave undrawn · found by the #28572 (N-19) os-dev while measuring the card's Wanted 5 · filed by domain:ui#4, as N-19's ruling asks ("a kind with no served source is listed in the PR and left undrawn, and the seat cuts a server card for it") · ⛔ Not a claim.

Business reason. A customer with several installed apps opens HotCRM in Studio. Another package may add fields to HotCRM's objects, run flows on them or add menu entries to its app. The customer should see those items on HotCRM's surface, drawn greyed and naming the package they come from (ADR-0029 D7, and the Supersede row ADR-0146 adds). Otherwise they cannot tell what HotCRM ships from what other packages bring. Today Studio cannot draw them, because no served read says which package contributed what. Inventing the source on the client is ruled out.

Measured (origin/main d62d9737, by the #28572 dev).

Wanted. One served answer, per installed base, that names the contributing package for each of the three kinds:

  1. extension fields on the base's objects;
  2. flows on the base's objects;
  3. navigation entries contributed to the base's app(s).
    The base's own items and its <base>.custom pair (already served by N-15) are excluded. The shape is the spec's to declare first (contract-first). Either a new member of an existing read or a new read is acceptable, and the server card decides which.

Tests. A fixture with a base, its pair and a third package that extends one base object with a field, adds a flow on it and contributes one nav entry. The read names the third package for each of the three, and names neither the base nor the pair.

Reader. domain:server, the next seat to pick it. Consumer: domain:ui draws the greyed items once it lands; #28572's PR lists the three kinds as left undrawn and pins that nothing is drawn without this read. Size M (spec member + runtime read + tests).

Dedupe. Searched getObjectContributors (only #28411 and #28574, neither serves contributors to a base surface) and contributor package source extension field read (no match).

Links back: #28572, #28411, #28574, #28236, ADR-0029 D7, ADR-0146 D3.


Generated by Claude Code

Activity

  1. added
    enhancementNew feature or request
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 1, 2026
  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

    Path: 能用的工作室 | none | P③

    Triage: p3 · domain:server · area:studio · 2026-11-01T15:45Z

    ⛔ Not a claim.

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

    Claim: PM loop round 1 · card thread · 2026-11-01T15:48Z
    Session: session_01FEkQ5kE5BrPUPNMMyv6oCH (the seat); the card thread is session_01FEkQ5ogKLgaK3fAZF4kmeF
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-9q8qlz (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#3
    Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」, and 2026-11-01T06:39Z 「server 队列还是很多任务,再开一个席位吧」. Grade: seat 3 triage 6560179406, under 2026-11-01T12:11Z 「定级你可以自己决定」. Scope: Wanted 1 and 2 only, Part of #28722.
    File surface: packages/spec/src/** (the answer declaration), packages/objectql/src/** and packages/metadata-protocol/src/** / packages/runtime/src/** (the read and its route if new), the ui reader under ui/packages/** if it lands here (D5), tests, and a changeset.
    Container & model: M, mode:thread, model: opus (--tier names no path mandate: PM's call, default), effort: default (the coordinator sets effort only from the maintainer's words)
    Clause-②: yes (widening) — expected: a new served member or read naming contributor packages; spec path ⇒ CONTRACT_REVIEW_TIER review before landing. The dev measures and declares the final value.
    Metadata-protocol: none (expected; the dev measures and declares)
    Responsibility: the code is the package/registry read layer (getObjectContributors, the object fold, the flow registry) · the platform path is the served read the dev chooses (N-15 customizations answer or a package read) · reached by Studio drawing an installed base with items other packages contribute
    Thread-read: 6560179406
    Premise: holds as filed (measured by the #28572 dev on origin/main d62d9737); the dev re-measures on current main
    Serial constraints cleared: read: seat 1 PR #28724 (#28564) and seat 5 #28565 touch extension fields; PR #28693 (#28412) and #28717 touch flows; the dev merges origin/main after whichever lands first. Wanted 3 (nav) waits on #27928.
    Resume-from: none — fresh from origin/main

    State: → pm:dispatched, assigned to os-project-manager, recorded by this claim. Order: pm-orders/server/order-28722.md (project folder).

  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5ogKLgaK3fAZF4kmeF

    os-dev-report
    {
    "issue": 28722,
    "status": "done",
    "branch": "claude/project-thread-9q8qlz",
    "pr": "#28749",
    "session": "session_01FEkQ5ogKLgaK3fAZF4kmeF",
    "premise_still_valid": true,
    "summary": "Wanted 1 and 2 landed as a new required member of the existing N-15 answer: GetPackageCustomizationsResponseSchema gains contributions (strict entries kind field|flow, object, name, packageId) and counts.contributions, served by readBaseContributions in packages/runtime/src/domains/packages.ts. Fields come from the extend contributors of each base-owned object (as N-15 reads the pair's), flows from registry.listItems('flow') whose start node config.objectName is a base-owned object and whose body is a code package's (isCodeArtifactBody); the base and its .custom pair are excluded and every item carries its own package stamp. Chose a member over a new route: same gate, closed query set, pair-id refusal and 404 already live there, and a new route would add a ledger row, mount, client method and dogfood census pins; the cost is four hand-built fixtures (one runtime, three ui tests) updated here, and N-19's in-flight ui fixtures will need the member after this lands. Fold-time stamping was measured and not taken (the fold is shared by every read and edited by #28565). Declarations measured as Clause-②: yes (widening), Metadata-protocol: none (a REST answer, nothing a metadata author writes), so spec and runtime ship patch; the order expected added/minor, the claim expected none, and the measurement agrees with the claim. Head b4a3676, based on origin/main 4bf48a8; none of the serial PRs (#28724, #28728, #28693, #28717) had landed, so no main merge was needed.",
    "tests": "pnpm --filter @objectstack/runtime exec vitest run src/domains/packages-customizations.test.ts: 17/17 at head; packages.ts restored to base 4bf48a8: 7 failed | 10 passed (the 4 new tests and the 3 whole-answer equalities). Ablations via scripts/ablation-replace.mjs, each restore proven (blob == HEAD 05d05a1e2764, git diff HEAD empty); runtime imports packages.ts from src so no rebuild between legs: pair exclusion removed 4 red; base exclusion removed 2 red; isCodeArtifactBody guard removed 1 red; base-owned trigger check removed 3 red. pnpm --filter @objectstack/runtime test: 504 files, 8203 passed, 19 skipped, exit 0. ui (from ui/, pnpm exec vitest run) BuilderLanding.customizationCounts-28566, customizationMarks, metadataAreaHost.customizations-28568: 3 files 22/22 exit 0; BuilderLanding fixture restored to base: 3 of 6 red (proves the fixture edit was needed). runtime typecheck and spec typecheck exit 0. Whole-repo pnpm build exit 0 (lock VERDICT command-exit 0).",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 109 commands, identical at 274f09f and b4a3676. --ran verdict: 109 derived, 109 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. First pass at 274f09f: 105 exit 0; check:doc-authoring exit 1 (real: tracker id in the route-ledger note string, fixed in b4a3676); check-plugin-teardown-shape --self-test exit 3 (shallow, fixture commit fetched, then 48 cases pass); check:skill-examples and check:dual-build-cjs-loads exit 3 (no built output; after whole-repo pnpm build both exit 0). Re-run at b4a3676: doc-authoring, route-envelope, issue-citations, nul-bytes, published-files, type-check-coverage, durability-log-level plus the four above, all exit 0. check-route-ledger-census exit 0. spec check:generated --fix regenerated 2 stale artifacts (docs, strictness ledger), re-checked green. eslint --no-inline-config over the 5 changed packages TS files exit 0; ui eslint over the 3 changed test files exit 0. ui app-shell type-check NOT MEASURED locally (needs every ui package built; TS2307 on unbuilt siblings); CI Type Check UI covers it. PR check-runs: in_progress at report time.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "7 — issue_read x4 (#28722 get, #28722 comments x2, #28572 get), pull_request_read x3 (#28572 get 404, #28728 get, #28749 get read-back); no write tools",
    "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches for relay pr_create (#28749), and this os-dev-report comment via post-stamped; plus git push of the harness branch (not REST)",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: #28572 — D5 ui reader: the greyed, attributed drawing of contributions is N-19 work; N-19 is in flight on the ui lane and not on main, so drawing it here would edit the same Studio surfaces. The served key is pinned by the server test. Its hand-built customization answers must also carry contributions and counts.contributions once this lands (strict required member).",
    "carrier: #27928 — Wanted 3 (navigation entries contributed to the base app) waits on that ruling; this PR is Part of #28722."
    ],
    "deviations": "Expected declaration in the order was Metadata-protocol: added / spec minor; measured none / patch per AGENTS.md Post-Task Checklist step 3 (a response member is not authorable), matching the claim. One extra local fixture edit outside spec/runtime: four test fixtures (runtime mount test, three ui tests) gained the required member."
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5ogKLgaK3fAZF4kmeF

    Supersedes the declaration reading in os-dev-report 6561138282 (its summary and deviations): that reading is refuted.

    • PR feat(runtime): the per-base customizations read names the package behind each field and flow another package contributes #28749 head is now 7edbf44b, one commit on b4a36765 that changes only the changeset.
    • Corrected kind: Metadata-protocol: added, with @objectstack/spec minor and @objectstack/runtime minor. The new contributions member moves the spec's authorable-surface shard (packages/spec/authorable-surface/api.json), so the kind is added, not none, and every moved package takes minor. Clause-②: yes (widening) is unchanged.
    • At 7edbf44b: check-adr-0087-registration --base origin/main, check-empty-changeset --base origin/main and check-changeset-no-major --base origin/main exit 0. Every other field of the report stands.

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

    PR #28749 (Wanted 1 and 2: contributions on the customizations answer) is accepted (seat ACCEPT #28749 (comment), contract review PASS #28749 (comment)) and enqueued for merge. It is Part of #28722, so this card stays open for Wanted 3 (nav entries), which waits on #27928. A landing record follows after merge.

  7. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

    Landing record · #28722 (Wanted 1 and 2) · PR #28749

    domain:server seat 3 · session_01FEkQ5kE5BrPUPNMMyv6oCH · 2026-11-01T20:12Z

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28749-*' 0 refs (released)
    Ancestry git merge-base --is-ancestor 8196881e origin/main yes
    Content git grep -n "function readBaseContributions" origin/main -- packages/runtime/src/domains/packages.ts; git grep -n "contributions:" origin/main -- packages/spec/src/api/package-lifecycle.zod.ts reader at line 3215; spec member at line 401, count at line 423
  8. 1 remaining item

  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim: PM loop round 2 · card thread · 2026-11-03T01:04Z
    Session: session_01JQwxbYyp6wSRcywGFK2L4A (the seat); the card thread is session_01JQwxbYJ6AF6nA1jMoub4rQ
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-f3xzh7 (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#3
    Ruling-ref: #27928 letter E, record 6566915346 (the maintainer's 「同意」 2026-11-02T01:29Z); its Execution line: "After it lands, domain:server seat 3 finishes #28722 Wanted 3 on the same ruling". The spec slice landed as PR #29401 (0c640141). Scope: Wanted 3 only (Wanted 1–2 landed in PR #28749).
    File surface: packages/runtime/src/domains/packages.ts (readBaseContributions reads the nav contribution registry) and its tests; packages/objectql/src/registry.ts only if a read accessor is missing; packages/spec/src/api/package-lifecycle.zod.ts (drop the nav arm's [PLANNED — not yet served] marker, as its own docblock says this slice does) with package-lifecycle.test.ts and regenerated references; a changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; spec surface ⇒ seat review at CONTRACT_REVIEW_TIER before landing), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6571747124
    Premise: holds (on origin/main e0187d0f: readBaseContributions types its entries as Exclude<…, { kind: 'nav' }>, and the spec nav arm's describe opens [PLANNED — not yet served]); the dev re-measures and declares Clause-② / Metadata-protocol from the diff
    Serial constraints cleared: #29342 (seat 5, other regions of package-lifecycle.zod.ts / packages.ts) and #29649 (seat 4, ownDocumentsOf in packages.ts): region-disjoint by claim text, UNKNOWN by diff; the dev merges origin/main before the PR and after either lands
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-warren. Order: project folder pm-orders/server/seat3/order-28722.md.

  10. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYJ6AF6nA1jMoub4rQ
    os-dev-report

    {
      "issue": 28722,
      "status": "done",
      "branch": "claude/project-thread-f3xzh7",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29742",
      "session": "session_01JQwxbYJ6AF6nA1jMoub4rQ",
      "premise_still_valid": true,
      "summary": "Wanted 3 served on ruling E (6566915346). readBaseContributions (packages/runtime/src/domains/packages.ts) now reads the navigation-contribution registry the served app's fold reads (getAppNavContributions), for every app registered under the base (listItems('app', baseId)): one nav entry per contribution item that declares an id, { kind: 'nav', app, group?, name, packageId }, group named whenever the contribution names one (including a group the app does not declare). A disabled package is skipped with the fold's own isPackageDisabled (#28117); the base, its pair, package-less registrations and the sys_metadata sentinel are excluded by the codePackageOf predicate the field and flow kinds already share; no nav item key is read or written. Order as the member describe: field/flow first as before, then nav by app, group (none first), name, package. The forced Exclude type #29401 added is gone. Spec: the nav arm, member, schema describe, file header and docblock drop the PLANNED / not-yet-served wording (MUSTs kept), the three marker pins in package-lifecycle.test.ts are flipped in the same PR, package-lifecycle.mdx regenerated, metadata-api.mdx names the kind as served. Declarations measured: Clause-② no (arm already declared), Metadata-protocol none (check:authorable-surface green, no authorable-surface shard moved); changeset runtime patch + spec patch (describe text ships in dist). Main merged three times via os-regen-merge.sh (fc558923, 3d5933a9 after #29651, 0eb97fa4 after #29649 landed as #29687); final head 58810e41.",
      "tests": "Red first: test commit 8b347c02 on base 744211fc, packages-customizations.test.ts exit 1, 6 failed | 16 passed (AssertionErrors on missing nav entries); spec pin flip against unchanged zod exit 1, 3 failed | 50 passed. Green: packages-customizations.test.ts 22/22; package-lifecycle.test.ts 57/57 at 58810e41. Ablations via scripts/ablation-replace.mjs, each restored (blob == HEAD 21dfef8a1015, git diff HEAD empty; runtime imports packages.ts from src, no rebuild between legs): disabled skip deleted 1 red; codePackageOf replaced by raw packageId 6 red; listItems('app', baseId) to listItems('app') 2 red; item-id guard deleted 1 red; group spread deleted 2 red (first attempt used an empty --replacement, refused by the tool before running, rerun with --delete). pnpm --filter @objectstack/runtime test under lock at 58810e41: VERDICT command-exit 0, Test Files 531 passed (531), Tests 8529 passed, 19 skipped. pnpm --filter @objectstack/spec test at 9540d333: exit 0, Test Files 803 passed (803), Tests 23782 passed, 1 todo. spec typecheck exit 0; runtime typecheck exit 0 at 58810e41 (first run exited 1 only on TS2307 for an unbuilt @objectstack/driver-turso in an untouched test file; 0 after building it).",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 58810e41: 104 commands, all 104 exit 0 (stdin closed, exit captured before any pipe); --ran: 104 derived, 104 run, 0 NOT-MEASURED, 0 UNRUN, exit 0 (same at a4c5be41). First round at 9540d333: 101 exit 0, three exit 3 on prerequisites: check-plugin-teardown-shape --self-test (shallow; fixture commit fetched, then 48 cases pass), check:skill-examples and check:dual-build-cjs-loads (no built output; exit 0 after turbo build ./packages/** VERDICT 0). spec check:generated: named only check:docs stale before gen:docs, exit 0 after (check:authorable-surface green); one run at a4c5be41 reported check:test-typecheck 'failed without diagnostics' when started without NODE_OPTIONS, OK when rerun with --max-old-space-size=4096 (52 files / 240 errors / 131 signatures held), final check:generated exit 0 at 58810e41. pnpm lint exit 0 at 58810e41. PR check-runs: in_progress at report time; test:repo is CI's (Test Core).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called; card, comments, claim and PR read-back via REST GETs",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, draft PR #29742, body read back 12077/12077 bytes identical); POST /repos/objectstack-ai/objectstack/issues/28722/comments (this os-dev-report via post-stamped.mjs). git push of the harness branch is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: for a disabled base, listItems('app', baseId) already hides the base's app, so the read lists no nav entry while field entries on its objects are still listed; nothing is served to contribute to in that state (observation, zero pull; in the PR's Acceptance notes)",
        "carrier: ui seat 4 · the greyed drawing of nav contributions (#27356 row 20) is the domain:ui card the ruling's Execution line names, filed after this lands"
      ],
      "deviations": "PR body: no assignee and no reviewer set and no PR-activity subscription (the order forbids MCP writes and os-dev forbids PR assignees; the seat reads CI). Main merged three times rather than once because #29651 and then #29687 (#29649's change, a serial PR the order names) landed during the run; each merge went through os-regen-merge.sh and every reading was retaken at the final head. Serial note for #29342: it edits the same package-lifecycle.zod.ts header paragraph this PR trims to withheldMaps only; whichever lands second takes the other's sentence."
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Landed · 2026-11-03T04:41Z

    Probe Reading
    PR #29742 MERGED by the merge queue at 2026-11-03T04:40Z, merge commit 8d208a4d3e1a875133955a1d12b75737e637871c
    origin/main packages/runtime/src/domains/packages.ts builds kind: 'nav' entries in readBaseContributions (3 hits); the spec nav arm carries no [PLANNED — not yet served] marker

    State: closed by Fixes #28722 (completed); pm:dispatched removed. Delivered: Wanted 3, the customizations read serving the nav contributions (ruling 6566915346 letter E). Remaining per the ruling's Execution line: ui seat 4 files the Console drawing card. Notified by mailbox (#28700). Serial note stands for #29746 (#29342): its header paragraph should end up naming PackageExportBundleSchema alone.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestfindingpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions