Add hard-coded OpenClaw official publishers#2380
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Codex review: found issues before merge. Reviewed May 26, 2026, 3:17 AM ET / 07:17 UTC. Summary Reproducibility: yes. for the identified PR bug by source inspection: Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge Security Review findings
Review detailsBest possible solution: Land the narrowed Official policy only after maintainers accept the OpenClaw identity boundary and the skill detail owner data path is made consistent with the intended badge behavior. Do we have a high-confidence way to reproduce the issue? Yes for the identified PR bug by source inspection: Is this the best way to solve the issue? No, not yet; the implementation should either hydrate Official publisher status into skill detail owners or remove the owner-based title badge path, and maintainers still need to accept the trust boundary. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 8a2c0c06fd17. Label changesLabel changes:
Label justifications:
Evidence reviewedSecurity concerns:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
There was a problem hiding this comment.
Pull request overview
This PR introduces an admin-controlled “official publisher” policy flag and surfaces “Official” badges/labels across the product (UI), API schemas/docs, and CLI-installed skill origin metadata. It aligns prior “Verified” UI copy with the new “Official” terminology and connects publisher officialness to package channel/isOfficial behavior.
Changes:
- Add
publishers.official(admin-set) and expose it asofficial: booleanin public publisher shapes and HTTP API responses/schemas. - Update UI to display “Official” badges for publishers and official packages (replacing “Verified” copy in multiple views).
- Extend CLI install/update to persist
ownerHandle+officialinto installed skill origin metadata; add docs/spec updates for the new policy.
Reviewed changes
Copilot reviewed 36 out of 42 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/styles.css | Add styling for the “Official” user badge. |
| src/routes/plugins/index.tsx | Relabel “Verified only” filter to “Official only” in plugin browse UI. |
| src/routes/plugins/$name.tsx | Replace verified badge UI with an “Official” badge/icon for official packages. |
| src/routes/p/$handle.tsx | Show “Official” badge on publisher profile when publisher is official. |
| src/routes/management.tsx | Update management UI badge copy/styling for official plugins. |
| src/routes/index.tsx | Update home/trending UI label from “Verified” to “Official”. |
| src/lib/publicUser.ts | Extend PublicPublisher type to include official?: boolean. |
| src/components/UserBadge.tsx | Render “Official” badge in UserBadge when the passed user/publisher is official. |
| src/components/UserBadge.test.tsx | Add test coverage for “Official” badge rendering; mock Convex client. |
| src/components/PluginListItem.tsx | Update list/card tags to show “Official” instead of “Verified”. |
| src/tests/package-detail-route.test.tsx | Assert official packages are labeled “Official” (and not “Verified”). |
| specs/spec.md | Document publisher official policy signal and its UI effects. |
| specs/plans/plugins.md | Update channel policy wording to use publisher “Official” flag. |
| specs/orgs.md | Add official?: { byUserId, at } field to publisher/org spec. |
| specs/official-publishers.md | New spec doc defining “Official publishers” policy and constraints. |
| packages/schema/src/schemas.ts | Add official?: boolean to skill list/detail schemas and skill owner schema. |
| packages/schema/src/packages.ts | Add official?: boolean to package owner schema. |
| packages/schema/dist/schemas.js.map | Built artifact update for schema changes. |
| packages/schema/dist/schemas.js | Built artifact update for schema changes. |
| packages/schema/dist/schemas.d.ts | Built artifact update for schema changes. |
| packages/schema/dist/packages.js.map | Built artifact update for schema changes. |
| packages/schema/dist/packages.js | Built artifact update for schema changes. |
| packages/schema/dist/packages.d.ts | Built artifact update for schema changes. |
| packages/clawhub/src/skills.ts | Extend installed skill origin parsing to include ownerHandle + official. |
| packages/clawhub/src/skills.test.ts | Test roundtrip read/write of new origin metadata fields. |
| packages/clawhub/src/schema/schemas.ts | Mirror schema updates for the CLI package (skills schemas). |
| packages/clawhub/src/schema/packages.ts | Mirror schema updates for the CLI package (packages schemas). |
| packages/clawhub/src/cli/commands/skills.ts | Persist official/ownerHandle metadata into installed skill origin on install/update. |
| packages/clawhub/src/cli/commands/skills.test.ts | Test that install writes official publisher metadata into origin. |
| docs/publishing.md | Add documentation section describing “Official” policy and its meaning. |
| docs/http-api.md | Document official in skill responses and owner.official semantics; update policy text. |
| convex/skills.public.test.ts | Ensure public owner response includes official: false (sanitized publisher shape). |
| convex/schema.ts | Add publishers.official field to Convex schema. |
| convex/publishers.ts | Add admin mutation to set official publisher and sync package official/channel state. |
| convex/publishers.test.ts | Add tests for setting/unsetting official publisher and syncing packages + digests. |
| convex/packages.ts | Enforce “official channel” eligibility based on official publisher (not trustedPublisher). |
| convex/packages.public.test.ts | Update tests to use official publisher eligibility for official package operations. |
| convex/lib/public.ts | Expose official boolean in toPublicPublisher. |
| convex/lib/public.test.ts | Add unit test for public publisher official mapping. |
| convex/httpApiV1/skillsV1.ts | Expose skill.official and owner.official in skills HTTP API responses. |
| convex/httpApiV1/packagesV1.ts | Include owner.official in packages/skills-as-packages HTTP API responses. |
| convex/httpApiV1.handlers.test.ts | Update handler tests to include official badges/owner official signals. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| owner: result.owner | ||
| ? { | ||
| handle: result.owner.handle ?? null, | ||
| userId: result.owner._id, | ||
| publisherId: result.owner._id, | ||
| displayName: result.owner.displayName ?? null, | ||
| image: result.owner.image ?? null, | ||
| official: result.owner.official === true, | ||
| } |
| const packages = await ctx.db | ||
| .query("packages") | ||
| .withIndex("by_owner_publisher_active_updated", (q) => | ||
| q.eq("ownerPublisherId", publisherId).eq("softDeletedAt", undefined), | ||
| ) | ||
| .take(PUBLISHER_OFFICIAL_PACKAGE_SYNC_LIMIT); | ||
|
|
||
| let updatedPackages = 0; | ||
| for (const pkg of packages) { | ||
| const nextChannel: Doc<"packages">["channel"] = | ||
| pkg.channel === "private" ? "private" : official ? "official" : "community"; | ||
| const nextIsOfficial = nextChannel === "official"; | ||
| if (pkg.channel === nextChannel && pkg.isOfficial === nextIsOfficial) continue; | ||
|
|
||
| const nextPackage = { | ||
| ...pkg, | ||
| channel: nextChannel, | ||
| isOfficial: nextIsOfficial, | ||
| updatedAt: now, | ||
| }; | ||
| await ctx.db.patch(pkg._id, { | ||
| channel: nextChannel, | ||
| isOfficial: nextIsOfficial, | ||
| updatedAt: now, | ||
| }); | ||
| await upsertPackageSearchDigest(ctx, extractPackageDigestFields(nextPackage)); | ||
| updatedPackages += 1; | ||
| } | ||
|
|
||
| return { | ||
| updatedPackages, | ||
| packageSyncTruncated: packages.length === PUBLISHER_OFFICIAL_PACKAGE_SYNC_LIMIT, | ||
| }; |
| filters={[ | ||
| { key: "verified", label: "Verified only", active: search.verified ?? false }, | ||
| { key: "verified", label: "Official only", active: search.verified ?? false }, | ||
| { key: "executesCode", label: "Executes code", active: search.executesCode ?? false }, | ||
| ]} |
|
ClawSweeper PR egg 🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress. Hatch commandComment Hatchability rules:
What is this egg doing here?
|
6bf5bf7 to
ff3dbc4
Compare
ff3dbc4 to
73503f0
Compare
73503f0 to
25c6b13
Compare
25c6b13 to
0f25010
Compare
0f25010 to
14ca1c9
Compare
8958ffa to
7eb0a5a
Compare
89cff88 to
9191c7f
Compare
9191c7f to
02589f0
Compare
02589f0 to
f967767
Compare
f967767 to
d5eb9a3
Compare
d5eb9a3 to
dbcd18a
Compare
Summary
openclaworg: theopenclaworg publisher is Official, and currentopenclaworg members' personal publishers are Official while membership exists.trustedPublisherremains only an automated publish permission.publishers.official, no skill badge source metadata, no official skill digest index, and no generic endpoint for arbitrary Official publishers.Visual proof
Captured locally with
origin/mainonlocalhost:3101and this PR onlocalhost:3100./plugins/@openclaw/codex/plugins/@openclaw/codex/user/steipete/user/steipete/user/openclaw/user/openclaw/openclaw/official-agent-toolkit/openclaw/official-agent-toolkit/skills?q=official-agent-toolkit&view=grid/skills?q=official-agent-toolkit&view=grid/plugins/@openclaw/runtime-tools/plugins/@openclaw/runtime-toolsDOM check
/plugins/@openclaw/codex: before dark/lightOfficialbadge count0; after dark/lightOfficialbadge count1./user/steipete: before darkOfficialbadge count0; after dark/lightOfficialbadge count3./user/openclaw: after dark/lightOfficialbadge count6./openclaw/official-agent-toolkit: before darkOfficialbadge count0andVerifiedtext count1; after dark/lightOfficialbadge count1andVerifiedtext count0./skills?q=official-agent-toolkit&view=grid: before darkOfficialbadge count0andVerifiedtext count1; after dark/lightOfficialbadge count1andVerifiedtext count0./plugins/@openclaw/runtime-tools: before darkOfficialbadge count0; after dark/lightOfficialbadge count1.Prod data check
32.0.0.x-searchbyJaaneek), and this PR preserves skill-level Official badges.Verification
bun run testbun run test convex/lib/officialPublishers.test.ts convex/lib/public.test.ts convex/packages.public.test.ts convex/publishers.test.tsbun run test src/components/SkillHeader.test.tsx src/components/PublisherListItem.test.tsx src/components/PluginListItem.test.tsx src/components/SkillListItem.test.tsx src/components/UserBadge.test.tsx src/components/PublishedItemCard.test.tsx src/components/SkillCard.test.tsx src/__tests__/packages-route.test.tsx src/__tests__/package-detail-route.test.tsxbun run format:checkbun run lintVITE_CONVEX_URL=https://example.invalid bunx tsc --noEmitbunx tsc -p packages/schema/tsconfig.json --noEmitbunx tsc -p packages/clawhub/tsconfig.json --noEmit