本書は /app/reviewer (HR / Compliance Reviewer cockpit) の Round 1 設計提案。
Stage 1 researcher が 7 reference (Linear Triage / Stripe Disputes / GitHub PR Review / Zendesk Agent Home / HITL Guide / SaaS Workflow Gist / Vercel Deployments) から抽出した 5 強信号パターン (A: Count-First Queue / B: Staged State Machine / C: Reason Code / D: Visibility Boundary / E: Notification → Deep Link) を、 Kashi canon (permanent-ui-principles §3 §4 §6 §7 §8 §9 §11 §13 + DATA_VISIBILITY_MATRIX §3 §4 §7 + CANONICAL_PRODUCT_TRUTH §2.1) に整合させたうえで 3 variant (保守的 / 中庸 / 大胆) として提示する。
Justine は各 surface で A/B/C のいずれか 1 案を pick。 picked variant のみ Stage 3 mockupper に渡す。
仮説駆動 note: complaints.md が未提供のため、 researcher §1 末尾の仮説不満リスト (doctrine 5 サブ展開 / 4 キュー優先度視覚同重 / count=0 同重表示 / EyeOff surveillance 感 / sticky header 視認性低下) を Justine 不満として扱う。 Round 2 で逐語 feedback が揃えば再校正。
FileSearch に差し替え、 design_system_v1 トークンを通し、 doctrine 5-section を progressive disclosure 化する「衛生 (hygiene) Pass」。
Reviewer が /app/reviewer に到達 → 4 つの human-review queue (Disputes / Severity Exceptions / Manager Context Submissions / Inconclusive Grace Evaluations) の pending count を一望 → 担当が必要な queue にナビゲートする。
┌───────────────────────────────────────────────────────────────┐ │ PortalHeader (sticky, evergreen bg, role=Reviewer) │ ├───────────────────────────────────────────────────────────────┤ │ [eyebrow] HR / COMPLIANCE REVIEWER COCKPIT │ │ Human Review Queues │ │ ───── │ │ 4 件の human-review queue を割り当てられた scope の中で確認。 │ │ あなたの閲覧行為は対象者の audit log に記録されます。 │ │ ↳ [▸ 詳しい governance doctrine を読む] (折りたたみ) │ ├───────────────────────────────────────────────────────────────┤ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ [Scale] 12 │ │ [Flag] 3 │ │ │ │ Disputes │ │ Severity Exceptions │ │ │ │ 異議申立の queue │ │ 重大度例外の queue │ │ │ │ → 詳しく見る │ │ → 詳しく見る │ │ │ └──────────────────────┘ └──────────────────────┘ │ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ [MessageSquare] 5 │ │ [FileSearch] 0 │ ← dim │ │ │ Manager Context │ │ Grace Evaluations │ │ │ │ 文脈提出の queue │ │ 暫定期間判定未了 │ │ │ │ → 詳しく見る │ │ pending 0 件 │ │ │ └──────────────────────┘ └──────────────────────┘ │ ├───────────────────────────────────────────────────────────────┤ │ [footer] このページの閲覧範囲は割り当てられたミーティングのみ。 │ │ 他チーム / 全社俯瞰は閲覧できません。 │ └───────────────────────────────────────────────────────────────┘
| Pattern | Reference | Variant A での適用 |
|---|---|---|
| A. Count-First Queue Cards | R1, R2, R4, R7 | 現行構造維持。 ただし count=0 カードを opacity-60 + 数字を text-stone-400 から text-grade-blocked (#6B7280) に変更し視覚デエンファシス。 |
| D. Compact Visibility Boundary | R2, R3, R4, R5 | 現 ReviewerCockpitDoctrineSection の 5 サブコンポーネントを <details> 内に格納。 default visible は 2 行 (visibility scope + audit log 通知の事実)。 |
--kashi-border (#E5E7EB) / Card bg = --kashi-paper / Count number = --kashi-ink (active) or --kashi-grade-blocked (count=0) / hover border = --kashi-evergreen--text-h1 (40px/48px) / Card title = --text-h4 (20px/28px) / Count = display-scale (48px, custom token within range) / eyebrow = --text-caption (12px) + tracking-[0.04em] (not 0.3em — r19 §6.4 fix)--space-5 (24px) / Card inner padding = --space-5 (24px) / Section block separation = --space-8 (48px)--radius-md (8px)FileSearch (文書を確認する metaphor、 監視 metaphor 排除)<details> 内に折りたたみ。 default = 2 行 boundary note + 4 queue cards + 1 footer。| Role | このページで見えるもの | 見えないもの |
|---|---|---|
| HR Reviewer (admin / hr_compliance / restricted_investigator) | 4 queue の pending count (assigned scope 内 aggregate)。 individual identity は出ない。 | 他チーム queue 一覧 / 全社俯瞰 / raw transcript / 名前付き個別 alert (これらは queue 内側でも canon 範囲内のみ)。 |
Audit log 動作: このランディングページの単純閲覧自体は (queue count aggregate のみのため) /app/me/audit への row 追加なし。 queue の個別ページに drill-down した瞬間に audit row 発生 (既存挙動を変更しない)。
<details>) で 2 行に圧縮、 必要な reviewer のみ展開。FileSearch (文書確認 metaphor) に差し替え、 §13 違反解消。/app/me 側の課題)。変更範囲は app/reviewer/page.tsx + ReviewerCockpitDoctrineSection.tsx の visual + structural 微調整のみ。 IA 変更なし、 ルート変更なし、 visibility ルール変更なし、 DB 変更なし。 1 PR で完結可能。 ~4-8h 想定。
Reviewer が /app/reviewer に到達 → 「今 attention を要する queue の中で最も古い 1 件」がどれかを 1 スクリーンで把握 → そのまま queue 個別ページへ deep link。 4 queue を等価に並べるのではなく、 active な (count > 0) queue を上位に、 各 queue card 直下に scope-safe ミニサマリー (evidence grade badge + reason code + meeting count + earliest pending date) を inline で表示。
┌───────────────────────────────────────────────────────────────┐ │ PortalHeader (sticky, evergreen bg, role=Reviewer) │ ├───────────────────────────────────────────────────────────────┤ │ [eyebrow] HR / COMPLIANCE REVIEWER COCKPIT │ │ あなたの Review Queue │ │ assigned scope: 12 meetings / 4 queue lanes / window: 30 日 │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ⓘ あなたの閲覧行為は対象者の audit log に即時記録されます │ │ │ │ [▸ 詳しい visibility & decision doctrine] │ │ │ └─────────────────────────────────────────────────────────┘ │ ├─ ACTIVE QUEUES ───────────────────────────────────────────────┤ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ [Scale] 12 pending Disputes │ │ │ │ ───── │ │ │ │ next-actionable (oldest): 4 日前提出 │ │ │ │ evidence grade: [EMERGING] reason: PRESSURE_PATTERN │ │ │ │ scope: 3 meetings / dyad bounded │ │ │ │ 取り得る決定: 受理 / 却下 / 追加情報を要求 / エスカレーション │ │ │ │ → このキューを開く │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ [Flag] 3 pending Severity Exceptions │ │ │ │ next-actionable: 1 日前 [WEAK] reason: INSUFFICIENT_WIN │ │ │ │ scope: 1 meeting / single observed window │ │ │ │ 取り得る決定: 例外承認 / 標準処理に戻す / 追加情報を要求 │ │ │ │ → このキューを開く │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ [MessageSquare] 5 pending Manager Context Submissions │ │ │ │ next-actionable: 6 時間前 scope: 2 meetings │ │ │ │ 取り得る決定: context を受理 / 不十分として返却 / 質問追加 │ │ │ │ → このキューを開く │ │ │ └─────────────────────────────────────────────────────────┘ │ ├─ INACTIVE QUEUES (count = 0) ──────────────────────────────── │ │ ▸ Grace Evaluations (0) [展開] │ └───────────────────────────────────────────────────────────────┘
| Pattern | Reference | Variant B での適用 (canon-adapted) |
|---|---|---|
| A. Active-First Count Queue | R1, R2, R4, R7 | count > 0 queue を上位、 count = 0 は折りたたみ section に分離。 R1 Linear Triage / R4 Zendesk Agent Home パターン (researcher §3 Pattern A) を Kashi に直接適用、 ただし Linear の "Auto-apply" 提案系は NG (researcher §5 4th item)。 |
| B. Staged State + Named Decision Options | R1, R2, R3, R5 | 各 queue card 内に 「取り得る決定: ◯ / △ / × / エスカレーション」を inline 表示 (実行 UI は queue 個別ページに deep link)。 ただし "No issue" / "All clear" ラベルは禁止 (researcher §5 2nd item、 §6 No-Signal Rule)。 「受理」 = "No qualifying signal confirmed in this observed window" を意味する canon-approved wording に内部紐付け。 |
| C. Reason Code Surfacing | R2, R3, R5, R6 | next-actionable 1 件の reason code (例 PRESSURE_PATTERN / INSUFFICIENT_WIN) を card 内に表示。 reason-code-registry.ts bilingual ラベル既存を流用。 long free-form なし、 構造化コードのみ。 |
| D. Compact Visibility Boundary | R2, R3, R4, R5 | ヘッダー下に 1 行の audit log 通知 + 折りたたみ doctrine link。 default visible は scope (12 meetings / 4 queue lanes / window 30 日) のみ。 |
| E. Inline Scope-Safe Preview (NOT hover) | R1, R3, R4, R6 | hover preview ではなく card 内 inline preview として実装。 表示できるのは evidence grade / reason code / meeting count / earliest date のみ。 affected_candidate / source_candidate identity は絶対に出さない (researcher §3 Pattern E の canon-conflict line を厳守、 anti-retaliation §4 違反回避)。 |
--kashi-grade-emerging (#2563EB) / [WEAK] = --kashi-grade-weak (#D97706) / [STABLE] = --kashi-grade-stable (#2F6B4A) — text label と色の併用 (a11y: color-only 禁止)--kashi-font-mono (IBM Plex Mono) / background --kashi-paper-tint / size --text-caption--text-caption uppercase tracking-[0.04em] (§13 eyebrow style 統一)--space-4 (16px) / section block 間 = --space-8 (48px)FileSearch (Grace Evaluations 用、 dim 状態でも §13 違反回避)| Field | Variant B で表示するか | Matrix § での根拠 |
|---|---|---|
| queue pending count (assigned scope aggregate) | Y | §3 row "per-meeting structural metrics" Reviewer = Y (in bounded review queue) |
| earliest pending date | Y (scope-safe meta) | §3 row "per-meeting structural metrics" の派生情報、 identity 含まず |
| evidence grade (next-actionable 1 件) | Y | §3 row "evidence grades" — bounded review queue 内 Y |
| reason code (next-actionable 1 件) | Y | §3 row "reason codes" — bounded review queue 内 Y |
| meeting count + scope description | Y | §3 row "per-pair / dyad metrics" — bounded queue 内 Y、 ただし "dyad bounded" 等の抽象表現に留める |
| affected_candidate identity (name / dept) | N | §4 anti-retaliation gate: card preview に identity を出さない。 個別 queue ページに drill-down してから RLS-gated 表示 (audit row 発生) |
| 他チーム queue / 全社俯瞰 | N | §3 "team aggregates" Reviewer = Y(under procedure) のみ。 ランディングには出さない |
Audit log 動作: ランディングページ表示 = aggregate count + scope-safe grade/reason のみのため audit row なし。 「このキューを開く」 click で個別 queue ページに drill-down した瞬間に audit_log row が affected person 側に即時書き込み (既存 RLS 挙動、 変更なし)。
FileSearch 差し替え。page.tsx + ReviewerCockpitDoctrineSection 改修 + 新規 QueueSummaryCard コンポーネント (next-actionable 1 件取得 + grade/reason/scope inline 表示) + reason-code-registry.ts から bilingual ラベル取得 + k-anon suppression ロジック。 DB スキーマ変更なし、 ルート変更なし、 RLS 変更なし。 ~16-24h 想定。
/app/reviewer/disputes 等) は維持するが、 ランディングが「単一の priority queue」に統合される。 既存 reviewer の muscle memory が変わるため、 in-app onboarding tooltip + ヘルプ文章更新が必要。 実装工数は A/B の約 3 倍 + RLS pattern の見直し (queue join view) 必須。
Reviewer が /app/reviewer に到達 → 単一の priority-sorted inbox を見て、 各行の state (pending / in_progress / escalated / closed) + queue type badge (Dispute / Severity / Context / Grace) + scope-safe meta (grade / reason / meeting count / earliest date) を一覧把握 → 行 click で個別 queue ページに deep link (state machine の遷移は個別ページで実行)。
┌───────────────────────────────────────────────────────────────┐ │ PortalHeader (sticky, evergreen bg, role=Reviewer) │ ├───────────────────────────────────────────────────────────────┤ │ [eyebrow] HR / COMPLIANCE REVIEWER COCKPIT │ │ あなたの Review Inbox │ │ assigned scope: 12 meetings / 30 日 window / 4 lane types │ │ ⓘ あなたの閲覧行為は対象者の audit log に即時記録されます │ │ [▸ visibility & decision doctrine] │ ├─ FILTERS (sticky) ─────────────────────────────────────────── │ │ [全て 20] [pending 17] [in_progress 2] [escalated 1] [closed] │ │ [Dispute] [Severity] [Context] [Grace] sort: [oldest first] │ ├─ INBOX (sortable, max 100/page) ──────────────────────────── │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ● pending [Scale] Dispute │ │ │ │ 4 日前 / [EMERGING] / reason: PRESSURE_PATTERN │ │ │ │ scope: 3 meetings / window 14 日 │ │ │ │ → 個別ページで処理する │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ ● pending [Flag] Severity Exception │ │ │ │ 1 日前 / [WEAK] / reason: INSUFFICIENT_WINDOW │ │ │ │ scope: 1 meeting / single observed window │ │ │ │ → 個別ページで処理する │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ ◐ in_progress [MessageSquare] Manager Context │ │ │ │ 6 時間前 / scope: 2 meetings │ │ │ │ note: あなたが昨日 drill-down 済み (audit row 発生済み) │ │ │ │ → 個別ページで続きを処理 │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ ▲ escalated [Scale] Dispute │ │ │ │ 7 日前 / [STABLE] / reason: REPEATED_PATTERN │ │ │ │ scope: 5 meetings / 別 reviewer にエスカレ済み │ │ │ │ → 個別ページで状況を確認 │ │ │ └─────────────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────────────┘
| Pattern | Reference | Variant C での適用 (canon-adapted) |
|---|---|---|
| A. Count-First → Unified Inbox | R1, R2, R4, R7 | R1 Linear Triage "shared inbox" + R4 Zendesk "Your Work" の inbox メタファーを採用、 ただし Kashi では queue 種別を完全に解体しない (各行に queue type badge を残す) — RLS が queue 別 table 構造に依存するため。 Linear の auto-prioritization (AI suggestion) は 採用しない (§1 AI magic NG)。 sort は明示的 user 操作のみ。 |
| B. Unified State Machine | R1, R2, R3, R5 | R5 HITL Guide "New → In review → Approved/Edited/Rejected/Escalated → Resolved" 状態マシンを 4 queue 横断で採用。 Kashi 命名: pending / in_progress / escalated / closed (4 状態のみ、 over-engineering 回避)。 「resolved as no issue」状態は 採用しない (§6 No-Signal Rule)。 closed は「決定が記録された」のみを意味し、 内部内容は queue type ごとの canon-approved wording で表現。 |
| C. Reason Code 統一表示 | R2, R3, R5, R6 | 全行に reason code 表示 (queue 種別不問の統一形式)。 reason-code-registry.ts の bilingual ラベルを横断使用。 |
| D. Filter-as-Visibility-Boundary | R2, R3, R4, R5 | sticky filter row が「あなたの scope = この 20 件のみ」を視覚的に常時宣言。 R4 Zendesk "Your Work" / R7 Vercel filter-by-status 慣例。 visibility boundary doctrine は 1 link 折りたたみに圧縮。 |
| E. Scope-Safe Inline Preview | R1, R3, R4, R6 | 各行に inline preview (grade / reason / meeting count / window)。 hover popover ではなく行内常時表示に変更 (researcher §3 Pattern E の canon-conflict 回避: hover preview だと identity 露出リスクが生じやすい)。 affected_candidate / source_candidate identity は絶対 inbox に出さない。 |
--kashi-grade-emerging (#2563EB) / ◐ in_progress = --kashi-state-info / ▲ escalated = --kashi-grade-weak (#D97706) / ✓ closed = --kashi-grade-stable (#2F6B4A) — color + glyph + text 三重併用 (a11y、 §12)--kashi-paper-tint / 各 badge は同 size, equal visual weight (個別 queue を健康スコア的にランク付けしない)--kashi-paper / border-top --kashi-border / hover bg --kashi-paper-tint / inner padding --space-4 (16px)--kashi-paper / shadow --shadow-sm / 常時 visible (scope 宣言の役割)| Field | Variant C で表示するか | Matrix § での根拠 |
|---|---|---|
| queue type badge (Dispute / Severity / Context / Grace) | Y (各行) | §3 row "notices naming a person (in review queue)" — Reviewer = Y、 ただし person 名は出さず queue type のみ |
| state (pending / in_progress / escalated / closed) | Y | 新規 derived state、 visibility matrix 上の既存 row の派生情報 |
| evidence grade / reason code | Y | §3 row "evidence grades" / "reason codes" — bounded queue 内 Y |
| meeting count + window + scope description | Y | §3 row "per-meeting structural metrics" / "per-pair / dyad metrics" — bounded queue 内 Y、 抽象化表現 |
| "あなたが昨日 drill-down 済み" note (in_progress 行) | Y (self audit) | §3 row "audit log entries about this person" Reviewer = Y (their own actions)。 これは reviewer 自身の audit 行為履歴であり、 affected person 情報ではない |
| affected_candidate / source_candidate identity | N | §4 anti-retaliation gate: inbox には identity を一切出さない。 個別 queue ページ drill-down 後の RLS-gated 表示のみ。 audit row はそのときに発生 |
| 他 reviewer に escalated された案件の現在の reviewer 名 | N (default) / Y (admin role のみ) | §3 row "audit log entries about this person" は admin = Y (system audit)。 通常 reviewer は「別 reviewer にエスカレ済み」事実のみ閲覧 |
| 他チーム queue / 全社俯瞰 | N | RLS が assigned scope のみを join view に流す。 filter で表示できる選択肢自体に他チームを含めない |
Audit log 動作: inbox 表示 = scope-safe aggregate + grade/reason のみのため audit row なし (Variant B と同じ)。 「個別ページで処理する」 click で drill-down 時に audit_log row 発生。
RLS 改修必要事項 (mockupper への警告): 4 queue を統合 inbox に表示するため、 4 個別 RLS-secured table を join した view (or materialized view) が必要。 RLS 自体は queue 別 table に維持しつつ、 view 層で scope filter + state derivation を行う設計が安全。 RLS test (test/rls/role-expansion) に inbox view 経由のアクセス path を追加必須。 これが「実装工数 L (A/B の 3 倍)」の主因。
/app/reviewer = "あなたの inbox を見る" の 1 アクションに集約。 「inbox に行く」が ポストログイン全体の orchestrator 共通 metaphor となれば、 他 surface (Manager / CEO 等) も同 metaphor で揃えられる可能性 (将来検討)。test/rls/ 全テストを再 audit 必須。 doctrine-modification process (CANONICAL_PRODUCT_TRUTH §8) の発動が必要かもしれない。 → orchestrator / 開発リードに事前確認推奨。
app/reviewer/page.tsx 全面再設計 + ReviewerInbox + InboxRow + InboxFilter + StateBadge 新規 + queue 統合 view (SQL view / RPC) + RLS test 再 audit (test/rls/role-expansion + test/rls/isolation) + doctrine-modification process 確認 + in-app onboarding tooltip + 既存 4 queue 個別ページ ( /app/reviewer/disputes 等) は触らず deep link 先として残置。 ~60-80h 想定 (Variant A/B が ~16-24h)。
各 variant の trade-off:
| Variant | リスク | インパクト | 工数 | 最適な状況 |
|---|---|---|---|---|
| A. 保守的 | 低 | 小〜中 | S (~4-8h) | 「現 IA は OK、 surveillance metaphor (EyeOff) + doctrine 過多 + r19 不整合だけ確実に潰したい」 |
| B. 中庸 | 中 | 中〜大 | M (~16-24h) | 「IA はそのまま、 ただし Reviewer が "今どの queue が attention を要するか" を 1 画面で判断できる構造に変えたい」 |
| C. 大胆 | 高 (RLS 改修) | 大 | L (~60-80h) | 「4 queue 別概念を解体し、 単一の priority inbox に統一したい。 ポストログイン全体の "inbox" メタファー統一の試金石として」 |
Variant B (中庸) を推奨。 理由:
Variant A は「最小コストで surveillance 違反だけ確実に潰す」緊急 hotfix としても価値がある (例: pilot 直前で時間がない場合)。
Variant C は 全 surface 共通の inbox メタファーを Round 2 で議論する場合の参照案として保持。 単独採用は推奨しない。
orchestrator に向けて: pick app-reviewer=A または pick app-reviewer=B または pick app-reviewer=C
全 NG なら: redo proposal app-reviewer <feedback> で translator 再起動。
Generated: 2026-05-27T+09:00 by kashi-ui-translator / Stage 2 of 3 / Inputs: 01_research/app-reviewer__references.html, permanent-ui-principles.md (§1, §3, §4, §6, §7, §8, §9, §11, §13), design_system_v1.md (§1, §2, §3, §4, §7, §8), DATA_VISIBILITY_MATRIX.md (§3, §4, §7), CANONICAL_PRODUCT_TRUTH.md (§2.1, §6), r19-ui-consistency-applicability.md (§4.7, §6.4, §6.5, §8.5).
Read-only on kashi/ source. No code edits.