12 KiB
Fiche VERR1-SPEC — Niveau N2 — Modèle prévu opus | utilisé claude-opus-5-5 — Agent orchestrateur (session « Piège du verrou ») — Skills lp-lot, boss.md (lus)
VERR1-SPEC : piège du verrou (New-Item non atomique) dans sk-repo § 2 et lp-repo (2026-10-11)
Lot DOC de report VERR1, projet AG (organisation des agents), copie D:\Game\LifePlay-master 5.8 (branche ue5.8).
Origine : écart E1 du lot OUTC (etat\OUTC\OUTC-T2-IMPL.md § 2), signalé à ORGA1 après ses commits ; ORGA1 excluait
sk-repo et lp-repo de son périmètre, OUTC aussi (OUTC-SPEC.md § 5 : « lot DOC séparé, décision E5 »).
Aucun usage de la copie UE, aucun MCP.
1. Fait à porter (sources)
- Mesure OUTC (
OUTC-T2-IMPL.md§ 2 E1) : pwsh 7.6.6, 100 tours de 8 threads sur uneThreading.Barrier, tousNew-Item -ItemType Directory -Path <même chemin> -ErrorAction Stop: 1 seul succès dans 12 tours, plusieurs succès dans 88 tours.CreateDirectoryW(kernel32) : 1 succès dans 100 tours sur 100 ; second appel : erreur 183. Retenu dansTools\Verrou.ps1(New-DossierAtomique, l. 75-84), commitéf4ac257(CHG-329). - Contre-essai VERR1 (
VERR1-essai-mkdir.ps1, sortieVERR1-essai-mkdir.txt, même montage, base créée, 100 tours) :mkdirde pwsh (fonction qui appelleNew-Item, vérifié par(Get-Command mkdir).Definition) : 8 tours à un succès, 92 à plusieurs ;/usr/bin/mkdirde Git Bash (C:\Program Files\Git\usr\bin\mkdir.exe) : 1 succès dans 100 tours sur 100. Une première passe à base absente (Git Bash 0 succès, faute de parent) est écartée. - Conséquence : deux gardiens peuvent se croire titulaires du même
k+1si le dossier est créé parNew-Itemou par lemkdirde pwsh, alors quesk-repo§ 2 dit «mkdir… (opération atomique) » sans préciser le shell. - Écart de chiffres à signaler (non corrigé ici) : CHG-329 écrit « 10 tours sur 60 à un seul succès », l'IMPL « 12 sur 100 ». VERR1 cite l'IMPL.
2. Fichiers touchés, ordre
| # | Fichier | Dépôt | Opération |
|---|---|---|---|
| 1 | ~\.claude\skills\sk-repo\SKILL.md |
hors git | A.1 : ligne 22 complétée + paragraphe « Piège » après l. 29 |
| 2 | D:\Game\LifePlay-Sandbox-5.8\Tools\claude\skills\sk-repo\SKILL.md |
addon, non suivi | recopie de 1 (MD5 identique), pas de commit (précédent ORGA1 Q3) |
| 3 | D:\Game\LifePlay-Sandbox-5.8\Tools\claude\skills\lp-repo\SKILL.md |
addon ue5.8 (HEAD 22dd7c3) |
A.2 : § 4 puce VERROU\ complétée + puce au § 10 |
| 4 | D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-repo\SKILL.md |
addon lot/DC3-atelier (HEAD 083a3a0) |
recopie octet pour octet de 3 (copie chargée par les deux jeux : jonction .claude\skills) |
| 5 | journal (CHG), index (plage), NUMEROS.md, livrables etat\AG\VERR1\ |
jeu | DOC de clôture sous jeton, après les commits addon |
MD5 de départ : sk-repo ab3ac013… ×2 ; lp-repo a575c783… ×2 ; LF, 0 CR. Ordre : R0 (instantanés
VERR1-home, VERR1-addon58, VERR1-addon, VERR1 ; DÉCLARATION) → T1 (lp-writer, 1 à 4) → T1v (lp-validator) →
R1 / R2 (commits addon 5.8 puis 5.5, lp-gardien) → T2 (JOURNAL-DEMANDE, CHG, index, NUMEROS) → R3 (commit jeu) →
FIN-LOT. Pin du doc 21 l. 136 : non touché (appartient à ARCH427) posé par VERR1 dans son commit du jeu (R3), avec les HEAD des deux addons relevés à l'entrée du ticket (règle révisée par Big Boss pour tous les lots, 2026-10-12).
3. Repli
Avant commit : Restore.ps1 -Lot VERR1-home|VERR1-addon58|VERR1-addon (proposé, jamais lancé sans accord) ; après
commit : ticket RESTORE / git revert sur accord.
4. Questions
- Q1 — Emplacement :
sk-repo§ 2 (règle générique : dossier créé par appel système direct) etlp-repo§ 4 + § 10 (outil du projet :Tools\Verrou.ps1) — recommandé ; sinon tout danslp-repo. - Q2 —
sk-repode l'addon 5.8 reste non suivi, gardé identique par MD5 sans commit (recommandé, comme ORGA1 Q3). - Hors périmètre (suite proposée, non faite) :
lp-repo§ 7 pourrait nommerTools\Numero.ps1pour les réservations ; écart de chiffres de CHG-329 (§ 1).
5. Interdits
Aucun autre fichier que ceux du § 2 ; aucune règle sans source ; pas de pin ; rien sur le journal hors jeton ; aucune commande git qui écrit hors du gardien ; rien poussé.
6. Critères de VAL (commande → attendu)
md5sumdes deuxsk-repoégaux ;cmpdes deuxlp-repo→ 0 différence.diffcontre l'instantané :sk-repo1 ligne modifiée (l. 22) + ajouts ;lp-repo1 ligne modifiée (§ 4) + ajouts ; rien d'autre.- Textes = annexe A ; chiffres (88 / 100, 92 / 100, 100 / 100, l. 75-84,
f4ac257, CHG-329) = sources (sed -nsurOUTC-T2-IMPL.mdl. 21,VERR1-essai-mkdir.txt,Tools/Verrou.ps1,git log). grep -c "New-Item"≥ 1 dans chaque fichier ;grep -c "OUTC-T2-IMPL"≥ 1 dans chaque fichier.- Fins de ligne : 0 CR (
tr -cd '\r' | wc -c) sur les 4 fichiers ;git ls-files --eoli/lf w/lfpourlp-repo. git status --shortdes deux addons = état d'entrée +lp-repo/SKILL.mdmodifié.
Annexe A — textes exacts
A.1 sk-repo/SKILL.md
Ligne 22 remplacée par :
Verrou sans suppression de fichier, fondé sur `mkdir`, qui échoue si le dossier existe (opération atomique **par un
appel système direct seulement** : piège ci-dessous) :
Inséré après la ligne 29 (« Les dossiers s'accumulent … (§ 6). ») :
**Piège (mesuré)** : sous pwsh 7, `New-Item -ItemType Directory` sans `-Force`, et le `mkdir` de pwsh (fonction qui
l'appelle), **ne sont pas atomiques** : 8 threads créant le même dossier, plusieurs succès dans 88 tours sur 100 (lot
OUTC de LifePlay, `etat\OUTC\OUTC-T2-IMPL.md` § 2 E1) et 92 sur 100 (contre-essai, `etat\AG\VERR1\VERR1-SPEC.md` § 1).
Les `mkdir` des étapes 3 et 4 se font donc par le script de verrou du projet (`CreateDirectoryW`, 1 succès dans 100
tours sur 100) ou par `/usr/bin/mkdir` de Git Bash (1 succès dans 100 tours sur 100), jamais par `New-Item` ni par le
`mkdir` de pwsh.
A.2 lp-repo/SKILL.md
§ 4, ligne 44 remplacée par :
- `VERROU\` (verrou du gardien et des réservations, `sk-repo` § 2) : `Tools\Verrou.ps1 -Prendre <ticket> -Session
<s>`, `-Rendre -Ticket <ticket>`, `-Etat` (codes 0 pris, rendu ou libre ; 1 occupé, refusé ou déjà libre ; 2 erreur),
ou `mkdir` de Git Bash ; jamais `New-Item` (§ 10).
§ 10, puce ajoutée en fin de liste :
- Verrou : `New-Item -ItemType Directory` sans `-Force` et le `mkdir` de pwsh ne sont pas atomiques (8 threads, plusieurs
succès dans 88 tours sur 100) ; `Tools\Verrou.ps1` crée le dossier par `CreateDirectoryW` (`New-DossierAtomique`,
l. 75-84 ; 1 succès sur 100 / 100), commité `f4ac257` (CHG-329). Source : lot OUTC, `etat\OUTC\OUTC-T2-IMPL.md` § 2
E1 ; contre-essai `etat\AG\VERR1\VERR1-SPEC.md` § 1 (Git Bash `mkdir` : 1 succès sur 100 / 100).
Avenant 1 (2026-10-12) — trois règles de gardien, demande de Big Boss
Big Boss ([9f1d99], réservation VERR1 accordée le 2026-10-12) demande de proposer à l'utilisateur, en avenant,
trois règles relevées depuis la reprise et qui touchent sk-repo / lp-repo (P7 n'y touche pas). Sans accord de
l'utilisateur : non écrites. Approuvé par l'utilisateur le 2026-10-12 : B1, B2 et B3 (réponse dans la session VERR1). Sources (etat\BOSS\BOSS-JOURNAL.md, « BOSS l. N ») :
- B1 reprise de son propre verrou : verrou 105 pris par OUTC-R1 le 2026-10-11 à 07:32, gardien coupé (limite
hebdomadaire), repris le 2026-10-12 par un gardien neuf sur consigne de Big Boss (BOSS l. 326, 327 ;
etat\REPO\VERROU\105\qui.txtporte la ligne de reprise) ;sk-repo§ 2 ne prévoit que « signalé, jamais forcé ». - B2 ordre « fait » et commit :
lp-repo§ 4 R-REPO1 écrit « fait » et la ligne deREPO-JOURNAL.mdavant le commit ;sk-repo§ 4 étape 7 metfait (<hash>)après. La coupure a laissé OUTC-R1 « fait » sans commit (BOSS l. 326, 328 ;OUTC-TACHES.mdligne OUTC-R1). - B3 nom cherché : la cellule de contrôle de la ligne OUTC-R1 de
REPO-JOURNAL.mdportait le nom d'utilisateur Windows cherché, corrigée par OUTC-R2 (d1f7ce5, toujours présent dansf4ac257, historique local) ; ORGA1-R3 refusé une première fois pour la même raison (BOSS l. 322). - Effet sur le § 6 (VAL) : comptes de lignes recalculés par la fiche T1 ;
Verrou.ps1 -Rendre -Ticketaccepte unqui.txtà plusieurs lignes (motif^<ticket>sur le texte joint,Get-Quil. 99-120, lu le 2026-10-12).
B.1 sk-repo/SKILL.md
§ 2, inséré après le paragraphe « Piège (mesuré) » de A.1 :
**Reprise après interruption** : un gardien coupé (limite d'API, arrêt de session) laisse `<k>` sans `<k>-libre`. Un
gardien neuf ne reprend ce verrou que pour **le même ticket** et sur consigne écrite de l'orchestrateur, si
`<k>/qui.txt` commence par ce ticket, qu'aucun commit ne le porte (`git log --grep <ticket>`), sans `index.lock` ni
opération en cours ; il ajoute à `qui.txt` la ligne `repris le <date> par <session>, même ticket <ticket>`, reprend le
ticket à l'étape 2 du § 4 et crée `<k>-libre` à la fin. Autre ticket, `qui.txt` illisible ou doute : rien d'écrit,
`BLOCKED-VERROU`. Source : LifePlay, OUTC-R1 (verrou 105, pris le 2026-10-11, repris le 2026-10-12 ; BOSS l. 327).
§ 4, ligne de l'étape 7 remplacée par :
7. **Suite** : tag, puis pin (§ 5) ; ligne au journal (§ 7) ; statut `fait (<hash>)` ; verrou rendu. Si le projet
emporte le ticket et sa ligne de journal dans le commit (LifePlay : R-REPO1, `lp-repo` § 4), statut `fait` et ligne
s'écrivent juste avant l'étape 5, sans hash ; commit en échec : statut `refusé`, ligne de journal corrigée.
§ 4, inséré après la ligne « Échec à une étape : … verrou rendu. » :
**Statut `fait` sans commit** (`git log --grep <ticket>` vide) = passage interrompu, jamais un ticket fait : le gardien
suivant le signale, l'orchestrateur remet le statut à `demandé` et relance (reprise du verrou : § 2). Source :
LifePlay, OUTC-R1 marqué `fait` sans commit après la coupure du 2026-10-11 (BOSS l. 326, 328).
§ 9, ajouté en fin de section :
Contrôle de donnée personnelle (nom d'utilisateur, adresse, dossier personnel) : la valeur cherchée se lit dans une
variable (`$env:USERNAME`) et ne s'écrit jamais, ni dans une commande citée, ni dans un ticket, un journal ou un
livrable ; la trace dit « nom d'utilisateur : 0 occurrence ». Source : LifePlay, ligne OUTC-R1 de `REPO-JOURNAL.md`
corrigée par OUTC-R2 (`d1f7ce5`) ; ORGA1-R3 refusé une première fois (BOSS l. 322).
B.2 lp-repo/SKILL.md
§ 4, ligne R-REPO1 : ajouter en fin de ligne (après « l'arbre est propre après chaque ticket. Un refus s'écrit de même
(statut refusé, ligne de journal) sans commit. ») la phrase :
Un ticket `fait` sans commit (`git log --grep <ticket>` vide) = passage interrompu (`sk-repo` § 4).
§ 10, deux puces ajoutées après la puce A.2 :
- Reprise d'un verrou après interruption (`sk-repo` § 2) : `Tools\Verrou.ps1` n'a pas d'action de reprise ; la ligne
de reprise s'ajoute à `qui.txt`, puis `Verrou.ps1 -Rendre -Ticket <ticket>` en fin de ticket (verrou 105, OUTC-R1,
2026-10-12).
- Trace d'un contrôle de nom d'utilisateur : le nom ne s'écrit jamais (`sk-repo` § 9) ; la ligne OUTC-R1 de
`REPO-JOURNAL.md` le portait (corrigée par OUTC-R2, `d1f7ce5` ; reste dans `f4ac257`, historique local non poussé).