Repository source: docs/plans/archive/forte_post_permalink_step3_development_plan.md
Forte Post Permalink — Step 3: Development Plan
Stage 1
Goal: Add a working permalink anchor to each thread's root post.
Dependencies: none (Step 2 approved)
Expected changes:
paned_board_content_pane.php's.post-card.paned-post-cardgains a small "#" anchor (alongside the Like/Flag buttonsforte_reactionsalready added there) linking to/forte?selected={threadId}&created_post_id={threadId}#post-{threadId}(notag=);forte.cssgains a small rule matching classic'spost-card-permalinkaffordance, styled for the paned chrome.Verification approach: click the anchor on a root post, confirm the resulting URL matches the expected shape; open that URL fresh (new tab/reload) and confirm the correct thread is selected — root-post highlighting isn't expected to visually differ (no
data-paned-reply-post-idon the root card), so verify via thread selection only for this stage.Risks or open questions: none identified.
Canonical components/API contracts touched:
paned_board_content_pane.php(extended),forte.css(extended).
Stage 2
Goal: Add the same permalink anchor to every reply node.
Dependencies: Stage 1 (styling already in place)
Expected changes:
paned_thread_reply_tree.php's per-node HTML builder gains the same "#" anchor, linking to/forte?selected={threadId}&created_post_id={replyPostId}#post-{replyPostId}.Verification approach: click a reply's anchor, confirm the URL shape; open that URL fresh and confirm the thread is selected and the specific reply is highlighted/scrolled into view (the real end-to-end case Option A exists for).
Risks or open questions: none identified.
Canonical components/API contracts touched:
paned_thread_reply_tree.php(extended).
Stage 3
Goal: Full regression check, including the tag-filter edge case.
Dependencies: Stages 1-2
Expected changes: none (verification only)
Verification approach: follow a reply permalink while a tag filter is active in the browser (simulating a reader clicking a shared link cold, with no prior board state) and confirm the target thread/post still restores correctly, not silently hidden by a stale filter; confirm classic's
/posts/{id}and its own permalink link are byte-for-byte unaffected; confirm no console errors.Risks or open questions: none identified.
Canonical components/API contracts touched: none new — integration check across Stages 1-2.