Skip to content

feat(files): reveal ignored workspace files - #73

Merged
donjor merged 2 commits into
hyprwsfrom
t3code/address-issue-39
Aug 24, 2026
Merged

donjor merged 2 commits into
hyprwsfrom
t3code/address-issue-39

Conversation

@donjor-agent

@donjor-agent donjor-agent Bot commented Aug 24, 2026

Copy link
Copy Markdown

🤖 codex/openai gpt-5.6-sol (high)

Gitignored workspace files can now be revealed on demand across desktop, web, and mobile while remaining hidden by default.

Ignored workspace files are visible and subdued in the desktop file tree

Closes #39

@donjor

Fork-Domain: workspace-files
Fork-Tier: core

Fork-Domain: workspace-files
Fork-Tier: core
@donjor-agent

donjor-agent Bot commented Aug 24, 2026

Copy link
Copy Markdown
Author

🤖 codex/openai gpt-5.6-sol (high)

Reviewed bd497a2cc: no findings. Electron proof showed ignored paths hidden by default and .t3/issue-39-ignored-proof.txt revealed with ignored, subdued styling after the toggle; the console was clean, while chrome-devtools MCP instrumentation and route-cycle persistence remain unverified.

Fork-Domain: workspace-files
Fork-Tier: core
@donjor
donjor force-pushed the t3code/address-issue-39 branch from efbac9e to 9d370be Compare August 24, 2026 10:30
@donjor-agent

donjor-agent Bot commented Aug 24, 2026

Copy link
Copy Markdown
Author

🤖 codex/openai gpt-5.6-sol (high)

Reviewed 9d370be91: no findings. CI is green on this SHA, and the focused desktop settings test (7/7), desktop typecheck, and fork ledger pass. Electron verification confirmed ignored files are hidden by default and revealed dimmed after enabling the control; chrome-devtools MCP instrumentation and route-cycle persistence remain unverified.

@donjor
donjor marked this pull request as ready for review August 24, 2026 10:37
@donjor
donjor merged this pull request into hyprws Aug 24, 2026
5 checks passed
@donjor
donjor deleted the t3code/address-issue-39 branch August 24, 2026 10:37
donjor added a commit that referenced this pull request Aug 24, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 27, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 28, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 29, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 30, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 30, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Aug 30, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Sep 2, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Sep 2, 2026
## What Changed

Appends the churn-ledger row for the `v0.0.38-nightly.20260901.1242` unblock walk. Generated by `node scripts/fork-churn.ts append`; `docs/internals/fork-churn.md` is not hand-edited.

| Field | Value |
| --- | --- |
| Range | `47367dbc05e1a530cddb8217ca52566f43f37c91` → `c3986f00fd16aa9e10135c07672923b6d8fc6963` |
| Conflicts | mechanical: 2 |
| Decisions | 8 agent, 0 human |

Both conflicts were resolved and recorded before the gate ran:

- `apps/web/src/components/files/FileBrowserPanel.tsx` in `69b8fff2a5e1` `feat(files): reveal ignored workspace files (#73)`. Union resolution. Upstream added expand-collapse-all icons and a `directoryPaths` memo at the same two seams where the fork adds its eye-toggle icons and its `ignoredGitStatus` memo. The two sides share no identifier and no behavior.
- `apps/web/src/components/BranchToolbarEnvModeSelector.tsx` in `437cc797f7ce` `feat: New worktrunk thread mode replaces the Worktrunk hook switches`. Rerere replay, reviewed before staging. Upstream's compact-label layout is kept, and the fork's Worktrunk icon branch and its two-argument label call survive inside it.

Three commits arrived flagged as retire candidates and all three were kept. The target tag contains no implementation of any of them: `apps/web/src/components/files/FileBrowserPanel.tsx` at the tag has zero references to ignored entries, and `apps/web/src/components/settings/settingsSearch.ts` has zero references to handoff prompts or Worktrunk. Each flag was list-append proximity in the same file, not a behavior seam.

## Why

The row lands after the apply and is not part of the rebased lane, so it ships as its own docs-only change.

