Skip to content

feat(web): filter archived threads by project - #7282

Open
lastobelus wants to merge 10 commits into
pingdotgg:mainfrom
lastobelus:feat/archive-project-filtering
Open

feat(web): filter archived threads by project#7282
lastobelus wants to merge 10 commits into
pingdotgg:mainfrom
lastobelus:feat/archive-project-filtering

Conversation

@lastobelus

@lastobelus lastobelus commented Aug 17, 2026

Copy link
Copy Markdown

Problem

Large archives are difficult to navigate because every archived thread is shown at once, even when the user only wants threads from one project. This implements the focused project-filtering request from discussion #6780.

What changed

  • Reuse the Project Settings project-switching breadcrumb for the Archive header.
  • Add All as the default Archive scope, with individual project entries in the same native picker.
  • Derive picker entries from archived snapshots so projects with only archived threads remain selectable.
  • Store the selected logical project in the route search and filter the already-loaded archive client-side.
  • Gate the Archive-specific breadcrumb on the active route match so settings navigation never reads search from a merely pending match.
  • Preserve complete project keys during route validation, including keys longer than 500 characters.
  • Preserve repository grouping across worktrees and environments.

UI evidence

Default — Archive / All Filtered — Archive / Beta Project

The semantic pass verified that the header project button reads All by default, selecting Beta Project from the picker updates the button and adds the logical project key to the route, and selecting All clears the query and restores the archive-only Legacy Archive section.

Verification

  • ./node_modules/.bin/vp test run apps/web/src/components/settings/SettingsBreadcrumb.test.tsx apps/web/src/archiveProjectFiltering.test.ts
  • targeted formatter and linter checks for the eight changed files
  • (cd apps/web && ../../node_modules/.bin/tsgo --noEmit)
  • isolated disposable archive fixture with three projects and five archived threads
  • preview-driven picker interaction for All -> Beta Project -> All, including breadcrumb text, route, and restored archive-only content assertions
  • regression coverage for a valid project key longer than 500 characters

Implemented by GPT-5.6-sol through the Codex harness.


Note

Medium Risk
Touches routing/search parsing and archive grouping logic, so a breadcrumb or filter bug can hide threads or leak search state across settings pages. No auth or data-write path changes.

Overview
Lets users filter archived threads by logical project instead of always showing the full archive.

The Archive header now uses a reusable ProjectScopeBreadcrumb (also adopted by project settings) with All plus picker entries derived from archived snapshots, so archive-only projects stay selectable. Selection is stored in ?project= and applied client-side via buildArchivedProjectModel / filterArchivedProjectGroups, including repository grouping across environments.

The archive breadcrumb waits for the active route match so pending settings navigation does not read search from a not-yet-matched Archive route. Unknown or not-yet-stable project keys stay empty rather than falling back to All.

Reviewed by Cursor Bugbot for commit 191d74b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add project filtering for archived threads in web settings

  • Introduces useArchivedProjectModel hook and buildArchivedProjectModel builder to group archived threads by physical project (scoped to environment) and annotate with a logicalProjectKey.
  • Adds filterArchivedProjectGroups util to narrow archived groups by selected logical project, and validateArchivedThreadsSearch to validate the project search param.
  • Replaces inline breadcrumb logic with the new reusable ProjectScopeBreadcrumb component, allowing users to switch archived project filter directly from the settings breadcrumb via URL search params.
  • Updates the /settings/archived route to validate and pass projectKey to ArchivedThreadsPanel, which now filters displayed projects/threads and differentiates empty states.
  • Risk: filterArchivedProjectGroups returns an empty array when scopeReady is false; verify the scopeReady derivation in apps/web/src/components/settings/SettingsPanels.tsx handles all loading states correctly.

Macroscope summarized 191d74b.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. 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: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2ac6a4a3-ba60-474f-83a9-cb61226c82c3

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

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.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
Comment thread apps/web/src/routes/settings.archived.tsx Outdated
@lastobelus
lastobelus marked this pull request as ready for review August 17, 2026 03:34

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 619576d6ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/web/src/components/settings/SettingsBreadcrumb.tsx Outdated
Comment thread apps/web/src/archiveProjectFiltering.ts Outdated
Comment thread apps/web/src/components/settings/SettingsBreadcrumb.tsx Outdated
@macroscopeapp

macroscopeapp Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new feature for filtering archived threads by project, including new UI components, filtering logic, state management hooks, and route handling. New features with user-facing behavior changes warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@github-actions github-actions Bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 17, 2026
Comment thread apps/web/src/lib/archivedThreadsState.ts Outdated
Comment thread apps/web/src/archiveProjectFiltering.ts Outdated
Comment thread apps/web/src/archiveProjectFiltering.ts Outdated
Comment thread apps/web/src/archiveProjectFiltering.ts Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two UI consistency issues in the new project-scope breadcrumb and its Archive call site. Details inline.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/settings/SettingsBreadcrumb.tsx
Comment thread apps/web/src/components/ProjectScopeBreadcrumb.tsx Outdated
Comment thread apps/web/src/lib/archivedThreadsState.ts Outdated
Comment thread apps/web/src/components/ProjectScopeBreadcrumb.tsx Outdated
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 17, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One inconsistency between the breadcrumb filter state and the panel's empty state. Everything else in the extracted ProjectScopeBreadcrumb reuse looks consistent with the existing Project Settings selector.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/settings/SettingsPanels.tsx Outdated
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 17, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 17, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 18, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 19, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 19, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 19, 2026
## Problem

Large archives are difficult to navigate because every archived thread
is shown at once. LastCode should adopt the project-scoped Archive
filter now without waiting for the upstream review schedule.

## Source provenance

