assistant-claw/atlas/skills/claw-project-tracker/SKILL.md
Vega (Atlas scaffolding) ce9f27320a Add Atlas profile under atlas/ — boss-perspective project execution radar
This adds the full Atlas (总助 Claw / 老板视角项目执行雷达) scaffolding as a
sibling profile to the existing Vega general-purpose assistant. All Atlas content
lives under atlas/ to keep the existing top-level skeleton intact.

What's included:

- atlas/IDENTITY.md, SOUL.md, USER.md, AGENTS.md, MEMORY.md, BOOTSTRAP.md,
  HEARTBEAT.md, TOOLS.md (+ zh-CN mirrors) — full OpenClaw 8-piece set
  matching the zero-cca convention
- atlas/skills/ — 6 sub-skills with frontmatter:
  claw-email-parser / claw-project-tracker / claw-people-observer /
  claw-customer-radar / claw-boss-distiller / claw-report-writer
- atlas/skills/claw-boss-distiller/ — adapter notes for nuwa-skill, 5-layer
  boss_skill seed template (23 rules across Expression DNA / Mental Models /
  Decision Heuristics / Anti-Patterns / Honest Boundaries), and a complete
  synthetic distillation demo (10 input emails -> validated 5-layer output)
- atlas/mcp-tools/email-extractor/ — Python implementation of stages 1-3
  (fetch + decode + dequote), 7 pytest tests passing, CLI: atlas-extract
- atlas/state-schemas/ — formal JSON schemas for project / person / customer
  cards with the no-employee-rating hard constraint baked in
- atlas/client-deck/ — 2-page client-facing pitch document
- autopilots/atlas-*.yaml — 5 autopilot configs (daily / weekly / monthly /
  quarterly + andon event-triggered) for a future Multica-side scheduler

Notes:

- nuwa-skill (MIT, https://github.com/alchaincyf/nuwa-skill) NOT vendored;
  fetch at deploy time via instructions in
  atlas/skills/claw-boss-distiller/upstream/README.md
- Vega-side prompts/skills/tools/autopilots/docs scaffold left untouched
- Top-level README.md updated with a brief Atlas pointer; rest preserved
2026-05-09 17:00:29 +08:00

99 lines
3.6 KiB
Markdown
Raw Permalink 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.
---
# 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"
}
```