## Verification

- `node scripts/fork-churn.ts render --check`: current
- Gate 3 on the pushed lane: `fork:scan` passed, `fork:delta --check` passed, hyprws CI passed

## Checklist

- [x] Ledger regenerated, not hand-edited
- [x] Row range matches the applied lease and installed head

Refs #404

Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 2, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Sep 2, 2026
## What Changed

Appends the churn-ledger row for the `v0.0.38-nightly.20260901.1242` unblock walk. Generated by `node scripts/fork-churn.ts append`; `docs/internals/fork-churn.md` is not hand-edited.

| Field | Value |
| --- | --- |
| Range | `47367dbc05e1a530cddb8217ca52566f43f37c91` → `c3986f00fd16aa9e10135c07672923b6d8fc6963` |
| Conflicts | mechanical: 2 |
| Decisions | 8 agent, 0 human |

Both conflicts were resolved and recorded before the gate ran:

- `apps/web/src/components/files/FileBrowserPanel.tsx` in `69b8fff2a5e1` `feat(files): reveal ignored workspace files (#73)`. Union resolution. Upstream added expand-collapse-all icons and a `directoryPaths` memo at the same two seams where the fork adds its eye-toggle icons and its `ignoredGitStatus` memo. The two sides share no identifier and no behavior.
- `apps/web/src/components/BranchToolbarEnvModeSelector.tsx` in `437cc797f7ce` `feat: New worktrunk thread mode replaces the Worktrunk hook switches`. Rerere replay, reviewed before staging. Upstream's compact-label layout is kept, and the fork's Worktrunk icon branch and its two-argument label call survive inside it.

Three commits arrived flagged as retire candidates and all three were kept. The target tag contains no implementation of any of them: `apps/web/src/components/files/FileBrowserPanel.tsx` at the tag has zero references to ignored entries, and `apps/web/src/components/settings/settingsSearch.ts` has zero references to handoff prompts or Worktrunk. Each flag was list-append proximity in the same file, not a behavior seam.

## Why

The row lands after the apply and is not part of the rebased lane, so it ships as its own docs-only change.

## Verification

- `node scripts/fork-churn.ts render --check`: current
- Gate 3 on the pushed lane: `fork:scan` passed, `fork:delta --check` passed, hyprws CI passed

## Checklist

- [x] Ledger regenerated, not hand-edited
- [x] Row range matches the applied lease and installed head

Refs #404

Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 2, 2026
## What Changed

Appends the churn-ledger row for the `v0.0.38-nightly.20260901.1246` unblock walk. Generated by `node scripts/fork-churn.ts append`; `docs/internals/fork-churn.md` is not hand-edited.

| Field | Value |
| --- | --- |
| Range | `2d147f3dca40f0e163107e9cc262e144a7a312ce` → `a32f247995fd8f79ae5d9c234fc2f8b7c3431acc` |
| Conflicts | mechanical: 10 |
| Decisions | 33 agent, 0 human |

The widest walk so far, and every conflict is mechanical. Two upstream changes account for eight of the ten.

## Server-side settling deletes fork context

`fix(server): settle threads server-side` moves settled-state resolution out of the clients and deletes the device preferences that fed it. Five fork hunks carried those deletions as context, so each conflict is the same shape: keep the fork's real addition, let upstream's removal stand.

- `apps/desktop/src/settings/DesktopClientSettings.test.ts`, `apps/mobile/src/persistence/mobile-preferences.ts`, and `apps/mobile/src/features/settings/SettingsRouteScreen.tsx` keep only `showIgnoredFiles`. Upstream replaced the mobile device-preference auto-settle switch with a per-connection `EnvironmentAutoSettleSwitch`, so the fork's switch is superseded rather than dropped.
- `apps/web/src/components/ChatView.tsx` keeps only `issuesSurfaceAvailable`. The change-request memo upstream deleted has no remaining reference in either tree.
- `apps/web/src/components/Sidebar.tsx` is a `useMemo` dependency list. Two of the three dropped deps no longer exist in the component and the third is read only outside the memo.
- `apps/web/src/hooks/useNowMinute.ts` is a doc comment with no code in the hunk, resolved to upstream's shorter header.

