@tangle-network/agent-bench 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +15 -0
  2. package/package.json +35 -0
  3. package/src/adapters.ts +60 -0
  4. package/src/aec-gate.mts +217 -0
  5. package/src/atom-humaneval.mts +197 -0
  6. package/src/atom-mcp-e2e.mts +223 -0
  7. package/src/benchmarks/_harness.ts +206 -0
  8. package/src/benchmarks/aec-bench.test.mts +53 -0
  9. package/src/benchmarks/aec-bench.ts +319 -0
  10. package/src/benchmarks/appworld.test.mts +45 -0
  11. package/src/benchmarks/appworld.ts +426 -0
  12. package/src/benchmarks/cad-design.ts +429 -0
  13. package/src/benchmarks/cadbench.ts +135 -0
  14. package/src/benchmarks/cadgenbench.ts +121 -0
  15. package/src/benchmarks/commit0.test.mts +71 -0
  16. package/src/benchmarks/commit0.ts +266 -0
  17. package/src/benchmarks/enterpriseops-gym.test.mts +77 -0
  18. package/src/benchmarks/enterpriseops-gym.ts +343 -0
  19. package/src/benchmarks/finsearchcomp.ts +371 -0
  20. package/src/benchmarks/frames.ts +520 -0
  21. package/src/benchmarks/hotpotqa.ts +320 -0
  22. package/src/benchmarks/humaneval.ts +251 -0
  23. package/src/benchmarks/mind2web.ts +311 -0
  24. package/src/benchmarks/programbench.test.mts +60 -0
  25. package/src/benchmarks/programbench.ts +210 -0
  26. package/src/benchmarks/simpleqa.ts +390 -0
  27. package/src/benchmarks/swe-bench.ts +152 -0
  28. package/src/benchmarks/terminal-bench.ts +182 -0
  29. package/src/benchmarks/trata-hedge.ts +496 -0
  30. package/src/benchmarks/types.ts +58 -0
  31. package/src/browser/adapters/bad-design-audit.ts +153 -0
  32. package/src/browser/adapters/bad-design-audit.verify.ts +85 -0
  33. package/src/browser/adapters/bad.ts +165 -0
  34. package/src/browser/agent-adapter.ts +145 -0
  35. package/src/browser/process-adapter.ts +146 -0
  36. package/src/browser/run-to-spans.ts +105 -0
  37. package/src/browser/run-to-spans.verify.ts +89 -0
  38. package/src/browser/ui-reviewer.ts +200 -0
  39. package/src/browser/ui-reviewer.verify.ts +94 -0
  40. package/src/browser/verify.ts +96 -0
  41. package/src/clbench-codebase-gate.mts +314 -0
  42. package/src/clbench-context-gate.mts +305 -0
  43. package/src/cloud-loop.mts +138 -0
  44. package/src/coding-skills/minimal-diff.md +9 -0
  45. package/src/coding-skills/read-before-edit.md +9 -0
  46. package/src/coding-skills/reproduce-first.md +10 -0
  47. package/src/coding-skills/run-tests-after-edit.md +9 -0
  48. package/src/coding-skills/trace-the-failure.md +9 -0
  49. package/src/commit0-env-run.mts +59 -0
  50. package/src/commit0-env.ts +173 -0
  51. package/src/commit0-gate.mts +529 -0
  52. package/src/commit0-prereqs.sh +48 -0
  53. package/src/corpus-replay.mts +300 -0
  54. package/src/corpus-report.mts +504 -0
  55. package/src/corpus.test.mts +273 -0
  56. package/src/corpus.ts +325 -0
  57. package/src/decoder-live.mts +133 -0
  58. package/src/directives.ts +84 -0
  59. package/src/diverse-gate.mjs +112 -0
  60. package/src/egress-probe.mts +26 -0
  61. package/src/eops-skills/address-every-subtask.md +5 -0
  62. package/src/eops-skills/exact-tools-and-args.md +5 -0
  63. package/src/eops-skills/full-sequence-to-goal.md +5 -0
  64. package/src/eops-skills/ground-every-value.md +5 -0
  65. package/src/eops-skills/honor-the-policies.md +5 -0
  66. package/src/examples/README.md +58 -0
  67. package/src/examples/math-demo.mts +110 -0
  68. package/src/examples/strategy-demo.mts +119 -0
  69. package/src/fleet.mts +121 -0
  70. package/src/gate-cli.mts +101 -0
  71. package/src/gate.test.mts +129 -0
  72. package/src/gate.ts +460 -0
  73. package/src/generate-eval/certify.ts +178 -0
  74. package/src/generate-eval/schema.ts +78 -0
  75. package/src/humaneval-gate.mts +204 -0
  76. package/src/humaneval-repair-gate.mts +143 -0
  77. package/src/index.ts +19 -0
  78. package/src/mcp-mount-probe.mts +126 -0
  79. package/src/profile-coordinates.ts +134 -0
  80. package/src/profiles.ts +128 -0
  81. package/src/refine-loop.test.mts +106 -0
  82. package/src/refine-loop.ts +106 -0
  83. package/src/research-gate.mts +132 -0
  84. package/src/research-shot.ts +134 -0
  85. package/src/resolve-client.ts +58 -0
  86. package/src/router-executor.ts +51 -0
  87. package/src/run-pool.ts +48 -0
  88. package/src/runtime-hook-recorder.ts +137 -0
  89. package/src/sandbox-run.ts +125 -0
  90. package/src/search-bench/bridge.ts +124 -0
  91. package/src/search-bench/export.mts +0 -0
  92. package/src/search-bench/parametric-check.mts +63 -0
  93. package/src/search-bench/profiles.ts +98 -0
  94. package/src/search-bench/run.mts +287 -0
  95. package/src/search-bench/tasks-fresh.ts +688 -0
  96. package/src/search-bench/tasks.ts +129 -0
  97. package/src/search-tool.ts +95 -0
  98. package/src/selector.test.mts +189 -0
  99. package/src/selector.ts +366 -0
  100. package/src/skill-sandbox-smoke.mts +100 -0
  101. package/src/stats.mts +90 -0
  102. package/src/terminal-compare.ts +519 -0
  103. package/src/trajectory-assemble.mjs +130 -0
  104. package/src/trata-gate.mts +243 -0
  105. package/src/trata-gepa.mts +434 -0
  106. package/src/worker-blender.ts +230 -0
  107. package/src/worker-browser.ts +102 -0
  108. package/src/worker-build123d.ts +143 -0
  109. package/src/worker-cad.ts +451 -0
  110. package/src/worker.ts +136 -0
  111. package/src/workspace-loop.mts +133 -0
