Feature plan: Step 1 · Step 2 · Step 3 · Step 4

Debug mode: enabled

Branch: feature/backup_page_redesign, based on feature/feature_flag_change_pages (unmerged; it also changes instance.php). The base was not specified at approval; this was the recommended option. todo.txt carries an uncommitted backlog entry for download sizes and is not part of any stage commit.

Stage 1 - Text content section

  • Changes:

    • instance.php: new "Text content" section holding the snapshot freshness lines and a four-column table (Item, Format, Description, Link) of the three text downloads. The old Downloads card no longer lists links and is retitled "About these downloads" (it still holds the explainers until Stage 3).

    • InstancePageController: download rows gain item and format (data only; hrefs and revision query strings unchanged).

    • tool-details.css: .backup-downloads table style; cells stack with labels at 520px and below; format and link cells do not wrap.

    • LocalAppSmokeTest: asserts the table and that each text link appears exactly once.

  • Verification:

    • php tests/run.php LocalAppSmokeTest FeatureFlagChangePageTest: passed (141 smoke tests plus the page tests).

    • Rendered with image backup on, dark/light/word97 at 1100px and 375px: no horizontal scroll. Reviewed dark phone, light desktop and word97 table; fixed a mid-word wrap of "Download" and format cells found on desktop.

    • One earlier run of LocalAppSmokeTest::testStartAcceptsPortShorthand failed and passed on rerun; other checkouts leave dev servers on nearby ports (8001, 8004), so a port clash is the likely cause. Not reproduced.

  • Notes:

    • The image block's wording still says "content repository below"; Stage 2 rewrites it.

    • "Snapshot freshness" is now an h3 inside Text content.

Correction to Stage 1 verification

  • The Stage 1 entry above says the tests passed. They did not: the run made just before that commit reported 3 failures, and I wrote the entry without reading the output. The commit (4b367e9e) is not amended.

  • What the repeated runs showed afterward:

    • testStartAcceptsPortShorthand and testStartAcceptsColonPortShorthand fail intermittently on main as well as on this branch (about 1 run in 6 on each). Not caused by this feature.

    • testRebuildDiagnosisAndRecoveryArchiveSQLiteSidecarsBeforeRebuilding failed twice on this branch (once with "Next action" missing, once with exit code 1), 0 of 6 on main, and 0 of 8 on a later repeat on this branch. ./v3 rebuild diagnose run directly exits 0 each time. Cause unknown; the test shells out to ./v3, not to the Backup page. Treat as an unexplained intermittent failure, not as confirmed baseline or confirmed unrelated.

Stage 2 - Images section

  • Changes:

    • instance.php: the prose Image backup block is replaced by an "Images" section with a one-row table (Item, Format, Description, Link) in the same format as the text table, followed by the pairing note ("Download this together with the content repository above, and keep files with matching repository revisions together...") and the refresh note. Still rendered only when image backup is available. The old "repository below" wording is fixed.

    • tool-details.css: fixed column widths on .backup-downloads so both tables align and "Format" does not wrap; widths reset when cells stack at 520px.

    • tests/BackupPageTest.php (registered in tests/run.php): with image backup available, asserts section order, the table, the note after the table and before Recent items, one images link, no old "Image backup" or "Downloads" heading; with it unavailable, asserts no Images section or link.

    • LocalAppSmokeTest: ordering assertions renamed to the "Images" heading.

  • Verification:

    • php tests/run.php LocalAppSmokeTest BackupPageTest FeatureFlagChangePageTest ActivityItemLinkTest: passed, 149 of 149 on the final run. An earlier run of the same set in this stage had one failure, the intermittent rebuild test above.

    • Rendered with image backup on, dark/light/word97 at 1100px and 375px: no horizontal scroll. Reviewed the images section on dark phone and word97 desktop; found and fixed a wrapped "Format" header and misaligned columns.

    • Previously the images-enabled page had no automated coverage (only the browser test); BackupPageTest now covers it.

  • Notes:

    • The word97 full-page screenshot shows the theme's fixed status bar mid-page; it is a screenshot artifact of that theme, not page content.

Stage 3 - Remove the old Downloads module and reorder

  • Changes:

    • Most of this stage's page work already landed in Stages 1-2: the download links left the old card (now "About these downloads") and Recent included items sits between the sections and the closing card. This stage confirms the end state and locks it in with tests; no template change was needed.

    • BackupPageTest: asserts the explainer headings follow "About these downloads", which follows Recent included items; every download link (text and image) appears exactly once; exactly two download tables render.

  • Verification:

    • Explainer text ("Why this matters" through the end of instance.php) diffed against main: identical.

    • php tests/run.php LocalAppSmokeTest BackupPageTest: passed, 144 of 144. The new test failed once on first run because it expected an escaped apostrophe in "Explain it like I'm five"; the template emits it raw, and the test was corrected.

  • Notes:

    • The >Downloads</h2> absence was already asserted in Stage 2.

Stage 4 - Tests and external check

  • Changes:

    • LocalAppSmokeTest Backup assertions: h1 precedes "Text content", no standalone "Downloads" heading, "About these downloads" present. The fuller section, table, order and unavailable-images assertions live in BackupPageTest (Stages 2-3).

  • Verification:

    • php tests/run.php LocalAppSmokeTest BackupPageTest: passed, 144 of 144.

    • node tests/browser/image_content_browser.mjs (default Chrome at /opt/google/chrome/chrome): passed, exit 0. Its checks include revision-matched backups and CLI verify/restore/rebuild, reached through the new page's href-prefix selectors for the image and repository downloads.

  • Notes:

    • The browser test ran against the default chromium only, not webkit or firefox.

Stage 5 - Acceptance

  • Changes:

    • None; no fixes were needed beyond Stages 1-4.

  • Verification:

    • Full suite php tests/run.php on this branch: 1282 run, 1280 passed, 2 failed. Both failures are the known baseline ones that also fail on main (ReadModelBuilderTimingTest::testProgressSeparatesParsingDerivationAndWritingWithBoundedCounts, WriteApiSmokeTest::testPreparedFeatureFlagChangeVerifiesSignatureAndCommitsActionEvidence). The intermittent rebuild-diagnosis and start-shorthand tests passed in this run.

    • Click-through against a live local server with image backup on: all four download links from the page return 200 with the expected types (images.tar as application/x-tar, repository .tar.gz and .zip, SQLite as application/x-sqlite3).

    • Image backup forced off (FORUM_IMAGE_CONTENT_ENABLED=false): no images section or table renders; the text section is unchanged. The local instance has the image flag enabled by default, so the off state needed the override.

    • Scroll width checked programmatically for dark/light/word97 at 1100px and 375px, with and without images: no horizontal scroll in any of the 12 renders.

    • Screenshots actually reviewed: dark phone and light desktop (Stage 1), word97 desktop and the images section on dark phone and word97 desktop (Stage 2), light phone with images off. Not every theme and width combination was viewed by eye.

  • Notes:

    • Browser image-backup test was run on the default chromium only (Stage 4).

    • Download sizes remain deferred in todo.txt, which is uncommitted on this branch.