Add controller-level coverage for no-new-user reroll behavior:
AFTER_COMMANDS defers recall, BEFORE_COMBINE deterministically reapplies
stored per-floor recall, and misses fall back to legacy compute. Update
docs to describe compute/injection decoupling and recall cards as the
editable per-floor bme_recall source.
Reroll (swipe/regenerate/continue = no-new-user) now deterministically
reapplies the parent user floor's stored bme_recall block in
GENERATE_BEFORE_COMBINE_PROMPTS, bypassing the transaction gate and
runRecall entirely. AFTER_COMMANDS defers no-new-user work to
before-combine. Staleness guard recomputes when the user edited the
floor; settings gate honors plugin/recall disable. Fresh normal sends
are unaffected. Compute machinery retained as fallback.
Prior generation's recall transaction was reused for a later reroll
because findRecentGenerationRecallTransactionForChat matched by chat
alone and the peer-hook bridge forced reuse. That set shouldRun=false,
skipped runRecall, and bypassed the persisted-recall reuse gate, so
reroll silently inherited the previous fresh result. Stamp each
transaction with the active host generation id and scope recent-lookup
to the same generation, preserving intra-generation hook bridging.
Three syntax errors from earlier refactors broke index.js module load,
removing the wand menu entry and floating panel:
- arrow function pasted into an import block (line 213, cloneRuntimeDebugValue)
- arrow function pasted into an import block (line 451, shouldRunRecallForTransaction)
- missing closing brace on applyGraphLoadState (Phase 5f extraction)
Root cause the guard missed it: package.json has no type:module, so
node --check parsed .js as CommonJS/script and accepted invalid ESM.
check-syntax now pipes each file through node --check --input-type=module
so syntax validation matches how the browser actually loads these modules.