Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .claude/skills/adjoint-secretary/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
---
name: adjoint-secretary
description: Cycle 30 min du secrétaire vérificateur myia-po-2026:CoursIA-3. Atteste en tiers, du plus ancien au plus récent, les PRs ouvertes sans dossier valide (chaque READY, une fois lu et approuvé par ai-01, est mergé sans attendre son cycle), et fait circuler l'information sur workspace-CoursIA-3.
description: Cycle 30 min du secrétaire vérificateur myia-po-2028:CoursIA-3. Atteste en tiers, du plus ancien au plus récent, les PRs ouvertes sans dossier valide (chaque READY, une fois lu et approuvé par ai-01, est mergé sans attendre son cycle), et fait circuler l'information sur workspace-CoursIA-3.
---

# Secrétaire vérificateur — myia-po-2026:CoursIA-3
# Secrétaire vérificateur — myia-po-2028:CoursIA-3

Cycle court (30 min) du secrétaire de l'adjoint titulaire (`myia-po-2025:CoursIA-2`). Le dashboard `workspace-CoursIA-3` est le lieu d'organisation à trois : titulaire, secrétaire, coordinateur (`myia-ai-01:CoursIA`).

Cette commande est réservée au slot `myia-po-2026:CoursIA-3` et ne doit jamais être remplacée par `/coordinate`, `/coordinate-adjoint` ou `/continue`.
Le siège est passé de `myia-po-2026:CoursIA-3` (machine hors service depuis le 2026-10-09) à `myia-po-2028:CoursIA-3` le 2026-10-20, par mandat user. Le secrétaire signe sous la lane de la machine qui l'anime, jamais sous celle d'une machine disparue.

Cette commande est réservée au slot `myia-po-2028:CoursIA-3` et ne doit jamais être remplacée par `/coordinate`, `/coordinate-adjoint` ou `/continue`.

## Mandat fondateur (user 2026-09-21)

