- Marked the Pool Implementation as complete in TODO.md, confirming all tasks are finished with comprehensive tests. - Introduced a configurable worker pool with a priority queue for managing robot jobs, including graceful shutdown support. - Enhanced the Executor with simulated execution delay and callback functionality for testing, tracking execution counts. - Improved error handling in the pool's submission process and added methods for retrieving running and queued job counts. - Updated tests to ensure robust functionality and performance of the pool and executor components.
653 lines
21 KiB
Markdown
653 lines
21 KiB
Markdown
# 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).
|
||
|
||
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 Trigger Implementation
|
||
|
||
- [ ] `trigger/trigger.go` - trigger dispatcher (routes to clock/intervene/event)
|
||
- [ ] `trigger/clock.go` - clock trigger
|
||
- [ ] `times` mode: match specific times (09:00, 14:00)
|
||
- [ ] `interval` mode: run every X duration (30m, 1h)
|
||
- [ ] `daemon` mode: restart immediately after completion
|
||
- [ ] Timezone handling
|
||
- [ ] `trigger/intervene.go` - human intervention
|
||
- [ ] Parse action (task.add, goal.adjust, etc.)
|
||
- [ ] Build TriggerInput with Messages
|
||
- [ ] `trigger/event.go` - event handling
|
||
- [ ] Webhook event dispatch
|
||
- [ ] Database change event dispatch
|
||
- [ ] `trigger/control.go` - execution control
|
||
- [ ] Pause execution
|
||
- [ ] Resume execution
|
||
- [ ] Cancel/Stop execution
|
||
- [ ] Test: clock matching (all modes), intervention handling, event dispatch
|
||
|
||
### 3.4 Dedup 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
|
||
- [ ] Test: dedup check/mark, window expiry
|
||
|
||
### 3.5 Job Integration
|
||
|
||
- [ ] `job/job.go` - create job
|
||
- [ ] `job_id`: `robot_exec_{execID}`
|
||
- [ ] `category_id`: `autonomous_robot`
|
||
- [ ] Metadata: member_id, team_id, trigger_type, exec_id
|
||
- [ ] `job/execution.go` - execution lifecycle
|
||
- [ ] Create execution on trigger
|
||
- [ ] Update status on phase change
|
||
- [ ] Complete/fail on finish
|
||
- [ ] `job/log.go` - write phase logs
|
||
- [ ] Log phase start/end
|
||
- [ ] Log errors
|
||
- [ ] Test: job creation, execution tracking, log writing
|
||
|
||
### 3.6 Manager Implementation
|
||
|
||
- [ ] `manager/manager.go` - Manager struct
|
||
- [ ] `Start()` - start ticker goroutine, start pool
|
||
- [ ] `Stop()` - graceful shutdown (wait for running, drain queue)
|
||
- [ ] `Tick()` - main loop:
|
||
1. Get all cached robots
|
||
2. For each robot with clock trigger enabled
|
||
3. Check if should execute (schedule match + dedup)
|
||
4. Submit to pool
|
||
- [ ] Test: manager start/stop, tick cycle
|
||
|
||
### 3.7 Executor Stub
|
||
|
||
- [ ] `executor/executor.go` - stub implementation
|
||
- [ ] `Execute()` - simulate full execution
|
||
1. Create Execution record
|
||
2. Update phase: P0 → P1 → P2 → P3 → P4 → P5
|
||
3. Sleep briefly between phases (simulate work)
|
||
4. Return success with mock data
|
||
- [ ] Test: verify stub called, verify phase progression
|
||
|
||
### 3.8 Integration Test (End-to-End Scheduling)
|
||
|
||
- [ ] Create test robot in `__yao.member` with clock config
|
||
- [ ] Start manager
|
||
- [ ] Wait for clock trigger
|
||
- [ ] Verify:
|
||
- [ ] Robot loaded to cache
|
||
- [ ] Clock trigger matched
|
||
- [ ] Dedup checked
|
||
- [ ] Job submitted to pool
|
||
- [ ] Worker picked up job
|
||
- [ ] Executor stub called
|
||
- [ ] Job execution recorded
|
||
- [ ] Logs written
|
||
- [ ] Test human intervention trigger
|
||
- [ ] Test event trigger
|
||
- [ ] Test concurrent executions (multiple robots)
|
||
- [ ] Test quota enforcement (per-robot limit)
|
||
- [ ] Test pause/resume/stop
|
||
|
||
---
|
||
|
||
## 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 semantic dedup, plan queue.
|
||
|
||
### 11.1 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.2 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 + Dedup + Job (executor stub) |
|
||
| 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/...
|
||
```
|