Skip to content

connector apps: the batch-1 manifests (connector-github, connector-stripe) carry no iconUrl, which marketplace review requires, so cloud's ingestion has to pass --icon-url as a stopgap #28588

Closed

Description

@objectstack-fleet

epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

Filing gate: ① a product defect with a named location, finding class (a). Reported by cloud seat 2 on #27293 (comment 6554555411, the first cloud ingestion run) and re-read by this seat. Child of #27293 (E4). ⛔ Not a claim.

reach: publish door — os package publish reads m.iconUrl from objectstack.manifest.json (packages/cli/src/commands/package/publish.ts:653, read at origin/main 617dcf43). The handbook says the README and the icon are required for a complete listing (content/docs/deployment/marketplace-handbook.mdx:39 and :170). Cloud's ingestion script published connector-github only by passing --icon-url app=….

The defect

packages/apps/connector-github/objectstack.manifest.json and packages/apps/connector-stripe/objectstack.manifest.json (read at 617dcf43) have no iconUrl. The one existing official app's manifest carries one: the handbook's own example at :56 is app.objectstack.hotcrm's raw.githubusercontent.com/.../assets/icon.svg.

Work

Give each batch-1 app an icon that its package owns, and set iconUrl to its public http(s) URL, the way hotcrm does. The image must respect the vendor's published brand guidelines; a neutral connector glyph is the safe default when they are unclear. Add a test in each app's test/ that fails when iconUrl is absent or not http(s). That keeps the next shelf app from shipping without one. If the shelf's later apps should share one rule, say so in the report; do not add a repo-wide gate.

Business reason

The listing is the administrator's first sight of the app. Without its own icon every listing depends on a flag the cloud script has to remember.

Reader

The triage seat grades and routes it; the epic PM of #27293 dispatches.

Dedupe

The 500 most recent issues and PRs (read 2026-11-01T07:03Z), titles grepped for iconUrl|icon_url|\bicon\b: 0 hits; control connector on the same set: 53 hits.

