The imgui-bundle backend cannot sample from our OpenGL FBO textures.
This is a fundamental incompatibility. Frosted glass feature
disabled to allow app to run.
- Add _render_custom_background method as hello_imgui callback
- Render blurred FBO texture as ImGui background
- Use ctypes.cast to convert OpenGL texture ID to ImTextureRef
- Create _create_quad_vao() method that creates VAO with vertex buffer
- Use explicit vertex attributes (a_position, a_texcoord) in shaders
- Bind VAO before glDrawArrays calls
- Use ctypes for proper buffer sizing
The issue is that imgui-bundle uses OpenGL 3.3 core profile which doesn't
support glBegin/glEnd. The shaders require VAO setup which is failing.
This needs proper OpenGL debugging in the imgui-bundle context.
The frosted glass effect crashes with GLError 1282 'invalid operation'
when calling glDrawArrays. This is likely due to missing VAO setup
or OpenGL context issues in the hello_imgui/imgui-bundle environment.
DISABLED the effect by default to allow the app to run.
Feature needs proper OpenGL VAO setup to work.
- Remove _init_blur_pipeline call from _post_init (display_size invalid at startup)
- Add validation for ws.x > 0 and ws.y > 0 before FBO creation
- Add validation for fb_scale > 0 with default fallback to 1.0
- Make _init_blur_pipeline return bool for success/failure
- Update plan.md to reflect current progress
Fixes crash: GLError(err=1281, description=b'invalid value')
- Remove _init_blur_pipeline call from _post_init (display_size not valid yet)
- Add dimension validation in _init_blur_pipeline (ws.x > 0 and ws.y > 0)
- Add fb_scale validation (default to 1.0 if <= 0)
- Lazy init only happens when frosted glass is enabled and dimensions are valid
- Fixes GLError 1281 'invalid value' crash on startup
- Add compile_deepsea_shader() with animated underwater-like GLSL shader
- Add render_deepsea_to_fbo() to render background to scene FBO
- Deep Sea shader features: FBM noise, animated blobs, caustic lines, vignette
- Add deepsea_program to cleanup() for proper resource management
- Add 2 new tests for Deep Sea shader compilation and FBO rendering
Task: Phase 1, Task 2 of frosted_glass_20260313 track
- Updated metadata.json status to completed
- Fixed corrupted plan.md (was damaged by earlier loop)
- Cleaned up duplicate Goal line in tracks.md
Checkpoint: 02abfc4
This fixes an issue where config.toml was erroneously saved to the current working directory (e.g. project dir) rather than the global manual slop directory.
- Add try/except in ai_client.py to emit response_received event
before re-raising exceptions from gemini_cli adapter
- Adjust mock_gemini_cli.py to sleep 65s (triggers 60s adapter timeout)
- This fixes test_mock_timeout and other live GUI tests that were
hanging because no event was emitted on timeout
- Add patch modal state to AppController instead of App
- Add show_patch_modal/hide_patch_modal action handlers
- Fix push_event to work with flat payload format
- Add patch fields to _gettable_fields
- Both GUI integration tests passing
- Add patch_callback parameter throughout the tool execution chain
- Add _render_patch_modal() to gui_2.py with colored diff display
- Add patch modal state variables to App.__init__
- Add request_patch_from_tier4() to trigger patch generation
- Add run_tier4_patch_callback() to ai_client.py
- Update shell_runner to accept and execute patch_callback
- Diff colors: green for additions, red for deletions, cyan for headers
- 36 tests passing
- Create src/patch_modal.py with PatchModalManager class
- Manage patch approval workflow: request, apply, reject
- Provide singleton access via get_patch_modal_manager()
- Add 8 unit tests for modal manager
- Add create_backup() to backup files before patching
- Add apply_patch_to_file() to apply unified diff
- Add restore_from_backup() for rollback
- Add cleanup_backup() to remove backup files
- Add 15 unit tests for all patch operations
- Create src/diff_viewer.py with parse_diff function
- Parse unified diff into DiffFile and DiffHunk dataclasses
- Extract file paths, hunk headers, and line changes
- Add unit tests for diff parser
- Add TIER4_PATCH_PROMPT to mma_prompts.py with unified diff format
- Add run_tier4_patch_generation function to ai_client.py
- Import mma_prompts in ai_client.py
- Add unit tests for patch generation
- Add minimax to PROVIDERS lists in gui_2.py and app_controller.py
- Add minimax credentials template in ai_client.py
- Implement _list_minimax_models, _classify_minimax_error, _ensure_minimax_client
- Implement _send_minimax with streaming and reasoning support
- Add minimax to send(), list_models(), reset_session(), get_history_bleed_stats()
- Add unit tests in tests/test_minimax_provider.py
- Fix mock_gemini_cli.py to use src/aggregate.py (moved to src directory)
- Add wait_for_event method to ApiHookClient for simulation tests
- Fix custom_callback path in app_controller to use absolute path
- Fix test_gui2_parity.py to use correct callback file path
- Moved codebase_migration_20260302 to archive
- Moved gui_decoupling_controller_20260302 to archive
- Moved test_architecture_integrity_audit_20260304 to archive
- Removed deprecated test_suite_performance_and_flakiness_20260302
- Mark live_gui tests as flaky by design in TASKS.md until stabiliztion tracks complete
- Add test debt notes to upcoming tracks to guide testing strategies
- New edit_file(path, old_string, new_string, replace_all) function
- Reads/writes with newline='' to preserve CRLF and 1-space indentation
- Returns error if old_string not found or multiple matches without replace_all
- Added to MUTATING_TOOLS for HITL approval routing
- Added to TOOL_NAMES and dispatch function
- Added MCP_TOOL_SPECS entry for AI tool declaration
- Updated agent configs (tier2, tier3, general) with edit_file mapping
Note: tier1, tier4, explore agents don't need this (edit: deny - read-only)
- Add AppController.stop_services() to clean up AI client and event loop
- Add ConfirmDialog, MMAApprovalDialog, MMASpawnApprovalDialog imports to gui_2.py
- Fix test mocks for MMA dashboard and approval indicators
- Add retry logic to conftest.py for Windows file lock cleanup
- ai_client: add current_tier module var; stamp source_tier on every _append_comms entry
- multi_agent_conductor: set current_tier='Tier 3' around send(), clear in finally
- conductor_tech_lead: set current_tier='Tier 2' around send(), clear in finally
- gui_2: _on_tool_log captures current_tier; _append_tool_log stores dict with source_tier
- tests: 8 new tests covering current_tier, source_tier in comms, tool log dict format
All 3 phases complete and verified. 62 lines of dead code removed from gui_2.py.
Meta-Level Sanity Check: 0 new ruff violations introduced.
Next track: mma_agent_focus_ux_20260302 (dependency on Phase 1 now satisfied)
Phase 2: Menu Bar Consolidation
- Deleted dead begin_main_menu_bar() block (24 lines, always-False in HelloImGui)
- Added 'manual slop' > Quit menu to live _show_menus using runner_params.app_shall_exit
- 32 tests passed, import clean
- Quit menu verified by user
Adds 'manual slop' menu before 'Windows' in the live HelloImGui menubar callback.
Quit sets self.runner_params.app_shall_exit = True — the correct HelloImGui API.
Previously the only quit path was the window close button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
HelloImGui commits the menubar before invoking _gui_func, so begin_main_menu_bar()
always returned False. The 24-line block (Quit, View, Project menus) never executed.
Also removes the misaligned '# ---- Menubar' comment and dead '# --- Hubs ---' comment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ui_conductor_setup_summary, ui_new_track_name, ui_new_track_desc, ui_new_track_type
were each assigned twice in __init__. Second assignments (308-311) were identical
to the correct first assignments (218-221). Duplicate removed, first assignments kept.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dead version used stale 'type' key (current model uses 'kind'), called nonexistent
_cb_load_prior_log (correct name: cb_load_prior_log), and had begin_child('scroll_area')
ID collision. Python silently discarded it at import time. Live version at line 3400.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implement Live Worker Streaming: wire ai_client.comms_log_callback to Tier 3 streams
- Add Parallel DAG Execution using asyncio.gather for non-dependent tickets
- Implement Automatic Retry with Model Escalation (Flash-Lite -> Flash -> Pro)
- Add Tier Model Configuration UI to MMA Dashboard with project TOML persistence
- Fix FPS reporting in PerformanceMonitor to prevent transient 0.0 values
- Update Ticket model with retry_count and dictionary-like access
- Stabilize Gemini CLI integration tests and handle script approval events in simulations
- Finalize and verify all 6 phases of the implementation plan
- Add cost tracking with new cost_tracker.py module
- Enhance Track Proposal modal with editable titles and goals
- Add Conductor Setup summary and New Track creation form to MMA Dashboard
- Implement Task DAG editing (add/delete tickets) and track-scoped discussion
- Add visual polish: color-coded statuses, tinted progress bars, and node indicators
- Support live worker streaming from AI providers to GUI panels
- Fix numerous integration test regressions and stabilize headless service
_handle_approve_script existed but was not registered in the click handler dict.
_pending_dialog (PowerShell confirmation) was invisible to the hook API —
only _pending_ask_dialog (MCP tool ask) was exposed.
- gui_2.py: register btn_approve_script -> _handle_approve_script
- api_hooks.py: add pending_script_approval field to mma_status response
- visual_sim_mma_v2.py: _drain_approvals handles pending_script_approval
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- api_hooks.py: add mma_tier_usage to get_mma_status() response
- pytest-timeout 2.4.0 installed so mark.timeout(300) is enforced in CI
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- description/status/assigned_to fields now match parse_json_tickets expectations
- Sprint planning branch also detects 'generate the implementation tickets'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tier 3 workers need to read/write files in headless mode. Without this
flag, all file tool calls are blocked waiting for interactive permission.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When ANTHROPIC_API_KEY is set in the shell environment, claude --print
routes through the API key instead of subscription auth. Stripping it
forces the CLI to use subscription login for all Tier 3/4 delegation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add step 1: read mma-tier2-tech-lead.md before any track work
- Add explicit stop rule when Tier 3 delegation fails (credit/API error)
Tier 2 must NOT silently absorb Tier 3 work as a fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tier 1 planning calls are strategic — the model should never use file tools
during epic initialization. This caused JSON parse failures when the model
tried to verify file references in the epic prompt.
- ai_client.py: add enable_tools param to send() and _send_gemini()
- orchestrator_pm.py: pass enable_tools=False in generate_tracks()
- tests/visual_sim_mma_v2.py: remove file reference from test epic
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Task 2.2 of mma_pipeline_fix_20260301: _cb_plan_epic captures comms baseline before generate_tracks() and pushes mma_tier_usage['Tier 1'] update via custom_callback. _start_track_logic does same for generate_tickets() -> mma_tier_usage['Tier 2'].
Task 2.1 of mma_pipeline_fix_20260301: capture comms baseline before send(), then sum input_tokens/output_tokens from IN/response entries to populate engine.tier_usage['Tier 3'].
Tasks 1.1, 1.2, 1.3 of mma_pipeline_fix_20260301:
- Task 1.1: Add [MMA] diagnostic print before _queue_put in run_worker_lifecycle; enhance except to include traceback
- Task 1.2: Replace unsafe event_queue._queue.put_nowait() else branches with RuntimeError in run_worker_lifecycle, confirm_execution, confirm_spawn
- Task 1.3: Verified run_in_executor positional arg order is correct (no change needed)
Addresses three gaps where Claude Code and Gemini CLI outperform Manual Slop's
MMA during actual execution:
1. Live worker streaming: Wire comms_log_callback to per-ticket streams so
users see real-time output instead of waiting for worker completion.
2. Per-tier model config: Replace hardcoded get_model_for_role with GUI
dropdowns persisted to project TOML.
3. Parallel DAG execution: asyncio.gather for independent tickets (exploratory
— _send_lock may block, needs investigation).
4. Auto-retry with escalation: flash-lite -> flash -> pro on BLOCKED, up to
2 retries (wires existing --failure-count mechanism into ConductorEngine).
7 new tasks across Phase 6, bringing total to 30 tasks across 6 phases.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
mma_exec.py changes:
- get_role_documents: Tier 1 now gets docs/guide_architecture.md + guide_mma.md
(was: only product.md). Tier 2 gets same (was: only tech-stack + workflow).
Tier 3 gets guide_architecture.md (was: only workflow.md — workers modifying
gui_2.py had zero knowledge of threading model). Tier 4 gets guide_architecture.md
(was: nothing).
- Tier 3 system directive: Added ARCHITECTURE REFERENCE callout, CRITICAL
THREADING RULE (never write GUI state from background thread), TASK FORMAT
instruction (follow WHERE/WHAT/HOW/SAFETY from surgical tasks), and
py_get_definition to tool list.
- Tier 4 system directive: Added ARCHITECTURE REFERENCE callout and instruction
to trace errors through thread domains documented in guide_architecture.md.
conductor/workflow.md changes:
- Red Phase delegation prompt: Replaced 'with a prompt to create tests' with
surgical prompt format example showing WHERE/WHAT/HOW/SAFETY.
- Green Phase delegation prompt: Replaced 'with a highly specific prompt' with
surgical prompt format example with exact line refs and API calls.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Updates three Gemini skill files to match the Claude command methodology:
mma-orchestrator/SKILL.md:
- New Section 0: Architecture Fallback with links to all 4 docs/guide_*.md
- New Surgical Spec Protocol (6-point mandatory checklist)
- New Section 5: Cross-Skill Activation for tier transitions
- Example 2 rewritten with surgical prompt (exact line refs + API calls)
- New Example 3: Track creation with audit-first workflow
- Added py_get_definition to tool usage guidance
mma-tier1-orchestrator/SKILL.md:
- Added Architecture Fallback and Surgical Spec Protocol summary
- References activate_skill mma-orchestrator for full protocol
mma-tier2-tech-lead/SKILL.md:
- Added Architecture Fallback section
- Added Surgical Delegation Protocol with WHERE/WHAT/HOW/SAFETY example
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Distills what made this session's track specs high-quality into reusable
methodology for both Claude and Gemini Tier 1 orchestrators:
Key additions to conductor-new-track.md:
- MANDATORY Step 2: Deep Codebase Audit before writing any spec
- 'Current State Audit' section template (Already Implemented + Gaps)
- 6 rules for writing worker-ready tasks (WHERE/WHAT/HOW/SAFETY)
- Anti-patterns section (vague specs, no line refs, no audit, etc.)
- Architecture doc fallback references
Key additions to mma-tier1-orchestrator.md (Claude + Gemini):
- 'The Surgical Methodology' section with 6 protocols
- Spec template with REQUIRED sections (Current State Audit is mandatory)
- Plan template with REQUIRED task format (file:line refs + API calls)
- Root cause analysis requirement for fix tracks
- Cross-track dependency mapping requirement
- Added py_get_definition to Gemini's tool list (was missing)
The core insight: the quality gap between this session's output and previous
track specs came from (1) reading actual code before writing specs, (2) listing
what EXISTS before what's MISSING, and (3) specifying exact locations and APIs
in tasks so lesser models don't have to search or guess.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrites comprehensive_gui_ux_20260228 spec and plan using deep analysis of
the actual gui_2.py implementation (3078 lines). The previous spec asked to
implement features that already exist (Track Browser, DAG tree, epic planning,
approval dialogs, token table, performance monitor). The new spec:
- Documents 15 already-implemented features with exact line references
- Identifies 8 actual gaps (tier stream panels, DAG editing, cost tracking,
conductor lifecycle forms, track-scoped discussions, approval indicators,
track proposal editing, stream scrollability)
- Rewrites all 5 phases with surgical task descriptions referencing exact
gui_2.py line ranges, function names, and data structures
- Each task specifies the precise imgui API calls to use
- References docs/guide_architecture.md for threading constraints
- References docs/guide_mma.md for Ticket/Track data structures
Also adds architecture documentation fallback references to:
- conductor/workflow.md (new principle #9)
- conductor/product.md (new Architecture Reference section)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three independent root causes fixed:
- gui_2.py: Route mma_spawn_approval/mma_step_approval events in _process_event_queue
- multi_agent_conductor.py: Pass asyncio loop from ConductorEngine.run() through to
thread-pool workers for thread-safe event queue access; add _queue_put helper
- ai_client.py: Preserve GeminiCliAdapter in reset_session() instead of nulling it
Test: visual_sim_mma_v2::test_mma_complete_lifecycle passes in ~8s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Applied 236 return type annotations to functions with no return values
across 100+ files (core modules, tests, scripts, simulations).
Added Phase 4 to python_style_refactor track for remaining 597 items
(untyped params, vars, and functions with return values).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 3 verification:
- All 13 core modules pass syntax check
- 217 type annotations applied across gui_2.py and gui_legacy.py (zero remaining)
- python.md styleguide updated to AI-optimized standard
- BOM markers on 3 files are pre-existing (Phase 2), not regressions
Track: python_style_refactor_20260227 — ALL PHASES COMPLETE
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces Google Python Style Guide with project-specific conventions:
1-space indentation, strict type hints on all signatures/vars,
minimal blank lines, 120-char soft limit, AI-agent conventions.
Also marks type hinting task complete in plan.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Automated pipeline applied 217 type annotations across both UI modules:
- 158 auto -> None return types via AST single-pass
- 25 manual signatures (callbacks, factory methods, complex returns)
- 34 variable type annotations (constants, color tuples, config)
Zero untyped functions/variables remain in either file.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Claude Code conductor commands, MCP server, MMA exec scripts,
and implement py_get_var_declaration / py_set_var_declaration which
were registered in dispatch and tool specs but had no function bodies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Close gui2_feature_parity track after implementing all features
and conducting manual and automated verification.
Key Achievements:
- Integrated event-driven architecture and MCP client.
- Ported API hooks and performance diagnostics.
- Implemented Prior Session Viewer.
- Refactored UI to a Hub-based layout.
- Added agent capability toggles.
- Achieved full theme integration.
- Developed comprehensive test suite.
Note: Remaining UI display issues for text panels in the comms and
tool call history will be addressed in a subsequent track.
Automates the refactoring of the monolithic _gui_func in gui_2.py into separate rendering methods, nested within 'Context Hub', 'AI Settings Hub', 'Discussion Hub', and 'Operations Hub', utilizing tab bars. Adds tests to ensure the new default windows correctly represent this Hub structure.
- Add thread safety: _anthropic_history_lock and _send_lock in ai_client to prevent concurrent corruption
- Add _send_thread_lock in gui_2 for atomic check-and-start of send thread
- Add atexit fallback in session_logger to flush log files on abnormal exit
- Fix file descriptor leaks: use context managers for urlopen in mcp_client
- Cap unbounded tool output growth at 500KB per send() call (both Gemini and Anthropic)
- Harden path traversal: resolve(strict=True) with fallback in mcp_client allowlist checks
- Add SLOP_CREDENTIALS env var override for credentials.toml with helpful error message
- Fix Gemini token heuristic: use _CHARS_PER_TOKEN (3.5) instead of hardcoded // 4
- Add keyboard shortcuts: Ctrl+Enter to send, Ctrl+L to clear message input
- Add auto-save: flush project and config to disk every 60 seconds
Integrates the ai_client.events emitter into the gui_2.py App class. Adds a new test file to verify that the App subscribes to API lifecycle events upon initialization. This is the first step in aligning gui_2.py with the project's event-driven architecture.
- Port 10 missing features from gui.py to gui_2.py: performance
diagnostics, prior session log viewing, token budget visualization,
agent tools config, API hooks server, GUI task queue, discussion
truncation, THINKING/LIVE indicators, event subscriptions, and
session usage tracking
- Persist window visibility state in config.toml
- Fix Gemini cache invalidation by separating discussion history
from cached context (use MD5 hash instead of built-in hash)
- Add cost optimizations: tool output truncation at source, proactive
history trimming at 40%, summary_only support in aggregate.run()
- Add cleanup() for destroying API caches on exit
This change adds a label to the Provider panel to show the count and total size of active Gemini caches when the Gemini provider is selected. This information is hidden for other providers.
This change adds a progress bar and label to the Provider panel to display the current history token usage against the provider's limit. The UI is updated in real-time.
This change introduces a new function, get_history_bleed_stats, to calculate and expose how close the current conversation history is to the provider's token limit. The initial implementation supports Anthropic, with a placeholder for Gemini.
This change corrects the implementation of get_gemini_cache_stats to use the Gemini client instance and updates the corresponding test to use proper mocking.
STRICT SYSTEM DIRECTIVE: You are a Tier 1 Orchestrator. Focused on product alignment, high-level planning, and track initialization. ONLY output the requested text. No pleasantries.
# MMA Tier 1: Orchestrator
## Primary Context Documents
Read at session start: `conductor/product.md`, `conductor/product-guidelines.md`
## Architecture Fallback
When planning tracks that touch core systems, consult the deep-dive docs:
description: Tier 2 Tech Lead — track execution, architectural oversight, delegation to Tier 3/4
---
STRICT SYSTEM DIRECTIVE: You are a Tier 2 Tech Lead. Focused on architectural design and track execution. ONLY output the requested text. No pleasantries.
# MMA Tier 2: Tech Lead
## Primary Context Documents
Read at session start: `conductor/tech-stack.md`, `conductor/workflow.md`
## Responsibilities
- Manage the execution of implementation tracks (`/conductor-implement`)
- Ensure alignment with `tech-stack.md` and project architecture
- Break down tasks into specific technical steps for Tier 3 Workers
- Maintain PERSISTENT context throughout a track's implementation phase (NO Context Amnesia)
- Review implementations and coordinate bug fixes via Tier 4 QA
- **CRITICAL: ATOMIC PER-TASK COMMITS**: You MUST commit your progress on a per-task basis. Immediately after a task is verified successfully, you must stage the changes, commit them, attach the git note summary, and update `plan.md` before moving to the next task. Do NOT batch multiple tasks into a single commit.
- **Meta-Level Sanity Check**: After completing a track (or upon explicit request), perform a codebase sanity check. Run `uv run ruff check .` and `uv run mypy --explicit-package-bases .` to ensure Tier 3 Workers haven't degraded static analysis constraints. Identify broken simulation tests and append them to a tech debt track or fix them immediately.
`@filepath` anywhere in the prompt string is detected by `claude_mma_exec.py` and the file is automatically inlined into the Tier 3 context. Use this so Tier 3 has what it needs WITHOUT Tier 2 reading those files first.
```powershell
# Example: Tier 3 gets api_hook_client.py and the styleguide injected automatically
uvrunpythonscripts\claude_mma_exec.py--roletier3-worker"Apply type hints to @api_hook_client.py following @conductor/code_styleguides/python.md. ..."
```
## Tool Use Hierarchy (MANDATORY — enforced order)
Claude has access to all tools and will default to familiar ones. This hierarchy OVERRIDES that default.
**For any Python file investigation, use in this order:**
1.`py_get_code_outline` — structure map (functions, classes, line ranges). Use this FIRST.
2.`py_get_skeleton` — signatures + docstrings, no bodies
3.`get_file_summary` — high-level prose summary
4.`py_get_definition` / `py_get_signature` — targeted symbol lookup
5.`Grep` / `Glob` — cross-file symbol search and pattern matching
6.`Read` (targeted, with offset/limit) — ONLY after outline identifies specific line ranges
**`run_powershell` (MCP tool)** — PRIMARY shell execution on Windows. Use for: git, tests, scan scripts, any shell command. This is native PowerShell, not bash/mingw.
**Bash** — LAST RESORT only when MCP server is not running. Bash runs in a mingw sandbox on Windows and may produce no output. Prefer `run_powershell` for everything.
## Hard Rules (Non-Negotiable)
- **NEVER** call `Read` on a file >50 lines without calling `py_get_code_outline` or `py_get_skeleton` first.
- **NEVER** write implementation code, refactor code, type hint code, or test code inline in this context. If it goes into the codebase, Tier 3 writes it.
- **NEVER** write or run inline Python scripts via Bash. If a script is needed, it already exists or Tier 3 creates it.
- **NEVER** process raw bash output for large outputs inline — write to a file and Read, or delegate to Tier 4 QA.
- **ALWAYS** use `@file` injection in Tier 3 prompts rather than reading and summarizing files yourself.
STRICT SYSTEM DIRECTIVE: You are a stateless Tier 3 Worker (Contributor). Your goal is to implement specific code changes or tests based on the provided task. You have access to tools for reading and writing files (Read, Write, Edit), codebase investigation (Glob, Grep), version control (Bash git commands), and web tools (WebFetch, WebSearch). You CAN execute PowerShell scripts via Bash for verification and testing. Follow TDD and return success status or code changes. No pleasantries, no conversational filler.
# MMA Tier 3: Worker
## Context Model: Context Amnesia
Treat each invocation as starting from zero. Use ONLY what is provided in this prompt plus files you explicitly read during this session. Do not reference prior conversation history.
## Responsibilities
- Implement code strictly according to the provided prompt and specifications
- Write failing tests FIRST (Red phase), then implement code to pass them (Green phase)
- Ensure all changes are minimal, surgical, and conform to the requested standards
- Utilize tool access (Read, Write, Edit, Glob, Grep, Bash) to implement and verify
## Limitations
- No architectural decisions — if ambiguous, pick the minimal correct approach and note the assumption
- No modifications to unrelated files beyond the immediate task scope
- Stateless — always assume a fresh context per invocation
- Rely on dependency skeletons provided in the prompt for understanding module interfaces
STRICT SYSTEM DIRECTIVE: You are a stateless Tier 4 QA Agent. Your goal is to analyze errors, summarize logs, or verify tests. Read-only access only. Do NOT implement fixes. Do NOT modify any files. ONLY output the requested analysis. No pleasantries.
# MMA Tier 4: QA Agent
## Context Model: Context Amnesia
Stateless — treat each invocation as a fresh context. Use only what is provided in this prompt and files you explicitly read.
## Responsibilities
- Compress large stack traces or log files into concise, actionable summaries
- Identify the root cause of test failures or runtime errors
- Provide a brief, technical description of the required fix (description only — NOT the implementation)
description: Enforces the 4-Tier Hierarchical Multi-Model Architecture (MMA) within Gemini CLI using Token Firewalling and sub-agent task delegation.
---
# MMA Token Firewall & Tiered Delegation Protocol
You are operating within the MMA Framework, acting as either the **Tier 1 Orchestrator** (for setup/init) or the **Tier 2 Tech Lead** (for execution). Your context window is extremely valuable and must be protected from token bloat (such as raw, repetitive code edits, trial-and-error histories, or massive stack traces).
To accomplish this, you MUST delegate token-heavy or stateless tasks to **Tier 3 Workers** or **Tier 4 QA Agents** by spawning secondary Gemini CLI instances via `run_shell_command`.
**CRITICAL Prerequisite:**
To ensure proper environment handling and logging, you MUST NOT call the `gemini` command directly for sub-tasks. Instead, use the wrapper script:
`uv run python scripts/mma_exec.py --role <Role> "..."`
-`docs/guide_meta_boundary.md`: Clarification of ai agent tools making the application vs the application itself.
### The Surgical Spec Protocol (MANDATORY for track creation)
When creating tracks (`activate_skill mma-tier1-orchestrator`), follow this protocol:
1.**AUDIT BEFORE SPECIFYING**: Use `get_code_outline`, `py_get_definition`, `grep_search`, and `get_git_diff` to map what already exists. Previous track specs asked to re-implement existing features (Track Browser, DAG tree, approval dialogs) because no audit was done. Document findings in a "Current State Audit" section with file:line references.
2.**GAPS, NOT FEATURES**: Frame requirements as what's MISSING relative to what exists.
- GOOD: "The existing `_render_mma_dashboard` (gui_2.py:2633-2724) has a token usage table but no cost column."
- BAD: "Build a metrics dashboard with token and cost tracking."
3.**WORKER-READY TASKS**: Each plan task must specify:
- **WHERE**: Exact file and line range (`gui_2.py:2700-2701`)
- **WHAT**: The specific change (add function, modify dict, extend table)
- **HOW**: Which API calls (`imgui.progress_bar(...)`, `imgui.collapsing_header(...)`)
- **SAFETY**: Thread-safety constraints if cross-thread data is involved
4.**ROOT CAUSE ANALYSIS** (for fix tracks): Don't write "investigate and fix." List specific candidates with code-level reasoning.
5.**REFERENCE DOCS**: Link to relevant `docs/guide_*.md` sections in every spec.
6.**MAP DEPENDENCIES**: State execution order and blockers between tracks.
## 1. The Tier 3 Worker (Execution)
When performing code modifications or implementing specific requirements:
1.**Pre-Delegation Checkpoint:** For dangerous or non-trivial changes, ALWAYS stage your changes (`git add .`) or commit before delegating to a Tier 3 Worker. If the worker fails or runs `git restore`, you will lose all prior AI iterations for that file if it wasn't staged/committed.
2.**Code Style Enforcement:** You MUST explicitly remind the worker to "use exactly 1-space indentation for Python code" in your prompt to prevent them from breaking the established codebase style.
3.**DO NOT** perform large code writes yourself.
4.**DO** construct a single, highly specific prompt with a clear objective. Include exact file:line references and the specific API calls to use (from your audit or the architecture docs).
5.**DO** spawn a Tier 3 Worker.
*Command:*`uv run python scripts/mma_exec.py --role tier3-worker "Implement [SPECIFIC_INSTRUCTION] in [FILE_PATH] at lines [N-M]. Use [SPECIFIC_API_CALL]. Use 1-space indentation."`
6.**Handling Repeated Failures:** If a Tier 3 Worker fails multiple times on the same task, it may lack the necessary capability. You must track failures and retry with `--failure-count <N>` (e.g., `--failure-count 2`). This tells `mma_exec.py` to escalate the sub-agent to a more powerful reasoning model (like `gemini-3-flash`).
7. The Tier 3 Worker is stateless and has tool access for file I/O.
## 2. The Tier 4 QA Agent (Diagnostics)
If you run a test or command that fails with a significant error or large traceback:
1.**DO NOT** analyze the raw logs in your own context window.
2.**DO** spawn a stateless Tier 4 agent to diagnose the failure.
3.*Command:*`uv run python scripts/mma_exec.py --role tier4-qa "Analyze this failure and summarize the root cause: [LOG_DATA]"`
4.**Mandatory Research-First Protocol:** Avoid direct `read_file` calls for any file over 50 lines. Use `get_file_summary`, `py_get_skeleton`, or `py_get_code_outline` first to identify relevant sections. Use `git diff` to understand changes.
## 3. Persistent Tech Lead Memory (Tier 2)
Unlike the stateless sub-agents (Tiers 3 & 4), the **Tier 2 Tech Lead** maintains persistent context throughout the implementation of a track. Do NOT apply "Context Amnesia" to your own session during track implementation. You are responsible for the continuity of the technical strategy.
## 4. AST Skeleton & Outline Views
To minimize context bloat for Tier 2 & 3:
1. Use `py_get_code_outline` or `get_tree` to map out the structure of a file or project.
2. Use `py_get_skeleton` and `py_get_imports` to understand the interface, docstrings, and dependencies of modules.
3. Use `py_get_definition` to read specific functions/classes by name without loading entire files.
4. Use `py_find_usages` to pinpoint where a function or class is called instead of searching the whole codebase.
5. Use `py_check_syntax` after making string replacements to ensure the file is still syntactically valid.
6. Only use `read_file` with `start_line` and `end_line` for specific implementation details once target areas are identified.
7. Tier 3 workers MUST NOT read the full content of unrelated files.
## 5. Cross-Skill Activation
When your current role requires capabilities from another tier, use `activate_skill`:
- **Quick code task**: Spawn via `mma_exec.py --role tier3-worker` (stateless, no skill activation needed)
- **Error analysis**: Spawn via `mma_exec.py --role tier4-qa` (stateless, no skill activation needed)
<examples>
### Example 1: Spawning a Tier 4 QA Agent
**User / System:** `pytest tests/test_gui.py` failed with 400 lines of output.
**Agent (You):**
```json
{
"command":"python scripts/mma_exec.py --role tier4-qa \"Summarize this stack trace into a 20-word fix: [snip first 30 lines...]\"",
"description":"Spawning Tier 4 QA to compress error trace statelessly."
}
```
### Example 2: Spawning a Tier 3 Worker with Surgical Prompt
**User:** Please implement the cost tracking column in the token usage table.
**Agent (You):**
```json
{
"command":"python scripts/mma_exec.py --role tier3-worker \"In gui_2.py, modify _render_mma_dashboard (lines 2685-2699). Extend the token usage table from 3 columns to 5 by adding 'Model' and 'Est. Cost' columns. Use imgui.table_setup_column() for the new columns. Import cost_tracker and call cost_tracker.estimate_cost(model, input_tokens, output_tokens) for each tier row. Add a total row at the bottom. Use 1-space indentation.\"",
"description":"Delegating surgical implementation to Tier 3 Worker with exact line refs."
}
```
### Example 3: Creating a Track with Audit
**User:** Create a track for adding dark mode support.
-`docs/guide_meta_boundary.md`: Clarification of ai agent tools making the application vs the application itself.
## Responsibilities
- Maintain alignment with the product guidelines and definition.
- Define track boundaries and initialize new tracks (`/conductor:newTrack`).
- Set up the project environment (`/conductor:setup`).
- Delegate track execution to the Tier 2 Tech Lead.
## Surgical Spec Protocol (MANDATORY)
When creating or refining tracks, you MUST:
1.**Audit** the codebase with `get_code_outline`, `py_get_definition`, `grep_search` before writing any spec. Document what exists with file:line refs.
2.**Spec gaps, not features** — frame requirements relative to what already exists.
3.**Write worker-ready tasks** — each specifies WHERE (file:line), WHAT (change), HOW (API call), SAFETY (thread constraints).
4.**For fix tracks** — list root cause candidates with code-level reasoning.
5.**Reference architecture docs** — link to relevant `docs/guide_*.md` sections.
6.**Map dependencies** — state execution order and blockers between tracks.
See `activate_skill mma-orchestrator` for the full protocol and examples.
## Limitations
- Do not execute tracks or implement features.
- Do not write code or perform low-level bug fixing.
- Keep context strictly focused on product definitions and high-level strategy.
description: Focused on track execution, architectural design, and implementation oversight.
---
# MMA Tier 2: Tech Lead
You are the Tier 2 Tech Lead. Your role is to manage the implementation of tracks (`/conductor:implement`), ensure architectural integrity, and oversee the work of Tier 3 and 4 sub-agents.
## Architecture
YOU MUST READ THE FOLLOWING BEFORE IMPLEMENTING TRACKS:
-`docs/guide_meta_boundary.md`: Clarification of ai agent tools making the application vs the application itself.
## Responsibilities
- Manage the execution of implementation tracks.
- Ensure alignment with `tech-stack.md` and project architecture.
- Break down tasks into specific technical steps for Tier 3 Workers.
- Maintain persistent context throughout a track's implementation phase (No Context Amnesia).
- Review implementations and coordinate bug fixes via Tier 4 QA.
- **CRITICAL: ATOMIC PER-TASK COMMITS**: You MUST commit your progress on a per-task basis. Immediately after a task is verified successfully, you must stage the changes, commit them, attach the git note summary, and update `plan.md` before moving to the next task. Do NOT batch multiple tasks into a single commit.
- **Meta-Level Sanity Check**: After completing a track (or upon explicit request), perform a codebase sanity check. Run `uv run ruff check .` and `uv run mypy --explicit-package-bases .` to ensure Tier 3 Workers haven't degraded static analysis constraints. Identify broken simulation tests and append them to a tech debt track or fix them immediately.
## Anti-Entropy Protocol
- **State Auditing**: Before adding new state variables to a class, you MUST use `py_get_code_outline` or `py_get_definition` on the target class's `__init__` method (and any relevant configuration loading methods) to check for existing, unused, or duplicate state variables. DO NOT create redundant state if an existing variable can be repurposed or extended.
- **TDD Enforcement**: You MUST ensure that failing tests (the "Red" phase) are written and executed successfully BEFORE delegating implementation tasks to Tier 3 Workers. Do NOT accept an implementation from a worker if you haven't first verified the failure of the corresponding test case.
## Surgical Delegation Protocol
When delegating to Tier 3 workers, construct prompts that specify:
- **WHERE**: Exact file and line range to modify
- **WHAT**: The specific change (add function, modify dict, extend table)
- **HOW**: Which API calls, data structures, or patterns to use
- **SAFETY**: Thread-safety constraints (e.g., "push via `_pending_gui_tasks` with lock")
Example prompt: `"In gui_2.py, modify _render_mma_dashboard (lines 2685-2699). Extend the token usage table from 3 to 5 columns by adding 'Model' and 'Est. Cost'. Use imgui.table_setup_column(). Import cost_tracker. Use 1-space indentation."`
## Limitations
- Do not perform heavy implementation work directly; delegate to Tier 3.
- Delegate implementation tasks to Tier 3 Workers using `uv run python scripts/mma_exec.py --role tier3-worker "[PROMPT]"`.
- For error analysis of large logs, use `uv run python scripts/mma_exec.py --role tier4-qa "[PROMPT]"`.
- Minimize full file reads for large modules; rely on "Skeleton Views" and git diffs.
description: Focused on TDD implementation, surgical code changes, and following specific specs.
---
# MMA Tier 3: Worker
You are the Tier 3 Worker. Your role is to implement specific, scoped technical requirements, follow Test-Driven Development (TDD), and make surgical code modifications. You operate in a stateless manner (Context Amnesia).
## Responsibilities
- Implement code strictly according to the provided prompt and specifications.
- **TDD Mandatory Enforcement**: You MUST write a failing test and verify it fails (the "Red" phase) BEFORE writing any implementation code. Do NOT write tests that contain only `pass` or lack meaningful assertions. A test is only valid if it accurately reflects the intended behavioral change and fails in the absence of the implementation.
- Write failing tests first, then implement the code to pass them.
- Ensure all changes are minimal, functional, and conform to the requested standards.
- Utilize provided tool access (read_file, write_file, etc.) to perform implementation and verification.
## Limitations
- Do not make architectural decisions.
- Do not modify unrelated files beyond the immediate task scope.
- Always operate statelessly; assume each task starts with a clean context.
- Rely on "Skeleton Views" provided by Tier 2/Orchestrator for understanding dependencies.
description: Focused on test analysis, error summarization, and bug reproduction.
---
# MMA Tier 4: QA Agent
You are the Tier 4 QA Agent. Your role is to analyze error logs, summarize tracebacks, and help diagnose issues efficiently. You operate in a stateless manner (Context Amnesia).
## Responsibilities
- Compress large stack traces or log files into concise, actionable summaries.
- Identify the root cause of test failures or runtime errors.
- Provide a brief, technical description of the required fix.
- Utilize provided diagnostic and exploration tools to verify failures.
## Limitations
- Do not implement the fix directly.
- Ensure your output is extremely brief and focused.
- Always operate statelessly; assume each analysis starts with a clean context.
"description":"Get a compact heuristic summary of a file without reading its full content. For Python: imports, classes, methods, functions, constants. For TOML: table keys. For Markdown: headings. Others: line count + preview. Use this before read_file to decide if you need the full content.",
"parameters":{
"type":"object",
"properties":{
"path":{
"type":"string",
"description":"Absolute or relative path to the file to summarise."
"description":"Get a hierarchical outline of a code file. This returns classes, functions, and methods with their line ranges and brief docstrings. Use this to quickly map out a file's structure before reading specific sections.",
"parameters":{
"type":"object",
"properties":{
"path":{
"type":"string",
"description":"Path to the code file (currently supports .py)."
"description":"Get a skeleton view of a Python file. This returns all classes and function signatures with their docstrings, but replaces function bodies with '...'. Use this to understand module interfaces without reading the full implementation.",
"description":"Run a PowerShell script within the project base_dir. Use this to create, edit, rename, or delete files and directories. stdout and stderr are returned to you as the result.",
"description":"Search for files matching a glob pattern within an allowed directory. Supports recursive patterns like '**/*.py'. Use this to find files by extension or name pattern.",
"parameters":{
"type":"object",
"properties":{
"path":{
"type":"string",
"description":"Absolute path to the directory to search within."
},
"pattern":{
"type":"string",
"description":"Glob pattern, e.g. '*.py', '**/*.toml', 'src/**/*.rs'."
description: Fast, read-only agent for exploring the codebase structure
mode: subagent
model: MiniMax-M2.5
temperature: 0.2
permission:
edit: deny
bash:
"*": ask
"git status*": allow
"git diff*": allow
"git log*": allow
"ls*": allow
"dir*": allow
---
You are a fast, read-only agent specialized for exploring codebases. Use this when you need to quickly find files by patterns, search code for keywords, or answer about the codebase.
## CRITICAL: MCP Tools Only (Native Tools Banned)
You MUST use Manual Slop's MCP tools. Native OpenCode tools are unreliable.
### Read-Only MCP Tools (USE THESE)
| Native Tool | MCP Tool |
|-------------|----------|
| `read` | `manual-slop_read_file` |
| `glob` | `manual-slop_search_files` or `manual-slop_list_directory` |
description: General-purpose agent for researching complex questions and executing multi-step tasks
mode: subagent
model: MiniMax-M2.5
temperature: 0.3
---
A general-purpose agent for researching complex questions and executing multi-step tasks. Has full tool access (except todo), so it can make file changes when needed.
## CRITICAL: MCP Tools Only (Native Tools Banned)
You MUST use Manual Slop's MCP tools. Native OpenCode tools are unreliable.
### Read MCP Tools (USE THESE)
| Native Tool | MCP Tool |
|-------------|----------|
| `read` | `manual-slop_read_file` |
| `glob` | `manual-slop_search_files` or `manual-slop_list_directory` |
2. Draft surgical prompt with WHERE/WHAT/HOW/SAFETY
3. Delegate to Tier 3 via Task tool
4. Verify result
## Pre-Delegation Checkpoint (MANDATORY)
Before delegating ANY dangerous or non-trivial change to Tier 3:
```powershell
gitadd.
```
**WHY**: If a Tier 3 Worker fails or incorrectly runs `git restore`, you will lose ALL prior AI iterations for that file if it wasn't staged/committed.
## Architecture Fallback
When implementing tracks that touch core systems, consult the deep-dive docs:
-`docs/guide_architecture.md`: Thread domains, event system, AI client, HITL mechanism
-`docs/guide_tools.md`: MCP Bridge security, 26-tool inventory, Hook API endpoints
-`docs/guide_mma.md`: Ticket/Track data structures, DAG engine, ConductorEngine
description: Invoke Tier 1 Orchestrator for product alignment, high-level planning, and track initialization
agent: tier1-orchestrator
---
$ARGUMENTS
---
## Context
You are now acting as Tier 1 Orchestrator.
### Primary Responsibilities
- Product alignment and strategic planning
- Track initialization (`/conductor-new-track`)
- Session setup (`/conductor-setup`)
- Delegate execution to Tier 2 Tech Lead
### The Surgical Methodology (MANDATORY)
1.**AUDIT BEFORE SPECIFYING**: Never write a spec without first reading actual code using MCP tools. Document existing implementations with file:line references.
2.**IDENTIFY GAPS, NOT FEATURES**: Frame requirements around what's MISSING.
3.**WRITE WORKER-READY TASKS**: Each task must specify WHERE/WHAT/HOW/SAFETY.
4.**REFERENCE ARCHITECTURE DOCS**: Link to `docs/guide_*.md` sections.
### Limitations
- READ-ONLY: Do NOT write code or edit files (except track spec/plan/metadata)
- Do NOT execute tracks — delegate to Tier 2
- Do NOT implement features — delegate to Tier 3 Workers
description: Invoke Tier 2 Tech Lead for architectural design and track execution
agent: tier2-tech-lead
---
$ARGUMENTS
---
## Context
You are now acting as Tier 2 Tech Lead.
### Primary Responsibilities
- Track execution (`/conductor-implement`)
- Architectural oversight
- Delegate to Tier 3 Workers via Task tool
- Delegate error analysis to Tier 4 QA via Task tool
- Maintain persistent memory throughout track execution
### Context Management
**MANUAL COMPACTION ONLY** — Never rely on automatic context summarization.
You maintain PERSISTENT MEMORY throughout track execution — do NOT apply Context Amnesia to your own session.
### Pre-Delegation Checkpoint (MANDATORY)
Before delegating ANY dangerous or non-trivial change to Tier 3:
```
git add .
```
**WHY**: If a Tier 3 Worker fails or incorrectly runs `git restore`, you will lose ALL prior AI iterations for that file if it wasn't staged/committed.
### TDD Protocol (MANDATORY)
1.**Red Phase**: Write failing tests first — CONFIRM FAILURE
2.**Green Phase**: Implement to pass — CONFIRM PASS
3.**Refactor Phase**: Optional, with passing tests
- **ALWAYS use snake_case**: `old_string`, `new_string`, `replace_all`
- **NEVER use camelCase**: `oldString`, `newString`, `replaceAll`
## Project Overview
**Manual Slop** is a local GUI application designed as an experimental, "manual" AI coding assistant. It allows users to curate and send context (files, screenshots, and discussion history) to AI APIs (Gemini and Anthropic). The AI can then execute PowerShell scripts within the project directory to modify files, requiring explicit user confirmation before execution.
- **Platform Support**: Windows (PowerShell) — single developer, local use
- **DO NOT**: Read full files >50 lines without using `py_get_skeleton` or `get_file_summary` first. Do NOT perform heavy implementation directly — delegate to Tier 3 Workers.
## Environment
- Shell: PowerShell (pwsh) on Windows
- Do NOT use bash-specific syntax (use PowerShell equivalents)
- Use `uv run` for all Python execution
- Path separators: forward slashes work in PowerShell
- **Shell execution in Claude Code**: The `Bash` tool runs in a mingw sandbox on Windows and produces unreliable/empty output. Use `run_powershell` MCP tool for ALL shell commands (git, tests, scans). Bash is last-resort only when MCP server is not running.
## Session Startup Checklist
**IMPORTANT**: At the start of each session:
1.**Check TASKS.md** — look for IN_PROGRESS or BLOCKED tracks
2.**Review recent JOURNAL.md entries** — scan last 2-3 entries for context
3.**If resuming work**: run `/conductor-setup` to load full context
4.**If starting fresh**: run `/conductor-status` for overview
**Manual Slop** is a local GUI application designed as an experimental, "manual" AI coding assistant. It allows users to curate and send context (files, screenshots, and discussion history) to AI APIs (Gemini and Anthropic). The AI can then execute PowerShell scripts within the project directory to modify files, requiring explicit user confirmation before execution.
***`gui_legacy.py`:** The main entry point and Dear PyGui application logic. Handles all panels, layouts, user input, and confirmation dialogs.
***`ai_client.py`:** A unified wrapper for both Gemini and Anthropic APIs. Manages sessions, tool/function-call loops, token estimation, and context history management.
***`aggregate.py`:** Responsible for building the `file_items` context. It reads project configurations, collects files and screenshots, and builds the context into markdown format to send to the AI.
***`mcp_client.py`:** Implements MCP-like tools (e.g., `read_file`, `list_directory`, `search_files`, `web_search`) as native functions that the AI can call. Enforces a strict allowlist for file access.
***`shell_runner.py`:** A sandboxed subprocess wrapper that executes PowerShell scripts (`powershell -NoProfile -NonInteractive -Command`) provided by the AI.
***`project_manager.py`:** Manages per-project TOML configurations (`manual_slop.toml`), serializes discussion entries, and integrates with git (e.g., fetching current commit).
***`session_logger.py`:** Handles timestamped logging of communication history (JSON-L) and tool calls (saving generated `.ps1` files).
# Building and Running
***Setup:** The application uses `uv` for dependency management. Ensure `uv` is installed.
***Credentials:** You must create a `credentials.toml` file in the root directory to store your API keys:
```toml
[gemini]
api_key = "****"
[anthropic]
api_key = "****"
```
* **Run the Application:**
```powershell
uv run .\gui_2.py
```
# Development Conventions
* **Configuration Management:** The application uses two tiers of configuration:
* `config.toml`: Global settings (UI theme, active provider, list of project paths).
* `manual_slop.toml`: Per-project settings (files to track, discussion history, specific system prompts).
* **Tool Execution:** The AI acts primarily by generating PowerShell scripts. These scripts MUST be confirmed by the user via a GUI modal before execution. The AI also has access to read-only MCP-style file exploration tools and web search capabilities.
* **Context Refresh:** After every tool call that modifies the file system, the application automatically refreshes the file contents in the context using the files' `mtime` to optimize reads.
* **UI State Persistence:** Window layouts and docking arrangements are automatically saved to and loaded from `dpg_layout.ini`.
* **Code Style:**
* Use type hints where appropriate.
* Internal methods and variables are generally prefixed with an underscore (e.g., `_flush_to_project`, `_do_generate`).
* **Logging:** All API communications are logged to `logs/comms_<ts>.log`. All executed scripts are saved to `scripts/generated/`.
- **Why**: Zero visibility into context window usage; `get_history_bleed_stats` existed but had no UI
- **How**: Extended `get_history_bleed_stats` with `_add_bleed_derived` helper (adds 8 derived fields); added `_render_token_budget_panel` with color-coded progress bar, breakdown table, trim warning, Gemini/Anthropic cache status; 3 auto-refresh triggers (`_token_stats_dirty` flag); `/api/gui/token_stats` endpoint; `--timeout` flag on `claude_mma_exec.py`
- **Issues**: `set_file_slice` dropped `def _render_message_panel` line — caught by outline check, fixed with 1-line insert. Tier 3 delegation via `run_powershell` hard-capped at 60s — implemented changes directly per user approval; added `--timeout` flag for future use.
- **Result**: 17 passing tests, all phases verified by user. Token panel visible in AI Settings under "Token Budget". Commits: 5bfb20f → d577457.
### Next: mma_agent_focus_ux (planned, not yet tracked)
- **Why**: All panels are global/session-scoped; in MMA mode with 4 tiers, data from all agents mixes. No way to isolate what a specific tier is doing.
- **Gap**: `_comms_log` and `_tool_log` have no tier/agent tag. `mma_streams` stream_id is the only per-agent key that exists.
- **See**: conductor/tracks.md for full audit and implementation intent.
- **What**: Audited codebase for feature bleed; initialized 2 new conductor tracks
- **Why**: Entropy from Tier 2 track implementations — redundant code, dead methods, layout regressions, no tier context in observability
- **Bleed findings** (gui_2.py): Dead duplicate `_render_comms_history_panel` (3041-3073, stale `type` key, wrong method ref); dead `begin_main_menu_bar()` block (1680-1705, Quit has never worked); 4 duplicate `__init__` assignments; double "Token Budget" label with no collapsing header
- **Agent focus findings** (ai_client.py + conductors): No `current_tier` var; Tier 3 swaps callback but never stamps tier; Tier 2 doesn't swap at all; `_tool_log` is untagged tuple list
- **Result**: 2 tracks committed (4f11d1e, c1a86e2). Bleed cleanup is active; agent focus depends on it.
- **More Tracks**: Initialized 'tech_debt_and_test_cleanup_20260302' and 'conductor_workflow_improvements_20260302' to harden TDD discipline, resolve test tech debt (false-positives, dupes), and mandate AST-based codebase auditing.
- **Final Track**: Initialized 'architecture_boundary_hardening_20260302' to fix the GUI HITL bypass allowing direct AST mutations, patch token bloat in `mma_exec.py`, and implement cascading blockers in `dag_engine.py`.
- **Testing Consolidation**: Initialized 'testing_consolidation_20260302' track to standardize simulation testing workflows around the pytest `live_gui` fixture and eliminate redundant `subprocess.Popen` wrappers.
- **Dependency Order**: Added an explicit 'Track Dependency Order' execution guide to `conductor/tracks.md` to ensure safe progression through the accumulated tech debt.
- **Documentation**: Added guide_meta_boundary.md to explicitly clarify the difference between the Application's strict-HITL environment and the autonomous Meta-Tooling environment, helping future Tiers avoid feature bleed.
- **Heuristics & Backlog**: Added Data-Oriented Design and Immediate Mode architectural heuristics (inspired by Muratori/Acton) to product-guidelines.md. Logged future decoupling and robust parsing tracks to a 'Future Backlog' in TASKS.md.
- **What**: Removed all confirmed dead code and layout regressions from gui_2.py (3 phases)
- **Why**: Tier 3 workers had left behind dead duplicate methods, dead menu block, duplicate state vars, and a broken Token Budget layout that embedded the panel inside Provider & Model with double labels
- Phase 2: Deleted dead `begin_main_menu_bar()` block (24 lines, always-False in HelloImGui). Added working `Quit` to `_show_menus` via `runner_params.app_shall_exit = True`
- Phase 3: Removed 4 redundant Token Budget labels/call from `_render_provider_panel`. Added `collapsing_header("Token Budget")` to AI Settings with proper `_render_token_budget_panel()` call
- **Issues**: Full test suite hangs (pre-existing — `test_suite_performance_and_flakiness` backlog). Ran targeted GUI/MMA subset (32 passed) as regression proxy. Meta-Level Sanity Check: 52 ruff errors in gui_2.py before and after — zero new violations introduced
- **Result**: All 3 phases verified by user. Checkpoints: be7174c (Phase 1), 15fd786 (Phase 2), 0d081a2 (Phase 3)
- **Why**: All MMA observability panels were global/session-scoped; traffic from Tier 2/3/4 was indistinguishable
- **How**:
- Phase 1: Added `current_tier: str | None` module var to `ai_client.py`; `_append_comms` stamps `source_tier: current_tier` on every comms entry; `run_worker_lifecycle` sets `"Tier 3"` / `generate_tickets` sets `"Tier 2"` around `send()` calls, clears in `finally`; `_on_tool_log` captures `current_tier` at call time; `_append_tool_log` migrated from tuple to dict with `source_tier` field; `_pending_tool_calls` likewise. Checkpoint: bc1a570
- Phase 2: `_render_tool_calls_panel` migrated from tuple destructure to dict access. Checkpoint: 865d8dd
- Phase 3: `ui_focus_agent: str | None` state var added; Focus Agent combo (All/Tier2/3/4) + clear button above OperationsTabs; filter logic in `_render_comms_history_panel` and `_render_tool_calls_panel`; `[source_tier]` label per comms entry header. Checkpoint: b30e563
- **Issues**:
-`claude_mma_exec.py` fails with nested session block — user authorized inline implementation for this track
- Task 2.1 set_file_slice applied at shifted line, leaving stale tuple destructure + missing `i = i_minus_one + 1`; caught and fixed in Phase 3 Task 3.4
- **Known limitation**: `current_tier` is a module-level `str | None` — safe only because MMA engine serializes `send()` calls. Concurrent Tier 3/4 agents (future) will require `threading.local()` or per-ticket context passing. Logged to backlog.
- **Verification gap noted**: No API hook endpoints expose `ui_focus_agent` state for automated testing. Future tracks should wire widget state to `_settable_fields` for `live_gui` fixture verification. Logged to backlog.
- **Result**: 18 tests passing. Focus Agent combo visible in Operations Hub. Comms entries show `[main]`/`[Tier N]` labels. Meta-Level Sanity Check: 53 ruff errors in gui_2.py before and after — zero new violations.
- **What**: Attempted to centralize test fixtures and enforce test discipline.
- **Issues**: Track was launched with a flawed specification that misidentified critical headless API endpoints as "dead code." While centralized `app_instance` fixtures were successfully deployed, it exposed several zero-assertion tests and exacerbated deep architectural issues with the `asyncio` loop lifecycle, causing widespread `RuntimeError: Event loop is closed` warnings and test hangs.
- **Result**: Track was aborted and archived. A post-mortem `DEBRIEF.md` was generated.
### Strategic Shift: The Strict Execution Queue
- **What**: Systematically audited the Future Backlog and converted all pending technical debt into a strict, 9-track, linearly ordered execution queue in `conductor/tracks.md`.
- **Why**: "Mock-Rot" and stateless Tier 3 entropy. Tier 3 workers were blindly using `unittest.mock.patch` to pass tests without testing integration realities, creating a false sense of security.
- **How**:
- Defined the "Surgical Spec Protocol" to force Tier 1/2 agents to map exact `WHERE/WHAT/HOW/SAFETY` targets for workers.
- Initialized 7 new tracks: `test_stabilization_20260302`, `strict_static_analysis_and_typing_20260302`, `codebase_migration_20260302`, `gui_decoupling_controller_20260302`, `hook_api_ui_state_verification_20260302`, `robust_json_parsing_tech_lead_20260302`, `concurrent_tier_source_tier_20260302`, and `test_suite_performance_and_flakiness_20260302`.
- Added a highly interactive `manual_ux_validation_20260302` track specifically for tuning GUI animations and structural layout using a slow-mode simulation harness.
- **Result**: The project now has a crystal-clear, heavily guarded roadmap to escape technical debt and transition to a robust, Data-Oriented, type-safe architecture.
## 2026-03-02: Test Suite Stabilization & Simulation Hardening
***Track:** Test Suite Stabilization & Consolidation
***Outcome:** Track Completed Successfully
***Key Accomplishments:**
***Asyncio Lifecycle Fixes:** Eliminated pervasive Event loop is closed and coroutine was never awaited warnings in tests. Refactored conftest.py teardowns and test loop handling.
***Legacy Cleanup:** Completely removed gui_legacy.py and updated all 16 referencing test files to target gui_2.py, consolidating the architecture.
***Functional Assertions:** Replaced pytest.fail placeholders with actual functional assertions in pi_events, execution_engine, oken_usage, gent_capabilities, and gent_tools_wiring test suites.
***Simulation Hardening:** Addressed flakiness in est_extended_sims.py. Fixed timeouts and entry count regressions by forcing explicit GUI states (uto_add_history=True) during setup, and refactoring wait_for_ai_response to intelligently detect turn completions and tool execution stalls based on status transitions rather than just counting messages.
***Workflow Updates:** Updated conductor/workflow.md to establish a new rule forbidding full suite execution (pytest tests/) during verification to prevent long timeouts and threading access violations. Demanded batch-testing (max 4 files) instead.
***New Track Proposed:** Created sync_tool_execution_20260303 track to introduce concurrent background tool execution, reducing latency during AI research phases.
***Challenges:** The extended simulation suite ( est_extended_sims.py) was highly sensitive to the exact transition timings of the mocked gemini_cli and the background threading of gui_2.py. Required multiple iterations of refinement to simulation/workflow_sim.py to achieve stable, deterministic execution. The full test suite run proved unstable due to accumulation of open threads/loops across 360+ tests, necessitating a shift to batch-testing.
The Multi-Model Architecture (MMA) utilizes a 4-Tier hierarchy to ensure token efficiency and structural integrity. The primary agent (Conductor) acts as the Tier 2 Tech Lead, delegating specific, stateless tasks to Tier 3 (Workers) and Tier 4 (Utility) agents.
## 2. Agent Roles & Responsibilities
### Tier 2: The Conductor (Tech Lead)
- **Role:** Orchestrator of the project lifecycle via the Conductor framework.
- **Context:** High-reasoning, long-term memory of project goals and specifications.
- **If Worker:** Tier 2 applies the code changes (using `replace` or `write_file`) and verifies.
- **If QA:** Tier 2 uses the compressed error to inform the next fix attempt or passes it to a Worker.
## 4. System Prompt Management
The `run_subagent.ps1` script should be updated to maintain a library of role-specific system prompts, ensuring that Tier 3/4 agents remain focused and tool-free (to prevent nested complexity).
The 4-Tier Architecture relies on strictly managed data pipelines and configuration files to prevent token bloat and maintain a deterministically safe execution environment.
## 1. AST Extraction Pipelines (Memory Views)
To prevent LLMs from hallucinating or consuming massive context windows, raw file text is heavily restricted. The `file_cache.py` uses Tree-sitter for deterministic Abstract Syntax Tree (AST) parsing to generate specific views:
1.**The Directory Map (Tier 1):** Just filenames and nested paths (e.g., output of `tree /F`). No source code.
2.**The Skeleton View (Tier 2 & 3 Dependencies):** Extracts only `class` and `def` signatures, parameters, and type hints. Strips all docstrings and function bodies, replacing them with `pass`. Used for foreign modules a worker must call but not modify.
* Keeps module-level docstrings and block comments (heuristics).
* Keeps full bodies of functions marked with `@core_logic` or `# [HOT]`.
* Replaces standard function bodies with `... # Hidden`.
4.**The Raw View (Tier 3 Target File):** Unredacted, line-by-line source code of the *single* file a Tier 3 worker is assigned to modify.
## 2. Configuration Schema
The architecture separates sensitive billing logic from AI behavior routing.
***`credentials.toml` (Security Prerequisite):** Holds the bare metal authentication (`gemini_api_key`, `anthropic_api_key`, `deepseek_api_key`). **This file must be in `.gitignore`.** Loaded strictly for instantiating HTTP clients.
***`agents.toml` (AI Routing):** Defines the hardcoded hierarchy's operational behaviors. Includes fallback models (`default_expensive`, `default_cheap`), Tier 1/2 overarching parameters (temperature, base system prompts), and Tier 3 worker archetypes (`refactor`, `codegen`, `contract_stubber`) mapped to specific models (DeepSeek V3, Gemini Flash) and `trust_level` tags (`step` vs. `auto`).
## 3. LLM Output Formats
To ensure robust parser execution and avoid JSON string-escaping nightmares, the architecture uses a hybrid approach for LLM outputs depending on the Tier:
***Native Structured Outputs (JSON Schema forced by API):** Used for Tier 1 and Tier 2 routing and orchestration. The model provider mathematically guarantees the syntax, allowing clean parsing of `Track` and `Ticket` metadata by `pydantic`.
***XML Tags (`<file_path>`, `<file_content>`):** Used for Tier 3 Code Generation & Tools. It natively isolates syntax and requires zero string escaping. The UI/Orchestrator parses these via regex to safely extract raw Python code without bracket-matching failures.
* **Godot ECS Flat List (Linearized Entities with ID Pointers):** Instead of deeply nested JSON (which models hallucinate across 500 tokens), Tier 1/2 Orchestrators define complex dependency DAGs as a flat list of items (e.g., `[Ticket id="tkt_impl" depends_on="tkt_stub"]`). The Python state machine reconstructs the DAG locally.
The implementation and verification of the 4-Tier Hierarchical Multi-Model Architecture (MMA) within the Conductor framework have been successfully completed. The architecture provides a robust "Token Firewall" that prevents the primary context from being bloated by repetitive coding tasks and massive error traces.
## 2. Architectural Findings
### Centralized Strategy vs. Role-Based Sub-Agents
- **Decision:** A Hybrid Approach was implemented.
- **Rationale:** The Tier 2 Orchestrator (Conductor) maintains the high-level strategy via a centralized skill, while Tier 3 (Worker) and Tier 4 (QA) agents are governed by surgical, role-specific system prompts. This ensures that sub-agents remain focused and stateless without the overhead of complex, nested tool-usage logic.
### Delegation Efficacy
- **Tier 3 (Worker):** Successfully isolated code generation from the main conversation. The worker generates clean code/diffs that are then integrated by the Orchestrator.
- **Tier 4 (QA):** Demonstrated superior token efficiency by compressing multi-hundred-line stack traces into ~20-word actionable fixes.
- **Traceability:** The `-ShowContext` flag in `scripts/run_subagent.ps1` provides immediate visibility into the "Connective Tissue" of the hierarchy, allowing human supervisors to monitor the hand-offs.
To safely refactor a linear, single-agent codebase into the 4-Tier Multi-Model Architecture without breaking the working prototype, the implementation should be sequenced into these five isolated Epics (Tracks):
## Track 1: The Memory Foundations (AST Parser)
**Goal:** Build the engine that prevents token-bloat by turning massive source files into curated memory views.
**Implementation Details:**
1. Integrate `tree-sitter` and language bindings into `file_cache.py`.
2. Build `ASTParser` extraction rules:
**Skeleton View:* Strip function/class bodies, preserving only signatures, parameters, and type hints.
**Curated View:* Preserve class structures, module docstrings, and bodies of functions marked `# [HOT]` or `@core_logic`. Replace standard bodies with `... # Hidden`.
3.**Acceptance:**`file_cache.get_curated_view('script.py')` returns a perfectly formatted summary string in the terminal.
## Track 2: State Machine & Data Structures
**Goal:** Define the rigid Python objects the AI agents will pass to each other to rely on structured data, not loose chat strings.
**Implementation Details:**
1. Create `models.py` with `pydantic` or `dataclasses` for `Track` (Epic) and `Ticket` (Task).
2. Define `WorkerContext` holding the Ticket ID, assigned model (from `agents.toml`), isolated `credentials.toml` injection, and a `messages` payload array.
3. Add helper methods for state mutators (e.g., `ticket.mark_blocked()`, `ticket.mark_complete()`).
4.**Acceptance:** Instantiate a `Track` with 3 `Tickets` and successfully enforce state changes in Python without AI involvement.
## Track 3: The Linear Orchestrator & Execution Clutch
**Goal:** Build the synchronous, debuggable core loop that runs a single Tier 3 Worker and pauses for human approval.
**Implementation Details:**
1. Create `multi_agent_conductor.py` with a `run_worker_lifecycle(ticket: Ticket)` function.
2. Inject context (Raw View from `file_cache.py`) and format the `messages` array for the API.
3. Implement the Clutch (HITL): `input()` pause for CLI or wait state for GUI before executing the returned tool (e.g., `write_file`). Allow manual memory mutation of the JSON payload.
4.**Acceptance:** The script sends a hardcoded Ticket to DeepSeek, pauses in the terminal showing a diff, waits for user approval, applies the diff via `mcp_client.py`, and wipes the worker's history.
## Track 4: Tier 4 QA Interception
**Goal:** Stop error traces from destroying the Worker's token window by routing crashes through a stateless translator.
**Implementation Details:**
1. In `shell_runner.py`, intercept `stderr` (e.g., `returncode != 0`).
2. Do *not* append `stderr` to the main Worker's history. Instead, instantiate a synchronous API call to the `default_cheap` model.
3. Prompt: *"You are an error parser. Output only a 1-2 sentence instruction on how to fix this syntax error."* Send the raw `stderr` and target file snippet.
4. Append the translated 20-word fix to the main Worker's history as a "System Hint".
5.**Acceptance:** A deliberate syntax error triggers the execution engine to silently ping the cheap API, returning a 20-word correction to the Worker instead of a 200-line stack trace.
## Track 5: UI Decoupling & Tier 1/2 Routing (The Final Boss)
**Goal:** Bring the system online by letting Tier 1 and Tier 2 dynamically generate Tickets managed by the async Event Bus.
**Implementation Details:**
1. Implement an `asyncio.Queue` in `multi_agent_conductor.py`.
2. Write Tier 1 & 2 system prompts forcing output as strict JSON arrays (Tracks and Tickets).
3. Write the Dispatcher async loop to convert JSON into `Ticket` objects and push to the queue.
4. Enforce the Stub Resolver: If a Ticket archetype is `contract_stubber`, pause dependent Tickets, run the stubber, trigger `file_cache.py` to rebuild the Skeleton View, then resume.
5. **Acceptance:** Vague prompt ("Refactor config system") results in Tier 1 Track, Tier 2 Tickets (Interface stub + Implementation). System executes stub, updates AST, and finishes implementation automatically (or steps through if Linear toggle is on).
To transition from a linear, single-agent chat box to a multi-agent control center, the GUI must be decoupled from the LLM execution loops. A single-agent UI assumes a linear flow (*User types -> UI waits -> LLM responds -> UI updates*), which freezes the application if a Tier 1 PM waits for human approval while Tier 3 Workers run local tests in the background.
## 1. The Async Event Bus (Decoupling UI from Agents)
The GUI acts as a "dumb" renderer. It only renders state; it never manages state.
***The Agent Bus (Message Queue):** A thread-safe signaling system (e.g., `asyncio.Queue`, `pyqtSignal`) passes messages between agents, UI, and the filesystem.
***Background Workers:** When Tier 1 spawns a Tier 2 Tech Lead, the GUI does not wait. It pushes a `UserRequestEvent` to the Conductor's queue. The Conductor runs the LLM call asynchronously and fires `StateUpdateEvents` back for the GUI to redraw.
## 2. The Execution Clutch (HITL)
Every spawned worker panel implements an execution state toggle based on the `trust_level` defined in `agents.toml`.
***Step Mode (Lock-step):** The worker pauses **twice** per cycle:
1.*After* generating a response/tool-call, but *before* executing the tool. The GUI renders a preview (e.g., diff of lines 40-50) and offers `[Approve]`, `[Edit Payload]`, or `[Abort]`.
2.*After* executing the tool, but *before* sending output back to the LLM (allows verification of the system output).
***Auto Mode (Fire-and-forget):** The worker loops continuously until it outputs a "Task Complete" status to the Router.
## 3. Memory Mutation (The "Debug" Superpower)
If a worker generates a flawed plan in Step Mode, the "Memory Mutator" allows the user to click the last message and edit the raw JSON/text directly before hitting "Approve." By rewriting the AI's brain mid-task, the model proceeds as if it generated the correct idea, saving the context window from restarting due to a minor hallucination.
## 4. The Global Execution Toggle
A Global Execution Toggle overrides all individual agent trust levels for debugging race conditions or context leaks.
***Mode = "async" (Production):** The Dispatcher throws Tickets into an `asyncio.TaskGroup`. They spawn instantly, fight for API rate limits, read the skeleton, and run in parallel.
***Mode = "linear" (Debug):** The Dispatcher iterates through the array sequentially using a strict `for` loop. It `awaits` absolute completion of Ticket 1 (including QA loops and code review) before instantiating the `WorkerAgent` for Ticket 2. This enforces a deterministic state machine and outputs state snapshots (`debug_state.json`) for manual verification.
## 5. State Machine (Dataclasses)
The Conductor relies on strict definitions for `Track` and `Ticket` to enforce state and UI rendering (e.g., using `dataclasses` or `pydantic`).
***`Ticket`:** Contains `id`, `target_file`, `prompt`, `worker_archetype`, `status` (pending, running, blocked, step_paused, completed), and a `dependencies` list of Ticket IDs that must finish first.
* **`Track`:** Contains `id`, `title`, `description`, `status`, and a list of `Tickets`.
This system rejects the "monolithic black-box" approach to agentic coding. Instead of passing an entire codebase into a single expensive context window, the architecture mimics a senior engineering department. It uses a 4-Tier hierarchy where cognitive load and context are aggressively filtered from top to bottom.
Expensive, high-reasoning models manage metadata and architecture (Tier 1 & 2), while cheap, fast models handle repetitive syntax and error parsing (Tier 3 & 4).
### 1.1 Core Paradigms
* **Token Firewalling:** Error logs and deep history are never allowed to bubble up to high-tier models. The system relies heavily on abstracted AST views (Skeleton, Curated) rather than raw code when context allows.
* **Context Amnesia:** Worker agents (Tier 3) have their trial-and-error histories wiped upon task completion to prevent context ballooning and hallucination.
* **The Execution Clutch (HITL):** Agents operate based on Archetype Trust Scores defined in configuration. Trusted patterns run in `Auto` mode; untrusted or complex refactors run in `Step` mode, pausing before tool execution for human review and JSON history mutation.
* **Interface-Driven Development (IDD):** The architecture inherently prioritizes the creation of contracts (stubs, schemas) before implementation, allowing workers to proceed in parallel without breaking cross-module boundaries.
# Tier 1: The Top-Level Orchestrator (Product Manager)
**Designated Models:** Gemini 3.1 Pro, Claude 3.5 Sonnet.
**Execution Frequency:** Low (Start of feature, Macro-merge resolution).
**Core Role:** Epic planning, architecture enforcement, and cross-module task delegation.
The Tier 1 Orchestrator is the most capable and expensive model in the hierarchy. It operates strictly on metadata, summaries, and executive-level directives. It **never** sees raw implementation code.
***What it Ignores:** All source code, all AST skeletons, and all previous micro-task histories.
***Output Format:** A JSON array (Godot ECS Flat List format) of `Tracks` (Jira Epics), identifying which modules will be affected, the required Tech Lead persona, and the severity level.
### Path B: Track Delegation (Sprint Kickoff)
***Trigger:** The PM is handing a defined Track down to a Tier 2 Tech Lead.
***What it Sees (Context):**
***The Target Track:** The specific goal and Acceptance Criteria generated in Path A.
***Module Interfaces (Skeleton View):** Strict AST skeleton (just class/function definitions) *only* for the modules this specific Track is allowed to touch.
***Track Roster:** A list of currently active or completed Tracks to prevent duplicate work.
***What it Ignores:** Unrelated module docs, original massive user prompt, implementation details.
***Output Format:** A compiled "Track Brief" (system prompt + curated file list) passed to instantiate the Tier 2 Tech Lead panel.
The Tech Lead bridges the gap between high-level architecture and actual code syntax. It operates in a "need-to-know" state, utilizing AST parsing (`file_cache.py`) to keep token counts low while maintaining structural awareness of its assigned modules.
## Memory Context & Paths
### Path A: Sprint Planning (Task Delegation)
***Trigger:** Tier 1 (PM) assigns a Track (Epic) and wakes up the Tech Lead.
***What it Sees (Context):**
***The Track Brief:** Acceptance Criteria from Tier 1.
***Curated Implementation View (Target Modules):** AST-extracted class structures, docstrings, and `# [HOT]` function bodies for the 1-3 files this Track explicitly modifies.
***Skeleton View (Foreign Modules):** Only function signatures and return types for external dependencies.
***What it Ignores:** The rest of the repository, the PM's overarching project-planning logic, raw line-by-line code of non-hot functions.
***Output Format:** A JSON array (Godot ECS Flat List format) of discrete Tier 3 `Tickets` (e.g., Ticket 1: *Write DB migration script*, Ticket 2: *Update core API endpoints*), including `depends_on` pointers to construct an execution DAG.
### Path B: Code Review (Local Integration)
***Trigger:** A Tier 3 Contributor completes a Ticket and submits a diff, OR Tier 4 (QA) flags a persistent failure.
***What it Sees (Context):**
***Specific Ticket Goal:** What the Contributor was instructed to do.
***Proposed Diff:** The exact line changes submitted by Tier 3.
***Test/QA Output:** Relevant logs from Tier 4 compiler checks.
***Curated Implementation View:** To cross-reference the proposed diff against the existing architecture.
***What it Ignores:** The Contributor's internal trial-and-error chat history. It only sees the final submission.
***Output Format:***Approve* (merges diff into working branch and updates Curated View) or *Reject* (sends technical critique back to Tier 3).
### Path C: Track Finalization (Upward Reporting)
***Trigger:** All Tier 3 Tickets assigned to this Track are marked "Approved."
***What it Sees (Context):**
***Original Track Brief:** To verify requirements were met.
***Aggregated Track Diff:** The sum total of all changes made across all Tier 3 Tickets.
***Dependency Delta:** A list of any new foreign modules or libraries imported.
***What it Ignores:** The back-and-forth review cycles, original AST Curated View.
***Output Format:** An Executive Summary and the final Macro-Diff, sent back to Tier 1.
***Trigger:** Tier 2 evaluates a Track and detects a cross-module dependency (or a single massive refactor) requiring an undefined signature.
***Role:** Force Interface-Driven Development (IDD) to prevent hallucination.
***Execution Flow:**
1.**Contract Definition:** Splits requirement into a `Stub Ticket`, `Consumer Ticket`, and `Implementation Ticket`.
2.**Stub Generation:** Spawns a cheap Tier 3 worker (e.g., DeepSeek V3 `contract_stubber` archetype) to generate the empty function signature, type hints, and docstrings.
3.**Skeleton Broadcast:** The stub merges, and the system instantly re-runs Tree-sitter to update the global Skeleton View.
4. **Parallel Implementation:** Tier 2 simultaneously spawns the `Consumer` (codes against the skeleton) and the `Implementer` (fills the stub logic) in isolated contexts.
**Core Role:** Generating syntax, writing localized files, running unit tests.
The engine room of the system. Contributors execute the highest volume of API calls. Their memory context is ruthlessly pruned. By leveraging cheap, fast models, they operate with zero architectural anxiety—they just write the code they are assigned. They are "Amnesiac Workers," having their history wiped between tasks to prevent context ballooning.
## Memory Context & Paths
### Path A: Heads Down Execution (Task Execution)
***Trigger:** Tier 2 (Tech Lead) hands down a hyper-specific Ticket.
***What it Sees (Context):**
***The Ticket Prompt:** The exact, isolated instructions from Tier 2.
***The Target File (Raw View):** The raw, unredacted, line-by-line source code of *only* the specific file (or class/function) it was assigned to modify.
***Foreign Interfaces (Skeleton View):** Strict AST skeleton (signatures only) of external dependencies required by the ticket.
***What it Ignores:** Epic/Track goals, Tech Lead's Curated View, other files in the same directory, parallel Tickets.
***Output Format:** XML Tags (`<file_path>`, `<file_content>`) defining direct file modifications or `mcp_client.py` tool payloads.
**Execution Frequency:** On-demand (Intercepts local failures).
**Core Role:** Single-shot, stateless translation of machine garbage into human English.
Tier 4 acts as the financial firewall. It solves the expensive problem of feeding massive (e.g., 3,000-token) stack traces back into a mid-tier LLM's context window. Tier 4 agents wake up, translate errors, and immediately die.
## Memory Context & Paths
### Path A: The Stack Trace Interceptor (Translator)
***Trigger:** A Tier 3 Contributor executes a script, resulting in a non-zero exit code with a massive `stderr` payload.
***What it Sees (Context):**
***Raw Error Output:** The exact traceback from the runtime/compiler.
***Offending Snippet:***Only* the specific function or 20-line block of code where the error originated.
***What it Ignores:** Everything else. It is blind to the "Why" and focuses only on "What broke."
***Output Format:** A surgical, highly compressed string (20-50 tokens) passed back into the Tier 3 Contributor's working memory (e.g., "Syntax Error on line 42: You missed a closing parenthesis. Add `]`").
### Path B: The Linter / Formatter (Pedant)
***Trigger:** Tier 3 believes it finished a Ticket, but pre-commit hooks (e.g., `ruff`, `eslint`) fail.
***What it Sees (Context):**
***Linter Warning:** Specific error (e.g., "Line too long", "Missing type hint").
***Target File:** Code written by Tier 3.
***What it Ignores:** Business logic. It only cares about styling rules.
***Output Format:** A direct `sed` command or silent diff overwrite via tools to fix the formatting without bothering Tier 2 or consuming Tier 3 loops.
### Path C: The Flaky Test Debugger (Isolator)
***Trigger:** A localized unit test fails due to logic (e.g., `assert 5 == 4`), not a syntax crash.
***What it Sees (Context):**
***Failing Test Function:** The exact `pytest` or `go test` block.
***Target Function:** The specific function being tested.
***What it Ignores:** The rest of the test suite and module.
* **Output Format:** A quick diagnosis sent to Tier 3 (e.g., "The test expects an integer, but your function is currently returning a stringified float. Cast to `int`").
This skill enforces the 4-Tier Hierarchical Multi-Model Architecture (MMA) directly within the Gemini CLI using Token Firewalling and sub-agent task delegation. It teaches the CLI how to act as a Tier 1/2 Orchestrator, dispatching stateless tasks to cheaper models using shell commands, thereby preventing massive error traces or heavy coding contexts from polluting the primary prompt context.
<instructions>
# MMA Token Firewall & Tiered Delegation Protocol
You are operating as a Tier 1 Product Manager or Tier 2 Tech Lead within the MMA Framework. Your context window is extremely valuable and must be protected from token bloat (such as raw, repetitive code edits, trial-and-error histories, or massive stack traces).
To accomplish this, you MUST delegate token-heavy or stateless tasks to "Tier 3 Contributors" or "Tier 4 QA Agents" by spawning secondary Gemini CLI instances via `run_shell_command`.
**CRITICAL Prerequisite:**
To avoid hanging the CLI and ensure proper environment authentication, you MUST NOT call the `gemini` command directly. Instead, you MUST use the wrapper script:
`.\scripts\run_subagent.ps1 -Prompt "..."`
## 1. The Tier 3 Worker (Heads-Down Coding)
When you need to perform a significant code modification (e.g., refactoring a 500-line script, writing a massive class, or implementing a predefined spec):
1.**DO NOT** attempt to write or use `replace`/`write_file` yourself. Your history will bloat.
2.**DO** construct a single, highly specific prompt.
3.**DO** spawn a sub-agent using `run_shell_command` pointing to the target file.
*Command:*`.\scripts\run_subagent.ps1 -Prompt "Modify [FILE_PATH] to implement [SPECIFIC_INSTRUCTION]. Only write the code, no pleasantries."`
4. If you need the sub-agent to automatically apply changes instead of just returning the text, use `gemini run` or pipe the output appropriately. However, the best method is to let the sub-agent modify the code and return "Done."
## 2. The Tier 4 QA Agent (Error Translation)
If you run a local test (e.g., `npm test`, `pytest`, `go run`) via `run_shell_command` and it fails with a massive traceback (e.g., 200+ lines of `stderr`):
1.**DO NOT** analyze the raw `stderr` in your own context window.
2.**DO** immediately spawn a stateless Tier 4 agent to compress the error.
3.*Command:*`.\scripts\run_subagent.ps1 -Prompt "Summarize this stack trace into a 20-word fix: [PASTE_SNIPPET_OF_STDERR_HERE]"`
4. Use the 20-word fix returned by the Tier 4 agent to inform your next architectural decision or pass it to the Tier 3 worker.
## 3. Context Amnesia (Phase Checkpoints)
When you complete a major Phase or Track within the `conductor` workflow:
1. Stage your changes and commit them.
2. Draft a comprehensive summary of the state changes in a Git Note attached to the commit.
3. Treat the checkpoint as a "Memory Wipe." Actively disregard previous conversational turns and trial-and-error histories. Rely exclusively on the newly generated Git Note and the physical state of the files on disk for your next Phase.
</instructions>
<examples>
### Example 1: Spawning a Tier 4 QA Agent
**User / System:** `pytest tests/test_gui.py` failed with 400 lines of output.
**Agent (You):**
```json
{
"command":".\\scripts\\run_subagent.ps1 -Prompt \"Summarize this stack trace into a 20-word fix: [snip first 30 lines...]\"",
"description":"Spawning Tier 4 QA to compress error trace statelessly."
}
```
### Example 2: Spawning a Tier 3 Worker
**User:** Please implement the `ASTParser` class in `file_cache.py` as defined in Track 1.
**Agent (You):**
```json
{
"command":".\\scripts\\run_subagent.ps1 -Prompt \"Read file_cache.py and implement the ASTParser class using tree-sitter. Ensure you preserve docstrings but strip function bodies. Output the updated code or edit the file directly.\"",
"description":"Delegating implementation to a Tier 3 Worker."
}
```
</examples>
<triggers>
- When asked to write large amounts of boilerplate or repetitive code.
- When encountering a large error trace from a shell execution.
- When explicitly instructed to act as a "Tech Lead" or "Orchestrator".
- When managing complex, multi-file Track implementations.
Is a local GUI tool for manually curating and sending context to AI APIs. It aggregates files, screenshots, and discussion history into a structured markdown file and sends it to a chosen AI provider with a user-written message. The AI can also execute PowerShell scripts within the project directory, with user confirmation required before each execution.
**Stack:**
-`dearpygui` - GUI with docking/floating/resizable panels
-`google-genai` - Gemini API
-`anthropic` - Anthropic API
-`tomli-w` - TOML writing
-`uv` - package/env management
**Files:**
-`gui.py` - main GUI, `App` class, all panels, all callbacks, confirmation dialog, layout persistence, rich comms rendering
-`shell_runner.py` - subprocess wrapper that runs PowerShell scripts sandboxed to `base_dir`, returns stdout/stderr/exit code as a string
-`session_logger.py` - opens timestamped log files at session start; writes comms entries as JSON-L and tool calls as markdown; saves each AI-generated script as a `.ps1` file
-`theme.py` - palette definitions, font loading, scale, load_from_config/save_to_config
-`gemini.py` - legacy standalone Gemini wrapper (not used by the main GUI; superseded by `ai_client.py`)
-`file_cache.py` - stub; Anthropic Files API path removed; kept so stale imports don't break
-`mcp_client.py` - MCP-style read-only file tools (read_file, list_directory, search_files, get_file_summary); allowlist enforced against project file_items + base_dirs; dispatched by ai_client tool-use loop for both Anthropic and Gemini
-`summarize.py` - local heuristic summariser (no AI); .py via AST, .toml via regex, .md headings, generic preview; used by mcp_client.get_file_summary and aggregate.build_summary_section
-`dpg_layout.ini` - Dear PyGui window layout file (auto-saved on exit, auto-loaded on startup); gitignore this per-user
**GUI Panels:**
- **Projects** - active project name display (green), git directory input + Browse button, scrollable list of loaded project paths (click name to switch, x to remove), Add Project / New Project / Save All buttons
- **Config** - namespace, output dir, save (these are project-level fields from the active .toml)
- **Files** - base_dir, scrollable path list with remove, add file(s), add wildcard
- **Screenshots** - base_dir, scrollable path list with remove, add screenshot(s)
- **Discussion History** - discussion selector (collapsible header): listbox of named discussions, git commit + last_updated display, Update Commit button, Create/Rename/Delete buttons with name input; structured entry editor: each entry has collapse toggle (-/+), role combo, timestamp display, multiline content field; per-entry Ins/Del buttons when collapsed; global toolbar: + Entry, -All, +All, Clear All, Save; collapsible **Roles** sub-section; -> History buttons on Message and Response panels append current message/response as new entry with timestamp
- **Provider** - provider combo (gemini/anthropic), model listbox populated from API, fetch models button
- **Message** - multiline input, Gen+Send button, MD Only button, Reset session button, -> History button
- **Response** - readonly multiline displaying last AI response, -> History button
- **Tool Calls** - scrollable log of every PowerShell tool call the AI made; Clear button
- **System Prompts** - global (all projects) and project-specific multiline text areas for injecting custom system instructions. Combined with the built-in tool prompt.
- **Comms History** - rich structured live log of every API interaction; status line at top; colour legend; Clear button
**Layout persistence:**
-`dpg.configure_app(..., init_file="dpg_layout.ini")` loads the ini at startup if it exists; DPG silently ignores a missing file
-`dpg.save_init_file("dpg_layout.ini")` is called immediately before `dpg.destroy_context()` on clean exit
- The ini records window positions, sizes, and dock node assignments in DPG's native format
- First run (no ini) uses the hardcoded `pos=` defaults in `_build_ui()`; after that the ini takes over
- Delete `dpg_layout.ini` to reset to defaults
**Project management:**
-`config.toml` is global-only: `[ai]`, `[theme]`, `[projects]` (paths list + active path). No project data lives here.
- Each project has its own `.toml` file (e.g. `manual_slop.toml`). Multiple project tomls can be registered by path.
-`App.__init__` loads global config, then loads the active project `.toml` via `project_manager.load_project()`. Falls back to `migrate_from_legacy_config()` if no valid project file exists, creating a new `.toml` automatically.
-`_flush_to_project()` pulls widget values into `self.project` (the per-project dict) and serialises disc_entries into the active discussion's history list
-`_flush_to_config()` writes global settings ([ai], [theme], [projects]) into `self.config`
-`_save_active_project()` writes `self.project` to the active `.toml` path via `project_manager.save_project()`
-`_do_generate()` calls both flush methods, saves both files, then uses `project_manager.flat_config()` to produce the dict that `aggregate.run()` expects — so `aggregate.py` needs zero changes
- Switching projects: saves current project, loads new one, refreshes all GUI state, resets AI session
- New project: file dialog for save path, creates default project structure, saves it, switches to it
**Discussion management (per-project):**
- Each project `.toml` stores one or more named discussions under `[discussion.discussions.<name>]`
- Each discussion has: `git_commit` (str), `last_updated` (ISO timestamp), `history` (list of serialised entry strings)
-`active` key in `[discussion]` tracks which discussion is currently selected
- Creating a discussion: adds a new empty discussion dict via `default_discussion()`, switches to it
- Renaming: moves the dict to a new key, updates `active` if it was the current one
- Deleting: removes the dict; cannot delete the last discussion; switches to first remaining if active was deleted
- Switching: flushes current entries to project, loads new discussion's history, rebuilds disc list
- Update Commit button: runs `git rev-parse HEAD` in the project's `git_dir` and stores result + timestamp in the active discussion
- Timestamps: each disc entry carries a `ts` field (ISO datetime); shown next to the role combo; new entries from `-> History` or `+ Entry` get `now_ts()`
**Entry serialisation (project_manager):**
-`entry_to_str(entry)` → `"@<ts>\n<role>:\n<content>"` (or `"<role>:\n<content>"` if no ts)
-`str_to_entry(raw, roles)` → parses optional `@<ts>` prefix, then role line, then content; returns `{role, content, collapsed, ts}`
- Round-trips correctly through TOML string arrays; handles legacy entries without timestamps
**AI Tool Use (PowerShell):**
- Both Gemini and Anthropic are configured with a `run_powershell` tool/function declaration
- When the AI wants to edit or create files it emits a tool call with a `script` string
-`ai_client` runs a loop (max `MAX_TOOL_ROUNDS = 10`) feeding tool results back until the AI stops calling tools
- Before any script runs, `gui.py` shows a modal `ConfirmDialog` on the main thread; the background send thread blocks on a `threading.Event` until the user clicks Approve or Reject
- The dialog displays `base_dir`, shows the script in an editable text box (allowing last-second tweaks), and has Approve & Run / Reject buttons
- On approval the (possibly edited) script is passed to `shell_runner.run_powershell()` which prepends `Set-Location -LiteralPath '<base_dir>'` and runs it via `powershell -NoProfile -NonInteractive -Command`
- stdout, stderr, and exit code are returned to the AI as the tool result
- Rejections return `"USER REJECTED: command was not executed"` to the AI
- All tool calls (script + result/rejection) are appended to `_tool_log` and displayed in the Tool Calls panel
**Dynamic file context refresh (ai_client.py):**
- After the last tool call in each round, all project files from `file_items` are re-read from disk via `_reread_file_items()`. The `file_items` variable is reassigned so subsequent rounds see fresh content.
- For Anthropic: the refreshed file contents are injected as a `text` block appended to the `tool_results` user message, prefixed with `[FILES UPDATED]` and an instruction not to re-read them.
- For Gemini: refreshed file contents are appended to the last function response's `output` string as a `[SYSTEM: FILES UPDATED]` block. On the next tool round, stale `[FILES UPDATED]` blocks are stripped from history and old tool outputs are truncated to `_history_trunc_limit` characters to control token growth.
-`_build_file_context_text(file_items)` formats the refreshed files as markdown code blocks (same format as the original context)
- The `tool_result_send` comms log entry filters out the injected text block (only logs actual `tool_result` entries) to keep the comms panel clean
- System prompt updated to tell the AI: "the user's context files are automatically refreshed after every tool call, so you do NOT need to re-read files that are already provided in the <context> block"
- Bug 1: SDK ContentBlock objects now converted to plain dicts via `_content_block_to_dict()` before storing in `_anthropic_history`; prevents re-serialisation failures on subsequent tool-use rounds
- Bug 2: `_repair_anthropic_history` simplified to dict-only path since history always contains dicts
- Bug 3: Gemini part.function_call access now guarded with `hasattr` check
- Bug 4: Anthropic `b.type == "tool_use"` changed to `getattr(b, "type", None) == "tool_use"` for safe access during response processing
**Comms Log (ai_client.py):**
-`_comms_log: list[dict]` accumulates every API interaction during a session
-`_append_comms(direction, kind, payload)` called at each boundary: OUT/request before sending, IN/response after each model reply, OUT/tool_call before executing, IN/tool_result after executing, OUT/tool_result_send when returning results to the model
- Anthropic responses also include `usage` (input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens) and `stop_reason` in payload
-`get_comms_log()` returns a snapshot; `clear_comms_log()` empties it
-`comms_log_callback` (injected by gui.py) is called from the background thread with each new entry; gui queues entries in `_pending_comms` (lock-protected) and flushes them to the DPG panel each render frame
-`COMMS_CLAMP_CHARS = 300` in gui.py governs the display cutoff for heavy text fields
**Comms History panel — rich structured rendering (gui.py):**
Rather than showing raw JSON, each comms entry is rendered using a kind-specific renderer function. Unknown kinds fall back to a generic key/value layout.
Colour maps:
- Direction: OUT = blue-ish `(100,200,255)`, IN = green-ish `(140,255,160)`
-`_render_payload_tool_call` — shows name, optional id, script via `_add_text_field`
-`_render_payload_tool_result` — shows name, optional id, output via `_add_text_field`
-`_render_payload_tool_result_send` — iterates results list, shows tool_use_id and content per result
-`_render_payload_generic` — fallback for unknown kinds; renders all keys, using `_add_text_field` for keys in `_HEAVY_KEYS`, `_add_kv_row` for others; dicts/lists are JSON-serialised
Entry layout: index + timestamp + direction + kind + provider/model header row, then payload rendered by the appropriate function, then a separator line.
**Session Logger (session_logger.py):**
-`open_session()` called once at GUI startup; creates `logs/` and `scripts/generated/` directories; opens `logs/comms_<ts>.log` and `logs/toolcalls_<ts>.log` (line-buffered)
-`log_comms(entry)` appends each comms entry as a JSON-L line to the comms log; called from `App._on_comms_entry` (background thread); thread-safe via GIL + line buffering
-`log_tool_call(script, result, script_path)` writes the script to `scripts/generated/<ts>_<seq:04d>.ps1` and appends a markdown record to the toolcalls log without the script body (just the file path + result); uses a `threading.Lock` for the sequence counter
-`close_session()` flushes and closes both file handles; called just before `dpg.destroy_context()`
**Anthropic prompt caching:**
- System prompt + context are combined into one string, chunked into <=120k char blocks, and sent as the `system=` parameter array. Only the LAST chunk gets `cache_control: ephemeral`, so the entire system prefix is cached as one unit.
- Last tool in `_ANTHROPIC_TOOLS` (`run_powershell`) has `cache_control: ephemeral`; this means the tools prefix is cached together with the system prefix after the first request.
- The user message is sent as a plain `[{"type": "text", "text": user_message}]` block with NO cache_control. The context lives in `system=`, not in the first user message.
- The tools list is built once per session via `_get_anthropic_tools()` and reused across all API calls within the tool loop, avoiding redundant Python-side reconstruction.
-`_strip_cache_controls()` removes stale `cache_control` markers from all history entries before each API call, ensuring only the stable system/tools prefix consumes cache breakpoint slots.
- Cache stats (creation tokens, read tokens) are surfaced in the comms log usage dict and displayed in the Comms History panel
**Data flow:**
1. GUI edits are held in `App` state (`self.files`, `self.screenshots`, `self.disc_entries`, `self.project`) and dpg widget values
2.`_flush_to_project()` pulls all widget values into `self.project` dict (per-project data)
3.`_flush_to_config()` pulls global settings into `self.config` dict
4.`_do_generate()` calls both flush methods, saves both files, calls `project_manager.flat_config(self.project, disc_name)` to produce a dict for `aggregate.run()`, which writes the md and returns `(markdown_str, path, file_items)`
5.`cb_generate_send()` calls `_do_generate()` then threads a call to `ai_client.send(md, message, base_dir)`
6.`ai_client.send()` prepends the md as a `<context>` block to the user message and sends via the active provider chat session
7. If the AI responds with tool calls, the loop handles them (with GUI confirmation) before returning the final text response
8. Sessions are stateful within a run (chat history maintained), `Reset` clears them, the tool log, and the comms log
**Config persistence:**
-`config.toml` — global only: `[ai]` provider+model, `[theme]` palette+font+scale, `[projects]` paths array + active path
-`<project>.toml` — per-project: output, files, screenshots, discussion (roles, active discussion name, all named discussions with their history+metadata)
- On every send and save, both files are written
- On clean exit, `run()` calls `_flush_to_project()`, `_save_active_project()`, `_flush_to_config()`, `save_config()` before destroying context
**Threading model:**
- DPG render loop runs on the main thread
- AI sends and model fetches run on daemon background threads
-`_pending_dialog` (guarded by a `threading.Lock`) is set by the background thread and consumed by the render loop each frame, calling `dialog.show()` on the main thread
-`dialog.wait()` blocks the background thread on a `threading.Event` until the user acts
-`_pending_comms` (guarded by a separate `threading.Lock`) is populated by `_on_comms_entry` (background thread) and drained by `_flush_pending_comms()` each render frame (main thread)
**Provider error handling:**
-`ProviderError(kind, provider, original)` wraps upstream API exceptions with a classified `kind`: quota, rate_limit, auth, balance, network, unknown
-`_classify_anthropic_error` and `_classify_gemini_error` inspect exception types and status codes/message bodies to assign the kind
-`ui_message()` returns a human-readable label for display in the Response panel
- Four read-only tools exposed to the AI as native function/tool declarations: `read_file`, `list_directory`, `search_files`, `get_file_summary`
- Access control: `mcp_client.configure(file_items, extra_base_dirs)` is called before each send; builds an allowlist of resolved absolute paths from the project's `file_items` plus the `base_dir`; any path that is not explicitly in the list or not under one of the allowed directories returns `ACCESS DENIED`
-`mcp_client.dispatch(tool_name, tool_input)` is the single dispatch entry point used by both Anthropic and Gemini tool-use loops
- Anthropic: MCP tools appear before `run_powershell` in the tools list (no `cache_control` on them; only `run_powershell` carries `cache_control: ephemeral`)
- Gemini: MCP tools are included in the `FunctionDeclaration` list alongside `run_powershell`
-`get_file_summary` uses `summarize.summarise_file()` — same heuristic used for the initial `<context>` block, so the AI gets the same compact structural view it already knows
-`list_directory` sorts dirs before files; shows name, type, and size
-`search_files` uses `Path.glob()` with the caller-supplied pattern (supports `**/*.py` style)
-`read_file` returns raw UTF-8 text; errors (not found, access denied, decode error) are returned as error strings rather than exceptions, so the AI sees them as tool results
-`summarize.py` heuristics: `.py` → AST imports + ALL_CAPS constants + classes+methods + top-level functions; `.toml` → table headers + top-level keys; `.md` → h1–h3 headings with indentation; all others → line count + first 8 lines preview
- Comms log: MCP tool calls log `OUT/tool_call` with `{"name": ..., "args": {...}}` and `IN/tool_result` with `{"name": ..., "output": ...}`; rendered in the Comms History panel via `_render_payload_tool_call` (shows each arg key/value) and `_render_payload_tool_result` (shows output)
**Known extension points:**
- Add more providers by adding a section to `credentials.toml`, a `_list_*` and `_send_*` function in `ai_client.py`, and the provider name to the `PROVIDERS` list in `gui.py`
- Discussion history excerpts could be individually toggleable for inclusion in the generated md
-`MAX_TOOL_ROUNDS` in `ai_client.py` caps agentic loops at 10 rounds; adjustable
-`COMMS_CLAMP_CHARS` in `gui.py` controls the character threshold for clamping heavy payload fields in the Comms History panel
- Additional project metadata (description, tags, created date) could be added to `[project]` in the per-project toml
### Gemini Context Management
- Gemini uses explicit caching via `client.caches.create()` to store the `system_instruction` + tools as an immutable cached prefix with a 1-hour TTL. The cache is created once per chat session.
- When context changes (detected via `md_content` hash), the old cache is deleted, a new cache is created, and chat history is migrated to a fresh chat session pointing at the new cache.
- If cache creation fails (e.g., content is under the minimum token threshold — 1024 for Flash, 4096 for Pro), the system falls back to inline `system_instruction` in the chat config. Implicit caching may still provide cost savings in this case.
- The `<context>` block lives inside `system_instruction`, NOT in user messages, preventing history bloat across turns.
- On cleanup/exit, active caches are deleted via `ai_client.cleanup()` to prevent orphaned billing.
### Latest Changes
- Removed `Config` panel from the GUI to streamline per-project configuration.
-`output_dir` was moved into the Projects panel.
-`auto_add_history` was moved to the Discussion History panel.
-`namespace` is no longer a configurable field; `aggregate.py` automatically uses the active project's `name` property.
### UI / Visual Updates
- The success blink notification on the response text box is now dimmer and more transparent to be less visually jarring.
- Added a new floating **Last Script Output** popup window. This window automatically displays and blinks blue whenever the AI executes a PowerShell tool, showing both the executed script and its result in real-time.
## Recent Changes (Text Viewer Maximization)
- **Global Text Viewer (gui.py)**: Added a dedicated, large popup window (win_text_viewer) to allow reading and scrolling through large, dense text blocks without feeling cramped.
- **Comms History**: Every multi-line text field in the comms log now has a [+] button next to its label that opens the text in the Global Text Viewer.
- **Tool Log History**: Added [+ Script] and [+ Output] buttons next to each logged tool call to easily maximize and read the full executed scripts and raw tool outputs.
- **Last Script Output Popup**: Expanded the default size of the popup (now 800x600) and gave the input script panel more vertical space to prevent it from feeling 'scrunched'. Added [+ Maximize] buttons for both the script and the output sections to inspect them in full detail.
- **Confirm Dialog**: The script confirmation modal now has a [+ Maximize] button so you can read large generated scripts in full-screen before approving them.
## UI Enhancements (2026-02-21)
### Global Word-Wrap
A new **Word-Wrap** checkbox has been added to the **Projects** panel. This setting is saved per-project in its .toml file.
- When **enabled** (default), long text in read-only panels (like the main Response window, Tool Call outputs, and Comms History) will wrap to fit the panel width.
- When **disabled**, text will not wrap, and a horizontal scrollbar will appear for oversized content.
This allows you to choose the best viewing mode for either prose or wide code blocks.
### Maximizable Discussion Entries
Each entry in the **Discussion History** now features a [+ Max] button. Clicking this button opens the full text of that entry in the large **Text Viewer** popup, making it easy to read or copy large blocks of text from the conversation history without being constrained by the small input box.
\n\n## Multi-Viewport & Docking\nThe application now supports Dear PyGui Viewport Docking. Windows can be dragged outside the main application area or docked together. A global 'Windows' menu in the viewport menu bar allows you to reopen any closed panels.
## Extensive Documentation (2026-02-22)
Documentation has been completely rewritten matching the strict, structural format of `VEFontCache-Odin`.
-`docs/guide_architecture.md`: Details the Python implementation algorithms, queue management for UI rendering, the specific AST heuristics used for context aggregation, and the distinct algorithms for trimming Anthropic history vs Gemini state caching.
-`docs/Readme.md`: The core interface manual.
-`docs/guide_tools.md`: Security architecture for `_is_allowed` paths and definitions of the read-only vs destructive tool pipeline.
A high-density GUI orchestrator for local LLM-driven coding sessions. Manual Slop bridges high-latency AI reasoning with a low-latency ImGui render loop via a thread-safe asynchronous pipeline, ensuring every AI-generated payload passes through a human-auditable gate before execution.
This tool is designed to work as an auxiliary assistant that natively interacts with your codebase via PowerShell and MCP-like file tools, supporting both Anthropic and Gemini APIs.
**Design Philosophy**: Full manual control over vendor API metrics, agent capabilities, and context memory usage. High information density, tactile interactions, and explicit confirmation for destructive actions.
- **Targeted View**: Extracts only specified symbols and their dependencies
- **Heuristic Summaries**: Token-efficient structural descriptions without AI calls
---
## Architecture at a Glance
Four thread domains operate concurrently: the ImGui main loop, an asyncio worker for AI calls, a `HookServer` (HTTP on `:8999`) for external automation, and transient threads for model fetching. Background threads never write GUI state directly — they serialize task dicts into lock-guarded lists that the main thread drains once per frame ([details](./docs/guide_architecture.md#the-task-pipeline-producer-consumer-synchronization)).
The **Execution Clutch** suspends the AI execution thread on a `threading.Condition` when a destructive action (PowerShell script, sub-agent spawn) is requested. The GUI renders a modal where the user can read, edit, or reject the payload. On approval, the condition is signaled and execution resumes ([details](./docs/guide_architecture.md#the-execution-clutch-human-in-the-loop)).
The **MMA (Multi-Model Agent)** system decomposes epics into tracks, tracks into DAG-ordered tickets, and executes each ticket with a stateless Tier 3 worker that starts from `ai_client.reset_session()` — no conversational bleed between tickets ([details](./docs/guide_mma.md)).
---
## Documentation
## Documentation
* [docs/Readme.md](docs/Readme.md) for the interface and usage guide
| Guide | Scope |
* [docs/guide_tools.md](docs/guide_tools.md) for information on the AI tooling capabilities
|---|---|
* [docs/guide_architecture.md](docs/guide_architecture.md) for an in-depth breakdown of the codebase architecture
| [Meta-Boundary](./docs/guide_meta_boundary.md) | Application vs Meta-Tooling domains, inter-domain bridges, safety model separation |
## Instructions
---
1. Make a credentials.toml in the immediate directory of your clone:
## Setup
### Prerequisites
- Python 3.11+
- [`uv`](https://github.com/astral-sh/uv) for package management
### Installation
```powershell
gitclone<repo>
cd manual_slop
uvsync
```
### Credentials
Configure in `credentials.toml`:
```toml
```toml
[gemini]
[gemini]
api_key="****"
api_key="YOUR_KEY"
[anthropic]
[anthropic]
api_key="****"
api_key="YOUR_KEY"
[deepseek]
api_key="YOUR_KEY"
```
```
2. Have fun. This is experiemntal slop.
### Running
```ps1
```powershell
uvrun.\gui.py
uvrunsloppy.py# Normal mode
uvrunsloppy.py--enable-test-hooks# With Hook API on :8999
```
```
### Running Tests
```powershell
uvrunpytesttests/-v
```
> **Note:** See the [Structural Testing Contract](./docs/guide_simulations.md#structural-testing-contract) for rules regarding mock patching, `live_gui` standard usage, and artifact isolation (logs are generated in `tests/logs/` and `tests/artifacts/`).
---
## MMA 4-Tier Architecture
The Multi-Model Agent system uses hierarchical task decomposition with specialized models at each tier:
5. Return `(resolved_path, "")` on success or `(None, error_message)` on failure
All paths are resolved (following symlinks) before comparison, preventing symlink-based traversal attacks.
### Security Model
The MCP Bridge implements a three-layer security model in `mcp_client.py`. Every tool accessing the filesystem passes through `_resolve_and_check(path)` before any I/O.
### Layer 1: Allowlist Construction (`configure`)
Called by `ai_client` before each send cycle:
1. Resets `_allowed_paths` and `_base_dirs` to empty sets.
2. Sets `_primary_base_dir` from `extra_base_dirs[0]` (resolved) or falls back to cwd().
3. Iterates `file_items`, resolving each path to an absolute path, adding to `_allowed_paths`; its parent directory is added to `_base_dirs`.
4. Any entries in `extra_base_dirs` that are valid directories are also added to `_base_dirs`.
### Layer 2: Path Validation (`_is_allowed`)
Checks run in this exact order:
1. **Blacklist**: `history.toml`, `*_history.toml`, `config`, `credentials` → hard deny
2. **Explicit allowlist**: Path in `_allowed_paths` → allow
7. **CWD fallback**: If no base dirs, any under `cwd()` is allowed (fail-safe for projects without explicit base dirs)
8. **Base containment**: Must be a subpath of at least one entry in `_base_dirs` (via `relative_to()`)
9. **Default deny**: All other paths rejected
All paths are resolved (following symlinks) before comparison, preventing symlink-based traversal attacks.
- **Goal:** Eliminate hardcoded conductor paths. Make path configurable via config.toml or CONDUCTOR_DIR env var. Allow running app to use separate directory from development tracks.
## Phase 3: Future Horizons (Tracks 1-20)
*Initialized: 2026-03-06*
### Architecture & Backend
#### 1. true_parallel_worker_execution_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Implement true concurrency for the DAG engine. Once threading.local() is in place, the ExecutionEngine should spawn independent Tier 3 workers in parallel (e.g., 4 workers handling 4 isolated tests simultaneously). Requires strict file-locking or a Git-based diff-merging strategy to prevent AST collision.
#### 2. deep_ast_context_pruning_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Before dispatching a Tier 3 worker, use tree_sitter to automatically parse the target file AST, strip out unrelated function bodies, and inject a surgically condensed skeleton into the worker prompt. Guarantees the AI only sees what it needs to edit, drastically reducing token burn.
#### 3. visual_dag_ticket_editing_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Replace the linear ticket list in the GUI with an interactive Node Graph using ImGui Bundle node editor. Allow the user to visually drag dependency lines, split nodes, or delete tasks before clicking Execute Pipeline.
#### 4. tier4_auto_patching_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Elevate Tier 4 from a log summarizer to an auto-patcher. When a verification test fails, Tier 4 generates a .patch file. The GUI intercepts this and presents a side-by-side Diff Viewer. The user clicks Apply Patch to instantly resume the pipeline.
#### 5. native_orchestrator_20260306
- **Status:** Planned
- **Priority:** Low
- **Goal:** Absorb the Conductor extension entirely into the core application. Manual Slop should natively read/write plan.md, manage the metadata.json, and orchestrate the MMA tiers in pure Python, removing the dependency on external CLI shell executions (mma_exec.py).
---
### GUI Overhauls & Visualizations
#### 6. cost_token_analytics_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Real-time cost tracking panel displaying cost per model, session totals, and breakdown by tier. Uses existing cost_tracker.py which is implemented but has no GUI.
#### 7. performance_dashboard_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Expand performance metrics panel with CPU/RAM usage, frame time, input lag with historical graphs. Uses existing performance_monitor.py which has basic metrics but no detailed visualization.
#### 8. mma_multiworker_viz_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Split-view GUI for parallel worker streams per tier. Visualize multiple concurrent workers with individual status, output tabs, and resource usage. Enable kill/restart per worker.
#### 9. cache_analytics_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Gemini cache hit/miss visualization, memory usage, TTL status display. Uses existing ai_client.get_gemini_cache_stats() which is not displayed in GUI.
#### 10. tool_usage_analytics_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Analytics panel showing most-used tools, average execution time, and failure rates. Uses existing tool_log_callback data.
#### 11. session_insights_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Token usage over time, cost projections, session summary with efficiency scores. Visualize session_logger data.
#### 12. track_progress_viz_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Progress bars and percentage completion for active tracks and tickets. Better visualization of DAG execution state.
#### 13. manual_skeleton_injection_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Add UI controls to manually flag files for skeleton injection in discussions. Allow agent to request full file reads or specific def/class definitions on-demand.
#### 14. on_demand_def_lookup_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Add ability for agent to request specific class/function definitions during discussion. User can @mention a symbol and get its full definition inline.
---
### Manual UX Controls
#### 15. ticket_queue_mgmt_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Allow user to manually reorder, prioritize, or requeue tickets in the DAG. Add drag-drop reordering, priority tags, and bulk selection.
#### 16. kill_abort_workers_20260306
- **Status:** Planned
- **Priority:** High
- **Goal:** Add ability to kill/abort a running Tier 3 worker mid-execution. Currently workers run to completion; add cancel button.
#### 17. manual_block_control_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Allow user to manually block or unblock tickets with custom reasons. Currently blocked tickets rely on dependency resolution; add manual override.
#### 18. pipeline_pause_resume_20260306
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Add global pause/resume for the entire DAG execution pipeline. Allow user to freeze all worker activity and resume later.
#### 19. per_ticket_model_20260306
- **Status:** Planned
- **Priority:** Low
- **Goal:** Allow user to manually select which model to use for a specific ticket, overriding the default tier model.
#### 20. manual_ux_validation_20260302
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Interactive human-in-the-loop track to review and adjust GUI UX, animations, popups, and layout structures.
---
### C/C++ Language Support
#### 25. ts_cpp_tree_sitter_20260308
- **Status:** Planned
- **Priority:** High
- **Goal:** Add tree-sitter C and C++ grammars. Extend ASTParser to support C/C++ skeleton and outline extraction. Add MCP tools ts_c_get_skeleton, ts_cpp_get_skeleton, ts_c_get_code_outline, ts_cpp_get_code_outline.
#### 26. gencpp_python_bindings_20260308
- **Status:** Planned
- **Priority:** Medium
- **Goal:** Bootstrap standalone Python project with CFFI bindings for gencpp C library. Provides foundation for richer C++ AST parsing in future (beyond tree-sitter syntax).
---
### Path Configuration
#### 27. project_conductor_dir_20260308
- **Status:** Planned
- **Priority:** High
- **Goal:** Make conductor directory per-project. Each project TOML can specify custom conductor dir for isolated track/state management. Extends existing global path config.
#### 28. gui_path_config_20260308
- **Status:** Planned
- **Priority:** High
- **Goal:** Add path configuration UI to Context Hub. Allow users to view and edit configurable paths (conductor, logs, scripts) directly from the GUI.
"description":"Update conductor to properly utilize the new api hooks for automated testing & verification of track implementation features without the need of user intervention."
- [x] Task: Modify `conductor/workflow.md` to reflect the new automated verification process. [2ec1ecf]
- [ ] Sub-task: Update the "Phase Completion Verification and Checkpointing Protocol" section to replace manual verification steps with a description of the automated API hook process.
- [ ] Sub-task: Ensure the updated workflow clearly states that the agent will announce the automated test, execute it, and then present the results (success or failure) to the user.
- [ ] Task: Conductor - User Manual Verification 'Phase 1: Update Workflow Definition' (Protocol in workflow.md)
# Specification: Integrate API Hooks for Automated Track Verification
## Overview
This track focuses on integrating the existing, previously implemented API hooks (from track `test_hooks_20260223`) into the Conductor workflow. The primary goal is to automate the verification steps within the "Phase Completion Verification and Checkpointing Protocol", reducing the need for manual user intervention and enabling a more streamlined, automated development process.
## Functional Requirements
- **Workflow Integration:** The `workflow.md` document, specifically the "Phase Completion Verification and Checkpointing Protocol," must be updated to replace manual verification steps with automated checks using the API hooks.
- **IPC Communication:** The updated workflow will communicate with the application's backend via the established IPC server to trigger verification tasks.
- **Result Handling:**
- All results from the API hook verifications must be logged for auditing and debugging purposes.
- Upon successful verification, the Conductor agent will proceed with the workflow as it currently does after a successful manual check.
- Upon failure, the agent will halt, present the failure logs to the user, and await further instructions.
- **User Interaction Model:** The system will transition from asking the user to perform a manual test to informing the user that an automated test is running, and then presenting the results.
## Non-Functional Requirements
- **Resilience:** The Conductor agent must handle cases where the API hook server is unavailable or a hook call fails unexpectedly, without crashing or entering an unrecoverable state.
- **Transparency:** All interactions with the API hooks must be clearly logged, making the automated process easy to monitor and debug.
## Out of Scope
- **Modifying API Hooks:** This track will not alter the existing API hooks, the IPC server, or the backend implementation. The focus is solely on the client-side integration within the Conductor agent's workflow.
- **Changes to Manual Overrides:** Users will retain the ability to manually intervene or bypass automated checks if necessary.
# Specification: Review vendor api usage in regards to conservative context handling
## Overview
This track aims to optimize token efficiency and transparency by reviewing and improving how vendor APIs (Gemini and Anthropic) handle conservative context pruning. The primary focus is on extracting, plotting, and exposing deep metrics to the GUI so developers can intuit how close they are to API limits (e.g., token caps, cache counts, history bleed).
- **Global Orchestration:** Review global context boundaries within the main prompt lifecycle.
- **GUI Metrics:** Expose as much metric data as possible to the user interface (e.g., plotting token usage, visual indicators for when "history bleed" occurs, displaying the number of active caches).
## Functional Requirements
- Implement extensive token and cache metric extraction from both Gemini and Anthropic API responses.
- Expose these metrics to the Dear PyGui frontend, potentially utilizing visual plots or progress bars to indicate token budget consumption.
- Implement tests to explicitly verify context rules, ensuring history pruning acts conservatively and predictable without data loss.
## Non-Functional Requirements
- Ensure GUI rendering of new plots or dense metrics does not block the main thread.
- Adhere to the "Strict State Management" product guideline.
## Out of Scope
- Major feature additions unrelated to context token management or telemetry.
- Expanding the AI's agentic capabilities (e.g., new tools).
"description":"Review project codebase, documentation related to project, and make sure agenti vendor apis are being used as properly stated by offical documentation from google for gemini and anthropic for claude."
This track involves a comprehensive audit of the "Manual Slop" codebase to ensure that the integration with Google Gemini (`google-genai`) and Anthropic Claude (`anthropic`) SDKs aligns perfectly with their latest official documentation and best practices. The goal is to identify discrepancies, performance bottlenecks, or deprecated patterns and implement the necessary fixes.
## Scope
- **Target:** Full codebase audit, with primary focus on `ai_client.py`, `mcp_client.py`, and any other modules interacting with AI SDKs.
- **Tool Calling:** Audit function declarations, parameter schemas, and result handling.
- **History & Tokens:** Review message history management, token estimation accuracy, and context window handling.
## Functional Requirements
1.**SDK Audit:** Compare existing code patterns against the latest official Python SDK documentation for Gemini and Anthropic.
2.**Feature Validation:**
- Ensure `google-genai` usage follows the latest `Client` and `types` patterns.
- Ensure `anthropic` usage utilizes `cache_control` correctly for optimal performance.
3.**Discrepancy Remediation:** Implement code changes to align the implementation with documented standards.
4.**Validation:** Execute tests to ensure that API interactions remain functional and improved.
## Acceptance Criteria
- Full audit completed for all AI SDK interactions.
- Identified discrepancies are documented and fixed.
- Caching, tool calling, and history management logic are verified against latest SDK standards.
- All existing and new tests pass successfully.
## Out of Scope
- Adding support for new AI providers not already in the project.
- Major UI refactoring unless directly required by API changes.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.