Forte Activity Instant Loading — Step 4: Implementation Summary

Stage 1 - Lightweight activity list contract

  • Changes:

    • Added ActivityService::fetchActivityRows() for un-enriched list records and fetchActivityDetail() for one enriched item.

    • Kept fetchActivity() as the classic-compatible enriched wrapper over the lightweight query.

    • Added coverage that confirms rows omit commit-manifest data until detail is requested.

  • Verification:

    • ./v3 test LocalAppSmokeTest::testActivityRowsStayLightweightUntilDetailRequested — passed.

    • php -l src/ForumRewrite/Activity/ActivityService.php and php -l tests/LocalAppSmokeTest.php — passed.

  • Notes:

    • No database changes; filter, sort, cursor, and enriched classic Activity contracts remain intact.

Stage 2 - Bounded server bootstrap and APIs

  • Changes:

    • Forte Activity now loads a 20-row selected-view batch; Commit rows load only when the Commit filter is initially requested.

    • Added row-only paging and /api/forte_activity_detail, while preserving the existing enriched paging response by default.

  • Verification:

    • Local server smoke: /forte/activity/ returned 200 with a 128,688-byte initial page; row-only paging and activity-detail APIs returned status: ok.

    • PHP lint passed for ActivityService, ForteActivityController, and Application.

  • Notes:

    • The existing list/detail templates still render hidden articles; Stage 3 removes that presentation work.

Stage 3 - Minimal first-paint markup

  • Changes:

    • The Activity detail pane now renders only the selected item article instead of a hidden article for every initial row.

  • Verification:

    • Local server smoke: /forte/activity/ returned 20 rows and only three page articles (placeholder, selected detail, and existing dialog content), at 29,509 bytes.

    • php -l templates/partials/paned_activity_detail_pane.php and git diff --check — passed.

  • Notes:

    • Selected detail remains server-rendered; subsequent selections receive their detail in Stage 4.

Stage 4 - On-selection Activity details

  • Changes:

    • Added Activity-detail loading, per-visit caching, loading/error states, and stale-response protection to the Activity reader.

    • Reused the existing selected article when present and retained the separate Commit-detail flow.

  • Verification:

    • node --check public/assets/paned_activity_reader.js, php -l src/ForumRewrite/Http/ForteActivityController.php, and git diff --check — passed.

    • Stage 2's local API smoke confirmed the Activity-detail endpoint returns a rendered detail article.

  • Notes:

    • A direct user selection updates row state before issuing the detail request, preventing a stale response from replacing a newer selection.

Stage 5 - Automatic complete row preload

  • Changes:

    • Added a post-paint, cursor-driven preload scheduler for every Activity and Commit filter.

    • Rows are fetched through the lightweight response, merged/deduplicated by item ID, and the scheduler yields between pages and invalidates after a sort-pane swap.

  • Verification:

    • node --check public/assets/paned_activity_reader.js and git diff --check — passed.

    • Local API smoke verified rows_only=1 responses for All, Content, Identity, Bootstraps, Approvals, and Commits; each returned status: ok with empty detail_html.

  • Notes:

    • The Load more group is hidden while automatic preload owns cursor progression; API cursor behavior remains available and is exercised by the scheduler.

Stage 6 - Performance and regression proof

  • Changes:

    • Updated Forte Activity manifest coverage to request technical detail through the new on-selection API.

  • Verification:

    • Local-server initial /forte/activity/: 200, 29,509 bytes, 20 rows, three articles, and 11.304 ms TTFB; Board, Users, classic Activity RSS, Backup, Content, and Commits routes all returned 200.

    • Focused smoke suite passed: Activity lightweight rows, classic/Forte manifest detail, signature detail, and classic source-commit coverage (4/4).

    • PHP lint passed for changed PHP/templates; node --check public/assets/paned_activity_reader.js and git diff --check passed.

    • Full ./v3 test: 590 run, 584 passed. The six reported failures are outside this change: five are already recorded as long-standing; the remaining core-routes assertion expects View: content, which is absent from the unchanged classic Activity template.

  • Notes:

    • The local warm-path measurement is well below the 500 ms target. The automatic preload remains intentionally asynchronous, so the initial response stays bounded as history grows.