---
active: true
description: "Cross-axis AND within-axis unification — for each cluster of same-atom ops, keeps the single op with the most operands and drops the rest. Forces explicit cluster + survivor reasoning before drops."
variables:
  - pass_a_ops
  - pass_b_ops
  - pass_c_ops
---
You are reviewing extraction proposals from THREE parallel passes that examined the same conversation. For every group of ops that describe the same atom (whether across passes or within one pass), you keep the single most information-rich op and drop the rest.

## Pass A — UserProfile (user-side facts and preferences)
{pass_a_ops}

## Pass B — UserProfileAgentRec (agent-named answers / recommendations the agent gave the user)
{pass_b_ops}

## Pass C — UserPlaybook (procedural rules / playbooks for the agent to follow)
{pass_c_ops}

## What "information rich" means

Score each op by counting **distinct operands** it carries. An operand is one of:
- A specific number ("$80", "5 km", "three times")
- A date or year ("2024-03-15", "2020", "August")
- A temporal qualifier ("ten years ago", "last summer", "in 2020")
- A proper name or specific entity ("Max", "a friend", "the shelter", "Joanna")
- An exact phrase or distinguishing detail ("hand-painted", "grain-free", "from a shelter")

Filler words ("user", "has", "is", "a", "the", articles, common verbs) count for nothing. Two paraphrases of the same content score the same; the one with extra operands scores higher.

The op with the **highest operand count** in a cluster is the survivor. Ties: prefer the op whose operand is most useful for downstream questions (dates and temporal qualifiers > prices > sources/relations > exact phrases). Final tiebreaker: lower index wins.

## Procedure

For your output, follow this template EXACTLY:

```
Cluster 1: <one-line description of the shared atom>
  Members: A.0, A.1, A.2  (use the actual indices)
  Scores:
    A.0: <count>  ← <list operands found>
    A.1: <count>  ← <list operands found>
    A.2: <count>  ← <list operands found>
  Survivor: A.<index of highest-scoring op>
Cluster 2: <description>
  ...

DROP A.<index>
DROP A.<index>
DROP B.<index>
...
```

Rules:
- Every cluster MUST have exactly one Survivor. Even if all ops in a cluster look weak (all score 0), pick one — never delete a cluster entirely.
- Ops that don't share an atom with any other op are their own one-member cluster, scored once, survivor = themselves, no drops.
- The DROP list at the end contains every non-survivor across all clusters. NEVER include a Survivor in the DROP list.

## Cross-axis hint

When the same atom appears in Pass A and Pass B/C:
- Pass A capturing a user fact + Pass B restating it as "agent recommended X" → DROP B (Pass B adds nothing).
- Pass A capturing a fact + Pass C playbook trigger that adds NO operational guidance → DROP C.
- Pass A "user is vegan" + Pass B "agent recommended a vegan restaurant" → DIFFERENT FACETS, two separate clusters, KEEP BOTH.

## Worked example

Input Pass A:
```
[0] CREATE profile: user runs three times a week
[1] CREATE profile: user runs three times a week, usually 5 km each session
[2] CREATE profile: user is allergic to peanuts
[3] CREATE profile: user enjoys hiking
[4] CREATE profile: user prefers solo hikes over group hikes
```

Output:
```
Cluster 1: user's running routine
  Members: A.0, A.1
  Scores:
    A.0: 1  ← "three times a week"
    A.1: 2  ← "three times a week", "5 km each session"
  Survivor: A.1

Cluster 2: peanut allergy
  Members: A.2
  Scores:
    A.2: 1  ← "peanuts"
  Survivor: A.2

Cluster 3: hiking — general preference
  Members: A.3
  Scores:
    A.3: 1  ← "hiking"
  Survivor: A.3

Cluster 4: hiking — solo modality
  Members: A.4
  Scores:
    A.4: 1  ← "solo hikes over group hikes"
  Survivor: A.4

DROP A.0
```

Note: A.3 and A.4 both about hiking but DIFFERENT FACETS (general preference vs specific modality) → separate clusters, both kept.

## Hard rules

- **Never drop DELETE ops.** They reflect storage-state reasoning the agent did during its loop.
- **Every cluster keeps exactly one survivor.** No empty clusters.
- **When in doubt about whether two ops share an atom, put them in SEPARATE clusters** (so both are kept). False-keeps are recoverable; false-drops permanently lose information.

## Output

Now produce the cluster analysis and DROP list for the inputs above. If no DROPs are needed, end with: `KEEP ALL`

Use only the indices listed in the pass blocks above. Indices are 0-based and per-pass.
