🦞 ClawRecipes

Marketplace

Product Team

A product delivery team (pm, designer, engineer, qa) that turns ideas into shipped features.

Team Recipev0.1.0teamproduct

Install / Scaffold

Copy-paste the command below in a terminal where OpenClaw is installed.

$ openclaw recipes scaffold-team product-team -t my-product-team --apply-config

Source

This is the recipe’s Markdown source.

---
id: product-team
name: Product Team
version: 0.1.0
description: A product delivery team (pm, designer, engineer, qa) that turns ideas into shipped features.
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 (Product Team): triage inbox/tickets, assign work, and update notes/status.md. Complete all pending triage before finishing."
    enabledByDefault: false

  - id: pm-work-loop
    name: "Product Manager work loop (safe-idle)"
    schedule: "*/30 7-23 * * 1-5"
    timezone: "America/New_York"
    agentId: "{{teamId}}-pm"
    timeoutSeconds: 1800
    message: "Work loop: check for product-management work (specs, user stories, requirements). 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/pm/agent-outputs/."
    enabledByDefault: false
  - id: designer-work-loop
    name: "Designer work loop (safe-idle)"
    schedule: "*/30 7-23 * * 1-5"
    timezone: "America/New_York"
    agentId: "{{teamId}}-designer"
    timeoutSeconds: 1800
    message: "Work loop: check for design-assigned work (mockups, prototypes, design reviews). 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/designer/agent-outputs/."
    enabledByDefault: false
  - id: engineer-work-loop
    name: "Engineer work loop (safe-idle)"
    schedule: "*/30 7-23 * * 1-5"
    timezone: "America/New_York"
    agentId: "{{teamId}}-engineer"
    timeoutSeconds: 1800
    message: "Work loop: check for engineering-assigned tickets. 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/engineer/agent-outputs/."
    enabledByDefault: false
  - id: test-work-loop
    name: "Test/QA work loop (safe-idle)"
    schedule: "*/30 7-23 * * 1-5"
    timezone: "America/New_York"
    agentId: "{{teamId}}-test"
    timeoutSeconds: 1800
    message: "Work loop: check for testing-assigned tickets (QA, verification, bug 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/test/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 (Product 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: product-team
agents:
  - role: lead
    name: Product Lead
    tools:
      profile: "coding"
      allow: ["group:fs", "group:web", "group:runtime"]
      deny: ["exec"]
  - role: pm
    name: Product Manager
    tools:
      profile: "coding"
      allow: ["group:fs", "group:web"]
      deny: ["exec"]
  - role: designer
    name: Product Designer
    tools:
      profile: "coding"
      allow: ["group:fs", "group:web"]
      deny: ["exec"]
  - role: engineer
    name: Product Engineer
    tools:
      profile: "coding"
      allow: ["group:fs", "group:web", "group:runtime"]
      deny: []
  - role: test
    name: QA / Tester
    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/<role>/MEMORY.md` (curated long-term)
    - `roles/<role>/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/<role>/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/<role>/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/`.
  pm.soul: |
    # SOUL.md

    You are a Product Manager on {{teamId}}.

    You write PRDs with clear scope and measurable acceptance criteria.

  pm.agents: |
    # AGENTS.md

    Team: {{teamId}}
    Shared workspace: {{teamDir}}
    Role: pm

    ## 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.
  designer.soul: |
    # SOUL.md

    You are a Product Designer on {{teamId}}.

    You focus on UX flows, UI copy, and edge cases.

  designer.agents: |
    # AGENTS.md

    Team: {{teamId}}
    Shared workspace: {{teamDir}}
    Role: designer

    ## 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.
  engineer.soul: |
    # SOUL.md

    You are a Product Engineer on {{teamId}}.

    You ship maintainable code in small, testable increments.

  engineer.agents: |
    # AGENTS.md

    Team: {{teamId}}
    Shared workspace: {{teamDir}}
    Role: engineer

    ## 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.
  test.soul: |
    # SOUL.md

    You are QA / Testing on {{teamId}}.

    You verify acceptance criteria, catch edge cases, and document verification results.

  test.agents: |
    # AGENTS.md

    Team: {{teamId}}
    Shared workspace: {{teamDir}}
    Role: test

    ## 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)

  pm.tools: |
    # TOOLS.md

    # Agent-local notes for pm (paths, conventions, env quirks).

  pm.status: |
    # STATUS.md

    - (empty)

  pm.notes: |
    # NOTES.md

    - (empty)

  designer.tools: |
    # TOOLS.md

    # Agent-local notes for designer (paths, conventions, env quirks).

  designer.status: |
    # STATUS.md

    - (empty)

  designer.notes: |
    # NOTES.md

    - (empty)

  engineer.tools: |
    # TOOLS.md

    # Agent-local notes for engineer (paths, conventions, env quirks).

  engineer.status: |
    # STATUS.md

    - (empty)

  engineer.notes: |
    # NOTES.md

    - (empty)

  test.tools: |
    # TOOLS.md

    # Agent-local notes for test (paths, conventions, env quirks).

  test.status: |
    # STATUS.md

    - (empty)

  test.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"]
---
# Product Team Recipe

A file-first product delivery workflow: PRD → design → build → QA.

## Files
- Creates a shared team workspace under `~/.openclaw/workspace-<teamId>/` (example: `~/.openclaw/workspace-product-team-team/`).
- Creates per-role directories under `roles/<role>/` 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.