# Rust SDK E2E Test Run — `example_e2e.rs`

**Run date:** 2026-03-27
**Source:** `neocortex/packages/sdk-rust/tests/example_e2e.rs`
**API base URL:** `https://staging-api.alphahuman.xyz`
**Namespace:** `sdk-rust-e2e`
**Document ID:** `sdk-rust-e2e-doc-single-1774605977640`

---

## What the test does

The file is a standalone end-to-end integration program (not a `#[test]`-annotated unit test). It exercises the `tinyhumansai` Rust SDK against the staging API in six sequential steps:

| Step | Operation                            | SDK method                                     |
| ---- | ------------------------------------ | ---------------------------------------------- |
| 1    | Insert a memory document             | `insert_memory`                                |
| 2    | Poll ingestion job until complete    | `get_ingestion_job` + `wait_for_ingestion_job` |
| 3    | List documents filtered by namespace | `list_documents`                               |
| 4    | Fetch the specific document          | `get_document`                                 |
| 5    | Semantic query over the namespace    | `query_memory`                                 |
| 6    | Recall all memory context            | `recall_memory`                                |

The document inserted contains sprint velocity data for four teams (Atlas, Beacon, Comet, Delta).

---

## How to run

The file has its own `async fn main()` (annotated with `#[tokio::main]`), so Cargo's default test harness intercepts it and reports 0 tests. To run it as intended, add `harness = false` to `Cargo.toml` temporarily:

```toml
[[test]]
name = "example_e2e"
harness = false
```

Then:

```bash
cd neocortex/packages/sdk-rust
cargo test --test example_e2e
```

> **Note:** `TINYHUMANS_TOKEN` in the file is intentionally left blank. Populate it with a valid API token before running.

---

## Step-by-step output

### Step 1 — `insertMemory`

**Endpoint:** `POST /memory/insert`

**Request body** (serialized from `InsertMemoryBody`; `priority`, `createdAt`, `updatedAt` omitted because they are `None` and marked `skip_serializing_if`):

```json
{
  "title": "Sprint Dataset - Team Velocity",
  "content": "Sprint snapshot: Team Atlas completed 42 story points with 3 blockers, Team Beacon completed 35 story points with 1 blocker, Team Comet completed 48 story points with 5 blockers, and Team Delta completed 39 story points with 2 blockers. The highest velocity team is Team Comet and the fewest blockers team is Team Beacon.",
  "namespace": "sdk-rust-e2e",
  "sourceType": "doc",
  "metadata": { "source": "example_e2e.rs" },
  "documentId": "sdk-rust-e2e-doc-single-1774605977640"
}
```

**Result:** success
**Job ID:** `a2a1396c-bcf5-4552-afc0-6c822bafd7c6`
**Initial job state:** `pending`

```
InsertMemoryResponse {
    success: true,
    data: InsertMemoryData {
        job_id: Some("a2a1396c-bcf5-4552-afc0-6c822bafd7c6"),
        state: Some("pending"),
        ...
    },
}
```

---

### Step 2 — `getIngestionJob` + `waitForIngestionJob`

**Endpoint:** `GET /memory/ingestion/jobs/{jobId}` (no request body)

**URL:** `GET /memory/ingestion/jobs/a2a1396c-bcf5-4552-afc0-6c822bafd7c6`

`wait_for_ingestion_job` then polls the same endpoint repeatedly (every 1 s, up to 30 s) until the state is not in `{pending, queued, processing, in_progress, started}`.

Initial poll returned state `processing`, so the SDK waited. Job completed successfully.

**Final state:** `completed`
**Completed at:** `2026-03-27T10:06:24.974Z`
**Ingestion latency:** `2.6173 s`

Key stats from the completed job response:

| Metric                | Value       |
| --------------------- | ----------- |
| Chunks new            | 1           |
| Chunks total          | 1           |
| Chunks deduplicated   | 0           |
| Entities extracted    | 15          |
| Relations extracted   | 25          |
| Sections              | 1           |
| Source type           | `doc`       |
| Embedding tokens used | 244         |
| Cost (USD)            | $0.00000488 |

Timing breakdown (selected):

| Stage                | Seconds  |
| -------------------- | -------- |
| Chunking             | 0.000826 |
| Chunk embedding      | 0.2688   |
| Chunk storage        | 0.2049   |
| Entity extraction    | 0.8131   |
| Entity embedding     | 0.0476   |
| Graph structure      | 0.2427   |
| Relationship storage | 0.3800   |
| Storage total        | 1.2504   |

---

### Step 3 — `listDocuments`

**Endpoint:** `GET /memory/documents?namespace=sdk-rust-e2e&limit=10&offset=0` (no request body)

This run uses the updated `list_documents(ListDocumentsParams { namespace, limit, offset })` signature (new in the local SDK). Passing `namespace` now filters results correctly — previous runs returned an empty array because no namespace filter was applied.

**4 documents returned** (all previous E2E runs in this namespace):

