Parent: #4531
Slice goal
From PublishingShell Logs, an operator downloads the currently filtered log list (CSV or equivalent text file) including the visible columns. Empty filter result downloads a header-only file, not an error.
Out of scope
Status site filter (sibling). Open log item in editor (sibling). Log purge (shipped).
Acceptance criteria
Change class
One vertical increment. Do not split layers.
H2 QA: perc-devctl qa-up → qa-health → TEST_CMS_URL → npm run test:surface → qa-down.
Leave unassigned. Do not add In Progress.
Co-Authored by Grok Build 1.0.40 using grok-4.7 with agent night-issue-prs-triage.
Parent: #4531
Slice goal
From PublishingShell Logs, an operator downloads the currently filtered log list (CSV or equivalent text file) including the visible columns. Empty filter result downloads a header-only file, not an error.
Out of scope
Status site filter (sibling). Open log item in editor (sibling). Log purge (shipped).
Acceptance criteria
Change class
One vertical increment. Do not split layers.
H2 QA: perc-devctl qa-up → qa-health → TEST_CMS_URL → npm run test:surface → qa-down.
Leave unassigned. Do not add In Progress.