Expand Down Expand Up @@ -64,8 +66,8 @@ Restent au coordinateur (`myia-ai-01:CoursIA`) : merges, clôtures, reviews `APP
6. **Pour chaque PR du lot** :
1. `check_adjoint_prevalidation.py N` : rc=0 ou rc=3 sous une autre lane, passer à la suivante ;
2. classer les rouges, et rejouer ce qui relève de l'infra ou d'un minuteur échu **avant** tout dossier : un job rejoué peut réécrire un commentaire collant, qui périmerait un dossier posté avant lui ;
3. crible de fond, puis `--template --lane myia-po-2026:CoursIA-3` généré juste avant le post ;
4. un seul post, en dernier, par `python scripts/coordination/post_dossier.py --pr N --file dossier.md --lane myia-po-2026:CoursIA-3` : l'organe rejoue le gate et sort avec son rc. rc=0 ou rc=3 attendu, sinon comprendre pourquoi avant la PR suivante. rc=4 veut dire que rien n'a été posté (forme du bloc, placeholder restant, tête périmée, dossier vivant d'une autre lane, gate illisible) : corriger le fichier, jamais contourner par un `gh api` à la main.
3. crible de fond, puis `--template --lane myia-po-2028:CoursIA-3` généré juste avant le post ;
4. un seul post, en dernier, par `python scripts/coordination/post_dossier.py --pr N --file dossier.md --lane myia-po-2028:CoursIA-3` : l'organe rejoue le gate et sort avec son rc. rc=0 ou rc=3 attendu, sinon comprendre pourquoi avant la PR suivante. rc=4 veut dire que rien n'a été posté (forme du bloc, placeholder restant, tête périmée, dossier vivant d'une autre lane, gate illisible) : corriger le fichier, jamais contourner par un `gh api` à la main.
7. **Fin de cycle** : un DM nominatif à ai-01 qui liste tous les READY du cycle, avec numéro, tête et un mot sur le point à lire en priorité, puis un `[DONE][SECRETARY]` court : les dossiers émis (READY, BLOCKED) avec leurs numéros, et ce qui attend qui. Pas de cumul recopié d'un cycle à l'autre.

**Budget : le quota mesuré, pas un compte d'appels.** Le quota GitHub est partagé par toute la flotte (5 000 points par heure et **par utilisateur** `jsboige`, REST et GraphQL comptés à part). Avant chaque PR, relire les en-têtes : sous 1 000 points restants sur l'un des deux, finir la PR en cours, consigner l'heure du reset, et reprendre après. Tant que le quota le permet, un cycle traite autant de PRs que ses 30 minutes le permettent. Repères du 28/09 : le matin, une salve de 11 READY a donné 9 merges ; l'après-midi, un cycle s'est arrêté après 5 dossiers sur le plafond fixe de 40 appels que cette section portait jusque-là.
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Notation étudiants : moteur générique = [GradeBookApp/configs/README.md](Grad

**Coordination cross-machine = RooSync uniquement.** Dashboard workspace CoursIA + messages directs. GitHub = code, **jamais** de `*_TEST_REPORT.md` / `*_COORDINATION.md` / rapports d'audit dans le repo.

**Trois têtes de coordination** : le coordinateur `myia-ai-01:CoursIA`, le titulaire `myia-po-2025:CoursIA-2` et le secrétaire `myia-po-2026:CoursIA-3`, dont l'artefact est le dashboard `workspace-CoursIA-3` (« le secrétariat », « le troisième dashboard »). Rôles et circulation : [tricephale-circulation.md](docs/reference/tricephale-circulation.md).
**Trois têtes de coordination** : le coordinateur `myia-ai-01:CoursIA`, le titulaire `myia-po-2025:CoursIA-2` et le secrétaire `myia-po-2028:CoursIA-3` (siège de `myia-po-2026:CoursIA-3` jusqu'au 2026-10-20), dont l'artefact est le dashboard `workspace-CoursIA-3` (« le secrétariat », « le troisième dashboard »). Rôles et circulation : [tricephale-circulation.md](docs/reference/tricephale-circulation.md).

**Tour de coordination type** : (1) **drainer l'inbox RooSync** (`status:"unread", deep:true` — sans `deep`, le compte de non-lus peut être un faux zéro) — elle porte souvent le **DM nominatif qui change la priorité du cycle** ; (2) **énumérer** les dashboards (`roosync_dashboard(action:"list")`) puis lire en `section:"all"` **chaque clé pertinente**, en entier (`Read` sur le fichier persisté si tronqué) — jamais une liste apprise par cœur, qui serait **structurellement aveugle** à une clé forkée (mesure fondatrice #17197 : `workspace-CoursIA (2)`, 23 messages vivants jamais lus) ; (3) heartbeat cluster ; (4) sans mission assignée : envoyer un message à ai-01, ne pas attendre passivement.

Expand Down
5 changes: 3 additions & 2 deletions docs/reference/cluster-agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ La population décrite ici est celle des machines qui portent des grains CoursIA
| `myia-po-2023` | RTX 3080 + eGPU RTX 3090 (24 Go) | les services GenAI image, audio et vidéo ([genai-services.md](../genai/genai-services.md)) |
| `myia-po-2024` | RTX 3070 (8 Go) | jeton QuantConnect MCP ; la lane QC isolée |
| `myia-po-2025` | RTX 3080 Ti laptop (16 Go), sous garde thermique | le titulaire de la coordination ; des workspaces hors CoursIA (claudish, maintenance, workspaces d'école) |
| `myia-po-2026` | RTX 3080 | le service d'embedding (port `8004`) ; jeton QuantConnect MCP ; le secrétariat ; Hermes |
| `myia-po-2026` | RTX 3080 | **hors service depuis le 2026-10-09** (panne matérielle). Portait le service d'embedding (port `8004`), un jeton QuantConnect MCP, le secrétariat et Hermes |
| `myia-po-2027` | RTX 4060 laptop (8 Go) | des lanes worker ; hors du LAN d'ai-01 (voir « Réseau ») |
| `myia-po-2028` | RTX 3070 Ti laptop (8 Go), 64 Go de RAM ; pas de disque D: (SSD à venir) | remplace `po-2026` depuis le 2026-10-20 : le secrétariat (`CoursIA-3`) et deux lanes worker (`CoursIA`, `CoursIA-2`) en cours d'installation |

La capacité GPU des machines `po-*` est **déclarée** ; elle se confirme par la lane propriétaire avant toute réservation, pas par cette table.

Expand All @@ -39,7 +40,7 @@ Une lane est un couple `machine:workspace`, animé par un seul agent actif à la
|---|---|
| `myia-ai-01:CoursIA` | coordinateur : merges, fermetures, arbitrages, politique de flotte |
| `myia-po-2025:CoursIA-2` | titulaire : dossiers de prévalidation exact-head, vérifications avant fermeture ; ne merge ni ne ferme |
| `myia-po-2026:CoursIA-3` | secrétariat : attestations tierces, circulation (DM nominatifs, alertes). Il refuse par contrat les dossiers des PRs `DEEP`, qui reviennent au titulaire |
| `myia-po-2028:CoursIA-3` | secrétariat (siège de `myia-po-2026:CoursIA-3` jusqu'au 2026-10-20) : attestations tierces, circulation (DM nominatifs, alertes). Il refuse par contrat les dossiers des PRs `DEEP`, qui reviennent au titulaire |
| `myia-ai-01:CoursIA-2` | worker sur la machine du coordinateur ; régisseur des GPU de la flotte depuis le 2026-10-05. Ne merge ni ne ferme |
| `myia-po-2024:CoursIA-3` | lane QuantConnect isolée : déploiement des portefeuilles et maintenance de la partie QC, hors du tapis des workers. Elle partage le dashboard `workspace-CoursIA-3` avec le secrétariat : lire l'auteur (`machineId`) avant d'attribuer un message |
| autres `*:CoursIA` et `*:CoursIA-2` | workers |
Expand Down
4 changes: 2 additions & 2 deletions docs/reference/tricephale-circulation.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ La coordination CoursIA a **trois têtes**, chacune avec sa lane, sa skill et so
|---|---|---|---|---|
| **Coordinateur** | `myia-ai-01:CoursIA` | `coordinate` | merge, clôture, arbitrage, politique de flotte | `workspace-CoursIA` (+ `global`) |
| **Titulaire** | `myia-po-2025:CoursIA-2` | `coordinate-adjoint` | émet les dossiers `[ADJOINT PREFLIGHT]` exact-head que `merge_ready` et le coordinateur consomment | `workspace-CoursIA-2` |
| **Secrétaire** | `myia-po-2026:CoursIA-3` | `adjoint-secretary` | attestation tierce du plus ancien au plus récent (dossiers qu'ai-01 lit et approuve, puis que `merge_ready` merge), puis circulation : DMs nominatifs, alertes conflits / quota / runners | `workspace-CoursIA-3` |
| **Secrétaire** | `myia-po-2028:CoursIA-3` | `adjoint-secretary` | attestation tierce du plus ancien au plus récent (dossiers qu'ai-01 lit et approuve, puis que `merge_ready` merge), puis circulation : DMs nominatifs, alertes conflits / quota / runners | `workspace-CoursIA-3` |

« Le secrétariat », « le secrétaire » et « le troisième dashboard » désignent `myia-po-2026:CoursIA-3` et son artefact `workspace-CoursIA-3`.
« Le secrétariat », « le secrétaire » et « le troisième dashboard » désignent `myia-po-2028:CoursIA-3` et son artefact `workspace-CoursIA-3`. Le siège était tenu par `myia-po-2026:CoursIA-3` jusqu'à la panne matérielle de cette machine (2026-10-09) ; `myia-po-2028` le reprend depuis le 2026-10-20, par mandat user.

Ces clés sont des **identités**, pas une liste de lecture : le tableau dit qui est qui, jamais quoi lire.

Expand Down
10 changes: 10 additions & 0 deletions scripts/check_adjoint_prevalidation.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,16 @@
"myia-po-2026:CoursIA-3",
"myia-po-2027:CoursIA",
"myia-po-2027:CoursIA-2",
# myia-po-2028 replaces myia-po-2026 (hardware failure, 2026-10-09). Its
# three lanes were onboarded on 2026-10-20 and CoursIA-3 holds the
# secretariat by user mandate. Absent from this set, they could only attest
# by signing as the dead machine's lanes, which breaks the one-lane-one-agent
# premise of the claim protocol. The myia-po-2026 entries stay so that
# dossiers already posted under them keep being read; remove them once no
# live dossier carries them.
"myia-po-2028:CoursIA",
"myia-po-2028:CoursIA-2",
"myia-po-2028:CoursIA-3",
})
# `Grain: <genre> -- lane <machine:workspace>` in the pull request body names the
# lane that carries the work. The canonical reader is `grain_tag.extract_lane`,
Expand Down
4 changes: 3 additions & 1 deletion scripts/coordination/post_dossier.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@
# de domaine que cette meme garde exige doit pouvoir REMPLACER un READY du
# secretariat qui tient le gate. Sans cette porte, le DEEP sur dossier
# secretariat est impostable (mesure 2026-10-08 sur #19801 et #19838).
SECRETARIAT_LANES = frozenset({"myia-po-2026:CoursIA-3"})
# myia-po-2028:CoursIA-3 holds the seat since 2026-10-20 (myia-po-2026 out of
# service since 2026-10-09) ; the former seat stays for dossiers already posted.
SECRETARIAT_LANES = frozenset({"myia-po-2026:CoursIA-3", "myia-po-2028:CoursIA-3"})
# gh-posting-hygiene regle 2, membre metrique : un corps court apres le POST
# d'un fichier est la signature du piege de transport.
MIN_PUBLISHED_LEN = 100
Expand Down
6 changes: 5 additions & 1 deletion scripts/tests/test_check_adjoint_prevalidation.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,11 @@ def test_secretary_lane_can_attest_although_it_carries_nothing():
`myia-po-2023:CoursIA-2` is the mirror case: it carries #16259 but could
not attest for anyone.
"""
for lane in ("myia-po-2026:CoursIA-3", "myia-po-2023:CoursIA-2"):
for lane in (
"myia-po-2026:CoursIA-3",
"myia-po-2028:CoursIA-3",
"myia-po-2023:CoursIA-2",
):
ready, errors = mod.evaluate(_snapshot(_body(lane=lane)))
assert ready, (lane, errors)
assert errors == [], lane
Expand Down
Loading