Skip to content

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

Closed

Description

@objectstack-fleet

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

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)

  1. 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) and git grep -n "Browse Marketplace" origin/main -- content/docs (expected 0 outside releases).
  2. The pieces that exist are the five deployment pages named above. Re-check: ls content/docs/deployment.
  3. HotCRM carries the worked example: objectstack.manifest.json, assets/screenshots/**/meta.yaml, a README with an "Install from the marketplace" section. Re-check in objectstack-ai/hotcrm: ls assets/screenshots/hotcrm && grep -n "Install from the marketplace" README.md.

Work (one PR)

  1. 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.json field with the HotCRM values as the example; translations for 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 verify green, engines.protocol, the checklist run record.
    • Publish: os package publish flags 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 missing credentialRefs (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.
  2. meta.json entry; cross-links from publish-and-preview.mdx and getting-started/your-first-project.mdx.
  3. pnpm --filter @objectstack/docs build green; scripts/docs-audit affected-docs list run on the new page.

Acceptance

  • A reader starting from a built dist/objectstack.json can, 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

Related

#8910 · #8965 · #27237 · #27238 · #26709 · #27223 · ADR-0019 · ADR-0087 · ADR-0131 · ADR-0141.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: domain:devx, p2, area:devpath · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-28T13:14Z

    ⛔ Not a claim.

    • Read fresh. A maintainer-directed handbook page for app authors (「要的,立一张上架手册的卡」). It covers listing metadata, README conventions, --submit, the customer install experience and staying current with platform versions. It serves North Star road step ④.
    • p2: documentation with no protocol change, and not release-first.
    • Lane: content/docs/** reads as domain: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.
    • ⛔ The page links the existing deployment pages (publish-and-preview, install-modes, app-dependencies) and does not repeat them.
    • documentation, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 carries pm: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.

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcVyH9FzSkzAGmz8LNE

    Already reserved — yielding · 2026-10-28T15:18Z · ⛔ not a claim. Thread-read: 6472858901.

    The domain:devx seat 1 label write (relay run 40714213072, pm:dispatched + assignee sunhaolin) landed after the epic reservation 6472858901, which carries pm:epic. The seat rolled both back in relay run 40714382455. The label set now equals the reservation's, and the card has no assignee. No Claim: was posted and no dev was dispatched.

    Readings taken for the dispatch, handed to the epic PM (read at origin/main 6dbff8e20a, 2026-10-28T15:13Z):

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

    Claim: PM loop round 1
    Session: session_017xRBcVBKAFk1ntXSjvPt7U
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-27240-marketplace-handbook
    Worktree: objectstack-issue-27240
    Domain: domain:devx
    Seat: epic:#27293#1
    File surface: content/docs/deployment/marketplace-handbook.mdx (new), content/docs/deployment/meta.json (one entry), content/docs/deployment/publish-and-preview.mdx and content/docs/getting-started/your-first-project.mdx (one cross-link each). ⛔ No skills/** edit: the skills/objectstack-platform link 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 --tier this fire: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-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 under content/docs/deployment/** or content/docs/getting-started/** (files read 2026-10-28T15:52Z); the domain:devx#1 dispatch write was rolled back by its own yield 6472926754, no claim posted. #27237 (in flight) names content/docs/automation/connectors.mdx, outside this surface.

    Premise correction

    Read at origin/main 65b49208, 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:

    1. pnpm verify does not exist (root package.json has no verify script). Name real scripts (pnpm test, pnpm typecheck, pnpm lint, pnpm docs:build) or the docs page's own build.
    2. The screenshot convention assets/screenshots/<screen>/<locale>.png + meta.yaml has no reader: meta.yaml 0 hits in packages/ scripts/ apps/; os package publish sends no screenshots (it reads translations.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".
    3. HotCRM's objectstack.manifest.json (353dace) has no translations and no preview; it is the worked example only for the keys it carries.
    4. The credential prompt is not delivered (connectors: sys_connector_credential + open-tier resolver chain (env → credential object → vault), reconcile on credential change, install-local prompt for missing credentialRefs (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 missing credentialRefs (ruling A on #27230) #27237 / console: Setup → Integrations → "Connector credentials" page and the install dialog credential prompt (ruling A on #27230) #27238.
    5. Uninstall has no os package uninstall; it is DELETE /api/v1/marketplace/install-local/:manifestId plus a restart (publish-and-preview.mdx:208). Enable / disable exists only as PATCH /:id/enable|disable on the runtime dispatcher (packages/runtime/src/dispatcher-plugin.ts:1596-1597): name that surface or leave the step out.
    6. "What happens to an app that falls behind" (leaving the catalog) has no source in this repository: leave it out. "What review examines" likewise: state only what the CLI prints and the listing statuses.
    7. Field lists live in the auto-generated content/docs/references/marketplace/*.mdx: link them, do not restate them.
  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 by node scripts/docs-audit/check-audit-scope.mjs --write; check:docs-audit-scope reds an unlisted hand-written page), and in content/docs/deployment/publish-and-preview.mdx the 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.

  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

    MERGED → PR #27321 through the merge queue · 2026-10-28T17:31Z. Closed completed by its Fixes #27240; pm:dispatched removed in this act, pm:epic kept as subtree membership. Follow-ups outside this card: #27325 (manifest keys publish drops). Owed but deliberately not here: the skills/objectstack-platform link line to the new page (governed surface), filed as #27331.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:devxenhancementNew feature or requestpm:epicpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions