Skip to content

feat: add private following inbox - #3293

Draft
giodl73-repo wants to merge 28 commits into
openclaw:mainfrom
giodl73-repo:feat/following-inbox
Draft

feat: add private following inbox#3293
giodl73-repo wants to merge 28 commits into
openclaw:mainfrom
giodl73-repo:feat/following-inbox

Conversation

@giodl73-repo

Copy link
Copy Markdown
Contributor

Summary

  • adds a private, account-scoped Inbox for grouped releases from followed publishers
  • stores one monotonic seen-through frontier per user instead of one read row per activity
  • marks unread groups, supports explicit mark-all-read, and expands coalesced batches on demand
  • adds mute, unmute, and unfollow controls; muted publishers remain followed for a future Following feed but stop entering Inbox delivery
  • links Inbox from the signed-in account menu and removes its read state during account deletion

Product shape

This follows GitHub Notifications' inbox-first UX while preserving the Facebook/X-style option: Inbox and a future chronological Following page are two projections over the same grouped publisher activity. No second store or migration is required to add the Following surface later.

ClawHub account activity remains distinct from OpenClaw's local Updates experience for installed or watched artifacts.

Stack

Depends on #2958, #2950, and #2948. This branch is commit-stacked because cross-fork PRs cannot select another fork branch as their base. Keep this PR draft until those dependencies land and the branch can be rebased to a narrow diff.

Validation

  • Inbox state, grouped activity, follow, user deletion, and presentation tests: 98 passed
  • TypeScript reports no errors from this slice; the remaining diagnostics come from the borrowed worktree dependency alias and are covered by the lower stack's schema build/CI
  • format and git diff --check pass

@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

@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.

@giodl73-repo
giodl73-repo force-pushed the feat/following-inbox branch from 97ef643 to 453ebb4 Compare July 28, 2026 21:10
@giodl73-repo
giodl73-repo force-pushed the feat/following-inbox branch 3 times, most recently from 994b30c to 8e9b378 Compare July 28, 2026 21:26
@giodl73-repo
giodl73-repo force-pushed the feat/following-inbox branch from 8e9b378 to cdf35e2 Compare July 28, 2026 22:32
@giodl73-repo
giodl73-repo force-pushed the feat/following-inbox branch from cdf35e2 to 7e662bf Compare July 28, 2026 22:47
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 session-state 🚨 Merging this PR could lose, corrupt, stale, or mis-associate session or agent state. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. labels Aug 5, 2026
@clawsweeper

clawsweeper Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed August 5, 2026, 4:38 AM ET / 08:38 UTC.

ClawSweeper review

What this changes

This draft adds a private signed-in Inbox for grouped releases from followed publishers, including read state, mute controls, cleanup, and account-menu navigation.

Merge readiness

Blocked until real behavior proof is added - 13 items remain

Keep open: current main and v0.23.3 do not contain this Inbox feature, but the draft remains blocked by a deploy-breaking index rollout, follow-visibility defects, open stacked prerequisites, and missing real behavior proof.

Priority: P3
Reviewed head: 7e662bf37ddd336d0c3f69670bc9975ca7266e22
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🧂 unranked krab (1/6) The feature has substantial test intent, but unresolved deployment and privacy defects plus absent live proof make it not ready to merge.
Proof confidence 🧂 unranked krab (1/6) Needs real behavior proof before merge: The PR body reports tests only; before merge it needs redacted evidence from a real authenticated Inbox session showing follow, release activity, mute, and mark-read behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Patch quality 🧂 unranked krab (1/6) Security review found an item that needs attention.

Verification

Check Result Evidence
Real behavior Needs proof Needs real behavior proof before merge: The PR body reports tests only; before merge it needs redacted evidence from a real authenticated Inbox session showing follow, release activity, mute, and mark-read behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed 6 items Current-main check: Current main contains no publisher-follow, publisher-activity, or Inbox implementation, and the PR head is not an ancestor of main.
Release check: No local release tag contains the draft head; the supplied latest release is v0.23.3, which predates current main and does not ship this feature.
Index rollout blocker: The branch adds packages.by_owner_active_updated and immediately queries it for legacy package feed entries. Convex guidance requires a new index on an existing large table to be staged before it can be queried in a later deployment.
Findings 3 actionable findings [P1] Stage the packages-table index before querying it
[P2] Reject follows of the caller’s personal publisher
[P2] Use canonical public visibility for follows
Security Needs attention Follow list bypasses canonical publisher visibility: The new private follow path accepts and lists active publisher records without validating the linked or legacy personal-account owner, unlike the established public visibility boundary.

How this fits together

ClawHub records publisher releases and private follow preferences in Convex, then projects grouped activity into a signed-in Inbox page. The Inbox lets users review release groups and update notification and read state without exposing the follow graph publicly.

flowchart LR
  A[Publisher releases] --> B[Grouped publisher activity]
  C[Private follow preferences] --> B
  B --> D[Inbox projection]
  E[Signed-in account] --> D
  D --> F[Inbox page]
  F --> G[Read and mute controls]
Loading

Decision needed

Question Recommendation
Should ClawHub sponsor a durable private publisher-follow Inbox and its persistent activity model once the stacked backend work can be narrowed and safely deployed? Sponsor a staged Inbox: Approve the direction, then require a rebased staged-index rollout and the listed privacy and proof fixes.

Why: This adds a new account-facing notification surface, private preference model, and durable activity storage; correctness repairs alone cannot establish whether that product scope should ship.

Before merge

  • Add real behavior proof - Needs real behavior proof before merge: The PR body reports tests only; before merge it needs redacted evidence from a real authenticated Inbox session showing follow, release activity, mute, and mark-read behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Stage the packages-table index before querying it (P1) - collectLegacyPackageEntries immediately queries this new index. On the existing packages table, Convex requires a staged deployment and completed backfill before a later deployment can query it; otherwise this feature can block deploy.
  • Reject follows of the caller’s personal publisher (P2) - The declared contract says users cannot follow their own personal publisher, but this path only checks that the target publisher is active and then writes the follow. Compare the caller to the linked or legacy personal-publisher owner and cover the rejection.
  • Use canonical public visibility for follows (P2) - Late finding: this unchanged block was visible at the prior reviewed head. Checking only publisher deletion/deactivation lets a personal publisher whose linked or legacy owner is inactive be followed and returned from the private list, unlike the canonical visibility rule; use that resolver for follow and list paths.
  • Resolve security concern: Follow list bypasses canonical publisher visibility - The new private follow path accepts and lists active publisher records without validating the linked or legacy personal-account owner, unlike the established public visibility boundary.
  • Resolve merge risk (P1) - The new packages-table index is queried in the same rollout; on existing data its backfill can block deployment.
  • Resolve merge risk (P1) - The private follow API does not yet enforce canonical public visibility for personal publishers, creating a privacy-boundary mismatch.
  • Resolve merge risk (P1) - The three prerequisite PRs remain open and this draft is dirty against main, so the final stacked deployment path is unproven.
  • Complete next step (P2) - A maintainer must sponsor the new durable Inbox scope and choose the staged landing plan for its three open prerequisites; contributor runtime proof is also still required.
  • Improve patch quality - Restack after the prerequisite PRs land and use a staged package-index rollout.
  • Improve patch quality - Enforce canonical publisher visibility and reject self-follows with focused regression coverage.
  • Improve patch quality - Add redacted browser proof from a real authenticated Inbox session, then update the PR body for re-review.

Findings

  • [P1] Stage the packages-table index before querying it — convex/schema.ts:1744
  • [P2] Reject follows of the caller’s personal publisher — convex/publisherFollows.ts:71
  • [P2] Use canonical public visibility for follows — convex/publisherFollows.ts:29
  • [medium] Follow list bypasses canonical publisher visibility — convex/publisherFollows.ts:29
Agent review details

Security

Needs attention: The authenticated follow endpoints are scoped to the caller, but their incomplete visibility check can retain and return an otherwise hidden personal publisher.

Review metrics

Metric Value Why it matters
Patch scope +5104, -118 across 48 files The draft spans schema, backend APIs, generated contracts, specifications, and a new signed-in route while depending on three open PRs.

Merge-risk options

Maintainer options:

  1. Restack through a safe index rollout (recommended)
    Stage and backfill the packages index before a follow-up enables its query, then fix the follow invariants and provide authenticated browser evidence.
  2. Defer the Inbox feature
    Pause the draft if maintainers do not want to sponsor this durable notification model after its prerequisites land.

Technical review

Best possible solution:

Land a maintainer-sponsored, rebased Inbox stack only after a staged package-index rollout, canonical visibility and self-follow enforcement, focused regression coverage, and redacted authenticated browser proof.

Do we have a high-confidence way to reproduce the issue?

Not applicable as a bug reproduction: this is new behavior, and the contributor has not supplied a real authenticated run of the resulting feature.

Is this the best way to solve the issue?

No: the overall approach is plausible, but the direct index rollout and follow-visibility rules are not safe as submitted, and the stacked feature lacks live proof.