- Upstream PR: pingdotgg#7282
- Title: `feat(web): filter archived threads by project`
- Author: Michael Johnston (`lastobelus`)
- Observed August 17, 2026 (America/Vancouver): open and unmerged, with
the upstream vouch gate blocking merge
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Pinned upstream head: `535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Review context: all 13 upstream review threads are resolved; upstream
checks are supporting evidence only

## Import

The complete eight-commit upstream graph was derived from the pinned Git
objects and cherry-picked oldest-first with `-x` onto exact LastCode
base `6ebffe1965126f81e1ee65ba5bee9726d6cb4b10`.

The upstream stack applied without textual conflicts or
LastCode-specific adaptations. Range-diff shows only the provenance
trailers, and both source and the initial port aggregate to stable patch
ID `d9e9829895c1cbb1ee796950022e39f59095c8f3`.

LastCode exact-head review then found that saved disconnected
environments could leave the archive aggregate loading forever. A
downstream follow-up limits archive snapshot requests to connected
environments and adds a regression test for the offline case.

## Validation

- dependency installation completed with `vp i`
- 7/7 focused archive-filtering tests passed, including
disconnected-environment coverage
- targeted formatter and linter checks passed for all eight changed
files
- the web package typecheck passed under Node `24.13.1`
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and all workspace test groups
- a LastCode web client at 1280×800 used disposable state with three
projects and five archived threads:
  - `All` showed Alpha, Beta, and the archive-only Legacy project
- selecting `Beta Project` updated the route and hid Alpha and Legacy
rows
  - selecting `All` cleared the query and restored all groups

The shared preview could exercise the interaction but could not capture
a screenshot while its tab was hidden. The published images below are
from the patch-identical upstream candidate; the LastCode client
assertions above were verified independently.

## UI evidence

Default Archive scope:

<img width="1280" height="800" alt="Default — Archive / All"
src="https://github.com/user-attachments/assets/26167028-e14c-43fa-958d-37c96392bec7"
/>

Filtered Archive scope:

<img width="1280" height="800" alt="Filtered — Archive / Beta Project"
src="https://github.com/user-attachments/assets/c4547658-26c1-43ea-84e7-3ddfd48e5782"
/>

Implemented by GPT-5.6-sol through the Codex harness.
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 19, 2026
## Problem

The project-scoped Archive breadcrumb adopted in #31 can read
`/settings/archived` search state while navigation to that route is
still pending. At that instant the browser location already names
Archive but the route match does not exist yet, so strict route search
lookup can fail instead of rendering a safe interim breadcrumb.

## Source provenance

- Upstream PR: pingdotgg#7282
(`feat(web): filter archived threads by project`)
- New upstream commit:
pingdotgg@a5bed62
- Author: Michael Johnston (`lastobelus`)
- Observed August 19, 2026 (America/Vancouver): upstream PR open and
unmerged; head `a5bed62d299e343646f0a6272d936b875df55cb9`; mergeable but
blocked by upstream policy/review state
- Pinned upstream base: `949feb61e4bfd96669ba0e8cf3dca7c6d7f885b3`
- Prior LastCode adoption: #31 pinned the earlier upstream head
`535a7b11358d8f0b4b302e4261b769dbafffc643`
- Linked request: pingdotgg#6780
- Upstream context: all 13 review threads remain resolved; the
current-head bot checks are terminal and acceptable, but are supporting
evidence only

## Import

The new one-commit delta was derived from the pinned Git graph and
cherry-picked with `-x` onto exact LastCode base
`7f9f0ecf7d5cd7865f9453a819390d2852890369`.

It applied without textual conflicts or LastCode-specific adaptations.
The source and port both have stable patch ID
`802299eab4778fd2608662714563aceefacf73eb`.

The fix performs a non-throwing archive-route search lookup before
selecting the Archive-specific breadcrumb. While the route is pending it
renders the ordinary Settings breadcrumb; once matched it renders the
selected Archive project. The new tests cover both a deliberately paused
navigation and a direct selected-project deep link.

## Validation

- dependency installation completed with `vp i`
- Node `24.13.1`; pnpm `11.10.0`
- 9/9 focused Archive tests passed across `SettingsBreadcrumb.test.tsx`
and `archiveProjectFiltering.test.ts`
- targeted formatter and linter checks passed for both changed files
- web package typecheck passed
- committed-range `git diff --check` passed
- the guarded push's `lastcode:ci:quick` hook passed formatting,
workspace typechecks, and every workspace test group

This timing fix does not change the settled Archive UI, so the
final-state evidence from #31 remains representative. The pending-route
regression is deterministic in the focused router test rather than
dependent on recording a transient frame.

Implemented by GPT-5.6-sol through the Codex harness.
@lastobelus
lastobelus force-pushed the feat/archive-project-filtering branch from a5bed62 to afad3d5 Compare August 21, 2026 20:17
@lastobelus

Copy link
Copy Markdown
Author

Macroscope UI Consistency on head afad3d5 is intentionally not actionable. Archive is required to mirror the existing Project Settings breadcrumb/picker shape: Project Settings renders “Projects / ”, so Archive renders “Archive / ” with “All” as its sole archive-specific addition. Adding a leading Settings crumb or retaining the Settings breadcrumb aria label would diverge from that reference UI and broaden the agreed design.\n\nThe brief “Settings / Archive” fallback during navigation is also intentional. The pathname can advance before the archived route match/search exists; SettingsBreadcrumb must avoid reading the throwing archived-route search in that interval. Once the route match is available, it renders the project-scope breadcrumb. The pending-navigation and direct-deep-link cases are covered by SettingsBreadcrumb.test.tsx.

Comment thread apps/web/src/components/settings/SettingsPanels.tsx

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 191d74b. Configure here.

Comment thread apps/web/src/components/settings/SettingsPanels.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant