Repository navigation
docs: a marketplace handbook for app authors — listing metadata, README conventions, os package publish --submit, review, the customer install experience (credentials, sample data, upgrade, uninstall) and staying current with platform versions #27240
Description
Filing gate ③ (maintainer-directed task). The maintainer in this session, 2026-10-28, verbatim: 「要的,立一张上架手册的卡」, answering the offer of a handbook for third-party app authors covering the whole road from a built artifact to a customer's installed app.
Filed by session_01J8VVAjRKqdoEYQ4hXxtBuf. ⛔ Not a claim. Lane suggestion: domain:devx (content/docs/**). Triage sets labels and priority. North Star road step ④ 「发布并装进一个环境」 is the step this page serves; its checklist items are platform-core.marketplace-install-local-lifecycle, platform-core.marketplace-console-honesty, platform-core.manifest-install-contract, platform-core.package-lifecycle-enable-disable, cli.plugin-manifest-build-contract.
Business reason. The North Star's one measure is a new AI developer walking from npm create objectstack to an app published and installed into an environment. The mechanics of that step are documented in pieces — content/docs/deployment/publish-and-preview.mdx (compile, publish a version, install, preview), install-modes.mdx, app-dependencies.mdx, cloud-connection.mdx, the CLI reference for os package publish / os package install (#8965) — but no page tells an author what a marketplace listing is made of and what the customer will go through: the objectstack.manifest.json listing fields (display name, tagline, description, category, icon, screenshots with captions, translations), the README conventions a listing relies on (what the app does, what credentials it needs and where to get them — the hand-off ruled on #27230), --submit and what review looks at, how the customer's administrator sees the app (Browse Marketplace vs. import of an artifact, the credential prompt, sample data reseed/purge, enable/disable, upgrade by publishing a new version, uninstall and what it removes), and how to stay current with platform versions (engines.protocol, os migrate meta, why an app pinned to an old platform leaves the catalog). The survey of 2026-10-27 found every downstream app but HotCRM pinned to an older platform — a handbook that says "this is what keeps you listed" is the cheapest countermeasure. Readers: third-party and first-party app authors (HotCRM, HotCLM, hotsrm, ATS, Duly maintainers included), and the agents that write apps from skills/**.
Who acts. The domain:devx seat writes one page (plus meta.json), linking the existing deployment pages rather than duplicating them; HotCRM's README.md and objectstack.manifest.json serve as the worked example. Facts about the hosted review flow that live in the cloud repository are stated only as far as this repository's CLI exposes them (--submit, --auto-approve, listing status); nothing is asserted about the control plane that the author cannot see from here (Prime Directive #10).
Dedupe (semantic issue search, objectstack-ai/objectstack, open and closed, 2026-10-28): "docs publish an app to the marketplace install an app guide os package publish install-local hand-written documentation" → 2 hits, both closed and both narrower: #8965 (CLI reference entries for the two commands), #8910 (publish-and-preview rewritten to name both ways an app reaches the platform). No handbook card exists.
Governing text
- North Star 「唯一的度量,那条路」: 「发布并装进一个环境」 is step ④; 「写给 AI 的文档与 skills 说错一句,等于产品缺陷」. Re-check:
git grep -n "发布并装进一个环境" origin/main -- docs/NORTH-STAR.md. - ADR-0019 D1/D2: the listing is an App listing; only
type: appis consumer-installable. Re-check:git grep -n "A Marketplace" origin/main -- docs/adr/0019-app-as-consumer-unit.md. packages/spec/src/marketplace/template-manifest.zod.ts(objectstack.manifest.json) andpackage.zod.ts(translations: display name, description, readme, tagline, screenshot captions;isStarter; visibility). Re-check:git grep -n "screenshotCaptions\|isStarter" origin/main -- packages/spec/src/marketplace.- ADR-0087: the protocol handshake at install; ADR-0141: declared dependencies checked before install; ADR-0131 D6: managed / unmanaged install modes.
- AGENTS.md Prime Directive chore: version packages #10: never advertise a capability the runtime does not deliver — the handbook describes only the doors that exist today and names the cards for the ones coming (connectors:
sys_connector_credential+ open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missingcredentialRefs (ruling A on #27230) #27237 / console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238 credential prompt, connectors: auto-shelf readiness — declarativeincludeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709 normalization).
Protocol statement. Metadata-protocol: none. Docs only. Skills-docs: updated here is satisfied by the page itself; skills/objectstack-platform gains one link line to it (governed surface — that one-line edit lands with the maintainer, or is left as a follow-up line in the PR).
Premises (each with a re-check; read at c3fb185a)
- No hand-written page covers listing metadata or the customer's install experience. Re-check:
git grep -rln -i "screenshot" origin/main -- content/docs --and --not -e references(expected: no deployment page) andgit grep -n "Browse Marketplace" origin/main -- content/docs(expected 0 outside releases). - The pieces that exist are the five deployment pages named above. Re-check:
ls content/docs/deployment. - HotCRM carries the worked example:
objectstack.manifest.json,assets/screenshots/**/meta.yaml, a README with an "Install from the marketplace" section. Re-check inobjectstack-ai/hotcrm:ls assets/screenshots/hotcrm && grep -n "Install from the marketplace" README.md.
Work (one PR)
content/docs/deployment/marketplace-handbook.mdx(name per the lane), sections in the order an author meets them:- What a listing is (ADR-0019: one App, one listing) and what the catalog shows.
- The listing file: every
objectstack.manifest.jsonfield with the HotCRM values as the example;translationsfor zh-CN / en and screenshot captions; the screenshot convention (assets/screenshots/<screen>/<locale>.png+meta.yaml). - README conventions a listing depends on: what the app does in business words, the demo data and demo staff, the credentials it needs (name, where to obtain, which permissions) — the author writes names, the administrator supplies values.
- Build and verify before publishing:
pnpm verifygreen,engines.protocol, the checklist run record. - Publish:
os package publishflags that matter for a listing (--display-name,--category,--icon-file,--readme-file,--visibility,--submit,--pre-release), what review examines, listing statuses. - The customer's side, step by step: Browse Marketplace vs. artifact import (
install-local), install modes, the dependency check, the credential prompt (connectors:sys_connector_credential+ open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missingcredentialRefs (ruling A on #27230) #27237 / console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238 once landed; until then the env-var path), sample data reseed / purge, enable / disable, upgrade by publishing a new version, uninstall and what it removes — each pointing at the existing page that owns the detail. - Staying listed: platform versions,
os migrate meta, what happens to an app that falls behind. - Region packs and modules: dependencies (
app-dependencies.mdx) and build-time composition, as the two shapes an app can ship extras in.
meta.jsonentry; cross-links frompublish-and-preview.mdxandgetting-started/your-first-project.mdx.pnpm --filter @objectstack/docs buildgreen;scripts/docs-auditaffected-docs list run on the new page.
Acceptance
- A reader starting from a built
dist/objectstack.jsoncan, from this page alone plus the pages it links, produce a listing with icon, screenshots and two locales, publish it, and describe to a customer administrator every screen they will meet from install to uninstall. - No sentence names a key, flag or screen the runtime at the PR's base does not deliver; forthcoming pieces are named with their card numbers.
- The docs build and link check pass.
Out of scope
- The hosted review workflow's internals and the publisher dashboard (cloud repository).
- The credential UI itself (console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238) and the normalization tool (connectors: auto-shelf readiness — declarative
includeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709); the handbook links them when they land.
Related
#8910 · #8965 · #27237 · #27238 · #26709 · #27223 · ADR-0019 · ADR-0087 · ADR-0131 · ADR-0141.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 28, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage:
domain:devx, p2,area:devpath· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-28T13:14Z⛔ Not a claim.
--submit, the customer install experience and staying current with platform versions. It serves North Star road step ④.content/docs/**reads asdomain:devx. Cloud rule check: the card limits the hosted review flow to what this repository's CLI exposes (--submit,--auto-approve, listing status), and nothing is asserted about the control plane. So it stays in objectstack. If the page needs a fact that only the cloud repository holds, that fact is a separate card for the cloud PM.publish-and-preview,install-modes,app-dependencies) and does not repeat them.documentation,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Part of #27293 (E3 author surface) · 2026-10-28T15:02Z
Epic link on the maintainer's ruling 「是否建议立专题卡统一处理。」→「同意」 (2026-10-28,
session_01J8VVAjRKqdoEYQ4hXxtBuf). Role in the chain: the marketplace handbook; its publish-to-shelf and credentials sections name E1/E2 cards until they land. Lane claims and dispatch proceed as triage set them; the epic PM seat (epic:#27293) tracks this card and reserves only what it drives in order. ⛔ Not a claim.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
Reserved for the epic subtree · 2026-10-28T15:12Z —
pm:queue→pm:epic(one label write); triage grade and lane unchanged.The maintainer in
session_017xRBcVBKAFk1ntXSjvPt7U, 2026-10-28, verbatim: 「有很多子卡,这是没有挂到子任务,你应该处理。」 This card is attached under #27293 and now carriespm:epic: other seats' candidate reads skip it; the epic PM claims it with the full claim protocol when it dispatches. ⛔ Not a claim, ⛔ not a dispatch.objectstack-fleet commentedon Oct 28, 2026
domain:devx#1 · sunhaolin · session_017xRBcVyH9FzSkzAGmz8LNE
Already reserved — yielding · 2026-10-28T15:18Z · ⛔ not a claim. Thread-read: 6472858901.
The
domain:devxseat 1 label write (relay run 40714213072,pm:dispatched+ assigneesunhaolin) landed after the epic reservation 6472858901, which carriespm:epic. The seat rolled both back in relay run 40714382455. The label set now equals the reservation's, and the card has no assignee. NoClaim:was posted and no dev was dispatched.Readings taken for the dispatch, handed to the epic PM (read at
origin/main6dbff8e20a, 2026-10-28T15:13Z):screenshotgrep outsidereferenceshits nocontent/docs/deployment/**page, only data-modeling, getting-started, protocol and releases pages.Browse Marketplacehas 0 hits incontent/docs, against aMarketplacecontrol with hits in 5+ pages.content/docs/deployment/has 16 entries, among them the five pages the card names. Nomarketplace*orhandbook*page exists.objectstack-ai/hotcrm353dacehasobjectstack.manifest.jsonandassets/screenshots/hotcrm/, andREADME.md:98reads "Install from the marketplace (recommended)".sys_connector_credential+ open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missingcredentialRefs (ruling A on #27230) #27237 open (os-bill,domain:server,pm:dispatched); console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238pm:blocked; connectors: auto-shelf readiness — declarativeincludeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709pm:queue; skills: integrations are declared, not coded — teach the declarative-connector-first rule, the per-archetype recipes and the credential hand-off in objectstack-automation, with an eval that refuses the "write a DocuSign plugin" answer #27223pm:queue; docs(deployment): rewritepublish-and-previewto name both ways a metadata app reaches the platform #8910, docs(deployment): the CLI reference has no entry foros package publishoros package install— the two commands that move an app onto a platform #8965 and [Decision] Where a customer administrator supplies a declarative connector credential: a platform credentials page over an encrypted object, an app-shipped settings manifest, env-only as today, or the OAuth connection record #27230 closed.dispatch-gates --commandsovercontent/docs/deployment/{marketplace-handbook.mdx,meta.json,publish-and-preview.mdx}+content/docs/getting-started/your-first-project.mdxgives 43 commands.--tiergives no path-derived mandate (default tier).content/docs/deployment/**.objectstack-fleet commentedon Oct 28, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
Claim: PM loop round 1
Session:
session_017xRBcVBKAFk1ntXSjvPt7UAccount:
sunhaolin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-27240-marketplace-handbookWorktree:
objectstack-issue-27240Domain:
domain:devxSeat:
epic:#27293#1File surface:
content/docs/deployment/marketplace-handbook.mdx(new),content/docs/deployment/meta.json(one entry),content/docs/deployment/publish-and-preview.mdxandcontent/docs/getting-started/your-first-project.mdx(one cross-link each). ⛔ Noskills/**edit: theskills/objectstack-platformlink line is left as a follow-up line in the PR body, so the PR stays off the governed surface (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT —dispatch-gates --tierthis fire: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: 6472926754
Premise: corrected (this comment, § Premise correction)
Serial constraints cleared:
none— the 7 open PRs updated since 2026-10-28T15:15Z touch no file undercontent/docs/deployment/**orcontent/docs/getting-started/**(files read 2026-10-28T15:52Z); thedomain:devx#1dispatch write was rolled back by its own yield6472926754, no claim posted. #27237 (in flight) namescontent/docs/automation/connectors.mdx, outside this surface.Premise correction
Read at
origin/main65b49208, 2026-10-28T15:48Z. Premises 1 and 2 hold. Premise 3 holds only in part, and several work-item sentences name doors the runtime does not deliver at base, so under Prime Directive #10 (the card's own Governing text) they change form; the target is unchanged:pnpm verifydoes not exist (rootpackage.jsonhas noverifyscript). Name real scripts (pnpm test,pnpm typecheck,pnpm lint,pnpm docs:build) or the docs page's own build.assets/screenshots/<screen>/<locale>.png+meta.yamlhas no reader:meta.yaml0 hits inpackages/ scripts/ apps/;os package publishsends no screenshots (it readstranslations.screenshotCaptions,packages/cli/src/commands/package/publish.ts:600-613, and--icon-file,:392). The handbook states that screenshots are not carried by publish at base; the acceptance line "a listing with icon, screenshots and two locales" reads "icon and two locales".objectstack.manifest.json(353dace) has notranslationsand nopreview; it is the worked example only for the keys it carries.sys_connector_credential+ open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missingcredentialRefs (ruling A on #27230) #27237 in flight, console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238 blocked) and no "env-var path" for an installed app's credential is evidenced at base: describe only the README-prose convention and name connectors:sys_connector_credential+ open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missingcredentialRefs (ruling A on #27230) #27237 / console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238.os package uninstall; it isDELETE /api/v1/marketplace/install-local/:manifestIdplus a restart (publish-and-preview.mdx:208). Enable / disable exists only asPATCH /:id/enable|disableon the runtime dispatcher (packages/runtime/src/dispatcher-plugin.ts:1596-1597): name that surface or leave the step out.content/docs/references/marketplace/*.mdx: link them, do not restate them.objectstack-fleet commentedon Oct 28, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
os-dev-report
{ "issue": 27240, "status": "done", "branch": "claude/issue-27240-marketplace-handbook", "pr": "https://github.com/objectstack-ai/objectstack/pull/27321", "session": "session_017xRBcVBKAFk1ntXSjvPt7U", "premise_still_valid": true, "summary": "Added content/docs/deployment/marketplace-handbook.mdx (255 lines): what a listing is (ADR-0019), the objectstack.manifest.json keys os package publish actually sends (HotCRM shown only for its own keys) plus translations for two locales, README conventions with credentials as names and #27237/#27238 named, build-and-verify scripts, publish/--submit and the three listing statuses the CLI prints, the customer's nine steps (Browse Marketplace, install, install mode, dependency check, credentials, sample data, enable/disable, upgrade, uninstall) each checked against Console strings or runtime routes at base, staying current via engines.protocol and os migrate meta, and dependencies vs build-time modules. Nav entry, cross-links from publish-and-preview and your-first-project, and the regenerated scripts/docs-audit/handwritten-docs.json. Bounded in-place fix: publish-and-preview.mdx said uninstall needs a restart to unload; the base DELETE handler withdraws from the running kernel and reports any remainder in note/cleanups, so the sentence now says that. Card assignee untouched; PR assignee sunhaolin.", "tests": "Docs only, no package touched, so no package test/typecheck is owed. pnpm --filter @objectstack/docs build under os-verify-lock on head 80f7e2df: VERDICT command-exit 0, 'Compiled successfully in 37.0s', 'Generating static pages using 2 workers (1428/1428)'; tree clean after the build's gen steps; rendered marketplace-handbook.html carries Browse Marketplace, WRITABLE_PACKAGE_REQUIRED, Uninstall from this runtime, pending_review. node scripts/docs-audit/affected-docs.mjs origin/main: '0 docs name something this change touched (no anchors derived) across 0 changed package(s)'; --all lists the new page. node scripts/docs-audit/check-audit-scope.mjs before --write: exit 1 naming the unlisted page; after --write: '244 hand-written doc(s) (+1 added, -0 removed)'. Ablation n/a: no tested behaviour changed. test:repo not run locally (diff touches no repo-project test), declared to CI.", "gates": "Local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (merge-base change set, 5 paths) derived 53 commands on 80f7e2df; each run with exit captured before any pipe: 53/53 exit 0. On the first head 4 refused with exit 3 PREREQUISITE NOT MET (check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift) until pnpm --filter @objectstack/spec build and pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' --filter '@objectstack/client-react...' build (both under the lock, VERDICT 0); re-run 0. --ran: 'Run reconciliation — 53 derived, 53 run, 0 NOT-MEASURED, 0 UNRUN.' exit 0. CI on PR head 80f7e2df at report time: Check Changeset completed success; Lint (repo & tooling, docs & code guards, ESLint, PM dispatch-gates, CI/release/engine, scoped x3), Type Check (workspace, source gates, debt ledger, consumer gates), Governed Surface Queue Guard, Check Documentation Links, Flag docs affected by code changes, PR-body guards, Spec property liveness, Check PR Size all in_progress; opt-in jobs skipped. Not waited on.", "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no without a (narrowing) arm", "mcp_calls": "1 — mcp__claude-code-remote__add_repo (objectstack-ai/hotcrm, read; answered read_available, nothing attached). 0 GitHub MCP calls, no write tool.", "api_writes": "2 — relay fleet-write dispatches (POST /repos/objectstack-ai/objectstack/dispatches): pr_create (run 40729387666, success; draft, assignees [sunhaolin], labels [skip-changeset]; body read back 9250/9250 bytes identical) and this os-dev-report comment on #27240 via scripts/pm/post-stamped.mjs. git push x3 to the branch (not REST).", "files_changed": [ "content/docs/deployment/marketplace-handbook.mdx (new, 255 lines)", "content/docs/deployment/meta.json (+1)", "content/docs/deployment/publish-and-preview.mdx (+4 -2: Related link, uninstall sentence)", "content/docs/getting-started/your-first-project.mdx (+5: Next steps card)", "scripts/docs-audit/handwritten-docs.json (+1, generated by check-audit-scope.mjs --write)" ], "line_budget": "No skills/** or other governed path touched; no ratchet ledger moved. Page 255 lines against the suggested route's 250 (optional target, exceeded by 5). Diff 5 files, under the 3000-line human-merge threshold.", "deviations": [ "File surface: scripts/docs-audit/handwritten-docs.json is outside the claim's declared surface; check:docs-audit-scope reds an unlisted hand-written page, so the regenerated list is a mechanical consequence of the new page. The seat owes the claim-surface addendum.", "Premise correction point 5 ('DELETE + restart') diverges from base: handleUninstall in packages/cloud-connection/src/marketplace-install-local-plugin.ts (ledger.remove, then withdrawFromRunningKernel, withdrawObjectCopies, runUninstallCleanups) withdraws the app at once and its note names a restart only when a withdrawal step did not complete; the Console's installedAdditiveNote says the same. The page and publish-and-preview.mdx follow the code; no CLI uninstall command is named.", "Premise correction point 5 enable/disable: named as the runtime surface with its measured answer — Installed Apps offers Disable only for a writable package, and requireWritablePackage (packages/runtime/src/domains/packages.ts) answers 422 WRITABLE_PACKAGE_REQUIRED for a package 'provided by code or an installed app'.", "Commit trailers use AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness reminder's model-named Co-Authored-By; the PR footer uses AGENTS.md's one-line session-URL form, not the harness's two extra lines.", "PR body carries gate readings in a fenced text block instead of details/summary blocks: those are angle-bracket fragments the body sanitizer eats.", "The skills/objectstack-platform link line is left as a follow-up line in the PR body (governed surface), per the dispatch." ], "open_questions": [], "out_of_scope_findings": [ "class: c · reach: named producer — objectstack-ai/hotcrm objectstack.manifest.json @353dace carries tags, publisher and isStarter, which TemplateManifestSchema accepts and packages/cli/src/commands/package/publish.ts never sends (it reads manifestId, displayName, description, category, tagline, iconUrl, homepageUrl, license, readmePath, translations only); preview.* likewise. Reverse leg: publish reads and sends a top-level tagline the schema does not declare (non-strict z.object strips it on parse), and HotCRM also carries an undeclared top-level engines · evidence: publish.ts run() pkgBody assembly; packages/spec/src/marketplace/template-manifest.zod.ts; package.zod.ts CreatePackageRequestSchema · dedupe words: objectstack.manifest.json tags publisher isStarter dropped by package publish; template manifest publish reader drift; top-level tagline undeclared; preview screenshots never published", "carrier: cloud · listing-status vocabulary: the CLI's hints read listing_status pending_review (publish.ts listing hints) while ListingStatusSchema in packages/spec/src/marketplace/marketplace.zod.ts enumerates submitted / in-review; the wire value is the control plane's · noted in PR acceptance notes, not filed", "carrier: none · packages/cloud-connection/src/cloud-connection-route-ledger.ts DELETE /api/v1/marketplace/install-local/:manifestId row note still says the kernel must restart to fully unload, which the handler no longer requires; ledger prose served to no one · noted in PR acceptance notes, not filed" ] }objectstack-fleet commentedon Oct 28, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
ACCEPT → PR #27321 comment 6475275645 · head
80f7e2df· 2026-10-28T16:57Z. Landing waits for every check on the head.Claim addendum (claim 6473863529, File surface):
scripts/docs-audit/handwritten-docs.json(+1 row, regenerated bynode scripts/docs-audit/check-audit-scope.mjs --write;check:docs-audit-scopereds an unlisted hand-written page), and incontent/docs/deployment/publish-and-preview.mdxthe uninstall sentence beside the cross-link, corrected to the handler's behaviour. Premise correction point 5's "plus a restart" was wrong; the PR follows the code.objectstack-fleet commentedon Oct 28, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
MERGED → PR #27321 through the merge queue · 2026-10-28T17:31Z. Closed
completedby itsFixes #27240;pm:dispatchedremoved in this act,pm:epickept as subtree membership. Follow-ups outside this card: #27325 (manifest keys publish drops). Owed but deliberately not here: theskills/objectstack-platformlink line to the new page (governed surface), filed as #27331.