Full review comments:

  • [P1] Stage the packages-table index before querying it — convex/schema.ts:1744
    collectLegacyPackageEntries immediately queries this new index. On the existing packages table, Convex requires a staged deployment and completed backfill before a later deployment can query it; otherwise this feature can block deploy.
    Confidence: 0.98
  • [P2] Reject follows of the caller’s personal publisher — convex/publisherFollows.ts:71
    The declared contract says users cannot follow their own personal publisher, but this path only checks that the target publisher is active and then writes the follow. Compare the caller to the linked or legacy personal-publisher owner and cover the rejection.
    Confidence: 0.98
  • [P2] Use canonical public visibility for follows — convex/publisherFollows.ts:29
    Late finding: this unchanged block was visible at the prior reviewed head. Checking only publisher deletion/deactivation lets a personal publisher whose linked or legacy owner is inactive be followed and returned from the private list, unlike the canonical visibility rule; use that resolver for follow and list paths.
    Confidence: 0.94
    Late finding: first raised on code an earlier review cycle already covered.

Overall correctness: patch is incorrect
Overall confidence: 0.97

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 459caf625079.

Labels

Label justifications:

  • P3: This is an optional new account-discovery feature rather than a current user regression.
  • merge-risk: 🚨 availability: A newly queried index on the existing packages table can block the Convex deployment while it backfills.
  • merge-risk: 🚨 security-boundary: The private follow list bypasses the canonical visibility check used to hide inactive personal publishers.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body reports tests only; before merge it needs redacted evidence from a real authenticated Inbox session showing follow, release activity, mute, and mark-read behavior. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Evidence

Security concerns:

  • [medium] Follow list bypasses canonical publisher visibility — convex/publisherFollows.ts:29
    The new private follow path accepts and lists active publisher records without validating the linked or legacy personal-account owner, unlike the established public visibility boundary.
    Confidence: 0.94

What I checked:

  • Current-main check: Current main contains no publisher-follow, publisher-activity, or Inbox implementation, and the PR head is not an ancestor of main. (459caf625079)
  • Release check: No local release tag contains the draft head; the supplied latest release is v0.23.3, which predates current main and does not ship this feature. (7e662bf37ddd)
  • Index rollout blocker: The branch adds packages.by_owner_active_updated and immediately queries it for legacy package feed entries. Convex guidance requires a new index on an existing large table to be staged before it can be queried in a later deployment. (convex/schema.ts:1744, 7e662bf37ddd)
  • Visibility contract mismatch: The follow mutation only checks publisher deletion/deactivation, while current publisher surfaces use canonical public visibility that also validates the linked or legacy personal-account owner. (convex/publisherFollows.ts:29, 7e662bf37ddd)
  • Prior findings remain at the same head: The current PR head is the same SHA as the previous ClawSweeper review, so its index-staging and self-follow findings remain unresolved. (convex/publisherFollows.ts:71, 7e662bf37ddd)
  • Feature-history ownership: Current publisher visibility code is attributed to Patrick Erichsen; nearby publisher performance work is attributed to Vyctor H. Brzezowski. (convex/publishers.ts:292, 87ca030c30f3)

Likely related people:

  • Patrick Erichsen: Current blame attributes the canonical public-publisher visibility helper to Patrick, which the follow and activity feature must preserve. (role: recent publisher-visibility contributor; confidence: high; commits: 87ca030c30f3, eb7aa36f8069; files: convex/publishers.ts, convex/lib/publishers.ts)
  • Vyctor H. Brzezowski: Recent history ties Vyctor to bounded publisher-profile reads adjacent to the new feed and activity query paths. (role: publisher performance contributor; confidence: medium; commits: 307f11f5b802; files: convex/publishers.ts)

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
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.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (6 earlier review cycles)
  • reviewed 2026-08-05T02:09:38.218Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the new packages-table index before using it
  • reviewed 2026-08-05T03:25:05.446Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the packages index before querying it
  • reviewed 2026-08-05T03:32:42.451Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the packages-table index before querying it
  • reviewed 2026-08-05T05:28:27.553Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the packages-table index before querying it
  • reviewed 2026-08-05T07:21:37.046Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the packages-table index before querying it | [P2] Reject follows of the caller’s personal publisher
  • reviewed 2026-08-05T07:28:19.076Z sha 7e662bf :: needs real behavior proof before merge. :: [P1] Stage the packages-table index before querying it | [P2] Reject follows of the caller’s personal publisher

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 session-state 🚨 Merging this PR could lose, corrupt, stale, or mis-associate session or agent state. labels Aug 5, 2026
@github-actions

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked as stale due to inactivity.
Please update it or it will be closed.

@github-actions github-actions Bot added the stale label Aug 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. stale status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant