- Service layer: map rows with deserializeTags to return string[] not JSON string - Frontend: add null guard on item.tags.length to prevent render crash when tags is null Co-authored-by: CodeFree <codefree@chinatelcom.cn>
- createDocument/getDocumentById/listDocuments/updateDocument/deleteDocument - User-level isolation: all queries enforce WHERE userId = ? - listDocuments excludes content field, supports type/keyword/pagination - Auto-generates summary when content > 200 chars - Tags serialized as JSON string - 32 tests covering CRUD, isolation, summary, tags, pagination, keyword search Co-authored-by: CodeFree <codefree@chinatelcom.cn>