Name: viin_brain: P3–P12 buildout + WI-14 UI panels (9 sprints — viindoo-brain v17 campaign)

State: Failed finished in 19m

PR State: merged

PR Author: David Tran

PR Author Email:

PR: #8

Committer: David Tran

Committer Email: david.tran@tvtmarine.com

Commit: 13814b83598c3c43e38230207eabc850106044e7

Description:

                                            [ADD] viin_brain: WI-14 — UI panels (AI attribution badge + Graph panel + AI Review + filters)

Backend (viin_brain/models/viin_brain_page.py):
- action_ai_review_approve / action_ai_review_reject — record reviewer id + timestamp
- _check_ai_review_permission — vault editor/admin role guard (raises AccessError)
- brain_get_current_user_role — return 'admin'/'editor'/'commenter'/'viewer'/'viewer' (default)
- write() override — auto-flip ai_review_status=pending_review → human_modified on human content edit (skip when brain_agent_id context set, skip when caller wrote status explicitly)

Backend (viin_brain/models/viin_brain_database_view.py):
- brain_get_database_rows: new optional filters dict; filters.is_ai_authored restricts rows to AI-authored pages

New OWL components:
- AiAttributionBadge (3 files) — '✦ AI' chip + hover CSS tooltip with 5 rows (agent / confidence / trace / status / reviewer)
- GraphPanel (3 files) — tab inside BacklinkPanel: incoming (depth=1), outgoing (depth=2 nested via via_link_ids heuristic), siblings (same parent_id). ACL honored automatically via ORM
- AiReviewPanel (3 files) — tab inside BacklinkPanel: Approve / Reject buttons, role-guarded (only editor/admin can click), status + agent + confidence + reviewer meta

UI integration:
- BacklinkPanel: import GraphPanel + AiReviewPanel, add Graph tab (always) + AI Review tab (only when isAiAuthored), load is_ai_authored + parent_id in _loadBacklinks
- PageEditor: register AiAttributionBadge, include AI fields in page read, render badge in title row
- VaultSidebar: new '✦ AI' filter pill (mode=ai_authored), handle in _loadFilteredPages + empty-state message
- DatabaseView: toolbar toggle '✦ AI' (filterAiAuthored state), passes filters dict to brain_get_database_rows

Manifest:
- Register new components (SCSS + JS + XML) before page_editor + backlink_panel
- Register viin_brain_graph_panel_tour.js in web.assets_tests

Tests:
- TestAiReviewWorkflow (9 cases): approve/reject/admin-can-approve/viewer-cannot/commenter-cannot/human-modified/approved-stays/agent-edit-skips/role-helper
- Tour viin_brain_graph_panel_tour.js (AC-17): seed incoming + outgoing edges via wikilinks, verify tab renders both sections

Note: manually implemented (Option B) after /coder subprocess hit systematic
write-target drift pattern (pattern doc:
knowledge/viinforge/patterns/failure-2026-04-20-coder-writes-to-ai17-main-via-doc-refs.md).
BA_REVIEW + PLAN artifacts from /coder subprocess retained (acceptance_criteria.md +
implementation_plan.md) as design source.
                                            

Branch: 17.0

Instance ID: 0

Age:

Up-time: