feat(knowledge): add selective share and promote UI - #2065
Conversation
There was a problem hiding this comment.
Pull request overview
Knowledge の selective immutable share と、Chat 上の knowledge-share card 表示・選択 reply の promote(synthesis 化)を既存 UI に接続し、Additive な label-assignment 参照 API も追加する PR です(#2015)。
Changes:
- Room Chat に immutable knowledge-share card の描画と promote UI(thread 内)を統合
- Knowledge Hub に「Chatへ共有」タブ+knowledge_item deep link の受け口を追加
- Additive API
GET /knowledge/items/{id}/label-assignmentsと、関連 adapter / use case / OpenAPI / テストを追加(+ SQL aliasgrant修正)
Reviewed changes
Copilot reviewed 47 out of 50 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/frontend/src/sections/RoomChat.tsx | knowledge-share 統合 hook / presentation helper の導入と thread 側への promote renderer 注入 |
| packages/frontend/src/sections/RoomChat.test.tsx | RoomChat における knowledge-share card 置換の統合テスト追加(hook mock) |
| packages/frontend/src/sections/room-chat/RoomMessageList.tsx | message body の描画に knowledge-share renderer を差し込めるよう拡張 |
| packages/frontend/src/sections/room-chat/ChatThreadPanel.tsx | thread root に knowledge-share renderer を差し込み、promote UI を thread 下部に追加可能に |
| packages/frontend/src/sections/room-chat/RoomKnowledgeShareIntegration.tsx | timeline/thread の root 群から share card を読み、card 描画と promote launcher を提供 |
| packages/frontend/src/sections/room-chat/RoomKnowledgeShareIntegration.test.tsx | visible root selection(100件上限・opened thread 優先)のユニットテスト追加 |
| packages/frontend/src/sections/room-chat/useRoomKnowledgeShares.ts | room 内で見えている root だけを対象に summary → card を安全に解決する hook を追加 |
| packages/frontend/src/sections/room-chat/useRoomKnowledgeShares.test.tsx | 取得の並列数制限、purge、fail-closed、100件超入力などのテスト追加 |
| packages/frontend/src/sections/room-chat/KnowledgeShareCard.tsx | selected-only 表示・revoked placeholder・source-open(安全化)を持つカード UI を追加 |
| packages/frontend/src/sections/room-chat/KnowledgeShareCard.test.tsx | カードの表示・選択カテゴリガード・source-open の安全化/abort のテスト追加 |
| packages/frontend/src/sections/room-chat/KnowledgeThreadPromotionDialog.tsx | 選択 reply を preview/confirm して synthesis 化する dialog 実装 |
| packages/frontend/src/sections/room-chat/KnowledgeThreadPromotionDialog.test.tsx | promote の選択/順序/confirm/abort/サニタイズ等のテスト追加 |
| packages/frontend/src/sections/room-chat/roomChatPresentation.tsx | RoomChat の markdown body 描画・リンクコピー・サマリー構築を helper 化 |
| packages/frontend/src/sections/room-chat/roomChatApi.ts | fetchChatRooms が RequestInit(signal 等)を受け取れるよう拡張 |
| packages/frontend/src/sections/KnowledgeHub.tsx | erp4_open_entity で knowledge_item を開く deep link 対応、SharePanel へ snapshots を供給 |
| packages/frontend/src/sections/KnowledgeHub.test.tsx | knowledge_item deep link を受けて item を開くテスト追加 |
| packages/frontend/src/sections/knowledge-hub/KnowledgeProvenanceWorkspace.tsx | provenance workspace に「Chatへ共有」タブを追加 |
| packages/frontend/src/sections/knowledge-hub/KnowledgeProvenanceWorkspace.test.tsx | 4タブ化と SharePanel 表示のテスト追加 |
| packages/frontend/src/sections/knowledge-hub/KnowledgeSharePanel.tsx | selective share の preview/commit/reconcile/revoke を UI として統合 |
| packages/frontend/src/sections/knowledge-hub/knowledgeSharePanelHelpers.ts | share panel 用の候補マージ/表示ラベル/unsafe 文字判定 helper を追加 |
| packages/frontend/src/sections/knowledge-hub/knowledgeProvenanceApi.ts | provenance API 群に AbortSignal をフォワード可能に拡張 |
| packages/frontend/src/sections/knowledge-hub/knowledgeProvenanceApi.test.ts | AbortSignal フォワードのテスト追加 |
| packages/frontend/src/sections/knowledge-hub/knowledgeHubApi.ts | getKnowledgeItem(deep link 用)を追加 |
| packages/frontend/src/sections/knowledge-hub/knowledgeHubApi.test.ts | getKnowledgeItem の encode と allowlist 正規化のテスト追加 |
| packages/frontend/src/sections/knowledge-share/knowledgeShareApi.ts | share/promotion/label-assignments/read 系の API boundary(safe error + allowlist 正規化)を追加 |
| packages/frontend/src/sections/knowledge-share/knowledgeShareApi.test.ts | API boundary の allowlist / safe error / topology binding のテスト追加 |
| packages/frontend/src/sections/knowledge-share/knowledgeShareModel.test.ts | request/response 正規化・binding・拒否条件のテスト追加 |
| packages/frontend/src/pages/App.tsx | deep link kind knowledge_item を knowledge-hub セクションへルーティング |
| packages/frontend/src/pages/App.test.tsx | knowledge_item deep link の dispatch テスト追加 |
| packages/frontend/e2e/frontend-knowledge-share-promote.spec.ts | 実 backend E2E(share card / ACL / omitted field / promote)追加 |
| packages/frontend/coverage-thresholds.json | 追加コンポーネント/境界を coverage 対象へ追加 |
| packages/backend/src/routes/knowledgeLabels.ts | GET /knowledge/items/:id/label-assignments を additive に追加 |
| packages/backend/src/application/knowledge/knowledgeLabelUseCases.ts | label assignment selection の use case(404 正規化・100件上限)追加 |
| packages/backend/src/application/knowledge/knowledgeLabelPorts.ts | selection option 型と read repository port を追加 |
| packages/backend/src/adapters/knowledge/prismaKnowledgeLabelAdapter.ts | item ACL + label 可視性を組み合わせた selection 読み取りを実装 |
| packages/backend/src/adapters/knowledge/prismaKnowledgeShareAdapter.ts | raw SQL の予約語 alias grant を item_grant に修正 |
| packages/backend/test/knowledgeLabelUseCases.test.js | selection use case の 404 正規化/上限/actor 伝播テストを追加 |
| packages/backend/test/knowledgeLabelRoutes.test.js | label-assignments route の allowlist 返却/404 正規化テストを追加 |
| packages/backend/test/knowledgeLabelPrismaAdapter.test.js | selection 読み取りの predicate / bound / null 正規化テストを追加 |
| docs/api/openapi.json | label-assignments endpoint を OpenAPI に追加 |
| docs/manual/README.md | Knowledge Hub マニュアルのスコープ更新 |
| docs/manual/knowledge-hub.md | selective share / promote の操作手順と注意点を追記 |
| docs/manual/chat-guide.md | knowledge-share card と promote の利用ガイド追記 |
| docs/test-results/README.md | #2015 証跡リンクを追加 |
| docs/test-results/2026-08-10-issue2015-knowledge-share-promote-ui.md | #2015 検証記録(UI/E2E/安全性)を追加 |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 49 out of 52 changed files in this pull request and generated no new comments.
Suppressed comments (1)
packages/frontend/src/sections/room-chat/KnowledgeShareCard.tsx:75
<dl>の子要素としてdt/ddをdivでラップしていますが、dlの直接の子要素として許可されるのはdt/dd(他にscript/template)のみのため、HTML セマンティクスが崩れて支援技術での読み上げが不安定になる可能性があります。SelectedFieldはFragmentでdt/ddを直接返す形にしてください。
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 54 changed files in this pull request and generated no new comments.
Suppressed comments (2)
packages/frontend/src/sections/room-chat/KnowledgeThreadPromotionDialog.tsx:219
contextKeyがroot/knowledgeShareのオブジェクト全体をJSON.stringifyしており、本文やカード内容を含む大きなオブジェクトを毎回シリアライズするためレンダリングコストが増えます。プレビュー/確定の整合性確認に必要な最小限の安定キー(roomId/root.id/shareId/version/status/activeReplyKey 等)に絞って組み立てると、意図も明確になりパフォーマンスも改善します。
packages/frontend/src/sections/room-chat/KnowledgeThreadPromotionDialog.tsx:691aria-labelledby/aria-describedbyに固定ID(knowledge-thread-promotion-*)を使っているため、同ダイアログが並行して2つ以上開かれる(あるいはテスト/将来のUI変更で複数マウントされる)と DOM 内で ID が重複し、支援技術での関連付けが壊れます。useId()などでインスタンス固有IDを生成し、見出し/説明/各セクションのidとaria-*参照を同じ値で結び直してください。
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 54 changed files in this pull request and generated no new comments.
Suppressed comments (2)
packages/frontend/src/sections/RoomChat.tsx:140
knowledgeCommitBusy中はcreatePrivateGroup/createDm/postMessageなどがroomNavigationBlockedRefで早期returnする一方、UI 側はrootPostBlocked(root投稿だけ)でdisabled判定している箇所が残っているため、ボタン等が有効に見えるのにクリックしても何も起きない状態になります。rootPostBlockedをroomNavigationBlockedと同じ条件にして、disabled状態とガード条件を一致させてください。
const rootPostBlocked = rootPostLifecycle !== 'idle';
packages/frontend/src/sections/knowledge-hub/knowledgeSharePanelHelpers.ts:54
hasUnsafeKnowledgeShareNoteCharacterが呼ばれるたびにnew Set([...])を生成しており(入力バリデーション等で繰り返し呼ばれると)不要な割り当てになります。方向制御コードポイントのSetはモジュール定数にして再利用してください。
Exact-head independent review recordExact head:
Reviewer-side focused evidence included RoomChat 62/62 and the promotion-commit focused path. Parent exact-head evidence additionally includes frontend 104 files / 793 tests, focused UI 71/71, UI-core coverage gate, and real PostgreSQL/browser |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 54 changed files in this pull request and generated no new comments.
Suppressed comments (1)
packages/frontend/src/sections/room-chat/KnowledgeThreadPromotionDialog.tsx:349
useEffect(() => resetDialog(), [contextKey, open])が commit 中も無条件に実行されるため、スレッドの返信追加などでcontextKeyが変化した場合にcommitInFlightRef/busy 状態がリセットされ、非中断コミットの所有権(ダイアログを閉じない/遷移しない)を失う可能性があります。commit 中はコンテキスト変化でリセットしないようガードしてください。
|
@copilot review |
|
CI remediation: UI coverage実行で検出された snapshot 保存後の非同期描画raceを、公開accessible roleを |
The current branch has only test/E2E fix commits (
No blocking or non-blocking concerns on the test-only delta. |
Final exact-head independent review recordExact head:
required CI と |
Exact-head gate and cooling start
Cooling start: Cooling中も head/base/check/review/thread を再取得し、変更またはactionable findingがあればgateをリセットします。 |
対象
背景・目的
Knowledge の selective immutable share、Chat の knowledge-share card、選択 reply の Knowledge synthesis promotion を既存 Knowledge Hub / Room Chat UI へ接続します。共有は元 Knowledge ACL の移譲ではなく、room 利用者が閲覧できるのは共有時に固定した選択済み snapshot のみです。
実装概要
Chatへ共有パネルを追加GET /knowledge/items/{id}/label-assignmentsgrantの構文問題をitem_grantへ修正設計上の判断
契約変更
GET /knowledge/items/{id}/label-assignmentsを additive に追加後方互換性・ロールバック
Security / Privacy
useId()に置換しました。promotion context key は exact card/reply変更時の fail-closed invalidationを維持しつつ、useMemoで大きなobjectの毎render serializationを避けました。確定中は内部guardだけでなくRoom作成・投稿・ACK等のcontrolもdisabledに揃え、共有者メモの方向制御文字Setはmodule定数として再利用します。検証
Exact head:
c2f6d14d3fc22636c89c4b6060b983ea7c927d1bRELEASE_E2E_SCOPE=core make release-readiness: PASSfindByRoleで待機。対象case 20/20、UI core coverage 104 files / 793 tests PASSmake lint: PASSmake format-check: PASSmake typecheck: PASSmake build: PASSmake test: PASSmake audit: PASS(backend/frontend high audit 0)make ops-quality: PASSgit diff --check: PASS31391418331/ PR31391421907/ CodeQL31391422005/ Link Check31391419135,31391421952PASS証跡
未実施範囲
GitHub の既存 Dependabot alerts は本 PR へ混在させていません。repository lockfile に対する
npm audit --audit-level=highは backend/frontend とも 0 vulnerabilities です。