From dcd15923d8898bd296e61ec826cf1d3f891dc820 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:30:40 +0000 Subject: [PATCH 1/4] fix(recycling): disable removeClippedSubviews to prevent Android crash On Android with Fabric (New Architecture), the native removeClippedSubviews optimization can detach views that FlashList has buffered off-screen via absolute positioning. When FlashList recycles those views back on-screen, Fabric cannot find their view state, causing the Unable to find viewState for tag crash. FlashList v2 manages its own view recycling through key reuse and absolute positioning, so the native clipping optimization is both unnecessary and harmful. This explicitly disables removeClippedSubviews on the ScrollView and the item container to prevent the conflict. Fixes #1914 --- src/recyclerview/RecyclerView.tsx | 1 + src/recyclerview/ViewHolderCollection.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/recyclerview/RecyclerView.tsx b/src/recyclerview/RecyclerView.tsx index 34722d480..daa3be13b 100644 --- a/src/recyclerview/RecyclerView.tsx +++ b/src/recyclerview/RecyclerView.tsx @@ -570,6 +570,7 @@ const RecyclerViewComponent = ( } refreshControl={refreshControl} {...overrideProps} + removeClippedSubviews={false} > {/* Scroll anchor for maintaining content position */} {scrollAnchor} diff --git a/src/recyclerview/ViewHolderCollection.tsx b/src/recyclerview/ViewHolderCollection.tsx index a652beb16..b103e93ba 100644 --- a/src/recyclerview/ViewHolderCollection.tsx +++ b/src/recyclerview/ViewHolderCollection.tsx @@ -172,7 +172,7 @@ export const ViewHolderCollection = ( // ); return ( - + {containerLayout && hasData && Array.from(renderStack.entries(), ([reactKey, { index }]) => { From 92e1e5c78b141bea19a405d53f7cdbb87bbbcaf4 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 23:05:54 +0000 Subject: [PATCH 2/4] fix(recycling): place removeClippedSubviews before overrideProps Move removeClippedSubviews={false} above {...overrideProps} so users can override the default if needed. Fixes #1914 Co-authored-by: Talha Naqvi --- src/recyclerview/RecyclerView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/recyclerview/RecyclerView.tsx b/src/recyclerview/RecyclerView.tsx index daa3be13b..89b56bec9 100644 --- a/src/recyclerview/RecyclerView.tsx +++ b/src/recyclerview/RecyclerView.tsx @@ -568,9 +568,9 @@ const RecyclerViewComponent = ( maintainVisibleContentPosition={ maintainVisibleContentPositionInternal } + removeClippedSubviews={false} refreshControl={refreshControl} {...overrideProps} - removeClippedSubviews={false} > {/* Scroll anchor for maintaining content position */} {scrollAnchor} From b70f319b1cd431d106f9691d69cf8667f40ee422 Mon Sep 17 00:00:00 2001 From: Talha Naqvi Date: Mon, 23 Mar 2026 16:28:34 -0700 Subject: [PATCH 3/4] chore(ci): disable Co-authored-by in all agent workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit claude-code-action injects Co-authored-by trailers for the trigger user into commits. This is unwanted — agent commits should have no co-author attribution. Override via system prompt in all commit-capable workflows. --- .github/workflows/agent-android-bot.yml | 2 +- .github/workflows/agent-bot.yml | 2 +- .github/workflows/agent-fix.yml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/agent-android-bot.yml b/.github/workflows/agent-android-bot.yml index 4d924d209..c17a3e9f7 100644 --- a/.github/workflows/agent-android-bot.yml +++ b/.github/workflows/agent-android-bot.yml @@ -158,7 +158,7 @@ jobs: claude_args: >- --model claude-opus-4-6 --allowedTools "${{ env.ALLOWED_TOOLS }}" - --append-system-prompt "You are running on CI (GitHub Actions). Environment: Ubuntu runner with Android emulator running (device Android35). No iOS simulator. Use agent-device with --platform android --session droid. Read and use skills from .claude/skills/ when relevant. CI notes: use default Metro port (8081). When done, write a brief feedback file to /tmp/agent-feedback.md covering: what you accomplished, tools you needed but couldn't use, issues with skill instructions, suggestions for improvement." + --append-system-prompt "You are running on CI (GitHub Actions). Environment: Ubuntu runner with Android emulator running (device Android35). No iOS simulator. Use agent-device with --platform android --session droid. Read and use skills from .claude/skills/ when relevant. CI notes: use default Metro port (8081). IMPORTANT: Do NOT add Co-authored-by lines to any commits. No AI or human co-author trailers. When done, write a brief feedback file to /tmp/agent-feedback.md covering: what you accomplished, tools you needed but couldn't use, issues with skill instructions, suggestions for improvement." prompt: ${{ github.event.inputs.prompt || '' }} - name: Upload agent feedback diff --git a/.github/workflows/agent-bot.yml b/.github/workflows/agent-bot.yml index 649699f3c..6d759e16b 100644 --- a/.github/workflows/agent-bot.yml +++ b/.github/workflows/agent-bot.yml @@ -82,7 +82,7 @@ jobs: claude_args: >- --model claude-opus-4-6 --allowedTools "${{ env.ALLOWED_TOOLS }}" - --append-system-prompt "You are running on CI (GitHub Actions). Environment: macOS runner with Xcode and iOS simulator. No Android emulator. Read and use skills from .claude/skills/ when relevant. CI notes: use default Metro port (8081). When done, write a brief feedback file to /tmp/agent-feedback.md covering: what you accomplished, tools you needed but couldn't use, issues with skill instructions, suggestions for improvement." + --append-system-prompt "You are running on CI (GitHub Actions). Environment: macOS runner with Xcode and iOS simulator. No Android emulator. Read and use skills from .claude/skills/ when relevant. CI notes: use default Metro port (8081). IMPORTANT: Do NOT add Co-authored-by lines to any commits. No AI or human co-author trailers. When done, write a brief feedback file to /tmp/agent-feedback.md covering: what you accomplished, tools you needed but couldn't use, issues with skill instructions, suggestions for improvement." prompt: ${{ github.event.inputs.prompt || '' }} - name: Upload agent feedback diff --git a/.github/workflows/agent-fix.yml b/.github/workflows/agent-fix.yml index 3c60304ec..692413121 100644 --- a/.github/workflows/agent-fix.yml +++ b/.github/workflows/agent-fix.yml @@ -87,6 +87,7 @@ jobs: Fix ONLY this issue — do not fix other issues. Read and follow .claude/skills/fix-github-issue/SKILL.md for the full workflow. After fixing, read and follow .claude/skills/raise-pr/SKILL.md to raise a PR. CI notes: use default Metro port (8081). + IMPORTANT: Do NOT add Co-authored-by lines to any commits. No AI or human co-author trailers. When done (whether successful or not), write a brief feedback file to /tmp/agent-feedback.md with: - What you accomplished (or where you got stuck) From 74f79f8903af51e15ad39f92673fb434144652e8 Mon Sep 17 00:00:00 2001 From: Talha Naqvi Date: Mon, 23 Mar 2026 16:33:27 -0700 Subject: [PATCH 4/4] fix(recycling): remove redundant removeClippedSubviews from ViewHolderCollection Only needed on the outer ScrollView, not the inner container. --- src/recyclerview/ViewHolderCollection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/recyclerview/ViewHolderCollection.tsx b/src/recyclerview/ViewHolderCollection.tsx index b103e93ba..a652beb16 100644 --- a/src/recyclerview/ViewHolderCollection.tsx +++ b/src/recyclerview/ViewHolderCollection.tsx @@ -172,7 +172,7 @@ export const ViewHolderCollection = ( // ); return ( - + {containerLayout && hasData && Array.from(renderStack.entries(), ([reactKey, { index }]) => {