---
tags: note pkm silverbullet univers projets domaines
type: "note"
nature: organisation             # Options : portrait, lieu, info, concept, script, process, tuto, none
ressource: true
univers: PERSO
date: "[[01_JOURNAL/2026/2026-10-30]]"
---

# PKM SilverBullet : univers, domaines, projets

*Note de synthèse du 30 octobre 2026 · SilverBullet 2.12.1 (Space Lua) · code non testé sur cette version*

> **Synthèse organisation et fonctionnement (actualisée 2026-11-03)** : [[04_NOTES/ORGANISATION/PKM_Organisation-Fonctionnement_20261103]]

## 1. Point de départ

Arborescence plate (00_INBOX, 01_JOURNAL, 02_PROJETS, 03_NOTES, 04_CODES, 05_CONTACTS, 80_CONFIG et 90_ARCHIVES), tâches en cases à cocher dans la note où elles apparaissent, IA utilisée pour classer et synthétiser les notes.

Le problème : le mot « projet » mélange le macro (« Site internet », qui est un sujet) et le micro (« Mettre à jour la page xxx », qui est une tâche). S'ajoute un niveau supérieur stable : trois univers (PERSO, PRO, AMM).

## 2. Modèle retenu

| Niveau | Définition | Durée | Où ça vit | Exemple |
| --- | --- | --- | --- | --- |
| Univers | PRO, AMM ou PERSO, liste fixe | permanent | page hub | PRO |
| Domaine | sujet durable, qui n'est jamais « terminé » | sans fin | 02_DOMAINES/ | PRO-PILOTAGE |
| Projet | résultat précis, plusieurs actions | a une fin | 03_PROJETS/ | COPIL-20261123 |
| Procédure | routine rejouée à l'identique | récurrent | 04_NOTES/ | PROC-MAJ-SRV-WEB |
| Tâche | action unique | ponctuelle | case à cocher dans la note d'origine |  |

**Principe :** l'univers est un attribut, pas un niveau de dossier. Les dossiers restent plats, le rattachement passe par le frontmatter.

