yao/agent/robot/TODO.md
Max 237f193e9e Update TODO.md and Enhance Integration Tests for Scheduling System
- Marked Phase 3 of the scheduling system as complete in TODO.md, highlighting the successful implementation of all sub-tasks and the passing of over 80 integration tests.
- Updated the integration test section to reflect completed tests for various triggers and execution scenarios, ensuring comprehensive coverage of the scheduling pipeline.
- Added new test files for core scheduling flow, clock trigger modes, human intervention, event triggers, concurrent executions, and control tests, enhancing overall test coverage and stability.
- Improved assertions in existing tests to utilize the Eventually pattern for better handling of timing variations in CI environments.
2026-01-15 17:33:19 +08:00

718 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Robot Agent - Implementation TODO
> Based on DESIGN.md and TECHNICAL.md
> Test environment: `source yao/env.local.sh`
> Test assistants: `yao-dev-app/assistants/robot/`
---
## Workflow: Human-AI Collaboration
**Important:** Follow this workflow strictly for each sub-task.
```
┌─────────────────────────────────────────────────────────────────┐
│ Implementation Workflow │
├─────────────────────────────────────────────────────────────────┤
│ 1. AI: Implement code for current sub-task │
│ 2. AI: Present code for review (DO NOT write tests yet) │
│ 3. Human: Review code, provide feedback │
│ 4. AI: Iterate based on feedback │
│ 5. Human: Confirm "LGTM" or "Approved" │
│ 6. AI: Write tests for the approved code │
│ 7. Human: Review tests │
│ 8. AI: Run tests, fix if needed │
│ 9. Human: Confirm sub-task complete, move to next │
└─────────────────────────────────────────────────────────────────┘
```
**Rules:**
| Rule | Description |
| ------------------------ | ------------------------------------------ |
| One sub-task at a time | Focus only on current sub-task |
| No tests before approval | Wait for human "LGTM" before writing tests |
| No jumping ahead | Do not implement future phases |
| Ask if unclear | When in doubt, ask before proceeding |
---
## Core Principle
- Phase 1-2: Types + Skeleton (code compiles)
- Phase 3: Complete scheduling system (Cache + Pool + Trigger + Dedup + Job), executor is stub
- Phase 4-9: Implement executor phases one by one (P0 → P5)
- Phase 10: API completion, end-to-end tests
- Monitoring: Provided by Job system, no separate implementation
---
## Phase 1: Types & Interfaces ✅
**Goal:** Define all types, enums, interfaces. No logic, no external deps.
**Status:** Complete - 88.4% test coverage, all tests passing
### 1.1 Enums (`types/enums.go`)
- [x] `Phase` - execution phases (inspiration, goals, tasks, run, delivery, learning)
- [x] `ClockMode` - clock trigger modes (times, interval, daemon)
- [x] `TriggerType` - trigger sources (clock, human, event)
- [x] `ExecStatus` - execution status (pending, running, completed, failed, cancelled)
- [x] `RobotStatus` - robot status (idle, working, paused, error, maintenance)
- [x] `InterventionAction` - human actions (task.add, goal.adjust, etc.)
- [x] `Priority` - priority levels (high, normal, low)
- [x] `DeliveryType` - delivery types (email, file, webhook, notify)
- [x] `DedupResult` - dedup results (skip, merge, proceed)
- [x] `EventSource` - event sources (webhook, database)
- [x] `LearningType` - learning types (execution, feedback, insight)
- [x] `TaskSource` - task sources (auto, human, event)
- [x] `ExecutorType` - executor types (assistant, mcp, process)
- [x] `TaskStatus` - task status (pending, running, completed, failed, skipped, cancelled)
- [x] `InsertPosition` - insert positions (first, last, next, at)
### 1.2 Context (`types/context.go`)
- [x] `Context` struct - robot execution context
- [x] `NewContext()` - constructor
- [x] `UserID()`, `TeamID()` - helper methods
### 1.3 Config Types (`types/config.go`)
- [x] `Config` - main config struct
- [x] `Triggers`, `TriggerSwitch` - trigger enable/disable
- [x] `Clock` - clock config with validation
- [x] `Identity` - role, duties, rules
- [x] `Quota` - concurrency limits with defaults
- [x] `KB`, `DB` - knowledge base and database config
- [x] `Learn` - learning config
- [x] `Resources`, `MCPConfig` - available agents and tools
- [x] `Delivery` - output delivery config
- [x] `Event` - event trigger config
### 1.4 Core Types (`types/robot.go`)
- [x] `Robot` struct - runtime robot representation
- [x] `Robot` methods - `CanRun()`, `RunningCount()`, `AddExecution()`, `RemoveExecution()`, `GetExecution()`, `GetExecutions()`
- [x] `Execution` struct - single execution instance
- [x] `TriggerInput` - stored trigger input
- [x] `CurrentState` - current executing state
- [x] `Goals` - P1 output (markdown)
- [x] `Task` - planned task (structured)
- [x] `TaskResult` - task execution result
- [x] `DeliveryResult` - delivery output
- [x] `LearningEntry` - knowledge to save
### 1.5 Clock Context (`types/clock.go`)
- [x] `ClockContext` struct - time context for P0
- [x] `NewClockContext()` - constructor
### 1.6 Inspiration (`types/inspiration.go`)
- [x] `InspirationReport` struct - P0 output
### 1.7 Request/Response (`types/request.go`)
- [x] `InterveneRequest` - human intervention request
- [x] `EventRequest` - event trigger request
- [x] `ExecutionResult` - trigger result
- [x] `RobotState` - robot status query result
### 1.8 Interfaces (`types/interfaces.go`)
- [x] `Manager` interface
- [x] `Executor` interface
- [x] `Pool` interface
- [x] `Cache` interface
- [x] `Dedup` interface
- [x] `Store` interface
### 1.9 Errors (`types/errors.go`)
- [x] Config errors
- [x] Runtime errors
- [x] Phase errors
### 1.10 Tests
- [x] `types/enums_test.go` - enum validation
- [x] `types/config_test.go` - config validation
- [x] `types/clock_test.go` - clock context creation
- [x] `types/robot_test.go` - robot methods
---
## Phase 2: Skeleton Implementation ✅
**Goal:** Create all packages with empty/stub implementations. Code compiles.
**Status:** Complete - All packages compile successfully, no circular dependencies
### 2.1 Utils (`utils/`) ✅
- [x] `utils/convert.go` - JSON, map, struct conversions (implement)
- [x] `utils/time.go` - time parsing, formatting, timezone (implement)
- [x] `utils/id.go` - ID generation (nanoid) (implement)
- [x] `utils/validate.go` - validation helpers (implement)
- [x] Test: `utils/utils_test.go`
### 2.2 Package Skeletons ✅ (stubs only, implemented in Phase 3)
Create empty structs and stub methods that return nil/empty/success:
- [x] `cache/cache.go` - Cache struct, stub methods
- [x] `dedup/dedup.go` - Dedup struct, stub methods
- [x] `store/store.go` - Store struct, stub methods
- [x] `pool/pool.go` - Pool struct, stub methods
- [x] `job/job.go` - job helper stubs
- [x] `plan/plan.go` - Plan struct, stub methods
- [x] `trigger/trigger.go` - trigger dispatcher stub
- [x] `executor/executor.go` - Executor struct, stub `Execute()`
- [x] `manager/manager.go` - Manager struct, stub methods
### 2.3 API Skeletons ✅
- [x] `api/api.go` - Go API facade (all function signatures, return errors)
- [x] `api/process.go` - Yao Process registration (all processes, return errors)
- [x] `api/jsapi.go` - JSAPI registration (all methods, return errors)
### 2.4 Root ✅
- [x] `robot.go` - package entry
- [x] `Init()` - placeholder
- [x] `Shutdown()` - placeholder
### 2.5 Compile Test ✅
- [x] All packages compile without errors
- [x] All imports resolve correctly
- [x] No circular dependencies
---
## Phase 3: Complete Scheduling System ✅
**Goal:** Implement complete scheduling system. Executor is stub (simulates success).
**Status:** Complete - All 7 sub-tasks done, 80+ integration tests passing
This phase delivers a fully working scheduling pipeline:
```
Trigger → Manager → Cache → Dedup → Pool → Worker → Executor(stub) → Job
```
### ✅ 3.1 Cache Implementation (COMPLETE)
- [x] `cache/cache.go` - Cache struct with thread-safe map
- [x] `cache/load.go` - load robots from `__yao.member` where `member_type='robot'` and `autonomous_mode=true`
- [x] Implemented pagination (100 robots per page)
- [x] Configurable model name via `SetMemberModel()`
- [x] `cache/refresh.go` - refresh single robot, periodic full refresh (every hour)
- [x] Test: load/refresh with real DB
- [x] Created comprehensive integration tests with real database
- [x] Tests cover Load, LoadByID, Refresh, ListByTeam, GetByStatus
- [x] All tests passing with proper cleanup
### ✅ 3.2 Pool Implementation (COMPLETE)
- [x] `pool/pool.go` - worker pool with configurable size (global limit)
- [x] Default config: 10 workers, 100 queue size
- [x] Configurable via `pool.NewWithConfig()`
- [x] `pool/queue.go` - priority queue (sorted by: robot priority, trigger type, wait time)
- [x] Two-level limit: global queue + per-robot queue
- [x] Priority: Robot Priority × 1000 + Trigger Priority × 100
- [x] `pool/worker.go` - worker goroutines, dispatch to executor
- [x] Non-blocking quota check with re-enqueue
- [x] Graceful shutdown support
- [x] Test: submit jobs, verify execution order, verify concurrency limits
- [x] 15 test cases covering all edge cases
- [x] All tests passing
### ✅ 3.3 Manager Implementation (COMPLETE)
> **Note:** Manager is the scheduling core, depends on completed Cache and Pool.
- [x] `manager/manager.go` - Manager struct
- [x] `Start()` - load cache, start pool, start ticker goroutine
- [x] `Stop()` - graceful shutdown (wait for running, drain queue)
- [x] `Tick()` - main loop:
1. Get all cached robots
2. For each robot with clock trigger enabled
3. Check if should execute (times/interval/daemon modes)
4. Submit to pool
- [x] `TriggerManual()` - manual trigger for testing/API
- [x] Clock modes: times, interval, daemon
- [x] Day matching for times mode
- [x] Timezone handling
- [x] Skip paused/error/maintenance robots
- [x] Test: manager start/stop, tick cycle, manual trigger, clock modes, goroutine leak
### ✅ 3.4 Trigger Implementation (COMPLETE)
- [x] `trigger/trigger.go` - validation and helper functions
- [x] `ValidateIntervention()` - validate human intervention requests
- [x] `ValidateEvent()` - validate event trigger requests
- [x] `BuildEventInput()` - build TriggerInput from event request
- [x] `GetActionCategory()` / `GetActionDescription()` - action helpers
- [x] `trigger/clock.go` - ClockMatcher for clock trigger matching
- [x] `times` mode: match specific times (09:00, 14:00)
- [x] `interval` mode: run every X duration (30m, 1h)
- [x] `daemon` mode: restart immediately after completion
- [x] Timezone handling
- [x] Day-of-week filtering
- [x] `trigger/control.go` - ExecutionController for pause/resume/stop
- [x] Track/Untrack executions
- [x] Pause/Resume execution
- [x] Stop execution (cancel context)
- [x] WaitIfPaused() for executor integration
- [x] `manager/manager.go` - integrated trigger handling
- [x] `Intervene()` - human intervention handler
- [x] `HandleEvent()` - event trigger handler
- [x] `PauseExecution()` / `ResumeExecution()` / `StopExecution()`
- [x] `ListExecutions()` / `ListExecutionsByMember()`
- [x] Tests: `trigger/trigger_test.go`, `trigger/clock_test.go`, `trigger/control_test.go`
- [x] Validation tests for intervention and event requests
- [x] Clock matching tests for all modes
- [x] ExecutionController lifecycle tests
- [x] Manager integration tests for Intervene/HandleEvent
### ✅ 3.5 Job Integration (COMPLETE)
- [x] `job/job.go` - create job
- [x] `job_id`: `robot_exec_{execID}`
- [x] `category_name`: `Autonomous Robot` / `自主机器人` (localized)
- [x] Metadata: member_id, team_id, trigger_type, exec_id, display_name
- [x] `Options` struct for extensibility (Priority, MaxRetryCount, DefaultTimeout, Metadata)
- [x] `Create()`, `Get()`, `Update()`, `Complete()`, `Fail()`, `Cancel()`
- [x] Status mapping: ExecPending→queued, ExecRunning→running, etc.
- [x] Localization support (en-US, zh-CN)
- [x] `job/execution.go` - execution lifecycle
- [x] `CreateOptions` struct for extensibility
- [x] `CreateExecution()` - create both robot Execution and job.Execution
- [x] `UpdatePhase()` - update phase with progress tracking (10%→25%→40%→60%→80%→95%)
- [x] `UpdateStatus()` - update execution status
- [x] `CompleteExecution()` / `FailExecution()` / `CancelExecution()`
- [x] TriggerType → TriggerCategory mapping (clock→scheduled, human→manual, event→event)
- [x] Duration calculation on completion/failure/cancellation
- [x] `job/log.go` - write phase logs
- [x] `Log()` - base log function with context
- [x] `LogPhaseStart()` / `LogPhaseEnd()` / `LogPhaseError()`
- [x] `LogError()` / `LogInfo()` / `LogDebug()` / `LogWarn()`
- [x] `LogTaskStart()` / `LogTaskEnd()`
- [x] `LogDelivery()` / `LogLearning()`
- [x] Localization support for all log messages
- [x] Test: job creation, execution tracking, log writing
- [x] `job/job_test.go` - 17 test cases
- [x] `job/execution_test.go` - 26 test cases
- [x] `job/log_test.go` - 24 test cases
- [x] All tests passing with real database
### ✅ 3.6 Executor Stub Enhancement (COMPLETE)
- [x] `executor/executor.go` - enhanced stub implementation
- [x] `Execute()` - simulate full execution with Job integration
1. Create Execution record + Job (via job package)
2. Update phase: P0 → P1 → P2 → P3 → P4 → P5
3. Log phase transitions
4. Return success with mock data
- [x] `Config` struct with `SkipJobIntegration`, `OnPhaseStart`, `OnPhaseEnd`
- [x] `NewWithDelay()`, `NewWithCallback()` for testing
- [x] Quota check with `robot.TryAcquireSlot()`
- [x] Clock trigger: P0→P5, Human/Event trigger: P1→P5
- [x] Phase-specific files (modular design for Phase 4+ replacement):
- [x] `executor/inspiration.go` - `RunInspiration()` P0 mock
- [x] `executor/goals.go` - `RunGoals()` P1 mock
- [x] `executor/tasks.go` - `RunTasks()` P2 mock
- [x] `executor/run.go` - `RunExecution()` P3 mock
- [x] `executor/delivery.go` - `RunDelivery()` P4 mock
- [x] `executor/learning.go` - `RunLearning()` P5 mock
- [x] `simulateStreamDelay()` - 50ms hardcoded delay per phase
- [x] Test: smoke tests for basic flow verification
- [x] `executor/executor_test.go` - 6 test cases
- [x] Clock/Human/Event triggers, nil robot, simulated failure, counters
### 3.7 Integration Test (End-to-End Scheduling) ✅
- [x] Create test robot in `__yao.member` with clock config
- [x] Start manager
- [x] Wait for clock trigger
- [x] Verify:
- [x] Robot loaded to cache
- [x] Clock trigger matched
- [x] Job submitted to pool
- [x] Worker picked up job
- [x] Executor stub called
- [x] Job execution recorded
- [x] Logs written
- [x] Test human intervention trigger
- [x] Test event trigger
- [x] Test concurrent executions (multiple robots)
- [x] Test quota enforcement (per-robot limit)
- [x] Test pause/resume/stop
**Test Files Created:**
- `manager/integration_test.go` - Core scheduling flow (Cache→Pool→Executor)
- `manager/integration_clock_test.go` - Clock trigger modes (times/interval/daemon)
- `manager/integration_human_test.go` - Human intervention trigger tests
- `manager/integration_event_test.go` - Event trigger tests
- `manager/integration_concurrent_test.go` - Concurrent execution & quota tests
- `manager/integration_control_test.go` - Pause/Resume/Stop tests
**Test Coverage:**
- 27 top-level test functions
- 80+ sub-tests covering all verification points
- 3x run stability verified
---
## Phase 4: Executor - P0 Inspiration
**Goal:** Implement P0 (Inspiration Agent). Clock trigger → P0 → stub P1-P5.
### 4.1 Test Assistant Setup
Create `yao-dev-app/assistants/robot/` directory:
- [ ] `inspiration/package.yao` - Inspiration Agent config
- [ ] `inspiration/prompts.yml` - P0 prompts
- [ ] `inspiration/src/index.ts` - hooks if needed
### 4.2 P0 Implementation
- [ ] `executor/inspiration.go` - build prompt with `ClockContext`
- [ ] `executor/inspiration.go` - call Inspiration Agent
- [ ] `executor/inspiration.go` - parse response to `InspirationReport`
- [ ] `executor/prompt.go` - `BuildInspirationPrompt()`
### 4.3 Tests
- [ ] `executor/inspiration_test.go` - P0 with real LLM call
- [ ] Verify: clock context in prompt
- [ ] Verify: markdown report generated
---
## Phase 5: Executor - P1 Goals
**Goal:** Implement P1 (Goal Generation Agent). P0 → P1 → stub P2-P5.
### 5.1 Test Assistant Setup
- [ ] `goals/package.yao` - Goal Generation Agent config
- [ ] `goals/prompts.yml` - P1 prompts
### 5.2 P1 Implementation
- [ ] `executor/goals.go` - build prompt with inspiration report
- [ ] `executor/goals.go` - call Goal Agent
- [ ] `executor/goals.go` - parse response to `Goals` (markdown)
- [ ] `executor/prompt.go` - `BuildGoalsPrompt()`
### 5.3 Tests
- [ ] `executor/goals_test.go` - P1 with real LLM call
- [ ] Verify: inspiration report in prompt
- [ ] Verify: goals markdown generated
---
## Phase 6: Executor - P2 Tasks
**Goal:** Implement P2 (Task Planning Agent). P1 → P2 → stub P3-P5.
### 6.1 Test Assistant Setup
- [ ] `tasks/package.yao` - Task Planning Agent config
- [ ] `tasks/prompts.yml` - P2 prompts
### 6.2 P2 Implementation
- [ ] `executor/tasks.go` - build prompt with goals
- [ ] `executor/tasks.go` - call Task Agent
- [ ] `executor/tasks.go` - parse response to `[]Task` (structured)
- [ ] `executor/prompt.go` - `BuildTasksPrompt()`
### 6.3 Tests
- [ ] `executor/tasks_test.go` - P2 with real LLM call
- [ ] Verify: goals in prompt
- [ ] Verify: structured tasks generated
---
## Phase 7: Executor - P3 Run
**Goal:** Implement P3 (Task Execution). P2 → P3 → stub P4-P5.
### 7.1 Implementation
- [ ] `executor/run.go` - iterate tasks
- [ ] `executor/run.go` - call executor (assistant/mcp/process)
- [ ] `executor/run.go` - collect results
- [ ] `executor/agent.go` - unified agent call method
### 7.2 Validation Agent Setup
- [ ] `validation/package.yao` - Validation Agent config
- [ ] `validation/prompts.yml` - validation prompts
### 7.3 Tests
- [ ] `executor/run_test.go` - P3 with real agent calls
- [ ] Verify: tasks executed in order
- [ ] Verify: results collected
---
## Phase 8: Executor - P4 Delivery
**Goal:** Implement P4 (Delivery). P3 → P4 → stub P5.
### 8.1 Test Assistant Setup
- [ ] `delivery/package.yao` - Delivery Agent config
- [ ] `delivery/prompts.yml` - delivery prompts
### 8.2 Implementation
- [ ] `executor/delivery.go` - build delivery content
- [ ] `executor/delivery.go` - send via configured channel (email/file/webhook/notify)
### 8.3 Tests
- [ ] `executor/delivery_test.go` - P4 delivery
- [ ] Verify: delivery sent (mock or real)
---
## Phase 9: Executor - P5 Learning
**Goal:** Implement P5 (Learning). Full execution flow complete.
### 9.1 Test Assistant Setup
- [ ] `learning/package.yao` - Learning Agent config
- [ ] `learning/prompts.yml` - learning prompts
### 9.2 Store Implementation
- [ ] `store/kb.go` - KB operations (create, save, search)
- [ ] `store/learning.go` - save learning entries to private KB
### 9.3 Implementation
- [ ] `executor/learning.go` - extract learnings from execution
- [ ] `executor/learning.go` - call Learning Agent
- [ ] `executor/learning.go` - save to private KB
### 9.4 Tests
- [ ] `executor/learning_test.go` - P5 learning
- [ ] Verify: learnings saved to KB
---
## Phase 10: API & Integration
**Goal:** Complete API implementation, end-to-end tests.
### 10.1 API Implementation
- [ ] `api/api.go` - implement all Go API functions
- [ ] `api/process.go` - implement all Process handlers
- [ ] `api/jsapi.go` - implement JSAPI
### 10.2 End-to-End Tests
- [ ] Full clock trigger flow (P0 → P5)
- [ ] Human intervention flow (P1 → P5)
- [ ] Event trigger flow (P1 → P5)
- [ ] Concurrent execution test
- [ ] Pause/Resume/Stop test
### 10.3 Integration with OpenAPI
- [ ] HTTP endpoints for human intervention
- [ ] Webhook endpoints for events
---
## Phase 11: Advanced Features
**Goal:** Implement dedup, semantic dedup, plan queue.
### 11.1 Fast Dedup (Time-Window)
> **Note:** Manager has `// TODO: dedup check` comment placeholder. Integrate after implementation.
- [ ] `dedup/dedup.go` - Dedup struct
- [ ] `dedup/fast.go` - fast in-memory time-window dedup
- [ ] Key: `memberID:triggerType:window`
- [ ] Check before submit
- [ ] Mark after submit
- [ ] Integrate into Manager.Tick()
- [ ] Test: dedup check/mark, window expiry
### 11.2 Semantic Dedup
- [ ] `dedup/semantic.go` - call Dedup Agent for goal/task level dedup
- [ ] Dedup Agent setup (`assistants/robot/dedup/`)
- [ ] Test: semantic dedup with real LLM
### 11.3 Plan Queue
- [ ] `plan/plan.go` - plan queue implementation
- [ ] Store planned tasks/goals
- [ ] Execute at next cycle or specified time
- [ ] `plan/schedule.go` - schedule for later
- [ ] Test: plan queue operations
> **Note:** Monitoring is provided by Job system (Activity Monitor UI). No separate implementation needed.
---
## Test Assistants Structure
```
yao-dev-app/assistants/robot/
├── inspiration/ # P0: Inspiration Agent
│ ├── package.yao
│ └── prompts.yml
├── goals/ # P1: Goal Generation Agent
│ ├── package.yao
│ └── prompts.yml
├── tasks/ # P2: Task Planning Agent
│ ├── package.yao
│ └── prompts.yml
├── validation/ # P3: Validation Agent
│ ├── package.yao
│ └── prompts.yml
├── delivery/ # P4: Delivery Agent
│ ├── package.yao
│ └── prompts.yml
├── learning/ # P5: Learning Agent
│ ├── package.yao
│ └── prompts.yml
└── dedup/ # Deduplication Agent
├── package.yao
└── prompts.yml
```
---
## Notes
### Test Environment Setup
1. **Environment Variables:** Run `source yao/env.local.sh` before tests
2. **Test Preparation:** Use `testutils.Prepare(t)` to load config, KB, and agents
```go
package robot_test
import (
"testing"
"github.com/yaoapp/yao/agent/testutils"
)
func TestExample(t *testing.T) {
// Load environment config (from YAO_TEST_APPLICATION)
// This loads: config, connectors, KB, agents, models, etc.
testutils.Prepare(t)
defer testutils.Clean(t)
// Your test code here
}
```
### Test Conventions
1. **Black-box Tests:** All tests in `*_test` package (external package)
2. **Real LLM Calls:** Use `gpt-4o` or `deepseek` connectors for agent tests
3. **Incremental:** Each phase builds on previous, all tests must pass before next phase
4. **No Skip:** Do NOT use `t.Skip()` except for `testing.Short()` (CI mode)
5. **Must Assert:** Every test MUST have result validation assertions
```go
func TestWithLLM(t *testing.T) {
// Only allowed Skip: testing.Short() for CI
if testing.Short() {
t.Skip("Skipping integration test")
}
testutils.Prepare(t)
defer testutils.Clean(t)
// Your test code...
result, err := SomeFunction()
// MUST have assertions - no empty tests!
assert.NoError(t, err)
assert.NotNil(t, result)
assert.Equal(t, expected, result.Field)
}
```
### Test Rules
| Rule | Description |
| ----------------- | ----------------------------------------- |
| No arbitrary Skip | Only `testing.Short()` skip allowed |
| Must assert | Every test must validate results |
| No empty tests | Tests without assertions will fail review |
| Real calls | LLM tests use real API calls, not mocks |
### Key Environment Variables
| Variable | Description |
| ---------------------- | ------------------------------- |
| `YAO_TEST_APPLICATION` | Test app path (`yao-dev-app`) |
| `OPENAI_TEST_KEY` | OpenAI API key |
| `DEEPSEEK_API_KEY` | DeepSeek API key |
| `YAO_DB_DRIVER` | Database driver (mysql/sqlite3) |
| `YAO_DB_PRIMARY` | Database connection string |
---
## Progress Tracking
| Phase | Status | Description |
| --------------------- | ------ | -------------------------------------------------------------------- |
| 1. Types & Interfaces | ✅ | All types, enums, interfaces |
| 2. Skeleton | ✅ | Empty stubs, code compiles |
| 3. Scheduling System | 🟡 | Cache + Pool + Trigger + Job + Executor stub ✅, Integration test 🟡 |
| 4. P0 Inspiration | ⬜ | Inspiration Agent integration |
| 5. P1 Goals | ⬜ | Goal Generation Agent integration |
| 6. P2 Tasks | ⬜ | Task Planning Agent integration |
| 7. P3 Run | ⬜ | Task execution (assistant/mcp/process) |
| 8. P4 Delivery | ⬜ | Output delivery (email/file/webhook/notify) |
| 9. P5 Learning | ⬜ | Learning Agent + KB save |
| 10. API & Integration | ⬜ | Complete API, end-to-end tests |
| 11. Advanced | ⬜ | Semantic dedup, plan queue |
Legend: ⬜ Not started | 🟡 In progress | ✅ Complete
---
## Quick Commands
```bash
# Setup environment
source yao/env.local.sh
# Run all robot tests
go test -v ./agent/robot/...
# Run specific phase tests
go test -v ./agent/robot/types/...
go test -v ./agent/robot/cache/...
go test -v ./agent/robot/pool/...
go test -v ./agent/robot/executor/...
# Run with coverage
go test -cover ./agent/robot/...
```