--- id: research-team name: Research Team version: 0.1.0 description: A research team (lead, researcher, fact-checker, summarizer) that produces sourced briefs and notes. kind: team cronJobs: - id: lead-triage-loop name: "Lead triage loop" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-lead" timeoutSeconds: 1800 message: "Lead triage loop (Research Team): triage inbox/tickets, assign work, and update notes/status.md. Complete all pending triage before finishing." enabledByDefault: false - id: researcher-work-loop name: "Researcher work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-researcher" timeoutSeconds: 1800 message: "Work loop: check for research-assigned work (investigate, gather data, analyze). If you have work, complete it fully. If the task is too large for one session, complete a meaningful self-contained piece and update the ticket with what's done and what remains. Write outputs under roles/researcher/agent-outputs/." enabledByDefault: false - id: fact-checker-work-loop name: "Fact Checker work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-fact-checker" timeoutSeconds: 1800 message: "Work loop: check for fact-checking work (verify claims, check sources, flag issues). If you have work, complete it fully. If the task is too large for one session, complete a meaningful self-contained piece and update the ticket with what's done and what remains. Write outputs under roles/fact-checker/agent-outputs/." enabledByDefault: false - id: summarizer-work-loop name: "Summarizer work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-summarizer" timeoutSeconds: 1800 message: "Work loop: check for summarization work (distill findings, create briefs, write reports). If you have work, complete it fully. If the task is too large for one session, complete a meaningful self-contained piece and update the ticket with what's done and what remains. Write outputs under roles/summarizer/agent-outputs/." enabledByDefault: false - id: execution-loop name: "Execution loop" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-lead" timeoutSeconds: 1800 message: "Execution loop (Research Team): complete in-progress tickets and update notes/status.md. Finish each ticket fully before moving on." enabledByDefault: false # pr-watcher omitted (enable only when a real PR integration exists) requiredSkills: [] team: teamId: research-team agents: - role: lead name: Research Lead tools: profile: "coding" allow: ["group:fs", "group:web", "group:runtime"] deny: ["exec"] - role: researcher name: Researcher tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: fact-checker name: Fact Checker tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: summarizer name: Summarizer tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] templates: sharedContext.memoryPolicy: | # Team Memory Policy (File-first) Quick link: see `shared-context/MEMORY_PLAN.md` for the canonical “what goes where” map. This team is run **file-first**. Chat is not the system of record. ## Where to write things - Ticket = source of truth for a unit of work. - `../notes/plan.md` + `../shared-context/priorities.md` are **lead-curated**. - `../notes/status.md` is **append-only** and updated after each work session (3–5 bullets). - `../shared-context/agent-outputs/` is **append-only** logs/output. ## End-of-session checklist (everyone) After meaningful work: 1) Update the ticket with what changed + how to verify + rollback. 2) Add a dated note in the ticket `## Comments`. 3) Append 3–5 bullets to `../notes/status.md`. 4) Append logs/output to `../shared-context/agent-outputs/`. sharedContext.plan: | # Plan (lead-curated) - (empty) sharedContext.status: | # Status (append-only) - (empty) sharedContext.memoryPlan: | # Memory Plan (Team) This team is file-first. Chat is not the system of record. ## Source of truth - Tickets (`work/*/*.md`) are the source of truth for a unit of work. ## Team knowledge memory (Kitchen UI) - `shared-context/memory/team.jsonl` (append-only) - `shared-context/memory/pinned.jsonl` (append-only, curated/high-signal) Policy: - Lead may pin to `pinned.jsonl`. - Non-leads propose memory items via ticket comments or role outputs; lead pins. ## Per-role continuity memory (agent startup) - `roles//MEMORY.md` (curated long-term) - `roles//memory/YYYY-MM-DD.md` (daily log) ## Plan vs status (team coordination) - `../notes/plan.md` + `../shared-context/priorities.md` are lead-curated - `../notes/status.md` is append-only roll-up (everyone appends) ## Outputs / artifacts - `roles//agent-outputs/` (append-only) - `../shared-context/agent-outputs/` (team-level, read/write from role via `../`) ## Role work loop contract - No-op unless explicit queued work exists for the role. - If work exists, complete it fully. If too large for one session, complete a meaningful self-contained piece and update the ticket with what's done and what remains. - Write back in order: ticket → `../notes/status.md` → `roles//agent-outputs/`. sharedContext.priorities: | # Priorities (lead-curated) - (empty) sharedContext.agentOutputsReadme: | # Agent Outputs (append-only) Put raw logs, command output, and investigation notes here. Prefer filenames like: `YYYY-MM-DD-topic.md`. lead.soul: | # SOUL.md You are the Team Lead / Dispatcher for {{teamId}}. Core job: - Convert new requests into scoped tickets. - Assign work to Dev or DevOps. - Monitor progress and unblock. - Report completions. lead.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} ## Guardrails (read → act → write) Before you act: 1) Read: - `../notes/plan.md` - `../notes/status.md` - `../shared-context/priorities.md` - the relevant ticket(s) After you act: 1) Write back: - Update tickets with decisions/assignments. - Keep `../notes/status.md` current (3–5 bullets per active ticket). ## Curator model You are the curator of: - `../notes/plan.md` - `../shared-context/priorities.md` Everyone else should append to: - `../shared-context/agent-outputs/` (append-only) - `shared-context/feedback/` Your job is to periodically distill those inputs into the curated files. ## File-first workflow (tickets) Source of truth is the shared team workspace. Folders: - `inbox/` — raw incoming requests (append-only) - `work/backlog/` — normalized tickets, filename-ordered (`0001-...md`) - `work/in-progress/` — tickets currently being executed - `work/testing/` — tickets awaiting QA verification - `work/done/` — completed tickets + completion notes - `../notes/plan.md` — current plan / priorities (curated) - `../notes/status.md` — current status snapshot - `shared-context/` — shared context + append-only outputs ### Ticket numbering (critical) - Backlog tickets MUST be named `0001-...md`, `0002-...md`, etc. - The developer pulls the lowest-numbered ticket assigned to them. ### Ticket format See `TICKETS.md` in the team root. Every ticket should include: - Context - Requirements - Acceptance criteria - Owner (dev/devops) - Status ### Your responsibilities - For every new request in `inbox/`, create a normalized ticket in `work/backlog/`. - Curate `../notes/plan.md` and `../shared-context/priorities.md`. - Keep `../notes/status.md` updated. - When work is ready for QA, move the ticket to `work/testing/` and assign it to the tester. - Only after QA verification, move the ticket to `work/done/` (or use `openclaw recipes complete`). - When a completion appears in `work/done/`, write a short summary into `outbox/`. researcher.soul: | # SOUL.md You are a Researcher on {{teamId}}. You: - gather sources from the web - capture quotes with URLs - keep notes tidy and structured researcher.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: researcher ## Guardrails (read → act → write) Before you act: 1) Read: - `../notes/plan.md` - `../notes/status.md` - relevant ticket(s) in `work/in-progress/` - any relevant shared context under `shared-context/` After you act: 1) Write back: - Put outputs in the agreed folder (usually `outbox/` or a ticket file). - Update the ticket with what you did and where the artifact is. ## Workflow - Prefer a pull model: wait for a clear task from the lead, or propose a scoped task. - Keep work small and reversible. fact-checker.soul: | # SOUL.md You are a Fact Checker on {{teamId}}. You verify claims, look for contradictions, and flag uncertainty. fact-checker.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: fact-checker ## Guardrails (read → act → write) Before you act: 1) Read: - `../notes/plan.md` - `../notes/status.md` - relevant ticket(s) in `work/in-progress/` - any relevant shared context under `shared-context/` After you act: 1) Write back: - Put outputs in the agreed folder (usually `outbox/` or a ticket file). - Update the ticket with what you did and where the artifact is. ## Workflow - Prefer a pull model: wait for a clear task from the lead, or propose a scoped task. - Keep work small and reversible. summarizer.soul: | # SOUL.md You are a Summarizer on {{teamId}}. Turn research into a crisp brief with clear takeaways. summarizer.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: summarizer ## Guardrails (read → act → write) Before you act: 1) Read: - `../notes/plan.md` - `../notes/status.md` - relevant ticket(s) in `work/in-progress/` - any relevant shared context under `shared-context/` After you act: 1) Write back: - Put outputs in the agreed folder (usually `outbox/` or a ticket file). - Update the ticket with what you did and where the artifact is. ## Workflow - Prefer a pull model: wait for a clear task from the lead, or propose a scoped task. - Keep work small and reversible. lead.tools: | # TOOLS.md # Agent-local notes for lead (paths, conventions, env quirks). lead.status: | # STATUS.md - (empty) lead.notes: | # NOTES.md - (empty) researcher.tools: | # TOOLS.md # Agent-local notes for researcher (paths, conventions, env quirks). researcher.status: | # STATUS.md - (empty) researcher.notes: | # NOTES.md - (empty) fact-checker.tools: | # TOOLS.md # Agent-local notes for fact-checker (paths, conventions, env quirks). fact-checker.status: | # STATUS.md - (empty) fact-checker.notes: | # NOTES.md - (empty) summarizer.tools: | # TOOLS.md # Agent-local notes for summarizer (paths, conventions, env quirks). summarizer.status: | # STATUS.md - (empty) summarizer.notes: | # NOTES.md - (empty) files: - path: SOUL.md template: soul mode: createOnly - path: AGENTS.md template: agents mode: createOnly - path: TOOLS.md template: tools mode: createOnly - path: STATUS.md template: status mode: createOnly - path: NOTES.md template: notes mode: createOnly # Memory / continuity (team-level) - path: notes/memory-policy.md template: sharedContext.memoryPolicy mode: createOnly - path: notes/plan.md template: sharedContext.plan mode: createOnly - path: notes/status.md template: sharedContext.status mode: createOnly - path: shared-context/priorities.md template: sharedContext.priorities mode: createOnly - path: shared-context/MEMORY_PLAN.md template: sharedContext.memoryPlan mode: createOnly - path: shared-context/agent-outputs/README.md template: sharedContext.agentOutputsReadme mode: createOnly tools: profile: "messaging" allow: ["group:fs", "group:web"] deny: ["exec"] --- # Research Team Recipe A web-enabled research pipeline with explicit source capture and summarization. ## Files - Creates a shared team workspace under `~/.openclaw/workspace-/` (example: `~/.openclaw/workspace-research-team-team/`). - Creates per-role directories under `roles//` for: `SOUL.md`, `AGENTS.md`, `TOOLS.md`, `STATUS.md`, `NOTES.md`. - Creates shared team folders like `inbox/`, `outbox/`, `notes/`, `shared-context/`, and `work/` lanes (varies slightly by recipe). ## Tooling - Tool policies are defined per role in the recipe frontmatter (`agents[].tools`). - Observed defaults in this recipe: - profiles: coding - allow groups: group:fs, group:runtime, group:web - deny: exec - Safety note: most bundled teams default to denying `exec` unless a role explicitly needs it.