From c5a2d023572c769e6fb8cf9935aaca22d712a117 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 17 Jun 2026 11:06:37 +0000 Subject: [PATCH 1/2] fix(evolution): align run skills root Co-authored-by: EXboy --- crates/skilllite-agent/src/skills/mod.rs | 2 +- .../src/i18n/messages/en.ts | 2 +- .../src/i18n/messages/zh.ts | 2 +- crates/skilllite-commands/src/evolution.rs | 34 ++++++++- crates/skilllite-evolution/src/run.rs | 2 +- .../src/skill_synth/mod.rs | 2 +- .../CONTEXT.md | 41 +++++++++++ .../PRD.md | 37 ++++++++++ .../REVIEW.md | 29 ++++++++ .../STATUS.md | 17 +++++ .../TASK.md | 73 +++++++++++++++++++ tasks/board.md | 4 +- 12 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md create mode 100644 tasks/TASK-2026-069-evolution-run-skills-root/PRD.md create mode 100644 tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md create mode 100644 tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md create mode 100644 tasks/TASK-2026-069-evolution-run-skills-root/TASK.md diff --git a/crates/skilllite-agent/src/skills/mod.rs b/crates/skilllite-agent/src/skills/mod.rs index 87eacf2f..4e7c1196 100644 --- a/crates/skilllite-agent/src/skills/mod.rs +++ b/crates/skilllite-agent/src/skills/mod.rs @@ -41,7 +41,7 @@ pub struct LoadedSkill { /// Load skills from directories, parse SKILL.md, generate tool definitions. /// Also loads evolved skills from `_evolved/` subdirectories (EVO-4), /// skipping archived ones based on `.meta.json`. -/// Skills are project-level only: evolution writes to workspace/.skills/_evolved/. +/// Skills are project-level only: evolution writes under the effective workspace skills root. pub fn load_skills(skill_dirs: &[String]) -> Vec { let mut skills = Vec::new(); diff --git a/crates/skilllite-assistant/src/i18n/messages/en.ts b/crates/skilllite-assistant/src/i18n/messages/en.ts index c9fc1667..431d823b 100644 --- a/crates/skilllite-assistant/src/i18n/messages/en.ts +++ b/crates/skilllite-assistant/src/i18n/messages/en.ts @@ -278,7 +278,7 @@ export const enMessages: Record = { "evolution.detail.reviewNoJudgement": "No system judgement yet (last evolution decision missing or empty).", "evolution.detail.reviewPendingEmpty": - "No pending skills. Newly evolved skills appear under .skills/_evolved/_pending/.", + "No pending skills. Newly evolved skills appear under skills/_evolved/_pending/ or legacy .skills/_evolved/_pending/.", "evolution.diff.sectionTitleEvolution": "Evolution", "evolution.diff.sectionTitleRest": " prompt diff", "evolution.diff.evolvedBadge": "✨ Evolved this run", diff --git a/crates/skilllite-assistant/src/i18n/messages/zh.ts b/crates/skilllite-assistant/src/i18n/messages/zh.ts index 00e7329b..3b5f8508 100644 --- a/crates/skilllite-assistant/src/i18n/messages/zh.ts +++ b/crates/skilllite-assistant/src/i18n/messages/zh.ts @@ -264,7 +264,7 @@ export const zhMessages: Record = { "evolution.detail.reviewPendingRefresh": "刷新列表", "evolution.detail.reviewNoJudgement": "暂无系统审核结论(最近一次进化判断未记录或为空)。", "evolution.detail.reviewPendingEmpty": - "暂无待确认技能。进化生成的新技能会出现在 .skills/_evolved/_pending/。", + "暂无待确认技能。进化生成的新技能会出现在 skills/_evolved/_pending/,或旧版 .skills/_evolved/_pending/。", "evolution.diff.sectionTitleEvolution": "进化", "evolution.diff.sectionTitleRest": "变更对比", "evolution.diff.evolvedBadge": "✨ 本轮已进化", diff --git a/crates/skilllite-commands/src/evolution.rs b/crates/skilllite-commands/src/evolution.rs index ee12525c..ea590e57 100644 --- a/crates/skilllite-commands/src/evolution.rs +++ b/crates/skilllite-commands/src/evolution.rs @@ -31,7 +31,8 @@ use skilllite_core::protocol::{NewSkill, NodeResult}; use skilllite_core::skill::manifest; /// Resolve workspace for project-level skill evolution. -/// Uses SKILLLITE_WORKSPACE env or current_dir. Returns workspace/.skills. +/// Uses SKILLLITE_WORKSPACE env or current_dir, then applies the shared +/// `skills/` default with `.skills/` legacy fallback policy. fn resolve_skills_root(workspace: Option<&str>) -> Option { let ws: PathBuf = workspace .filter(|s| !s.is_empty()) @@ -47,7 +48,10 @@ fn resolve_skills_root(workspace: Option<&str>) -> Option { } else { std::env::current_dir().ok()?.join(ws) }; - Some(ws.join(".skills")) + Some( + skilllite_core::skill::discovery::resolve_skills_dir_with_legacy_fallback(&ws, "skills") + .effective_path, + ) } #[derive(Debug)] @@ -1013,6 +1017,32 @@ pub fn cmd_repair_skills(skills_filter: Option>, from_source: bool) mod tests { use super::*; + #[test] + fn resolve_skills_root_prefers_default_skills_dir_when_present() { + let tmp = tempfile::tempdir().expect("temp workspace"); + let default_skills = tmp.path().join("skills"); + let legacy_skills = tmp.path().join(".skills"); + std::fs::create_dir_all(&default_skills).expect("create skills"); + std::fs::create_dir_all(&legacy_skills).expect("create legacy skills"); + + let resolved = resolve_skills_root(Some(tmp.path().to_string_lossy().as_ref())) + .expect("resolve skills root"); + + assert_eq!(resolved, default_skills); + } + + #[test] + fn resolve_skills_root_falls_back_to_legacy_skills_dir() { + let tmp = tempfile::tempdir().expect("temp workspace"); + let legacy_skills = tmp.path().join(".skills"); + std::fs::create_dir_all(&legacy_skills).expect("create legacy skills"); + + let resolved = resolve_skills_root(Some(tmp.path().to_string_lossy().as_ref())) + .expect("resolve skills root"); + + assert_eq!(resolved, legacy_skills); + } + #[test] fn normalize_filters_validate_allowed_values() { assert_eq!( diff --git a/crates/skilllite-evolution/src/run.rs b/crates/skilllite-evolution/src/run.rs index d1331b4a..04cfce2f 100644 --- a/crates/skilllite-evolution/src/run.rs +++ b/crates/skilllite-evolution/src/run.rs @@ -37,7 +37,7 @@ fn try_log_evolution_run_outcome(chat_root: &Path, reason: &str) { /// /// Returns [EvolutionRunResult]: SkippedBusy if another run in progress, NoScope if nothing to evolve, Completed(txn_id) otherwise. /// When force=true (manual trigger), bypass decision thresholds. -/// skills_root: project-level dir (workspace/.skills). When None, skips skill evolution. +/// skills_root: effective project-level skills root. When None, skips skill evolution. pub async fn run_evolution( chat_root: &Path, skills_root: Option<&Path>, diff --git a/crates/skilllite-evolution/src/skill_synth/mod.rs b/crates/skilllite-evolution/src/skill_synth/mod.rs index 3567318f..16a9521a 100644 --- a/crates/skilllite-evolution/src/skill_synth/mod.rs +++ b/crates/skilllite-evolution/src/skill_synth/mod.rs @@ -12,7 +12,7 @@ //! - **Retry**: 任何 LLM 输出 JSON 解析失败时,将错误反馈给大模型并重试 1 次 //! - 代码修改/修复仅由大模型完成,不使用正则或模式匹配 //! -//! All evolved skills live in `chat/skills/_evolved/` with `.meta.json` metadata. +//! All evolved skills live under `/_evolved/` with `.meta.json` metadata. //! A10: Newly generated skills go to `_evolved/_pending/` until user confirms. mod env_helper; diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md b/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md new file mode 100644 index 00000000..03859a34 --- /dev/null +++ b/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md @@ -0,0 +1,41 @@ +# Technical Context + +## Current State + +- Relevant crates/files: + - `crates/skilllite-commands/src/evolution.rs` + - `crates/skilllite-commands/src/evolution_desktop.rs` + - `crates/skilllite-commands/src/evolution_status.rs` + - `crates/skilllite-core/src/skill/discovery.rs` +- Current behavior: + - `evolution_desktop::resolve_skills_root` uses `resolve_skills_dir_with_legacy_fallback(&root, "skills")`. + - `evolution_status` counts pending skills from the same effective skills root. + - `evolution::cmd_run` uses a private helper that returns `workspace/.skills`. + - When `skills/` exists, generated pending skills can be written to a path the desktop UI does not inspect. + +## Architecture Fit + +- Layer boundaries involved: + - CLI entry crate dispatches to `skilllite-commands`. + - `skilllite-commands` may call lower-layer `skilllite-core` discovery helpers. +- Interfaces to preserve: + - Existing `evolution run` CLI flags and JSON response shape. + - Existing legacy `.skills` fallback behavior for projects without `skills/`. + +## Dependency and Compatibility + +- New dependencies: none. +- Backward compatibility notes: + - Existing projects with only `.skills/` continue to use `.skills/`. + - Projects with `skills/` get consistent behavior across run/pending/status/confirm. + +## Design Decisions + +- Decision: Update `evolution.rs` root resolution to call the same discovery helper used by desktop reads. + - Rationale: Reuses the established project skills-root policy and avoids duplicating fallback rules. + - Alternatives considered: Change desktop pending/status/confirm back to `.skills` only. + - Why rejected: That would undo the newer `skills/` default and break current `skilllite init` style workspaces. + +## Open Questions + +- [ ] Whether assistant background authorize should pass `--workspace` to `evolution run`; tracked as residual risk outside this minimal skills-root fix. diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/PRD.md b/tasks/TASK-2026-069-evolution-run-skills-root/PRD.md new file mode 100644 index 00000000..55352c02 --- /dev/null +++ b/tasks/TASK-2026-069-evolution-run-skills-root/PRD.md @@ -0,0 +1,37 @@ +# PRD + +## Background + +The recent desktop L2 evolution bridge delegates pending/status/confirm operations to CLI JSON commands. Those read pending evolved skills from the effective workspace skills directory, preferring `skills/` and falling back to `.skills/` only for legacy workspaces. The evolution run command still writes generated pending skills under `.skills/`, creating a split-brain path when `skills/` exists. + +## Objective + +Ensure evolution-generated pending skills are written to the same effective skills root that desktop pending/status/confirm operations read. + +## Functional Requirements + +- FR-1: `skilllite evolution run --workspace ` must resolve its skills root with the shared `skills/` plus legacy fallback policy. +- FR-2: `.skills`-only workspaces must remain compatible. +- FR-3: Regression tests must prove both root-selection cases. + +## Non-Functional Requirements + +- Security: No new path traversal or permission bypass behavior. +- Performance: No measurable impact; root resolution is local path checking only. +- Compatibility: Preserve `.skills` fallback for existing legacy projects. + +## Constraints + +- Technical: Keep the fix in command-layer Rust code and reuse existing lower-layer discovery helpers. +- Timeline: N/A for autonomous execution. + +## Success Metrics + +- Metric: Root selected by `evolution run` matches desktop pending/status root. +- Baseline: Workspaces with `skills/` present write pending skills under `.skills`. +- Target: Workspaces with `skills/` present write pending skills under `skills`, while `.skills`-only workspaces still use `.skills`. + +## Rollout + +- Rollout plan: Ship as a narrow bug fix with command-level regression tests. +- Rollback plan: Revert the command helper change and tests if unexpected compatibility issues appear. diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md b/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md new file mode 100644 index 00000000..e5fd29ef --- /dev/null +++ b/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md @@ -0,0 +1,29 @@ +# Review Report + +## Scope Reviewed + +- Files/modules: +- Commits/changes: + +## Findings + +- Critical: +- Major: +- Minor: + +## Quality Gates + +- Architecture boundary checks: `pass | fail` +- Security invariants: `pass | fail` +- Required tests executed: `pass | fail` +- Docs sync (EN/ZH): `pass | fail` + +## Test Evidence + +- Commands run: +- Key outputs: + +## Decision + +- Merge readiness: `ready | not ready` +- Follow-up actions: diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md b/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md new file mode 100644 index 00000000..aa15526c --- /dev/null +++ b/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md @@ -0,0 +1,17 @@ +# Status Journal + +## Timeline + +- 2026-06-17: + - Progress: Confirmed a concrete path split where `evolution run` writes pending skills under `.skills` while desktop pending/status/confirm read the effective `skills` root. + - Blockers: None. + - Next step: Apply the minimal command-layer root-resolution fix and add focused regressions. + +## Checkpoints + +- [x] PRD drafted before implementation (or `N/A` recorded) +- [x] Context drafted before implementation (or `N/A` recorded) +- [ ] Implementation complete +- [ ] Tests passed +- [ ] Review complete +- [ ] Board updated diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md b/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md new file mode 100644 index 00000000..d8972827 --- /dev/null +++ b/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md @@ -0,0 +1,73 @@ +# TASK Card + +## Metadata + +- Task ID: `TASK-2026-069` +- Title: Evolution run skills-root alignment +- Status: `in_progress` +- Priority: `P0` +- Owner: `agent` +- Contributors: +- Created: `2026-06-17` +- Target milestone: + +## Problem + +Recent L2 evolution bridge work made desktop pending/status/confirm paths resolve the effective workspace skills directory as `skills/` with legacy fallback to `.skills/`. The synchronous `skilllite evolution run` path still hardcodes `workspace/.skills`. In a workspace where `skills/` exists, evolution can generate pending skills under `.skills/_evolved/_pending` while desktop UI reads `skills/_evolved/_pending`, making generated skills invisible and unconfirmable. + +## Scope + +- In scope: + - Align `skilllite evolution run` skills-root resolution with desktop pending/status/confirm paths. + - Add focused regression coverage proving workspaces with `skills/` present use `skills/_evolved`. + - Keep the legacy `.skills` fallback when `skills/` is absent. +- Out of scope: + - Broad evolution run architecture changes. + - Changing pending skill file formats or evolution DB schema. + - Reworking assistant background process API key handling. + +## Acceptance Criteria + +- [ ] `evolution run` resolves the same effective skills root as pending/status/confirm for explicit workspaces. +- [ ] Regression tests cover `skills/` preference and `.skills` legacy fallback. +- [ ] Required Rust and task validation commands pass. + +## Risks + +- Risk: Changing the evolution run write root could surprise legacy workspaces. + - Impact: Existing `.skills`-only workspaces must keep working. + - Mitigation: Use the existing `resolve_skills_dir_with_legacy_fallback` helper so `.skills` remains selected only when `skills/` is absent. +- Risk: Over-widening path semantics. + - Impact: Could change unrelated skill discovery behavior. + - Mitigation: Limit the fix to the command-layer skills root used by `evolution run`. + +## Validation Plan + +- Required tests: + - Unit regression tests in `skilllite-commands`. + - CLI/commands behavior tests required by policy. +- Commands to run: + - `cargo fmt --check` + - `cargo clippy --all-targets -- -D warnings` + - `cargo test -p skilllite-commands --features agent` + - `cargo test -p skilllite` + - `cargo test` + - `python3 scripts/validate_tasks.py` +- Manual checks: + - Inspect the changed files after edits. + +## Regression Scope + +- Areas likely affected: + - `skilllite evolution run` + - Desktop evolution manual trigger and post-authorize background run + - Pending evolved skill visibility and confirmation +- Explicit non-goals: + - DB workspace default semantics when `--workspace` is omitted. + - Tauri UI copy or frontend state management. + +## Links + +- Source TODO section: daily critical bug-finding automation, 2026-06-17. +- Related PRs/issues: +- Related docs: `docs/en/ASSISTANT-SPLIT-ARCHITECTURE.md`, `docs/zh/ASSISTANT-SPLIT-ARCHITECTURE.md` diff --git a/tasks/board.md b/tasks/board.md index df732725..d6595de1 100644 --- a/tasks/board.md +++ b/tasks/board.md @@ -1,10 +1,10 @@ # Task Board -Last updated: 2026-06-10 (TASK-2026-068 evolution workspace db scope done) +Last updated: 2026-06-17 (TASK-2026-069 evolution run skills-root alignment in progress) ## In Progress -- None. +- `TASK-2026-069-evolution-run-skills-root` - Status: `in_progress` - Owner: `agent` ## Ready From 17762e18f5668b54eac6cca07605c80ccc1cc0e2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 17 Jun 2026 11:10:18 +0000 Subject: [PATCH 2/2] docs(task): finalize evolution skills root task Co-authored-by: EXboy --- .../CONTEXT.md | 4 +- .../REVIEW.md | 42 +++++++++++++++---- .../STATUS.md | 14 ++++--- .../TASK.md | 8 ++-- tasks/board.md | 5 ++- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md b/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md index 03859a34..2cec5573 100644 --- a/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md +++ b/tasks/TASK-2026-069-evolution-run-skills-root/CONTEXT.md @@ -10,8 +10,8 @@ - Current behavior: - `evolution_desktop::resolve_skills_root` uses `resolve_skills_dir_with_legacy_fallback(&root, "skills")`. - `evolution_status` counts pending skills from the same effective skills root. - - `evolution::cmd_run` uses a private helper that returns `workspace/.skills`. - - When `skills/` exists, generated pending skills can be written to a path the desktop UI does not inspect. + - `evolution::cmd_run` now uses the same `skills/` default with `.skills/` legacy fallback policy. + - When `skills/` exists, generated pending skills and desktop pending/status/confirm operations target the same root. ## Architecture Fit diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md b/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md index e5fd29ef..727c6276 100644 --- a/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md +++ b/tasks/TASK-2026-069-evolution-run-skills-root/REVIEW.md @@ -3,27 +3,53 @@ ## Scope Reviewed - Files/modules: + - `crates/skilllite-commands/src/evolution.rs` + - `crates/skilllite-agent/src/skills/mod.rs` + - `crates/skilllite-evolution/src/run.rs` + - `crates/skilllite-evolution/src/skill_synth/mod.rs` + - `crates/skilllite-assistant/src/i18n/messages/en.ts` + - `crates/skilllite-assistant/src/i18n/messages/zh.ts` + - `tasks/TASK-2026-069-evolution-run-skills-root/*` + - `tasks/board.md` - Commits/changes: + - Aligned `evolution run` skills-root resolution with the shared `skills/` plus legacy `.skills` fallback policy. + - Added focused unit regressions for default `skills/` preference and `.skills` fallback. + - Updated user-facing pending-empty messages and stale internal comments. ## Findings -- Critical: -- Major: -- Minor: +- Critical: pre-fix path split made generated pending skills invisible/unconfirmable when a workspace had `skills/`. +- Major: fixed by reusing the shared root-resolution helper in `evolution run`. +- Minor: residual background authorize `--workspace` omission remains a separate follow-up risk outside this fix. ## Quality Gates -- Architecture boundary checks: `pass | fail` -- Security invariants: `pass | fail` -- Required tests executed: `pass | fail` -- Docs sync (EN/ZH): `pass | fail` +- Architecture boundary checks: `pass` +- Security invariants: `pass` +- Required tests executed: `pass` +- Docs sync (EN/ZH): `pass` ## Test Evidence - Commands run: + - `cargo fmt --check` + - `cargo test -p skilllite-commands --features agent resolve_skills_root` + - `cargo test -p skilllite-commands --features agent` + - `cargo test -p skilllite` + - `cargo clippy --all-targets -- -D warnings` + - `cargo test` + - `python3 scripts/validate_tasks.py` - Key outputs: + - Initial focused test attempt failed before running because Cargo 1.83 did not support edition 2024 dependency metadata; `rustup update stable && rustup default stable` updated to Rust/Cargo 1.96. + - Focused regressions: `2 passed; 0 failed`. + - `cargo test -p skilllite-commands --features agent`: `41 passed; 0 failed`. + - `cargo test -p skilllite`: integration/unit tests passed, including `20` skill management tests and `2` E2E minimal tests. + - `cargo clippy --all-targets -- -D warnings`: finished successfully. + - `cargo test`: full workspace passed; final suites included `skilllite-sandbox` `94 passed` and all doc-tests completed without failures. + - `python3 scripts/validate_tasks.py`: `Task validation passed (69 task directories checked).` ## Decision -- Merge readiness: `ready | not ready` +- Merge readiness: `ready` - Follow-up actions: + - Consider a separate task for assistant authorize background run workspace argument and UI-only API key propagation. diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md b/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md index aa15526c..ce1347dd 100644 --- a/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md +++ b/tasks/TASK-2026-069-evolution-run-skills-root/STATUS.md @@ -5,13 +5,17 @@ - 2026-06-17: - Progress: Confirmed a concrete path split where `evolution run` writes pending skills under `.skills` while desktop pending/status/confirm read the effective `skills` root. - Blockers: None. - - Next step: Apply the minimal command-layer root-resolution fix and add focused regressions. + - Next step: Done; fix, tests, review, and board update completed. +- 2026-06-17: + - Progress: Updated `evolution run` skills-root resolution to use the shared `skills/` default with `.skills/` fallback policy; added focused unit regressions and synced user-facing pending-empty messages. + - Blockers: None. + - Next step: None. ## Checkpoints - [x] PRD drafted before implementation (or `N/A` recorded) - [x] Context drafted before implementation (or `N/A` recorded) -- [ ] Implementation complete -- [ ] Tests passed -- [ ] Review complete -- [ ] Board updated +- [x] Implementation complete +- [x] Tests passed +- [x] Review complete +- [x] Board updated diff --git a/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md b/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md index d8972827..141be9c4 100644 --- a/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md +++ b/tasks/TASK-2026-069-evolution-run-skills-root/TASK.md @@ -4,7 +4,7 @@ - Task ID: `TASK-2026-069` - Title: Evolution run skills-root alignment -- Status: `in_progress` +- Status: `done` - Priority: `P0` - Owner: `agent` - Contributors: @@ -28,9 +28,9 @@ Recent L2 evolution bridge work made desktop pending/status/confirm paths resolv ## Acceptance Criteria -- [ ] `evolution run` resolves the same effective skills root as pending/status/confirm for explicit workspaces. -- [ ] Regression tests cover `skills/` preference and `.skills` legacy fallback. -- [ ] Required Rust and task validation commands pass. +- [x] `evolution run` resolves the same effective skills root as pending/status/confirm for explicit workspaces. +- [x] Regression tests cover `skills/` preference and `.skills` legacy fallback. +- [x] Required Rust and task validation commands pass. ## Risks diff --git a/tasks/board.md b/tasks/board.md index d6595de1..792755f4 100644 --- a/tasks/board.md +++ b/tasks/board.md @@ -1,10 +1,10 @@ # Task Board -Last updated: 2026-06-17 (TASK-2026-069 evolution run skills-root alignment in progress) +Last updated: 2026-06-17 (TASK-2026-069 evolution run skills-root alignment done) ## In Progress -- `TASK-2026-069-evolution-run-skills-root` - Status: `in_progress` - Owner: `agent` +- None. ## Ready @@ -17,6 +17,7 @@ Last updated: 2026-06-17 (TASK-2026-069 evolution run skills-root alignment in p ## Done +- `TASK-2026-069-evolution-run-skills-root` - Status: `done` - Owner: `agent` - `TASK-2026-068-evolution-workspace-db-scope` - Status: `done` - Owner: `agent` - `TASK-2026-067-utf8-llm-error-truncate` - Status: `done` - Owner: `agent` - `TASK-2026-066-utf8-evolution-log-truncate` - Status: `done` - Owner: `agent`