Browse Source

Revise terminology proposal based on maintainer feedback

Co-authored-by: tig <[email protected]>
copilot-swe-agent[bot] 1 month ago
parent
commit
3f5fea0cd0

+ 77 - 122
TERMINOLOGY_EXECUTIVE_SUMMARY.md

@@ -1,159 +1,114 @@
-# Application.Run Terminology Proposal - Executive Summary
+# Application.Run Terminology - Executive Summary
 
 
-## ๐ŸŽฏ Purpose
+## The Ask
 
 
-Propose clearer, more intuitive terminology for the `Application.Run` lifecycle APIs in Terminal.Gui.
+Propose improved terminology for `Application.Run` lifecycle APIs to reduce confusion.
 
 
-## ๐Ÿ“Š The Problem in 30 Seconds
+## Maintainer Feedback
 
 
-```csharp
-// Current: "Run" means too many things
-Application.Run(window);           // โ† Complete lifecycle
-Application.RunLoop(runState);     // โ† Event loop?
-Application.RunIteration();        // โ† One iteration?
-
-RunState runState = Application.Begin(window);  // โ† Begin what? What's RunState?
-Application.End(runState);                      // โ† End what?
-```
+Based on @tig's review:
+- โœ… Keep deep analysis and diagrams
+- โœ… Keep `Begin` and `End` (not wordy like BeginSession/EndSession)
+- โœ… Keep `RequestStop` (non-blocking nature is clear)
+- โœ… Preserve distinction between `RunLoop` (starts driver's mainloop) and `RunIteration` (one iteration)
 
 
-**Result:** Confused users, unclear docs, steep learning curve.
+## The Real Problems (Only 2)
 
 
-## โœ… The Solution in 30 Seconds
+### 1. `RunState` Sounds Like State Data
 
 
 ```csharp
 ```csharp
-// Proposed: Clear, self-documenting names
-Application.Run(window);                            // โ† Unchanged (high-level)
-
-ToplevelSession session = Application.BeginSession(window);  // โœ… Clear
-Application.ProcessEvents(session);                          // โœ… Clear
-Application.EndSession(session);                             // โœ… Clear
+RunState rs = Application.Begin(window);  // โŒ What state does it hold?
 ```
 ```
 
 
-**Result:** Self-documenting APIs, faster learning, industry alignment.
+**Reality:** It's a token/handle for Begin/End pairing, not state data.
 
 
-## ๐Ÿ“ˆ Impact
+**Solution:** Rename to `RunToken` (clear it's a token, concise).
 
 
-### Who This Affects
-- โœ… **New users:** Easier to understand and learn
-- โœ… **Existing users:** Optional upgrade via [Obsolete] warnings
-- โœ… **Documentation:** Clearer explanations possible
-- โœ… **Maintainers:** Fewer confused user questions
+### 2. `EndAfterFirstIteration` Confuses End() Method with Loop Control
 
 
-### Breaking Changes
-- โŒ **NONE** - All existing APIs continue to work
-- โœ… Old APIs marked `[Obsolete]` with helpful migration messages
-- โœ… Gradual migration at each user's own pace
+```csharp
+Application.EndAfterFirstIteration = true;  // โŒ Does this call End()?
+```
 
 
-## ๐Ÿ”„ Complete Mapping
+**Reality:** It controls `RunLoop()` behavior, not lifecycle cleanup.
 
 
-| Current API | Proposed API | Benefit |
-|-------------|--------------|---------|
-| `RunState` | `ToplevelSession` | Clear it's a session token |
-| `Begin()` | `BeginSession()` | Unambiguous what's beginning |
-| `RunLoop()` | `ProcessEvents()` | Describes the action |
-| `RunIteration()` | `ProcessEventsIteration()` | Consistent naming |
-| `End()` | `EndSession()` | Unambiguous what's ending |
-| `RequestStop()` | `StopProcessingEvents()` | Explicit about what stops |
+**Solution:** Rename to `StopAfterFirstIteration` (aligns with `RequestStop`, clearly about loop control).
 
 
-## ๐Ÿ’ก Why "Session"?
+## Proposed Changes (Minimal - 2 Names Only)
 
 
-1. **Industry Standard**
-   - `HttpContext` - one HTTP request session
-   - `DbContext` - one database session
-   - `CancellationToken` - one cancellation scope
-   
-2. **Accurate**
-   - A Toplevel execution IS a bounded session
-   - Multiple sessions can exist (nested modals)
-   - Sessions have clear begin/end lifecycle
+| Current | Proposed | Why |
+|---------|----------|-----|
+| `RunState` | `RunToken` | Clear it's a token, not state |
+| `EndAfterFirstIteration` | `StopAfterFirstIteration` | Clear it controls loop, aligns with RequestStop |
 
 
-3. **Clear**
-   - "Session" implies temporary, bounded execution
-   - "BeginSession/EndSession" are unambiguous pairs
-   - "ToplevelSession" clearly indicates purpose
+## Keep Unchanged
 
 
-## ๐Ÿ“š Documentation Structure
+| API | Why It Works |
+|-----|--------------|
+| `Begin` / `End` | Clear, concise - not wordy |
+| `RequestStop` | "Request" appropriately conveys non-blocking |
+| `RunLoop` / `RunIteration` | Distinction is important: RunLoop starts mainloop, RunIteration processes one iteration |
 
 
-```
-TERMINOLOGY_README.md (Start Here)
-    โ”œโ”€ Overview and navigation
-    โ”œโ”€ Problem statement
-    โ””โ”€ Links to all documents
-
-TERMINOLOGY_PROPOSAL.md
-    โ”œโ”€ Complete analysis
-    โ”œโ”€ 3 options with rationale
-    โ”œโ”€ Migration strategy
-    โ””โ”€ FAQ
-
-TERMINOLOGY_QUICK_REFERENCE.md
-    โ”œโ”€ Side-by-side comparisons
-    โ”œโ”€ Usage examples
-    โ””โ”€ Quick lookup tables
-
-TERMINOLOGY_INDUSTRY_COMPARISON.md
-    โ”œโ”€ Framework comparisons
-    โ”œโ”€ Industry patterns
-    โ””โ”€ Why this solution
-
-TERMINOLOGY_VISUAL_GUIDE.md
-    โ”œโ”€ ASCII diagrams
-    โ”œโ”€ Flow charts
-    โ””โ”€ Visual comparisons
-```
+## Usage Comparison
 
 
-## ๐Ÿš€ Next Steps
+### Before (Confusing)
+```csharp
+RunState rs = Application.Begin(window);
+Application.EndAfterFirstIteration = true;
+Application.RunLoop(rs);
+Application.End(rs);
+```
 
 
-1. **Review** - Community reviews this proposal
-2. **Feedback** - Gather comments and suggestions
-3. **Refine** - Adjust based on feedback
-4. **Approve** - Get maintainer approval
-5. **Implement** - Add new APIs with [Obsolete] on old ones
-6. **Document** - Update all documentation
-7. **Migrate** - Examples and guides use new terminology
+### After (Clear)
+```csharp
+RunToken token = Application.Begin(window);
+Application.StopAfterFirstIteration = true;
+Application.RunLoop(token);
+Application.End(token);
+```
 
 
-## โฑ๏ธ Timeline (Proposed)
+## Benefits
 
 
-- **Phase 1 (Release N):** Add new APIs, mark old ones obsolete
-- **Phase 2 (Release N+1):** Update all documentation
-- **Phase 3 (Release N+2):** Update all examples
-- **Phase 4 (Release N+3+):** Consider removing obsolete APIs (or keep forever)
+- โœ… Addresses the 2 primary sources of confusion
+- โœ… Minimal disruption (only 2 names)
+- โœ… Backward compatible (obsolete attributes on old names)
+- โœ… Respects maintainer feedback
+- โœ… Preserves what works well
 
 
-## ๐Ÿ—ณ๏ธ Alternative Options
+## Documents
 
 
-This proposal includes 3 options:
+- **TERMINOLOGY_PROPOSAL.md** - Complete analysis with rationale
+- **TERMINOLOGY_QUICK_REFERENCE.md** - Quick comparison and examples
+- **TERMINOLOGY_VISUAL_GUIDE.md** - Visual diagrams showing the issues
 
 
-1. **Session-Based** โญ (Recommended)
-   - BeginSession/ProcessEvents/EndSession
-   - Most accurate and industry-aligned
+## Alternative Options
 
 
-2. **Modal/Show**
-   - Activate/EventLoop/Deactivate
-   - Aligns with WPF patterns
+### For RunState
+- **RunToken** โญ (Recommended) - Clear, concise
+- ExecutionContext - Industry standard but longer
+- Keep as-is - Not recommended (remains misleading)
 
 
-3. **Lifecycle**
-   - Start/Execute/Stop
-   - Simple verbs
+### For EndAfterFirstIteration
+- **StopAfterFirstIteration** โญ (Recommended) - Aligns with RequestStop
+- SingleIteration - Shorter but less obvious
+- Keep as-is - Not recommended (continues confusion)
 
 
-See [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md) for detailed comparison.
+## Migration Path
 
 
-## ๐Ÿ’ฌ Feedback Welcome
+Backward compatible via obsolete attributes:
 
 
-- What do you think of the proposed names?
-- Do you prefer a different option?
-- Any concerns about migration?
-- Timeline reasonable for your projects?
+```csharp
+[Obsolete("Use RunToken instead")]
+public class RunState { ... }
 
 
-## ๐Ÿ“– Full Documentation
+[Obsolete("Use StopAfterFirstIteration instead")]
+public static bool EndAfterFirstIteration { get; set; }
+```
 
 
-Read the complete proposal: [TERMINOLOGY_README.md](TERMINOLOGY_README.md)
+Users can migrate gradually with simple find/replace.
 
 
 ---
 ---
 
 
-**Status:** ๐Ÿ“ Awaiting Community Feedback
-
-**Issue:** #4329
-
-**Created:** 2025-10-25
-
-**Author:** GitHub Copilot
+**Status:** Revised based on maintainer feedback
+**Focus:** Minimal, targeted changes addressing real confusion
+**Impact:** Low (2 names), High clarity gain

+ 0 - 291
TERMINOLOGY_INDUSTRY_COMPARISON.md

@@ -1,291 +0,0 @@
-# Application.Run Terminology - Industry Comparison
-
-This document compares Terminal.Gui's terminology with other popular UI frameworks to provide context for the proposed changes.
-
-## Framework Comparison Matrix
-
-### Complete Lifecycle (Show/Run a Window)
-
-| Framework | API | Notes |
-|-----------|-----|-------|
-| **Terminal.Gui (current)** | `Application.Run(toplevel)` | Modal execution |
-| **Terminal.Gui (proposed)** | `Application.Run(toplevel)` | Keep same (high-level API) |
-| **WPF** | `window.ShowDialog()` | Modal, returns DialogResult |
-| **WPF** | `window.Show()` | Non-modal |
-| **WinForms** | `form.ShowDialog()` | Modal |
-| **WinForms** | `Application.Run(form)` | Main message loop |
-| **Avalonia** | `window.ShowDialog()` | Modal, async |
-| **GTK#** | `window.ShowAll()` + `Gtk.Application.Run()` | Combined |
-| **Qt** | `QApplication::exec()` | Main event loop |
-| **Electron** | `mainWindow.show()` | Non-modal |
-
-### Session/Context Token
-
-| Framework | Concept | Type | Purpose |
-|-----------|---------|------|---------|
-| **Terminal.Gui (current)** | `RunState` | Class | Token for Begin/End pairing |
-| **Terminal.Gui (proposed)** | `ToplevelSession` | Class | Session token (clearer name) |
-| **WPF** | N/A | - | Hidden by framework |
-| **WinForms** | `ApplicationContext` | Class | Message loop context |
-| **Avalonia** | N/A | - | Hidden by framework |
-| **ASP.NET** | `HttpContext` | Class | Request context (analogous) |
-| **Entity Framework** | `DbContext` | Class | Session context (analogous) |
-
-**Analysis:** "Session" or "Context" are industry standards for bounded execution periods. "State" is misleading.
-
-### Initialize/Start
-
-| Framework | API | Purpose |
-|-----------|-----|---------|
-| **Terminal.Gui (current)** | `Application.Begin(toplevel)` | Prepare toplevel for execution |
-| **Terminal.Gui (proposed)** | `Application.BeginSession(toplevel)` | Start an execution session |
-| **WPF** | `window.Show()` / `window.ShowDialog()` | Combined with event loop |
-| **WinForms** | `Application.Run(form)` | Combined initialization |
-| **Node.js HTTP** | `server.listen()` | Start accepting requests |
-| **ASP.NET** | `app.Run()` | Start web server |
-| **Qt** | `widget->show()` | Show widget |
-
-**Analysis:** Most frameworks combine initialization with execution. Terminal.Gui's separation is powerful for advanced scenarios.
-
-### Event Loop Processing
-
-| Framework | API | Purpose | Notes |
-|-----------|-----|---------|-------|
-| **Terminal.Gui (current)** | `Application.RunLoop(runState)` | Process events until stopped | Confusing "Run" + "Loop" |
-| **Terminal.Gui (proposed)** | `Application.ProcessEvents(session)` | Process events until stopped | Clear action verb |
-| **WPF** | `Dispatcher.Run()` | Run dispatcher loop | Hidden in most apps |
-| **WinForms** | `Application.Run()` | Process message loop | Auto-started |
-| **Node.js** | `eventLoop.run()` | Run event loop | Internal |
-| **Qt** | `QApplication::exec()` | Execute event loop | "exec" = execute |
-| **GTK** | `Gtk.Application.Run()` | Main loop | Standard GTK term |
-| **Win32** | `GetMessage()` / `DispatchMessage()` | Message pump | Manual control |
-| **X11** | `XNextEvent()` | Process events | Manual control |
-
-**Analysis:** "ProcessEvents" or "EventLoop" are clearer than "RunLoop". The term "pump" is Windows-specific.
-
-### Single Iteration
-
-| Framework | API | Purpose |
-|-----------|-----|---------|
-| **Terminal.Gui (current)** | `Application.RunIteration()` | Process one event cycle |
-| **Terminal.Gui (proposed)** | `Application.ProcessEventsIteration()` | Process one event cycle |
-| **Game Engines (Unity)** | `Update()` / `Tick()` | One frame/tick |
-| **Game Engines (Unreal)** | `Tick(DeltaTime)` | One frame |
-| **WPF** | `Dispatcher.ProcessEvents()` | Process pending events |
-| **WinForms** | `Application.DoEvents()` | Process pending events |
-| **Node.js** | `setImmediate()` / `process.nextTick()` | Next event loop iteration |
-
-**Analysis:** "Iteration", "Tick", or "DoEvents" are all clear. "ProcessEvents" aligns with WPF.
-
-### Cleanup/End
-
-| Framework | API | Purpose |
-|-----------|-----|---------|
-| **Terminal.Gui (current)** | `Application.End(runState)` | Clean up after execution |
-| **Terminal.Gui (proposed)** | `Application.EndSession(session)` | End the execution session |
-| **WPF** | `window.Close()` | Close window |
-| **WinForms** | `form.Close()` | Close form |
-| **ASP.NET** | Request ends automatically | Dispose context |
-| **Entity Framework** | `context.Dispose()` | Dispose context |
-
-**Analysis:** "EndSession" pairs clearly with "BeginSession". "Close" works for windows but not for execution context.
-
-### Stop/Request Stop
-
-| Framework | API | Purpose |
-|-----------|-----|---------|
-| **Terminal.Gui (current)** | `Application.RequestStop()` | Signal loop to stop |
-| **Terminal.Gui (proposed)** | `Application.StopProcessingEvents()` | Stop event processing |
-| **WPF** | `window.Close()` | Close window, stops its loop |
-| **WinForms** | `Application.Exit()` | Exit application |
-| **Node.js** | `server.close()` | Stop accepting connections |
-| **CancellationToken** | `cancellationToken.Cancel()` | Request cancellation |
-
-**Analysis:** "RequestStop" is already clear. "StopProcessingEvents" is more explicit about what stops.
-
-## Terminology Patterns Across Industries
-
-### Game Development
-
-Game engines use clear, explicit terminology:
-
-```csharp
-// Unity pattern
-void Start() { }      // Initialize
-void Update() { }     // Per-frame update (tick)
-void OnDestroy() { }  // Cleanup
-
-// Typical game loop
-while (running)
-{
-    ProcessInput();
-    UpdateGameState();
-    Render();
-}
-```
-
-**Lesson:** Use explicit verbs that describe what happens each phase.
-
-### Web Development
-
-Web frameworks use session/context patterns:
-
-```csharp
-// ASP.NET Core
-public void Configure(IApplicationBuilder app)
-{
-    app.Run(async context =>  // HttpContext = request session
-    {
-        await context.Response.WriteAsync("Hello");
-    });
-}
-
-// Entity Framework
-using (var context = new DbContext())  // Session
-{
-    // Work with data
-}
-```
-
-**Lesson:** "Context" or "Session" for bounded execution periods is industry standard.
-
-### GUI Frameworks
-
-Desktop GUI frameworks separate showing from modal execution:
-
-```csharp
-// WPF pattern
-window.Show();              // Non-modal
-var result = window.ShowDialog();  // Modal (blocks)
-
-// Terminal.Gui (current - confusing)
-Application.Run(toplevel);  // Modal? Non-modal? Unclear
-
-// Terminal.Gui (proposed - clearer)
-Application.Run(toplevel);  // High-level: modal execution
-// OR low-level:
-var session = Application.BeginSession(toplevel);
-Application.ProcessEvents(session);
-Application.EndSession(session);
-```
-
-**Lesson:** Separate high-level convenience from low-level control.
-
-## Key Insights
-
-### 1. "Run" is Overloaded Everywhere
-
-Many frameworks have "Run" methods, but they mean different things:
-- **WPF**: `Application.Run()` - "run the entire application"
-- **WinForms**: `Application.Run(form)` - "run with this form as main"
-- **ASP.NET**: `app.Run()` - "start the web server"
-- **Terminal.Gui**: `Application.Run(toplevel)` - "run this toplevel modally"
-
-**Solution:** Keep high-level `Run()` for simplicity, but clarify low-level APIs.
-
-### 2. Session/Context Pattern is Standard
-
-The pattern of a token representing a bounded execution period is common:
-- `HttpContext` - one HTTP request
-- `DbContext` - one database session
-- `ExecutionContext` - one execution scope
-- `CancellationToken` - one cancellation scope
-
-**Terminal.Gui's `RunState` fits this pattern** - it should be named accordingly.
-
-### 3. Begin/End vs Start/Stop vs Open/Close
-
-Different frameworks use different pairs:
-- **Begin/End** - .NET (BeginInvoke/EndInvoke, BeginInit/EndInit)
-- **Start/Stop** - Common (StartService/StopService)
-- **Open/Close** - Resources (OpenFile/CloseFile, OpenConnection/CloseConnection)
-
-Terminal.Gui currently uses **Begin/End**, which is fine, but it needs a noun:
-- โœ… `BeginSession/EndSession` - Clear
-- โ“ `Begin/End` - Begin what?
-
-### 4. Event Processing Terminology
-
-Most frameworks use one of:
-- **ProcessEvents** - Explicit action (WPF, WinForms)
-- **EventLoop** - Noun describing the construct
-- **Pump/PumpMessages** - Windows-specific
-- **Dispatch** - Action of dispatching events
-
-**Terminal.Gui's "RunLoop"** is ambiguous - it could be a verb (run the loop) or a noun (the RunLoop object).
-
-## Recommendations Based on Industry Analysis
-
-### Primary Recommendation: Session-Based (Option 1)
-
-```
-Application.Run(toplevel)                              // Keep - familiar, simple
-  โ”œโ”€ Application.BeginSession(toplevel) โ†’ ToplevelSession
-  โ”œโ”€ Application.ProcessEvents(session)
-  โ””โ”€ Application.EndSession(session)
-```
-
-**Aligns with:**
-- .NET patterns (BeginInvoke/EndInvoke, HttpContext sessions)
-- Industry standard "session" terminology
-- Explicit "ProcessEvents" from WPF/WinForms
-
-**Why it wins:**
-1. "Session" is universally understood as bounded execution
-2. "ProcessEvents" is explicit about what happens
-3. Begin/End is already .NET standard
-4. Minimal disruption to existing mental model
-
-### Alternative: Lifecycle-Based (Option 3)
-
-```
-Application.Run(toplevel)
-  โ”œโ”€ Application.Start(toplevel) โ†’ ExecutionContext
-  โ”œโ”€ Application.Execute(context)
-  โ””โ”€ Application.Stop(context)
-```
-
-**Aligns with:**
-- Service patterns (StartService/StopService)
-- Game patterns (Start/Update/Stop)
-- Simpler verbs
-
-**Trade-offs:**
-- โš ๏ธ "Start/Stop" breaks existing Begin/End pattern
-- โœ… More intuitive for newcomers
-- โš ๏ธ "Execute" is less explicit than "ProcessEvents"
-
-### Why Not Modal/Show (Option 2)
-
-```
-Application.ShowModal(toplevel)
-  โ”œโ”€ Application.Activate(toplevel)
-  โ””โ”€ Application.Deactivate(toplevel)
-```
-
-**Issues:**
-- Terminal.Gui doesn't distinguish modal/non-modal the way WPF does
-- "Activate/Deactivate" implies window state, not execution
-- Bigger departure from current API
-
-## Conclusion
-
-**Industry analysis supports Option 1 (Session-Based):**
-
-1. โœ… "Session" is industry standard for bounded execution
-2. โœ… "ProcessEvents" is clear and matches WPF/WinForms
-3. โœ… Begin/End is established .NET pattern
-4. โœ… Minimal disruption to existing API
-5. โœ… Clear improvement over current "Run*" terminology
-
-The proposed terminology brings Terminal.Gui in line with industry patterns while respecting its unique architecture that exposes low-level event loop control.
-
-## References
-
-- [WPF Application Model](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/app-development/application-management-overview)
-- [WinForms Application Class](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.application)
-- [Avalonia Application Lifetime](https://docs.avaloniaui.net/docs/concepts/application-lifetimes)
-- [GTK Application](https://docs.gtk.org/gtk4/class.Application.html)
-- [Qt Application](https://doc.qt.io/qt-6/qapplication.html)
-- [.NET HttpContext](https://docs.microsoft.com/en-us/dotnet/api/system.web.httpcontext)
-- [Entity Framework DbContext](https://docs.microsoft.com/en-us/ef/core/dbcontext-configuration/)

+ 232 - 203
TERMINOLOGY_PROPOSAL.md

@@ -1,277 +1,306 @@
-# Application.Run Terminology Proposal
+# Application.Run Terminology Proposal (Revised)
 
 
 ## Executive Summary
 ## Executive Summary
 
 
-This document proposes improved terminology for the Terminal.Gui application execution lifecycle. The current `Run` terminology is overloaded and confusing, encompassing multiple distinct concepts. This proposal introduces clearer, more precise naming that better communicates the purpose and relationships of each API.
+This proposal addresses specific terminology issues in the Terminal.Gui Application.Run lifecycle while preserving what works well. Based on maintainer feedback, we keep `Begin`, `End`, and `RequestStop` unchanged, and focus on the real sources of confusion.
 
 
-## Problem Statement
+## What Works Well (Keep Unchanged)
 
 
-The current terminology around `Application.Run` is confusing because:
+- โœ… **`Begin` and `End`** - Clear, concise lifecycle pairing without being wordy
+- โœ… **`RequestStop`** - Non-blocking nature is appropriately conveyed by "Request"
+- โœ… **Distinction between `RunLoop` and `RunIteration`** - `RunLoop` starts the driver's mainloop, `RunIteration` processes one iteration
 
 
-1. **"Run" is overloaded** - It refers to both:
-   - The complete lifecycle (Begin โ†’ RunLoop โ†’ End โ†’ Stop)
-   - The event loop itself (RunLoop)
-   - Multiple API methods (Run, RunLoop, RunIteration)
+## The Real Problems
 
 
-2. **Relationships are unclear** - Users don't understand that:
-   - `Run()` is a convenience method = `Begin()` + `RunLoop()` + `End()`
-   - `RunState` is a session token, not a state object
-   - `RequestStop()` affects `RunLoop()` which triggers `End()`
+### Problem 1: `RunState` Sounds Like State Data
 
 
-3. **Inconsistent with industry patterns** - Other frameworks use clearer terms:
-   - WPF: `Show()`, `ShowDialog()`, `Close()`
-   - WinForms: `Show()`, `ShowDialog()`, `Application.Run()`
-   - Avalonia: `Show()`, `ShowDialog()`, `StartWithClassicDesktopLifetime()`
-
-## Current Terminology Analysis
+**Current:**
+```csharp
+RunState runState = Application.Begin(toplevel);
+Application.RunLoop(runState);
+Application.End(runState);
+```
 
 
-### Current APIs and Their Actual Purposes
+**Issue:** The name `RunState` suggests it holds state/data about the run, but it's actually:
+- A token/handle returned by `Begin()` to pair with `End()`
+- An execution context for the Toplevel
+- Not primarily about "state" - it's about identity/scoping
 
 
-| Current Name | Actual Purpose | Confusion Point |
-|-------------|----------------|-----------------|
-| `Run()` | Complete lifecycle: Begin + Loop + End | Overloaded - means too many things |
-| `RunState` | Session token/handle for a Toplevel execution | Sounds like state data, not a handle |
-| `Begin()` | Initialize and prepare a Toplevel for execution | "Begin" what? Begin running? |
-| `RunLoop()` | Execute the event loop until stopped | Clear, but tied to "Run" |
-| `RunIteration()` | Execute one iteration of the event loop | Clear |
-| `End()` | Clean up after a Toplevel execution session | "End" what? End running? |
-| `RequestStop()` | Signal the event loop to stop | What does it stop? |
-| `EndAfterFirstIteration` | Exit after one loop iteration | Tied to "End" but affects loop |
+**Proposed Options:**
 
 
-### Current Flow
+**Option A: `RunToken`**
+```csharp
+RunToken token = Application.Begin(toplevel);
+Application.RunLoop(token);
+Application.End(token);
+```
+- โœ… Clear it's a token, not state data
+- โœ… Concise (not wordy)
+- โœ… Industry standard pattern (CancellationToken, etc.)
 
 
+**Option B: `ExecutionContext`**
+```csharp
+ExecutionContext context = Application.Begin(toplevel);
+Application.RunLoop(context);
+Application.End(context);
 ```
 ```
-Application.Run(toplevel)
-  โ””โ”€> Application.Begin(toplevel) โ†’ returns RunState
-      โ””โ”€> Initialize
-      โ””โ”€> Layout
-      โ””โ”€> Draw
-  โ””โ”€> Application.RunLoop(runState)
-      โ””โ”€> while (Running)
-          โ””โ”€> Application.RunIteration()
-              โ””โ”€> Process events
-              โ””โ”€> Layout (if needed)
-              โ””โ”€> Draw (if needed)
-  โ””โ”€> Application.End(runState)
-      โ””โ”€> Clean up
-      โ””โ”€> Dispose RunState
+- โœ… Accurately describes bounded execution scope
+- โœ… Familiar from .NET (HttpContext, DbContext)
+- โš ๏ธ Slightly longer
+
+**Option C: Keep `RunState` but clarify in docs**
+- โš ๏ธ Name remains misleading even with good documentation
+
+### Problem 2: `EndAfterFirstIteration` Confuses "End" with Loop Control
+
+**Current:**
+```csharp
+Application.EndAfterFirstIteration = true;  // Controls RunLoop, not End()
+RunState rs = Application.Begin(window);
+Application.RunLoop(rs);  // Stops after 1 iteration due to flag
+Application.End(rs);       // This is actual "End"
 ```
 ```
 
 
-## Proposed Terminology
+**Issue:** 
+- "End" in the flag name suggests the `End()` method, but it actually controls `RunLoop()`
+- The flag stops the loop, not the lifecycle
+- Creates confusion about when `End()` gets called
 
 
-### Option 1: Session-Based Terminology (Recommended)
+**Proposed Options:**
 
 
-This option emphasizes that running a Toplevel is a "session" with clear lifecycle management.
+**Option A: `StopAfterFirstIteration`**
+```csharp
+Application.StopAfterFirstIteration = true;
+```
+- โœ… "Stop" aligns with `RequestStop` which also affects the loop
+- โœ… Clearly about loop control, not lifecycle end
+- โœ… Minimal change
 
 
-| Current | Proposed | Rationale |
-|---------|----------|-----------|
-| `Run()` | `Run()` | Keep for backward compatibility and familiarity |
-| `RunState` | `ToplevelSession` | Clear that it's a session token, not state |
-| `Begin()` | `BeginSession()` | Clear what is beginning |
-| `RunLoop()` | `ProcessEvents()` | Describes what it does, not abstract "run" |
-| `RunIteration()` | `ProcessEventsIteration()` | Consistent with ProcessEvents |
-| `End()` | `EndSession()` | Clear what is ending |
-| `RequestStop()` | `StopProcessingEvents()` | Clear what stops |
-| `EndAfterFirstIteration` | `StopAfterFirstIteration` | Consistent with Stop terminology |
+**Option B: `SingleIteration`**
+```csharp
+Application.SingleIteration = true;
+```
+- โœ… Shorter, positive framing
+- โœ… Describes the mode, not the action
+- โš ๏ธ Less obvious it's about stopping
 
 
-**Usage Example:**
+**Option C: `RunLoopOnce`**
 ```csharp
 ```csharp
-// High-level (unchanged)
-Application.Run(myWindow);
+Application.RunLoopOnce = true;
+```
+- โœ… Very explicit about what happens
+- โš ๏ธ Slightly awkward phrasing
 
 
-// Low-level (new names)
-ToplevelSession session = Application.BeginSession(myWindow);
-Application.ProcessEvents(session);
-Application.EndSession(session);
+### Problem 3: "Run" Overload (Lower Priority)
+
+**Current:**
+```csharp
+Application.Run(window);        // Complete lifecycle
+Application.RunLoop(state);     // Starts the driver's mainloop  
+Application.RunIteration(state); // One iteration
 ```
 ```
 
 
-### Option 2: Modal/Show Terminology
+**Issue:** Three different APIs with "Run" in the name doing different things at different levels.
 
 
-This option aligns with WPF/WinForms patterns, emphasizing the modal/non-modal nature.
+**Note:** @tig's feedback indicates the distinction between `RunLoop` and `RunIteration` is important and understood. The "Run" prefix may not be a critical issue if the distinction is clear.
 
 
-| Current | Proposed | Rationale |
-|---------|----------|-----------|
-| `Run()` | `ShowModal()` or `Run()` | Emphasizes modal nature, or keep Run |
-| `RunState` | `ToplevelHandle` | It's a handle/token for the execution |
-| `Begin()` | `Activate()` | Activates the Toplevel for display |
-| `RunLoop()` | `EventLoop()` | Standard terminology |
-| `RunIteration()` | `ProcessEvents()` | Processes one iteration of events |
-| `End()` | `Deactivate()` | Deactivates the Toplevel |
-| `RequestStop()` | `Close()` or `RequestStop()` | Familiar to GUI developers |
-| `EndAfterFirstIteration` | `SingleIteration` | Mode rather than action |
+**Possible future consideration (not recommended now):**
+- Document the distinction more clearly
+- Keep names as-is since they work with understanding
 
 
-**Usage Example:**
-```csharp
-// High-level
-Application.ShowModal(myWindow);
+## Recommended Changes
 
 
-// Low-level
-ToplevelHandle handle = Application.Activate(myWindow);
-while (!stopped)
-    Application.ProcessEvents(handle);
-Application.Deactivate(handle);
-```
+### Minimal Impact Recommendation
+
+Change only what's most confusing:
+
+1. **`RunState` โ†’ `RunToken`** (or `ExecutionContext`)
+   - Clear it's a token/handle
+   - Less ambiguous than "state"
+   - Concise
 
 
-### Option 3: Lifecycle Terminology
+2. **`EndAfterFirstIteration` โ†’ `StopAfterFirstIteration`**
+   - Aligns with `RequestStop` terminology
+   - Clearly about loop control
+   - Minimal change
 
 
-This option uses explicit lifecycle phases.
+3. **Keep everything else:**
+   - `Begin` / `End` - Perfect as-is
+   - `RequestStop` - Clear non-blocking signal
+   - `RunLoop` / `RunIteration` - Distinction is valuable
+   - `Run()` - Familiar high-level API
 
 
-| Current | Proposed | Rationale |
-|---------|----------|-----------|
-| `Run()` | `Run()` | Keep for compatibility |
-| `RunState` | `ExecutionContext` | It's a context for execution |
-| `Begin()` | `Start()` | Lifecycle: Start โ†’ Execute โ†’ Stop |
-| `RunLoop()` | `Execute()` | The execution phase |
-| `RunIteration()` | `Tick()` | Common game/event loop term |
-| `End()` | `Stop()` | Lifecycle: Start โ†’ Execute โ†’ Stop |
-| `RequestStop()` | `RequestStop()` | Keep, it's clear |
-| `EndAfterFirstIteration` | `StopAfterFirstTick` | Consistent with Tick |
+### Usage Comparison
 
 
-**Usage Example:**
+**Current (Confusing):**
 ```csharp
 ```csharp
-// High-level (unchanged)
-Application.Run(myWindow);
+// High-level
+Application.Run(window);
 
 
 // Low-level
 // Low-level
-ExecutionContext context = Application.Start(myWindow);
-Application.Execute(context);
-Application.Stop(context);
+Application.EndAfterFirstIteration = true;
+RunState rs = Application.Begin(window);
+Application.RunLoop(rs);
+Application.End(rs);
 ```
 ```
 
 
-## Recommendation: Option 1 (Session-Based)
-
-**Recommended choice:** Option 1 - Session-Based Terminology
+**Proposed (Clearer):**
+```csharp
+// High-level (unchanged)
+Application.Run(window);
 
 
-**Reasons:**
+// Low-level (clearer)
+Application.StopAfterFirstIteration = true;
+RunToken token = Application.Begin(window);
+Application.RunLoop(token);
+Application.End(token);
+```
 
 
-1. **Accuracy** - "Session" accurately describes what's happening: a bounded period of execution for a Toplevel
-2. **Clarity** - "BeginSession/EndSession" are unambiguous pairs
-3. **ProcessEvents** - Clearly communicates what the loop does
-4. **Minimal conceptual shift** - The pattern is still Begin/Loop/End, just clearer
-5. **Extensibility** - "Session" can encompass future session-related features
+## Understanding RunLoop vs RunIteration
 
 
-**Migration Strategy:**
+It's important to preserve the distinction:
 
 
-1. **Phase 1: Add new APIs with Obsolete attributes on old ones**
-   ```csharp
-   [Obsolete("Use BeginSession instead")]
-   public static RunState Begin(Toplevel toplevel)
-   
-   public static ToplevelSession BeginSession(Toplevel toplevel)
-   ```
+- **`RunLoop(token)`** - Starts the driver's MainLoop and runs until stopped
+  - This is a blocking call that manages the loop
+  - Calls `RunIteration` repeatedly
+  - Returns when `RequestStop()` is called or `StopAfterFirstIteration` is true
 
 
-2. **Phase 2: Update documentation to use new terminology**
-3. **Phase 3: Update examples to use new APIs**
-4. **Phase 4: After 2-3 releases, consider removing obsolete APIs**
+- **`RunIteration(ref token)`** - Processes ONE iteration
+  - Processes pending driver events
+  - Does layout if needed
+  - Draws if needed
+  - Returns immediately
 
 
-## Alternative Names Considered
+**Visual:**
+```
+RunLoop(token):
+  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+  โ”‚ while (Running)     โ”‚
+  โ”‚   RunIteration()    โ”‚ โ† One call
+  โ”‚   RunIteration()    โ”‚ โ† Another call
+  โ”‚   RunIteration()    โ”‚ โ† Another call
+  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+```
 
 
-### For RunState/ToplevelSession
-- `ToplevelToken` - Too focused on the token aspect
-- `ToplevelHandle` - C/Win32 feel, less modern
-- `ExecutionSession` - Too generic
-- `ToplevelContext` - Could work, but "context" is overloaded in .NET
-- `ToplevelExecution` - Sounds like a verb, not a noun
+This distinction is valuable and should be preserved.
 
 
-### For Begin/BeginSession
-- `StartSession` - Could work, but Begin/End is a common .NET pattern
-- `OpenSession` - Open/Close works but less common for this use
-- `InitializeSession` - Too long
+## Migration Strategy
 
 
-### For RunLoop/ProcessEvents
-- `EventLoop` - Good, but sounds like a noun not a verb
-- `PumpEvents` - Win32 terminology, might work
-- `HandleEvents` - Similar to ProcessEvents
-- `MainLoop` - Confusing with MainLoop class
+### Phase 1: Add New Names with Obsolete Attributes
 
 
-### For End/EndSession
-- `CloseSession` - Could work with OpenSession
-- `FinishSession` - Less common
-- `TerminateSession` - Too harsh/formal
+```csharp
+// Add new type
+public class RunToken { ... }
+
+// Add conversion from old to new
+public static implicit operator RunToken(RunState state) => new RunToken(state.Toplevel);
+
+// Mark old type obsolete
+[Obsolete("Use RunToken instead. RunState will be removed in a future version.")]
+public class RunState { ... }
+
+// Add new property
+public static bool StopAfterFirstIteration { get; set; }
+
+// Mark old property obsolete
+[Obsolete("Use StopAfterFirstIteration instead.")]
+public static bool EndAfterFirstIteration 
+{ 
+    get => StopAfterFirstIteration;
+    set => StopAfterFirstIteration = value;
+}
+```
 
 
-## Documentation Changes Required
+### Phase 2: Update Documentation
 
 
-1. **API Documentation**
-   - Update XML docs for all affected methods
-   - Add clear examples showing lifecycle
-   - Document the relationship between high-level `Run()` and low-level session APIs
+- Update all docs to use new terminology
+- Add migration guide
+- Explain the distinction between RunLoop and RunIteration
 
 
-2. **Conceptual Documentation**
-   - Create "Application Lifecycle" documentation page
-   - Add diagrams showing the flow
-   - Explain when to use `Run()` vs. low-level APIs
+### Phase 3: Update Examples
 
 
-3. **Migration Guide**
-   - Create mapping table (old โ†’ new)
-   - Provide before/after code examples
-   - Explain the rationale for changes
+- Examples use new APIs
+- Keep old examples in "legacy" section temporarily
 
 
-## Implementation Notes
+### Phase 4: Future Removal (Multiple Releases Later)
 
 
-### Backward Compatibility
+- After sufficient adoption period, consider removing obsolete APIs
+- Or keep them indefinitely with internal delegation
 
 
-- All existing APIs remain functional
-- Mark old APIs with `[Obsolete]` attributes
-- Provide clear upgrade path in obsolete messages
-- Consider keeping old APIs indefinitely with internal delegation to new ones
+## Alternative Naming Options
 
 
-### Internal Implementation
+### For RunState/RunToken
 
 
-- New APIs can delegate to existing implementation
-- Gradually refactor internals to use new terminology
-- Update variable names and comments to use new terms
+| Option | Pros | Cons | Recommendation |
+|--------|------|------|----------------|
+| `RunToken` | Clear it's a token, concise | New terminology | โญ Best |
+| `ExecutionContext` | Industry standard | Slightly longer | Good alternative |
+| `RunHandle` | Clear it's a handle | "Handle" sounds Win32-ish | Acceptable |
+| `RunContext` | Familiar pattern | "Context" overloaded in .NET | OK |
+| Keep `RunState` | No change needed | Remains misleading | Not recommended |
 
 
-### Testing
+### For EndAfterFirstIteration
 
 
-- Keep all existing tests working
-- Add new tests using new terminology
-- Test obsolete warnings work correctly
+| Option | Pros | Cons | Recommendation |
+|--------|------|------|----------------|
+| `StopAfterFirstIteration` | Aligns with RequestStop | Slightly longer | โญ Best |
+| `SingleIteration` | Shorter | Less obvious meaning | Good alternative |
+| `RunLoopOnce` | Very explicit | Awkward phrasing | OK |
+| Keep `EndAfterFirstIteration` | No change | Continues confusion | Not recommended |
 
 
 ## Comparison with Other Frameworks
 ## Comparison with Other Frameworks
 
 
-| Framework | Show View | Modal | Event Loop | Close |
-|-----------|-----------|-------|------------|-------|
-| **WPF** | `Show()` | `ShowDialog()` | `Dispatcher.Run()` | `Close()` |
-| **WinForms** | `Show()` | `ShowDialog()` | `Application.Run()` | `Close()` |
-| **Avalonia** | `Show()` | `ShowDialog()` | `Start()` | `Close()` |
-| **GTK** | `show()` | `run()` | `main()` | `close()` |
-| **Terminal.Gui v2 (current)** | `Run()` | `Run()` | `RunLoop()` | `RequestStop()` |
-| **Terminal.Gui v2 (proposed)** | `Run()` | `Run()` | `ProcessEvents()` | `StopProcessingEvents()` |
+**Token/Context Pattern:**
+- .NET: `CancellationToken` - token for cancellation scope
+- ASP.NET: `HttpContext` - context for HTTP request
+- Entity Framework: `DbContext` - context for database session
+- **Terminal.Gui:** `RunToken` (proposed) - token for execution scope
+
+**Loop Control Flags:**
+- WinForms: `Application.Exit()` - stops message loop
+- WPF: `Dispatcher.InvokeShutdown()` - stops dispatcher
+- **Terminal.Gui:** `RequestStop()` (keep), `StopAfterFirstIteration` (proposed)
 
 
 ## FAQ
 ## FAQ
 
 
-**Q: Why not just keep "Run"?**
-A: "Run" is too overloaded. It doesn't distinguish between the complete lifecycle and the event loop, leading to confusion about what `RunLoop`, `RunState`, and `RunIteration` mean.
+**Q: Why not change `Begin` and `End` to `BeginSession` and `EndSession`?**
 
 
-**Q: Why "Session" instead of "Context" or "Handle"?**
-A: "Session" best captures the bounded execution period. "Context" is overloaded in .NET (DbContext, HttpContext, etc.). "Handle" is too low-level and platform-specific.
+A: Per maintainer feedback, "Session" makes the names wordy without adding clarity. `Begin` and `End` are clear, concise, and work well as a lifecycle pair.
 
 
-**Q: What about breaking existing code?**
-A: We maintain complete backward compatibility by keeping old APIs and using `[Obsolete]` attributes. Users can migrate at their own pace.
+**Q: Why keep `RunLoop`?**
 
 
-**Q: Is this bikeshedding?**
-A: No. Clear terminology is essential for framework usability. The current confusion around "Run" causes real problems for users learning the framework.
+A: The distinction between `RunLoop` (starts the driver's mainloop) and `RunIteration` (one iteration) is important and well-understood. The "Run" prefix is not the primary source of confusion.
 
 
-**Q: Why not align exactly with WPF/WinForms?**
-A: Terminal.Gui has a different model - it exposes the event loop explicitly, which WPF/WinForms don't. We need terminology that fits our model while learning from established patterns.
+**Q: Why change `RunState`?**
+
+A: "State" implies the object holds state/data about the run. In reality, it's a token/handle for the Begin/End pairing. Calling it a "Token" or "Context" is more accurate.
+
+**Q: Why change `EndAfterFirstIteration`?**
+
+A: "End" in the flag name creates confusion with the `End()` method. The flag controls loop behavior, not lifecycle cleanup. "Stop" aligns better with `RequestStop` which also affects the loop.
+
+**Q: Is this bikeshedding?**
 
 
-## Conclusion
+A: No. These specific names (`RunState`, `EndAfterFirstIteration`) cause real confusion. The changes are minimal, focused, and address documented pain points while preserving what works.
 
 
-The proposed Session-Based terminology clarifies the Application execution lifecycle while maintaining backward compatibility. The new names are:
+## Summary
 
 
-- **More descriptive** - `ToplevelSession` vs `RunState`, `ProcessEvents` vs `RunLoop`
-- **More consistent** - `BeginSession`/`EndSession` pair, `ProcessEvents`/`StopProcessingEvents` pair
-- **More familiar** - Aligns with common patterns while respecting Terminal.Gui's unique architecture
-- **More maintainable** - Clear naming reduces cognitive load for contributors
+**Recommended Changes (Minimal Impact):**
 
 
-The migration path is straightforward, with minimal disruption to existing users.
+1. `RunState` โ†’ `RunToken` 
+2. `EndAfterFirstIteration` โ†’ `StopAfterFirstIteration`
 
 
----
+**Keep Unchanged:**
+- `Begin` / `End` - Clear and concise
+- `RequestStop` - Appropriately conveys non-blocking
+- `RunLoop` / `RunIteration` - Distinction is valuable
+- `Run()` - Familiar high-level API
 
 
-## Next Steps
+**Benefits:**
+- โœ… Eliminates the two primary sources of confusion
+- โœ… Maintains clarity of successful patterns
+- โœ… Minimal disruption (2 names only)
+- โœ… Complete backward compatibility via obsolete attributes
+- โœ… Respects maintainer feedback
 
 
-1. **Community Feedback** - Gather feedback on this proposal from maintainers and community
-2. **Refinement** - Adjust terminology based on feedback
-3. **Implementation Plan** - Create detailed implementation plan with milestones
-4. **Documentation** - Prepare comprehensive documentation updates
-5. **Migration** - Implement changes with proper obsolete warnings and guidance
+This focused approach addresses real problems without over-engineering the solution.

+ 140 - 196
TERMINOLOGY_QUICK_REFERENCE.md

@@ -1,258 +1,202 @@
-# Application Run Terminology - Quick Reference
+# Application.Run Terminology - Quick Reference
 
 
-## Current State (Confusing)
+## The Problem
 
 
-```
-Application.Run(toplevel)
-  โ”œโ”€ Application.Begin(toplevel) โ†’ RunState
-  โ”œโ”€ Application.RunLoop(RunState)
-  โ”‚   โ””โ”€ Application.RunIteration()
-  โ””โ”€ Application.End(RunState)
-```
+Current terminology has two specific issues:
 
 
-**Problems:**
-- "Run" means too many things (lifecycle, loop, method names)
-- "RunState" sounds like state data, but it's a token
-- "Begin/End" - begin/end what?
-- "RunLoop" vs "RunIteration" - relationship unclear
+1. **`RunState`** sounds like state data, but it's actually a token/handle
+2. **`EndAfterFirstIteration`** uses "End" but controls loop behavior, not lifecycle
 
 
-## Proposed (Clear) - Option 1: Session-Based โญ
+## Recommended Solution
 
 
-```
-Application.Run(toplevel)  // High-level API (unchanged)
-  โ”œโ”€ Application.BeginSession(toplevel) โ†’ ToplevelSession
-  โ”œโ”€ Application.ProcessEvents(ToplevelSession)
-  โ”‚   โ””โ”€ Application.ProcessEventsIteration()
-  โ””โ”€ Application.EndSession(ToplevelSession)
-```
+### Minimal Changes
 
 
-**Benefits:**
-- "Session" clearly indicates bounded execution period
-- "ProcessEvents" describes what the loop does
-- "BeginSession/EndSession" are unambiguous pairs
-- "ToplevelSession" clearly indicates a session token
+| Current | Proposed | Why |
+|---------|----------|-----|
+| `RunState` | `RunToken` | Clear it's a token, not state data |
+| `EndAfterFirstIteration` | `StopAfterFirstIteration` | "Stop" aligns with `RequestStop`, clearly about loop control |
 
 
-## Proposed (Clear) - Option 2: Modal/Show
+### Keep Unchanged
 
 
-```
-Application.ShowModal(toplevel)  // or keep Run()
-  โ”œโ”€ Application.Activate(toplevel) โ†’ ToplevelHandle
-  โ”œโ”€ Application.EventLoop(ToplevelHandle)
-  โ”‚   โ””โ”€ Application.ProcessEvents()
-  โ””โ”€ Application.Deactivate(ToplevelHandle)
-```
+| API | Why It Works |
+|-----|--------------|
+| `Begin` / `End` | Clear, concise lifecycle pairing |
+| `RequestStop` | "Request" appropriately conveys non-blocking |
+| `RunLoop` / `RunIteration` | Distinction is important: RunLoop starts the driver's mainloop, RunIteration processes one iteration |
 
 
-**Benefits:**
-- Aligns with WPF/WinForms patterns
-- "Activate/Deactivate" are familiar GUI concepts
-- "EventLoop" is industry standard terminology
+## Usage Comparison
 
 
-## Proposed (Clear) - Option 3: Lifecycle
+### Current (Confusing)
 
 
-```
-Application.Run(toplevel)
-  โ”œโ”€ Application.Start(toplevel) โ†’ ExecutionContext
-  โ”œโ”€ Application.Execute(ExecutionContext)
-  โ”‚   โ””โ”€ Application.Tick()
-  โ””โ”€ Application.Stop(ExecutionContext)
+```csharp
+// What is RunState? State data or a handle?
+RunState rs = Application.Begin(window);
+Application.RunLoop(rs);
+Application.End(rs);
+
+// Does this call End()? No, it controls RunLoop()
+Application.EndAfterFirstIteration = true;
 ```
 ```
 
 
-**Benefits:**
-- Explicit lifecycle phases (Start โ†’ Execute โ†’ Stop)
-- "Tick" is familiar from game development
-- Simple, clear verbs
+### Proposed (Clear)
 
 
-## Side-by-Side Comparison
+```csharp
+// Clearly a token, not state data
+RunToken token = Application.Begin(window);
+Application.RunLoop(token);
+Application.End(token);
 
 
-| Concept | Current | Option 1 (Session) โญ | Option 2 (Modal) | Option 3 (Lifecycle) |
-|---------|---------|---------------------|------------------|---------------------|
-| Complete lifecycle | `Run()` | `Run()` | `ShowModal()` or `Run()` | `Run()` |
-| Session token | `RunState` | `ToplevelSession` | `ToplevelHandle` | `ExecutionContext` |
-| Initialize | `Begin()` | `BeginSession()` | `Activate()` | `Start()` |
-| Event loop | `RunLoop()` | `ProcessEvents()` | `EventLoop()` | `Execute()` |
-| One iteration | `RunIteration()` | `ProcessEventsIteration()` | `ProcessEvents()` | `Tick()` |
-| Cleanup | `End()` | `EndSession()` | `Deactivate()` | `Stop()` |
-| Stop loop | `RequestStop()` | `StopProcessingEvents()` | `Close()` or `RequestStop()` | `RequestStop()` |
-| Stop mode flag | `EndAfterFirstIteration` | `StopAfterFirstIteration` | `SingleIteration` | `StopAfterFirstTick` |
+// Clearly controls loop stopping, aligns with RequestStop
+Application.StopAfterFirstIteration = true;
+```
 
 
-## Usage Examples
+## Understanding RunLoop vs RunIteration
 
 
-### High-Level (All Options - Unchanged)
+**Important distinction to preserve:**
 
 
-```csharp
-// Simple case - most users use this
-Application.Init();
-Application.Run(myWindow);
-Application.Shutdown();
+```
+RunLoop(token):          RunIteration(token):
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚ Starts driver's  โ”‚     โ”‚ Processes ONE    โ”‚
+โ”‚ MainLoop         โ”‚     โ”‚ iteration:       โ”‚
+โ”‚                  โ”‚     โ”‚  - Events        โ”‚
+โ”‚ Loops calling:   โ”‚     โ”‚  - Layout        โ”‚
+โ”‚  RunIteration()  โ”‚     โ”‚  - Draw          โ”‚
+โ”‚  RunIteration()  โ”‚     โ”‚                  โ”‚
+โ”‚  ...             โ”‚     โ”‚ Returns          โ”‚
+โ”‚                  โ”‚     โ”‚ immediately      โ”‚
+โ”‚ Until stopped    โ”‚     โ”‚                  โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
 ```
 ```
 
 
-### Low-Level - Current (Confusing)
-
-```csharp
-Application.Init();
+This distinction is valuable and should be kept.
 
 
-RunState runState = Application.Begin(myWindow);  // Begin what?
-Application.RunLoop(runState);                     // Run vs RunLoop?
-Application.End(runState);                         // End what?
+## Complete API Overview
 
 
-Application.Shutdown();
 ```
 ```
+Application.Run(window)        โ† High-level: complete lifecycle
+  โ”œโ”€ Application.Begin(window) โ†’ RunToken
+  โ”‚    โ””โ”€ Initialize, layout, draw
+  โ”œโ”€ Application.RunLoop(token)
+  โ”‚    โ””โ”€ Loop: while(running) { RunIteration() }
+  โ””โ”€ Application.End(token)
+       โ””โ”€ Cleanup
 
 
-### Low-Level - Option 1: Session-Based โญ
+Application.RunIteration(ref token) โ† Low-level: one iteration
 
 
-```csharp
-Application.Init();
+Application.RequestStop()       โ† Signal loop to stop
+Application.StopAfterFirstIteration โ† Mode: stop after 1 iteration
+```
 
 
-ToplevelSession session = Application.BeginSession(myWindow);  // Clear: starting a session
-Application.ProcessEvents(session);                             // Clear: processing events
-Application.EndSession(session);                                // Clear: ending the session
+## Alternative Options Considered
 
 
-Application.Shutdown();
-```
+### For RunState
 
 
-### Low-Level - Option 2: Modal/Show
+| Option | Pros | Cons |
+|--------|------|------|
+| **RunToken** โญ | Clear, concise | New term |
+| ExecutionContext | Industry standard | Longer |
+| RunHandle | Clear | Win32-ish |
 
 
-```csharp
-Application.Init();
+### For EndAfterFirstIteration
 
 
-ToplevelHandle handle = Application.Activate(myWindow);  // Clear: activating for display
-Application.EventLoop(handle);                           // Clear: running event loop
-Application.Deactivate(handle);                          // Clear: deactivating
+| Option | Pros | Cons |
+|--------|------|------|
+| **StopAfterFirstIteration** โญ | Aligns with RequestStop | Slightly longer |
+| SingleIteration | Shorter | Less obvious |
+| RunLoopOnce | Explicit | Awkward |
 
 
-Application.Shutdown();
-```
+## Migration Example
 
 
-### Low-Level - Option 3: Lifecycle
+### Backward Compatible Migration
 
 
 ```csharp
 ```csharp
-Application.Init();
-
-ExecutionContext context = Application.Start(myWindow);  // Clear: starting execution
-Application.Execute(context);                            // Clear: executing
-Application.Stop(context);                               // Clear: stopping
+// Old code continues to work with obsolete warnings
+[Obsolete("Use RunToken instead")]
+public class RunState { ... }
+
+[Obsolete("Use StopAfterFirstIteration instead")]
+public static bool EndAfterFirstIteration 
+{ 
+    get => StopAfterFirstIteration;
+    set => StopAfterFirstIteration = value;
+}
 
 
-Application.Shutdown();
+// New code uses clearer names
+public class RunToken { ... }
+public static bool StopAfterFirstIteration { get; set; }
 ```
 ```
 
 
-## Manual Event Loop Control
-
-### Current (Confusing)
+### User Migration
 
 
 ```csharp
 ```csharp
-RunState rs = Application.Begin(myWindow);
+// Before
+RunState rs = Application.Begin(window);
 Application.EndAfterFirstIteration = true;
 Application.EndAfterFirstIteration = true;
-
-while (!done)
-{
-    Application.RunIteration(ref rs, firstIteration);  // What's RunIteration vs RunLoop?
-    firstIteration = false;
-    // Do custom processing...
-}
-
+Application.RunLoop(rs);
 Application.End(rs);
 Application.End(rs);
-```
-
-### Option 1: Session-Based (Clear) โญ
 
 
-```csharp
-ToplevelSession session = Application.BeginSession(myWindow);
+// After (simple find/replace)
+RunToken token = Application.Begin(window);
 Application.StopAfterFirstIteration = true;
 Application.StopAfterFirstIteration = true;
-
-while (!done)
-{
-    Application.ProcessEventsIteration(ref session, firstIteration);  // Clear: process one iteration
-    firstIteration = false;
-    // Do custom processing...
-}
-
-Application.EndSession(session);
+Application.RunLoop(token);
+Application.End(token);
 ```
 ```
 
 
-### Option 2: Modal/Show (Clear)
+## Why These Changes?
 
 
-```csharp
-ToplevelHandle handle = Application.Activate(myWindow);
-Application.SingleIteration = true;
-
-while (!done)
-{
-    Application.ProcessEvents(ref handle, firstIteration);  // Clear: process events
-    firstIteration = false;
-    // Do custom processing...
-}
+### RunState โ†’ RunToken
 
 
-Application.Deactivate(handle);
-```
+**Problem:** Users see "State" and think it holds state data. They ask:
+- "What state does it hold?"
+- "Can I query the state?"
+- "Is it like a state machine?"
 
 
-### Option 3: Lifecycle (Clear)
+**Solution:** "Token" clearly indicates it's an identity/handle for Begin/End pairing, like `CancellationToken`.
 
 
-```csharp
-ExecutionContext context = Application.Start(myWindow);
-Application.StopAfterFirstTick = true;
-
-while (!done)
-{
-    Application.Tick(ref context, firstIteration);  // Clear: one tick
-    firstIteration = false;
-    // Do custom processing...
-}
+### EndAfterFirstIteration โ†’ StopAfterFirstIteration
 
 
-Application.Stop(context);
-```
+**Problem:** Users see "End" and think of `End()` method. They ask:
+- "Does this call `End()`?"
+- "Why is it called 'End' when it controls the loop?"
 
 
-## Recommendation: Option 1 (Session-Based)
+**Solution:** "Stop" aligns with `RequestStop` and clearly indicates loop control, not lifecycle cleanup.
 
 
-**Why Session-Based wins:**
-1. โœ… Most accurate - "session" perfectly describes bounded execution
-2. โœ… Least disruptive - keeps Begin/End pattern, just clarifies it
-3. โœ… Most descriptive - "ProcessEvents" is clearer than "RunLoop"
-4. โœ… Industry standard - "session" is widely understood in software
-5. โœ… Extensible - easy to add session-related features later
+## What We're NOT Changing
 
 
-**Implementation:**
-- Add new APIs alongside existing ones
-- Mark old APIs `[Obsolete]` with helpful messages
-- Update docs to use new terminology
-- Maintain backward compatibility indefinitely
+### Begin / End
 
 
-## Related Concepts
+โœ… **Keep as-is** - Clear, concise lifecycle pairing
+- Not wordy
+- Industry standard pattern (BeginInvoke/EndInvoke, etc.)
+- Works well
 
 
-### Application Lifecycle
+### RequestStop
 
 
-```
-Application.Init()           // Initialize the application
-  โ”œโ”€ Create driver
-  โ”œโ”€ Setup screen
-  โ””โ”€ Initialize subsystems
-
-Application.Run(toplevel)    // Run a toplevel (modal)
-  โ”œโ”€ BeginSession
-  โ”œโ”€ ProcessEvents
-  โ””โ”€ EndSession
-
-Application.Shutdown()       // Shutdown the application
-  โ”œโ”€ Cleanup resources
-  โ””โ”€ Restore terminal
-```
+โœ… **Keep as-is** - Appropriately conveys non-blocking nature
+- "Request" indicates it doesn't block
+- Clear about what it does
+- Works well
 
 
-### Session vs Application Lifecycle
+### RunLoop / RunIteration
 
 
-| Application Lifecycle | Session Lifecycle |
-|----------------------|-------------------|
-| `Init()` - Once per app | `BeginSession()` - Per toplevel |
-| `Run()` - Can have multiple | `ProcessEvents()` - Within one session |
-| `Shutdown()` - Once per app | `EndSession()` - Per toplevel |
+โœ… **Keep as-is** - Distinction is important and understood
+- RunLoop = starts the driver's mainloop (blocking)
+- RunIteration = processes one iteration (immediate)
+- The distinction is valuable
+- "Run" prefix is OK when the difference is clear
 
 
-## Events and Notifications
+## Summary
 
 
-| Current | Proposed (Option 1) |
-|---------|---------------------|
-| `NotifyNewRunState` | `NotifyNewSession` |
-| `NotifyStopRunState` | `NotifyStopSession` |
-| `RunStateEventArgs` | `ToplevelSessionEventArgs` |
+**Changes (2 names only):**
+- `RunState` โ†’ `RunToken`
+- `EndAfterFirstIteration` โ†’ `StopAfterFirstIteration`
 
 
-## See Also
+**Benefits:**
+- โœ… Addresses the two primary sources of confusion
+- โœ… Minimal disruption
+- โœ… Backward compatible
+- โœ… Respects maintainer feedback
+- โœ… Preserves what works well
 
 
-- [Full Proposal Document](TERMINOLOGY_PROPOSAL.md) - Detailed rationale and analysis
-- [Migration Guide](docs/migration-guide.md) - How to update your code (TODO)
-- [API Reference](docfx/api/Terminal.Gui.App.Application.yml) - API documentation
+See [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md) for detailed analysis.

+ 0 - 254
TERMINOLOGY_README.md

@@ -1,254 +0,0 @@
-# Application.Run Terminology Proposal - README
-
-This directory contains a comprehensive proposal for improving the terminology around `Application.Run` and related APIs in Terminal.Gui.
-
-## ๐Ÿ“‹ Documents
-
-### 1. [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md)
-**Complete proposal with detailed analysis**
-
-Contents:
-- Executive Summary
-- Problem Statement (why current terminology is confusing)
-- Current Terminology Analysis
-- Three proposed options with pros/cons
-- Recommendation: Option 1 (Session-Based)
-- Migration strategy
-- Documentation changes required
-- FAQ
-
-**Start here** for the full context and rationale.
-
-### 2. [TERMINOLOGY_QUICK_REFERENCE.md](TERMINOLOGY_QUICK_REFERENCE.md)
-**Quick comparison tables and code examples**
-
-Contents:
-- Current vs Proposed (all 3 options)
-- Side-by-side comparison table
-- Usage examples for each option
-- Manual event loop control examples
-- High-level vs low-level API comparison
-
-**Use this** for quick lookup and comparison.
-
-### 3. [TERMINOLOGY_INDUSTRY_COMPARISON.md](TERMINOLOGY_INDUSTRY_COMPARISON.md)
-**How Terminal.Gui compares to other frameworks**
-
-Contents:
-- Comparison with WPF, WinForms, Avalonia, GTK, Qt
-- Web framework patterns (ASP.NET, Entity Framework)
-- Game engine patterns (Unity, Unreal)
-- Industry standard terminology analysis
-- Why "Session" is the right choice
-
-**Read this** to understand industry context.
-
-### 4. [TERMINOLOGY_VISUAL_GUIDE.md](TERMINOLOGY_VISUAL_GUIDE.md)
-**Visual diagrams and flowcharts**
-
-Contents:
-- Visual comparison of current vs proposed
-- Lifecycle diagrams
-- Event flow diagrams
-- Nested sessions (modal dialogs)
-- Complete example flows
-- Benefits visualization
-
-**Use this** for visual learners and presentations.
-
-## ๐ŸŽฏ The Problem
-
-The current `Application.Run` terminology is confusing:
-
-```csharp
-// What's the difference between these "Run" methods?
-Application.Run(window);           // Complete lifecycle
-Application.RunLoop(runState);     // Event loop
-Application.RunIteration();        // One iteration
-
-// What is RunState? State or a handle?
-RunState runState = Application.Begin(window);  // Begin what?
-
-// What's ending?
-Application.End(runState);  // End what?
-```
-
-**Result:** Confused users, steeper learning curve, unclear documentation.
-
-## โœ… The Solution
-
-### Option 1: Session-Based Terminology (Recommended)
-
-```csharp
-// High-level API (unchanged)
-Application.Run(window);  // Simple and familiar
-
-// Low-level API (clearer names)
-ToplevelSession session = Application.BeginSession(window);    // โœ… Clear
-Application.ProcessEvents(session);                            // โœ… Clear
-Application.EndSession(session);                               // โœ… Clear
-```
-
-**Why this wins:**
-- โœ… "Session" accurately describes bounded execution
-- โœ… "ProcessEvents" is explicit about what happens
-- โœ… "BeginSession/EndSession" are unambiguous
-- โœ… Aligns with industry patterns (HttpContext, DbContext)
-- โœ… Minimal disruption to existing API
-
-### Complete Mapping
-
-| Current | Proposed | Why |
-|---------|----------|-----|
-| `Run()` | `Run()` | Keep - familiar |
-| `RunState` | `ToplevelSession` | Clear it's a session token |
-| `Begin()` | `BeginSession()` | Clear what's beginning |
-| `RunLoop()` | `ProcessEvents()` | Describes the action |
-| `RunIteration()` | `ProcessEventsIteration()` | Consistent |
-| `End()` | `EndSession()` | Clear what's ending |
-| `RequestStop()` | `StopProcessingEvents()` | Explicit |
-
-## ๐Ÿ“Š Comparison Matrix
-
-| Criterion | Current | Proposed (Option 1) |
-|-----------|---------|---------------------|
-| **Clarity** | โš ๏ธ "Run" overloaded | โœ… Each term is distinct |
-| **Accuracy** | โš ๏ธ "State" is misleading | โœ… "Session" is accurate |
-| **Learnability** | โš ๏ธ Steep curve | โœ… Self-documenting |
-| **Industry Alignment** | โš ๏ธ Unique terminology | โœ… Standard patterns |
-| **Breaking Changes** | N/A | โœ… None (old APIs kept) |
-
-## ๐Ÿš€ Migration Path
-
-### Phase 1: Add New APIs (Release 1)
-```csharp
-// Add new APIs
-public static ToplevelSession BeginSession(Toplevel toplevel) { ... }
-
-// Mark old APIs obsolete
-[Obsolete("Use BeginSession instead. See TERMINOLOGY_PROPOSAL.md")]
-public static RunState Begin(Toplevel toplevel) { ... }
-```
-
-### Phase 2: Update Documentation (Release 1-2)
-- Update all docs to use new terminology
-- Add migration guide
-- Update examples
-
-### Phase 3: Community Adoption (Release 2-4)
-- Examples use new APIs
-- Community feedback period
-- Adjust based on feedback
-
-### Phase 4: Consider Removal (Release 5+)
-- After 2-3 releases, consider removing `[Obsolete]` APIs
-- Or keep them indefinitely with internal delegation
-
-## ๐Ÿ’ก Key Insights
-
-### 1. High-Level API Unchanged
-Most users won't be affected:
-```csharp
-Application.Init();
-Application.Run(window);  // Still works exactly the same
-Application.Shutdown();
-```
-
-### 2. Low-Level API Clarified
-Advanced users get clearer APIs:
-```csharp
-// Before (confusing)
-var rs = Application.Begin(window);
-Application.RunLoop(rs);
-Application.End(rs);
-
-// After (clear)
-var session = Application.BeginSession(window);
-Application.ProcessEvents(session);
-Application.EndSession(session);
-```
-
-### 3. Complete Backward Compatibility
-```csharp
-// Old code continues to work
-RunState rs = Application.Begin(window);  // Works, but obsolete warning
-Application.RunLoop(rs);                   // Works, but obsolete warning
-Application.End(rs);                       // Works, but obsolete warning
-```
-
-## ๐Ÿ“ˆ Benefits
-
-### For Users
-- โœ… **Faster learning** - Self-documenting APIs
-- โœ… **Less confusion** - Clear, distinct names
-- โœ… **Better understanding** - Matches mental model
-
-### For Maintainers
-- โœ… **Easier to explain** - Clear terminology in docs
-- โœ… **Fewer questions** - Users understand the pattern
-- โœ… **Better code** - Internal code can use clearer names
-
-### For the Project
-- โœ… **Professional** - Aligns with industry standards
-- โœ… **Accessible** - Lower barrier to entry
-- โœ… **Maintainable** - Clearer code is easier to maintain
-
-## ๐Ÿค” Alternatives Considered
-
-### Option 2: Modal/Show Terminology
-```csharp
-Application.ShowModal(window);
-var handle = Application.Activate(window);
-Application.EventLoop(handle);
-Application.Deactivate(handle);
-```
-**Rejected:** Doesn't fit Terminal.Gui's model well.
-
-### Option 3: Lifecycle Terminology
-```csharp
-var context = Application.Start(window);
-Application.Execute(context);
-Application.Stop(context);
-```
-**Rejected:** Breaks Begin/End pattern, "Execute" less explicit.
-
-See [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md) for full analysis.
-
-## ๐Ÿ“š Additional Resources
-
-### Terminal.Gui Documentation
-- [Application Class](https://gui-cs.github.io/Terminal.Gui/api/Terminal.Gui.App.Application.html)
-- [Multitasking Guide](docfx/docs/multitasking.md)
-
-### Related Issues
-- Issue #4329 - Original discussion about Run terminology
-
-## ๐Ÿ—ณ๏ธ Community Feedback
-
-We welcome feedback on this proposal:
-
-1. **Preferred option?** Session-Based, Modal/Show, or Lifecycle?
-2. **Better names?** Suggest alternatives
-3. **Migration concerns?** Share your use cases
-4. **Timeline?** How long do you need to migrate?
-
-## ๐Ÿ“ž Contact
-
-For questions or feedback:
-- Open an issue in the Terminal.Gui repository
-- Comment on the PR associated with this proposal
-- Join the discussion in the community forums
-
-## ๐Ÿ“„ License
-
-This proposal is part of the Terminal.Gui project and follows the same license (MIT).
-
----
-
-**Status:** ๐Ÿ“ Proposal (awaiting community feedback)
-
-**Author:** GitHub Copilot (generated based on issue #4329)
-
-**Date:** 2025-10-25
-
-**Version:** 1.0

+ 267 - 386
TERMINOLOGY_VISUAL_GUIDE.md

@@ -1,438 +1,319 @@
 # Application.Run Terminology - Visual Guide
 # Application.Run Terminology - Visual Guide
 
 
-This document provides visual representations of the Application execution lifecycle to clarify the terminology.
+## The Two Problems
 
 
-## Current Terminology (Confusing)
-
-### The Problem: "Run" Everywhere
+### Problem 1: RunState Sounds Like State Data
 
 
 ```
 ```
-โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-โ”‚                   Application.Run()                     โ”‚  โ† High-level API
-โ”‚                                                         โ”‚
-โ”‚  "Run" means the complete lifecycle                    โ”‚
-โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚   Application.Begin(toplevel)   โ”‚  โ† "Begin" what?
-        โ”‚                                 โ”‚
-        โ”‚   Returns: RunState             โ”‚  โ† Sounds like state data
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚  Application.RunLoop(runState)  โ”‚  โ† "Run" again? Run vs RunLoop?
-        โ”‚                                 โ”‚
-        โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
-        โ”‚  โ”‚ while (running)           โ”‚ โ”‚
-        โ”‚  โ”‚   RunIteration()          โ”‚ โ”‚  โ† "Run" again? What's the difference?
-        โ”‚  โ”‚     ProcessInput()        โ”‚ โ”‚
-        โ”‚  โ”‚     Layout/Draw()         โ”‚ โ”‚
-        โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚   Application.End(runState)     โ”‚  โ† "End" what?
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Issues:
-โŒ "Run" appears 4 times meaning different things
-โŒ RunState sounds like state, but it's a token
-โŒ Begin/End don't clarify what's beginning/ending
-โŒ RunLoop vs RunIteration relationship unclear
+Current (Confusing):
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunState rs = Begin(window);      โ”‚  โ† "State"? What state does it hold?
+โ”‚                                     โ”‚
+โ”‚  Application.RunLoop(rs);           โ”‚
+โ”‚                                     โ”‚
+โ”‚  Application.End(rs);               โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+Users think: "What state information does RunState contain?"
+Reality: It's a token/handle for the Begin/End pairing
+
+
+Proposed (Clear):
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunToken token = Begin(window);    โ”‚  โœ… Clear: it's a token, not state
+โ”‚                                     โ”‚
+โ”‚  Application.RunLoop(token);        โ”‚
+โ”‚                                     โ”‚
+โ”‚  Application.End(token);            โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+Users understand: "It's a token for the Begin/End pairing"
 ```
 ```
 
 
-## Proposed Terminology - Option 1: Session-Based โญ
-
-### The Solution: Clear, Explicit Names
-
-```
-โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-โ”‚                   Application.Run()                     โ”‚  โ† High-level (unchanged)
-โ”‚                                                         โ”‚
-โ”‚  Complete lifecycle: Begin + ProcessEvents + End       โ”‚
-โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚ Application.BeginSession(toplevel)  โ”‚  โœ… Clear: starting a session
-        โ”‚                                     โ”‚
-        โ”‚ Returns: ToplevelSession            โ”‚  โœ… Clear: it's a session token
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚ Application.ProcessEvents(session)  โ”‚  โœ… Clear: processing events
-        โ”‚                                     โ”‚
-        โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
-        โ”‚  โ”‚ while (running)              โ”‚  โ”‚
-        โ”‚  โ”‚   ProcessEventsIteration()   โ”‚  โ”‚  โœ… Clear: one iteration of processing
-        โ”‚  โ”‚     ProcessInput()           โ”‚  โ”‚
-        โ”‚  โ”‚     Layout/Draw()            โ”‚  โ”‚
-        โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                          โ”‚
-                          โ–ผ
-        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-        โ”‚  Application.EndSession(session)    โ”‚  โœ… Clear: ending the session
-        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Benefits:
-โœ… "Session" clearly indicates bounded execution
-โœ… "ProcessEvents" describes the action
-โœ… BeginSession/EndSession are unambiguous
-โœ… Terminology is consistent and clear
-```
-
-## Lifecycle Comparison
-
-### Application Lifecycle (Init/Shutdown) vs Session Lifecycle (Begin/ProcessEvents/End)
+### Problem 2: EndAfterFirstIteration Confuses End() with Loop Control
 
 
 ```
 ```
-โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Application Lifetime โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-โ”‚                                                                           โ”‚
-โ”‚  Application.Init()          โ† Initialize once per application           โ”‚
-โ”‚      โ”œโ”€ Create driver                                                    โ”‚
-โ”‚      โ”œโ”€ Initialize screen                                                โ”‚
-โ”‚      โ””โ”€ Setup subsystems                                                 โ”‚
-โ”‚                                                                           โ”‚
-โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Session 1 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
-โ”‚  โ”‚  Application.BeginSession(window1) โ†’ session1             โ”‚          โ”‚
-โ”‚  โ”‚      โ”œโ”€ Initialize window1                                โ”‚          โ”‚
-โ”‚  โ”‚      โ”œโ”€ Layout window1                                    โ”‚          โ”‚
-โ”‚  โ”‚      โ””โ”€ Draw window1                                      โ”‚          โ”‚
-โ”‚  โ”‚                                                            โ”‚          โ”‚
-โ”‚  โ”‚  Application.ProcessEvents(session1)                      โ”‚          โ”‚
-โ”‚  โ”‚      โ””โ”€ Event loop until RequestStop()                    โ”‚          โ”‚
-โ”‚  โ”‚                                                            โ”‚          โ”‚
-โ”‚  โ”‚  Application.EndSession(session1)                         โ”‚          โ”‚
-โ”‚  โ”‚      โ””โ”€ Cleanup window1                                   โ”‚          โ”‚
-โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
-โ”‚                                                                           โ”‚
-โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Session 2 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
-โ”‚  โ”‚  Application.BeginSession(dialog) โ†’ session2              โ”‚          โ”‚
-โ”‚  โ”‚  Application.ProcessEvents(session2)                      โ”‚          โ”‚
-โ”‚  โ”‚  Application.EndSession(session2)                         โ”‚          โ”‚
-โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
-โ”‚                                                                           โ”‚
-โ”‚  Application.Shutdown()      โ† Cleanup once per application              โ”‚
-โ”‚      โ”œโ”€ Dispose driver                                                   โ”‚
-โ”‚      โ””โ”€ Restore terminal                                                 โ”‚
-โ”‚                                                                           โ”‚
-โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Key Insight: Multiple sessions within one application lifetime
+Current (Confusing):
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  EndAfterFirstIteration = true;          โ”‚  โ† "End"? Like End() method?
+โ”‚                                          โ”‚
+โ”‚  RunState rs = Begin(window);            โ”‚
+โ”‚                                          โ”‚
+โ”‚  RunLoop(rs);  // Stops after 1 iterationโ”‚
+โ”‚                                          โ”‚
+โ”‚  End(rs);      // This is "End"          โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+Users think: "Does EndAfterFirstIteration call End()?"
+Reality: It controls RunLoop() behavior, not End()
+
+
+Proposed (Clear):
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  StopAfterFirstIteration = true;         โ”‚  โœ… Clear: controls loop stopping
+โ”‚                                          โ”‚
+โ”‚  RunToken token = Begin(window);         โ”‚
+โ”‚                                          โ”‚
+โ”‚  RunLoop(token);  // Stops after 1 iter  โ”‚
+โ”‚                                          โ”‚
+โ”‚  End(token);      // Cleanup             โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+Users understand: "Stop controls the loop, End cleans up"
 ```
 ```
 
 
-## Event Flow During ProcessEvents
+## Understanding RunLoop vs RunIteration
 
 
-### Current (Confusing)
+**This distinction is valuable and should be preserved:**
 
 
 ```
 ```
-RunLoop(runState)
-    โ”‚
-    โ””โ”€> while (toplevel.Running)
-            โ”‚
-            โ”œโ”€> RunIteration(runState)    โ† What's the difference?
-            โ”‚       โ”‚
-            โ”‚       โ”œโ”€> MainLoop.RunIteration()
-            โ”‚       โ”‚       โ””โ”€> Process driver events
-            โ”‚       โ”‚
-            โ”‚       โ”œโ”€> Layout (if needed)
-            โ”‚       โ””โ”€> Draw (if needed)
-            โ”‚
-            โ””โ”€> (repeat)
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚                  RunLoop(token)                         โ”‚
+โ”‚                                                         โ”‚
+โ”‚  Starts the driver's MainLoop                           โ”‚
+โ”‚  Loops until stopped:                                   โ”‚
+โ”‚                                                         โ”‚
+โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
+โ”‚  โ”‚  while (toplevel.Running)                      โ”‚    โ”‚
+โ”‚  โ”‚  {                                             โ”‚    โ”‚
+โ”‚  โ”‚      RunIteration(ref token);  โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚    โ”‚
+โ”‚  โ”‚      RunIteration(ref token);  โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚    โ”‚
+โ”‚  โ”‚      RunIteration(ref token);  โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚    โ”‚
+โ”‚  โ”‚      ...                                  โ”‚    โ”‚    โ”‚
+โ”‚  โ”‚  }                                        โ”‚    โ”‚    โ”‚
+โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
+โ”‚                                                         โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+                                                  โ”‚
+                                                  โ”‚
+                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+                                    โ”‚  RunIteration(ref token)    โ”‚
+                                    โ”‚                             โ”‚
+                                    โ”‚  Processes ONE iteration:   โ”‚
+                                    โ”‚   1. Process driver events  โ”‚
+                                    โ”‚   2. Layout (if needed)     โ”‚
+                                    โ”‚   3. Draw (if needed)       โ”‚
+                                    โ”‚                             โ”‚
+                                    โ”‚  Returns immediately        โ”‚
+                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+Key Insight: 
+- RunLoop = The LOOP itself (blocking, manages iterations)
+- RunIteration = ONE iteration (immediate, processes events)
 ```
 ```
 
 
-### Proposed (Clear)
+## Complete Lifecycle Visualization
 
 
 ```
 ```
-ProcessEvents(session)
-    โ”‚
-    โ””โ”€> while (toplevel.Running)
-            โ”‚
-            โ”œโ”€> ProcessEventsIteration(session)  โœ… Clear: one iteration of event processing
-            โ”‚       โ”‚
-            โ”‚       โ”œโ”€> MainLoop.RunIteration()
-            โ”‚       โ”‚       โ””โ”€> Process driver events
-            โ”‚       โ”‚
-            โ”‚       โ”œโ”€> Layout (if needed)
-            โ”‚       โ””โ”€> Draw (if needed)
-            โ”‚
-            โ””โ”€> (repeat)
+Application.Run(window)
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚                                                       โ”‚
+โ”‚  1. Begin(window) โ†’ RunToken                          โ”‚
+โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
+โ”‚     โ”‚ โ€ข Initialize window             โ”‚              โ”‚
+โ”‚     โ”‚ โ€ข Layout views                  โ”‚              โ”‚
+โ”‚     โ”‚ โ€ข Draw to screen                โ”‚              โ”‚
+โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
+โ”‚                                                       โ”‚
+โ”‚  2. RunLoop(token)                                    โ”‚
+โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
+โ”‚     โ”‚ Start driver's MainLoop         โ”‚              โ”‚
+โ”‚     โ”‚                                 โ”‚              โ”‚
+โ”‚     โ”‚ while (Running) {               โ”‚              โ”‚
+โ”‚     โ”‚   RunIteration(ref token)       โ”‚              โ”‚
+โ”‚     โ”‚     โ”œโ”€ Process events           โ”‚              โ”‚
+โ”‚     โ”‚     โ”œโ”€ Layout (if needed)       โ”‚              โ”‚
+โ”‚     โ”‚     โ””โ”€ Draw (if needed)         โ”‚              โ”‚
+โ”‚     โ”‚ }                               โ”‚              โ”‚
+โ”‚     โ”‚                                 โ”‚              โ”‚
+โ”‚     โ”‚ Exits when:                     โ”‚              โ”‚
+โ”‚     โ”‚  - RequestStop() called         โ”‚              โ”‚
+โ”‚     โ”‚  - StopAfterFirstIteration=true โ”‚              โ”‚
+โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
+โ”‚                                                       โ”‚
+โ”‚  3. End(token)                                        โ”‚
+โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
+โ”‚     โ”‚ โ€ข Cleanup window                โ”‚              โ”‚
+โ”‚     โ”‚ โ€ข Dispose token                 โ”‚              โ”‚
+โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
+โ”‚                                                       โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
 ```
 ```
 
 
 ## Manual Control Pattern
 ## Manual Control Pattern
 
 
-When you need fine-grained control over the event loop:
-
-### Current (Confusing)
+When you need fine-grained control:
 
 
 ```
 ```
-RunState rs = Begin(toplevel);        โ† Begin what?
-EndAfterFirstIteration = true;        โ† End what?
-
-while (!done)
-{
-    RunIteration(ref rs, first);      โ† Run what? How does this relate to RunLoop?
-    first = false;
-    
-    // Custom processing
-    DoMyCustomStuff();
-}
-
-End(rs);                              โ† End what?
-```
-
-### Proposed (Clear)
-
-```
-ToplevelSession session = BeginSession(toplevel);     โœ… Clear: starting a session
-StopAfterFirstIteration = true;                       โœ… Clear: stop after one iteration
-
-while (!done)
-{
-    ProcessEventsIteration(ref session, first);       โœ… Clear: process one iteration
-    first = false;
-    
-    // Custom processing
-    DoMyCustomStuff();
-}
-
-EndSession(session);                                  โœ… Clear: ending the session
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunToken token = Begin(window);           โ”‚
+โ”‚  StopAfterFirstIteration = true;           โ”‚  โœ… Clear: stop after one iter
+โ”‚                                            โ”‚
+โ”‚  while (!myCondition)                      โ”‚
+โ”‚  {                                         โ”‚
+โ”‚      // Process one iteration              โ”‚
+โ”‚      RunIteration(ref token, first);       โ”‚
+โ”‚      first = false;                        โ”‚
+โ”‚                                            โ”‚
+โ”‚      // Your custom logic here             โ”‚
+โ”‚      DoCustomProcessing();                 โ”‚
+โ”‚  }                                         โ”‚
+โ”‚                                            โ”‚
+โ”‚  End(token);                               โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+vs Old (Confusing):
+
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunState rs = Begin(window);              โ”‚
+โ”‚  EndAfterFirstIteration = true;            โ”‚  โŒ Confusing: sounds like End()
+โ”‚                                            โ”‚
+โ”‚  while (!myCondition)                      โ”‚
+โ”‚  {                                         โ”‚
+โ”‚      RunIteration(ref rs, first);          โ”‚
+โ”‚      first = false;                        โ”‚
+โ”‚      DoCustomProcessing();                 โ”‚
+โ”‚  }                                         โ”‚
+โ”‚                                            โ”‚
+โ”‚  End(rs);                                  โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
 ```
 ```
 
 
 ## RequestStop Flow
 ## RequestStop Flow
 
 
-### Current
-
-```
-User Action (e.g., Quit Key)
-    โ”‚
-    โ–ผ
-Application.RequestStop(toplevel)
-    โ”‚
-    โ–ผ
-Sets toplevel.Running = false
-    โ”‚
-    โ–ผ
-RunLoop detects !Running
-    โ”‚
-    โ–ผ
-RunLoop exits
-    โ”‚
-    โ–ผ
-Application.End() cleans up
-```
-
-### Proposed (Same flow, clearer names)
-
 ```
 ```
 User Action (e.g., Quit Key)
 User Action (e.g., Quit Key)
-    โ”‚
-    โ–ผ
-Application.StopProcessingEvents(toplevel)    โœ… Clear: stops event processing
-    โ”‚
-    โ–ผ
-Sets toplevel.Running = false
-    โ”‚
-    โ–ผ
-ProcessEvents detects !Running
-    โ”‚
-    โ–ผ
-ProcessEvents exits
-    โ”‚
-    โ–ผ
-Application.EndSession() cleans up
+        โ”‚
+        โ–ผ
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RequestStop(window)   โ”‚  โœ… Keep: "Request" is clear
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+        โ”‚
+        โ–ผ
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  window.Running=false  โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+        โ”‚
+        โ–ผ
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunLoop exits         โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+        โ”‚
+        โ–ผ
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  End() cleans up       โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
 ```
 ```
 
 
-## Nested Sessions (Modal Dialogs)
+## What We're Keeping
 
 
 ```
 ```
-โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Main Window Session โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-โ”‚                                                  โ”‚
-โ”‚  session1 = BeginSession(mainWindow)            โ”‚
-โ”‚                                                  โ”‚
-โ”‚  ProcessEvents(session1) starts...              โ”‚
-โ”‚      โ”‚                                           โ”‚
-โ”‚      โ”‚  User clicks "Open Dialog" button        โ”‚
-โ”‚      โ”‚                                           โ”‚
-โ”‚      โ”œโ”€> โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Dialog Session โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
-โ”‚      โ”‚   โ”‚                               โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚  session2 = BeginSession(dialog)     โ”‚
-โ”‚      โ”‚   โ”‚                               โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚  ProcessEvents(session2)      โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚  (blocks until dialog closes) โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚                               โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚  EndSession(session2)         โ”‚      โ”‚
-โ”‚      โ”‚   โ”‚                               โ”‚      โ”‚
-โ”‚      โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
-โ”‚      โ”‚                                           โ”‚
-โ”‚      โ”‚  (returns to main window)                โ”‚
-โ”‚      โ”‚                                           โ”‚
-โ”‚  ...ProcessEvents continues                     โ”‚
-โ”‚                                                  โ”‚
-โ”‚  EndSession(session1)                           โ”‚
-โ”‚                                                  โ”‚
-โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Key Insight: Sessions can be nested (modal dialogs)
+โœ… KEEP AS-IS:
+
+Begin/End
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  Begin(window)   โ”‚ ... โ”‚  End(token)      โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+     โ†‘                           โ†‘
+     โ”‚                           โ”‚
+  Clear, concise          Clear, concise
+  Not wordy               Not wordy
+  
+
+RequestStop
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RequestStop()      โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+         โ†‘
+         โ”‚
+  "Request" appropriately
+  conveys non-blocking
+
+
+RunLoop / RunIteration
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  RunLoop()      โ”‚     โ”‚  RunIteration()  โ”‚
+โ”‚  (the loop)     โ”‚     โ”‚  (one iteration) โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+         โ†‘                       โ†‘
+         โ”‚                       โ”‚
+    Distinction is important and valuable
 ```
 ```
 
 
-## Complete Example Flow
-
-### Simple Application
+## Side-by-Side Summary
 
 
 ```
 ```
-START
-  โ”‚
-  โ”œโ”€> Application.Init()                     [Application Lifecycle]
-  โ”‚       โ””โ”€> Initialize driver, screen
-  โ”‚
-  โ”œโ”€> window = new Window()
-  โ”‚
-  โ”œโ”€> Application.Run(window)                [High-level API]
-  โ”‚       โ”‚
-  โ”‚       โ”œโ”€> BeginSession(window)           [Session begins]
-  โ”‚       โ”‚       โ””โ”€> Initialize, layout, draw
-  โ”‚       โ”‚
-  โ”‚       โ”œโ”€> ProcessEvents(session)         [Event processing]
-  โ”‚       โ”‚       โ””โ”€> Loop until stopped
-  โ”‚       โ”‚
-  โ”‚       โ””โ”€> EndSession(session)            [Session ends]
-  โ”‚               โ””โ”€> Cleanup
-  โ”‚
-  โ”œโ”€> window.Dispose()
-  โ”‚
-  โ””โ”€> Application.Shutdown()                 [Application Lifecycle]
-          โ””โ”€> Restore terminal
-END
+โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฆโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
+โ•‘          CURRENT                  โ•‘          PROPOSED                 โ•‘
+โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
+โ•‘  RunState rs = Begin(window);     โ•‘  RunToken token = Begin(window);  โ•‘
+โ•‘  EndAfterFirstIteration = true;   โ•‘  StopAfterFirstIteration = true;  โ•‘
+โ•‘  RunLoop(rs);                     โ•‘  RunLoop(token);                  โ•‘
+โ•‘  End(rs);                         โ•‘  End(token);                      โ•‘
+โ•‘                                   โ•‘                                   โ•‘
+โ•‘  โŒ "State" misleading            โ•‘  โœ… "Token" clear                 โ•‘
+โ•‘  โŒ "End" confuses with End()     โ•‘  โœ… "Stop" aligns with RequestStopโ•‘
+โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฉโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 ```
 ```
 
 
-### Application with Manual Control
+## Terminology Mapping
 
 
 ```
 ```
-START
-  โ”‚
-  โ”œโ”€> Application.Init()
-  โ”‚
-  โ”œโ”€> window = new Window()
-  โ”‚
-  โ”œโ”€> session = Application.BeginSession(window)    [Manual Session Control]
-  โ”‚       โ””โ”€> Initialize, layout, draw
-  โ”‚
-  โ”œโ”€> Application.StopAfterFirstIteration = true
-  โ”‚
-  โ”œโ”€> while (!done)                                 [Custom Event Loop]
-  โ”‚       โ”‚
-  โ”‚       โ”œโ”€> Application.ProcessEventsIteration(ref session, first)
-  โ”‚       โ”‚       โ””โ”€> Process one iteration
-  โ”‚       โ”‚
-  โ”‚       โ”œโ”€> DoCustomProcessing()
-  โ”‚       โ”‚
-  โ”‚       โ””โ”€> first = false
-  โ”‚
-  โ”œโ”€> Application.EndSession(session)               [Manual Session Control]
-  โ”‚       โ””โ”€> Cleanup
-  โ”‚
-  โ”œโ”€> window.Dispose()
-  โ”‚
-  โ””โ”€> Application.Shutdown()
-END
-```
-
-## Terminology Mapping Summary
-
-### API Name Changes
-
-```
-CURRENT                          PROPOSED
-โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
-
-Application.Run()           โ†’    Application.Run()                    (unchanged)
-
-RunState                    โ†’    ToplevelSession                     โœ… Clear: session token
-
-Application.Begin()         โ†’    Application.BeginSession()          โœ… Clear: begin a session
-
-Application.RunLoop()       โ†’    Application.ProcessEvents()         โœ… Clear: processes events
-
-Application.RunIteration()  โ†’    Application.ProcessEventsIteration() โœ… Clear: one iteration
-
-Application.End()           โ†’    Application.EndSession()            โœ… Clear: end the session
-
-Application.RequestStop()   โ†’    Application.StopProcessingEvents()  โœ… Clear: stops processing
-
-EndAfterFirstIteration      โ†’    StopAfterFirstIteration            โœ… Consistent naming
-
-NotifyNewRunState          โ†’    NotifyNewSession                   โœ… Consistent naming
-
-NotifyStopRunState         โ†’    NotifyStopSession                  โœ… Consistent naming
-
-RunStateEventArgs          โ†’    ToplevelSessionEventArgs           โœ… Consistent naming
+CHANGE (2 names):
+โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
+RunState                 โ†’  RunToken
+EndAfterFirstIteration   โ†’  StopAfterFirstIteration
+
+
+KEEP UNCHANGED:
+โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
+Begin                    โ†’  Begin              โœ…
+End                      โ†’  End                โœ…
+RequestStop              โ†’  RequestStop        โœ…
+RunLoop                  โ†’  RunLoop            โœ…
+RunIteration             โ†’  RunIteration       โœ…
+Run                      โ†’  Run                โœ…
 ```
 ```
 
 
 ## Benefits Visualized
 ## Benefits Visualized
 
 
-### Before: Confusion
-
 ```
 ```
-User thinks:
-"What's the difference between Run, RunLoop, and RunIteration?"
-"Is RunState storing state or just a handle?"
-"What am I Beginning and Ending?"
-
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚    Run()    โ”‚  โ† What does "Run" mean exactly?
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚   Begin()   โ”‚  โ† Begin what?
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚  RunLoop()  โ”‚  โ† Is this the same as Run?
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚    End()    โ”‚  โ† End what?
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Result: User confusion, slower learning curve
+Before:
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  Users think:                           โ”‚
+โ”‚  โ€ข "What state does RunState hold?"     โ”‚
+โ”‚  โ€ข "Does EndAfterFirstIteration call    โ”‚
+โ”‚     End()?"                             โ”‚
+โ”‚                                         โ”‚
+โ”‚  Result: Confusion, questions           โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
+
+After:
+โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
+โ”‚  Users understand:                      โ”‚
+โ”‚  โ€ข "RunToken is a token"                โ”‚
+โ”‚  โ€ข "StopAfterFirstIteration controls    โ”‚
+โ”‚     the loop"                           โ”‚
+โ”‚                                         โ”‚
+โ”‚  Result: Clear, self-documenting        โ”‚
+โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
 ```
 ```
 
 
-### After: Clarity
+## Summary
 
 
-```
-User understands:
-"Run() does the complete lifecycle"
-"BeginSession/EndSession manage a session"
-"ProcessEvents processes events until stopped"
-"ToplevelSession is a token for the session"
-
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚     Run()       โ”‚  โœ… Complete lifecycle
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚ BeginSession()  โ”‚  โœ… Start a session
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚ ProcessEvents() โ”‚  โœ… Process events
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-                โ”‚
-         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
-         โ”‚  EndSession()   โ”‚  โœ… End the session
-         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
-
-Result: Clear understanding, faster learning curve
-```
+**2 Changes Only:**
+- `RunState` โ†’ `RunToken` (clear it's a token)
+- `EndAfterFirstIteration` โ†’ `StopAfterFirstIteration` (clear it controls loop)
+
+**Everything Else Stays:**
+- `Begin` / `End` - Clear and concise
+- `RequestStop` - Appropriately non-blocking
+- `RunLoop` / `RunIteration` - Valuable distinction
 
 
-## See Also
+**Result:**
+- โœ… Addresses confusion at the source
+- โœ… Minimal disruption (2 names)
+- โœ… Preserves what works well
+- โœ… Respects maintainer feedback
 
 
-- [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md) - Full proposal with rationale
-- [TERMINOLOGY_QUICK_REFERENCE.md](TERMINOLOGY_QUICK_REFERENCE.md) - Quick comparison tables
-- [TERMINOLOGY_INDUSTRY_COMPARISON.md](TERMINOLOGY_INDUSTRY_COMPARISON.md) - Industry patterns
+See [TERMINOLOGY_PROPOSAL.md](TERMINOLOGY_PROPOSAL.md) for complete analysis.