> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anonalabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Competitive intelligence that accumulates

> Press releases, pricing changes and job postings become a position you can query, not a folder nobody reads.

[← All use cases](/use-cases/overview)

<div className="uc-examples"><a href="https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/time_travel.py">time\_travel.py</a><a href="https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/knowledge_graph.py">knowledge\_graph.py</a></div>

## The scenario

Everyone on the team notices things about competitors. Someone spots a pricing
page change, someone else reads an earnings call, someone notices they are
hiring six infrastructure engineers.

All of it lands in Slack, scrolls away, and is gone. Three months later nobody
can answer "when did they start moving upmarket?" — even though four people
watched it happen.

## Step 1 — Record signals with the date they happened

```python theme={null}
client.record(
    space_id="competitors",
    content="Competitor X moved to usage-based pricing at $0.80 per thousand calls.",
    timestamp="2026-06-02T00:00:00Z",
    metadata={"source": "pricing-page", "competitor": "X"},
)
```

The `timestamp` is the point. A signal recorded without one is undated evidence,
and undated evidence cannot answer a question about change.

## Step 2 — Ask what changed over a window

```python theme={null}
print(client.reason(
    space_id="competitors",
    query="How has Competitor X's pricing and positioning moved since June?",
))
```

## Step 3 — See who and what keeps coming up

```python theme={null}
graph = client.get_graph(space_id="competitors", min_count=3)
for node in graph["nodes"][:10]:
    print(node["label"], node["mention_count"])
```

Entities are extracted as memories are stored, so the graph is already there.
The interesting read is usually the *rising* one: a name that appeared twice
last quarter and eleven times this one.

## Evals

1. Record ten dated signals across six months, including two that contradict
   each other.
2. Ask what changed. A good answer notes the contradiction rather than picking
   one silently.
3. Re-ask with `occurred_after` set to the midpoint. The answer should narrow.
4. Check `get_graph` surfaces the competitor names you actually recorded, and
   not a long tail of noise — if it does, your memories are too chatty and want
   tighter extraction settings.

## Guardrails

<Warning>
  **Record public sources only.** Competitor intelligence assembled from
  confidential or improperly obtained material does not become acceptable by
  being in a database. Keep `metadata["source"]` filled in so anyone can check
  where a claim came from.
</Warning>

* **Edges are co-occurrence, not typed relationships.** The graph tells you two
  entities appear together and how often; it does not say one acquired the
  other. Do not present it as though it does.
* **Contradictions are signal, not error.** When a newer fact supersedes an
  older one, [correct it explicitly](/use-cases/correct-a-memory) with a reason
  rather than deleting the old one — the change is the intelligence.
* **A source that stops reporting looks the same as nothing happening.** Memory
  cannot tell you about the press release nobody fed it.

## Built from

Both are complete, runnable scripts:
[`time_travel.py`](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/time_travel.py),
[`knowledge_graph.py`](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/knowledge_graph.py).
