Co-authored-by: Kimi Agent <kimi@timmy.local> Co-committed-by: Kimi Agent <kimi@timmy.local>
284 lines
9.2 KiB
Markdown
284 lines
9.2 KiB
Markdown
# Timmy Automations
|
|
|
|
Central home for all automated processes that keep the Timmy development loop running smoothly.
|
|
|
|
## Purpose
|
|
|
|
This directory consolidates scripts, configurations, and manifests for automations that operate on behalf of Timmy — the autonomous development agent. These automations handle everything from daily issue triage to cycle retrospectives, workspace management, and metrics collection.
|
|
|
|
**Design principle:** Automations should be discoverable, configurable, and observable. Every automation in this folder can be found by Timmy, enabled or disabled via configuration, and reports its status for dashboard integration.
|
|
|
|
---
|
|
|
|
## Directory Structure
|
|
|
|
| Directory | Purpose |
|
|
|-----------|---------|
|
|
| `daily_run/` | Scripts that run periodically (cycle retros, idle detection, daily triage) |
|
|
| `triage/` | Deep triage helpers — intelligent issue refinement and prioritization |
|
|
| `metrics/` | Dashboard and metrics integration — data collection for loop health |
|
|
| `workspace/` | Agent workspace management — isolated environments per agent |
|
|
| `config/` | Automation manifests and configuration files |
|
|
|
|
---
|
|
|
|
## Types of Automations
|
|
|
|
### 1. Daily Run Automations
|
|
|
|
These run continuously or on a schedule to keep the dev loop operational:
|
|
|
|
- **Cycle Retrospective** (`cycle_retro.py`) — Logs structured data after each development cycle
|
|
- **Loop Guard** (`loop_guard.py`) — Idle detection with exponential backoff (prevents burning cycles on empty queues)
|
|
- **Triage Scoring** (`triage_score.py`) — Mechanical issue scoring based on scope/acceptance/alignment
|
|
- **Daily Run Orchestrator** (`orchestrator.py`) — The 10-minute ritual; fetches candidate issues and produces a concise agenda plus day summary
|
|
|
|
### 2. Deep Triage Automations
|
|
|
|
Intelligent, LLM-assisted workflows that run less frequently (~every 20 cycles):
|
|
|
|
- **Deep Triage** (`deep_triage.sh` + `deep_triage_prompt.md`) — Hermes-driven issue refinement, breaking down large issues, adding acceptance criteria
|
|
- **Loop Introspection** (`loop_introspect.py`) — Self-improvement engine that analyzes retro data and produces recommendations
|
|
|
|
### 3. Workspace Automations
|
|
|
|
Environment management for multi-agent operation:
|
|
|
|
- **Agent Workspace** (`agent_workspace.sh`) — Creates isolated git clones, port ranges, and data directories per agent
|
|
- **Bootstrap** (`bootstrap.sh`) — One-time setup for new Kimi workspaces
|
|
- **Resume** (`resume.sh`) — Quick status check and resume prompt
|
|
|
|
### 4. Metrics & Integration
|
|
|
|
Data collection for dashboard visibility:
|
|
|
|
- **Backfill Retro** (`backfill_retro.py`) — Seeds retrospective data from Gitea PR history
|
|
- **Pre-commit Checks** (`pre_commit_checks.py`) — CI hygiene validation before commits
|
|
|
|
---
|
|
|
|
## How Timmy Discovers Automations
|
|
|
|
Automations are discovered via manifest files in `config/`:
|
|
|
|
```
|
|
config/
|
|
├── automations.json # Master manifest of all automations
|
|
├── daily_run.json # Daily run schedule configuration
|
|
└── triage_rules.yaml # Triage scoring weights and thresholds
|
|
```
|
|
|
|
### Discovery Protocol
|
|
|
|
1. **Scan** — Timmy scans `config/automations.json` on startup
|
|
2. **Validate** — Each automation entry is validated (script exists, is executable)
|
|
3. **Enable** — Automations marked `enabled: true` are registered
|
|
4. **Schedule** — Daily runs are scheduled via the loop's internal scheduler
|
|
5. **Report** — Status is written to `.loop/automation_state.json`
|
|
|
|
### Automation Manifest Format
|
|
|
|
```json
|
|
{
|
|
"automations": [
|
|
{
|
|
"id": "cycle_retro",
|
|
"name": "Cycle Retrospective",
|
|
"description": "Logs structured data after each dev cycle",
|
|
"script": "daily_run/cycle_retro.py",
|
|
"enabled": true,
|
|
"trigger": "post_cycle",
|
|
"config": {
|
|
"retro_file": ".loop/retro/cycles.jsonl",
|
|
"summary_window": 50
|
|
}
|
|
},
|
|
{
|
|
"id": "loop_guard",
|
|
"name": "Loop Guard",
|
|
"description": "Idle detection with exponential backoff",
|
|
"script": "daily_run/loop_guard.py",
|
|
"enabled": true,
|
|
"trigger": "pre_cycle",
|
|
"config": {
|
|
"backoff_base": 60,
|
|
"backoff_max": 600
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## How Timmy Enables/Disables Automations
|
|
|
|
### Method 1: Edit Manifest
|
|
|
|
Modify `config/automations.json` and set `enabled: true/false`:
|
|
|
|
```bash
|
|
# Disable the loop guard
|
|
jq '.automations[] | select(.id == "loop_guard").enabled = false' \
|
|
config/automations.json > tmp.json && mv tmp.json config/automations.json
|
|
```
|
|
|
|
### Method 2: CLI (Future)
|
|
|
|
```bash
|
|
timmy automation enable loop_guard
|
|
timmy automation disable cycle_retro
|
|
timmy automation list
|
|
```
|
|
|
|
### Method 3: Dashboard (Future)
|
|
|
|
Mission Control panel will have toggles for each automation with real-time status.
|
|
|
|
---
|
|
|
|
## How Timmy Configures Automations
|
|
|
|
Each automation reads configuration from the manifest + environment variables:
|
|
|
|
| Priority | Source | Override |
|
|
|----------|--------|----------|
|
|
| 1 | Environment variables | `TIMMY_AUTOMATION_*` prefix |
|
|
| 2 | Manifest `config` object | Per-automation settings |
|
|
| 3 | Code defaults | Fallback values |
|
|
|
|
Example environment overrides:
|
|
|
|
```bash
|
|
export TIMMY_CYCLE_RETRO_WINDOW=100 # Override summary_window
|
|
export TIMMY_LOOP_GUARD_MAX_BACKOFF=300 # Override backoff_max
|
|
```
|
|
|
|
---
|
|
|
|
## Script References
|
|
|
|
The following scripts live in their original locations but are conceptually part of Timmy Automations:
|
|
|
|
| Script | Location | Category | Purpose |
|
|
|--------|----------|----------|---------|
|
|
| `cycle_retro.py` | `../scripts/` | Daily Run | Log cycle retrospective data |
|
|
| `loop_guard.py` | `../scripts/` | Daily Run | Idle detection & backoff |
|
|
| `triage_score.py` | `../scripts/` | Daily Run | Mechanical issue scoring |
|
|
| `orchestrator.py` | `daily_run/` | Daily Run | The 10-minute ritual — agenda + review |
|
|
| `deep_triage.sh` | `../scripts/` | Triage | LLM-driven issue refinement |
|
|
| `deep_triage_prompt.md` | `../scripts/` | Triage | Prompt template for deep triage |
|
|
| `loop_introspect.py` | `../scripts/` | Triage | Self-improvement analysis |
|
|
| `agent_workspace.sh` | `../scripts/` | Workspace | Agent environment management |
|
|
| `backfill_retro.py` | `../scripts/` | Metrics | Seed retro data from history |
|
|
| `pre_commit_checks.py` | `../scripts/` | Metrics | CI hygiene validation |
|
|
|
|
### Why scripts aren't moved here (yet)
|
|
|
|
These scripts are referenced rather than moved to maintain backward compatibility with:
|
|
- Existing CI/CD pipelines
|
|
- Agent workspace setups
|
|
- Shell aliases and documentation
|
|
|
|
Future work may migrate scripts here with symlink redirects from original locations.
|
|
|
|
---
|
|
|
|
## Integration with Dashboard
|
|
|
|
Automations report status for dashboard visibility:
|
|
|
|
```
|
|
.loop/
|
|
├── automation_state.json # Current state of all automations
|
|
├── queue.json # Current work queue (produced by triage)
|
|
├── retro/
|
|
│ ├── cycles.jsonl # Cycle retrospective log
|
|
│ ├── deep-triage.jsonl # Deep triage history
|
|
│ ├── triage.jsonl # Mechanical triage log
|
|
│ └── insights.json # Loop introspection output
|
|
└── quarantine.json # Quarantined issues (repeat failures)
|
|
```
|
|
|
|
The Mission Control dashboard (`/mission-control`) displays:
|
|
- Last run time for each automation
|
|
- Success/failure counts
|
|
- Queue depth and triage statistics
|
|
- Repeat failure alerts
|
|
|
|
---
|
|
|
|
## Adding New Automations
|
|
|
|
1. **Create the script** in the appropriate subdirectory
|
|
2. **Add manifest entry** to `config/automations.json`
|
|
3. **Document in this README** — add to the relevant table
|
|
4. **Add tests** in `tests/timmy_automations/`
|
|
5. **Update dashboard** if the automation produces visible output
|
|
|
|
### Automation Script Template
|
|
|
|
```python
|
|
#!/usr/bin/env python3
|
|
"""Brief description of what this automation does.
|
|
|
|
Run: python3 timmy_automations/daily_run/my_automation.py
|
|
Env: See config/automations.json for configuration
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Load automation config from manifest
|
|
CONFIG_PATH = Path(__file__).parent.parent / "config" / "automations.json"
|
|
|
|
def load_config() -> dict:
|
|
"""Load configuration for this automation."""
|
|
manifest = json.loads(CONFIG_PATH.read_text())
|
|
for auto in manifest["automations"]:
|
|
if auto["id"] == "my_automation_id":
|
|
return auto.get("config", {})
|
|
return {}
|
|
|
|
def main() -> int:
|
|
config = load_config()
|
|
# Your automation logic here
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|
|
```
|
|
|
|
---
|
|
|
|
## Token Economy Integration
|
|
|
|
Automations participate in the token economy:
|
|
|
|
| Action | Token Cost/Reward | Reason |
|
|
|--------|-------------------|--------|
|
|
| Run daily automation | 1 token | Resource usage |
|
|
| Successful cycle retro | +5 tokens | Data contribution |
|
|
| Find quarantine candidate | +10 tokens | Quality improvement |
|
|
| Deep triage refinement | +20 tokens | High-value work |
|
|
| Automation failure | -2 tokens | Penalty |
|
|
|
|
See `src/lightning/` for token economy implementation.
|
|
|
|
---
|
|
|
|
## See Also
|
|
|
|
- `CLAUDE.md` — Architecture patterns and conventions
|
|
- `AGENTS.md` — Agent roster and development standards
|
|
- `.kimi/README.md` — Kimi agent workspace guide
|
|
- `.loop/` — Runtime data directory (created on first run)
|
|
|
|
---
|
|
|
|
_Maintained by: Timmy Automations Subsystem_
|
|
_Updated: 2026-03-21_
|