--- id: business-team name: Business Team version: 0.1.0 description: A small generalist business team (ops, sales, marketing, finance, analyst) that runs execution through a shared workspace. 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 (Business Team): triage inbox/tickets, assign work, and update notes/status.md. Complete all pending triage before finishing." enabledByDefault: false - id: ops-work-loop name: "Operations work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-ops" timeoutSeconds: 1800 message: "Work loop: check for operations-assigned work. 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/ops/agent-outputs/." enabledByDefault: false - id: sales-work-loop name: "Sales work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-sales" timeoutSeconds: 1800 message: "Work loop: check for sales-assigned work. 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/sales/agent-outputs/." enabledByDefault: false - id: marketing-work-loop name: "Marketing work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-marketing" timeoutSeconds: 1800 message: "Work loop: check for marketing-assigned work. 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/marketing/agent-outputs/." enabledByDefault: false - id: finance-work-loop name: "Finance work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-finance" timeoutSeconds: 1800 message: "Work loop: check for finance-assigned work. 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/finance/agent-outputs/." enabledByDefault: false - id: analyst-work-loop name: "Analyst work loop (safe-idle)" schedule: "*/30 7-23 * * 1-5" timezone: "America/New_York" agentId: "{{teamId}}-analyst" timeoutSeconds: 1800 message: "Work loop: check for analytics-assigned work. 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/analyst/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 (Business Team): complete in-progress tickets and update notes/status.md. Finish each ticket fully before moving on." enabledByDefault: false requiredSkills: [] team: teamId: business-team agents: - role: lead name: Business Ops Lead tools: profile: "coding" allow: ["group:fs", "group:web", "group:runtime"] deny: ["exec"] - role: ops name: Operations Manager tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: sales name: Sales / Partnerships tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: marketing name: Marketing / Growth tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: finance name: Finance / Bookkeeping tools: profile: "coding" allow: ["group:fs", "group:web"] deny: ["exec"] - role: analyst name: Business Analyst 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.tools: | # TOOLS.md # Agent-local notes (paths, conventions, env quirks). tools: | # TOOLS.md # Agent-local notes (paths, conventions, env quirks). status: | # STATUS.md - (empty) notes: | # NOTES.md - (empty) 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/`. ops.soul: | # SOUL.md You are the Operations Manager on {{teamId}}. You create SOPs, checklists, and lightweight processes that remove friction. ops.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: ops ## 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. sales.soul: | # SOUL.md You are Sales / Partnerships on {{teamId}}. You write outreach, qualify leads, and draft partnership terms. sales.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: sales ## 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. marketing.soul: | # SOUL.md You are Marketing / Growth on {{teamId}}. You create crisp positioning, campaigns, and landing-page copy that converts. marketing.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: marketing ## 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. finance.soul: | # SOUL.md You are Finance / Bookkeeping on {{teamId}}. You build simple, defensible pricing and forecasts; you keep a paper trail. finance.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: finance ## 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. analyst.soul: | # SOUL.md You are the Business Analyst on {{teamId}}. You turn ambiguous questions into structured analysis with clear recommendations. analyst.agents: | # AGENTS.md Team: {{teamId}} Shared workspace: {{teamDir}} Role: analyst ## 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. ## Output locations - Research briefs → outbox/research/ - Metrics definitions/dashboards notes → shared-context/metrics/ # Auto-added blanks to ensure every role can scaffold every declared file. # --- role: lead --- lead.status: | # STATUS.md - (empty) lead.notes: | # NOTES.md - (empty) # --- role: ops --- ops.tools: | # TOOLS.md - (empty) ops.status: | # STATUS.md - (empty) ops.notes: | # NOTES.md - (empty) # --- role: sales --- sales.tools: | # TOOLS.md - (empty) sales.status: | # STATUS.md - (empty) sales.notes: | # NOTES.md - (empty) # --- role: marketing --- marketing.tools: | # TOOLS.md - (empty) marketing.status: | # STATUS.md - (empty) marketing.notes: | # NOTES.md - (empty) # --- role: finance --- finance.tools: | # TOOLS.md - (empty) finance.status: | # STATUS.md - (empty) finance.notes: | # NOTES.md - (empty) # --- role: analyst --- analyst.tools: | # TOOLS.md - (empty) analyst.status: | # STATUS.md - (empty) analyst.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"] --- # Business Team Recipe Bundled team recipe. ## Files - Creates a shared team workspace under `~/.openclaw/workspace-/` (example: `~/.openclaw/workspace-business-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.