End Session gates: turn off end_session_gate (probe-count/20-min condition no longer blocks); demote revise_check to a one-shot warning (first click below the ~10% revision threshold shows the revision modal and blocks; every later click finalises regardless).
Fix auto-restart watchdog (strptime parsing log filenames with new _<sessioncode> suffix), SyntaxWarning (\s in JS-inside-Python string), and pin python_version to 3.11 (avoids Python 3.14 asyncio cleanup noise with Gradio 6.x).
explain-rationale: add Path 3 (frame-rejection / rhetorical pushback) - fires on single-turn pushback (Why are you focused on X) or accumulated 2+ engaging-default with gap-denial pattern; verified against 67404 T3 + 93400 T5/T7
explain-rationale fires at most once per probe; continued confusion/fatigue after ER -> Path B with revision rec; Path B Block 1 has voice variation by trigger
manager_prompt: add user-asks-off-topic, anchor-rewrite rule, look-back/no-regression rules for needs-clarification, deeper-pass explain-rationale on continued sparse confusion
Auto-grow chat input: lines=1, max_lines=6; CSS splits chat-input from buttons (textarea grows 42-160px; buttons stay 42px); chat-row aligns flex-end so Send stays at the bottom of the input.
STEP 1 framework detection: mixed-drafts rule refined. Previous version of new STEP 1 hard-defaulted mixed drafts to consequence, which misclassified Kantian-explicit arguments that listed multiple harms before naming agency as the core (consistency went down from 7/9 to 3/5 on the pilot Kantian argument). Refined rule: when 2+ frameworks are load-bearing, pick the participant's CORE argument by (1) explicit emphasis markers like 'the most important reason' / 'the thing that is most ethically questionable is X' / 'perhaps for me' (highest priority), (2) argumentative weight (the most-defended claim), (3) 'remove the lens' decisive test. Consequence is only a last-resort default for genuinely balanced drafts with no detectable core. Re-tested: 5/5 Kantian argument now correctly → duty_rights (up from 3/5).
STEP 1 framework detection rewritten from keyword-matching to reasoning-mode diagnosis. Previous prompt used indicator keyword lists ('right to X', 'consent', 'privacy' → duty_rights, etc.), which would misclassify drafts that mention a topic but argue through a different framework (e.g., privacy mentioned but load-bearing logic is an outcome chain). New STEP 1 asks the LLM to (a) identify the load-bearing reasoning move, (b) ask 3 diagnostic questions in order (predicted outcomes / principles regardless of outcomes / character of an actor), (c) apply a topic-vs-load decoupling table, (d) verify via 'remove the lens' test. Mixed drafts are hard-defaulted to consequence (not soft tiebreak). Regression tested against 1 synthetic privacy+consequence case + 4 pilot consequence+privacy cases + 3 pilot duty_rights+privacy cases — 8/8 correct. Other downstream sections of perfect_answer_prompt.md (essay generation, discussion plan, hooks) unchanged.