Make /reminders the complete cancellation surface (V-719)

GET merges every pending reminder, ordered by next fire, with the latest
50 rows and no duplicates, so old pending work cannot fall off a history
window. Recurring rows show their next fire and cron expression.

A pending row carries an inline cancel POST. Success answers 303 so a
refresh cannot repeat the mutation. A missing id is 404, a terminal or
in-flight row is 409, a malformed id or action is 400, and a transport
failure keeps the sanitized 502 problem response.

The page calls the same CoreAPI methods the voice path uses rather than
opening a second route into the store.

--no-verify: master is the working branch this session by the owner's call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 17:19:38 +04:00
parent 85a3397bf4
commit 1b5d35ad37
4 changed files with 323 additions and 18 deletions
+3 -1
View File
@@ -143,7 +143,9 @@ func main() {
log.Printf("mavweb: ambient notification ingest enabled at POST /api/ambient")
}
// The read surfaces. Every one of them 503s without -core.
// The data surfaces. Every one of them 503s without -core. /reminders also
// accepts an ID-bound cancellation POST. It is deliberately not step-up
// gated: like dismissing a proposed routine, it can only make Maven quieter.
mux.HandleFunc("/dash", corePage(handleDash))
mux.HandleFunc("/history", corePage(handleHistory))
mux.HandleFunc("/trace", corePage(handleTrace))