| Document ID                             | Created at                     |
| --------------------------------------- | ------------------------------ |
| `sdk-rust-e2e-doc-single-1774598994566` | 2026-03-27T08:09:56            |
| `sdk-rust-e2e-doc-single-1774600415507` | 2026-03-27T08:33:37            |
| `sdk-rust-e2e-doc-single-1774604625874` | 2026-03-27T09:43:47            |
| `sdk-rust-e2e-doc-single-1774605977640` | 2026-03-27T10:06:20 ← this run |

All share `namespace: "sdk-rust-e2e"`, `title: "Sprint Dataset - Team Velocity"`, `chunk_count: 1`.

---

### Step 4 — `getDocument`

**Endpoint:** `GET /memory/documents/{documentId}?namespace={namespace}` (no request body)

**URL:** `GET /memory/documents/sdk-rust-e2e-doc-single-1774605977640?namespace=sdk-rust-e2e`

```json
{
  "success": true,
  "data": {
    "document_id": "sdk-rust-e2e-doc-single-1774605977640",
    "namespace": "sdk-rust-e2e",
    "title": "Sprint Dataset - Team Velocity",
    "chunk_count": 1,
    "chunk_ids": [-1427053832764092200],
    "created_at": "2026-03-27T10:06:20.655791+00:00",
    "updated_at": "2026-03-27T10:06:21.964953+00:00",
    "user_id": "69b12a6fd11460481185a040"
  }
}
```

---

### Step 5 — `queryMemory`

**Endpoint:** `POST /memory/query`

**Request body** (serialized from `QueryMemoryParams` with `#[serde(rename_all = "camelCase")]`; `documentIds` and `llmQuery` omitted because they are `None`):

```json
{
  "query": "Which team has the highest velocity and which team has the fewest blockers?",
  "includeReferences": true,
  "namespace": "sdk-rust-e2e",
  "maxChunks": 5.0
}
```

**Result:** 1 chunk returned with score `19.117`

The relevant chunk was retrieved correctly. The LLM context message assembled by the API:

```
## Sources

[1]  Section: Sprint Dataset - Team Velocity
[1]  Sprint snapshot: Team Atlas completed 42 story points with 3 blockers,
     Team Beacon completed 35 story points with 1 blocker, Team Comet
     completed 48 story points with 5 blockers, and Team Delta completed 39
     story points with 2 blockers. The highest velocity team is Team Comet
     and the fewest blockers team is Team Beacon.
```

Top entity mentions extracted from the chunk (by normalized importance):

| Entity                    | Normalized importance | Count |
| ------------------------- | --------------------- | ----- |
| THE FEWEST BLOCKERS TEAM  | 1.000                 | 6     |
| 42 STORY POINTS           | 0.842                 | 14    |
| TEAM BEACON               | 0.486                 | 2     |
| TEAM COMET                | 0.476                 | 2     |
| THE HIGHEST VELOCITY TEAM | 0.440                 | 4     |

**Usage:**

- Embedding tokens: 20
- Cost: $0.0000004
- Cached: false

---

### Step 6 — `recallMemoryContext`

**Endpoint:** `POST /memory/recall`

**Request body** (serialized from `RecallMemoryParams` with `#[serde(rename_all = "camelCase")]`):

```json
{ "namespace": "sdk-rust-e2e", "maxChunks": 5.0 }
```

Recall (no query — returns all recent/relevant context) returned the same chunk with a higher score of `31.357` (recall scoring differs from query scoring).

**Counts:** 1 chunk, 0 entities, 0 relations
**Latency:** 2.8183 s
**Usage:** 0 tokens, $0 cost (recall is embedding-free)
**Cached:** false

The LLM context message was identical to step 5.

---

## Changes since previous run

| Area                             | Previous run                            | This run                                                           |
| -------------------------------- | --------------------------------------- | ------------------------------------------------------------------ |
| `step3_list_documents` signature | `list_documents()` — no args            | `list_documents(ListDocumentsParams { namespace, limit, offset })` |
| Step 3 result                    | Empty `documents: []` (no filter)       | 4 documents returned (namespace filter working)                    |
| Job ID                           | `4b3cc8e2-...`                          | `a2a1396c-...`                                                     |
| Document ID                      | `sdk-rust-e2e-doc-single-1774600415507` | `sdk-rust-e2e-doc-single-1774605977640`                            |
| Ingestion latency                | 1.7791 s                                | 2.6173 s                                                           |
| Entity extraction time           | 0.0117 s                                | 0.8131 s                                                           |

---

## Overall result

```
E2E Rust SDK example completed.
```

All 6 steps passed. The SDK correctly:

- Inserted a document and received a job ID
- Polled and waited for the ingestion job to reach `completed`
- Listed documents filtered by namespace (returning all 4 prior E2E inserts)
- Retrieved the document metadata by ID
- Performed a semantic query and received the correct chunk with entity importance scores
- Recalled memory context with latency and count metadata
