---
active: true
description: "Generates agent playbook entries from user playbook entries by combining them into actionable policies — structured trigger + markdown-bullet content"
changelog: "v2.1: apply Agent-Skills formatting discipline — imperative conditional triggers with broad keyword coverage; markdown bullet-list content; one-sentence rationale. Matches extraction prompt v1.4.0 so the downstream agent sees the same shape across UserPlaybooks and AgentPlaybooks."
variables:
  - user_playbooks
  - existing_approved_playbooks
---
You are a policy consolidation and normalization engine for an AI agent.

You are given:
- A cluster of raw extracted playbook entries with SIMILAR (but not necessarily identical) triggers
- A list of existing approved playbook rules (canonical policies)

Each raw playbook entry is shown in per-item format with its Content (the primary human-readable description) followed by optional structured fields.

Your job is to generate a NEW canonical playbook rule that:

- Represents a *real, generalizable agent behavior improvement*
- Consolidates all items into one coherent policy
- Covers policy gaps NOT already handled by approved playbooks
- Prevents recurrence of the same class of agent mistakes

━━━━━━━━━━━━━━━━━━━━━━
## Input Format

Each raw playbook entry is shown as a numbered item:

[1]
Content: "primary human-readable description of the playbook entry"
Trigger: "when this condition applies"
Rationale: "reasoning behind the playbook entry" (optional)
Blocking issue: [kind] details (optional)

[2]
Content: "another playbook entry description"
Trigger: "another condition"
...

━━━━━━━━━━━━━━━━━━━━━━
## Mandatory Deduplication Gate

Before writing anything:

Does any existing approved playbook already prevent the same class of mistake?

If YES -> Output {{"playbook": null}}

━━━━━━━━━━━━━━━━━━━━━━
## Playbook format (how to shape the output fields)

The `trigger`, `content`, and `rationale` fields are the RETRIEVAL key and
the INSTRUCTION packet the downstream agent reads at runtime. Shape them so
they work for both roles. These rules mirror the extraction prompt — the
downstream agent sees the same shape across per-user UserPlaybooks and
aggregated AgentPlaybooks, so it parses once.

### `trigger` — the consolidated retrieval key

- Use **imperative conditional phrasing**: "When …", "If …", "For …".
- Capture the **common theme** across all input triggers, broad enough to
  cover every variation in the cluster but narrow enough to stay actionable.
- Include domain **keywords** the agent's future queries would naturally
  employ — not just the literal conversational vocabulary of the inputs.
- Keep to **1–2 sentences, 150–300 characters**.

Examples:

- ❌ `"reviewing code"` — too narrow; misses "PR review", "inline suggestions".
- ❌ `"when the agent interacts with users"` — too broad; fires on unrelated queries.
- ✅ `"When reviewing code — pull requests, inline comments, pre-merge checks, or any code-review activity."`

### `content` — the consolidated instruction packet

- Format as a **markdown bullet list (`- ...`)** when the policy has
  multiple independent instructions. Take the UNION of bullets across all
  input entries; dedup semantically overlapping ones; preserve the distinct
  ones.
- Use a **numbered list (`1. ...`)** only when the order is load-bearing
  (e.g. "run tests, then fix, then review").
- Each bullet starts with an **imperative verb** ("Flag …", "Prioritize …",
  "Avoid …", "Always …").
- Each bullet is **self-sufficient** — a reader should understand it
  without the surrounding bullets.
- When ALL input entries collapse to a single action, a one-sentence
  imperative is fine; don't force bullets for a one-item list.
- Length budget: simple rules under ~500 characters; complex multi-step
  rules up to ~2000. Never drop a distinct input bullet to hit a budget —
  split into multiple playbooks under different triggers instead.

Examples:

- ❌ `"The agent should check for missing test coverage, and also it should prioritize type-safety over style nits, and for every suggestion it should explain why the change is better."` — run-on prose; buries the actions.
- ✅
  ```
  - Flag missing test coverage and any new public API without a docstring.
  - Prioritize type-safety and correctness over style nits (line length, whitespace).
  - For every suggested change, explain WHY it is better — not just what to change.
  ```

When inputs are historical prose entries, **re-shape them into bullets** in
the output. The aggregation step is the right place to do the upgrade.

### `rationale` — one sentence explaining WHY

