Step 4: Implementation Summary — Board/Activity Carry-Back (+ Board Score column)

Stage 1 - Relative-date rows for Board and Activity

  • Changes:

    • templates/partials/paned_board_thread_list.php: list-row date span now calls $relativeTimestamp(...) instead of $timestamp(...).

    • templates/partials/paned_activity_item_row.php: same swap for the activity item row date span.

    • templates/partials/paned_activity_commit_row.php: same swap for the activity commit row date span.

  • Verification:

    • php -l on all three edited files — no syntax errors.

    • Grepped the three files for remaining $timestamp( calls — none left, confirming full swap with no missed full-format usage on these rows.

    • Started a throwaway local server on 127.0.0.1:8010 against this working tree (the already-running 127.0.0.1:8000 process was serving a different checkout at /home/wsl/v3, not this repo — left untouched) and curled /forte and /forte/activity/: both now render <time datetime="..." title="Sep 20, 2026 at 01:28 UTC">2 days ago</time> in place of the old full-format text. Test server stopped after verification.

  • Notes:

    • $relativeTimestamp is registered globally in TemplateRenderer::renderFile(), so no wiring was needed beyond the template edits.

    • No other $timestamp usage exists on Board/Activity partials, so nothing else needed to be left alone deliberately — there was nothing else to touch.

Stage 2 - Board Score column

  • Changes:

    • templates/partials/paned_board_thread_list.php: added a "Score" head button (data-paned-sort-column="score") after Replies, a data-paned-sort-score row attribute, and a .paned-list-score row span rendering (int) $thread['score_total'].

    • public/assets/paned_board_reader.js: extended sortValueFor()'s numeric branch (previously special-cased for replies only) to also parse score as an integer; added score: "desc" to sortDefaultDir, matching the existing default-order-by-score direction in Application.php's thread comparator.

    • public/assets/forte.css: added .paned-list-score-head/.paned-list-score (5rem, right-aligned, same as .paned-list-replies-head/.paned-list-replies) and included .paned-list-score in the existing selected-row text-color rule.

  • Verification:

    • php -l on the template — no syntax errors; node --check on paned_board_reader.js — no syntax errors.

    • Started a throwaway local server on 127.0.0.1:8010 (stopped after verification) and curled /forte: head row now includes a Score column button, and each row renders a .paned-list-score span with the thread's score_total value (e.g. 1, 0).

    • Assets are fingerprinted dynamically by content hash at request time (AssetFingerprint::fingerprintedPath), so editing forte.css/paned_board_reader.js directly takes effect immediately with no separate build step.

  • Notes:

    • score_total can be negative per TagScore; rendering is a plain (int) cast with no special formatting, so negative values display correctly (e.g. -2) with no additional handling needed.

    • The new fixed-width column adds 5rem to Board's fixed-column total (now ~32rem); no desktop-width layout regression observed. The narrow-viewport column-squeeze bug remains out of scope here, tracked under forte_mobile_friendly_step1_solution_assessment.md.