#rep0rter
2026-11-03
github2
09:23:15
*Verified failure — 2026-11-03 Asia/Taipei* Two consecutive natural Production reporting runs on the same deployed commit `05defc5ec2ffef416d05b70b54190e7d18ba28e6` failed at the collect/write/publish step: • Run 41473162554, completed November 2 at 23:52:25: <https://github.com/rep0rter/rep0rter/actions/runs/41473162554|https://github.com/rep0rter/rep0rter/actions/runs/41473162554> • Run 41545362827, completed November 3 at 07:43:07: <https://github.com/rep0rter/rep0rter/actions/runs/41545362827|https://github.com/rep0rter/rep0rter/actions/runs/41545362827> Both real archived logs retain `ValueError: Site generation exceeds storage budget`. The deployed-Worker verification and reporting-dependency installation steps succeeded. This localizes the observed terminal failure to generation-budget validation; it does not establish every collector failed, identify which file caused growth, or prove that an entire cycle published nothing. At this exact revision, `cloudflare/src/runner_transfer.py` defines MAX_TOTAL=160 MiB and MAX_SITE=128 MiB; validate() raises this specific error if either total payload or public site bytes exceed its threshold. The logs inspected do not distinguish those two conditions. No claim is made that increasing the threshold is safe. Three complete public health responses at 09:17–09:19 returned HTTP 200 / ready=true, but collection_healthy=false and last_error=GitHub reporting job failed. Endpoint responsiveness is NOT report-publication acceptance. This is separate from intermittent health-probe failures in <https://github.com/rep0rter/rep0rter/issues/68|#68> and from source catch-up accounting in <https://github.com/rep0rter/rep0rter/issues/6|#6>. *Next diagnostic and acceptance* Read-only, aggregate generation inventory: total/public bytes by artifact class, file count, current/replaced-generation ownership and the dominant growth class, without publishing source identifiers or contents. Review bounded generation/retention or publication design with regression tests preserving atomic publication, original failure visibility and storage safety. Do not blindly increase limits, trim production data, trigger replay, or deploy under this audit. After a separately approved repair, require a real next natural report to pass final publication and advance its success metadata; green health alone is insufficient. This audit made no production change or manual replay.
github2
09:23:15
*Verified failure — 2026-11-03 Asia/Taipei* Two consecutive natural Production reporting runs on the same deployed commit `05defc5ec2ffef416d05b70b54190e7d18ba28e6` failed at the collect/write/publish step: • Run 41473162554, completed November 2 at 23:52:25: <https://github.com/rep0rter/rep0rter/actions/runs/41473162554|https://github.com/rep0rter/rep0rter/actions/runs/41473162554> • Run 41545362827, completed November 3 at 07:43:07: <https://github.com/rep0rter/rep0rter/actions/runs/41545362827|https://github.com/rep0rter/rep0rter/actions/runs/41545362827> Both real archived logs retain `ValueError: Site generation exceeds storage budget`. The deployed-Worker verification and reporting-dependency installation steps succeeded. This localizes the observed terminal failure to generation-budget validation; it does not establish every collector failed, identify which file caused growth, or prove that an entire cycle published nothing. At this exact revision, `cloudflare/src/runner_transfer.py` defines MAX_TOTAL=160 MiB and MAX_SITE=128 MiB; validate() raises this specific error if either total payload or public site bytes exceed its threshold. The logs inspected do not distinguish those two conditions. No claim is made that increasing the threshold is safe. Three complete public health responses at 09:17–09:19 returned HTTP 200 / ready=true, but collection_healthy=false and last_error=GitHub reporting job failed. Endpoint responsiveness is NOT report-publication acceptance. This is separate from intermittent health-probe failures in <https://github.com/rep0rter/rep0rter/issues/68|#68> and from source catch-up accounting in <https://github.com/rep0rter/rep0rter/issues/6|#6>. *Next diagnostic and acceptance* Read-only, aggregate generation inventory: total/public bytes by artifact class, file count, current/replaced-generation ownership and the dominant growth class, without publishing source identifiers or contents. Review bounded generation/retention or publication design with regression tests preserving atomic publication, original failure visibility and storage safety. Do not blindly increase limits, trim production data, trigger replay, or deploy under this audit. After a separately approved repair, require a real next natural report to pass final publication and advance its success metadata; green health alone is insufficient. This audit made no production change or manual replay.
2026-11-06
github2
16:34:40
rep0rter's pages were noisy and inconsistent. Readers got slogans, eyebrow labels, a duplicate "Latest stories" card, repeated "View details / View source" links, and a 1440p layout that was only zoomed up. Publishing gave no feedback while it ran or after it finished, and errors looked like warnings. This PR is the result of a blind design-review hill climb, following the "Agents Sucked At UI" method. Each round, fresh reviewers scored three unlabelled sets: `main`, this branch, and reference civic-tech sites. I fixed only the specific problems they cited and recaptured every state before the next round. The owner's feedback overrode reviewers wherever they conflicted. *新版取代原版 (the new version replaces the original)* There is no switch: this interface replaces the old one for everyone. The temporary beta switch, the legacy variants, the `data-redesign` checks and the switch tests are all gone, and every style is merged into `style.css`. Main changes: • *One header on every page.* Reader, form, account and withdrawal pages share one opaque header with search, Write, Account, language and theme. On phones, the buttons have visible labels and 44px+ targets. • *Home.* A plain page title ("Civic tech community news"), a hashtag row and one _Filter & sort_ panel. The feed uses the full wide-screen width in rows with no empty columns. • *Story page.* • The story headline is the only `h1`; the generic "The story & its source" heading is gone. • The original report card stays full width and readable. • Revision chips sit beside the headline, and a superseded card is marked on the card itself. • *Forms (`/write`, `/submit`, `/projects`).* • While publishing, the button shows "Publishing…" with a spinner and the other actions are disabled. • Success shows a "your story is live" banner with next steps. • "Saved but feed refresh failed" has a real retry button. • Errors show a linked summary plus inline messages on the fields. • *Status colours mean one thing each.* Red is error, amber is warning, blue is information, green is success. Each has an icon, so meaning doesn't depend on colour alone. • *Filters and search.* • An invalid date range is explained next to the date fields, with a "Fix the dates" action. • Counts handle plurals correctly ("1 story found"). • Empty results offer an action that matches the cause ("Clear search"). • *Language switch.* An inline loading status that pushes content down rather than covering it, a failure message with retry, and localised dates. • *Image viewer and entrance.* The viewer opens larger and its error state has "Try again". The first-visit animation stays inside the logo slot, with the controls visible throughout. • *Real 1440p layout.* No page zoom: larger type and wider containers at ≥1700px and ≥2200px. • *Tooling.* • `docs/design-review/` holds the state inventory, both fixed briefs, scores and before/after images. • `scripts/design-review/` seeds a fictional four-language preview and captures all 57 states at 2560×1440 and 390×844. • `scripts/verify-interface.py` checks overflow, a single `h1`, search, filters and the viewer. *Not changed:* backend reporting logic, anonymity and withdrawal code, schedules, production services. Withdrawal still scrubs `<article id=…>`. `tests/test_interface_privacy.py` checks that story-identifying content stays inside the article on the new interface and that withdrawal scrubs every page. *擁有者意見 (Owner feedback)* The owner's feedback after looking at the screenshots, which took priority over every reviewer: > 畫面雜訊太多。不需要出現的東西就不要出現。 ("There is too much visual noise. Anything that doesn't need to be on screen shouldn't be.") How it was applied: • *Removed:* • Eyebrow labels. • Self-introducing notes, such as 「✓ 摘要、原文與參與線索一起閱讀」 ("✓ Read the summary, original and participation notes together"). • The duplicate 最新消息 / "Latest stories" card. • The home slogan block. • Repeated "View details", "View source", dates and counts. Each now appears once. • *Moved:* RSS, explanations and calculation methods went to the footer or a secondary menu. • *No 1440p zoom.* Wide screens get a real layout instead. • *No collapsing to simplify.* Content was removed or moved, never hidden behind a disclosure. • *Original excerpt.* It stays a full-width, readable card on story pages, not a thumbnail. Several reviewers kept asking to shrink it (their Information density scores reflect that); the owner's direction won. • *Functions kept, once each:* withdrawal, anonymity notices, and original/source links. • *Reviewer requests that conflicted with the owner and were declined:* • A home value statement (removed by the declutter). • A smaller report card. • English headlines for stories whose translation is still pending. Editorial policy keeps untranslated text out of the English edition. *Before / after* Left: `main`. Right: this branch. Each image shows desktop 2560×1440 (scaled) and the 390×844 phone view, from fictional preview data. <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en.jpg|home-en> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/story-en.jpg|story-en> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-zh-TW.jpg|home-zh-TW> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-dark.jpg|home-en-dark> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-submitting.jpg|write-submitting> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-error.jpg|write-error> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-filters-invalid-range.jpg|home-filters-invalid-range> More comparisons, also in `docs/design-review/before-after/`: • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-feed.jpg|home feed> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-footer.jpg|footer> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/story-superseded.jpg|superseded story> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-filled.jpg|write form> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/image-viewer.jpg|image viewer> *Scores* The full per-reviewer, per-criterion record is in <https://github.com/rep0rter/rep0rter/blob/ui-hill-climb/docs/design-review/scores.md|`docs/design-review/scores.md`>. Briefs were never edited. v1 and v2 scores are kept separately and not compared with each other. *Brief v1 (rounds 1–9, one Opus 5.5 reviewer per round, overall score 1–10)* | Round | Baseline (main) | New | Reference (Rest of World, The Markup, Semafor) | | ----- | --------------- | --- | ---------------------------------------------- | | 1 | 6 | 6 | 6 | | 2 | 5 | 7 | 7 | | 3 | 5 | 7 | 6 | | 4 | 5 | 8 | 7 | | 5 | 5 | 7 | 7 | | 6 | 6 | 8 |…![]()
github2
2026-11-06 17:52:09
github2
16:34:40
rep0rter's pages were noisy and inconsistent. Readers got slogans, eyebrow labels, a duplicate "Latest stories" card, repeated "View details / View source" links, and a 1440p layout that was only zoomed up. Publishing gave no feedback while it ran or after it finished, and errors looked like warnings. This PR is the result of a blind design-review hill climb, following the "Agents Sucked At UI" method. Each round, fresh reviewers scored three unlabelled sets: `main`, this branch, and reference civic-tech sites. I fixed only the specific problems they cited and recaptured every state before the next round. The owner's feedback overrode reviewers wherever they conflicted. *新版取代原版 (the new version replaces the original)* There is no switch: this interface replaces the old one for everyone. The temporary beta switch, the legacy variants, the `data-redesign` checks and the switch tests are all gone, and every style is merged into `style.css`. Main changes: • *One header on every page.* Reader, form, account and withdrawal pages share one opaque header with search, Write, Account, language and theme. On phones, the buttons have visible labels and 44px+ targets. • *Home.* A plain page title ("Civic tech community news"), a hashtag row and one _Filter & sort_ panel. The feed uses the full wide-screen width in rows with no empty columns. • *Story page.* • The story headline is the only `h1`; the generic "The story & its source" heading is gone. • The original report card stays full width and readable. • Revision chips sit beside the headline, and a superseded card is marked on the card itself. • *Forms (`/write`, `/submit`, `/projects`).* • While publishing, the button shows "Publishing…" with a spinner and the other actions are disabled. • Success shows a "your story is live" banner with next steps. • "Saved but feed refresh failed" has a real retry button. • Errors show a linked summary plus inline messages on the fields. • *Status colours mean one thing each.* Red is error, amber is warning, blue is information, green is success. Each has an icon, so meaning doesn't depend on colour alone. • *Filters and search.* • An invalid date range is explained next to the date fields, with a "Fix the dates" action. • Counts handle plurals correctly ("1 story found"). • Empty results offer an action that matches the cause ("Clear search"). • *Language switch.* An inline loading status that pushes content down rather than covering it, a failure message with retry, and localised dates. • *Image viewer and entrance.* The viewer opens larger and its error state has "Try again". The first-visit animation stays inside the logo slot, with the controls visible throughout. • *Real 1440p layout.* No page zoom: larger type and wider containers at ≥1700px and ≥2200px. • *Tooling.* • `docs/design-review/` holds the state inventory, both fixed briefs, scores and before/after images. • `scripts/design-review/` seeds a fictional four-language preview and captures all 57 states at 2560×1440 and 390×844. • `scripts/verify-interface.py` checks overflow, a single `h1`, search, filters and the viewer. *Not changed:* backend reporting logic, anonymity and withdrawal code, schedules, production services. Withdrawal still scrubs `<article id=…>`. `tests/test_interface_privacy.py` checks that story-identifying content stays inside the article on the new interface and that withdrawal scrubs every page. *擁有者意見 (Owner feedback)* The owner's feedback after looking at the screenshots, which took priority over every reviewer: > 畫面雜訊太多。不需要出現的東西就不要出現。 ("There is too much visual noise. Anything that doesn't need to be on screen shouldn't be.") How it was applied: • *Removed:* • Eyebrow labels. • Self-introducing notes, such as 「✓ 摘要、原文與參與線索一起閱讀」 ("✓ Read the summary, original and participation notes together"). • The duplicate 最新消息 / "Latest stories" card. • The home slogan block. • Repeated "View details", "View source", dates and counts. Each now appears once. • *Moved:* RSS, explanations and calculation methods went to the footer or a secondary menu. • *No 1440p zoom.* Wide screens get a real layout instead. • *No collapsing to simplify.* Content was removed or moved, never hidden behind a disclosure. • *Original excerpt.* It stays a full-width, readable card on story pages, not a thumbnail. Several reviewers kept asking to shrink it (their Information density scores reflect that); the owner's direction won. • *Functions kept, once each:* withdrawal, anonymity notices, and original/source links. • *Reviewer requests that conflicted with the owner and were declined:* • A home value statement (removed by the declutter). • A smaller report card. • English headlines for stories whose translation is still pending. Editorial policy keeps untranslated text out of the English edition. *Before / after* Left: `main`. Right: this branch. Each image shows desktop 2560×1440 (scaled) and the 390×844 phone view, from fictional preview data. <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en.jpg|home-en> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/story-en.jpg|story-en> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-zh-TW.jpg|home-zh-TW> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-dark.jpg|home-en-dark> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-submitting.jpg|write-submitting> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-error.jpg|write-error> <https://raw.githubusercontent.com/rep0rter/rep0rter/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-filters-invalid-range.jpg|home-filters-invalid-range> More comparisons, also in `docs/design-review/before-after/`: • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-feed.jpg|home feed> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/home-en-footer.jpg|footer> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/story-superseded.jpg|superseded story> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/write-filled.jpg|write form> • <https://github.com/rep0rter/rep0rter/blob/d3971348fbca5842d3c59df2eded0c57b6577e74/docs/design-review/before-after/image-viewer.jpg|image viewer> *Scores* The full per-reviewer, per-criterion record is in <https://github.com/rep0rter/rep0rter/blob/ui-hill-climb/docs/design-review/scores.md|`docs/design-review/scores.md`>. Briefs were never edited. v1 and v2 scores are kept separately and not compared with each other. *Brief v1 (rounds 1–9, one Opus 5.5 reviewer per round, overall score 1–10)* | Round | Baseline (main) | New | Reference (Rest of World, The Markup, Semafor) | | ----- | --------------- | --- | ---------------------------------------------- | | 1 | 6 | 6 | 6 | | 2 | 5 | 7 | 7 | | 3 | 5 | 7 | 6 | | 4 | 5 | 8 | 7 | | 5 | 5 | 7 | 7 | | 6 | 6 | 8 |…![]()
github2
2026-11-06 17:52:09
2026-11-07
github2
23:22:03
rep0rter currently depends on Cloudflare durable storage and a GitHub reporting runner while its AI requests are failing. Prepare migration to native sky-server services using the existing AI gateway, with complete database/outbox preservation and an explicit single-scheduler cutover. Adds a CI-gated host deployment controller, systemd runtime, private host health metadata, an authenticated-encryption snapshot workflow, and a migration/rollback runbook. Existing Cloudflare production remains authoritative until the verified cutover; Singa stays stopped. Validation: 1,257 offline tests and 36 subtests passed, including deployment gating, read-only health privacy, authenticated encryption, and unsafe archive rejection. Live gateway catalog and synthetic sky-fast inference succeeded from the destination host. Created with gpt-6.1-sol in T3 Code through the Codex harness.
github2
2026-11-07 23:26:59
github2
23:22:03
rep0rter currently depends on Cloudflare durable storage and a GitHub reporting runner while its AI requests are failing. Prepare migration to native sky-server services using the existing AI gateway, with complete database/outbox preservation and an explicit single-scheduler cutover. Adds a CI-gated host deployment controller, systemd runtime, private host health metadata, an authenticated-encryption snapshot workflow, and a migration/rollback runbook. Existing Cloudflare production remains authoritative until the verified cutover; Singa stays stopped. Validation: 1,257 offline tests and 36 subtests passed, including deployment gating, read-only health privacy, authenticated encryption, and unsafe archive rejection. Live gateway catalog and synthetic sky-fast inference succeeded from the destination host. Created with gpt-6.1-sol in T3 Code through the Codex harness.
github2
2026-11-07 23:26:59
github2
23:28:35
The migration snapshot preflight received Cloudflare HTTP 403 because urllib sent its default user agent. Use the same explicit runner user agent and no-cache header as the existing reporting health check so the encrypted export can reach the engine. Also preserve the reporting workflow’s additional Code for Japan feed in the exported host configuration. Validation: 28 host-migration and GitHub-runner tests passed; confirmed that the production health endpoint accepts the runner user agent and rejects default urllib requests.
github2
2026-11-07 23:32:25
github2
23:28:35
The migration snapshot preflight received Cloudflare HTTP 403 because urllib sent its default user agent. Use the same explicit runner user agent and no-cache header as the existing reporting health check so the encrypted export can reach the engine. Also preserve the reporting workflow’s additional Code for Japan feed in the exported host configuration. Validation: 28 host-migration and GitHub-runner tests passed; confirmed that the production health endpoint accepts the runner user agent and rejects default urllib requests.
github2
2026-11-07 23:32:25
github2
23:35:52
SQLite snapshot inventory opened WAL-mode databases in the normal writable mode, creating empty transient WAL/SHM files. Those files could disappear after the manifest was hashed and before encryption, making an otherwise intact snapshot fail import verification. Inspect the complete transferred database using an immutable read-only connection and explicitly close it. This keeps inventory free of filesystem side effects. A regression test uses a real WAL-mode database and verifies all files remain byte-for-byte unchanged. Validation: 29 host migration and GitHub runner tests passed. The failed real export’s database and all persistent assets matched their hashes; only the two transient SQLite files were missing. Production cutover remains paused until a new export passes verification.
github2
2026-11-07 23:40:26
github2
23:35:52
SQLite snapshot inventory opened WAL-mode databases in the normal writable mode, creating empty transient WAL/SHM files. Those files could disappear after the manifest was hashed and before encryption, making an otherwise intact snapshot fail import verification. Inspect the complete transferred database using an immutable read-only connection and explicitly close it. This keeps inventory free of filesystem side effects. A regression test uses a real WAL-mode database and verifies all files remain byte-for-byte unchanged. Validation: 29 host migration and GitHub runner tests passed. The failed real export’s database and all persistent assets matched their hashes; only the two transient SQLite files were missing. Production cutover remains paused until a new export passes verification.
github2
2026-11-07 23:40:26
github2
23:52:11
Production now serves rep0rter natively on sky-server through the existing Cloudflare Tunnel. Update the deployment instructions and recovery boundaries so future changes use the tested native controller and keep both retired publishers disabled. The first real native reporting cycle exited successfully with 236 collected records, three repaired translations and three confirmed pending Telegram deliveries. Slack historical catch-up remains incomplete. Report this as `Collection incomplete` in host health instead of calling the completed process a reporting failure; keep upstream error text private. Validation: seven host migration tests passed, including health error privacy and collection degradation. Public checks passed for all four language homepages and RSS feeds, three permanent articles and their images, sitemap and Google OAuth initiation. Complete snapshot hashes/table inventories and a no-network backup restore rehearsal passed. Threads’ existing token is invalid and cannot be refreshed; its durable pending and ambiguous jobs are preserved.
github2
2026-11-07 23:58:15
github2
23:52:11
Production now serves rep0rter natively on sky-server through the existing Cloudflare Tunnel. Update the deployment instructions and recovery boundaries so future changes use the tested native controller and keep both retired publishers disabled. The first real native reporting cycle exited successfully with 236 collected records, three repaired translations and three confirmed pending Telegram deliveries. Slack historical catch-up remains incomplete. Report this as `Collection incomplete` in host health instead of calling the completed process a reporting failure; keep upstream error text private. Validation: seven host migration tests passed, including health error privacy and collection degradation. Public checks passed for all four language homepages and RSS feeds, three permanent articles and their images, sitemap and Google OAuth initiation. Complete snapshot hashes/table inventories and a no-network backup restore rehearsal passed. Threads’ existing token is invalid and cannot be refreshed; its durable pending and ambiguous jobs are preserved.
github2
2026-11-07 23:58:15
2026-11-08
github2
17:51:43
Adjust native health checks so completed degraded collection cycles and historical interrupted runs remain visible without being misclassified as current process failures. Preserve historical clock-skew evidence while alerting only on recent anomalies. Add regression coverage.
github2
2026-11-08 17:55:22
github2
17:51:43
Adjust native health checks so completed degraded collection cycles and historical interrupted runs remain visible without being misclassified as current process failures. Preserve historical clock-skew evidence while alerting only on recent anomalies. Add regression coverage.
github2
2026-11-08 17:55:22
2026-11-12
github2
17:10:39
本 issue 彙整 2026-11-12 的四模型獨立服務評估,作為後續改善的共同清單。包含 UI/UX、主要流程、資料可信度與可維護性;本次只做評估,沒有修改或部署產品。 服務入口:<https://rep0rter.observe.tw|https://rep0rter.observe.tw> 分數是各評審在已觀察範圍內的主觀判斷,並非校準過的 benchmark。各模型獨立檢查同一份服務清單,但瀏覽時間、語系、頁面與證據深度可能不同;*保留分歧,不以平均分掩蓋限制*。未登入、沒有故障注入,不能視為完整測試登入後流程或可靠性認證。checkout SHA 不等於 production SHA。 DOM 節點尺寸、字級、對比與未命名元素數屬初步篩檢,尚需檢查實際背景、可及名稱演算法、命中熱區/間距例外及語意上下文,不能直接當作 WCAG 認證結論。各報告的頁面效能數字可能是未壓縮 HTML 大小,不等於實際網路傳輸量。任何故障模擬只應在隔離環境執行。 *各模型結論* | 模型 | 整體評分 | 最先建議處理 | 證據範圍 | | ---------------- | ---- | --------------------------------------------------------------------------- | -------------------------------------------------------- | | Claude Fable 5.2 | 6.0 | P1 無意義字串標題(文件代碼、單字)通過發布閘門並置頂;/healthz 回報 collection_healthy=false 但網站無任何提示。 | browser(desktop+mobile, screenshot)+public-health+source | | GPT-6 Astra | 6 | P1 首頁頭條是無語意識別字串 | preview-desktop-mobile+source | | GPT-6.1 Sol | 6 | P1 首頁首卡標題與摘要是不可讀識別字 | public-browser-desktop-mobile-and-source | | Claude Opus 5.5 | 6.5 | P1 首頁最新頭條標題與摘要皆為不可讀 ID「Skn-_K-RGx」,缺發布品質閘門;首頁無分頁長達 94k–157k px | high | *整併覆核與判讀限制* 父 agent 已獨立覆核英文首頁,確認首則標題與摘要均為無語意代碼。另已由公開 /healthz 取得 source_commit=3e757245874b7dcbe38e3df4326245fdab35fea7,與現行原生主機 release 一致;collection_healthy=false。該 release 的 AGENTS.md 明確指定原生部署與 docs/sky-server.md,Workers 已是保留的 recovery copy。因此前三位評審的『Workers 與本機角色衝突』來自過時 checkout,不是現行部署架構未定。 *既有追蹤* 以下項目沿用既有 issue,避免把已知故障再開成另一份修復單: • <https://github.com/rep0rter/rep0rter/issues/69|Natural reporting publication fails generation storage-budget validation> • <https://github.com/rep0rter/rep0rter/issues/68|Intermittent health endpoint failure: HTTP 500 after earlier timeout> • <https://github.com/rep0rter/rep0rter/issues/2|[P1] 重設選題入場條件與互動權重:7 篇逐則審核及 52 則事件離線模擬> *四份獨立評估* 每份包含保留優點、問題與證據、影響、建議及驗收條件。原始碼推論及未驗證範圍依各報告註記;本機截圖沒有額外公開上傳。 Claude Fable 5.2 完整評估 *reporter|rep0rter <http://rep0rter.observe.tw|rep0rter.observe.tw> 服務評估* > 評審模型:Claude Fable 5.2(claude-fable-5-2)獨立評估|檢查時間:2026-11-12 約 16:35–17:05(UTC+8)|方法:T3 preview 無痕分頁實際瀏覽(桌機 1440×900、手機 390×844)+公開端點低頻唯讀請求+repo 文件/程式碼閱讀。未登入、未觸發寫入/爬取/LLM。分數為主觀判斷,不是 benchmark。「已驗證」=本次實際觀察;「推論」=由程式碼或文件推得、未在線上重現。 *1. 定位與檢查範圍* • 定位:每小時閱讀公民科技社群的公開協作空間(Slack 公開封存、GitHub、RSS 等),由 LLM 寫成四語短訊,發布到網站、RSS、Telegram。 • 實際瀏覽:`<https://rep0rter.observe.tw/`(瀏覽器語系為英文時自動帶> `?lang=EN`;桌機+手機)與 `?lang=ZH`(手機,含截圖檢視);唯讀檢查 `/healthz`、`/feed.xml`、404。 • 部署/checkout 差異:*線上回報的 source commit 為 `3e75724`(2026-11-08),本機開發 checkout 為 `05defc5`(2026-10-23),checkout 落後*;checkout 內的 `AGENTS.md` 仍寫「正式環境在 Cloudflare Workers」,而線上 release 的 `AGENTS.md` 與 `/healthz` 都指出已改在本主機原生執行。本報告以線上觀察為準,行號僅作線索。 • 限制:未登入;撰寫/投稿/帳號流程未操作;Telegram、Threads 發布未評估。 *2. 評分* | 面向 | 分數 | 理由 | | -------- | ----- | -------------------------------------------------- | | *整體* | *6.0* | 視覺與來源卡片做得好,但內容品質閘門漏接明顯壞稿、收集狀態不健康且對讀者不可見、首頁是單一巨型頁面。 | | UI/UX | 7 | 卡片式版面清爽,手機頂列 44px 圖示鈕、有 skip link;每卡附來源摘錄圖。 | | 主要任務 | 6 | 「掃一眼社群動態」可行;但 287 則全在一頁、沒有分頁。 | | 手機/可及性 | 7 | 目標尺寸良好、0 對比問題;頁面高度 15 萬 px 以上。 | | 資料信任/新鮮度 | 4.5 | 見 P1-1、P1-2。 | | 可維護性 | 6.5 | 有離線測試、編輯政策文件與受控發版;但開發 checkout 與線上落後且文件互相矛盾。 | *3. 值得保留的優點* 1. *每則報導都能回到原文*:卡片附作者、頻道、原文時間與「查看來源」,並有修訂鏈(「這篇報導已有後續修訂」)。 2. *四語內容與明確的語言切換*:英文、繁中、日文、韓文皆可切換,未翻譯時顯示待譯提示而不混用。 3. *`/healthz` 資訊量足*:公開回報 `collection_healthy`、`last_error`、排程方式與 source commit,方便外部監控。 *4. 最重要的問題* *P1-1 明顯壞稿通過發布閘門並置頂(已驗證)* • 證據:2026-11-12 首頁第一則(中英文皆同)標題與摘要都是一串文件代碼「Skn-_K-RGx」;287 則中另有「Attribution」「themselves」「Security」「Agenda」(×2)等單字標題。另有多則低資訊量稿件(例如只是感謝大家上線)。 • 影響:首屏第一則就是無意義字串,直接傷害「AI 記者」的可信度;RSS 與 Telegram 訂閱者同步收到。 • 建議:發布前加硬性檢查——標題須含至少一個完整詞句、不得等於摘要、不得為純代碼/單一英文字;原文只有連結或附件標題時不成稿;低於資訊量門檻的訊息合併為日摘要。線索:`rep0rter/writer_contract.py`(`text_errors`)、`rep0rter/slack_text.py`(`rule_headline`)。 • 驗收:以現有 287 則回放,上述 6 則全部被擋下;新增對應的離線測試案例。 *P1-2 收集狀態不健康,但網站上看不出來(已驗證)* • 證據:`GET /healthz` 回 `"collection_healthy": false, "last_error": "Collection incomplete"`,同時 `"ready": true`;首頁沒有任何資料狀態提示。 • 影響:部分來源可能缺漏,讀者與維護者都無從得知哪些來源沒抓到。 • 建議:頁尾顯示「最近一次完整收集時間/目前缺漏來源數」;healthz 增加缺漏來源清單(不含私密資訊);外部監控以 `collection_healthy` 告警。 • 驗收:收集不完整時頁面可見提示;狀態儀表板對此欄位有檢查。 *P2-1 首頁是 95 萬位元組、287 張卡片的單一頁面(已驗證)* • 證據:HTML 954 KB;DOM 9,128 節點;556 張圖;手機頁高 156,858px;269 個 `nav` 元素(每張卡片各自一個)。 • 影響:手機載入與捲動成本高;螢幕閱讀器的地標清單被 269 個導覽淹沒。 • 建議:首頁只輸出最近 7 天(或 50 則),其餘改「載入更多」/月份封存頁;卡片內的標籤列改用 `ul`,不要用 `nav`。 • 驗收:首頁 HTML ≤ 250 KB、`nav` 地標 ≤ 5 個;舊內容仍可由封存頁與搜尋取得。 *P2-2 `?lang=ZH` 的伺服器回應仍是英文頁(已驗證)* • 證據:以非瀏覽器請求 `index.html?lang=ZH`,回傳 `<html lang="en">` 與英文標題;瀏覽器中是載入後才由前端換成中文。 • 影響:搜尋引擎、社群預覽與停用 JS 的讀者拿到英文;中文使用者會先看到英文再跳轉。 • 建議:語言連結直接指向既有的靜態中文版(文件提到的 `index.zh-TW.html`),或由伺服器依參數回對應語言。 • 驗收:`curl` 取得的中文網址其 `lang` 與 `<title>` 為中文。 *P3-1 過期活動被當成當日消息、作者篩選出現佔位字串(已驗證)* • 證據:11/12 分組中有一則描述「10/3 舉行工作坊」的稿件(原文發布於 10/3);作者下拉選單含 RSS 來源的 `noreply@…(代號)` 佔位字串;404 頁為框架預設英文頁。 • 影響:讀者可能誤以為活動尚未舉行;篩選清單不專業。 • 建議:活動日期已過者不成稿或標示「已結束」;作者名稱過濾掉 email 佔位;提供含導覽的 404。 • 驗收:回放不再產生過期活動稿;作者清單無 email 形式字串。 *5. 下一輪 hill climb 建議* *適合,且值得優先。第一個工作包:「發布品質閘門」*——以現有稿件做回放測試集,補上標題/摘要有效性與過期活動檢查,同時把 `collection_healthy` 接到頁尾與監控。開始前先把開發 checkout 更新到線上 commit,避免在舊程式上修改。 GPT-6 Astra 完整評估 *reporter — GPT-6 Astra 獨立評估* 檢查時間:2026-11-12 16:34–16:44 Asia/Taipei。實際模型:gpt-6-astra(medium)。 *定位與範圍* 多語公民科技社群新聞摘要與來源追溯。 匿名英語首頁 1440/390、模板及部署文件;沒有寫稿或登入。文件稱 Workers 正式部署,本機仍有 web service,路由歸屬待父 agent 核對。 本機 checkout:`05defc5ec2ffef416d05b70b54190e7d18ba28e6`。只作原始碼參考,未核對為 production SHA;以下將公開瀏覽、文件與推論分開。未登入、未寫入產品、未執行爬取或 inference;沒有測試完整帳號流程、螢幕閱讀器、離線或故障注入。 *評分* 整體 *6/10*,為本次證據範圍內的主觀評審,非 benchmark。高分反映可閱讀性、來源說明與任務入口;扣分集中在下列可重現摩擦或信任邊界。受限範圍不外推成完整產品分數。 | 面向 | 分數 | | -------- | ---- | | UI/UX | 8/10 | | 主要任務 | 6/10 | | 手機/可及性 | 7/10 | | 資料信任/新鮮度 | 4/10 | | 可維護性 | 7/10 | *值得保留* • 每則列原始發文日期與 View source。 • 修訂稿有明確 superseded 與最新版本連結。 *優先問題* *1. P1 — 首頁頭條是無語意識別字串* • 證據:<https://rep0rter.observe.tw/index.html?lang=EN%E3%80%82|https://rep0rter.observe.tw/index.html?lang=EN。> • 狀態:已驗證;生成原因未驗證。 • 影響:第一則標題與摘要均為 Skn-_K-RGx,無法當成新聞閱讀,損害自動編輯可信度。 • 建議:加入最小內容品質檢查;無法產生有效敘述時保留來源但不作頭條。 • 驗收:代碼、空摘要及標題全文重複的低資訊稿不再被置為頭條;有可讀說明。 *2. P2 — 報導日期與舊活動日期的落差需要更明顯提示* • 證據:<https://rep0rter.observe.tw/index.html?lang=EN%E3%80%82|https://rep0rter.observe.tw/index.html?lang=EN。> • 狀態:已驗證日期與文案。 • 影響:11/12 分組內含 10/3 活動,雖有原始日期,仍容易被看成近期可參加活動。 • 建議:區分新報導/回顧/已結束活動,避免過去活動使用現在式導語。 • 驗收:過去活動在卡片標示已結束或回顧,報導時間與活動時間分開。 *3. P2 — 部署文件與本機服務盤點不一致* • 證據:README.md:73;AGENTS.md:3。 • 狀態:文件及服務存在已驗證;正式路由未驗證。 • 影響:父 agent 若按清單操作可能評錯版本或發佈來源。 • 建議:建立現行來源、靜態生成者與本機角色的單一部署說明。 • 驗收:能以不含私密資訊的版本標記核對公開網站與發佈者,舊部署明確標為備援。 *下一輪建議* 先核對部署/整合契約,再決定是否啟動 hill climb。 第一個工作包:首頁頭條是無語意識別字串;以本報告第一項驗收條件作為結束標準。本次未啟動任何修復。 GPT-6.1 Sol 完整評估 *reporter:GPT-6.1 Sol 獨立評估* 評審實際執行模型:gpt-6.1-sol。檢查日期:2026-11-12(Asia/Taipei),主要公開瀏覽約 16:39–16:46。這是主觀產品評估,不是 benchmark。 *服務與證據範圍* 公民科技社群消息摘要與來源閱讀。 公開首頁 EN、繁體中文首頁與 /posts/312/index.html?lang=ZH,1440×900、390×844;AGENTS、docs/cloudflare.md、presentation.py 與 index/report-card 範本。文件稱 Cloudflare Workers 正式部署,盤點仍見本機 web service;本次未推定兩者對應同一 release。 本次閱讀 checkout:05defc5。checkout 與實際 serving release 未比對,不將程式碼推論聲稱為已上線行為。已讀適用 AGENTS.md;未找到專案指引的 repo 依任務 brief 執行。除明列的瀏覽/唯讀檢查外,登入後功能、寫入、付費流程、背景工作成功率、完整鍵盤與讀屏測試皆未執行,不能由首頁正常推定通過。 *評分* 整體 *6/10*。功能定位與來源說明已有基礎,以下缺口限制首次使用或資訊可信度。 N/A 表示不適用或缺乏證據,沒有因此扣 UI 分。 | 面向 | 分數 | | -------- | -- | | UI/UX | 8 | | 主要任務 | 6 | | 手機/可及性 | 8 | | 資料信任/新鮮度 | 5 | | 可維護性 | 7 | *值得保留* • 卡片可回原始來源,撤回/修訂消息有明確標記。 • 手機導覽與閱讀卡片排版清楚,沒有水平溢出。 • 翻譯缺漏以 pending 明示;部署文件有 lease 與持久化邊界。 *優先問題* *1. P1 — 首頁首卡標題與摘要是不可讀識別字* • 證據:<https://rep0rter.observe.tw/posts/312/index.html?l…
github2
19:03:33
The UI hill climb in <https://github.com/rep0rter/rep0rter/pull/70|#70> ended with a few known rough edges. On phones, the image viewer left big empty bands around landscape images. Meta text and chips were too small on desktop, and the presentation had 9–11px labels. Forms, story pages and sign-in used only half of a 2560-wide screen. `/projects` gave no hint when you had no projects. A superseded story's image didn't say it was out of date. Sparse search days left half-empty rows. On phones, the date-range error sat far from the date fields. This PR fixes those and two preview-fixture mistakes. It leaves alone the items the owner chose to keep: the report card repeating the headline and summary, the pending English headline, no value statement on the home page, and the language bar pushing content down. Each sheet shows *before (main)* on top and *after* below, at 2560 / 1440 / 390. 1. *Phone image viewer.* It is now a bottom sheet sized to the card, so there are no empty bands. Actions stay within thumb reach, and the error state also fits its content. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/image-viewer.jpg?raw=true|image-viewer> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/image-viewer-error.jpg?raw=true|image-viewer-error> 2. *Small type.* At 1100–1699px, meta, chips and counts are at least 14px. At 1700px they are 17px, and at 2200px they are 19px. Presentation text that was 9–11px is now 12–14px (`ppt.css` kicker, community index, demo label, browser bar, controls, phone overrides). <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/home-en.jpg?raw=true|home-en> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/presentation-start.jpg?raw=true|presentation-start> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/presentation-demo.jpg?raw=true|presentation-demo> 3. *2560 canvas.* At 2200px and up: • Story pages use the full content width, with the report card beside the text. • Account forms get a sticky left rail for the title and links, with the form beside it. • The sign-in card is larger and vertically centred. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/story-en.jpg?raw=true|story-en> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/write-empty.jpg?raw=true|write-empty> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/sign-in-page.jpg?raw=true|sign-in-page> 4. *`projects-empty`.* A "Your projects" block now says there are no projects yet, explains project news, and has a *Set up project news* button that jumps to the form. It uses the existing `no_projects` copy, which is already in all four languages. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/projects-empty.jpg?raw=true|projects-empty> 5. *Superseded story.* A warning band reading "Previous report (superseded)" now sits directly above the report image without covering it, and the image is dimmed. The same band also appears inside the image viewer. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/story-superseded.jpg?raw=true|story-superseded> 6. *Search grouping.* Search and filter results fill the feed width, in line with the day dividers and filter bar, so sparse days no longer leave the right side empty. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/home-search-results.jpg?raw=true|home-search-results> 7. *Phone date range.* The invalid-range error now sits directly under From/To, before the other filters. <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/home-filters-invalid-range.jpg?raw=true|home-filters-invalid-range> 8. *Fixture only (`scripts/design-review/preview.py`; production data untouched).* The seed text now uses `#air-quality`, so the hashtag list no longer shows both `#air-quality` and `#airquality`. The seeded self-reported story now uses the same source as `/write`, so it and write-success both show "Community submissions". <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/tag-timeline.jpg?raw=true|tag-timeline> <https://github.com/rep0rter/rep0rter/blob/a0e0b28abf8607779a08dfc9e08852f8e32e7a21/docs/design-review/residual-fixes/write-success.jpg?raw=true|write-success> Tooling: `capture.py --laptop` (or `LAPTOP=1 round.sh`) adds an optional 1440×900 capture for before/after comparisons. Blind sets keep 2560 and 390. *Blind check.* One new reviewer (Opus 5.5, high effort) scored brief v2, unchanged, against main and the reference sites. No criterion went down. Spacing, consistency, density, navigation, states, responsive and copy each went up by one; the other five were unchanged. Scores are in `docs/design-review/scores.md`. The reviewer's top problems for main were the items fixed here. *Tests.* `pytest`: 1247 passed. Five card tests were deselected because they need Noto Sans CJK, which this host doesn't have; CI installs it. Not changed: the reporting backend, anything affecting anonymity, scheduling, and production. Created with Claude Opus 5.5 in Claude Code (T3 Code); blind review by Claude Opus 5.5. :robot_face: Generated with <https://claude.com/claude-code|Claude Code>