# Spec 027-UI — Matriz de Acessos (Página Desk)

**Criado:** 2026-06-20  
**Solicitado por:** Roger  
**Status:** 🔄 Preview (read-only, feature flag)  
**Sistema:** Desk VM122 · view `access-matrix`  
**Relacionado:** Spec **027** (matriz) · Spec **004** (cadastro) · `platform_role_catalog.py`

---

## Objetivo

Página visual **estilo Odoo Groups + Permission Matrix** para consultar a matriz de funções Ligbox (VM112 / VM122 / VM123 / externas / agentes), **sem alterar** produção até Roger aprovar as telas.

---

## Princípios de entrega

| Regra | Implementação |
|-------|---------------|
| Zero impacto produção | `ACCESS_MATRIX_UI=0` (default) — menu oculto |
| Preview staging | `ACCESS_MATRIX_UI=1` no compose staging (`:8192`) |
| Só leitura v1 | Sem PATCH de roles/módulos na matriz |
| Fonte de verdade | `platform_role_catalog.py` + tabelas Spec 027 §3 |
| Quem vê | `super_admin` apenas (preview) |
| Não substituir | Página **Equipe Ligbox** (`admin-users`) mantida |

---

## Feature flag

```bash
# .env / docker-compose staging
ACCESS_MATRIX_UI=1   # staging preview
ACCESS_MATRIX_UI=0   # produção (default)
```

API:

```http
GET /api/v1/config/features
→ { "access_matrix_ui": true, "preview_mode": true }

GET /api/v1/rbac/matrix
→ catálogo completo (roles, módulos Desk, bindings, agentes, legenda)
```

---

## Referências UI (modelos a seguir)

### GitHub — RBAC admin / permission matrix

| Repo | O que reutilizar | URL |
|------|------------------|-----|
| **rbac-admin-platform** | Dashboard admin, tabela role×ação, audit, dark mode | https://github.com/bankotij/rbac-admin-platform |
| **RBAC-UI** (jagadish-pattanaik) | `PermissionMatrix.js`, sidebar roles, grouping | https://github.com/jagadish-pattanaik/RBAC-UI |
| **rbac-ui** (balamuruganpm) | User/role tables, collapsible sidebar | https://github.com/balamuruganpm/rbac-ui |

### shadcn/ui blocks (padrão visual da grelha)

| Block | O que reutilizar | URL |
|-------|------------------|-----|
| **Tables Permission Matrix** | Linhas agrupadas por módulo, colunas = roles, badges de nível | https://www.shadcn.io/blocks/tables-permission-matrix |
| **Dashboard Permission Matrix** | Grelha recurso×role, cores none/read/write/admin | https://www.shadcn.io/blocks/dashboard-permission-matrix |

### Odoo (modelo conceptual — não fork)

| Conceito Odoo | Equivalente Ligbox |
|---------------|-------------------|
| `res.users` + `groups_id` | `desk_users.role` + provisionamento VM123 |
| `res.groups` | `PLATFORM_ROLE_CATALOG[*].bindings` |
| `ir.model.access` | `permissions.py` + route guards |
| `ir.rule` (record rules) | mascaramento NOC, ticket assignee |
| Settings → Users → Groups UI | Página Matriz de Acessos |

Docs: https://www.odoo.com/documentation/16.0/developer/reference/backend/security.html

### Desk Ligbox (consistência visual)

- Paleta existente: `styles.css` (`--accent`, `--ok`, `--warn`, `--sidebar-bg`)
- Padrão módulo isolado: `agentic-ops.js` + CSS scoped (`#access-matrix-content`)
- Tabs admin: Equipe Ligbox | Matriz (quando flag ON)

---

## Wireframe (Preview v1)

```
┌─ PREVIEW — read-only · Spec 027 ─────────────────────────────────────┐
│ [ Equipe Ligbox ] [ Matriz de Acessos ● ]                            │
├──────────────┬───────────────────────────────────────────────────────┤
│ Funções      │ [ VM122 Desk ] [ VM112 ] [ VM123 ] [ Externas ] [A0-A7]│
│ ─────────    │                                                       │
│ ▶ Ops        │  Grelha módulo × função (✅ 🔒 ❌ ⚙️ 🔗)              │
│   super_admin│  ou painel bindings por serviço (Odoo groups)         │
│   ops_lead   │                                                       │
│ ▶ Comercial  │  Ao seleccionar função → detalhe bindings:            │
│   sales_admin│    vm123_odoo: sales_team.group_sale_manager          │
│   …          │    vm123_foss: ligbox-sales-admin                      │
└──────────────┴───────────────────────────────────────────────────────┘
```

---

## Fases

### Fase UI-A — Preview (esta entrega) ✅

- [x] Spec UI (este documento)
- [x] `GET /api/v1/rbac/matrix` read-only
- [x] `GET /api/v1/config/features`
- [x] `access-matrix.js` + CSS scoped
- [x] Flag staging ON, produção OFF
- [x] Tab **Software em escopo** (VM112 / VM123 / consolas externas — Spec 027 §2, §4, §5)
- [x] Cartão por função (resumo SW ≠ none)
- [ ] Roger aprova layout

### Fase UI-A2 — Melhorias sugeridas (backlog)

| Melhoria | Descrição | Prioridade |
|----------|-----------|------------|
| **Visão unificada** | Uma grelha Desk + SW (coluna «camada»: Desk / VM112 / VM123 / Externa) | Alta |
| **Deep-links activos** | Clicar 🔗 abre URL do serviço (Traefik, OpenPanel, etc.) se binding existir | Alta |
| **Diff vs. realidade** | Comparar matriz Spec 027 com `desk_users.role` + último login por SW | Média |
| **Export CSV/PDF** | Matriz completa para auditoria / onboarding | Média |
| **Filtro por produto** | Chips FOSSBilling, Odoo, OpenPanel, Carbonio… | Baixa |
| **Contas sistema** | Linha 🤖 `api_service` / agentes com credenciais mascaradas | Baixa |
| **Histórico** | Quem alterou role e quando (audit log Spec 004) | Futuro |

### Fase UI-B — Pós-aprovação

- Tab integrada em Administradores (sem flag)
- Export CSV/PDF da matriz
- Link «Ver matriz» no drawer Equipe

### Fase UI-C — Edição Agentics ✅ (staging)

- [x] Tabela SQLite `agent_role_bindings` + `agent_governance_caps`
- [x] `PATCH /api/v1/rbac/agent-bindings` (UI / focus / approve)
- [x] `PATCH /api/v1/rbac/agent-governance` (caps globais)
- [x] `GET /api/v1/rbac/agent-bindings/audit`
- [x] Enforcement API Agentics (`can_use_agentics_ui`, `can_chat_agent`, `can_trigger_runs`)
- [x] Toggles UI / OP / AP na matriz (flag `ACCESS_MATRIX_EDIT=1`)
- [x] Bindings A7→agentic_operator **locked** (Spec FR-027-007)
- [ ] Roger valida em staging → activar produção

---

## Critérios de aceite (Preview)

- [ ] Produção (`8091`): menu Matriz **invisível** com flag default
- [ ] Staging (`8192`): Roger vê Matriz como `super_admin`
- [ ] Página é 100% read-only (sem POST/PATCH)
- [ ] Dados batem com Spec 027 §3–6 e `platform_role_catalog.py`
- [ ] Equipe Ligbox / Mensagens / cadastro **inalterados**

---

*Roger — revisar em http://10.10.10.122:8192 após deploy staging.*
