Skip to content

feed: integrate Certified Feed Service transport - #238

Open
Kzoeps wants to merge 5 commits into
stagingfrom
feed/certified-feed-service-integration
Open

feed: integrate Certified Feed Service transport#238
Kzoeps wants to merge 5 commits into
stagingfrom
feed/certified-feed-service-integration

Conversation

@Kzoeps

@Kzoeps Kzoeps commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add a dependency-free, runtime-validated client for the public app.certified.feed.beta.getFeed XRPC
  • add source-isolated service and indexer home-feed paths, with the indexer path retained as the rollback mode
  • normalize both transports into one render model while preserving staging's extracted, memoized row layer and grouped-endorsement windowing
  • handle stale requests, cursor recovery/cycles, continuation errors, retries, and credentialless cross-origin requests
  • document the build-time source switch and exact-origin service URL contract
  • stabilize DesktopTopBar hydration when auth resolves before its Suspense boundary

Rollout

The source remains indexer by default. Enabling the service path requires:

NEXT_PUBLIC_HOME_FEED_SOURCE=service
NEXT_PUBLIC_CERTIFIED_FEED_SERVICE_URL=https://<feed-service-origin>

The app origin must also be present in the feed service's exact CORS allowlist. Changing either source requires a rebuild/redeploy.

Breaking changes

None. The legacy indexer transport remains available through the observation window.

Out of scope

  • deployment or environment changes
  • CORS changes
  • durable or cross-device feed preferences
  • feed-service authentication
  • Explore/profile indexer migration
  • legacy transport deletion

Test plan

  • npm run typecheck
  • npm run typecheck:test
  • npx eslint src/ --ext .ts,.tsx
  • npm test — 149 files, 1,226 tests passed
  • npm run build
  • Agent Browser service-mode mock smoke test on desktop and mobile
  • Agent Browser filter interaction smoke test
  • Agent Browser hydration regression check — zero page/console errors
  • staging smoke test against the deployed feed service
  • personal and active-group service-mode smoke tests
  • indexer rollback smoke test from the same staging build

Summary by CodeRabbit

  • New Features
    • Added a certified service option for loading the home feed, with indexer mode retained as a fallback.
    • Improved feed rendering for activities, collections, endorsements, evaluations, measurements, and updates.
    • Added richer actor details and more accurate feed previews.
    • Added retry controls, pagination safeguards, and rate-limit cooldown handling.
  • Bug Fixes
    • Prevented stale pagination results from replacing newer feed data.
    • Improved header behavior during hydration and on editorial or embedded pages.
  • Configuration
    • Documented new settings for selecting the feed source and certified service address.

@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
certified-app Ready Ready Preview Aug 4, 2026 1:23pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4914808f-ea82-4915-8b68-f6ecb8d9e7b2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The pull request adds a certified-feed service transport with strict response validation, service and indexer home-feed implementations, normalized event rendering, pagination recovery, updated development fixtures, and hydration-safe desktop navigation behavior.

Changes

Home-feed service migration