## Upstream hoisted PullRequestServiceLive

Both `apps/server/src/server.ts` conflicts are the same hoist. Upstream declares `PullRequestServiceLive` earlier in the file, so a fork hunk that touched the old site re-added it as a duplicate. Each resolution drops the duplicate and preserves the fork's real change: `GitHubIssueServiceLive` in the first, `Layer.provide(PullRequestAttachmentStore.layer)` in the second. The file now declares each layer once.

## Remaining two

- `apps/server/src/git/GitManager.test.ts` is an additive union in the `makeManager` options type. Upstream added `gitConfigReads`, the fork adds `zmuxSessionBinder`, and both already have consumers further down the helper.
- `apps/web/src/routes/_chat.pull-requests.tsx` moves upstream's `statsPolicy` derivation next to the `sort` it reads. Upstream derives it in a single page component; the fork splits that component so the route view is a thin wrapper, and every consumer already lives in `PullRequestsPage`.

## Retire candidates

Nine commits arrived flagged and all nine were kept. Each flag is proximity to a conflicting upstream file, not a behaviour overlap in the target tree: `feat(files): reveal ignored workspace files (#73)`, `feat(web): scope pull requests to project windows`, `feat(web): expose Worktrunk hook settings`, `fix(web): add Issues to right-panel launchers (#193)`, `fix(server): bound child-work detail responses`, `feat(server): preserve child result and diff detail`, `fix(web): keep sidebar groups in automatic order`, `feat(web): add sidebar group membership actions`, and `fix(web): preview sidebar group dissolution`.

## Silent seams

None. The rehearsed head typechecks clean across the workspace.

## Why

The row lands after the apply and is not part of the rebased lane, so it ships as its own docs-only change.

## Verification

- `node scripts/fork-churn.ts render --check`: current
- Gate 3 on the pushed lane: `fork:scan` passed, `fork:delta --check` passed, hyprws CI passed

## Checklist

- [x] Ledger regenerated, not hand-edited
- [x] Row range matches the applied lease and installed head

Refs #408

Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 4, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor added a commit that referenced this pull request Sep 6, 2026
## What Changed

Appends the churn-ledger row for the `v0.0.38-nightly.20260901.1242` unblock walk. Generated by `node scripts/fork-churn.ts append`; `docs/internals/fork-churn.md` is not hand-edited.

| Field | Value |
| --- | --- |
| Range | `47367dbc05e1a530cddb8217ca52566f43f37c91` → `c3986f00fd16aa9e10135c07672923b6d8fc6963` |
| Conflicts | mechanical: 2 |
| Decisions | 8 agent, 0 human |

Both conflicts were resolved and recorded before the gate ran:

- `apps/web/src/components/files/FileBrowserPanel.tsx` in `69b8fff2a5e1` `feat(files): reveal ignored workspace files (#73)`. Union resolution. Upstream added expand-collapse-all icons and a `directoryPaths` memo at the same two seams where the fork adds its eye-toggle icons and its `ignoredGitStatus` memo. The two sides share no identifier and no behavior.
- `apps/web/src/components/BranchToolbarEnvModeSelector.tsx` in `437cc797f7ce` `feat: New worktrunk thread mode replaces the Worktrunk hook switches`. Rerere replay, reviewed before staging. Upstream's compact-label layout is kept, and the fork's Worktrunk icon branch and its two-argument label call survive inside it.

Three commits arrived flagged as retire candidates and all three were kept. The target tag contains no implementation of any of them: `apps/web/src/components/files/FileBrowserPanel.tsx` at the tag has zero references to ignored entries, and `apps/web/src/components/settings/settingsSearch.ts` has zero references to handoff prompts or Worktrunk. Each flag was list-append proximity in the same file, not a behavior seam.

## Why

The row lands after the apply and is not part of the rebased lane, so it ships as its own docs-only change.

## Verification

