File size: 18,013 Bytes
3738348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
"""

Gold-standard search agent traces β€” hand-crafted examples using real code

from the corpus. These define the quality bar for the synthetic trace generator.



Each trace follows this format:

  1. System prompt (agent role definition)

  2. User query (from the bigger model)

  3. Agent response:

     a. <|reasoning|> β€” decompose the query, plan searches

     b. <|search|> β€” issue a search query

     c. <|result|> β€” retrieved code chunks (injected by the harness)

     d. <|reasoning|> β€” analyze results, decide if more search needed

     e. (repeat b-d as needed)

     f. <|evidence|> β€” curated evidence package

     g. <|finish|> β€” signal completion



The agent learns to:

  - Break complex queries into subqueries

  - Search with specific terms (function names, types, patterns)

  - Judge which results are relevant vs noise

  - Extract key facts concisely (not dump entire code)

  - Synthesize across multiple results

  - Know when to stop searching

"""

import json
import os

PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
GOLD_PATH = os.path.join(PROJECT_DIR, "data", "gold_traces.jsonl")

SYSTEM_PROMPT = (
    "You are a code search agent. Given a query from a reasoning model, "
    "decompose it into subqueries, search the codebase, inspect results, "
    "and return curated evidence. Use <|search|> to issue searches, "
    "<|reasoning|> to analyze, and <|evidence|> to return findings. "
    "Be concise. Extract only the relevant facts. End with <|finish|>."
)

GOLD_TRACES = [
    # ─── Trace 1: Simple function lookup (C) ───────────────────────────────
    {
        "query": "How does nginx handle reusable connections?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "How does nginx handle reusable connections?"},
            {"role": "assistant", "content": (
                "<|reasoning|>The query asks about reusable connections in nginx. "
                "I should search for functions related to reusable connections.<|end|>\n"
                "<|search|>reusable connection<|end|>"
            )},
            {"role": "result", "content": (
                "ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable)\n"
                "{\n"
                "    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,\n"
                "                   \"reusable connection: %ui\", reusable);\n"
                "\n"
                "    if (c->reusable) {\n"
                "        ngx_queue_remove(&c->queue);\n"
                "        ngx_cycle->reusable_connections_n--;\n"
                "    }\n"
                "\n"
                "    c->reusable = reusable;\n"
                "\n"
                "    if (reusable) {\n"
                "        ngx_queue_insert_head(\n"
                "            (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue);\n"
                "        ngx_cycle->reusable_connections_n++;\n"
                "    }\n"
                "}"
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>This function manages the reusable connection queue. "
                "When a connection is marked reusable, it's added to "
                "reusable_connections_queue and the counter is incremented. "
                "When unreusable, it's removed from the queue and counter decremented. "
                "I have enough to answer.<|end|>\n"
                "<|evidence|>nginx manages reusable connections via `ngx_reusable_connection()`:\n"
                "- Marks connection as reusable/unreusable via the `reusable` flag\n"
                "- When reusable: inserts into `reusable_connections_queue` (head), increments `reusable_connections_n`\n"
                "- When unreusable: removes from queue, decrements counter\n"
                "- Uses `ngx_queue_insert_head` and `ngx_queue_remove` for queue management\n"
                "Source: ngx_connection.c<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
    # ─── Trace 2: Multi-step search (Python) ──────────────────────────────
    {
        "query": "What does the with_params_help decorator do and how is it used?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "What does the with_params_help decorator do and how is it used?"},
            {"role": "assistant", "content": (
                "<|reasoning|>This asks about a specific decorator. I need to find its definition first, then find usages.<|end|>\n"
                "<|search|>with_params_help<|end|>"
            )},
            {"role": "result", "content": (
                "def with_params_help(params_cls: type, title: str = \"Parameter defaults\"):\n"
                "    \"\"\"\n"
                "    Class decorator that appends a help table generated from another dataclass\n"
                "    (e.g., VllmParameters) to the decorated class's docstring.\n"
                "    \"\"\"\n"
                "    if not is_dataclass(params_cls):\n"
                "        raise TypeError(f\"{params_cls} must be a dataclass\")\n"
                "\n"
                "    def _decorator(cls: type) -> type:\n"
                "        block = generate_dataclass_help(params_cls)\n"
                "        cls.__doc__ = (cls.__doc__ or \"\") + f\"\\n\\n{title}:\\n{block}\"\n"
                "        return cls\n"
                "\n"
                "    return _decorator"
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>Found the definition. It's a decorator factory that takes a dataclass and appends a help table to another class's docstring. Now I need to find where it's used to show a concrete example.<|end|>\n"
                "<|search|>@with_params_help<|end|>"
            )},
            {"role": "result", "content": (
                "@with_params_help(VllmBuildParameters)\n"
                "class VllmBuildRunner(BaseRunner):\n"
                "    \"\"\"\n"
                "    Build vLLM using docker buildx.\n"
                "    \"\"\""
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>Found a usage. The decorator is applied to VllmBuildRunner with VllmBuildParameters as the params class. This appends parameter defaults from VllmBuildParameters to VllmBuildRunner's docstring. I have enough to answer.<|end|>\n"
                "<|evidence|>`with_params_help` is a class decorator factory:\n"
                "- Takes a dataclass (`params_cls`) and optional title (default \"Parameter defaults\")\n"
                "- Generates a help table from the dataclass fields via `generate_dataclass_help()`\n"
                "- Appends the table to the decorated class's `__doc__` docstring\n"
                "- Usage example: `@with_params_help(VllmBuildParameters)` on `VllmBuildRunner`\n"
                "- Requires `params_cls` to be a dataclass (raises TypeError otherwise)<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
    # ─── Trace 3: Type/struct lookup with noise (C) ───────────────────────
    {
        "query": "What fields does the nginx listening socket structure have?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "What fields does the nginx listening socket structure have?"},
            {"role": "assistant", "content": (
                "<|reasoning|>Looking for the listening socket struct definition in nginx. Should search for ngx_listening struct.<|end|>\n"
                "<|search|>ngx_listening struct fields<|end|>"
            )},
            {"role": "result", "content": (
                "typedef struct ngx_listening_s  ngx_listening_t;\n"
                "\n"
                "struct ngx_listening_s {\n"
                "    ngx_socket_t        fd;\n"
                "    struct sockaddr    *sockaddr;\n"
                "    socklen_t           socklen;\n"
                "    size_t              addr_text_max_len;\n"
                "    ngx_str_t           addr_text;\n"
                "    int                 type;\n"
                "    int                 protocol;\n"
                "    int                 backlog;\n"
                "    int                 rcvbuf;\n"
                "    int                 sndbuf;\n"
                "};"
            )},
            {"role": "result", "content": (
                "ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,\n"
                "    socklen_t socklen)\n"
                "{\n"
                "    ls = ngx_array_push(&cf->cycle->listening);\n"
                "    ngx_memzero(ls, sizeof(ngx_listening_t));\n"
                "    ls->sockaddr = sa;\n"
                "    ls->socklen = socklen;\n"
                "}"
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>The first result is the struct definition β€” exactly what I need. The second result is the creation function, which is related but not asked for. I'll focus on the struct fields.<|end|>\n"
                "<|evidence|>`ngx_listening_s` (aka `ngx_listening_t`) structure fields:\n"
                "- `fd` (ngx_socket_t): file descriptor\n"
                "- `sockaddr` (struct sockaddr*): socket address pointer\n"
                "- `socklen` (socklen_t): socket address length\n"
                "- `addr_text_max_len` (size_t): max address text length\n"
                "- `addr_text` (ngx_str_t): address text representation\n"
                "- `type` (int): socket type\n"
                "- `protocol` (int): protocol\n"
                "- `backlog` (int): listen backlog\n"
                "- `rcvbuf` (int): receive buffer size\n"
                "- `sndbuf` (int): send buffer size\n"
                "Source: ngx_connection.h<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
    # ─── Trace 4: Query decomposition (JS/TS) ─────────────────────────────
    {
        "query": "How does the concatenate function work and what types does it accept?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "How does the concatenate function work and what types does it accept?"},
            {"role": "assistant", "content": (
                "<|reasoning|>This has two parts: (1) how concatenate works, (2) what types it accepts. Let me search for the function definition.<|end|>\n"
                "<|search|>concatenate function array<|end|>"
            )},
            {"role": "result", "content": (
                "export function concatenate<T>(array1: T[], array2: T[] | undefined): T[];\n"
                "// eslint-disable-line @typescript-eslint/unified-signatures"
            )},
            {"role": "result", "content": (
                "function concatenate<T>(array1: T[], array2: T[] | undefined): T[] {\n"
                "    if (array2 === undefined) return array1;\n"
                "    return array1.concat(array2);\n"
                "}"
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>Found both the declaration and implementation. It's a generic TypeScript function that concatenates two arrays. The second parameter is optional (can be undefined). If undefined, it returns the first array unchanged. Otherwise uses Array.concat. I have everything needed.<|end|>\n"
                "<|evidence|>`concatenate<T>` is a TypeScript utility function:\n"
                "- Signature: `concatenate<T>(array1: T[], array2: T[] | undefined): T[]`\n"
                "- Generic over type T β€” accepts arrays of any type\n"
                "- If `array2` is `undefined`, returns `array1` unchanged (no-op)\n"
                "- Otherwise returns `array1.concat(array2)` (standard Array.concat)\n"
                "- Exported as a public function<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
    # ─── Trace 5: Search with irrelevant results (Rust) ───────────────────
    {
        "query": "How is error handling done in the Rust codebase?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "How is error handling done in the Rust codebase?"},
            {"role": "assistant", "content": (
                "<|reasoning|>Error handling in Rust typically uses Result types. Let me search for Result usage and error types.<|end|>\n"
                "<|search|>Result error handling<|end|>"
            )},
            {"role": "result", "content": (
                "pub fn parse_config(input: &str) -> Result<Config, ParseError> {\n"
                "    let parts: Vec<&str> = input.split_whitespace().collect();\n"
                "    if parts.len() < 2 {\n"
                "        return Err(ParseError::TooFewArguments);\n"
                "    }\n"
                "    Ok(Config { query: parts[0].to_string(), filename: parts[1].to_string() })\n"
                "}"
            )},
            {"role": "result", "content": (
                "use std::fmt;\n"
                "\n"
                "pub enum ParseError {\n"
                "    TooFewArguments,\n"
                "    InvalidSyntax,\n"
                "}\n"
                "\n"
                "impl fmt::Display for ParseError {\n"
                "    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n"
                "        match self {\n"
                "            ParseError::TooFewArguments => write!(f, \"too few arguments\"),\n"
                "            ParseError::InvalidSyntax => write!(f, \"invalid syntax\"),\n"
                "        }\n"
                "    }\n"
                "}"
            )},
            {"role": "result", "content": (
                "mod tests {\n"
                "    #[test]\n"
                "    fn test_basic() {\n"
                "        assert_eq!(2 + 2, 4);\n"
                "    }\n"
                "}"
            )},
            {"role": "assistant", "content": (
                "<|reasoning|>Result 1 shows a function returning Result<Config, ParseError> with early return on error. Result 2 shows the ParseError enum with Display impl. Result 3 is an unrelated test β€” not relevant. I have enough to answer.<|end|>\n"
                "<|evidence|>Error handling pattern in this Rust codebase:\n"
                "- Uses `Result<T, E>` for fallible operations\n"
                "- Custom error type: `ParseError` enum with variants (TooFewArguments, InvalidSyntax)\n"
                "- Implements `std::fmt::Display` for human-readable errors\n"
                "- Early return pattern: `return Err(ParseError::...)` on validation failure\n"
                "- Success path: `Ok(Config { ... })`\n"
                "- No use of `unwrap()` or `expect()` in the found code β€” proper error propagation<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
    # ─── Trace 6: No results found ────────────────────────────────────────
    {
        "query": "Where is the database connection pool implemented?",
        "trace": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": "Where is the database connection pool implemented?"},
            {"role": "assistant", "content": (
                "<|reasoning|>Looking for database connection pool implementation. Let me search for relevant terms.<|end|>\n"
                "<|search|>database connection pool<|end|>"
            )},
            {"role": "result", "content": ""},
            {"role": "assistant", "content": (
                "<|reasoning|>No results found for 'database connection pool'. Let me try broader terms.<|end|>\n"
                "<|search|>pool db<|end|>"
            )},
            {"role": "result", "content": ""},
            {"role": "assistant", "content": (
                "<|reasoning|>Still no results. The codebase does not appear to contain a database connection pool implementation.<|end|>\n"
                "<|evidence|>No database connection pool implementation was found in the codebase. Searched for: 'database connection pool', 'pool db'. The indexed code may not include database layer code.<|end|>\n"
                "<|finish|>"
            )},
        ],
    },
]


def main():
    print(f"Writing {len(GOLD_TRACES)} gold-standard traces to {GOLD_PATH}...")
    with open(GOLD_PATH, "w", encoding="utf-8") as f:
        for trace in GOLD_TRACES:
            f.write(json.dumps(trace) + "\n")

    print(f"Done. {len(GOLD_TRACES)} traces written.")

    # Print summary
    for i, trace in enumerate(GOLD_TRACES):
        query = trace["query"]
        n_steps = len([m for m in trace["trace"] if m["role"] == "assistant"])
        n_searches = len([m for m in trace["trace"] if m["role"] == "assistant" and "<|search|>" in m["content"]])
        n_results = len([m for m in trace["trace"] if m["role"] == "result"])
        print(f"  Trace {i+1}: '{query[:50]}...' | {n_steps} agent turns | {n_searches} searches | {n_results} results")


if __name__ == "__main__":
    main()