Activity

  1. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 发布并装进一个环境 | none | P④

    Triage: p3 · domain:server · area:automation · pm:epic kept · 2026-11-01T07:55Z

    ⛔ Not a claim.

    • Read fresh. The batch-1 manifests carry no iconUrl, and cloud's ingestion works around it with --icon-url. The listing still publishes, so this is p3.
    • The card's limit stands: a per-app test, and no repo-wide gate (「新增门禁默认否」).
    • pm:epic stays.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

    Hand-off to the lane, on the maintainer's instruction in this seat's session (2026-11-01, verbatim: 「按你的方案交给车道」, approving the seat's proposal to hand the independent epic cards to their lanes). pm:epic → pm:queue in this act; domain:server stays. The card stays a sub-issue of #27293 for tracking only; the epic seat no longer reserves it. Triage grade p3 (6555225106) stands. No dependency on any in-flight epic PR: the two manifests are in packages/apps/connector-{github,stripe} and nothing in flight touches them.

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

    Claim: PM loop round 4 · card thread · 2026-11-01T11:43Z
    Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01FEkQ5p28hxU1qvesRWw9LU
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-69wo4m (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#2
    Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」. Handed to the lane by the #27293 epic seat (6556997039); triage p3 (6555225106) stands, with its limit: a per-app test, no repo-wide gate.
    File surface: packages/apps/connector-github/, packages/apps/connector-stripe/ (manifest, an owned icon asset, test/); changesets if the apps publish
    Container & model: M, mode:thread, model: opus (--tier names no path mandate: PM's call, default), effort: medium
    Clause-②: no expected — the manifest gains a key its schema already allows; the dev measures and declares
    Metadata-protocol: none (expected; the dev measures and declares)
    Responsibility: the dev adds an owned icon and iconUrl to each app, plus a per-app test red on base; the seat reviews the hand-back and lands
    Thread-read: none
    Premise: the defect is read at 617dcf43; the dev re-reads both manifests on origin/main first
    Serial constraints cleared: no open PR on packages/apps/connector-* at claim time (the dev re-reads before pr_create)
    Resume-from: none — fresh from origin/main

    State: → pm:dispatched, assigned to os-project-manager, recorded by this claim.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_01FEkQ5p28hxU1qvesRWw9LU

    os-dev-report
    {
    "issue": 28588,
    "status": "done",
    "branch": "claude/project-thread-69wo4m",
    "pr": "#28662",
    "session": "session_01FEkQ5p28hxU1qvesRWw9LU",
    "premise_still_valid": true,
    "summary": "Premise re-read on origin/main f23e051: neither connector-github nor connector-stripe objectstack.manifest.json had iconUrl. Each app now owns assets/icon.svg, a neutral connector glyph drawn from primitives (white plug on a rounded square, slate for GitHub, teal for Stripe; no vendor artwork), and its manifest sets iconUrl to https://raw.githubusercontent.com/objectstack-ai/objectstack/main/packages/apps/APP/assets/icon.svg, the HotCRM shape. Brand basis: no usage permission for either vendor logo was cited from this session, so by the order's rule the neutral glyph ships; a vendor mark can replace it in its own PR once a published permission is cited. Each app's existing test/listing.test.ts gained three cases (public http(s) iconUrl; a control refusing absent, ftp: and relative values via fixture objects; iconUrl points at the owned asset, which exists, is under 256 KB and is a 256x256 SVG). Both packages are private, so the PR carries skip-changeset and package files does not apply.",
    "tests": "Red-first at head 6bdaa4b with both manifests restored to base f23e051 (git restore --source, grep -c iconUrl = 0 each): connector-github listing.test.ts 'Tests 2 failed | 6 passed (8)' (x carries a public http(s) iconUrl: AssertionError: expected 'iconUrl is absent' to be null; x points iconUrl at the icon this package owns); connector-stripe 'Tests 2 failed | 10 passed (12)', same two cases. Restored with git checkout HEAD, git diff HEAD empty; green leg 8/8 and 12/12. Full package runs under the verify lock after building both apps' ^... closure: connector-app-github test+typecheck: objectstack validate ok, Test Files 2 passed (2), Tests 13 passed (13), tsc --noEmit ok, VERDICT command-exit 0; connector-app-stripe: Test Files 2 passed (2), Tests 19 passed (19), VERDICT command-exit 0. tsc --listFiles includes connector-github's 2 test files. No ablation beyond the red leg: config-only diff plus tests.",
    "gates": "Local at 6bdaa4b: dispatch-gates --commands derived 47 families; all run with exit codes captured before any pipe (record /mnt/project-files/pm-orders/server/28588-gates-ran.txt). --ran: 47 derived, 46 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (no dist for client-react and 9 more packages outside this closure). check-plugin-teardown-shape --self-test exit 3 on the shallow clone, then exit 0 (48 cases) after git fetch --depth=1 origin 621a487. Extra: pnpm --filter @objectstack/spec check:template-manifests exit 0. CI check-runs on PR #28662: in_progress at report time (not waited on, per contract).",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "7 — issue_read get #28588, issue_read get_comments #28588 x2, issue_read get_labels #28662 (failed: not an issue), pull_request_read get_files #28662, pull_request_read get #28662; all reads, no MCP write",
    "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create with assignees os-project-manager and label skip-changeset; read-back 7073 bytes identical), this os-dev-report comment via post-stamped. Plus git push (not REST). Reads via gh api: search/issues for open connector PRs, and GET pulls/28651/files and pulls/28652/files for the overlap check.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — TemplateManifestSchema.iconUrl is z.string().url() and accepts any scheme while the handbook says a public http(s) URL; no reach measured (whether the hosted catalog refuses a non-http(s) icon_url is cloud-side). Shelf recommendation: when a third shelf app lands, one shared rule beats a copy per app; the per-app test is held for now, no repo-wide gate added, as triage ruled.",
    "carrier: none · noted, not filed — in connector-stripe/test/listing.test.ts the new helper sits between the manifest and readme constants with no blank line before const readme; cosmetic, left as is to keep the reviewed head."
    ]
    }

  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

    Landing record · #28588 · PR #28662

    domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-11-01T13:59Z

    Reading Probe Result
    Merged PR #28662 state merged, merge commit e4ec4f22
    On main git merge-base --is-ancestor e4ec4f22 origin/main yes
    Queue refs git ls-remote origin refs/heads/gh-readonly-queue/* matching 28662 0
    Content git grep -c iconUrl origin/main -- packages/apps/connector-{github,stripe}/objectstack.manifest.json 1 each

    Release: claim 6557470730 (session_01FEkQ5p28hxU1qvesRWw9LU, branch claude/project-thread-69wo4m) · landed.

    • State: pm:dispatched removed; assignee cleared; the card closed on merge.
    • Resume-from: none.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions