feat: add publisher feed model API - #2948
Conversation
|
@giodl73-repo is attempting to deploy a commit to the OpenClaw Foundation Team on Vercel. A member of the Team first needs to authorize it. |
c64e1dc to
bc626c5
Compare
|
Codex review: found issues before merge. Reviewed August 6, 2026, 9:42 PM ET / August 7, 2026, 01:42 UTC. ClawSweeper reviewWhat this changesThis PR adds public publisher-detail and cursor-paginated discovery-feed endpoints backed by persisted Convex publisher snapshots. Merge readiness⛔ Blocked by patch quality or review findings - 12 items remain Keep open: current main does not provide this publisher-feed API, but the exact-head review still has two P1 correctness/security blockers, an index-rollout blocker, and an unresolved decision on making an unsigned public discovery API a supported contract. Priority: P2 Review scores
Verification
How this fits togetherPublisher records own public identities for people and organizations. The proposed API projects their visible skills and plugins into a stored revision, then serves stable pages to anonymous discovery clients. flowchart LR
A[Publisher records] --> B[Public visibility checks]
C[Skills and packages] --> B
B --> D[Publisher snapshot builder]
D --> E[Stored feed revision]
E --> F[HTTP pagination route]
F --> G[Anonymous discovery clients]
Decision needed
Why: The patch adds a durable anonymous API contract; code review cannot choose whether that product boundary should be supported now. Before merge
Findings
Agent review detailsSecurityNeeds attention: The new anonymous discovery route can disclose package metadata that the canonical public-visibility boundary excludes. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Land the API only after maintainer sponsorship of its public contract, then split the index preparation from endpoint activation and enforce canonical visibility plus a final UTF-8 snapshot-size limit. Do we have a high-confidence way to reproduce the issue? Yes for the review blockers: the supplied exact-head diff plus current-main predicates show how a private-channel or non-plugin package bypasses the feed filter, and how an oversized 400-entry snapshot reaches persistence without a byte guard. Is this the best way to solve the issue? No. The proposed endpoint is plausible, but it must first use the existing public visibility predicate, enforce the document-size boundary, and follow a staged index rollout after a maintainer chooses the API contract. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 64db9c3fae66. LabelsLabel changes:
Label justifications:
EvidenceSecurity concerns:
What I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (38 earlier review cycles; latest 8 shown)
|
de7afa4 to
aa8aa35
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
aa8aa35 to
03092f1
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
03092f1 to
9446b05
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
9446b05 to
cea2a85
Compare
Patrick-Erichsen
left a comment
There was a problem hiding this comment.
This adds public account/publisher identity endpoints plus bounded discovery feeds for public skills and plugins. The discovery-only authority boundary is sound: entries contain no install candidate, integrity, official, approval, or trust fields, and downstream installation still has to resolve through the catalog path.
LOC: +1882/-77 (22 files)
The inline findings block this exact head. The most important issue is that the new endpoints bypass ClawHub's established public-publisher visibility rule, so a personal publisher linked to an inactive account can become discoverable here even though existing profile/catalog surfaces hide it.
Best-fix verdict: too narrow. The API should reuse one shared public identity/ownership resolver, preserve legacy ownership during the migration window, and either implement durable revision/pagination semantics or keep this projection experimental until the v1 contract is real.
Alternatives considered: relying on account-deletion cascades or the targeted ownership repair was rejected because current code deliberately keeps defensive visibility checks and optional legacy fields. Shipping sequence 0 / nextCursor: null as stable v1 was rejected because RFC 0009 PR #39 already requires monotonic logical revisions and opaque deterministic continuation.
Code read: convex/accountFeeds.ts, convex/httpApiV1/accountFeedsV1.ts, convex/lib/public.ts, convex/lib/publishers.ts, convex/publishers.ts, convex/maintenance.ts, convex/catalogFeed.ts, package/skill public-read helpers, schema/OpenAPI/tests, specs/account-feeds.md, specs/orgs.md, and RFC 0009 account-feed addendum at PR #39 head.
Validation: the focused 23 tests pass locally. Exact-head static, unit, types-build, packages, e2e-http, CodeQL, and Playwright smoke checks pass. The head is not fully green: secret scanning failed because the runner could not pull the TruffleHog image, moderation-star timed out amid Convex query timeouts, and Vercel requires contributor authorization. No live Convex/HTTP behavior proof was attached.
Contract dependency: RFC PR #39 is still open, so the public v1 release should be coordinated with that contract rather than claiming conformance to an unmerged rewrite.
Remaining uncertainty: I did not deploy this branch to a live Convex instance; runtime evidence is limited to exact-head CI plus focused local tests and source-level repros.
|
This pull request has been automatically marked as stale due to inactivity. |
Summary
API
All pages for one cursor chain carry the same feedId, sequence, and generatedAt. Publisher feed responses are private, no-store so shared caches cannot bypass stale-cursor checks.
Review fixes
Addresses Patrick's exact-head review:
Validation
Contract dependency
The matching publisher-only and pagination contract is being updated in openclaw/rfcs#39.
Real behavior proof
Behavior or issue addressed:
The public publisher detail endpoint, bounded publisher-feed pagination, revision refresh, and stale-cursor rejection work against a real Convex runtime. The proof run also exposed and fixed a Convex-only failure caused by multiple paginated queries in one mutation.
Real environment tested:
WSL2 Ubuntu 24.04, exact PR head
2172b6badd2b433e8c305de870a2af47b823be28, disposable anonymous local Convex deployment, and repository dev fixtures. HTTP actions were exercised over loopback; no shared, staging, or production deployment was targeted.Exact steps or command run after this patch:
bunx convex dev --once --typecheck=disable --codegen disablebunx convex run --no-push devSeed:seedLocalFixtures '{"reset":false}'limit=1and its opaque continuation cursor.Evidence after fix:
Observed result after fix:
Publisher detail and both feed pages returned 200. The continuation preserved feed identity, sequence, and generation time. A real content change advanced the stored revision from 1 to 2, and replaying the previous cursor returned 409 with
Cache-Control: no-store.What was not tested:
No public preview, staging, or production deployment and no production data. This proof covers the anonymous public HTTP contract on the exact branch code in a disposable real Convex runtime.