Skip to content

refactor: remove the Loom project timeline - #71

Merged
ScriptedAlchemy merged 14 commits into
mainfrom
t3/remove-loom-features
Nov 6, 2026
Merged

ScriptedAlchemy merged 14 commits into
mainfrom
t3/remove-loom-features

Conversation

@ScriptedAlchemy

@ScriptedAlchemy ScriptedAlchemy commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

This branch also carries #72, feat(memory): save project facts without an approval queue, which was merged into it on 2026-11-06. Merging this PR lands both changes, including migration 92, which rewrites stored memory facts. The verification and reviews below cover the Loom removal only and predate #72. See #72 for its own description.

Problem

Loom, the project activity timeline this fork added, did not prove useful in the UI. It is about 9,500 lines across web, mobile, server, and contracts. Upstream does not have it, so every upstream merge has to carry it.

Change

  • Remove the Loom page, its sidebar and command palette entries, the mobile screen and menu, the project.readLoomWindow RPC, the ProjectLoom service, the projectLoom capability, and the user guide.
  • Add migration 91, which drops the six indexes that only Loom read. They take about 92 MiB on one real database, and 90 MiB of that is on the turn items table, which agent turns write to constantly.
  • Pin the shell's pending-secret lookup to runs_thread_status_idx. Dropping both runs_* indexes made SQLite switch that lookup to runs_thread_ordinal_idx, which reads every run of an idle thread. The query's own comment says that must not happen. On seeded data with 500 threads of 200 idle runs, the subquery went from 2.3 ms to 41 ms and the full shell statement from about 101 ms to 116 ms. With the pin, the plan matches the plan before the drop.
  • Fix two test failures that are already on main, because the required Fork Check cannot pass without them. providerEnv.ts removed the T3_MOBILE_TEST_PLATFORM variable that the Android run of FilePreviewModal.test.tsx reads, so that test assumed iOS while its code was compiled for Android. pstackModels.test.ts expected targets from before Claude models had the ultracode option. Both changes are test-only and in separate commits.

Scope and approval

The fork owner asked for this removal.

These stay on purpose:

  • Migrations 75 and 77 and the preview name ProjectLoomWindowItems stay, because existing databases record those names and startup compares them.
  • threads_project_linked_idx stays even though migration 77 created it, because getThreadsWithPullRequests reads it.

These effects are accepted:

  • If you roll back to a build that has Loom, its Loom reads fail with no such index, because they use INDEXED BY. Review found no other code that names the dropped indexes, but nobody ran an old build against a migrated database.
  • Older mobile builds show their Loom menu until the app updates. Opening it says to update the server. It makes no RPC call and does not crash.
  • An old /loom/... URL shows the sidebar with an empty main pane, the same as any other unknown URL of that shape today.

Verification

  • Upgrade. I started origin/main on a test database, which had migration 90 and all the indexes. I then started this branch on the same database. Migration 91 ran, the six indexes are gone, the linked index stayed, and a Replay (dev) turn completed with no SQL errors in the server log.
  • Query plans. I compared EXPLAIN QUERY PLAN before and after the drop for SQL captured from server tests: 1,023 statements from an early capture, and 752 from 59 test files on the final code (1,058 tests passed). No plan changed. This covers only SQL that those tests prepare.
  • Regression test. The plan assertion in ProjectionStore.test.ts fails without the pin and passes with it.
  • Web. The project row has no Loom button and its other actions stay right-aligned. Searching "loom" in the command palette finds nothing. The pull requests page loads.
  • Checks. vp run check:changed passes: format, lint, knip, typecheck of 41 packages, and 18 test files. Knip does not cover apps/mobile, so I checked mobile orphans by reading the code.
  • Mobile. Partly verified. Typecheck passes, and the iOS JavaScript bundle builds from this branch with no Loom references in it. I could not run it on a device. Building the dev client failed twice because expo-modules-autolinking gives its module scan a fixed 5-second limit (moduleScanner.js:140), and this loaded machine missed it. This branch changes no native inputs. Android was not checked because this machine has no Android SDK.

Before and after

Before After
Project row Project row with the Loom icon Project row without the Loom icon
Command palette, searching "loom" Palette offers Open Loom Palette finds nothing

The removed page:

The Loom page before removal

Implemented with Claude Sonnet 5.5 and Claude Opus 5.5. Reviewed by Claude Opus 5.5, GPT-6.1 Sol, and DeepSeek V4.1 Flash. Run in T3 Code through Claude Code.

🤖 Generated with Claude Code

ScriptedAlchemy and others added 5 commits November 5, 2026 17:02
The sidebar button, command palette action, route, and page go with it.
loomEdgeLabel in client-runtime had no other caller.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Home and thread sidebar entries, the stack route, and its test registration go with it. With no web or mobile caller left, the client-runtime Loom module goes too.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Contracts, the projectLoom capability, RPC authorization, and instrumentation entries go with it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Migration 91 drops the six indexes that only Loom read. Without both
runs indexes, SQLite no longer picks the status index for the shell's
pending-secret lookup and reads each thread's run history instead. That
lookup now names the status index, which is what its comment already
promised.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 28132ce

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

ScriptedAlchemy and others added 5 commits November 5, 2026 21:33
Migrate existing facts to a saved-or-forgotten lifecycle and update clients and agents together. Keep provenance, explicit supersession, feedback and TraceDecay-derived ranking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
providerEnv.ts removes T3_ variables from test workers. FilePreviewModal.test.tsx
therefore read iOS while the code under test was compiled for Android, so its
Android run failed on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude models now advertise ultracode, and resolveOptions fills in every option
that does not set speed. The expected targets predate that option.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ScriptedAlchemy and others added 4 commits November 6, 2026 01:50
…o-create

feat(memory): save project facts without an approval queue
Automatic learning is now on by default, so a settled run queues an extract
effect that stays pending until the worker drains it. These tests never run the
worker and do not test learning, so they read that pending effect as work left
over after recovery.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ScriptedAlchemy
ScriptedAlchemy merged commit c97ec24 into main Nov 6, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant