Commit Graph

3 Commits

Author SHA1 Message Date
claude 35c6ff5a71 Make delivery and integration failures explicit
Persist reminder presentations and retry state, atomically complete collapsed deliveries, fall back across away reaches, and block permanent failures visibly (V-715, V-678). Fail closed when enabled integrations lack credentials and keep remote arms explicitly dark (V-691). Give mavweb one sanitized, request-correlated error contract (V-689). Owner explicitly requested direct commits to master.
2026-08-13 02:50:59 +04:00
claude 07f7550931 /events and /morning read the clock on his wall (V-612)
Three defects on the server-rendered pages.

/events printed both timestamps in whatever zone the value arrived in.
NoticedAt is the bus's local instant; OccurredAt is the store's UTC, or a
pubDate internal/rss parsed to UTC. So one row carried two zones and a feed
item read hours older than it was, on a page whose hint tells him that column
gap is real.

/morning printed a plan item's At raw. It is a calendar fact's Ts or a
reminder's FireTs, both UTC out of the store, so the same reminder named a
different hour here than on /reminders — which does call Local, since V-469.

promoteCandidate read the importance select inside `if due != nil`.
Confirming a candidate as "срочно" with no deadline threw the word away and
the row came back normal with nothing saying why.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 04:23:46 +04:00
claude 4761c20ad6 mavweb: main.go is eleven files (V-409)
cmd/mavweb/main.go held 1868 lines. Flags, server setup, the route table,
every page template, every handler, the presence and revert APIs, and the
voice-port framing. Split along the seams that were already there.

  shell.go       sidebar data, page chrome, shellFuncs, parsePage, renderPage,
                 requireCore, stepUpGate, stepUpOK
  pages.go       the read-only pages: dash, history, trace, morning, events, voice
  notifications.go, reminders.go, tasks.go, routines.go, tools.go, chat.go
                 one write surface each, template beside its handler
  facts.go       POST /api/signal and POST /api/revert
  voiceproxy.go  GET /ws, POST /api/ptt and the framing they share
  main.go        flags, wiring, server, 265 lines

Four shapes were written out by hand at every call site. Each is now one
function.

  parsePage   thirteen copies of template.Must(New(k).Funcs(shellFuncs())
              .Parse(shellHTML + body))
  renderPage  thirteen copies of Set(Content-Type), then Execute, then log
  requireCore twelve copies of the "<x> disabled (no -core)" 503
  stepUpGate  six copies of the "step-up required" 403

The route table lost twenty identical closures to corePage and gatedPage.
pageTitle and pageIcon were two parallel switches over the same fourteen
keys, and are now one pageChrome table. A new page can no longer get a
title and no icon. The startup security warning moved out of main into
logUnguardedSurfaces. Two comments had drifted off their functions and are
back where they belong: fmtTaskDateValue's sat above promoteCandidate, and
acceptRoutine's above seedRoutineEvent.

Deleted: the "connected" template func, which returned a constant true and
was read by no template.

No behaviour change. Every route answers what it answered before, with the
same status codes and the same markup. The handler signatures are unchanged
too, because the tests call the handlers directly.

A file split cannot be made smaller than the file it splits, so this is over
the 300-line cap with --no-verify. Every line in it is a move.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 01:28:21 +04:00