Skip to content

Claude Opus 5.5 (effort default (no --effort flag) · thinking on) on Find every deprecated API call in a large repo and write a migration checklist

AClaude Opus 5.5default · thinking on · Claude Code 2.1.299 (headless -p) · cloud · 2026-10-16 · by @bobsiopener

Trust 80%Fully autonomoussuccess · first try
Estimated cost
$0.75
Wall time
3m
Human step-ins
0
Outcome
Pass

Compare with other models on this task →

Summary

Exact prompt

Audit this repository (the MongoDB Node.js driver, version 1.4.0, about 57k lines of JavaScript) for every call site of these deprecated Node.js APIs: 1. The Buffer constructor, called either as `new Buffer(...)` or as a plain function `Buffer(...)` (DEP0005). 2. `require('domain')` (DEP0032). Cover every .js file in the repository (lib, test, examples, dev, docs, and so on). Count only real code, not occurrences inside comments or string literals. Write two files in the repository root: - findings.csv with header: file,line,api,replacement (file = path relative to the repo root; line = 1-based line where the call starts; api = "new Buffer()", "Buffer()" or "require('domain')"; replacement = the suggested modern API, e.g. Buffer.alloc / Buffer.from / Buffer.allocUnsafe, or an alternative to domain) - MIGRATION.md: a migration checklist grouped by directory, with counts and any call sites that need special care. Do not modify any source files.

An audit of a real 57k-line JavaScript codebase (MongoDB Node.js driver 1.4.0) for every deprecated Buffer-constructor and domain call, producing a CSV of call sites and a migration checklist. Ground truth comes from an AST scan, and ten look-alike matches inside comments act as traps. It compares one large model working alone, the same large model as a planner delegating the scanning to smaller, cheaper subagents, and a mid-size model working alone. Original benchmark task written for usecaserank.com (not based on a specific public post). Headless, offline run on a reproducible fixture. Each run's notes say how its cost was measured (estimates are marked).

Success criteria: Recall vs. a grep-derived ground-truth list ≥ 95%; false positives ≤ 5%.

Setup notes: Config A: Opus 5.5 only, subagents disabled. Repo: mongodb/node-mongodb-native tag V1.4.0 (shallow clone, .git removed), 93 ground-truth call sites from an acorn AST scan (batch2/p03/tools/gt.js); 10 more 'new Buffer(' matches sit in comments and are traps for grep-only answers. Scored by exact (file, line) match. Tools: Read/Write/Edit/Glob/Grep/Bash, Task disabled, web disabled. Run variant: config=A. Claude Code's own reported cost for claude-opus-5.5: $0.753419. Score: recall 93/93, 0 false positives. Cost is an ESTIMATE: measured tokens x pricing.json list price (Claude Pro subscription, nothing billed); input_tokens include cache reads and writes. Single run. Comparison on this use case: three configurations ran the same audit. A = Opus 5.5 only; B = Opus 5.5 main agent delegating the directory scans to Haiku 5.5 subagents (.claude/agents/scanner.md, model: haiku); C = Sonnet 5.5 only.

Estimated cost List-price estimate; not actually billed.

Metrics

Estimated cost
$0.75
Wall time
3m
Human step-ins
0
Turns
17
Model usage
ModelInput tokOutput tokCost
AClaude Opus 5.5anthropic/claude-opus-5.5effort default (no --effort flag) · thinking on560,34417,071$0.75

Reproduce this run

  1. Use the use case prompt on the use case page.
  2. Same setup: Claude Opus 5.5 (anthropic/claude-opus-5.5, effort default (no --effort flag) · thinking on) via Claude Code 2.1.299 (headless -p), cloud.
  3. It counts as a success only if it meets every success criterion: Recall vs. a grep-derived ground-truth list ≥ 95%; false positives ≤ 5%.
  4. Log model, tokens, wall time, human step-ins and the evidence log, then submit it as a reproduction. A different model? Submit a head-to-head rerun.

How runs are scored: Methodology.

Was this useful?

⇄ Rerun on another model

Automated checks

Trust 80% comes from these checks (how Trust % works).

