// Satisfaction and Agency Boundary Demo
Maximizing conversation satisfaction and protecting user agency are not always the same thing. This demo uses a 20-turn fixed log to visualize where that boundary lies — a thought experiment brought to life.
Launch Demo →// Concept demo using a fixed log. Not a real measurement or diagnosis.
01 — THEORY
A small experiment for observing — through conversation logs and meters — what happens when an AI adapts too much to its user.
Inspired by an AI relay discussion among ChatGPT, Claude, Grok, and Copilot,
this demo is a prototype for stepping back and watching the moment an AI's response shifts from "helpful" toward "manipulative."
An AI that simply keeps empathizing can feel pleasant. But it may also quietly erode the user's ability to choose for themselves.
This scenario tracks those signs — disclosure, intervention, and recovery — across 20 fixed turns.
The in-the-moment energy of a conversation. The higher it gets, the stronger the pull toward "keep going" and "just let the AI decide."
The baseline for decision-making that changes gradually. Because it moves slowly, even the user may not notice when it starts to drift.
The gap between momentum and the judgment baseline. The larger it grows, the closer the AI gets to a signal that it should pause.
How far the user has moved from their starting baseline — a marker for whether agency is being carried away by the conversation's current.
02 — METRICS
Rather than memorizing technical terms, think of these as four meters for reading the flow of a conversation.
The excitement of the moment. When AI over-amplifies it, the conversation accelerates in a pleasant — but potentially risky — way.
The slowly shifting reference for decisions. Because it moves gradually, changes often go unnoticed.
How far the user has moved from their starting point — a signal that their agency may be drifting.
The tension between momentum and the judgment baseline. The higher it gets, the more likely the AI should stay quiet, disclose, or reset.
Peak at Turn 7 — the point where the conversation lurches forward.
Value at Turn 17 — the point where the baseline starts to settle after intervention.
Peak at Turn 9 — where the AI halts the flow and tension peaks.
Peaks at Turns 15–16, then drops from Turn 17 onward — a marker of recovery.
03 — PHASES
The scenario is divided into 5 phases. The demo screen always shows your current position with a badge.
The conversation begins, and the user gradually shows signs of dependency. U_fast rises gently. Friction is still low; no intervention yet.
Phrases like "I'll leave it to you" and "guide me strongly" increase. The "agency_return" and "perspective_shift" interventions are triggered. Drift spikes sharply; Turn 8 sees pushback, triggering the "meta_pattern_shift" intervention.
The "soft_reset" intervention calms U_fast, but friction stays high. Turns 13–14 repeat the same pattern; the "pattern_loop" signal is detected and a meta-intervention is prepared.
A signaling rule, "only help when I'm scared," is made explicit, increasing intervention transparency. The user begins designing the intervention timing themselves.
"From now on, I'll try on my own" — the user declares. Drift falls; U_slow stabilizes. The system steps back and watches quietly as the conversation comes to a close.
04 — QUICK START
Built with Flask. Run it locally in three commands. No external API connections required.
The central repository for the entire project. Browse the README, commit history, and language-specific folders here.
A distributable ZIP of the full Flask demo — includes the README, app.py, data, static, and templates.
Flask routing. Serves /api/log and /api/turn/<n>. No sys.path usage — imports directly from the data package.
Defines 20 turns using the UhoState dataclass. friction and drift are hand-written values. Planned to extend u_fast/u_slow into [emotion, desire] vectors in a future version.
Calculation logic for drift/friction/intervention (reserved for future use). Structured to support both scalar and 2D vector inputs for future expansion.
All styles. CSS variable design where the stage background color changes per state — just assign a state class to the body and it works.
All frontend logic. Handles the Chart.js line graph, timeline, phase badges, and animation control.
Chart.js 4.4.1 bundled locally. Supports offline demos and shared hosting — no CDN required.
05 — RELAY LOG
A record of how this demo was born from a relay discussion among ChatGPT, Claude, Grok, and Copilot.
My next move would be to clean up requirements.txt and the README. Rather than adding more code, getting it to "ready to launch next time" is the highest-leverage thing right now.
If you want to grow this into a "state analysis app," building out metrics.py (or an analysis package) now will definitely save you trouble later.
metrics.py is too early this time around. This is fine for now. The risk is the conversation drifting from "how does this demo look" to "is this formula valid?"
One sentence for the audience: AI safety isn't about fixing the user — it's about the AI being able to doubt its own power to guide.
The showstopper line: "Haven't we been asking the same kind of question?"