assistant-claw/skills/claw-project-tracker/SKILL.md
Atlas refactor bd0be97630 Refactor: drop Vega framing, promote Atlas to repo root
This repo IS Atlas (总助 Claw / 老板视角项目执行雷达). The earlier
two-profile framing (Atlas + Vega placeholder) was a misread — Vega is
the agent persona answering Multica issues, not the product. Vega has
no relationship to assistant-claw the product.

Changes:
- Move atlas/* to top-level (git mv preserves history)
- Remove empty Vega placeholders prompts/.gitkeep, tools/.gitkeep
- Delete atlas/ wrapper directory (now empty)
- Update path references in INTEGRATION-hermes.md, scripts/mirror-...sh,
  docs/decisions/0001-mirror-nuwa-skill.md
- Rewrite README.md as Atlas-only, remove dual-profile language

After this commit:
- Top-level OpenClaw 8 files (IDENTITY/SOUL/USER/AGENTS/TOOLS/MEMORY/
  BOOTSTRAP/HEARTBEAT + CLAUDE symlink + zh-CN mirrors)
- skills/{6 sub-skills + DESCRIPTION + README}
- mcp-tools/{spec + Python implementation}
- state-schemas/{project, person, customer + README}
- autopilots/{5 atlas-*.yaml}
- client-deck/, docs/decisions/, scripts/

The ~/.hermes/skills/atlas/ destination convention preserved (atlas as
a skill namespace on the operator's machine, distinct from source path).
2026-05-09 17:54:18 +08:00

107 lines
3.9 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.

---
name: claw-project-tracker
description: Cluster threads into project entities, apply GTD/RACI logic, judge project state (Active/Stalled/Completed/Someday/Dropped) with rule citations.
version: 0.1.0
author: Moments / Atlas team
license: MIT
metadata:
hermes:
category: atlas
tags: [project-management, gtd, raci, atlas, boss-perspective]
related_skills: [claw-email-parser, claw-people-observer, claw-customer-radar, claw-report-writer]
---
# claw-project-tracker
## Purpose
The middle of Atlas's pipeline. Reads canonical Email JSON, groups threads into projects, maintains the `state/projects/` cards, and applies the boss's `boss_skill.md` rules to judge state.
## Inputs
- All Email JSON in `state/extracted/` newer than `state/projects/.last_processed`
- Current `state/projects/*.json`
- `boss_skill.md` (decision heuristics layer)
## Outputs
- Updated `state/projects/PRJ-*.json` (see schema in `../../state-schemas/project.md`)
- New `state/projects/PRJ-*.json` for newly-detected projects
- `state/unclustered/<thread_id>.json` for threads that won't cluster
- Audit row per state transition into `state/audit/project_transitions.csv`
## Project Detection
A "project" emerges from a cluster of threads sharing:
1. Stable subject keyword (after normalization)
2. Stable participant set (≥ 2 of the original participants persist across threads)
3. Time continuity (gap < 60 days)
4. Optional: explicit project tag from boss (`#PRJ-XXX` in subject or first message)
Atlas seeds project IDs as `PRJ-YYYY-NNN-<short-name>`. The short-name is derived from the most-common project keyword.
## State Judgment Rules (default; boss can override via `boss_skill.md`)
```
Active := waiting_for.days_overdue ≤ R("stall_threshold_days", default 5)
AND last_action exists
AND not Completed
Stalled := waiting_for.days_overdue > stall_threshold_days
AND no Completed signal
Completed := terminal_keyword_seen("验收|结案|关闭|completed|signed off")
OR boss_explicit_complete = true
Someday := boss_replied_with("先放放|稍后|after Q|不急")
AND days_since_last_action > 30
Dropped := days_since_any_signal > R("drop_threshold_days", default 60)
AND state was Stalled or Someday
```
Every transition writes to `state/audit/project_transitions.csv` with: timestamp, project_id, from_state, to_state, rule_refs, source_email_ids.
## RACI Inference
- **Responsible** = most frequent internal sender + receiver in thread
- **Accountable** = boss-tagged or boss-cc'd internal person who owns delivery
- **Consulted** = internal cc'd 30% of messages
- **Informed** = boss (always) + anyone cc'd < 30%
Missing Accountable for an Active or Stalled project = automatic `R-RACI-A-missing` flag, surface in Brief.
## Failure Modes
| Failure | Behavior |
|---------|---------|
| Thread refuses to cluster | Move to `state/unclustered/`, surface in Brief weekly |
| Project ID collision | Append `-2`, log warning |
| Boss explicitly merges projects via override | Atomic merge, archive both originals to `state/projects/.merged/` |
## Sample Output
```json
{
"id": "PRJ-2025-001-客户A官网改版",
"name": "客户A 官网改版",
"客户方": "CUST-clientco",
"raci": {
"responsible": ["张三"],
"accountable": "李四",
"consulted": ["设计部"],
"informed": ["Boss"]
},
"gtd": {
"next_action": "等张三发出修改稿 v3",
"waiting_for": {"who": "张三", "since": "2026-04-28", "days_overdue": 11},
"状态": "Stalled"
},
"落地率判定": {
"结论": "Stalled",
"依据": ["GTD-WF: 11 天无回复(阈值 5", "R-37: 客户主动催办 2 次"],
"置信度": 0.82,
"source_email_ids": ["msg-abc", "msg-def"]
},
"时间线": [...],
"金额": 120000,
"下一步建议": "Boss 亲自 ping 张三 + cc 李四,表明 deadline"
}
```