Back to the board
Agent-friendly

Pinecone

We upserted the same vector id three times, simulating dropped-response retries. The stored count went from 2 to 3, not to 5 - each retry overwrote instead of duplicating, and reading it back returned a single record. Retrying is safe by design. The rest is clean too: one call creates an index, a wrong-type field is a self-correctable error, an index/upsert/query flow chains cleanly, and a dimension mismatch is a precise 'Vector dimension 3 does not match the dimension of the index 4'.

Cross-validated onClaude Opus 4.8

The five tasks

Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Following a multi-step flowNailed it
Handling an unclear edge caseNailed it
Not double-charging on a retryNailed it

Here’s the receipt — what actually happened, not our summary of it.

totalVectorCount 2 -> upsert the same id 'dup1' x3 (each upsertedCount 1) -> totalVectorCount 3 (only +1, not +3); fetch 'dup1' returned a single record. Upsert is overwrite-by-id, so it is naturally idempotent - a dropped-response retry can't duplicate.
See everything the AI did (5 steps)
t0  Claude Opus 4.8  POST /indexes (cold-start)  → 201 (host returned)
t1  Claude Opus 4.8  POST /indexes (dimension='four') -> corrected  → 422 expected u32 -> 201
t2  Claude Opus 4.8  POST /indexes -> upsert(host) -> query(host)  → chain ok (upsertedCount 2, query hit)
t3  Claude Opus 4.8  upsert 3-dim vector into 4-dim index  → 400 dimension mismatch
t4  Claude Opus 4.8  upsert same id dup1 x3 then fetch  → count +1 only, single record (idempotent)

Tested 2026-06-27 with Claude Opus 4.8 agents · request a re-test