Skip to content

packages: a tenant exports its whole ontology — every installed package, its .custom pair and environment customizations — as installable packages for the open runtime (os package export + the read it calls) #28914

Closed

Description

@objectstack-fleet

director#1 · zhuangjianguo · session_01QsR2jV5sBSzCYNEDgpYLJw

Blocked-by: #29617
Unlock-action: re-check #29617 when it is closed (server slice resumes; claim 6589102677 released)

Filing gate: ② a maintainer decision. The maintainer, on docs.objectos.ai #334 question 1 (batch #452 item 5), verbatim: 「Cloud/Enterprise 租户怎么导出本体?同意,同时立开发卡。」 — ruling 6568804196 (docs.objectos.ai #334): the docs narrow their "exportable" sentences to a planned capability now, and the platform builds the capability. This card is that capability. ⛔ Not a claim. Grade and lane are triage's; the read and the command are a new served surface, so the spec slice comes first.
Business reason: ObjectOS's positioning (E1 in apps/docs/lib/positioning.ts of docs.objectos.ai, and six docs pages) promises a customer that the ontology they build on ObjectOS Cloud or Enterprise is theirs: they can export it and run it on the Apache-2.0 runtime. Today no door does that. A customer who asks "how do I take my ontology out" gets no command and no page. Exit right is the promise that makes "no lock-in" true; until this lands the docs say "planned".
Reader who acts: domain:spec for the shape (packages/spec/src/api/export.zod.ts / package-lifecycle.zod.ts, Metadata-protocol: added, Clause-②: yes (widening), CONTRACT_REVIEW_TIER), then domain:server (packages/runtime/src/domains/packages.ts, packages/cli). The docs page "export your ontology" follows on docs.objectos.ai #334 once this lands.
Dedupe (open AND closed): ontology export → 10 hits, none about an export door (#27261 federation, #26140/#22951/#22172/#21838 positioning prose, the rest unrelated); export in:title is:open → 0; "deployment export" OR "tenant export" OR "export all packages" → 0 relevant (#24143 and #8484 are the CSV data export). Nearest shipped neighbour: GET /packages/:id/export (ADR-0070, per-package layer #28409, pair override declarations ADR-0146 D8.3), which is one package at a time.

维护者速读

  • 改了什么(本卡要做的):给平台加一个「导出整个租户本体」的门:一次调用导出这个部署里所有已安装的包(基础包、它们的 .custom 配对包、环境级定制),得到一组可以在开源运行时上直接安装的包;配一个 os package export 命令调用它。
  • 为什么:官网和文档承诺「本体是你的,可以导出到开源运行时跑」,今天没有任何入口;docs Remove ObjectStackKernel legacy code and update to microkernel-only architecture #334 按您的裁定先把文案收窄成「规划中」,这张卡把它做成真的。
  • 先看:今天只有按包导出 GET /packages/:id/export(27 种元数据类型,一次一个包);CLI 只有 package install / package publish。
  • 需要你做的:无;分诊定级定车道后由 spec 席先定形状。

Measured (origin/main 9a9823d9, read-only)

Wanted

  1. The shape (spec first). One served read that answers the deployment's whole ontology as a bundle: the list of installed packages in dependency order, and for each the same body GET /packages/:id/export serves today (so the per-package export stays the single producer and the bundle composes it). The .custom pair of each base is included as its own package with its override declarations; environment-scope customizations are included under the package that owns them, as the per-package export already places them. Whether this is a new route (for example GET /packages/export) or a new member of an existing read is the spec card's call; the response shape is declared in packages/spec/src/api, and the liveness row and Metadata-protocol: added follow.
  2. The command. os package export [--out DIR] calls that read and writes one directory per package, each installable with os package install on an open runtime, in the dependency order the read gives. A refusal (no builder standing, a package that cannot be exported) is loud and names the package.
  3. Nothing secret leaves. The bundle carries no credential value: the feat(spec)!: the connector write door refuses an inline secret on every instance auth kind; the metadata read redacts connector credential positions #28596 withholding applies on this read as on every other, and credentialRef names survive as references. A test proves a connector with auth.credentialRef exports with the reference and without the secret.
  4. Round trip. A test installs the exported bundle on a fresh runtime and reads the same objects, fields, flows, apps and permission sets back (names and counts), base and pair alike.

Done criteria

  • os package export on a deployment with a base, its .custom pair and a third package that extends the base produces three installable packages; os package install of the bundle on a fresh runtime yields the same metadata names and counts (test).
  • A connector with auth.credentialRef exports with the reference and without any credential value (test).
  • The served read's response is declared in packages/spec/src/api and validated by the route (Metadata-protocol: added, CONTRACT_REVIEW_TIER record on the PR).
  • docs.objectos.ai Remove ObjectStackKernel legacy code and update to microkernel-only architecture #334 gets its "export your ontology" page as a follow-up once this lands (the docs lane files it; not this card's scope).

Dedupe words: ontology export, tenant export, whole-deployment export, os package export, export bundle, exit right.

Ruling-ref: docs.objectos.ai #334 comment 6568804196 (batch #452 item 5, Q1 → B + development card).
Related: docs.objectos.ai #334, #28409 (per-package export layer), ADR-0070, ADR-0146 D8, #28596 (credential withholding).

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: priority:p1 · domain:spec · pm:queue · 2026-11-02T05:09Z

    ⛔ Not a claim.

    • Read fresh. The card adds a new served read (a whole-deployment export bundle declared in packages/spec/src/api, Metadata-protocol: added) and a new os package export command, which is a new public surface, so it is p1 under 「协议新增定 p1」. The maintainer's ruling quoted from docs.objectos.ai Remove ObjectStackKernel legacy code and update to microkernel-only architecture #334 approves building it, and the card leaves the route-versus-member choice to the spec seat under CONTRACT_REVIEW_TIER, so it goes to pm:queue in domain:spec. The read in packages/runtime/src/domains/packages.ts and the packages/cli command follow as a server slice behind Blocked-by:. The done criteria are all in this repo; if the hosted runtime needs a cloud-side change, that half moves to domain:cloud.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

    Claim: PM loop round 1 · 2026-11-02T05:20Z
    Session: session_01ADHkmPi25XXKx92Xmg4viS (seat); dev = card thread session_01ADHkmScwpkMFTAD5HHubn1
    Account: os-steve
    Branch: claude/project-thread-weie9b
    Worktree: the card thread's own checkout of objectstack-ai/objectstack
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: packages/spec/src/api/package-lifecycle.zod.ts (a bundle response composing PackageExportManifestSchema) and the package route declaration (package-api.zod.ts / package-api-assembled.zod.ts, whichever carries GET /packages/:id/export) and their tests; the liveness, authorable and api-surface ledger rows the spec gates name; regenerated content/docs/references/**; root .changeset/; not packages/runtime, not packages/cli (the server slice, Blocked-by: this PR) (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default — the tier is the PM's per-card call (floor sonnet · default opus · ceiling fable); one CONTRACT_REVIEW_TIER review (a new served read) before landing, effort: xhigh
    Clause-②: yes (widening)
    Metadata-protocol: added
    Responsibility: n/a — not a defect card
    Thread-read: 6569574210
    Premise: holds (on origin/main 62b3ec36 only GET /packages/:id/export exists, one package at a time; no read answers the deployment's installed set as one bundle; packages/cli/src/commands/package/ holds install.ts and publish.ts only)
    Serial constraints cleared: none (the seat's other in-flight cards #28864, #28934, #28914, #28912, #28896 hold disjoint files)

    Ruling-ref: 6568804196 (docs.objectos.ai #334, maintainer 「Cloud/Enterprise 租户怎么导出本体?同意,同时立开发卡。」); triage 6569574210 leaves route-versus-member to the spec seat. This PR is Part of #28914. Every new public name (route path, schema name, key) waits for the maintainer's approval before landing.

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-steve · session_01ADHkmScwpkMFTAD5HHubn1
    os-dev-report

    {
      "issue": 28914,
      "status": "done",
      "branch": "claude/project-thread-weie9b",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29100",
      "session": "session_01ADHkmScwpkMFTAD5HHubn1",
      "premise_still_valid": true,
      "summary": "Spec slice of #28914. `PackageExportBundleSchema` (plus `PackageExportBundle` / `PackageExportBundleParsed`) in packages/spec/src/api/package-lifecycle.zod.ts declares the data of `GET /api/v1/packages/export`: `{ packages: PackageExportManifest[] }`, strict at the top level, each entry exactly the per-package export (the element IS `PackageExportManifestSchema`, pinned by identity), every package but the platform's own (manifest scope `system`), in ADR-0141 D5 dependency order so a `.custom` pair follows its base; no credential value, `credentialRef` stays a reference. Pure widening: no existing shape or accept set changes and no runtime serves the route yet. Draft PR #29100, head 2882de4a (origin/main 12aad143 merged in; branch delta vs main unchanged at 11 files +221/-8).",
      "tests": "Head 2882de4a, each heavy run under os-verify-lock (VERDICT command-exit 0 each): turbo build of the runtime+cli closures; `pnpm --filter @objectstack/spec check:generated` exit 0 (all artifacts current); `pnpm --filter @objectstack/spec test` Test Files 790 passed (790), Tests 23362 passed, 1 todo; `pnpm --filter @objectstack/spec typecheck` exit 0. Consumer suites on 0493264f (same branch delta, origin/main ab085a04): `pnpm --filter @objectstack/runtime test` Test Files 513 passed (513), Tests 8267 passed, 19 skipped, typecheck exit 0; `pnpm --filter @objectstack/cli exec vitest run --project unit` Test Files 368 passed (368), Tests 5196 passed, typecheck exit 0; the same three suites also green on 020adeb0 before any merge. New tests: package-lifecycle.test.ts 30/30 (5 new). Ablations on 020adeb0 via ablation-replace.mjs: dropping `.strict()` on the bundle -> 1 failed | 29 passed (the strictness test); swapping the composed element for a hand-copied open object -> 1 failed | 29 passed (only the identity pin catches it); both restored, blob == HEAD, `git diff HEAD` empty. Reverse type probe against the rebuilt .d.ts: a bundle literal compiles, `{ packages: [], cycles: [] }` is TS2353; probe deleted. eslint --max-warnings=0 on the two changed .ts files exit 0.",
      "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` on 2882de4a: 103 commands; all 103 `:: exit 0` (exit codes captured before any pipe). `dispatch-gates --ran`: \"103 derived famil(ies) accounted for — 103 run, 0 NOT-MEASURED (a DERIVED zero — all 103 recorded an exit code and none of them is 3)\", exit 0. Same 103 all exit 0 on 0493264f. `node scripts/check-changeset-no-major.mjs --base origin/main --event` (the PR body, offline) on 2882de4a: exit 0, LEVEL AXIS `yes (widening)` + `added`, `@objectstack/spec: minor`. Local-only: `check:skill-frame-freshness` exit 0; `check:dev-prereqs` exit 1 is a box precondition (35 ui/ dists unbuilt in this container), not a reading about the diff. CI check-runs not cited: the order says not to wait on CI.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — all reads: issue_read get #28914, issue_read get_comments #28914 (x2), pull_request_read get #28920, pull_request_read get #29100. No MCP write tool.",
      "api_writes": "2 so far through the fleet relay: pr_create (draft #29100, no assignees, no labels; read-back 15046 bytes sent = stored) and this os-dev-report comment on #28914 via post-stamped.mjs. Plus `git push` of the branch (not a REST write).",
      "open_questions": [
        {
          "question": "Approve the new public names: route `GET /api/v1/packages/export`; schema `PackageExportBundleSchema` with types `PackageExportBundle` / `PackageExportBundleParsed`; key `packages`.",
          "options": ["A approve as written", "B rename before landing (name the replacement)"],
          "recommendation": "A, because they sit beside `PackageExportManifestSchema` and the existing `packages` key of `GET /packages`; `export` can never be a package id (MANIFEST_ID_PATTERN needs two dot-separated segments), so the path cannot collide with `/packages/:id`."
        },
        {
          "question": "Which packages the bundle carries.",
          "options": ["A every package but the platform's own (manifest scope `system`), enabled or not (this PR)", "B every package `GET /packages` lists, the consumer skipping what the target already has"],
          "recommendation": "A, because the card's done criterion (a base, its pair and a third package produce three installable packages) holds only if the platform packages every runtime ships for itself are left out; B pushes a skip rule onto every consumer."
        },
        {
          "question": "The per-package export (`assemblePackageManifest`, packages/runtime/src/domains/packages.ts) drops `manifest.namespace` and `manifest.dependencies`; a reinstalled `.custom` pair would derive namespace `custom` from its id and lose its base edge.",
          "options": ["A the server slice measures the round trip first and, if a pair fails, a spec card adds both as declared fixed keys of `PackageExportManifestSchema`", "B add them to `PackageExportManifestSchema` in this PR now"],
          "recommendation": "A, because declaring keys no producer emits yet would be declared-not-enforced, and the measurement belongs to the slice that runs the round-trip test."
        }
      ],
      "out_of_scope_findings": [
        "namespace/dependencies dropped by the per-package export (read, not reproduced: no round trip runs today) · carrier: #28914 server slice · noted, not filed"
      ],
      "handoff_slices": [
        "runtime handler: mount `GET /api/v1/packages/export` in packages/runtime/src/domains/packages.ts — the per-package export's read gate (studio.access or setup.access, or system), closed empty query set (any parameter -> 400 VALIDATION_ERROR naming it), every package but scope `system`, ordered by `orderHydrationBatch` (packages/core/src/hydration-order.ts), each entry from `assemblePackageManifest`, whole or absent (a package that cannot be assembled fails the read, naming it)",
        "route ledger: a packages/runtime/src/route-ledger.ts row with responseSchema `PackageExportBundleSchema`, the authz census move, and the `PackageApiContracts` entry in the same change that mounts it",
        "client SDK: a `client.packages` method for the bundle and its unwrap-misfire.pin.test.ts roster row",
        "cli: `os package export` in packages/cli (writes one installable package per entry, in order) plus its tier wiring",
        "tests: round trip (base, its `.custom` pair with overrides, a third package -> three installable packages that reinstall on a fresh runtime) and credential (no credential value in the bundle; `credentialRef` survives as a reference)",
        "docs (the PR's Skills-docs follow-up): content/docs/deployment/cli.mdx (`os package export`) and content/docs/concepts/metadata-lifecycle.mdx (export paragraph names only the per-package route)",
        "measurement owed by the server slice: open question 3 (namespace/dependencies on the round trip)"
      ],
      "files_changed": [
        "packages/spec/src/api/package-lifecycle.zod.ts (+71)",
        "packages/spec/src/api/package-lifecycle.test.ts (+96)",
        ".changeset/28914-package-export-bundle.md (+14, @objectstack/spec minor)",
        "generated by check:generated --fix: content/docs/references/api/package-lifecycle.mdx, content/docs/references/index.mdx, docs/audits/2026-07-unknown-key-strictness-ledger.counts/api.md, packages/spec/api-surface/api.json, packages/spec/authorable-surface/api.json, packages/spec/declaration-map/api.json, packages/spec/export-origins/api.json, packages/spec/json-schema.manifest/api.json"
      ],
      "line_budget": "No PM line budget (no skills/** touched). Size M: 11 files, +221/-8 vs main; hand-written +181 (schema 71, tests 96, changeset 14), generated +40/-8.",
      "deviations": [
        "No package-api edit: neither package-api.zod.ts nor package-api-assembled.zod.ts declares the per-package export route, and PackageApiContracts says a route is declared only in the change that mounts it; the declaration lives in the schema docblock and goes to the ledger with the server slice.",
        "No liveness row: liveness ledgers are per metadata type (packages/spec/liveness/TYPE.json); an API response schema has none. check:liveness exit 0.",
        "Two origin/main merges, both through os-regen-merge.sh: ab085a04 into 0493264f before the PR opened, then 12aad143 into 77b86c59 after it (the PR had gone dirty on generated artifacts). On the second, step 3's commit was refused by the pre-commit hook (artifacts stale after the merge); regenerated with `check:generated --fix` and committed as 2882de4a. Main's new entries survived and the branch delta is unchanged. The PR body (written once) cites 0493264f; this report carries the 2882de4a readings for the seat to append.",
        "runtime and cli consumer suites were not re-run on 2882de4a: the second merge changed only main's own files, the branch touches neither package, and CI Test Core runs them on the head.",
        "Report layout: signature on line 1 and `os-dev-report` on line 2, as os-dev.md and post-stamped.mjs require, where the standard order says line 1.",
        "On 0493264f's first gate pass `pnpm check:dual-build-cjs-loads` exited 3 (no dist for connector-slack, organizations, service-print in this container); built those three and re-ran: exit 0, recorded as exit 0. On 2882de4a it was exit 0 first time.",
        "cli `integration` vitest project not run locally (the diff touches no cli file); left to CI."
      ]
    }

    Stamped 2026-11-02T08:05Z.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

    Decision needed · new public names · 2026-11-02T14:40Z

    维护者速读

    Seat recommendation: A. The seat lands PR #29100 once the ruling is on this card.

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

    Decision withdrawn · 2026-11-02T17:05Z

    The seat withdraws its "Decision needed" comment 6579953358. That question was only about names (GET /api/v1/packages/export, PackageExportBundleSchema, packages). pm-dispatch has no maintainer gate for choosing a public name: the seat picks it, and only a real semantic or contract split goes to the maintainer. No such split is open here. The seat keeps the recommended names and lands PR #29100 on its CONTRACT_REVIEW_TIER PASS. needs-user-decision is removed.

  6. 13 remaining items

  7. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p1 kept · pm:blocked → pm:queue · 2026-11-03T01:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  8. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS

    Claim: PM loop · server slice resumed · 2026-11-03T02:20Z
    Session: session_01JQwxbacSXJQqAztgt4UMrS (seat); dev = card thread session_01JQwxbWrCtyQtTGt4iYTTvX
    Account: os-warren
    Branch: claude/project-thread-ahcrjb (a project card thread pushes only its assigned branch; measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28914
    Domain: domain:server (hand-off 6588925516 from domain:spec#1)
    Seat: domain:server#4
    File surface: packages/runtime/src/domains/packages.ts (the new GET /api/v1/packages/export route beside the per-package export), the route ledger row, packages/cli (the command, the client method, the unwrap-misfire.pin.test.ts roster row), the [PLANNED — not yet served] marker and its pinning test in packages/spec/src/api/package-lifecycle.zod.ts / package-lifecycle.test.ts plus any generated surface that text regenerates, content/docs/deployment/cli.mdx, content/docs/concepts/metadata-lifecycle.mdx, tests, changesets (stop on breach; explain in the report). No new spec key.
    Container & model: L, mode:thread (the os-dev agent type is not loaded in seat sessions), model: TIER_DEFAULT, effort: project default (the maintainer sets effort)
    Clause-②: yes (a new served route; dev confirms from the diff)
    Metadata-protocol: none
    Responsibility: n/a — feature, server slice after spec PR #29100
    Thread-read: 6593456143
    Premise: spec slice landed (PR #29100, f1d795b1a5); the round-trip blocker #29617 landed as PR #29651 (a6a369efae), so an export carries namespace and dependencies; fresh from origin/main c9636f1e
    Serial constraints cleared: #29617 closed (PR #29651); #29649 (export path of packages.ts) merged as PR #29687 33ee9aa1; the protocol.ts freeze lifted (6588593530). Contract review owed on the spec marker face before the queue.

  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-warren · session_01JQwxbWrCtyQtTGt4iYTTvX
    os-dev-report

    Server slice built and opened as draft PR #29755: GET /api/v1/packages/export, client.packages.exportAll(), os package export [--out DIR], the [PLANNED] marker dropped. Both Done tests pass on two showcase boots (round trip of base + .custom pair + a third package; credentialRef exported, secret absent). The marker drop is the published-schema face the seat's contract review reads.

    {
      "issue": 28914,
      "status": "done",
      "branch": "claude/project-thread-ahcrjb",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29755",
      "session": "session_01JQwxbWrCtyQtTGt4iYTTvX",
      "premise_still_valid": true,
      "summary": "Server slice of #28914, on top of PR #29100 (spec) and PR #29651 (namespace and dependencies on each export). The runtime dispatcher serves GET /api/v1/packages/export (packages/runtime/src/domains/packages.ts, assemblePackageExportBundle, matched and mounted ahead of GET /packages/:id): the per-package export's read gate, a closed empty query set (400 VALIDATION_ERROR naming the parameter), every registry row whose source is not code with disabled rows included, ordered by orderHydrationBatch over declaredDependencyIds, each entry from assemblePackageManifest only, whole or absent (a thrown assembly keeps its status with the message naming the package; a null one answers 500 naming it). Route-ledger row (packages.exportAll, PackageExportBundleSchema) with its census sentence; client.packages.exportAll() plus its unwrap-misfire roster row; os package export [--out DIR] writing DIR/NN-ID/objectstack.json in the order served, each installable with os package install; the [PLANNED] marker dropped and its spec test flipped; cli.mdx and metadata-lifecycle.mdx taught; one changeset (runtime, client, cli, spec patch).",
      "tests": "Head 43a7c550 (suites on 699399a4; 43a7c550 changes only the route-ledger census digit). New: runtime src/domains/packages-export-bundle.test.ts Tests 10 passed (10); cli test/package-export.test.ts Tests 6 passed (6), including each written file posted unchanged as the manifest by the real os package install; dogfood test/package-export-bundle-round-trip.dogfood.test.ts Tests 5 passed (5) over two showcase boots (base + .custom pair with a published override + a third package extending the base: exactly three entries, base first, the pair keeps namespace exportbase_custom and its base edge; installed in order on a fresh showcase through install-local, the target's bundle answers the same ids, order, namespace, dependencies and per-collection names and counts; a connector exports its credentialRef and the secret it resolves to appears nowhere in the response). Suites, each VERDICT command-exit 0: spec Test Files 803 passed (803), Tests 23792 passed, 1 todo; client 54/54 files, 695 tests; cli --project unit 376/376 files, 5295 tests; runtime 532/532 files, 8535 passed, 19 skipped; typecheck exit 0 for spec, client, cli, runtime, dogfood. Ablation on 699399a4 via ablation-replace.mjs (runtime tests read packages.ts from source): order sorter replaced by listing order gives 2 failed of 10; the code-source filter disabled gives 2 failed of 10; both restored, blob equals HEAD 8a46b0cd25ab, git diff HEAD empty.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 111 derived, same list on 699399a4 and 43a7c550. First pass: 107 exit 0; check:route-ledger-census exit 1 (census sentence 116 vs 117 rows, fixed with its --fix in 43a7c550, then exit 0); check:skill-examples and check:dual-build-cjs-loads exit 3 (unbuilt dists), exit 0 after building them; check-plugin-teardown-shape.mjs --self-test exit 3 on both heads (fixture commit outside the shallow clone), NOT MEASURED. Re-run on 43a7c550, exit 0 each: route-ledger-census, skill-examples, dual-build-cjs-loads, type-check-debt, query-options-erasure, route-envelope, dispatcher-error-vocabulary, system-context-census, spec-docblock-symbol-anchors, nul-bytes, and pnpm lint (eslint . --no-inline-config). dispatch-gates --ran: 111 derived famil(ies) accounted for, 110 run, 1 NOT-MEASURED (1 derived from a recorded exit 3), exit 0. CI check-runs: in_progress at report time, not waited on.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2: pr_create (draft #29755 through the fleet relay, 13612 bytes sent = stored, no assignees, no labels) and this os-dev-report comment on #28914 through post-stamped.mjs. Plus git push of the branch (not a REST write). REST reads: issue 28914, its comments, claim 6593769624, pulls 29100 and 29651 with their files, pull 29755 read-back.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · assemblePackageManifest treats a per-type read error as an unsupported type and skips it (continue), so the bundle inherits a silently missing collection if the protocol throws for one type; observed in reading, not reproduced; noted in the PR's Acceptance notes, not filed"
      ],
      "deviations": [
        "Claim line Clause-② yes (a new served route) written as yes (widening) in the PR body and changeset: the AGENTS.md closed arm set has only (widening) and (narrowing).",
        "Changeset level patch on all four packages: Metadata-protocol none takes patch under the AGENTS.md level rule.",
        "cli integration tier not run locally (the diff touches no integration-tier file or spawn entry); left to CI.",
        "The PR body carries the os-dev headings plus the template's Why and Human Minimum; Before Submitting left unchecked."
      ],
      "body_amendments": []
    }

    Generated by Claude Code

  10. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS

    Landing record · #28914 · PR #29755 · 2026-11-03T05:02Z

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-29755-*' 0 refs (released)
    Ancestry git merge-base --is-ancestor b3d14150 origin/main yes
    Content git grep -c assemblePackageExportBundle origin/main -- packages/runtime/src/domains/packages.ts 3

    Release: claim 6593769624 (session_01JQwxbacSXJQqAztgt4UMrS, card thread session_01JQwxbWrCtyQtTGt4iYTTvX, branch claude/project-thread-ahcrjb) · full landing
    Produce: PR #29755 merged as b3d14150 at 2026-11-03T05:01Z. A tenant can now export its whole ontology in one read. GET /api/v1/packages/export answers every installed non-code package, each exactly as GET /packages/:id/export answers it, dependencies first. client.packages.exportAll() and os package export [--out DIR] call it, and the CLI writes one installable directory per package. The [PLANNED] marker is off PackageExportBundleSchema. A base, its .custom pair and an extending package round-trip onto a fresh runtime with namespace and dependencies kept. A credentialRef connector exports the reference and no secret. The contract review PASS (CONTRACT_REVIEW_TIER) and ACCEPT are on the PR. Fixes #28914 closed this card as completed.

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

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions