You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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/main617dcf43). 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.
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.
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.
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."
]
}
Activity
objectstack-fleet commentedon Nov 1, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 发布并装进一个环境 | none | P④
Triage: p3 ·
domain:server·area:automation·pm:epickept · 2026-11-01T07:55Z⛔ Not a claim.
iconUrl, and cloud's ingestion works around it with--icon-url. The listing still publishes, so this is p3.pm:epicstays.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
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:queuein this act;domain:serverstays. 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 inpackages/apps/connector-{github,stripe}and nothing in flight touches them.objectstack-fleet commentedon Nov 1, 2026
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 issession_01FEkQ5p28hxU1qvesRWw9LUAccount:
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:serverSeat:
domain:server#2Ruling-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 publishContainer & model:
M,mode:thread,model: opus(--tiernames no path mandate: PM's call, default),effort: mediumClause-②: 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
iconUrlto each app, plus a per-app test red on base; the seat reviews the hand-back and landsThread-read: none
Premise: the defect is read at
617dcf43; the dev re-reads both manifests onorigin/mainfirstSerial constraints cleared: no open PR on
packages/apps/connector-*at claim time (the dev re-reads beforepr_create)Resume-from: none — fresh from
origin/mainState: →
pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
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."
]
}
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Landing record · #28588 · PR #28662
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-11-01T13:59Ze4ec4f22git merge-base --is-ancestor e4ec4f22 origin/maingit ls-remote origin refs/heads/gh-readonly-queue/*matching 28662git grep -c iconUrl origin/main -- packages/apps/connector-{github,stripe}/objectstack.manifest.jsonconnector-github,connector-stripe) carry noiconUrl, which marketplace review requires, so cloud's ingestion has to pass--icon-urlas a stopgap #28588): each batch-1 connector app owns a neutral connector icon and its manifest names it by a public http(s)iconUrl; each app's listing test refuses an absent or non-http(s) value.TemplateManifestSchema.iconUrlaccepts any scheme).Release: claim
6557470730(session_01FEkQ5p28hxU1qvesRWw9LU, branchclaude/project-thread-69wo4m) · landed.pm:dispatchedremoved; assignee cleared; the card closed on merge.Generated by Claude Code