summaryrefslogtreecommitdiff
path: root/bin/gradle-report
AgeCommit message (Collapse)Author
2026-09-21gradle-report: a missing report is a failure, not a passClaude
The lint path was wrong -- AGP writes to app/build/reports/, not app/build/ -- and the script fell back to the gradle exit code, printing 'report: MISSING ... result: PASS'. A checker that cannot find what it is meant to check and passes anyway is precisely the failure these wrappers exist to prevent, and it hid real lint errors in Listen for one run. Now locates the report rather than assuming a path, and a missing report fails while saying the check did not actually inspect anything. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
2026-09-21gradle-report: name UP-TO-DATE as the cause of a stale reportClaude
Found by running it: detekt exited 0 while the report predated the run, because Gradle skipped the task. 'STALE' alone leaves the reader to work out why nothing changed, so it now says which task was skipped and how to force it, with --allow-stale to accept an older report deliberately. Same shape as gradle-test, which learned this first. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
2026-09-21Add gradle-report, android-ui and publish-apkClaude
Three more wrappers, each from a failure that actually happened while building Listen rather than an imagined one. gradle-report: detekt rejects an invalid config property before analysing anything, exits non-zero, and leaves the previous run's XML in place. That file was read as current findings three times in one session; the tell was line numbers that never moved after a refactor. It now names the rejected property and refuses any report older than the run. Both real shapes of the message are covered -- a misspelled property and structurally invalid YAML say different things. android-ui: a blind `input tap 400 300` landed in FeeDreader's alarm settings, and the screenshot taken immediately after was reported as Listen. Every command verifies the foreground package before acting, and taps resolve by label rather than coordinate. A label matching several elements refuses rather than taking the first -- in a list where every row has the same Play button, the first match is rarely the one meant. The node parsing is a separate file on purpose. The first version inlined it as python3 -c inside a bash case block and the nested quoting mangled the regexes silently: the dump reported one element and a tap landed somewhere else entirely. Shell-quoted parsers are their own trap. publish-apk: publishing is where a silent mistake costs most -- a stale published APK once sat for eight weeks and installing it threw a Room downgrade. It checks the host, proves the file is a real APK rather than an HTML error page, byte-compares what landed against what was tested, and confirms the server serves those same bytes. Test suite is 25 cases, still weighted toward the negative ones: a wrapper that only ever reports PASS is worse than no wrapper. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B