# V7.3.0 — Wiki / Teamspaces + Polish > **Statut** : ✅ Implémenté (2026-09-29) — 72 tests · suite complète **1016 verts** · **Roadmap** : `ROADMAP.md § v7.3.0` > **Référence Notion** : Wikis + Teamspaces + Verified pages + Charts/Number + réactions/follow/guests + page analytics. > **Existant** : workspaces + rôles, backlinks, wiki-links `[[`, `collection_dashboards`, Chart.js, comments, `site_views`. --- ## 1. Teamspaces + Verified ```sql CREATE TABLE teamspaces ( id INTEGER PRIMARY KEY AUTOINCREMENT, workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, name TEXT NOT NULL, private BOOLEAN NOT NULL DEFAULT 0, UNIQUE(workspace_id, name)); CREATE TABLE teamspace_members (teamspace_id INTEGER NOT NULL REFERENCES teamspaces(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id), role TEXT NOT NULL DEFAULT 'editor', UNIQUE(teamspace_id, user_id)); ALTER TABLE pages ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id); ALTER TABLE collections ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id); CREATE TABLE page_verifications ( page_id INTEGER PRIMARY KEY REFERENCES pages(id) ON DELETE CASCADE, verified_by INTEGER REFERENCES users(id), note TEXT DEFAULT '', verified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP); ``` - `private=1` sans membership → 404 (comme collections restricted) ; `PermissionManager.get_teamspace_role()`. - Badge ✅ (owner/editor vérifie, expiry 90j défaut, job notif owner à J-7) ; filtre `verified:1` en search + palette ; page `/wiki` auto (verified + recents + teamspaces). ## 2. Blocs & charts - Bloc `mermaid` : code → SVG serveur si `mmdc` présent, sinon fallback bloc code + rendu client (déjà Prism) ; export HTML/PDF embarque le SVG. - `equation_inline` : KaTeX inline (lib déjà self-hostée `static/js/katex.min.js`). - Bloc `progress` : `{rollup_ref}` → barre % (réutilise `RollupEngine`). - Charts : type `number` (big KPI), dashboards multi-DB en page (grille `collection_dashboards` + source `any`, limite 200 groupes documentée), « ouvrir la ligne » depuis chart. - **Livré (follow-up)** : `number` = KPI `count|sum|avg|min|max` (`_chart_aggregate`/`_fmt_number`) ; rendu grille `GET /db/{collection_id}/dashboards/{dashboard_id}` — widgets à `collection_id` (= source `any`), ≤ 40 widgets, ≤ 200 lignes/chart (`CHART_MAX_GROUPS`) ; la config de vue est choisie selon le `view_type` demandé (bug corrigé : la première vue était toujours utilisée) ; un widget pointant sur une DB restreinte est sauté (pas de leak). ## 3. Collab polish - `comment_reactions (comment_id, user_id, emoji, UNIQUE)` + picker emoji. - `page_follows (page_id, user_id)` → notif `page.updated` aux followers (pref `follows`, défaut ON si commenté). - **Livré (follow-up)** : `wiki.notify_followers_of_page_update` (throttle 10 min, `actor_id` exclu) branché dans `automations.fire_event` ; `actor_id` dans les payloads `board.update_page`/`save_page_blocks` ; auto-follow à la création d'un commentaire (`wiki.ensure_follow`). - Guests : `guest_shares (page_id, email, token, role viewer|commenter, expires_at)` — accès sans compte via `/g/` (session guest limitée, auditée). - `page_views (page_id, day, views PK)` — même pattern `site_views`, exposé `GET /board/api/pages/{id}/views` (owner only). ## 4. Tests (`tests/test_v73_wiki_polish.py`, 72 ✅) Teamspace private 404/grant, verify badge/expiry/notif, `/wiki` home, blocs mermaid/equation/progress + export, réactions, follow, guest token/expiry, page views. **Follow-ups** : sidebar cross-workspace (sans `workspace_id`), page HTML `/wiki/teamspaces/{id}` (owner 200 / outsider 404 API + non-leak HTML), auto-follow par commentaire, notif `page.updated` throttlée + acteur exclu, `ensure_follow` idempotent, regex + unfurl gitea/github (tokens mockés) + endpoint `/board/api/og/metadata`, KPI `number` + `_chart_values` (0 conservé) + dashboards multi-DB + 404. ## 5. Implémentation réelle vs. design initial - **Livré** : schema §1 à l'identique ; routes sous `/api/v2/wiki/*` (le design parlait de `/wiki` comme page HTML : l'agrégat est exposé en JSON, le front Tri-state reste à faire) ; blocs §2 (`mermaid`, `equation_inline`, `progress`) rendus **côté serveur** par `app/services/wiki_blocks.py` et branchés sur `export.blocks_to_html` ; collab §3 complet. - **Follow-ups livrés** : sidebar par teamspace (section `base.html` + listing cross-workspace + page HTML), charts `number` + dashboards multi-DB, notif `page.updated` déclenchée à l'édition + auto-follow, unfurl `gitea:`/`github:` dans `POST /board/api/og/metadata` (champs bookmark persistés), UI Settings → Audit branchée sur `/api/v2/audit/logs`. Les 21 casses SSO (`test_v67_sso.py`) sont corrigées (install `python3-saml==1.16.0` + `authlib==1.8.0`). - **Écart assumé** : `progress` agrège directement sur `collection_pages.property_values_json` plutôt que via `RollupEngine`, dont la signature exige une chaîne de relations + une page source — ce qu'un bloc de progression embarqué dans une page n'a pas.