Layer / File(s) Summary
Configuration and certified-feed client
.env.local.example, README.md, src/lib/atproto/certified-feed.ts, src/lib/dev/fixtures/*, src/components/dev/mock-fetch-provider.tsx
Adds service-source configuration, certified-feed contracts, validation, credentialless fetching, structured errors, fixtures, and development fetch interception.
Service and legacy hook implementations
src/hooks/use-home-feed.ts, src/hooks/__tests__/use-home-feed-*
Adds service pagination with cancellation, retries, cursor-cycle detection, rate-limit cooldowns, and retains the indexer implementation as useLegacyHomeFeed.
HomeFeed source integration
src/components/home/home-feed.tsx, src/components/home/__tests__/home-feed-*
Selects service or indexer mode, removes hyperlabel filtering, maps organization filters, and updates loading, empty, retry, continuation, and auto-load states.
Normalized feed rendering and grouping
src/components/home/home-feed-rows.tsx, src/lib/utils/*, src/components/home/__tests__/*
Renders service view objects, supports complete and fallback actor profiles, passes hydrated subjects through endorsement groups, and removes preview quality badges.

Hydration-safe desktop chrome

Layer / File(s) Summary
DesktopTopBar hydration behavior
src/components/layout/desktop-top-bar.tsx, src/components/layout/__tests__/desktop-top-bar-hydration.test.tsx
Suppresses chrome on editorial routes and renders an aria-hidden placeholder while mounting or authentication is loading.

Process documentation

Layer / File(s) Summary
Configuration and release workflow documentation
AGENTS.md
Documents service configuration, direct XRPC behavior, feature-branch implementation, operator-approved staging integration, and Draft PR release requirements.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant HomeFeed
  participant useHomeFeed
  participant fetchCertifiedFeed
  participant CertifiedFeedService
  participant HomeFeedBody
  HomeFeed->>useHomeFeed: select service source and provide viewer/filter state
  useHomeFeed->>fetchCertifiedFeed: request initial or continuation page
  fetchCertifiedFeed->>CertifiedFeedService: POST certified feed request
  CertifiedFeedService-->>fetchCertifiedFeed: validated or error response
  fetchCertifiedFeed-->>useHomeFeed: CertifiedFeedPage or CertifiedFeedError
  useHomeFeed-->>HomeFeedBody: events, pagination, retry, and error state
  HomeFeedBody-->>HomeFeed: render rows or retry/load-more controls
Loading

Possibly related issues

  • hypercerts-org/hyperindex#43 — The PR implements the certified-app home-feed service migration and preserves the indexer path as rollback support.

Suggested reviewers: holkexyz

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.35% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: integrating Certified Feed Service transport for the home feed.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feed/certified-feed-service-integration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (9)
src/lib/atproto/certified-feed.ts (1)

263-265: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Body-size guard runs after the body is fully buffered.

await response.text() on Line 244 already materializes the whole payload, so the 512 KiB check can only report an oversized response, never prevent the allocation. If the intent is protection, cap while streaming; otherwise the check is documentation only.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/atproto/certified-feed.ts` around lines 263 - 265, Update the
response-body handling around response.text() and the MAX_ERROR_BODY guard to
enforce the size limit while reading the response stream, before the full
payload is buffered. Track accumulated bytes or characters, abort and throw
contractError once the limit is exceeded, then decode the bounded content for
the existing error-processing flow.
src/hooks/use-home-feed.ts (1)

172-176: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Refs mutated during render (also Lines 472-475 in useLegacyHomeFeed).

stateRef.current = state / currentRequestKeyRef.current = requestKey (and followedRef.current) run in the render body, which React may replay or discard; the configured React Doctor rule flags these as errors (no-ref-current-in-render). Since both refs exist only so loadMore/retryInitial can read the latest snapshot, syncing them in a layout/insertion effect (or deriving the guards from the callback deps directly) keeps render pure without changing the concurrency semantics. Please confirm whether this rule is enforced in CI before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/hooks/use-home-feed.ts` around lines 172 - 176, The refs used by the
home-feed callbacks are mutated during render, violating the configured
no-ref-current-in-render rule. In both the primary hook and useLegacyHomeFeed,
move stateRef, currentRequestKeyRef, and followedRef synchronization into a
layout or insertion effect, preserving the latest-snapshot behavior for loadMore
and retryInitial; also verify whether this rule is enforced in CI.

Source: Linters/SAST tools

src/lib/dev/fixtures/feed.ts (1)

112-124: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Fixture actor shape doesn't match the certified-feed contract.

feedActorBlock emits avatarCid, but parseActor in src/lib/atproto/certified-feed.ts (Lines 397-402) reads avatar as an org.hypercerts.defs#uri/#smallImage object and ignores unknown keys — so service-mode previews always render a null avatar. Harmless today because every MOCK_ACTORS entry has avatarCid: null, but the fixture will diverge from the real payload as soon as one gains an avatar. Emitting a proper avatar blob (or dropping the field) keeps the fixture honest.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/dev/fixtures/feed.ts` around lines 112 - 124, Update
certifiedFeedPage’s feedActorBlock output to match parseActor’s certified-feed
contract by emitting the supported avatar object under avatar, or omit the field
when no avatar exists; do not emit avatarCid, which parseActor ignores. Preserve
null-avatar behavior for current MOCK_ACTORS entries while ensuring future
actors with avatars serialize in the same shape as real payloads.
src/components/home/home-feed.tsx (1)

104-111: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant Escape handler.

useClickOutsideClose (line 103) already registers a document keydown listener that closes on Escape, so this effect duplicates it. Dropping it removes a listener and keeps the close path in one place.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/home/home-feed.tsx` around lines 104 - 111, Remove the
redundant Escape-key useEffect and its document listener from the filter-open
handling, leaving useClickOutsideClose as the sole Escape-close path. Preserve
the existing filterOpen state behavior and click-outside handling.
src/components/home/__tests__/cert-preview-location-icon.test.tsx (1)

22-31: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider typing the fixture.

Annotating with satisfies ActivityHomeFeedView makes this test fail at typecheck if the view contract changes, instead of silently drifting.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/home/__tests__/cert-preview-location-icon.test.tsx` around
lines 22 - 31, Type the view fixture in the cert preview test using satisfies
ActivityHomeFeedView before passing it to CertPreview. Keep the existing fixture
values and render call unchanged, ensuring contract changes cause a typecheck
failure.
src/lib/utils/__tests__/group-feed.test.ts (1)

57-72: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a three-endorsement case.

With only two events the test exercises the single→group promotion branch; the append-into-existing-group branch (last.subjects.push) in groupConsecutiveEndorsements stays uncovered. A third consecutive endorsement from the same actor would cover it and pin subject ordering.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/utils/__tests__/group-feed.test.ts` around lines 57 - 72, Extend the
test case for groupConsecutiveEndorsements with a third consecutive endorsement
from the same actor, then assert the resulting single group contains all three
subjects in input order. Preserve the existing hydration expectations and verify
the append-into-existing-group behavior through the third subject.
src/components/home/home-feed-rows.tsx (2)

185-193: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Move the nested setVisibleCount out of the setExpanded updater.

State updaters must be pure; React may invoke them more than once. Here the reset happens to be idempotent, so no visible bug, but reading expanded directly keeps the updater clean.

♻️ Proposed refactor
-          onClick={() =>
-            setExpanded((current) => {
-              if (current) setVisibleCount(GROUP_EXPAND_PAGE)
-              return !current
-            })
-          }
+          onClick={() => {
+            if (expanded) setVisibleCount(GROUP_EXPAND_PAGE)
+            setExpanded(!expanded)
+          }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/home/home-feed-rows.tsx` around lines 185 - 193, In the Button
onClick handler, move the GROUP_EXPAND_PAGE reset out of the setExpanded updater
and condition it on the current expanded value before calling setExpanded. Keep
the updater responsible only for returning the toggled state, using the existing
expanded state to preserve the current behavior.

Source: Linters/SAST tools


57-70: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract one useResolvedActor hook for the legacy identity fallback. Four wrapper components repeat the same useAuthorInfo(did) call and the same info?.x || actor.x || null merge, so the precedence rules are copied in four places and can drift independently.

  • src/components/home/home-feed-rows.tsx#L57-L70: replace LegacyFeedCardHead's inline merge with useResolvedActor(props.actorProfile) and pass the result as actorProfile.
  • src/components/home/home-feed-rows.tsx#L255-L274: replace LegacyEndorsementGroupSummary's merge with useResolvedActor(first).
  • src/components/home/home-feed-rows.tsx#L307-L319: replace LegacyEndorsedAccountLink's merge with useResolvedActor(subject).
  • src/components/home/home-feed-rows.tsx#L535-L547: replace LegacyEndorsementSentence's merge with useResolvedActor(subject).

Suggested helper:

function useResolvedActor(actor: HomeFeedActor): HomeFeedActor {
  const { info } = useAuthorInfo(actor.did)
  return {
    ...actor,
    handle: info?.handle || actor.handle || null,
    displayName: info?.displayName || actor.displayName || null,
    avatarUrl: info?.avatarUrl || actor.avatarUrl || null,
  }
}

Note LegacyFeedCardHead currently resolves props.actor while the others resolve the profile's did; keeping one helper also settles that inconsistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/home/home-feed-rows.tsx` around lines 57 - 70, Extract a
shared useResolvedActor hook that resolves actor identity fields using
useAuthorInfo(actor.did) with the existing info, actor, null precedence. In
src/components/home/home-feed-rows.tsx lines 57-70, replace LegacyFeedCardHead’s
inline merge with useResolvedActor(props.actorProfile); apply the same
replacement with useResolvedActor(first) in lines 255-274,
useResolvedActor(subject) in lines 307-319, and useResolvedActor(subject) in
lines 535-547, passing each resolved value as actorProfile or the corresponding
actor prop.
src/components/home/__tests__/home-feed-empty-pagination.test.tsx (1)

45-55: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Hardcoded auto-load budget.

The 25/26 magic numbers mirror MAX_AUTO_LOADS in home-feed.tsx. Exporting and importing that constant would keep this test honest if the budget changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/home/__tests__/home-feed-empty-pagination.test.tsx` around
lines 45 - 55, Replace the hardcoded 25/26 auto-load counts in the test around
HomeFeedBody with the exported MAX_AUTO_LOADS constant from home-feed.tsx. Use
the constant for the loop bound and expected loadMore call counts, preserving
the existing manual-button assertion behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/home/home-feed.tsx`:
- Around line 190-201: Remove the unsafe OrganizationQuality[] cast in the
organizationQuality useMemo. Define or reuse a shared input type for allowed
organization tiers, or filter with a type-narrowing predicate, so
organizationQuality.allowed can only contain values from ORGLABEL_TIERS while
preserving the existing includeUnrated behavior before passing it to
useHomeFeed.

In `@src/lib/atproto/certified-feed.ts`:
- Around line 236-243: Update fetchCertifiedFeed’s feed-service fetch to enforce
an internal timeout in addition to options.signal, composing the signals with
supported AbortSignal APIs and providing a compatible fallback where necessary.
Ensure timeout aborts reject through the existing error/retry flow while
preserving caller cancellation behavior.

---

Nitpick comments:
In `@src/components/home/__tests__/cert-preview-location-icon.test.tsx`:
- Around line 22-31: Type the view fixture in the cert preview test using
satisfies ActivityHomeFeedView before passing it to CertPreview. Keep the
existing fixture values and render call unchanged, ensuring contract changes
cause a typecheck failure.

In `@src/components/home/__tests__/home-feed-empty-pagination.test.tsx`:
- Around line 45-55: Replace the hardcoded 25/26 auto-load counts in the test
around HomeFeedBody with the exported MAX_AUTO_LOADS constant from
home-feed.tsx. Use the constant for the loop bound and expected loadMore call
counts, preserving the existing manual-button assertion behavior.

In `@src/components/home/home-feed-rows.tsx`:
- Around line 185-193: In the Button onClick handler, move the GROUP_EXPAND_PAGE
reset out of the setExpanded updater and condition it on the current expanded
value before calling setExpanded. Keep the updater responsible only for
returning the toggled state, using the existing expanded state to preserve the
current behavior.
- Around line 57-70: Extract a shared useResolvedActor hook that resolves actor
identity fields using useAuthorInfo(actor.did) with the existing info, actor,
null precedence. In src/components/home/home-feed-rows.tsx lines 57-70, replace
LegacyFeedCardHead’s inline merge with useResolvedActor(props.actorProfile);
apply the same replacement with useResolvedActor(first) in lines 255-274,
useResolvedActor(subject) in lines 307-319, and useResolvedActor(subject) in
lines 535-547, passing each resolved value as actorProfile or the corresponding
actor prop.

In `@src/components/home/home-feed.tsx`:
- Around line 104-111: Remove the redundant Escape-key useEffect and its
document listener from the filter-open handling, leaving useClickOutsideClose as
the sole Escape-close path. Preserve the existing filterOpen state behavior and
click-outside handling.

In `@src/hooks/use-home-feed.ts`:
- Around line 172-176: The refs used by the home-feed callbacks are mutated
during render, violating the configured no-ref-current-in-render rule. In both
the primary hook and useLegacyHomeFeed, move stateRef, currentRequestKeyRef, and
followedRef synchronization into a layout or insertion effect, preserving the
latest-snapshot behavior for loadMore and retryInitial; also verify whether this
rule is enforced in CI.

In `@src/lib/atproto/certified-feed.ts`:
- Around line 263-265: Update the response-body handling around response.text()
and the MAX_ERROR_BODY guard to enforce the size limit while reading the
response stream, before the full payload is buffered. Track accumulated bytes or
characters, abort and throw contractError once the limit is exceeded, then
decode the bounded content for the existing error-processing flow.

In `@src/lib/dev/fixtures/feed.ts`:
- Around line 112-124: Update certifiedFeedPage’s feedActorBlock output to match
parseActor’s certified-feed contract by emitting the supported avatar object
under avatar, or omit the field when no avatar exists; do not emit avatarCid,
which parseActor ignores. Preserve null-avatar behavior for current MOCK_ACTORS
entries while ensuring future actors with avatars serialize in the same shape as
real payloads.

In `@src/lib/utils/__tests__/group-feed.test.ts`:
- Around line 57-72: Extend the test case for groupConsecutiveEndorsements with
a third consecutive endorsement from the same actor, then assert the resulting
single group contains all three subjects in input order. Preserve the existing
hydration expectations and verify the append-into-existing-group behavior
through the third subject.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 946af034-fbc8-4ae1-a7b2-659a962d55d1

📥 Commits

Reviewing files that changed from the base of the PR and between bff9613 and 6bf6aae.

📒 Files selected for processing (23)
  • .env.local.example
  • AGENTS.md
  • README.md
  • src/components/dev/mock-fetch-provider.tsx
  • src/components/home/__tests__/cert-preview-location-icon.test.tsx
  • src/components/home/__tests__/endorsement-group-row.test.tsx
  • src/components/home/__tests__/home-feed-empty-pagination.test.tsx
  • src/components/home/__tests__/home-feed-indexer-source-isolation.test.tsx
  • src/components/home/__tests__/home-feed-service-render.test.tsx
  • src/components/home/__tests__/home-feed-source-isolation.test.tsx
  • src/components/home/home-feed-rows.tsx
  • src/components/home/home-feed.tsx
  • src/components/layout/__tests__/desktop-top-bar-hydration.test.tsx
  • src/components/layout/desktop-top-bar.tsx
  • src/hooks/__tests__/use-home-feed-invalid-cursor.test.tsx
  • src/hooks/__tests__/use-home-feed-loadmore-abort.test.tsx
  • src/hooks/__tests__/use-home-feed-service.test.tsx
  • src/hooks/use-home-feed.ts
  • src/lib/atproto/__tests__/certified-feed.test.ts
  • src/lib/atproto/certified-feed.ts
  • src/lib/dev/fixtures/feed.ts
  • src/lib/utils/__tests__/group-feed.test.ts
  • src/lib/utils/group-feed.ts

Comment thread src/components/home/home-feed.tsx
Comment thread src/lib/atproto/certified-feed.ts Outdated
Kzoeps and others added 3 commits July 30, 2026 14:40
Add the typed public XRPC client, service-backed home-feed hook and rendering path, guarded indexer rollback mode, configuration docs, and regression coverage for pagination and source isolation.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep the height-reserving top-bar placeholder through the first client snapshot so auth updates cannot race a deferred Suspense boundary. Continue suppressing app chrome entirely on editorial and embed routes.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep the PR focused on implementation and public configuration documentation.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Add bounded timeout-aware feed reads, preserve caller cancellation, align service fixtures with the wire contract, and remove React render/update hazards. Extend regression coverage for transport limits and endorsement grouping.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
@Kzoeps

Kzoeps commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

(reply generated by OpenAI Codex)

Addressed the CodeRabbit review in 8c6458fb:

  • Fixed the internal feed timeout, bounded streamed response reads, and non-blocking oversized-stream cancellation.
  • Moved latest-value refs out of render and made the endorsement toggle updater pure.
  • Removed duplicate Escape handling and the unsafe organization-quality cast.
  • Aligned service avatar fixtures with the wire contract while preserving legacy avatarCid fixtures.
  • Added the third-endorsement case and typed the activity-preview fixture.
  • Consolidated legacy actor fallback resolution.

Left the pagination test’s literal 25/26 expectations unchanged because they intentionally pin the user-visible auto-load budget; importing the production constant would make the test follow the implementation instead of detecting a behavior change. Blanket docstring generation is also out of scope because it is not a repository CI policy and would conflict with the project’s targeted documentation convention.

Validated with 1,267 passing tests, production and test typechecks, ESLint, and a successful production build.

Translate the home-feed request and response at the transport boundary while preserving the existing UI event model. Handle URI-only subjects and omitted service timestamps safely.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant