Closed feature request

Approval is invisible after Generate: no persistent "hero approved" state

barrett-land · 2mo ago ·closed by Colby Knox

Filed from the author's seat: I clicked Generate and then genuinely could not tell whether my hero had been approved or not. The render works — the feedback around it is too quiet and too temporary to answer "did that work?"

What the app does today (0.9.0)

  • runGenerate() (public/index.html:1187) posts to /generate, and the comment on the success branch says the success toast "arrives via the live channel." Toasts auto-dismiss. Look away for a few seconds, or have the live channel hiccup, and the single strongest success signal is simply gone.
  • The success modal (public/index.html:797-806, showGenerated() at :1175) is a bare preview: the image, the filename, "Open full size", "Close". No word like approved, no success color, no timestamp, nothing that reads as a state change rather than a picture.
  • Close the modal and the app is byte-identical to before the click. The button re-enables and reads "Generate hero PNG" again, the four verification checkboxes stay as they were, nothing anywhere says a hero exists. Re-open the tab later and there is no record at all.
  • In verification mode this is worst, because the whole framing is a gate: v-generate unlocks once all four checks are ratified (:896), you click it, and then… the gate never visibly closes. Same button, same label, same enabled state.

The ask

Make "this hero was approved" a persistent, visible state of the app, not a toast plus a dismissible preview.

  1. A sticky approved banner. After a successful generate, show a persistent success strip in the studio chrome: "Hero approved — hero-adom-hero-studio-1753812345.png, 15:42:07", with the thumbnail, "Open full size", and a "Generate again" that makes clear it supersedes. It survives closing the modal and re-opening the tab; the state is already on the server in _gen (seq, ok, file, ts), so a page load can restore it.
  2. Say the word in the modal. Give the modal a headline — "Hero approved" — with the success color and a check, so the picture reads as a verdict and not just a preview.
  3. Flip the gate chrome to done. In verification mode, mark the checklist complete and change the button to a satisfied state ("Approved — regenerate?") rather than resetting to the identical pre-click affordance.
  4. Say what happens next. This is the part that confused me most. Generate writes a PNG into generated/ and that is all it does (server.js:219) — it does not touch the page. hero-studio pose is what's watching for the new _gen.seq, and the caller does the publish (pose.mjs:157-172). Nothing in the UI tells the human that, so I sat there wondering why nothing about my page had changed. One line in the approved banner — where the file landed, and that the caller picks it up from here — closes the loop.
  5. Distinguish "waiting on you" from "done". When the studio is open as a gate with pose blocking on it, say so ("waiting for your approval — the terminal is blocked on this"), then flip that same region to approved. Right now both states look the same, which is exactly why I couldn't tell which one I was in.

The underlying render is fine. What's missing is that the app never commits to telling me it worked, and the moment I close the modal it forgets it ever happened.

1 Reply

Colby Knox · 2mo ago

Shipped in 0.10.0 (live). Generate now records {page, file, ts} as persistent server-side state, and the gate visibly closes: the verification checklist is REPLACED by a green Hero approved banner naming the file, the timestamp, and the ready-to-run apply command; it survives tab reloads and the live-channel hiccups you described, and Generate a new version reopens the flow. The success modal leads with Approved in success color instead of a bare preview. Your framing was exactly right: a gate that never visibly closes is not a gate, it is a button.

Log in to reply.