Files
Kaj SchittecatandClaude Opus 5 a80a48988e touch: report a build from the device, and a QR that files a bug
Settings, About gains "Report this build": works or a problem, five tick
boxes for what you actually exercised, how long you have run it, an optional
line. It posts to the report service and lands on wadamesh.com/beta, which is
what the next promote is decided on. Ticking matters: "it works" from somebody
who watched it boot and "it works" from somebody who messaged on it all week
are not the same claim, and a board only goes green on two of the second kind.

"Report a bug" draws a QR for a prefilled GitHub issue form. The issue is filed
from the reporter's phone under their own account, so no write token has to
exist in a public firmware image and the reporter gets the replies.

"Count this device" is off by default. It lets the update check say which board
and version it is running, so a board with no reports can be told apart from a
board nobody owns. Those need opposite responses and nothing could tell them
apart before.

Mechanics: the POST rides the existing core-0 tile/update worker and its
WiFiClient/HTTPClient, like the version check, because a second pair on that
~8 KB stack overflows it. The device id is a salted SHA-256 of the public key
truncated to 64 bits, so a second report replaces the first without saying who
sent it. Sending is two taps and the second lists every field that leaves.
Prefs v64 appends report_ping + report_done_n at the tail, which the schema's
trailing static_assert now checks.

Also here: scripts/build/matrix-check.sh prints what testers reported for a tag,
and release.sh runs it before a --promote. It never blocks; a board nobody owns
can never go green. With no reports at all it now says so rather than reporting
a clean bill of health, which is the habit this is meant to replace.

Built on all eleven S3 envs and the T-Display P4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 11:29:20 +02:00

41 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Print what beta testers actually reported for a tag, from the report service
# (deploy/report-service.py). Read-only and side-effect free: release.sh calls it
# before a --promote, and you can run it on its own any time.
#
# scripts/build/matrix-check.sh beta_84
#
# It never fails a promote. A board nobody owns can never go green, and some
# promotes are made on other evidence; this exists so the promote is a decision
# rather than a habit.
TAG="${1:?usage: matrix-check.sh <tag>}"
command -v curl >/dev/null 2>&1 || exit 0
command -v python3 >/dev/null 2>&1 || exit 0
curl -fsS --max-time 8 "http://firmware.wadamesh.com/report/matrix.json?tag=$TAG" 2>/dev/null \
| python3 -c '
import json, sys
try:
d = json.load(sys.stdin)
except Exception:
sys.exit(0)
s = d.get("summary", {})
print("")
print("test matrix for %s: %d green, %d part-way, %d with a problem, %d silent (%d reports, %d devices)"
% (d.get("tag", "?"), s.get("green", 0), s.get("amber", 0), s.get("red", 0),
s.get("none", 0), s.get("reports", 0), s.get("devices", 0)))
for b in d.get("boards", []):
if b.get("status") in ("red", "amber") or (b.get("status") == "none" and b.get("devices")):
print(" %-22s %s (%d works, %d problems, %s running)"
% (b.get("board", "?"), b.get("status"), b.get("works", 0), b.get("issues", 0),
b.get("devices") or "?"))
if s.get("promote_ready"):
print("every board anyone is known to be running has been vouched for. wadamesh.com/beta")
elif not s.get("reports"):
print("NOBODY has reported on this build. wadamesh.com/beta")
else:
print("NOT vouched for: %s" % (", ".join(s.get("blocked_by", [])) or "no board is green yet"))
print("promoting anyway is a choice, not an error. wadamesh.com/beta")
print("")
'