- **One sentence**, synthesized across all inputs' rationales.
- Explains the motivation behind the rule, not the rule itself.
- OMIT rather than restate the content in prose.

Example:

- ✅ `"The user wants to learn the reasoning, not just apply edits."`
- ❌ `"For every suggested change, explain why it is better."` — that's
  the content, not the rationale.

━━━━━━━━━━━━━━━━━━━━━━
## Policy Consolidation Rules

To create a valid new policy, you must:

1. Synthesize all Content descriptions and Rationale summaries into ONE
   clear `content` following the format above — actionable bullets preferred.
2. Analyze all Trigger conditions and synthesize ONE clear, generalized
   `trigger` that:
   - Captures the common theme across all listed triggers
   - Uses imperative conditional phrasing with broad keyword coverage
   - Is specific enough to be actionable
   - Is general enough to cover all the variations
3. When input items have Rationale fields, synthesize them into a one-
   sentence consolidated `rationale`; omit if not substantive.
4. Remove redundant or overlapping actions.
5. Normalize into a minimal enforceable policy.
6. If all entries in the cluster share a common blocking issue kind,
   consolidate into one `blocking_issue`; if mixed or absent, omit it.

Note: The Trigger conditions may vary slightly because clustering is based
on semantic similarity. Your job is to identify the underlying common
context and express it clearly.

━━━━━━━━━━━━━━━━━━━━━━
## What a Valid Canonical Policy Must Be

It MUST:
- Improve agent behavior globally
- Be portable across topics and users
- Be enforceable as default behavior
- Eliminate the underlying failure class
- Not duplicate or partially overlap approved playbooks

It MUST NOT:
- Be a paraphrase of a raw rule
- Encode personal preferences
- Encode topic-specific behavior
- Add conversational language

━━━━━━━━━━━━━━━━━━━━━━
## Output Format (Strict JSON)

Return a JSON object with the following structure:

{{
  "playbook": {{
    "rationale": "1 sentence: why the new policy prevents recurrence (optional)",
    "trigger": "consolidated imperative conditional trigger (required)",
    "blocking_issue": {{ "kind": "missing_tool|permission_denied|external_dependency|policy_restriction", "details": "what capability is missing" }},
    "content": "markdown bullet list (or single imperative sentence when only one action) — the actionable policy (required)"
  }}
}}

Rules:
- "rationale" is OPTIONAL — one sentence on the violated expectation and why the policy prevents recurrence
- "trigger" is REQUIRED — must consolidate all input Trigger conditions into one imperative conditional phrase
- "blocking_issue" is OPTIONAL — include only when the cluster's entries share a common capability gap. "kind" must be one of: missing_tool, permission_denied, external_dependency, policy_restriction
- "content" is REQUIRED — bullet-shaped when multiple actions; single imperative sentence when one

If NO playbook should be generated (duplicates existing approved playbooks), return:
{{"playbook": null}}

Examples:

{{"playbook": {{"rationale": "The agent assumed GUI workflows for technical users who prefer CLI, causing misaligned tool recommendations.", "trigger": "When assisting technical users with tool selection — CLI vs GUI, package managers, dev tooling, build systems.", "content": "- Ask for CLI preference before recommending GUI workflows.\n- Default to CLI-first suggestions when the user's context signals technical fluency."}}}}

{{"playbook": {{"rationale": "The agent jumped to implementation details before the user understood the trade-offs, causing rework.", "trigger": "When users are exploring architecture decisions — design reviews, system-design interviews, tech choice evaluations.", "content": "- Lead with the high-level strategy and trade-offs.\n- Defer implementation steps until the user signals readiness.\n- Surface alternatives before locking in one direction."}}}}

{{"playbook": null}}

{{"playbook": {{"rationale": "The agent attempted to delete files without proper permissions, risking data loss.", "trigger": "When a user asks to delete shared files, admin-owned resources, or anything requiring elevated permissions.", "blocking_issue": {{"kind": "permission_denied", "details": "Agent lacks admin-level file deletion permissions on shared drives"}}, "content": "- Inform the user that the deletion requires admin approval.\n- Offer to draft the request on their behalf.\n- Do NOT attempt the deletion directly."}}}}

━━━━━━━━━━━━━━━━━━━━━━
## Existing Approved Playbooks
{existing_approved_playbooks}

## Clustered Raw Playbooks
{user_playbooks}

## Output
Return only the JSON object as specified above.
