archiving tracks
This commit is contained in:
9
conductor/archive/manual_block_control_20260306/index.md
Normal file
9
conductor/archive/manual_block_control_20260306/index.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Manual Block/Unblock Control
|
||||
|
||||
**Track ID:** manual_block_control_20260306
|
||||
|
||||
**Status:** Planned
|
||||
|
||||
**See Also:**
|
||||
- [Spec](./spec.md)
|
||||
- [Plan](./plan.md)
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "manual_block_control_20260306",
|
||||
"name": "Manual Block/Unblock Control",
|
||||
"status": "planned",
|
||||
"created_at": "2026-03-06T00:00:00Z",
|
||||
"updated_at": "2026-03-06T00:00:00Z",
|
||||
"type": "feature",
|
||||
"priority": "medium"
|
||||
}
|
||||
58
conductor/archive/manual_block_control_20260306/plan.md
Normal file
58
conductor/archive/manual_block_control_20260306/plan.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Implementation Plan: Manual Block/Unblock Control (manual_block_control_20260306)
|
||||
|
||||
> **Reference:** [Spec](./spec.md) | [Architecture Guide](../../../docs/guide_architecture.md)
|
||||
|
||||
## Phase 1: Add Manual Block Fields
|
||||
Focus: Add manual_block flag to Ticket
|
||||
|
||||
- [x] Task 1.1: Initialize MMA Environment
|
||||
- [x] Task 1.2: Add manual_block field to Ticket (094a6c3)
|
||||
- WHERE: `src/models.py` `Ticket` dataclass
|
||||
- WHAT: Add `manual_block: bool = False`
|
||||
- HOW:
|
||||
```python
|
||||
manual_block: bool = False
|
||||
```
|
||||
|
||||
- [x] Task 1.3: Add mark_manual_block method (094a6c3)
|
||||
- WHERE: `src/models.py` `Ticket`
|
||||
- WHAT: Method to set manual block with reason
|
||||
- HOW:
|
||||
```python
|
||||
def mark_manual_block(self, reason: str) -> None:
|
||||
self.status = "blocked"
|
||||
self.blocked_reason = f"[MANUAL] {reason}"
|
||||
self.manual_block = True
|
||||
```
|
||||
|
||||
## Phase 2: Block/Unblock UI
|
||||
Focus: Add block buttons to ticket display
|
||||
|
||||
- [x] Task 2.1: Add block button (2ff5a8b)
|
||||
- WHERE: `src/gui_2.py` ticket rendering
|
||||
- WHAT: Button to block with reason input
|
||||
- HOW: Modal with text input for reason
|
||||
|
||||
- [x] Task 2.2: Add unblock button (2ff5a8b)
|
||||
- WHERE: `src/gui_2.py` ticket rendering
|
||||
- WHAT: Button to clear manual block
|
||||
- HOW:
|
||||
```python
|
||||
if ticket.manual_block and ticket.status == "blocked":
|
||||
if imgui.button("Unblock"):
|
||||
ticket.status = "todo"
|
||||
ticket.blocked_reason = None
|
||||
ticket.manual_block = False
|
||||
```
|
||||
|
||||
## Phase 3: Cascade Integration
|
||||
Focus: Trigger cascade on block/unblock
|
||||
|
||||
- [x] Task 3.1: Call cascade_blocks after manual block (c6d0bc8)
|
||||
- WHERE: `src/gui_2.py` or `src/multi_agent_conductor.py`
|
||||
- WHAT: Update downstream tickets
|
||||
- HOW: `self.dag.cascade_blocks()`
|
||||
|
||||
## Phase 4: Testing
|
||||
- [x] Task 4.1: Write unit tests
|
||||
- [x] Task 4.2: Conductor - Phase Verification
|
||||
129
conductor/archive/manual_block_control_20260306/spec.md
Normal file
129
conductor/archive/manual_block_control_20260306/spec.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# Track Specification: Manual Block/Unblock Control (manual_block_control_20260306)
|
||||
|
||||
## Overview
|
||||
Allow user to manually block or unblock tickets with custom reasons. Currently blocked tickets rely solely on dependency resolution; add manual override capability.
|
||||
|
||||
## Current State Audit
|
||||
|
||||
### Already Implemented (DO NOT re-implement)
|
||||
|
||||
#### Ticket Status (src/models.py)
|
||||
- **`Ticket` dataclass** has `status` field: "todo" | "in_progress" | "completed" | "blocked"
|
||||
- **`blocked_reason` field**: `Optional[str]` - exists but only set by dependency cascade
|
||||
- **`mark_blocked(reason: str)` method**: Sets status="blocked", stores reason
|
||||
|
||||
#### DAG Blocking (src/dag_engine.py)
|
||||
- **`cascade_blocks()` method**: Transitively marks tickets as blocked when dependencies are blocked
|
||||
- **Dependency resolution**: Tickets blocked if any `depends_on` is not "completed"
|
||||
- **No manual override exists**
|
||||
|
||||
#### GUI Display (src/gui_2.py)
|
||||
- **`_render_ticket_dag_node()`**: Renders ticket nodes with status colors
|
||||
- **Blocked nodes shown in distinct color**
|
||||
- **No block/unblock buttons**
|
||||
|
||||
### Gaps to Fill (This Track's Scope)
|
||||
- No way to manually set blocked status
|
||||
- No way to add custom block reason
|
||||
- No way to manually unblock (clear blocked status)
|
||||
- Visual indicator for manual vs dependency blocking
|
||||
|
||||
## Architectural Constraints
|
||||
|
||||
### DAG Validity
|
||||
- Manual block MUST trigger cascade to downstream tickets
|
||||
- Manual unblock MUST check dependencies are satisfied
|
||||
- Cannot unblock if dependencies still blocked
|
||||
|
||||
### Audit Trail
|
||||
- Block reason MUST be stored in Ticket
|
||||
- Distinguish manual vs dependency blocking
|
||||
|
||||
### State Synchronization
|
||||
- Block/unblock MUST update GUI immediately
|
||||
- MUST persist to track state
|
||||
|
||||
## Architecture Reference
|
||||
|
||||
### Key Integration Points
|
||||
|
||||
| File | Lines | Purpose |
|
||||
|------|-------|---------|
|
||||
| `src/models.py` | 40-60 | `Ticket.mark_blocked()`, `blocked_reason` |
|
||||
| `src/dag_engine.py` | 30-50 | `cascade_blocks()` - call after manual block |
|
||||
| `src/gui_2.py` | 2700-2800 | `_render_ticket_dag_node()` - add buttons |
|
||||
| `src/project_manager.py` | 238-260 | Track state persistence |
|
||||
|
||||
### Proposed Ticket Enhancement
|
||||
|
||||
```python
|
||||
# Add to Ticket dataclass:
|
||||
manual_block: bool = False # True if blocked manually, False if dependency
|
||||
|
||||
def mark_manual_block(self, reason: str) -> None:
|
||||
self.status = "blocked"
|
||||
self.blocked_reason = f"[MANUAL] {reason}"
|
||||
self.manual_block = True
|
||||
|
||||
def clear_manual_block(self) -> None:
|
||||
if self.manual_block:
|
||||
self.status = "todo"
|
||||
self.blocked_reason = None
|
||||
self.manual_block = False
|
||||
```
|
||||
|
||||
## Functional Requirements
|
||||
|
||||
### FR1: Block Button
|
||||
- Button on each ticket node to block
|
||||
- Opens text input for block reason
|
||||
- Sets `manual_block=True`, calls `mark_manual_block()`
|
||||
|
||||
### FR2: Unblock Button
|
||||
- Button on blocked tickets to unblock
|
||||
- Only enabled if dependencies are satisfied
|
||||
- Clears manual block, sets status to "todo"
|
||||
|
||||
### FR3: Reason Display
|
||||
- Show block reason on hover or in node
|
||||
- Different visual for manual vs dependency block
|
||||
- Show "[MANUAL]" prefix for manual blocks
|
||||
|
||||
### FR4: Cascade Integration
|
||||
- Manual block triggers `cascade_blocks()`
|
||||
- Manual unblock recalculates blocked status
|
||||
|
||||
## Non-Functional Requirements
|
||||
|
||||
| Requirement | Constraint |
|
||||
|-------------|------------|
|
||||
| Response Time | Block/unblock takes effect immediately |
|
||||
| Persistence | Block state saved to track state |
|
||||
| Visual Clarity | Manual blocks clearly distinguished |
|
||||
|
||||
## Testing Requirements
|
||||
|
||||
### Unit Tests
|
||||
- Test `mark_manual_block()` sets correct fields
|
||||
- Test `clear_manual_block()` restores todo status
|
||||
- Test cascade after manual block
|
||||
|
||||
### Integration Tests (via `live_gui` fixture)
|
||||
- Block ticket via GUI, verify status changes
|
||||
- Unblock ticket, verify status restored
|
||||
- Verify cascade affects downstream tickets
|
||||
|
||||
## Out of Scope
|
||||
- Blocking during execution (kill first, then block)
|
||||
- Scheduled/conditional blocking
|
||||
- Block templates
|
||||
|
||||
## Acceptance Criteria
|
||||
- [ ] Block button on each ticket
|
||||
- [ ] Unblock button on blocked tickets
|
||||
- [ ] Reason input saves to ticket
|
||||
- [ ] Visual indicator distinguishes manual vs dependency
|
||||
- [ ] Reason displayed in UI
|
||||
- [ ] Cascade triggered on block/unblock
|
||||
- [ ] State persisted to track state
|
||||
- [ ] 1-space indentation maintained
|
||||
Reference in New Issue
Block a user