**Règles de tri à la capture** (une seule fois, pendant le tri de l'Inbox) :

- Action isolée : case à cocher.
- Plusieurs actions vers un résultat : page projet.
- Thème continu : domaine.
- Revient à l'identique : procédure.
- Test de sortie : si on peut dire « c'est fini » et que ça ne reviendra pas tel quel, c'est un projet. Si ça revient dans les mêmes termes, c'est une procédure. Si ce n'est jamais fini, c'est un domaine.
- Un projet de 2-3 actions n'a pas de page. Un projet de 15-20 actions avec validations (organiser un COPIL) justifie la sienne.
- Une migration est un vrai projet, même annuelle. Un incident sur une routine devient un projet lié à la procédure.

## 3. Changement de vocabulaire : « domaine » devient « univers »

Jusqu'ici, le mot « domaine » désignait PRO, AMM et PERSO. Avec le nouveau modèle, il change de sens.

| Elément | Avant | Après |
| --- | --- | --- |
| PRO / AMM / PERSO | domaine | **univers** |
| Sujet durable (Site internet, Budget) | mélangé avec les projets | **domaine** |
| Résultat avec une fin | projet | projet |

Le champ `area` existant dans les pages (pro / amm / perso) devient `univers` : il faut le migrer (section 9), dans un ordre précis, avant d'utiliser `domain` pour les sujets.

## 4. Arborescence

- A renuméroter (fait) : 02_PROJETS => 03_PROJETS, 03_NOTES => 04_NOTES, 04_CODES => 05_CODES, 05_CONTACTS => 06_CONTACTS.
- Nouveau : **02_DOMAINES/**.
- Trois pages hub **PERSO**, **PRO**, **AMM**, générées par requête.
- Une page **Accueil** : liens vers les hubs, tâches en retard ou du jour, compteur Inbox.
- Une page **HUB-LIB** : fonctions Space Lua communes.
- **Templates/** : Domaine, Projet, Procédure (à écrire).

NB : la numérotation des dossiers a été revue pour intégrer le dossier `02_DOMAINES` et modifier l'ordre dans l'arborescence : 00_INBOX, 01_JOURNAL, 02_DOMAINES, 03_PROJETS, 04_NOTES, 05_CODES et 06_CONTACTS. 80 et 90 ne changent pas.


## 5. Conventions de nommage

Tous les codes : majuscules, tiret comme séparateur, ni espace ni accent. Une seule règle pour tous les types.

- **Domaine** : `UNIVERS-SUJET`, exactement deux segments, le premier est toujours PRO, AMM ou PERSO (PRO-PILOTAGE, AMM-COMMUNICATION, PERSO-BUDGET).
- **Projet** : ne commence jamais par un univers. Il contient un mot de résultat (REFONTE, MIGRATION, AUDIT, LANCEMENT) ou une date d'échéance : COPIL-20261123, MIGRATION-SITE-2026. Un code qui ne contient que le sujet et l'année est un domaine déguisé. L'univers n'est ajouté au code que pour lever une ambiguïté.
- **Procédure** : `PROC-OBJET`. Si plusieurs serveurs, le nom du serveur entre dans le code (PROC-MAJ-SRV-WEB). Si la checklist est identique pour tous, une seule procédure avec un historique par serveur.
- **Réunion** : date puis code (20261123-COPIL).
- **Titre lisible** : dans le frontmatter (`title`) et le H1, à l'infinitif pour un projet (« Organiser le COPIL du 23/11/2026 »). Le code identifie, le titre explique.
- **L'univers n'est répété ni dans le nom des notes ni dans les projets** : il est porté par le domaine et par le champ `univers`.

## 6. Frontmatter

Pour chaque type, ajouter un attribut `date` de création (format `AAAA-MM-JJ`, texte simple) et `tags` (liste YAML) pour faciliter les recherches et les requêtes.

Domaine :

```yaml
---
type: domain
tags: [domain]
univers: PRO
title: Pilotage
date: 2026-10-30
---
```

Projet :

```yaml
---
type: project
tags: [project]
univers: PRO
domain: "[[PRO-PILOTAGE]]"
title: Organiser le COPIL du 23/11/2026
status: active
date: 2026-10-30
---
```

Procédure : ne pas utiliser de type spécifique mais une note avec `nature: process`

```yaml
---
type: note
tags: [procedure]
nature: process
univers: AMM
domain: "[[AMM-INFORMATIQUE]]"
title: Mises à jour du serveur web de l'AMM
date: 2026-10-30
frequence: mensuelle
last_exec: 2026-10-05
---
```

Règles :

- `univers` figure sur tous les types de pages, avec les valeurs PRO, AMM, PERSO (majuscules, jamais d'autre valeur).
- Les wikilinks dans le frontmatter sont entre guillemets, sinon YAML lit une liste imbriquée.
- Attributs de tâche sans accent : `[date: 2026-10-29]` (format AAAA-MM-JJ, comparé comme du texte) = **planification/échéance unique** — état déduit de date × fait : sans date = backlog, `date > today` = programmé, `date == today` = du jour, `date < today` non fait = retard, `* [x]` = réalisée (modèle validé 2026-11-02, cf. skill `traitement-taches`). `[due:]` abandonné (0 tâche, aucune requête ne le consomme). `[project: [[COPIL-20261123]]]` (lien vers le projet).
- Une procédure porte un code `PROC-*` **et** un tag `procedure` (avec `nature: process`) : les hubs acceptent l'un ou l'autre — créer les deux ensemble à la création.
- L'historique d'une procédure reste dans sa note. Les routines simples sont des cases sur la page du domaine.

## 7. Wikilinks dans le frontmatter : décision

Adoptés, pour l'autocomplétion (la faute de frappe sur un code est le risque principal) et parce qu'un renommage peut mettre le lien à jour. Pour ne pas dépendre de la forme exacte stockée (`[[Projets/X]]`, `[[X|alias]]`, `X`), les requêtes comparent via `hub.norm()`, qui renvoie toujours le code seul. `hub.code()` renvoie le code de la page courante : `editor.getCurrentPage()` renvoie le nom avec son dossier (`02_DOMAINES/PRO-PILOTAGE`), pas le code.

## 8. Code Space Lua

Page **`80_CONFIG/Lua/Lua_Hub-Univers`** — en SB 2.12, les blocs `space-lua` sont chargés automatiquement dans tout l'espace (aucun `library: true`, mécanisme obsolète) ; ordre de chargement par `-- priority: N`, puis **System: Reload** (Ctrl-Alt-r) après édition. Les listes vides rendaient `nil` : chaque `template.each` est doublé de `or ""` :

```space-lua
-- priority: 10
hub = {}

local line = template.new[==[* [[${name}]] ${title}
]==]
local projectLine = template.new[==[* [[${name}]] ${title} (${domain})
]==]
local taskLine = template.new[==[* ${name} ([[${page}]])
]==]

function hub.code()
  return string.match(editor.getCurrentPage(), "[^/]+$")
end

function hub.norm(v)
  if type(v) ~= "string" then return nil end
  local inner = string.match(v, "%[%[([^%]|]+)") or v
  return string.match(inner, "[^/]+$")
end

-- Hubs d'univers
function hub.domains(u)
  return template.each(query[[
    from p = index.tag "page"
    where p.type and p.type == "domain" and p.univers and p.univers == u
    order by p.name
  ]], line) or "Aucune ligne à afficher"
end

function hub.projects(u)
  return template.each(query[[
    from p = index.tag "page"
    where p.type == "project" and p.status == "active" and p.univers == u
    order by p.domain
  ]], projectLine) or "Aucune ligne à afficher"
end

function hub.procedures(u)
  return template.each(query[[
    from p = index.tag "page"
    where p.type == "note" and p.nature == "process" and (string.find(p.name, "PROC-", 1, true) or table.includes(p.tags, "procedure")) and p.univers == u
    order by p.last_exec
    limit 5
  ]], line) or "Aucune ligne à afficher"
end

function hub.overdue()
  return template.each(query[[
    from t = index.tasks()
    where not t.done and t.date and t.date <= os.date("%Y-%m-%d")
    order by t.date
    limit 15
  ]], taskLine) or "Aucune ligne à afficher"
end

-- Pages domaine et projet
function hub.projectsOfDomain()
  return template.each(query[[
    from p = index.tag "page"
    where p.type == "project" and p.status == "active"
      and hub.norm(p.domain) == hub.code()
    order by p.name
  ]], line) or "Aucune ligne à afficher"
end

function hub.proceduresOfDomain()
  return template.each(query[[
    from p = index.tag "page"
    where p.type == "note" and p.nature == "process" and (string.find(p.name, "PROC-", 1, true) or table.includes(p.tags, "procedure")) and hub.norm(p.domain) == hub.code()
    order by p.name
  ]], line) or "Aucune ligne à afficher"
end

function hub.tasksOfProject()
  return template.each(query[[
    from t = index.tasks()
    where not t.done and hub.norm(t.project) == hub.code()
    order by t.name
  ]], taskLine) or "Aucune ligne à afficher"
end
```

Hub d'un univers (identique pour les trois, seul `PRO` change, à trois endroits) :

```markdown
---
type: univers
univers: PRO
---
# PRO

## Domaines
${hub.domains("PRO")}

## Projets actifs
${hub.projects("PRO")}

## Procédures à rejouer
${hub.procedures("PRO")}
```

Page Accueil :

```markdown
---
type: index
---
# Accueil

[[PERSO]] · [[PRO]] · [[AMM]]

## En retard ou du jour
${hub.overdue()}
```

Template de page domaine (`Templates/Domaine`) :

```markdown
---
description: Créer un domaine
tags: meta/template/page
suggestedName: 02_DOMAINES/
frontmatter: |
  type: domain
  tags: [domain]
  univers: PRO
  date: AAAA-MM-JJ
---
# TITRE LISIBLE

**Rôle :** une phrase sur ce que ce domaine couvre durablement.

## Projets actifs
${hub.projectsOfDomain()}

## Procédures
${hub.proceduresOfDomain()}

## Routines et rappels
- [ ] 

## Journal
- AAAA-MM-JJ : 
```

Template de page projet (`Templates/Projet`) :

```markdown
---
description: Créer un projet
tags: meta/template/page
suggestedName: 03_PROJETS/
frontmatter: |
  type: project
  tags: [project]
  univers: PRO
  domain: "[[PRO-]]"
  title: Verbe à l'infinitif + résultat
  status: active
  date: AAAA-MM-JJ
---
# Verbe à l'infinitif + résultat

**Objectif :** une phrase qui dit ce que « terminé » veut dire.
**Échéance :** AAAA-MM-JJ

## Prochaine action
- [ ] 

## Jalons
### 1.
- [ ] 

## Journal
- AAAA-MM-JJ : 

## Tâches liées
${hub.tasksOfProject()}
```

Les templates demandent de remplacer `PRO` et `PRO-` à la main après création.

Différences entre les deux : le domaine n'a ni fin, ni statut, ni objectif, et contient le rôle, les projets, les procédures et les routines. Le projet a un objectif, une échéance, un statut, une prochaine action, des jalons et des tâches agrégées.

## 9. Migration depuis l'existant

Le point sensible : l'ancien champ `area` (pro / amm / perso) doit devenir `univers`, avant d'utiliser `domain` pour les sujets. Sinon le champ a deux sens en même temps et les requêtes renvoient des résultats faux.

**Étape 0. Sauvegarde.** Copie du dossier du space (ou commit git) avant toute modification en masse.

**Étape 1. Inventaire.** Dans une page de travail temporaire, liste les pages dont l'ancien champ contient un univers :

```lua
${template.each(query[[
  from p = index.tag "page"
  where p.area and (string.upper(p.area) == "PRO"
    or string.upper(p.area) == "AMM"
    or string.upper(p.area) == "PERSO")
  order by p.name
]], template.new[==[* [[${name}]] (${area})]==])}
```

Cherche aussi l'ancien vocabulaire ailleurs : tags, anciens templates, requêtes existantes, prompts IA.

**Étape 2. Renommer le champ.** Sur ces pages, `area: pro` devient `univers: PRO` (majuscules). Les valeurs atypiques (`infra`, `all`, `perso | amm | pro`, `perso | amm | work`) sont corrigées au passage. À faire en premier, avant de créer les nouveaux domaines.

**Étape 3. Créer les domaines.** Une liste initiale courte (quelques domaines par univers), au format `UNIVERS-SUJET`, depuis le template. Les sujets communs à plusieurs univers (Budget, Informatique, Communication) : un domaine par univers si les contextes ne se mélangent pas, un domaine transversal assumé sinon.

**Étape 4. Passer chaque projet existant au crible.**

- Action unique : case à cocher dans la note d'origine, puis archivage de la page.
- Sujet sans fin (de type SITE-AMM-2026) : il devient un domaine.
- Vrai projet : nouveau code (avec mot de résultat ou date), puis `title`, objectif, `domain`, `univers`, `status`.
- Projet de 2-3 actions : pas de page, cases à cocher dans la note.

Pour aller vite, demande à l'IA un tableau (page actuelle, niveau proposé, code, domaine, titre, objectif) à partir de la liste des pages de Projets, des définitions de la section 2 et de la grammaire de la section 5. Tu valides ligne par ligne avant de modifier quoi que ce soit.

**Étape 5. Renommer les pages.** Teste sur une seule page, puis vérifie les rétroliens avant de généraliser. Je n'ai pas pu confirmer que le renommage met aussi à jour les liens situés dans le frontmatter.

**Étape 6. Corriger les tâches.** Attribut `project` (nouveau code) et, pour les échéances, `due` (AAAA-MM-JJ) sur les tâches existantes.

**Étape 7. Mettre à jour l'outillage.** Templates, hubs, page Accueil, prompts IA.

**Étape 8. Contrôler.** Requête de cohérence à garder dans une page de maintenance :

```lua
${template.each(query[[
  from p = index.tag "page"
  where p.type == "project" and (not p.domain or not p.univers or not p.title)
  order by p.name
]], template.new[==[* [[${name}]]]==])}
```

À étendre avec : domaines sans `univers`, codes de domaine qui ne commencent pas par PRO-, AMM- ou PERSO-, projets sans objectif.

## 10. Rôle de l'IA

Prompt de tri de l'Inbox à donner à l'IA :

- Utilise ces cinq niveaux et ces définitions (section 2).
- Propose le niveau (tâche, projet, domaine, procédure) et le rattachement.
- Les domaines suivent le format `UNIVERS-SUJET` : propose un domaine existant avant d'en créer un, et n'invente jamais un nouvel univers.
- Propose le code et le titre ensemble, après avoir vérifié que le code n'existe pas déjà.
- Une activité qui revient régulièrement est une procédure, pas un projet.

Revue hebdomadaire : projets sans objectif ou sans prochaine action, tâches sans projet, codes non conformes, « projets » qui sont en fait des domaines, procédures non rejouées depuis trop longtemps.

## 11. Discipline

- Pas de page projet sans `title` et sans objectif d'une phrase.
- Une seule prochaine action visible en haut de la page projet.
- Gros projets : 3-4 jalons, et marquage des validations (`[check: Président]`) pour pouvoir les filtrer.
- Page projet minimale : tout ce qui n'a pas été consulté depuis un mois est retiré.
- Contexte, ressources et comptes rendus vivent dans des notes ou réunions liées.
- Rien à maintenir à la main dans les hubs : tout est généré. Un hub sobre : domaines, projets actifs, alertes.

## 12. Points vérifiés sur la 2.12.1 — résultats (2026-10-31)

- ✅ `${editor.getCurrentPage()}` renvoie le chemin complet, `${hub.code()}` le dernier segment (`02_DOMAINES/TEST` → `TEST`).
- ✅ Wikilink guillemeté dans le frontmatter (`domain: "[[PRO-XXX]]"`) : indexé en string et lu par `hub.norm()`.
- ✅ `[project:]` sur une tâche : indexé **dans les deux formes** (code simple et `[[X]]` conservé tel quel) ; `hub.norm()` normalise les deux. Les variantes `projet` / `proj` ne sont **pas** indexées.
- ❌ Le renommage de page ne met pas à jour les liens du frontmatter (et `rename_note` MCP répond « Renamed » sans effet) → balayage sed + API `/.fs`.
- ✅ **`index.tag "task"` et `index.tasks()` sont équivalents** (vérifié 2026-10-31 : 994 tâches, `due`/`date`/`done` identiques des deux côtés). L'apparent découplage relevé sur `02_DOMAINES/TEST` était un artefact de rendu à des états d'index différents (pages réécrites en dehors de l'UI). **Convention retenue : `index.tasks()`** (API documentée, plus propre) — `hub.overdue()` et `hub.tasksOfProject()` l'utilisent désormais.
- ⚠️ Piège de lecture corollaire : `t.date` **absent** fait retomber `${date}` sur la globale Lua `date` de SB (table d'aide `today()`/`tomorrow()`…) — ce n'est pas un attribut indexé.
- ✅ `table.includes(p.tags, "procedure")` fonctionne en requête (22 domaines trouvés).
- ⚠️ Pas de récurrence native fiable pour les cases à cocher : pour du vraiment régulier, un rappel calendrier qui pointe vers la procédure.
- ✅ Les procédures sans `last_exec` apparaissent en premier dans le hub, ce qui est voulu.
- ℹ️ **Widget `${query[…]}` et clés `nil`** (constat GRK 2026-10-31) : dans une ligne de résultat, une clé dont la valeur est `nil` **n'existe pas** → la colonne disparaît (symptôme : « une seule colonne, celle de la 1ʳᵉ ligne porteuse »). Convention : `DATE = t.date or "--"` pour forcer toutes les colonnes. ⚠️ piège Lua : `false or "--"` renvoie `"--"` → pour un booléen, `tostring(t.done)` (affiche `nil`/`false`/`true`). En `template.each`, une variable absente **retombe sur la globale Lua** du même nom (`date` → table d'aide SB `today()`/`tomorrow()`…).

## 13. Prochaines étapes

- [x] Sauvegarder le space (tar 2026-10-30 + auto-commit git)
- [x] Tester `hub.code()` (= `TEST` rendu) et l'indexation des attributs de tâche — conclusions §12
- [x] Créer HUB-LIB (library: true) — reste : vérifier le chargement en ouvrant un hub
- [x] Migrer l'ancien champ `area` vers `univers` (fait le 2026-10-30 : 428 pages, vérifié index)
- [x] Créer les premiers domaines (23 : 19 + APPUI x3 + ECD)
- [x] Trier les projets existants — fait le 2026-10-30 (tableau validé : [[00_INBOX/Pro/PKM_Migration_Crible-Projets_20261030]]) : 15 archivés, 30 absorbés, 6 fusionnés/convertis, 43 gardés + domaine, 4 pages promues en domaine. Reste : NEWSLETTER-2026-03 (publiée ?)
- [x] Créer les trois hubs (PRO/PERSO/AMM) et la page Accueil — validation visuelle resto
- [x] Écrire le template de procédure (Templates/Procedure)
- [x] Mettre à jour le prompt de tri de l'IA (skill 80_CONFIG/IA_SKILLS/Tri-Inbox)