Evidence log
[
 {
  "duration_api_ms": 156701,
  "stop_reason": "end_turn",
  "session_id": "[REDACTED]",
  "total_cost_usd": 0.7534190000000001,
  "usage": {
   "input_tokens": 32,
   "cache_creation_input_tokens": 38437,
   "cache_read_input_tokens": 521875,
   "output_tokens": 17071,
   "output_tokens_details": {
    "thinking_tokens": 4100
   },
   "server_tool_use": {
    "web_search_requests": 0,
    "web_fetch_requests": 0
   },
   "service_tier": "standard",
   "cache_creation": {
    "ephemeral_1h_input_tokens": 38437,
    "ephemeral_5m_input_tokens": 0
   },
   "inference_geo": "global",
   "iterations": [
    {
     "input_tokens": 2,
     "output_tokens": 1118,
     "cache_read_input_tokens": 48974,
     "cache_creation_input_tokens": 400,
     "cache_creation": {
      "ephemeral_5m_input_tokens": 0,
      "ephemeral_1h_input_tokens": 400
     },
     "type": "message"
    }
   ],
   "speed": "standard",
   "fallback_credit": null
  },
  "modelUsage": {
   "claude-opus-5-5": {
    "inputTokens": 32,
    "outputTokens": 17071,
    "cacheReadInputTokens": 521875,
    "cacheCreationInputTokens": 38437,
    "webSearchRequests": 0,
    "costUSD": 0.7534190000000001,
    "contextWindow": 1000000,
    "maxOutputTokens": 128000,
    "thinkingTokens": 4100,
    "canonicalModel": "claude-opus-5-5",
    "provider": "firstParty",
    "costBasis": "list"
   }
  },
  "permission_denials": [],
  "terminal_reason": "completed",
  "fast_mode_state": "off",
  "fast_mode_disabled_reason": "sdk_opt_in_required",
  "subagent_stats": {
   "spawned": 0,
   "requested": {
    "background": 0,
    "foreground": 0,
    "unset": 0
   },
   "started_in_background": 0,
   "max_depth": 0,
   "spawned_by_subagents": 0,
   "completed": 0,
   "failed": 0,
   "killed": {
    "parent": 0,
    "user": 0,
    "system": 0
   },
   "refused": {
    "depth_limit": 0,
    "concurrency_limit": 0,
    "budget": 0
   },
   "by_type": {}
  },
  "safety_stops": 0,
  "is_error": false,
  "num_turns": 17,
  "subtype": "success",
  "api_error_status": null,
  "result": "I've written `findings.csv` and `MIGRATION.md` to the repository root. The audit found **93 real call sites**: 91 `new Buffer(...)` and 2 `require('domain')`. No code calls `Buffer(...)` without `new`. No source files were changed.\n\n**How I scanned:** I tokenized all 204 `.js` files, so comments, string literals, template literals and regex literals were skipped. As a check, I compared the results with a plain `grep`. Every line `grep` found that the scan didn't count was one of 10 commented-out `new Buffer(` lines; those are listed in MIGRATION.md. Nothing calls the constructor under another name. `gridstore.js` reassigns `Buffer = require('buffer').Buffer`, which is the same constructor, so its two calls are counted. `examples/`, `docs/` and `index.js` have no findings.\n\n**By directory:**\n\n| Directory | Sites |\n|---|---|\n| `lib/` (the driver itself) | 24 |\n| `test/` | 61 (including both `require('domain')` calls) |\n| `dev/` | 8 |\n\n**Suggested replacements:** 65 \u2192 `Buffer.alloc`, 22 \u2192 `Buffer.from`, 4 \u2192 `Buffer.allocUnsafe`. The `allocUnsafe` ones are on the reply-parsing path in `connection.js`, where every byte is copied in before the buffer is used.\n\n**Sites that need special care:**\n- **The 6 message builders in `lib/mongodb/commands/`:** each one allocates a buffer with the old uninitialised constructor and sends it over the network. If the size worked out in advance is ever larger than what actually gets written, uninitialised memory goes to the server. I recommend `Buffer.alloc`, and `allocUnsafe` only once it's confirmed every byte gets written.\n- **`gridstore.js:1313`:** if a caller passes a number to `GridStore.write`, the old code quietly stored that many bytes of uninitialised memory. `Buffer.from` throws an error instead, so users will see a behaviour change.\n- **`chunk.js:36`:** the buffer is sized by the number of array elements, not the length of the joined string. Rewriting it as `Buffer.from(join)` would change what gets stored.\n- **`chunk.js:92`:** the buffer may be only partly filled, so it must be `Buffer.alloc`, not `allocUnsafe`.\n- **The two `require('domain')` tests** (`error_tests.js:107`, `exception_tests.js:32`) check that errors reach the caller's domain through `bindToCurrentDomain` in `lib/mongodb/db.js`. That function uses `process.domain`, which is outside your two patterns, so it isn't in the CSV. MIGRATION.md notes it so the tests and that function can be migrated together.\n- **Compatibility:** `package.json` says the driver supports Node `>=0.6.19`, but `Buffer.from` and `Buffer.alloc` need Node 4.5 or later. Either raise that minimum or add a small shim such as the `safe-buffer` package.\n\nThe scanner scripts are in `/tmp/audit/`, outside the repository, if you want to re-run them.",
  "ttft_ms": 2264,
  "type": "result",
  "duration_ms": 158442,
  "uuid": "[REDACTED]",
  "ttft_stream_ms": 1192,
  "time_to_request_ms": 206,
  "first_content_frame_ms": 1193,
  "queued_turn_count": 0,
  "result_index": 0
 }
]

Get new runs and ranking changes weekly