docs(fb-42): wire schema + README + SMOKE + design + SKILL + INDEX
- Add bulk_search_item.v1 + bulk_search_response.v1 wire schemas
- Register both in WIRE_SCHEMAS const
- README: --bulk flag mention + MCP tool list 7→8 (bulk_search)
- SMOKE: bulk multi-query walkthrough (CLI + MCP equivalent)
- Design §2.2: Bulk multi-query (fb-42) subsection (additive minor)
- SKILL: mcp__kebab__bulk_search section + tool table row
- Task spec status open→completed, banner replaced
- INDEX: fb-42 row 머지 (rerank hint deferred)
- Fix: missed Capabilities {bulk_search} in cli wire.rs test (Task 7 leftover)
- Fix: missed tools.len() 7→8 in cli_mcp_smoke (Task 5 leftover)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -222,6 +222,23 @@ kebab --config /tmp/kebab-smoke/config.toml schema --json | jq .stats
|
||||
|
||||
Look for: `media_breakdown` (5 keys), `lang_breakdown`, `index_bytes`, `stale_doc_count`.
|
||||
|
||||
### Bulk multi-query (fb-42)
|
||||
|
||||
Stdin ndjson으로 N query 한 번에:
|
||||
|
||||
```bash
|
||||
printf '{"query":"rust","mode":"lexical"}\n{"query":"async","mode":"lexical"}\n' \
|
||||
| kebab --config /tmp/kebab-smoke/config.toml search --bulk --json
|
||||
```
|
||||
|
||||
stdout: per-query ndjson (`bulk_search_item.v1`). stderr: `bulk_summary: total=2 succeeded=2 failed=0`.
|
||||
|
||||
MCP tool 동등:
|
||||
|
||||
```json
|
||||
{"name":"kebab__bulk_search","arguments":{"queries":[{"query":"rust"},{"query":"async"}]}}
|
||||
```
|
||||
|
||||
## P6-4 이미지 ingestion 옵션
|
||||
|
||||
`config.toml` 에 다음 절을 추가하면 `kebab ingest` 가 `**/*.png` / `**/*.jpg` 등 이미지 자산도 함께 색인합니다 (텍스트만 색인하려면 생략):
|
||||
|
||||
@@ -245,6 +245,12 @@ normalize: rrf_score = raw_rrf / (2 / (k_rrf + 1))
|
||||
|
||||
`score_kind` 는 wire schema v1 에 **optional** 필드로 추가 (additive, backwards-compat). 누락 시 historical default `rrf` 로 해석.
|
||||
|
||||
#### Bulk multi-query (fb-42)
|
||||
|
||||
`kebab search --bulk` (stdin ndjson) + `mcp__kebab__bulk_search` tool 신규. agent 가 N sub-query 한 번에 실행 — query decomposition 시 단일 round-trip. Cap 100 per call. Sequential for-loop, App instance 재사용 → 캐시 / embedder cold-start 비용 한 번만.
|
||||
|
||||
Per-query failure 는 `bulk_search_item.v1.error` (error.v1) 에 격리, 다른 query 계속 진행. wire shape additive minor (`bulk_search_item.v1` + `bulk_search_response.v1` 신규).
|
||||
|
||||
### 2.3 Answer
|
||||
|
||||
```json
|
||||
|
||||
20
docs/wire-schema/v1/bulk_search_item.schema.json
Normal file
20
docs/wire-schema/v1/bulk_search_item.schema.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://kb.local/wire/v1/bulk_search_item.schema.json",
|
||||
"title": "BulkSearchItem v1",
|
||||
"description": "p9-fb-42: per-query result inside a bulk_search response. `response` XOR `error` — exactly one is non-null. `query` is the input echo so consumers can correlate without index tracking.",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "query", "response", "error"],
|
||||
"properties": {
|
||||
"schema_version": { "const": "bulk_search_item.v1" },
|
||||
"query": { "type": "object", "description": "Input echo (verbatim JSON object)." },
|
||||
"response":{
|
||||
"type": ["object", "null"],
|
||||
"description": "search_response.v1 payload on success; null when error is non-null."
|
||||
},
|
||||
"error": {
|
||||
"type": ["object", "null"],
|
||||
"description": "error.v1 payload when this query failed; null on success."
|
||||
}
|
||||
}
|
||||
}
|
||||
24
docs/wire-schema/v1/bulk_search_response.schema.json
Normal file
24
docs/wire-schema/v1/bulk_search_response.schema.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://kb.local/wire/v1/bulk_search_response.schema.json",
|
||||
"title": "BulkSearchResponse v1",
|
||||
"description": "p9-fb-42: MCP envelope for bulk_search. CLI emits raw `bulk_search_item.v1` ndjson without this envelope (summary on stderr).",
|
||||
"type": "object",
|
||||
"required": ["schema_version", "results", "summary"],
|
||||
"properties": {
|
||||
"schema_version": { "const": "bulk_search_response.v1" },
|
||||
"results": {
|
||||
"type": "array",
|
||||
"items": { "type": "object", "description": "bulk_search_item.v1" }
|
||||
},
|
||||
"summary": {
|
||||
"type": "object",
|
||||
"required": ["total", "succeeded", "failed"],
|
||||
"properties": {
|
||||
"total": { "type": "integer", "minimum": 0 },
|
||||
"succeeded": { "type": "integer", "minimum": 0 },
|
||||
"failed": { "type": "integer", "minimum": 0 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user