Forte Deprecate Single-Thread View — Step 4: Implementation Summary

Stage 1 - Remove the route and renderForte()

  • Changes:

    • Application.php: removed the preg_match('#^/threads/([^/]+)/forte/?$#'...) route branch and the renderForte() method.

  • Verification:

    • php -l clean.

    • Restarted the dev server (./v3 start 0.0.0.0:8001) to pick up the change.

    • curl /threads/{real-thread-id}/forte — 200 before the change, 404 after.

    • curl /forte (board view) and curl /threads/{id} (classic) both still 200, unaffected.

  • Notes: none identified — Step 1's usage trace confirmed no other route or code path called renderForte().

Stage 2 - Delete the orphaned single-thread templates and JS

  • Changes:

    • Deleted templates/pages/forte.php, templates/partials/paned_list_pane.php, templates/partials/paned_content_pane.php, templates/partials/paned_compose_panel.php, public/assets/paned_reader.js.

  • Verification:

    • Full-codebase grep for forte.php, paned_list_pane, paned_content_pane, paned_compose_panel.php, paned_reader.js across src/, templates/, public/ — zero hits.

    • php -l on every remaining file in templates/ — clean.

    • curl /forte — still 200, page still contains the board layout markup, no missing-asset issues (the board view never referenced any of the deleted files).

  • Notes: none identified — Step 1's finding that these four files were single-thread-exclusive held exactly as predicted.

Stage 3 - Remove the dead resolveComposeReplyReturnTo() branch

  • Changes:

    • Application.php: removed the /threads/{id}/forte whitelist branch from resolveComposeReplyReturnTo(); the /forte (board) branch and the default /threads/{id} fallback are unchanged.

  • Verification:

    • php -l clean.

    • Live reply submission via POST /compose/reply with return_to=/forte — still redirects to /forte?created_post_id=...#post-... (board branch unaffected).

    • Live reply submission with return_to=/threads/root-001/forte (the old, now-unreachable shape) — redirects to /threads/root-001?created_post_id=... (the default fallback), confirming the old shape is no longer honored.

  • Notes: none identified.

Stage 4 - Full regression check

  • Changes: none (verification only, as planned).

  • Verification:

    • Full-codebase grep for renderForte(, paned_reader.js, paned_list_pane, paned_content_pane, paned_compose_panel, and the /threads/.../forte route pattern — zero hits outside this feature's own planning docs and git history.

    • curl /threads/root-001/forte re-confirmed 404.

    • Board view regression: GET /forte, GET /forte?tag=general, GET /forte?sort=subject&dir=asc all 200; page correctly loads lazy_compose_signing.js and paned_board_reader.js (the signed-authorship feature from the prior cycle is untouched).

    • Classic regression: GET / (classic board) and GET /threads/root-001 (classic thread page) both 200, unaffected.

  • Notes:

    • This completes all 4 planned stages for forte_deprecate_single_thread_view. The single-thread Forte reader — route, templates, JS, and its one related dead server branch — is fully removed. The board view (/forte), including the identity-signing work from the prior cycle, is completely unaffected.