Skip to content
Back to skills

569 2026 01 27 17 52 14 Insert Before Stream Fix F3d11f8a

ASecurity

- [x] DoR satisfied? Yes - plan is complete with acceptance tests - [x] Access/secrets present? N/A - no secrets needed - [x] Fixtures/data ready? N/A

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
security

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 569-2026-01-27_17-52-14_insert-before-stream-fix_f3d11f8a --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 569 2026 01 27 17 52 14 Insert Before Stream Fix F3d11f8a?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 569 2026 01 27 17 52 14 Insert Before Stream Fix F3d11f8a
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-569-2026-01-27-17-52-14-insert-before-stream-fix-f/badge)](https://www.skillsdirectory.com/skills/tools-only-569-2026-01-27-17-52-14-insert-before-stream-fix-f)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
title: "Insert Before Stream Fix – Execution Log"
phase: Execute
date: "2026-01-27T17:52:14"
owner: "Claude"
plan_path: "memory-bank/plan/reserch.md"
start_commit: "5efc5423"
branch: "fix/insert-before-stream-race"
env: {target: "local", notes: "Creating minimal ChatContainer widget"}
---

## Pre-Flight Checks

- [x] DoR satisfied? Yes - plan is complete with acceptance tests
- [x] Access/secrets present? N/A - no secrets needed
- [x] Fixtures/data ready? N/A

**Note:** Plan references `ChatContainer` which doesn't exist. User approved creating minimal ChatContainer first.

## Execution Progress

### Task 0: Create Minimal ChatContainer Widget

**Status:** COMPLETED

Created `src/tunacode/ui/widgets/chat.py` with:
- `ChatContainer` class extending `VerticalScroll`
- `_current_stream` tracking for active streaming widget
- `_insertion_anchor` tracking for post-stream insertion point
- `write()` method for backward compat with RichLog
- `start_stream()`, `update_stream()`, `end_stream()`, `cancel_stream()` lifecycle methods
- `insert_before_stream()` for positioning tool panels correctly

Files created:
- `src/tunacode/ui/widgets/chat.py`

Files modified:
- `src/tunacode/ui/widgets/__init__.py` - added ChatContainer export

---

### Task 1: Add insertion anchor tracking to ChatContainer

**Status:** COMPLETED

Implemented in ChatContainer:
- `_insertion_anchor: Widget | None` attribute
- `end_stream()` captures finalized stream widget as anchor
- `cancel_stream()` captures previous sibling as anchor

---

### Task 2: Update insert_before_stream() to use insertion anchor

**Status:** COMPLETED

`insert_before_stream()` now handles three cases:
1. Active stream: insert before `_current_stream`
2. Stream ended: insert before `_insertion_anchor` (finalized message)
3. No context: append to end

---

### Task 3: Clear insertion anchor on new request

**Status:** COMPLETED

`start_stream()` clears `_insertion_anchor = None` to prevent stale positioning.
`clear()` also clears the anchor.

---

### Task 4: Handle cancel scenario insertion anchor

**Status:** COMPLETED

`cancel_stream()` finds the widget that was BEFORE the stream widget and sets it as anchor.
This allows late-arriving tool panels to insert at the correct position after cancel.

---

### Task 5: Wire into app.py

**Status:** COMPLETED

Changes to `src/tunacode/ui/app.py`:
- Replaced `RichLog` import with `ChatContainer`
- Added `ChatContainer` to widget imports
- Changed `self.rich_log: RichLog` to `self.chat_container: ChatContainer`
- Added `rich_log` property alias for backward compatibility
- Updated `compose()` to create `ChatContainer` instead of `RichLog`
- Added `chat_container.start_stream()` at request start
- Added `chat_container.end_stream()` in finally block before writing response
- Added `chat_container.cancel_stream()` in `action_cancel_stream()`
- Changed `on_tool_result_display()` to use `insert_before_stream()`

Files modified:
- `src/tunacode/ui/app.py`
- `src/tunacode/ui/welcome.py` - Updated type hint to use `WriteableLog` protocol

---

## Gate Results

- Tests: PASS (512 passed)
- Type checks: PASS (no new errors introduced)
- Linters: PASS (all checks passed)

## Files Changed Summary

| File | Action | Description |
|------|--------|-------------|
| `src/tunacode/ui/widgets/chat.py` | Created | ChatContainer widget with insertion tracking |
| `src/tunacode/ui/widgets/__init__.py` | Modified | Export ChatContainer |
| `src/tunacode/ui/app.py` | Modified | Replace RichLog with ChatContainer, wire up lifecycle |
| `src/tunacode/ui/welcome.py` | Modified | Update type hint for compatibility |

## Notes

- Branch: `fix/insert-before-stream-race`
- Rollback point: `5efc5423`
- End commit: `9be710d9`
- The `rich_log` property alias ensures backward compatibility for code that references `app.rich_log`

## Execution Report

**Date:** 2026-01-27
**Plan Source:** memory-bank/plan/reserch.md
**Start commit:** 5efc5423
**End commit:** 9be710d9
**Branch:** fix/insert-before-stream-race
**Final status:** SUCCESS

### Outcomes
- Tasks attempted: 6 (0 + 5 from plan)
- Tasks completed: 6
- Rollbacks: None
- All gates passed

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.