- `node scripts/fork-churn.ts render --check`: current
- Gate 3 on the pushed lane: `fork:scan` passed, `fork:delta --check` passed, hyprws CI passed

## Checklist

- [x] Ledger regenerated, not hand-edited
- [x] Row range matches the applied lease and installed head

Refs #404

Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 6, 2026
## What Changed

Appends the churn-ledger row for the `v0.0.38-nightly.20260901.1246` unblock walk. Generated by `node scripts/fork-churn.ts append`; `docs/internals/fork-churn.md` is not hand-edited.

| Field | Value |
| --- | --- |
| Range | `2d147f3dca40f0e163107e9cc262e144a7a312ce` → `a32f247995fd8f79ae5d9c234fc2f8b7c3431acc` |
| Conflicts | mechanical: 10 |
| Decisions | 33 agent, 0 human |

The widest walk so far, and every conflict is mechanical. Two upstream changes account for eight of the ten.

## Server-side settling deletes fork context

`fix(server): settle threads server-side` moves settled-state resolution out of the clients and deletes the device preferences that fed it. Five fork hunks carried those deletions as context, so each conflict is the same shape: keep the fork's real addition, let upstream's removal stand.

- `apps/desktop/src/settings/DesktopClientSettings.test.ts`, `apps/mobile/src/persistence/mobile-preferences.ts`, and `apps/mobile/src/features/settings/SettingsRouteScreen.tsx` keep only `showIgnoredFiles`. Upstream replaced the mobile device-preference auto-settle switch with a per-connection `EnvironmentAutoSettleSwitch`, so the fork's switch is superseded rather than dropped.
- `apps/web/src/components/ChatView.tsx` keeps only `issuesSurfaceAvailable`. The change-request memo upstream deleted has no remaining reference in either tree.
- `apps/web/src/components/Sidebar.tsx` is a `useMemo` dependency list. Two of the three dropped deps no longer exist in the component and the third is read only outside the memo.
- `apps/web/src/hooks/useNowMinute.ts` is a doc comment with no code in the hunk, resolved to upstream's shorter header.

## Upstream hoisted PullRequestServiceLive

Both `apps/server/src/server.ts` conflicts are the same hoist. Upstream declares `PullRequestServiceLive` earlier in the file, so a fork hunk that touched the old site re-added it as a duplicate. Each resolution drops the duplicate and preserves the fork's real change: `GitHubIssueServiceLive` in the first, `Layer.provide(PullRequestAttachmentStore.layer)` in the second. The file now declares each layer once.

## Remaining two

- `apps/server/src/git/GitManager.test.ts` is an additive union in the `makeManager` options type. Upstream added `gitConfigReads`, the fork adds `zmuxSessionBinder`, and both already have consumers further down the helper.
- `apps/web/src/routes/_chat.pull-requests.tsx` moves upstream's `statsPolicy` derivation next to the `sort` it reads. Upstream derives it in a single page component; the fork splits that component so the route view is a thin wrapper, and every consumer already lives in `PullRequestsPage`.

## Retire candidates

Nine commits arrived flagged and all nine were kept. Each flag is proximity to a conflicting upstream file, not a behaviour overlap in the target tree: `feat(files): reveal ignored workspace files (#73)`, `feat(web): scope pull requests to project windows`, `feat(web): expose Worktrunk hook settings`, `fix(web): add Issues to right-panel launchers (#193)`, `fix(server): bound child-work detail responses`, `feat(server): preserve child result and diff detail`, `fix(web): keep sidebar groups in automatic order`, `feat(web): add sidebar group membership actions`, and `fix(web): preview sidebar group dissolution`.

## Silent seams

None. The rehearsed head typechecks clean across the workspace.

## Why

The row lands after the apply and is not part of the rebased lane, so it ships as its own docs-only change.

## Verification

- `node scripts/fork-churn.ts render --check`: current
- Gate 3 on the pushed lane: `fork:scan` passed, `fork:delta --check` passed, hyprws CI passed

## Checklist

- [x] Ledger regenerated, not hand-edited
- [x] Row range matches the applied lease and installed head

