Repository source: docs/plans/archive/forte_deprecate_single_thread_view_step2_feature_description.md
Forte Deprecate Single-Thread View — Step 2: Feature Description
Problem
The single-thread Forte reader (/threads/{id}/forte) is a fully duplicate, unreachable view — the board view (/forte) already does everything it does and is the only one anything links to. Carrying its route, templates, JS, and a related server-side dead branch forward costs real maintenance attention for zero reader benefit, and forces every future Forte cycle to keep deciding whether to also touch a view nobody can reach.
User Stories
As a maintainer picking up the next Forte cycle, I want the single-thread view's code gone, so I never have to ask "does this change need to touch the old reader too?" again.
As a maintainer, I want the dead
resolveComposeReplyReturnTo()branch removed alongside the view that made it necessary, so the reply-return-to logic only accepts shapes something can still legitimately produce.(No end-user story: nothing links to this route today, so no reader-facing behavior changes as a result of this cycle — see Success Criteria.)
Core Requirements
The route match for
/threads/{id}/forte(Application.php:436) andrenderForte()(Application.php:806) are removed; requesting that URL now falls through to the normal 404 path, same as any other unrecognized route.templates/pages/forte.phpand the three partials used only by it —paned_list_pane.php,paned_content_pane.php,paned_compose_panel.php— are deleted.public/assets/paned_reader.jsis deleted.resolveComposeReplyReturnTo()'s/threads/{id}/fortewhitelist branch (Application.php:5083-5085) is removed; the/forte(board) branch and the default fallback are untouched.The board view (
/forte,renderForteBoard()) is completely unaffected — no template, JS, CSS, or route changes there. Per Step 1's finding,paned_folder_tree.php,paned_thread_reply_tree.php, andforte.cssare shared/board-only despite living alongside the removed files, and stay as-is.No database/schema changes — this is a pure code/route removal.
No test suite changes needed — Step 1 confirmed zero automated tests reference any of the removed surface.
Shared Component Inventory
public/assets/forte.css— loaded by both views today. Untouched; some single-thread-specific rules become unused but trimming them is out of scope for this cycle (noted in Step 1, not blocking).templates/partials/paned_folder_tree.php/paned_thread_reply_tree.php— despite naming/directory proximity to the removed files, these are board-view components (confirmed by usage grep in Step 1). Untouched.resolveComposeReplyReturnTo()— partially removed (only the single-thread branch); the board-view branch and default fallback are reused unchanged.Tools page →
/fortelink (Application.php:1436) — already points only at the board view. Untouched.
Simple User Flow
Nothing changes for any reachable path through the app — the Tools page still links only to
/forte(the board view), exactly as it does today.A request to the old
/threads/{id}/forteURL (which nothing in the app generates or links to) now 404s instead of rendering the old reader.
Success Criteria
GET /threads/{id}/fortefor a real thread ID returns 404, identical to a request for any nonexistent route.forte.php,paned_list_pane.php,paned_content_pane.php,paned_compose_panel.php, andpaned_reader.jsno longer exist in the repo.A full-codebase grep for
renderForte(,paned_reader.js,paned_list_pane,paned_content_pane,paned_compose_panel, and the/threads/.../forteroute pattern returns zero hits outside this feature's own planning docs and git history.The board view (
/forte) — folder tree, thread list, reply/compose (including the just-shipped signed authorship), sort, tag filtering — is fully regression-verified as unaffected.resolveComposeReplyReturnTo()still correctly resolves the/forte(board) return path and the default fallback; only the single-thread branch is gone.