## Context The engine's `/api/v1/search` endpoint returns flat result objects: ```json { "chunk_id": 123, "score": 0.031, "text": "...", "chunk_index": 3, "chunk_metadata": {"page": 12, "section_header": "Installation"}, "title": "Git Admin Guide", "doc_type": "pdf", "source_path": "/home/user/docs/git-admin.pdf", "created_at": "2026-03-15T10:30:00", "tags": ["git", "admin"] } ``` The Go client's human-mode struct in `client/cmd/search.go` incorrectly expects a nested `document` object and top-level `page`/`section` fields. This causes all metadata to display as zero values. ## Goals / Non-Goals **Goals:** - Fix the search result struct to match the flat engine response - Extract `page` and `section_header` from `chunk_metadata` for human display - Maintain identical JSON output (already passes through raw response) **Non-Goals:** - Changing the engine API response format - Adding new display fields beyond what was originally intended ## Decisions **Flatten the struct to match API response.** The result struct will have `Title`, `DocType`, `Tags` as top-level fields (matching `title`, `doc_type`, `tags` JSON keys). `ChunkMetadata` will be decoded as `map[string]interface{}` to extract `page` and `section_header` dynamically, since its contents vary by document type. **Why not a typed ChunkMetadata struct?** The metadata keys depend on the ingestion pipeline (PDFs have `page`, markdown has `section_header`, code may have others in future). A map is more resilient to engine-side additions. ## Risks / Trade-offs - [Minimal risk] If the engine adds new top-level fields, the Go struct silently ignores them — this is existing behavior and acceptable for human-mode display.