Refs #408

Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 6, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Sep 8, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 8, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 9, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 9, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 10, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 10, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 13, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 13, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 15, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 15, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 17, 2026
* feat(files): reveal ignored workspace files

Fork-Domain: workspace-files
Fork-Tier: core

* test(desktop): cover ignored-file setting

Fork-Domain: workspace-files
Fork-Tier: core

---------

Co-authored-by: donjor <[email protected]>
Fork-Domain: workspace-files
Fork-Tier: core
donjor pushed a commit that referenced this pull request Sep 17, 2026
> 🤖 pi/meta muse-spark-1.3-contributor (high)

## Problem

Upstream-sync run `33806918890` reported that `d8d6f71 feat(files): reveal ignored workspace files (#73)` conflicts in the mobile `ThreadFilesRouteScreen.tsx` against `v0.0.39-nightly.20260903.1272`. PR 543 moved the route's ignored-file preference and request policy behind the fork-owned `ignoredWorkspaceFileListing.ts` boundary, and PR 601 added the `mobile-ignored-file-listing` authoring guard. The guard only named the route screen, but the adaptive inspector (`thread-file-navigator-pane.tsx`) reuses the same boundary with its own inline policy shape, so a future edit could regrow inline policy there undetected.

## Boundary chosen

No behavior change. The boundary stays `apps/mobile/src/features/files/ignoredWorkspaceFileListing.ts` with its `resolveIgnoredWorkspaceFileListing` / `useIgnoredWorkspaceFileListing` adapter. Upstream files keep the narrow integration point: one import plus one call (`useIgnoredWorkspaceFileListing(cwd)` / `(props.cwd)`), retaining their environment and file-inspector gates. This change extends the guard's declared targets, matcher, and inventory wording to cover both the route screen and the inspector, so the leased `#498` rewrite can keep the upstream route screen and attach ignored-file behavior through the boundary.

## Guard

Extended the adopted `mobile-ignored-file-listing` rule in `scripts/fork-scan-guards.ts`:

- `AUTHORING_GUARD_TARGETS` gains the inspector path alongside the route path.
- The warning prose names both surfaces.
- `scripts/fork-scan-guards.test.ts` gains inspector rejection/permit cases.
- `scripts/fork-scan-authoring.test.ts` retargets the request-policy fixture at the inspector.
- `docs/internals/fork-delta.md` workspace-files shape names both surfaces.

## Evidence

| Check | Result |
| --- | --- |
| `vp test run scripts/fork-scan-guards.test.ts scripts/fork-scan-authoring.test.ts scripts/fork-lesson-guidance.test.ts` | 57 passed |
| `vp test run apps/mobile/src/features/files/ignoredWorkspaceFileListing.fork.test.ts apps/mobile/src/features/files/fileTree.fork.test.ts` | 5 passed |
| `vp run --filter @t3tools/mobile typecheck` | passed |
| `vp lint` (touched scripts) | passed, no findings |
| `vp fmt --check` (touched files) | passed |
| `vp run fork:delta --check` | ok: 304 fork commits tagged |
| `vp run fork:scan --no-typecheck --since origin/hyprws` | no new warnings on this branch; the 41 rebase-scan gaps and 2 workflow-drift gaps are pre-existing on `origin/hyprws` and untouched by this change |
| `vp run fork:delta --check` full-scan gap check | pre-existing gaps only, verified identical with the change stashed |

## Surfaces walked

- **Entry points.** The ignored-file preference is reachable from the mobile General settings switch, the file-tree toolbar toggle (web), and both mobile listing surfaces. This change touches only guard scope, not behavior, so all entry points keep their existing wiring.
- **Clients.** Mobile is the affected client; the boundary and both integration points are mobile-only. Web/desktop settings and listing paths are untouched.
- **Providers.** Not applicable: no provider adapter is involved.
- **Contracts.** Not applicable: `includeIgnored` on `ProjectListEntriesInput` is unchanged.
- **Reverse states.** Not applicable: reveal/reset behavior is unchanged; the preference toggle and its off state are untouched.
- **Connection modes.** The boundary preserves local and remote workspace roots without interpreting them (covered by the existing host-path test); connection behavior is unchanged.
- **Docs.** `docs/internals/fork-delta.md` workspace-files shape updated to name both guarded surfaces.

