chore(status): update public status history - #107
Conversation
tangletools
left a comment
There was a problem hiding this comment.
✅ Auto-approved GitHub Actions PR — 736d3d32
This PR was opened by trusted GitHub Actions automation.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.
This approval is provisional. It rests on the audit running. If the audit cannot run — for example the CLI bridge rejects it — this approval is dismissed rather than left standing, so an unrun check never reads as a passing one.
tangletools · auto-approval · reason: github_actions_author · 2026-08-25T20:32:33Z
tangletools
left a comment
There was a problem hiding this comment.
🟢 Value Audit — sound
| Verdict | sound |
| Coverage | 2 of 2 lenses (value, usefulness) |
| Concerns | 1 (1 weak-concern) |
| Heuristic | 0.0s |
| Duplication | 0.0s |
| Interrogation | 65.5s (2 bridge agents) |
| Total | 65.5s |
💰 Value — sound
Routine automated append of six-hour reachability samples (Aug 20-25, 4 checks/day/service across 6 services) to the status-page data file; data integrity verified against the PR base and the update flows through the repo's established reviewer-gated pipeline, so ship.
- What it does: Updates public/status/history.json from generatedAt 2026-08-20T06:28Z to 2026-08-25T18:28Z: appends 5 new days x 4 checks per service to each history array, completes the in-progress 2026-08-20 day (2->4 checks), and refreshes each service's
currentsnapshot. Notably the router service is now recorded as down (HTTP 200 but health body status != ok, per the jsonStatusField check in scripts/collec - Goals it achieves: Keeps the public status page (src/pages/status.astro imports this JSON at build time, line 3) current: fresh per-service uptime history, accurate current-state banner (router down), and generatedAt freshness. It is the data half of a self-hosted status system that needs no external uptime vendor.
- Assessment: Good on its merits. I diffed the merged file against the true base blob (e0d9a11): all 6 services present in identical order, zero dropped days within the 90-day window, zero mutated historical samples — only the in-progress day appended, exactly the merge semantics of scripts/collect-status.mjs:118-136. The scary-looking router-block deletion/re-add in the truncated diff is alignment noise; order
- Better / existing approach: none — this is the right approach. Alternatives are worse: client-side health fetches from the status page would leak internal endpoints, fight CORS, and lose history; an external status vendor adds a dependency the repo deliberately avoided. Committing the JSON is required because the Astro page imports it at build time for a static Cloudflare Pages deploy. Searched scripts/, .github/workflows/,
- Model: opencode/zai-coding-plan/glm-5.2
- Bridge attempts: 2
- Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error event without a message: {"type":"error","timestamp":1787691439449,"sessionID":"ses_fc5496c07ffesTKTpbeTMG2QZo","error":{"name":"UnknownError","data":{"message":"Unexpected server error. Check server logs for details.","ref":"err_3dafb2a5"}}}
🎯 Usefulness — sound
Routine automated data refresh in a closed, established pipeline: cron collector writes public/status/history.json, this PR lands it, and src/pages/status.astro bakes it into the /status page at build time.
- Integration: Fully wired and reachable. The file is imported at build time by src/pages/status.astro:3, which renders the /status table from services[].current (ok/httpStatus/latencyMs/checkedAt, href, name, domain at status.astro:36-52). Producer side is scripts/collect-status.mjs:4 (run via the collect-status.yml cron and publish-status-history.sh:105, which also enforces the PR-scope/build/review gates desc
- Fit with existing patterns: Matches the codebase's pattern exactly: data lives in public/ as a static asset, consumed via a build-time Astro import rather than a runtime fetch — same grain as the rest of the static site. No competing status mechanism exists (grep for history.json/collect-status found only this pipeline).
- Real-world viability: Holds up on non-happy paths. The diff itself carries a real error-path case: router reports ok:false, status:down with httpStatus:200 — the collector's JSON-body check (collect-status.mjs:92-94, jsonStatusField 'status' != 'ok') correctly flagging an unhealthy payload behind a 200; the page will render it red as 'Unavailable' (status.astro:43-44). Merge logic appended 2026-08-20's 2→4 checks witho
- Model: opencode/zai-coding-plan/glm-5.2
- Bridge attempts: 1
🎯 Usefulness Audit
🟡 Per-day history is accumulated but not yet rendered anywhere [problem-fit] ``
status.astro only reads services[].current; the per-day history entries (uptimePct, samples) that make up most of this diff's bytes have no renderer today (the page even disclaims 'not an incident history'). This is forward-looking data collection in a bounded 90-day window, not dead surface — but if no history view is planned, the samples arrays are payload weight in the repo for nothing. No action required to ship this data refresh.
What this audit checks
It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.
| Pass | What it asks |
|---|---|
| Heuristic | Vague title? Whitespace-only or cruft-bearing diff? (content signals only) |
| Duplication | Do added function/class names already exist elsewhere in the repo? |
| Value Audit | What does it do? What goal does it achieve? Is it good? Better architecture or already-exists? |
| Usefulness Audit | Does it integrate and fit? Will it hold up in real use and actually get used? |
Findings are concerns, not blocks — the human reviewer decides what to do with them.
✅ No Blockers —
|
| opencode GLM 5.2 | opencode DeepSeek v4 Pro | opencode DeepSeek v4 Flash | aggregate | |
|---|---|---|---|---|
| Readiness | 92 | 92 | 92 | 92 |
| Confidence | 65 | 65 | 65 | 65 |
| Correctness | 92 | 92 | 92 | 92 |
| Security | 92 | 92 | 92 | 92 |
| Testing | 92 | 92 | 92 | 92 |
| Architecture | 92 | 92 | 92 | 92 |
Reviewer score is advisory once the run is complete and the verdict has no blockers.
Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision. | Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision. | Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision.
🟡 LOW Router 'down' entries report HTTP 200, rendering a contradictory public signal — public/status/history.json
The router service is recorded ok:false/status:'down' with httpStatus:200 in current (line 1420) and across every down day 2026-08-13..08-25 (e.g. lines 1599, 1979, 2100). This is the collector's intended design: checkUrl https://router.tangle.tools/api/health passes HTTP 200 but the JSON body fails the jsonStatusField check (scripts/collect-status.mjs:32-34, 91-95), so ok=false while response.status=200. Consumer src/pages/status.astro:43-47 renders 'Unavailable' (red) in the same row as the literal HTTP '200', so a reader can misr
🟡 LOW Router reported 'down' with httpStatus 200 for 5 days (current + history) — public/status/history.json
The router service 'current' block records ok:false, status:'down', httpStatus:200, latencyMs:594 (line 1418/1420), and its history shows non-operational days 08-21 (degraded, ok=1/4) through 08-25 (down, ok=0/4), all with httpStatus:200. This is expected behavior of scripts/collect-status.mjs:78-95 (jsonStatusField 'status' / jsonStatusValue 'ok'), so a 200 whose JSON body has status != 'ok' is marked down, and no error field is recorded. Not a defect in this data commit, but the status page (status.astro:43-47) will render 'Unavailable' beside '200' for router, which is ambiguous to readers and indicates either a genuine 5-day router health degradation or a c
🟡 LOW Router service recorded down for 5 consecutive days (2026-08-21..2026-08-25) while incidents array stays empty — public/status/history.json
router history days 2026-08-22..2026-08-25 are status 'down' with ok 0 of 4 checks each, and current.ok=false at generatedAt 2026-08-25T18:28:34.791Z, with httpStatus 200 (health body status field != 'ok', per collect-status.mjs jsonStatusField check). This is accurate data, not a file defect, and status.astro will correctly render Router as 'Unavailable'. Flagging only so the merge of this automated PR is not read as benign: it publishes a live multi-day Router outage to the public status page. Fix: none needed in this file; resolve the router outage or add an incidents entry before/after merge if incident communication is desired.
tangletools · 2026-08-25T20:58:59Z · trace
tangletools
left a comment
There was a problem hiding this comment.
✅ Approved — 3 non-blocking findings — 736d3d32
Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision. | Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision. | Full multi-shot audit completed 1/1 planned shots over 1 changed files. Global verifier still owns final merge decision.
Full immutable report for this review: trace
Summary comment for this run: full summary
tangletools · 2026-08-25T20:58:59Z · immutable trace
tangletools
left a comment
There was a problem hiding this comment.
✅ Auto-approved GitHub Actions PR — 1728a541
This PR was opened by trusted GitHub Actions automation.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.
This approval is provisional. It rests on the audit running. If the audit cannot run — for example the CLI bridge rejects it — this approval is dismissed rather than left standing, so an unrun check never reads as a passing one.
tangletools · auto-approval · reason: github_actions_author · 2026-08-26T00:29:36Z
Automated six-hour service reachability update.
The workflow restricts this pull request to
public/status/history.json, builds the site before merging, and waits for the configured independent reviewer to approve the exact commit.