@@ -0,0 +1,688 @@
1
+ /**
2
+ * Web-search-dependent coding tasks — generated by the fresh-docs-coding-tasks
3
+ * workflow and adversarially verified against primary docs (correct + current +
4
+ * deterministic oracle + would-a-frontier-model-fail-from-memory). Each hinges on a
5
+ * precise recent/niche current-API detail. Do not hand-edit casually — regenerate.
6
+ */
7
+ import type { SearchTask } from './tasks'
8
+
9
+ export const freshTasks: SearchTask[] = [
10
+ {
11
+ "id": "cf-queues-retryall-delayseconds",
12
+ "domain": "Cloudflare Queues (Workers)",
13
+ "prompt": "In a Cloudflare Queues consumer handler (Workers), write the call that marks every message in the current `MessageBatch` to be retried, but delayed by 30 seconds before redelivery. Use the exact batch-level method and the exact option key name from the Queues Workers JavaScript API.",
14
+ "needsFreshDocs": "Models frequently invent the delay option key (guessing `delay`, `delayMs`, `delayMillis`, or `retryDelay`) and sometimes call a per-message-style method on the batch. The real API is `batch.retryAll({ delaySeconds: 30 })` — `delaySeconds` is an integer 0–86400. Memory often produces a plausible-but-wrong key.",
15
+ "oracle": {
16
+ "containsAll": [
17
+ "retryAll",
18
+ "delaySeconds"
19
+ ],
20
+ "containsAny": [
21
+ "retryAll({ delaySeconds: 30 })",
22
+ "retryAll({delaySeconds: 30})",
23
+ "delaySeconds: 30"
24
+ ],
25
+ "notContains": [
26
+ "delayMs",
27
+ "delayMillis",
28
+ "retryDelay",
29
+ "delaySecs",
30
+ "delay:",
31
+ "delayInSeconds"
32
+ ],
33
+ "regex": [
34
+ "retryAll\\s*\\(\\s*\\{[^}]*delaySeconds\\s*:\\s*30"
35
+ ]
36
+ },
37
+ "searchQuery": "Cloudflare Queues retryAll delaySeconds QueueRetryOptions batch consumer",
38
+ "sourceUrl": "https://developers.cloudflare.com/queues/configuration/javascript-apis/",
39
+ "expectedUrlIncludes": [
40
+ "developers.cloudflare.com",
41
+ "queues",
42
+ "javascript-apis"
43
+ ],
44
+ "correctAnswer": "`batch.retryAll({ delaySeconds: 30 })`. The batch-level retry method is `retryAll(options?: QueueRetryOptions)`, and `QueueRetryOptions` has a single optional key `delaySeconds` (an integer between 0 and 86400)."
45
+ },
46
+ {
47
+ "id": "cf-workflows-step-retry-backoff-enum",
48
+ "domain": "Cloudflare Workflows (Workers)",
49
+ "prompt": "In a Cloudflare Workflow, write the `WorkflowStepConfig` second argument to `step.do()` that retries the step at most 5 times with an exponential backoff and a 10-second initial delay. Use the exact field names and the exact backoff string value from the Workflows Workers API.",
50
+ "needsFreshDocs": "The retry config nests under a `retries` object with fields `limit`, `delay`, `backoff` — models often guess `maxRetries`/`attempts`/`maxAttempts` instead of `limit`, and the backoff string is exactly one of `\"constant\" | \"linear\" | \"exponential\"`. Models commonly hallucinate `\"exponential_backoff\"`, `\"exp\"`, or an `initialDelay`/`backoffType` shape.",
51
+ "oracle": {
52
+ "containsAll": [
53
+ "retries",
54
+ "limit",
55
+ "exponential"
56
+ ],
57
+ "containsAny": [
58
+ "backoff: 'exponential'",
59
+ "backoff: \"exponential\"",
60
+ "backoff:'exponential'",
61
+ "limit: 5",
62
+ "limit:5"
63
+ ],
64
+ "notContains": [
65
+ "maxRetries",
66
+ "maxAttempts",
67
+ "exponential_backoff",
68
+ "backoffType",
69
+ "initialDelay",
70
+ "numRetries",
71
+ "exponentialBackoff"
72
+ ],
73
+ "regex": [
74
+ "retries\\s*:\\s*\\{[^}]*limit\\s*:\\s*5",
75
+ "backoff\\s*:\\s*['\"]exponential['\"]"
76
+ ]
77
+ },
78
+ "searchQuery": "Cloudflare Workflows WorkflowStepConfig retries limit delay backoff constant linear exponential",
79
+ "sourceUrl": "https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/",
80
+ "expectedUrlIncludes": [
81
+ "developers.cloudflare.com",
82
+ "workflows",
83
+ "sleeping-and-retrying"
84
+ ],
85
+ "correctAnswer": "Pass `{ retries: { limit: 5, delay: '10 seconds', backoff: 'exponential' } }`. The retry config lives under a `retries` object with fields `limit` (max attempts), `delay` (number ms or duration string), and `backoff`, whose allowed values are exactly `\"constant\" | \"linear\" | \"exponential\"`."
86
+ },
87
+ {
88
+ "id": "cf-vectorize-query-returnmetadata-enum",
89
+ "domain": "Cloudflare Vectorize (Workers)",
90
+ "prompt": "Using the Cloudflare Vectorize Workers binding (v2), write the `index.query(vector, options)` call that returns the top 20 matches WITH each match's full metadata but WITHOUT the vector values. Use the exact current option key(s) and the exact string value — do not use the deprecated argument.",
91
+ "needsFreshDocs": "The modern API uses `returnMetadata` with string values `\"none\" | \"indexed\" | \"all\"` and a separate boolean `returnValues`, which replaced the now-deprecated boolean `returnVectors`. Models trained on older material emit `returnVectors: true` or treat `returnMetadata` as a boolean (`returnMetadata: true`) rather than the `'all'` string.",
92
+ "oracle": {
93
+ "containsAll": [
94
+ "returnMetadata",
95
+ "all"
96
+ ],
97
+ "containsAny": [
98
+ "returnMetadata: 'all'",
99
+ "returnMetadata: \"all\"",
100
+ "returnMetadata:'all'"
101
+ ],
102
+ "notContains": [
103
+ "returnVectors",
104
+ "returnMetadata: true",
105
+ "returnMetadata:true",
106
+ "returnMetadata: false",
107
+ "includeMetadata",
108
+ "returnMeta"
109
+ ],
110
+ "regex": [
111
+ "returnMetadata\\s*:\\s*['\"]all['\"]"
112
+ ]
113
+ },
114
+ "searchQuery": "Cloudflare Vectorize query returnMetadata indexed all returnValues deprecated returnVectors",
115
+ "sourceUrl": "https://developers.cloudflare.com/vectorize/reference/client-api/",
116
+ "expectedUrlIncludes": [
117
+ "developers.cloudflare.com",
118
+ "vectorize",
119
+ "client-api"
120
+ ],
121
+ "correctAnswer": "`await index.query(vector, { topK: 20, returnMetadata: 'all' })`. `returnMetadata` is a string-valued option (`\"none\" | \"indexed\" | \"all\"`) and `returnValues` is a separate boolean; both replaced the deprecated `returnVectors` boolean. Leaving `returnValues` off (default false) omits the vector values."
122
+ },
123
+ {
124
+ "id": "cf-d1-sessions-withsession-constraints",
125
+ "domain": "Cloudflare D1 (Workers, read replication / Sessions API)",
126
+ "prompt": "Using the Cloudflare D1 Sessions API for read replication, write the `env.DB.withSession(...)` call that forces the FIRST query of the session to hit the primary database instance (to read your own writes). Use the exact constraint string constant. Separately, state the exact HTTP header name the official example uses to round-trip the session bookmark between requests.",
127
+ "needsFreshDocs": "The Sessions API constraint constants are the exact strings \"first-primary\" and \"first-unconstrained\" (hyphenated, lowercase), and the canonical example round-trips the bookmark via the header \"x-d1-bookmark\". Models guess \"primary\", \"first_primary\", \"strong\", or header names like \"d1-bookmark\"/\"x-bookmark\". This API shipped April 2025 (read-replication public beta), so it is unlikely to be reliable from memory.",
128
+ "oracle": {
129
+ "containsAll": [
130
+ "withSession",
131
+ "first-primary",
132
+ "x-d1-bookmark"
133
+ ],
134
+ "containsAny": [
135
+ "withSession('first-primary')",
136
+ "withSession(\"first-primary\")",
137
+ "withSession(`first-primary`)"
138
+ ],
139
+ "notContains": [
140
+ "first_primary",
141
+ "firstPrimary",
142
+ "withSession('primary')",
143
+ "withSession(\"primary\")",
144
+ "d1-bookmark\"",
145
+ "x-bookmark",
146
+ "first-write",
147
+ "strong-consistency"
148
+ ],
149
+ "regex": [
150
+ "withSession\\s*\\(\\s*['\"`]first-primary['\"`]\\s*\\)"
151
+ ]
152
+ },
153
+ "searchQuery": "Cloudflare D1 withSession first-primary first-unconstrained bookmark x-d1-bookmark read replication",
154
+ "sourceUrl": "https://developers.cloudflare.com/d1/best-practices/read-replication/",
155
+ "expectedUrlIncludes": [
156
+ "developers.cloudflare.com",
157
+ "d1",
158
+ "read-replication"
159
+ ],
160
+ "correctAnswer": "`const session = env.DB.withSession('first-primary')` (the doc's code uses backticks: withSession(`first-primary`)) forces the first query to the primary instance so you read your own writes; the other constant is `'first-unconstrained'`, which is the default. The official read-replication example round-trips the bookmark via the `x-d1-bookmark` HTTP header — reading it with request.headers.get('x-d1-bookmark') and writing session.getBookmark() back with response.headers.set('x-d1-bookmark', ...)."
161
+ },
162
+ {
163
+ "id": "nextjs15-after-import-next-server",
164
+ "domain": "Next.js 15 (App Router)",
165
+ "prompt": "In a Next.js 15.1+ App Router project, I want to run a non-blocking task (analytics logging) after the response has finished streaming, using the stabilized `after()` function. Write the exact `import` statement that brings `after` into scope, then call it inside a Route Handler. Give me the precise module specifier the function is imported from.",
166
+ "needsFreshDocs": "after() was promoted from experimental `unstable_after` to stable `after` in v15.1.0. The stable export lives in `next/server`, NOT a dedicated `next/after` module (which does not exist), NOT `next/navigation`, and NOT `next/cache`. Models frequently hallucinate `next/after` by analogy to other Next.js function modules, or keep emitting the deprecated `unstable_after` name.",
167
+ "oracle": {
168
+ "containsAll": [
169
+ "import { after } from 'next/server'"
170
+ ],
171
+ "containsAny": [
172
+ "after(",
173
+ "after(()"
174
+ ],
175
+ "notContains": [
176
+ "next/after",
177
+ "unstable_after",
178
+ "import { unstable_after }",
179
+ "next/navigation",
180
+ "next/cache",
181
+ "import after from"
182
+ ]
183
+ },
184
+ "sourceUrl": "https://nextjs.org/docs/app/api-reference/functions/after",
185
+ "searchQuery": "Next.js 15 after function stable import next/server",
186
+ "expectedUrlIncludes": [
187
+ "nextjs.org",
188
+ "api-reference/functions/after"
189
+ ],
190
+ "correctAnswer": "The stabilized function is imported as `import { after } from 'next/server'`. It became stable in v15.1.0 (was `unstable_after` in the v15.0.0-rc). There is no `next/after` module; the wrong/hallucinated forms are `next/after`, `next/cache`, `next/navigation`, and the deprecated `unstable_after`."
191
+ },
192
+ {
193
+ "id": "tanstack-query-v5-infinite-initialpageparam",
194
+ "domain": "TanStack Query v5 (React)",
195
+ "prompt": "I'm migrating a `useInfiniteQuery` call to TanStack Query v5. The v4 call had `queryKey`, `queryFn`, and `getNextPageParam` but no explicit first-page parameter. In v5 the query throws/type-errors because a now-required option is missing. Name the exact option key that v5 made mandatory for infinite queries (it supplies the `pageParam` for the very first page), and also name the v5 option that caps how many pages are kept and refetched (it replaced `refetchPage`). Show them inside a `useInfiniteQuery({ ... })` config.",
196
+ "needsFreshDocs": "v5 made `initialPageParam` a required option on `useInfiniteQuery` (previously the first pageParam defaulted to `undefined`). It also removed `refetchPage` in favor of the new `maxPages` option. Models commonly omit `initialPageParam` entirely (v4 habit), invent `initialPage` / `defaultPageParam`, or still reference the removed `refetchPage`.",
197
+ "oracle": {
198
+ "containsAll": [
199
+ "initialPageParam",
200
+ "maxPages"
201
+ ],
202
+ "containsAny": [
203
+ "useInfiniteQuery",
204
+ "getNextPageParam"
205
+ ],
206
+ "notContains": [
207
+ "refetchPage",
208
+ "defaultPageParam",
209
+ "initialPage:",
210
+ "firstPageParam"
211
+ ]
212
+ },
213
+ "sourceUrl": "https://tanstack.com/query/v5/docs/framework/react/guides/migrating-to-v5",
214
+ "searchQuery": "TanStack Query v5 useInfiniteQuery initialPageParam required maxPages",
215
+ "expectedUrlIncludes": [
216
+ "tanstack.com/query/v5",
217
+ "migrating-to-v5"
218
+ ],
219
+ "correctAnswer": "v5 requires an explicit `initialPageParam` (used as the `pageParam` for the first page), and introduces `maxPages` to limit how many pages are stored/refetched (replacing the removed `refetchPage`). Correct config: `useInfiniteQuery({ queryKey, queryFn, initialPageParam: 0, getNextPageParam, maxPages: 3 })`."
220
+ },
221
+ {
222
+ "id": "astro5-content-layer-render-function",
223
+ "domain": "Astro 5 (Content Layer)",
224
+ "prompt": "I upgraded to Astro 5's Content Layer API. My old Astro 4 code did `const { Content } = await entry.render()` to render a collection entry, and it no longer works. Write the corrected Astro 5 code: include the exact import (from `astro:content`) and the exact call that produces the `Content` component from an `entry`. Name the function and its module.",
225
+ "needsFreshDocs": "Astro 5 removed the `entry.render()` method. Rendering is now done with a standalone `render(entry)` function imported from `astro:content` (e.g. `import { render } from 'astro:content'; const { Content } = await render(entry)`). Models trained mostly on Astro 4 will keep calling `await entry.render()`. Separately, the `glob`/`file` loaders import from `astro/loaders`, a distractor models get wrong.",
226
+ "oracle": {
227
+ "containsAll": [
228
+ "render(entry)",
229
+ "astro:content"
230
+ ],
231
+ "containsAny": [
232
+ "import { render }",
233
+ "{ Content }",
234
+ "await render(entry)"
235
+ ],
236
+ "notContains": [
237
+ "entry.render()",
238
+ "await entry.render",
239
+ ".render()"
240
+ ]
241
+ },
242
+ "sourceUrl": "https://docs.astro.build/en/guides/content-collections/",
243
+ "searchQuery": "Astro 5 content layer render function astro:content entry.render removed",
244
+ "expectedUrlIncludes": [
245
+ "docs.astro.build",
246
+ "content-collections"
247
+ ],
248
+ "correctAnswer": "In Astro 5 you call the standalone `render()` function imported from `astro:content`: `import { render } from 'astro:content'; const { Content } = await render(entry);`. The old `entry.render()` instance method was removed."
249
+ },
250
+ {
251
+ "id": "svelte5-state-raw-not-frozen",
252
+ "domain": "Svelte 5 (runes)",
253
+ "prompt": "In Svelte 5, I have a large array that I do NOT want to be deeply reactive (I'll only ever reassign it, never mutate in place) so I avoid the proxying cost. Write the rune declaration that creates this shallow / non-deeply-reactive state. Give the exact rune name (the `$state.*` variant).",
254
+ "needsFreshDocs": "The shallow-state rune was renamed from `$state.frozen` to `$state.raw` in v5.0.0-next.218 (PR #12808), well before the stable 5.0 release. Models trained on early Svelte 5 preview material emit `$state.frozen`, which does not exist in shipped Svelte 5. The correct current rune is `$state.raw`.",
255
+ "oracle": {
256
+ "containsAll": [
257
+ "$state.raw"
258
+ ],
259
+ "containsAny": [
260
+ "$state.raw(",
261
+ "= $state.raw"
262
+ ],
263
+ "notContains": [
264
+ "$state.frozen",
265
+ "$state.shallow",
266
+ "$state.snapshot(",
267
+ "Object.freeze"
268
+ ]
269
+ },
270
+ "sourceUrl": "https://svelte.dev/docs/svelte/$state",
271
+ "searchQuery": "Svelte 5 $state.raw non-deeply reactive shallow state rune",
272
+ "expectedUrlIncludes": [
273
+ "svelte.dev/docs/svelte/$state"
274
+ ],
275
+ "correctAnswer": "Use `$state.raw`, e.g. `let items = $state.raw([...]);` — state declared with `$state.raw` is not deeply reactive and can only be reassigned, not mutated. The earlier preview name `$state.frozen` was renamed to `$state.raw` (PR #12808) and no longer exists."
276
+ },
277
+ {
278
+ "id": "drizzle-relations-v2-through",
279
+ "domain": "ORMs/DBs: Drizzle",
280
+ "prompt": "Using Drizzle ORM Relational Queries v2 (the new relations API introduced in drizzle-orm v1.0.0-beta), define a many-to-many relation between `users` and `groups` through a junction table `usersToGroups`. Write the relations definition. Show the exact top-level function call, and the exact way each side of the many-to-many maps the junction-table foreign keys.",
281
+ "needsFreshDocs": "Drizzle's v2 relations API (`defineRelations` + `r.many.<table>({ from, to })` chained through the junction table with `.through()`) shipped in late 2025 and is completely different from the v1 `relations()` / `relationName` + explicit junction-table relation objects. A model relying on memory will almost certainly emit the v1 `relations(usersToGroups, ({ one }) => ...)` boilerplate or invent a `.via()`/`junction:` key rather than the real `from: r.users.id.through(r.usersToGroups.userId)` form.",
282
+ "oracle": {
283
+ "containsAll": [
284
+ "defineRelations",
285
+ ".through(",
286
+ "r.many",
287
+ "from:",
288
+ "to:"
289
+ ],
290
+ "containsAny": [
291
+ "r.users.id.through",
292
+ "r.usersToGroups",
293
+ "usersToGroups.userId"
294
+ ],
295
+ "notContains": [
296
+ "relationName",
297
+ ".via(",
298
+ "junction:",
299
+ "manyToMany("
300
+ ]
301
+ },
302
+ "searchQuery": "Drizzle ORM relations v2 defineRelations through many-to-many",
303
+ "sourceUrl": "https://orm.drizzle.team/docs/relations-v2",
304
+ "correctAnswer": "In Drizzle relations v2 you use `defineRelations(schema, (r) => ({ ... }))` and express many-to-many with `r.many.groups({ from: r.users.id.through(r.usersToGroups.userId), to: r.groups.id.through(r.usersToGroups.groupId) })`. The junction table is wired by chaining `.through(...)` onto each side's column reference inside the `from`/`to` keys — there is no separate junction relation object and no `relationName`."
305
+ },
306
+ {
307
+ "id": "prisma-typedsql-param-comment",
308
+ "domain": "ORMs/DBs: Prisma",
309
+ "prompt": "You are using Prisma's TypedSQL feature (the `typedSql` preview feature, introduced in Prisma 5.19.0 and supported in Prisma 6). Write a `.sql` file named `getUsersByAge.sql` that takes two integer parameters (min age, max age) as typed, named arguments using TypedSQL's comment-annotation syntax. Then show the TypeScript that imports the generated query function and runs it. Use the exact comment-annotation syntax TypedSQL requires for declaring the typed parameters, the correct generated-import path, and the correct execution method.",
310
+ "needsFreshDocs": "TypedSQL's parameter-annotation syntax is the literal line comment `-- @param {Int} $1:minAge` (type in braces, positional `$N`, optional `:alias`), and the generated function is run via `prisma.$queryRawTyped(getUsersByAge(...))`, imported from `@prisma/client/sql` (default generator output) or `./generated/prisma/sql` (custom output). This is a 2024-era preview feature: a model tends to invent `$queryRaw` tagged templates, `:minAge` colon named-binds, or an `@arg`/`@input` annotation rather than the literal `-- @param {Type} $N:alias` comment plus the `$queryRawTyped` call.",
311
+ "oracle": {
312
+ "containsAll": [
313
+ "@param",
314
+ "$queryRawTyped"
315
+ ],
316
+ "containsAny": [
317
+ "@prisma/client/sql",
318
+ "generated/prisma/sql"
319
+ ],
320
+ "regex": [
321
+ "--\\s*@param\\s*\\{Int\\}\\s*\\$1"
322
+ ],
323
+ "notContains": [
324
+ "$queryRaw`",
325
+ "$queryRawUnsafe",
326
+ "@arg",
327
+ "@input",
328
+ "createTypedSql",
329
+ ":minAge,"
330
+ ]
331
+ },
332
+ "searchQuery": "Prisma TypedSQL @param comment syntax queryRawTyped import @prisma/client/sql",
333
+ "sourceUrl": "https://www.prisma.io/docs/orm/prisma-client/using-raw-sql/typedsql",
334
+ "correctAnswer": "In getUsersByAge.sql, declare typed params with line comments `-- @param {Int} $1:minAge` and `-- @param {Int} $2:maxAge` above the `SELECT ... WHERE age > $1 AND age < $2` statement. In TS, `import { getUsersByAge } from '@prisma/client/sql'` (default generator output; use `./generated/prisma/sql` if a custom `output` is configured) and run it with `await prisma.$queryRawTyped(getUsersByAge(minAge, maxAge))`. Requires `previewFeatures = [\"typedSql\"]` and generating with `prisma generate --sql`."
335
+ },
336
+ {
337
+ "id": "drizzle-upstash-cache-withcache",
338
+ "domain": "ORMs/DBs: Drizzle",
339
+ "prompt": "Using Drizzle ORM's built-in query caching with Upstash Redis, wire up the cache when constructing the `db` instance, then run a single `select` query that reads from the cache, gives that query a custom cache key, and disables automatic invalidation for it. Show the exact import for the Upstash cache helper, the exact option key passed to `drizzle()`, and the exact per-query method and its option keys.",
340
+ "needsFreshDocs": "Drizzle's caching layer (`upstashCache()` from `drizzle-orm/cache/upstash`, passed as `cache:` to `drizzle()`, opted into per-query via `.$withCache({ tag, autoInvalidate })`) landed in drizzle-orm 0.44 (2025). A model guessing from memory will likely invent `.cache()`, `.withCache()` (no `$`), a `redis:`/`cacheProvider:` config key, or import from `@upstash/...` rather than the real `drizzle-orm/cache/upstash` + `.$withCache({...})`.",
341
+ "oracle": {
342
+ "containsAll": [
343
+ "upstashCache",
344
+ "drizzle-orm/cache/upstash",
345
+ ".$withCache",
346
+ "autoInvalidate"
347
+ ],
348
+ "containsAny": [
349
+ "cache:",
350
+ "tag:",
351
+ "tag: 'custom"
352
+ ],
353
+ "notContains": [
354
+ ".withCache(",
355
+ ".cache(",
356
+ "cacheProvider",
357
+ "@upstash/redis/drizzle"
358
+ ]
359
+ },
360
+ "searchQuery": "Drizzle ORM upstashCache $withCache autoInvalidate tag cache config",
361
+ "sourceUrl": "https://orm.drizzle.team/docs/cache",
362
+ "correctAnswer": "Import `import { upstashCache } from 'drizzle-orm/cache/upstash'` and pass `cache: upstashCache({ ... })` to `drizzle()`. Per query, call `.$withCache({ tag: 'custom_key', autoInvalidate: false })` (also accepts `config: {}`) to read from cache with a custom key and no auto-invalidation."
363
+ },
364
+ {
365
+ "id": "libsql-client-transaction-modes-concurrency",
366
+ "domain": "ORMs/DBs: Turso/libSQL",
367
+ "prompt": "Using the `@libsql/client` TypeScript SDK: (1) what are the exact allowed string values for the transaction mode accepted by `client.transaction(mode)` and `client.batch(stmts, mode)`, and (2) what is the name of the `createClient` config option that caps in-flight requests and what is its default value? Show a `createClient` call setting that option.",
368
+ "needsFreshDocs": "The libSQL `TransactionMode` union is exactly `'write' | 'read' | 'deferred'` (NOT SQLite's `IMMEDIATE`/`EXCLUSIVE`), and the client's request cap is the `concurrency` option defaulting to 20. A model from memory tends to answer with SQLite-native modes (`deferred`/`immediate`/`exclusive`) and to hallucinate a `maxConcurrency`/`poolSize` option or omit the default.",
369
+ "oracle": {
370
+ "containsAll": [
371
+ "concurrency",
372
+ "20"
373
+ ],
374
+ "containsAny": [
375
+ "\"write\"",
376
+ "'write'",
377
+ "write",
378
+ "deferred"
379
+ ],
380
+ "notContains": [
381
+ "IMMEDIATE",
382
+ "EXCLUSIVE",
383
+ "immediate",
384
+ "exclusive",
385
+ "maxConcurrency",
386
+ "poolSize"
387
+ ]
388
+ },
389
+ "searchQuery": "@libsql/client TransactionMode write read deferred concurrency default 20 createClient",
390
+ "sourceUrl": "https://github.com/tursodatabase/libsql-client-ts/blob/main/packages/libsql-core/src/api.ts",
391
+ "correctAnswer": "The `TransactionMode` union is exactly `\"write\" | \"read\" | \"deferred\"` (default `\"deferred\"`); these are the only valid values for `client.transaction(mode)` / `client.batch(stmts, mode)`. The request-cap option is `concurrency`, defaulting to 20, e.g. `createClient({ url, concurrency: 10 })`."
392
+ },
393
+ {
394
+ "id": "biome-v2-organize-imports-assist-source",
395
+ "domain": "Biome 2.0 configuration (biome.json)",
396
+ "prompt": "In a Biome 2.0 project, organize-imports was moved out of its old dedicated top-level config field and is now an assist action. Write the exact JSON in biome.json that enables organize-imports in Biome v2. Give the full nested key path and the value used to turn it on.",
397
+ "needsFreshDocs": "Biome v1 used a top-level `\"organizeImports\": { \"enabled\": true }` field. Biome 2.0 (released 2025) relocated it to the assist subsystem at `assist.actions.source.organizeImports` with a string level value `\"on\"`/`\"off\"`. A model relying on memory will almost certainly emit the deprecated v1 `organizeImports.enabled: true` boolean form, which no longer exists in v2.",
398
+ "oracle": {
399
+ "containsAll": [
400
+ "assist",
401
+ "actions",
402
+ "source",
403
+ "organizeImports",
404
+ "\"on\""
405
+ ],
406
+ "containsAny": [
407
+ "\"assist\"",
408
+ "assist:"
409
+ ],
410
+ "notContains": [
411
+ "\"enabled\": true",
412
+ "\"enabled\":true",
413
+ "organizeImports\": { \"enabled",
414
+ "organizeImports\":{\"enabled",
415
+ "linter.actions",
416
+ "source.organizeImports.enabled"
417
+ ]
418
+ },
419
+ "searchQuery": "Biome v2 organizeImports assist actions source migrate",
420
+ "sourceUrl": "https://biomejs.dev/assist/actions/organize-imports/",
421
+ "correctAnswer": "In Biome 2.0 organize-imports is an assist action enabled via the nested path assist.actions.source.organizeImports set to the string \"on\": { \"assist\": { \"actions\": { \"source\": { \"organizeImports\": \"on\" } } } }. The old v1 form \"organizeImports\": { \"enabled\": true } is removed (handled by `biome migrate`).",
422
+ "expectedUrlIncludes": [
423
+ "biomejs.dev",
424
+ "organize-imports"
425
+ ]
426
+ },
427
+ {
428
+ "id": "vite6-default-resolve-conditions-exports",
429
+ "domain": "Vite 6 resolve configuration",
430
+ "prompt": "I'm migrating a Vite plugin to Vite 6. In v6, internally-added resolve conditions are no longer prepended automatically, so to preserve resolution I must spread Vite's exported default conditions when I set a custom condition. Name the two exact identifiers Vite 6 exports from the 'vite' package for the default client and server resolve conditions, and show how to set resolve.conditions to ['custom'] plus the client defaults.",
431
+ "needsFreshDocs": "Vite 6 (late 2024) introduced the named exports `defaultClientConditions` and `defaultServerConditions` from 'vite', and stopped auto-adding the built-in conditions to a user-specified `resolve.conditions`. Models often hallucinate names like `defaultConditions`, `DEFAULT_CONDITIONS`, or `defaultResolveConditions`, or claim Vite still merges defaults automatically.",
432
+ "oracle": {
433
+ "containsAll": [
434
+ "defaultClientConditions",
435
+ "defaultServerConditions"
436
+ ],
437
+ "containsAny": [
438
+ "...defaultClientConditions",
439
+ "['custom', ...defaultClientConditions]",
440
+ "[\"custom\", ...defaultClientConditions]"
441
+ ],
442
+ "notContains": [
443
+ "defaultConditions",
444
+ "DEFAULT_CONDITIONS",
445
+ "defaultResolveConditions",
446
+ "defaultClientCondition\"",
447
+ "getDefaultConditions"
448
+ ]
449
+ },
450
+ "searchQuery": "Vite 6 defaultClientConditions defaultServerConditions resolve.conditions migration",
451
+ "sourceUrl": "https://v6.vite.dev/guide/migration",
452
+ "correctAnswer": "Vite 6 exports defaultClientConditions and defaultServerConditions from 'vite'. Because v6 no longer auto-adds built-in conditions, a custom value must spread them, e.g. resolve: { conditions: ['custom', ...defaultClientConditions] } (and ['custom', ...defaultServerConditions] for ssr.resolve.conditions).",
453
+ "expectedUrlIncludes": [
454
+ "vite.dev",
455
+ "migration"
456
+ ]
457
+ },
458
+ {
459
+ "id": "esbuild-025-serve-cors-origin-option",
460
+ "domain": "esbuild dev server API (0.25.x CORS)",
461
+ "prompt": "esbuild 0.25.0 disabled the dev server's CORS by default for security, so cross-origin requests to my server (started with ctx.serve(...)) are now denied. esbuild later added a serve() option to re-enable CORS for a specific origin. What is the exact serve() option name, the exact shape of its value, and which 0.25.x release first added it? Show the ctx.serve call enabling CORS for https://example.com.",
462
+ "needsFreshDocs": "esbuild 0.25.0 (Feb 2025) was a security release that DISABLED the dev server's CORS by default (no Access-Control-Allow-Origin; fixes GHSA-67mh-4wv8-2f99). It did NOT add a way to re-enable it. The configurable `cors` serve option — an object with an `origin` field, e.g. cors: { origin: 'https://example.com' } (Go API: Origin: []string{...}; CLI: --cors-origin=) — was added later, in 0.25.4 (issue #4125). Models from memory invent flags like `--cors`, `allowCors: true`, `corsOrigin`, or `headers: { 'Access-Control-Allow-Origin': ... }`, miss the nested `cors.origin` object shape, and wrongly attribute the option to 0.25.0 instead of 0.25.4.",
463
+ "oracle": {
464
+ "containsAll": [
465
+ "cors",
466
+ "origin"
467
+ ],
468
+ "containsAny": [
469
+ "cors: {",
470
+ "cors:{",
471
+ "{ origin:",
472
+ "origin: 'https://example.com'",
473
+ "origin: \"https://example.com\""
474
+ ],
475
+ "notContains": [
476
+ "corsOrigin",
477
+ "allowCors",
478
+ "--cors ",
479
+ "--cors=",
480
+ "allowedOrigins",
481
+ "cors: true",
482
+ "enableCors",
483
+ "cors-origin:",
484
+ "headers: {"
485
+ ]
486
+ },
487
+ "searchQuery": "esbuild 0.25.4 serve cors origin option development server CORS changelog issue 4125",
488
+ "sourceUrl": "https://github.com/evanw/esbuild/blob/main/CHANGELOG-2025.md",
489
+ "correctAnswer": "esbuild 0.25.0 disabled dev-server CORS by default. The configurable serve() option is `cors`, an object with an `origin` field (a string in JS, or an array in the Go API), and it was added in esbuild 0.25.4 (issue #4125). Example: ctx.serve({ servedir: '.', cors: { origin: 'https://example.com' } }), which sets Access-Control-Allow-Origin when the request's Origin matches. The CLI equivalent is --cors-origin=https://example.com.",
490
+ "expectedUrlIncludes": [
491
+ "github.com/evanw/esbuild",
492
+ "CHANGELOG-2025"
493
+ ]
494
+ },
495
+ {
496
+ "id": "bun-test-coverage-threshold-reporter-keys",
497
+ "domain": "Bun test coverage (bunfig.toml)",
498
+ "prompt": "In bunfig.toml I want bun test to fail when coverage drops below 90% per metric, and to also write an lcov report. Under the [test] section, give the exact key for per-metric thresholds with its three metric sub-keys, and the exact key for selecting reporters with its value to emit both a console summary and lcov.",
499
+ "needsFreshDocs": "Bun's bunfig.toml uses `coverageThreshold` with PLURAL per-metric keys `lines`/`functions`/`statements` (as fractions 0-1, not percentages), and `coverageReporter` (SINGULAR key name) whose value is an ARRAY like [\"text\", \"lcov\"]. Models trained on Jest frequently pluralize the reporter key to `coverageReporters`, nest thresholds under a `global` block, use a `branches` key (Bun's documented table omits branches), use percentages like 90 instead of 0.9, or guess singular metric keys (line/function/statement).",
500
+ "oracle": {
501
+ "containsAll": [
502
+ "coverageThreshold",
503
+ "lines",
504
+ "functions",
505
+ "statements",
506
+ "coverageReporter",
507
+ "lcov"
508
+ ],
509
+ "containsAny": [
510
+ "[\"text\", \"lcov\"]",
511
+ "[\"text\",\"lcov\"]",
512
+ "lines = 0.9",
513
+ "lines=0.9"
514
+ ],
515
+ "notContains": [
516
+ "coverageReporters",
517
+ "coverageThresholds",
518
+ "{ line =",
519
+ "{ line=",
520
+ "branches =",
521
+ "= 90"
522
+ ]
523
+ },
524
+ "searchQuery": "Bun bunfig.toml coverageThreshold lines functions statements coverageReporter lcov",
525
+ "sourceUrl": "https://bun.com/docs/test/code-coverage",
526
+ "correctAnswer": "Under [test], use coverageThreshold = { lines = 0.9, functions = 0.9, statements = 0.9 } (plural keys, fractions 0-1) and coverageReporter = [\"text\", \"lcov\"] (singular key, array value) to fail under 90% and write lcov.info.",
527
+ "expectedUrlIncludes": [
528
+ "bun.com",
529
+ "code-coverage"
530
+ ]
531
+ },
532
+ {
533
+ "id": "anthropic-cache-1h-ttl-usage-fields",
534
+ "domain": "Anthropic SDK (prompt caching)",
535
+ "prompt": "Using the Anthropic Messages API, I want to cache a large system prompt with the 1-hour (extended) cache duration instead of the default 5-minute one. (1) Give the exact `cache_control` object I attach to the content block to request the 1-hour TTL. (2) Give the exact `anthropic-beta` header value that enables the extended cache TTL. (3) In the response `usage`, what are the two exact field names inside the `cache_creation` object that break down the 5-minute vs 1-hour cache-write tokens?",
536
+ "needsFreshDocs": "The 1-hour extended cache (beta header `extended-cache-ttl-2025-04-11`, `ttl: '1h'`) and the `cache_creation.{ephemeral_5m_input_tokens,ephemeral_1h_input_tokens}` usage breakdown were added in 2025. From memory a model is likely to emit the old `prompt-caching-2024-07-31` header, hallucinate `ttl: '3600s'`/`duration`, or invent usage field names like `cache_creation_1h_input_tokens`.",
537
+ "oracle": {
538
+ "containsAll": [
539
+ "ephemeral",
540
+ "extended-cache-ttl-2025-04-11",
541
+ "ephemeral_5m_input_tokens",
542
+ "ephemeral_1h_input_tokens"
543
+ ],
544
+ "containsAny": [
545
+ "\"1h\"",
546
+ "'1h'",
547
+ "ttl"
548
+ ],
549
+ "notContains": [
550
+ "prompt-caching-2024-07-31",
551
+ "3600s",
552
+ "cache_creation_1h_input_tokens",
553
+ "\"ttl\": 3600"
554
+ ],
555
+ "regex": [
556
+ "ttl[\"']?\\s*:\\s*[\"']1h[\"']"
557
+ ]
558
+ },
559
+ "searchQuery": "Anthropic prompt caching 1h extended TTL cache_control beta header ephemeral_1h_input_tokens",
560
+ "sourceUrl": "https://platform.claude.com/docs/en/build-with-claude/prompt-caching",
561
+ "correctAnswer": "(1) `cache_control: { \"type\": \"ephemeral\", \"ttl\": \"1h\" }`. (2) beta header `anthropic-beta: extended-cache-ttl-2025-04-11`. (3) Inside `usage.cache_creation`, the fields are `ephemeral_5m_input_tokens` and `ephemeral_1h_input_tokens`."
562
+ },
563
+ {
564
+ "id": "openai-agents-handoff-prompt-prefix-and-as-tool",
565
+ "domain": "OpenAI Agents SDK (Python)",
566
+ "prompt": "In the OpenAI Agents SDK for Python (the `openai-agents` package): (1) What is the exact name of the recommended prompt-prefix constant you prepend to an agent's `instructions` so it handles handoffs correctly, and exactly which module is it imported from? (2) For an agent named `Refund Agent`, what is the exact default handoff tool name the SDK generates? (3) What is the exact Agent method that turns an agent into a callable tool (agent-as-tool, not a handoff), and name its two key parameters?",
567
+ "needsFreshDocs": "These are SDK-specific identifiers: `RECOMMENDED_PROMPT_PREFIX` lives in `agents.extensions.handoff_prompt`, the default handoff tool name is `transfer_to_refund_agent`, and agent-as-tool is `Agent.as_tool(tool_name=..., tool_description=...)`. From memory a model is apt to invent `HANDOFF_PROMPT_PREFIX`, put it in `agents.handoffs`, guess `handoff_to_refund_agent`, or call the method `as_function()`/`to_tool()`.",
568
+ "oracle": {
569
+ "containsAll": [
570
+ "RECOMMENDED_PROMPT_PREFIX",
571
+ "agents.extensions.handoff_prompt",
572
+ "transfer_to_refund_agent",
573
+ "as_tool"
574
+ ],
575
+ "containsAny": [
576
+ "tool_name",
577
+ "tool_description"
578
+ ],
579
+ "notContains": [
580
+ "HANDOFF_PROMPT_PREFIX",
581
+ "handoff_to_refund_agent",
582
+ "as_function",
583
+ "to_tool(",
584
+ "agents.handoffs.RECOMMENDED"
585
+ ]
586
+ },
587
+ "searchQuery": "OpenAI Agents SDK RECOMMENDED_PROMPT_PREFIX handoff_prompt transfer_to as_tool",
588
+ "sourceUrl": "https://openai.github.io/openai-agents-python/handoffs/",
589
+ "correctAnswer": "(1) `RECOMMENDED_PROMPT_PREFIX`, imported from `agents.extensions.handoff_prompt`. (2) `transfer_to_refund_agent`. (3) `Agent.as_tool(tool_name=..., tool_description=...)`."
590
+ },
591
+ {
592
+ "id": "mcp-ts-registertool-annotation-hints",
593
+ "domain": "Model Context Protocol (TypeScript SDK)",
594
+ "prompt": "Using the official MCP TypeScript SDK (`@modelcontextprotocol/sdk`), I'm registering a `delete-file` tool with `server.registerTool(name, config, handler)`. In the config object's `annotations` field I want to mark this tool as: not read-only, destructive, idempotent, and not interacting with external systems. List the exact four boolean annotation-hint property names defined by the MCP tool-annotations spec that I set inside `annotations`, and give the correct true/false value for each for this delete-file tool.",
595
+ "needsFreshDocs": "The tool annotation hints (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`) were standardized in the MCP 2025-03-26 spec revision and surface via `registerTool`'s `annotations` config. From memory a model tends to drop the `Hint` suffix (`readOnly`, `destructive`) or invent names like `isDestructive`/`mutatesState`/`external`.",
596
+ "oracle": {
597
+ "containsAll": [
598
+ "readOnlyHint",
599
+ "destructiveHint",
600
+ "idempotentHint",
601
+ "openWorldHint",
602
+ "annotations"
603
+ ],
604
+ "containsAny": [
605
+ "registerTool",
606
+ "destructiveHint: true",
607
+ "destructiveHint=true"
608
+ ],
609
+ "notContains": [
610
+ "isDestructive",
611
+ "mutatesState",
612
+ "readOnly:",
613
+ "destructive:",
614
+ "idempotent:"
615
+ ]
616
+ },
617
+ "searchQuery": "MCP tool annotations readOnlyHint destructiveHint idempotentHint openWorldHint registerTool",
618
+ "sourceUrl": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/server.md",
619
+ "correctAnswer": "The four annotation hints are `readOnlyHint`, `destructiveHint`, `idempotentHint`, and `openWorldHint`, set inside the `annotations` config of `registerTool`. For delete-file: `readOnlyHint: false`, `destructiveHint: true`, `idempotentHint: true`, `openWorldHint: false`."
620
+ },
621
+ {
622
+ "id": "terraform-write-only-arg-wo-suffix",
623
+ "domain": "Terraform CLI / HCL (managed resources, write-only arguments)",
624
+ "prompt": "In a Terraform configuration using a provider that supports write-only arguments (introduced in Terraform 1.11, the feature that lets ephemeral values be passed to managed resources), I want to set a database instance's password from an ephemeral value so it is never persisted to state or plan. Show the exact argument name I assign the password to on the resource (the write-only naming convention/suffix), AND the exact companion argument I must increment to force Terraform to re-send the value on the next apply. Give the precise identifiers.",
625
+ "needsFreshDocs": "Write-only arguments shipped in Terraform 1.11 (March 2025). The convention is the literal suffix `_wo` on the argument name (e.g. `password_wo`) plus a companion `_wo_version` argument (e.g. `password_wo_version`) used as the change trigger. A model relying on memory tends to invent a `write_only = true` meta-argument, an `ephemeral = true` attribute flag, or reuse `sensitive`, none of which is the actual mechanism.",
626
+ "oracle": {
627
+ "containsAll": [
628
+ "_wo",
629
+ "_wo_version"
630
+ ],
631
+ "containsAny": [
632
+ "password_wo",
633
+ "password_wo_version",
634
+ "secret_string_wo"
635
+ ],
636
+ "notContains": [
637
+ "write_only = true",
638
+ "write_only=true",
639
+ "ephemeral = true",
640
+ "ephemeral=true",
641
+ "sensitive = true",
642
+ "writeonly",
643
+ "_writeonly",
644
+ "wo_version_id"
645
+ ],
646
+ "regex": [
647
+ "\\b\\w+_wo\\b",
648
+ "\\b\\w+_wo_version\\b"
649
+ ]
650
+ },
651
+ "searchQuery": "terraform 1.11 write-only arguments _wo suffix _wo_version managed resources ephemeral",
652
+ "sourceUrl": "https://developer.hashicorp.com/terraform/language/manage-sensitive-data/ephemeral",
653
+ "correctAnswer": "Assign the value to an argument with the `_wo` suffix, e.g. `password_wo = ephemeral.aws_secretsmanager_secret_version.db.secret_string`. To force Terraform to re-send it, increment the companion `password_wo_version` argument. The convention is `<name>_wo` (write-only argument) paired with `<name>_wo_version` (the change trigger). Write-only arguments are never stored in state or plan files."
654
+ },
655
+ {
656
+ "id": "uv-export-pylock-toml-format",
657
+ "domain": "uv (Python package manager, lockfile export)",
658
+ "prompt": "Using the uv CLI, I want to export my project's `uv.lock` into the new PEP 751 standardized lockfile format (NOT the legacy pip-style requirements file) and write it to disk. Give the exact `uv` subcommand, the exact flag and the exact format VALUE I pass to select the PEP 751 format, and the exact flag to write the result to a file. Also state the exact format value for the pip-compatible output and for a CycloneDX SBOM.",
659
+ "needsFreshDocs": "uv's `export` command added a `--format` flag whose PEP 751 value is the literal `pylock.toml` (and `cyclonedx1.5` for SBOM), with `requirements.txt` as the pip-compatible value, and `--output-file` to write to disk. From memory a model tends to guess `--output-format`, a bare `pylock` value without the `.toml`, `uv lock --format`, or `--to pep751`, none of which match the actual CLI.",
660
+ "oracle": {
661
+ "containsAll": [
662
+ "uv export",
663
+ "--format",
664
+ "pylock.toml"
665
+ ],
666
+ "containsAny": [
667
+ "--output-file",
668
+ "requirements.txt",
669
+ "cyclonedx1.5"
670
+ ],
671
+ "notContains": [
672
+ "--output-format",
673
+ "--to pylock",
674
+ "--format pylock\n",
675
+ "uv lock --format",
676
+ "pep751",
677
+ "--format pep-751",
678
+ "pylock.toml.lock"
679
+ ],
680
+ "regex": [
681
+ "uv export[\\s\\S]*--format\\s+pylock\\.toml"
682
+ ]
683
+ },
684
+ "searchQuery": "uv export --format pylock.toml PEP 751 requirements.txt cyclonedx1.5 --output-file",
685
+ "sourceUrl": "https://docs.astral.sh/uv/concepts/projects/export/",
686
+ "correctAnswer": "Run `uv export --format pylock.toml --output-file pylock.toml`. The `--format` flag accepts exactly `requirements.txt` (pip-compatible, the common default), `pylock.toml` (the PEP 751 standardized format), and `cyclonedx1.5` (SBOM). Use `--output-file` to write to disk; otherwise it prints to stdout."
687
+ }
688
+ ]