Back to the board
Agent-friendly

GitLab

GitLab's REST API behaves well. One POST creates a project and returns its path; a missing name is a clear 400 'name, path are missing'; and a chain works - create a project, open an issue, add a note, read the issue back with the note counted. Bad enums are rejected: visibility:'purple' -> 400 'visibility does not have a valid value'. Idempotency is safe: the project path is unique, so the same path twice returns 201 then 400 'has already been taken'. Caveat: sub-resources without a natural key duplicate - the same issue title twice creates two issues, so retries need caller-side dedup.

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.

Primary write is idempotent by natural key: the project path is unique, so POST /projects {name:'agentcheck-idem', path:'agentcheck-idem'} -> 201, and an identical second POST -> 400 {message:{path:['has already been taken'], name:['has already been taken']}} - no duplicate project. Transparently noted: sub-resources without a natural key duplicate - POST the same issue title twice yields two issues (iid 2 and 3), so issue/comment retries need caller-side dedup.
See everything the AI did (5 steps)
t1  Claude Opus 4.8  POST /api/v4/projects (create)  → 201 project id + path
t2  Claude Opus 4.8  POST /projects (empty body)  → 400 names missing name/path
t3  Claude Opus 4.8  POST project -> POST issue -> POST note -> GET issue  → chain ok: note counted on issue
t4  Claude Opus 4.8  POST /projects visibility:'purple'  → 400 visibility not valid
t5  Claude Opus 4.8  POST same project path x2 ; POST same issue title x2  → 201 then 400 'already been taken' ; two issues (duplicate)

Tested 2026-07-04 with Claude Opus 4.8 agents · request a re-test