---
title: A research workflow for research teams
category: workflows
summary: Track literature and evidence reproducibly, with exact windows, a recorded query, stable paging and a claims-level evidence table every statement can be traced from.
order: 24
updated: 2026-10-07
next: troubleshoot-empty-windows-and-missing-manifests
related: preflight-count-orient-plan, signals-briefs-and-records
reference: /agent-guide.md, /docs/api
---

A research team needs three things that a casual reader does not need. It needs a search it can repeat. It needs a log of the exact questions it asked. It needs evidence it can trace to a source. Synorb gives you all three. Use exact windows, keep the query log and read the Signal's Claims.

## When to use this

Use it for an academic group, a policy shop, an analyst team or a diligence project. It suits work where someone later asks "how did you get this?". The answer must be a written log, not a memory.

## Smallest working call

Find literature and think-tank Streams. Search is free:

```mcp
synorb-stream-search
{"surface": "research_preprints", "page_size": 10}
```

Count an exact, historical window. Exact dates never change, and a count is free:

```mcp
synorb-manifests
{"stream_ids": ["STREAM_ID"], "source_class": ["academic_preprint"], "published_date_from": "2026-09-01", "published_date_to": "2026-09-30", "mode": "count"}
```

## What you get back

### A repeatable search

1. **Use exact dates** (`published_date_from`, `published_date_to`), not `days`. Then the window never changes.
2. **Use `stream_ids`** you resolved, never an omitted scope.
3. **Name the publisher class** with `source_class`. Values include `academic_preprint`, `peer_reviewed_journal`, `clinical_registry`, `official_regulator` and `central_bank`. Then the search says which class of source it covers.
4. **Save the request body** word for word, with the date you ran it.
5. **Count first.** The exact total and its `count_generation` document what the index held when you looked. Items published later appear on a later refresh. They do not change the earlier count.
6. **Page with the cursor Synorb gives you.** For a fixed walk through one result set, send the returned `snapshot_token` with the same filters. Follow `pagination.next` exactly as returned.
7. **Record `result_fingerprint`** for each page. It is a stable identity for the page. Later comparisons then cost little.

### Claims, not summaries

The Signal holds the evidence. Every Claim is one self-contained sentence. It has a `claim_type`, a `confidence` and an `evidence` kind. For direct quotes, it also has the exact `quote`. Build the evidence table directly from the Claims. Put the source link on every row:

```python
def claims_table(manifests, kinds=None):
    rows = ["| Claim | Type | Confidence | Evidence | Source |", "| --- | --- | --- | --- | --- |"]
    for m in manifests:
        link = (m.get("source") or {}).get("source_url") or ""
        name = (m.get("source") or {}).get("source_name") or "source"
        body = (m.get("signal") or {}).get("body") or {}
        for claim in body.get("claims") or []:
            if kinds and claim.get("claim_type") not in kinds:
                continue
            text = (claim.get("claim_text") or "").replace("|", "/").strip()
            if not text:
                continue
            cells = [text, claim.get("claim_type") or "", claim.get("confidence") or "", claim.get("evidence") or ""]
            source = "[" + name + "](" + link + ")" if link else name
            rows.append("| " + " | ".join(cells) + " | " + source + " |")
    return "\n".join(rows)
```

Call `claims_table(manifests, kinds={"data", "forecast"})` to read only the quantitative and predictive Claims. Ask for full bodies with `compact: false` first. Compact output keeps only a bounded Signal preview, not the full list of Claims.

### Cite properly

Every successful response carries a `citation_contract`. If its status is `required`, keep the returned citations and source URLs with each statement you make. Treat `confidence` as a limit on how strongly you may state a Claim. Show a `direct_quote` as a quote.

### Keep a log

For each run, store these items: the request body, the `temporal` effective window, `total_count`, `count_generation`, each page's `result_fingerprint`, the Manifest IDs and `manifests_billed_this_call`. With this log, a colleague can see exactly what you saw and run it again.

## Failure modes

| Symptom | Cause | What to do |
| --- | --- | --- |
| The same query gives a different count later | New items were published after your snapshot | Compare against the recorded `count_generation`. Expect growth in recent windows. |
| `claims` is missing or short | A compact response keeps only a Signal preview | Request those Manifests again with `compact: false`. |
| A Claim has no `quote` | It is a paraphrase or derived | Say so. Never present it as a quotation. |
| Thin source text | `content_quality: "thin"` | Read the Record (Startup and Enterprise plans) or the cited source before relying on the Signal. |
| A flood of results | The scope is too broad | Narrow with `tag_names` or a tighter `source_class`. Count first. |
| A source link is dead | Link rot | The Signal and Brief remain citable. Note the access date. |

## Make it good for your user

A research team trusts what it can audit. Show the evidence table. Attribute each row. Label confidence honestly.

Attach the query log to the result, so anyone can reproduce it. If the evidence is thin, conflicting or absent, say so first. In research, "the sources disagree" is a finding. A good agent reports it before it reports a conclusion.

## Next guide

[Troubleshoot empty windows and missing Manifests](/agent-resources/troubleshoot-empty-windows-and-missing-manifests): find out why a result is empty before you tell your user.