Refs #536; closes when the after-census under `#572` no longer observes this stop.

Model: muse-spark-1.3-contributor. Harness: pi.

Fork-Domain: workspace-files
Fork-Tier: core

<!-- gh-bot:attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"fix/seam-536@79e01ffde5c","agents":[{"role":"host","iface":"pi","provider":"meta","model":"muse-spark-1.3-contributor","effort":"high","harness":"[email protected]","session":"36d5f9419631"}],"ts":"2026-09-06T07:48:09Z"} -->

Fork-Domain: workspace-files
Fork-Tier: core
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Sep 19, 2026
The post-mortem claimed the commit could not be written again; nothing proved it.
Re-author its six woven files and assert the refusal, including that `footprint`
is silent because its budget is #73's own file count.

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Sep 19, 2026
## What Changed

One test that re-authors `6ea3f9faec` in a fixture repository and asserts the scan refuses it.

The six upstream-owned paths are the real ones from the census, each carrying one fork line in the shape that commit used: a preference read, a listing flag, a settings row.

## Why

The post-mortem's claim is that `#73` could not be written again. Nothing tested it, so adoption rested on reading the rules rather than running them.

### What actually refuses it

| Rule | Charges | Count |
| --- | --- | --- |
| `fork-hook-seam` | each woven file, on its own | 6 |
| `upstream-test` | the two `.test.ts` paths | 2 |
| `mobile-ignored-file-listing` | `ThreadFilesRouteScreen.tsx` | 1 |

Nine adopted-guard failures, exit 1.

The **count** is what the test asserts, not the rule names. Every rule prints its name whether it is adopted or merely advisory, so a name alone proves nothing. A first draft asserted the names and passed with `fork-hook-seam` un-adopted; the count does not.

Mutation-checked: comment `"fork-hook-seam"` out of `ADOPTED_AUTHORING_GUARDS` and the line reads `failed: 3`, and the test goes red.

### `footprint` is silent

`UPSTREAM_FOOTPRINT_BUDGET` is 6, measured from this commit, and the rule charges *more than* the budget.

So the guard named after `#73` does not fire on `#73`. The test pins that with `assert.strictEqual(woven.length, UPSTREAM_FOOTPRINT_BUDGET)` beside the `notInclude`, so a future budget change cannot quietly turn the assertion vacuous.

This is why adoption could not rest on `footprint`, and why `fork-hook-seam` had to be adopted for the shape to be unauthorable.

### The residual, rehomed

`#939` is closed, so its named residual had no live home. The test is now that home.

The dual-trailered lane (`Fork-Tier: bugfix` + `Fork-Upstreamable: yes`) exempts `fork-hook-seam` and nothing else. The second half of the test re-authors the same tree through that lane and asserts:

- `failed: 3`, the six seam charges gone and nothing else forgiven
- `mobile-ignored-file-listing` and `upstream-test` still charging, exit still 1

A woven seam does not land through the exempt lane. If that ever changes, this assertion goes red, which is the reopening trigger `#939` described in prose.

### Scope

The historical range stays advisory, asserted in the same test: the trunk already carries `#73` and must keep scanning green.

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

No UI surface: fork authoring tooling under `scripts/`.

Verified:

- `vp test run scripts/fork-scan-authoring.test.ts scripts/fork-scan.test.ts scripts/fork-scan-guards.test.ts` — 107 passed
- `vp run typecheck` clean (suggestions only, all pre-existing)
- `vp lint scripts/fork-scan-authoring.test.ts` — no findings
- `fork-scan.ts --head HEAD --target 052c7ae --since 0d395b1 --no-typecheck`, the CI blocking gate: `ok`

## Fork trailers

Closes #1099

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
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.

[📡#65] File viewer cannot show gitignored files; no setting exists

1 participant