Repousser un projet en bloc, sauf ce dont on ne décide pas
Glisser la barre résumé décale toutes les phases du même nombre de jours, écarts conservés : un projet engagé glisse souvent, et le faire phase par phase les déformait. Restent en place ce qui est terminé — on ne réécrit pas le passé — et les phases à date imposée, nouveau booléen `fixed` pour ce qui est délégué ou tenu du dehors. D'où le format en version 6 : sans l'incrément, un binaire antérieur effacerait ces dates imposées à la première sauvegarde. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -102,15 +102,62 @@ Gérer les jours ouvrés impose de faire passer chaque calcul de date par un hel
|
||||
aussitôt la question des congés et des jours fériés — donc un calendrier à tenir à jour. Sur des
|
||||
phases qui se comptent en semaines et en mois, l'écart est dans le bruit de l'estimation.
|
||||
|
||||
## 8. La barre cumulative est en lecture seule
|
||||
## 8. La barre cumulative repousse le projet
|
||||
|
||||
La ligne d'un projet porte une barre unique segmentée par phase, qui donne sa forme d'ensemble. On
|
||||
aurait pu la rendre glissable pour décaler tout le projet en bloc.
|
||||
La ligne d'un projet porte une barre unique segmentée par phase, qui donne sa forme d'ensemble. Elle
|
||||
se glisse, et le projet entier se décale avec elle.
|
||||
|
||||
Écarté pour une raison de lisibilité du geste : la même barre représenterait tantôt une phase, tantôt
|
||||
un projet entier, et un glissement de quelques pixels déplacerait alors plusieurs mois de travail
|
||||
d'un coup, sans que l'utilisateur voie ce qui bouge. Elle sert à regarder ; pour modifier, on agit
|
||||
sur les phases.
|
||||
**Ce n'était pas le cas au départ, et le motif du refus mérite d'être conservé** : la même barre
|
||||
représenterait tantôt une phase, tantôt un projet entier, et un glissement de quelques pixels
|
||||
déplacerait alors plusieurs mois de travail d'un coup, sans qu'on voie ce qui bouge. L'argument était
|
||||
juste ; c'est le premier usage réel de l'outil qui l'a renversé. Un projet engagé glisse dans le
|
||||
temps — c'est même la chose qui arrive le plus souvent —, et le faire glisser phase par phase oblige
|
||||
à répéter le même geste cinq fois en priant pour que les écarts se conservent. Or ils ne se
|
||||
conservent pas : chaque phase s'accroche à son propre lundi, et un projet ainsi déplacé se
|
||||
déforme un peu à chaque passage.
|
||||
|
||||
L'objection d'origine n'a pas été balayée, elle a été traitée :
|
||||
|
||||
- **Les barres de phase suivent le résumé pendant le geste.** On voit exactement ce qu'on déplace
|
||||
pendant qu'on le déplace, y compris plié — où les segments colorés de la barre suffisent à le
|
||||
montrer. C'était le cœur du reproche, et il tombe.
|
||||
- **Le delta est calculé une fois, sur la première phase qui bouge, puis appliqué tel quel
|
||||
partout.** Les écarts entre phases sont conservés au jour près : le projet est repoussé, il n'est
|
||||
pas replanifié. C'est précisément ce que le geste phase par phase ne savait pas faire.
|
||||
- **La référence figée ne suit pas.** Repousser de trois semaines affiche aussitôt une dérive de
|
||||
trois semaines. Le geste ne cache pas ce qu'il coûte, il l'inscrit.
|
||||
|
||||
### Ce qui est fait est fait
|
||||
|
||||
Une phase `done` ne bouge pas. Décaler un projet, c'est reconnaître qu'il prendra plus de temps que
|
||||
prévu, et emporter les phases terminées réécrirait un passé qu'on a vécu — en effaçant du même coup
|
||||
la dérive qu'on cherche à lire.
|
||||
|
||||
Le geste ne « déplace » donc pas toujours : sur un projet à moitié fait, la barre s'**étire**, son
|
||||
bord gauche tient et le reste s'en va. C'est assumé, et c'est même ce qu'on veut voir. Le résumé se
|
||||
repose alors depuis le modèle à chaque mouvement de souris plutôt que d'être translaté, faute de quoi
|
||||
l'aperçu et le résultat divergeraient.
|
||||
|
||||
Le critère est le **statut**, jamais la position dans le calendrier : une phase terminée en avance
|
||||
reste où elle est, une phase `blocked` ou `doing` déjà commencée se décale avec le reste — c'est bien
|
||||
elle qui glisse. Un projet dont toutes les phases sont closes n'a rien à repousser : sa barre perd
|
||||
son `data-role`, garde le curseur par défaut, et le dit dans son infobulle plutôt que d'offrir une
|
||||
prise qui ne mènerait nulle part.
|
||||
|
||||
Rien n'empêche un décalage vers l'arrière de faire chevaucher une phase avec une phase terminée. Il
|
||||
n'y a pas de dépendances entre phases dans ce modèle (section 2) et poser ici une butée en
|
||||
inventerait une par la bande.
|
||||
|
||||
### Pas de poignées
|
||||
|
||||
La barre cumulative se déplace, elle ne se redimensionne pas. Étirer un projet supposerait de dilater
|
||||
chaque phase au prorata, avec des arrondis qui déforment les durées courtes et un résultat qu'on ne
|
||||
peut pas prévoir avant de l'avoir vu. C'est un autre besoin, et il attendra de se présenter.
|
||||
|
||||
Le même geste existe au clavier : sur la ligne d'un projet, `←` et `→` le repoussent d'un jour, là où
|
||||
elles ne faisaient rien. `Maj` n'y ajoute rien, pour la raison qui précède.
|
||||
|
||||
### Ce qui n'a pas changé
|
||||
|
||||
**Elle est affichée que le projet soit plié ou déplié.** Elle ne l'était d'abord qu'en mode plié, ce
|
||||
qui obligeait à replier pour savoir où en était le projet entier — donc à perdre la vue qu'on était
|
||||
@@ -120,8 +167,10 @@ en train d'éditer.
|
||||
plié, au motif qu'elle y était seule sur sa ligne. C'était une erreur : plier un couloir ne change
|
||||
rien à ce que cette barre représente, et la voir changer d'aspect au pli laissait croire à deux
|
||||
objets différents. Elle garde donc partout la même hauteur, plus mince qu'une barre de phase —
|
||||
puisqu'elle voisine avec elles dès que le projet est déplié, et qu'elle ne se glisse pas. Le fantôme
|
||||
de référence se cale dessous, d'où sa variante `--cumulatif`.
|
||||
puisqu'elle voisine avec elles dès que le projet est déplié. Le fantôme de référence se cale dessous,
|
||||
d'où sa variante `--cumulatif`. Étant mince, elle se repère mal une fois saisie : un anneau à sa
|
||||
couleur la décolle du couloir le temps du geste, sans toucher à sa géométrie, ce qui décalerait ce
|
||||
qu'on est en train de viser.
|
||||
|
||||
## 9. Accroche à la semaine
|
||||
|
||||
@@ -1052,3 +1101,78 @@ urgence en début de mandat.
|
||||
|
||||
**Un retour arrière déclaré**, d'engagé vers envisagé. On déplace les dates, cela suffit. Le seul
|
||||
cas où il survient — retirer la dernière phase — se résout tout seul par la règle des bornes.
|
||||
|
||||
## 28. Une date qu'on ne décide pas
|
||||
|
||||
Toutes les phases d'un planning ne sont pas nôtres. Certaines sont **déléguées** — un prestataire les
|
||||
tient, on n'a que le résultat —, d'autres portent une **contrainte extérieure** : une fenêtre de
|
||||
maintenance chez l'hébergeur, une échéance réglementaire, une date de salon. Une phase reçoit donc un
|
||||
booléen `fixed`, et le décalage d'un projet (section 8) ne l'emporte pas.
|
||||
|
||||
Sans elle, le geste ajouté en section 8 était activement nuisible : repousser un projet de trois
|
||||
semaines repoussait aussi l'audit du commissaire aux comptes, ce qui est faux et ce que rien ne
|
||||
signalait.
|
||||
|
||||
### Pourquoi ce n'est pas un cinquième statut
|
||||
|
||||
C'était la formulation spontanée — « ajouter un état ». Elle a été écartée, parce que les quatre
|
||||
statuts existants disent tous **l'avancement** (section 6), et qu'une date imposée n'est pas une
|
||||
étape du travail : une phase déléguée est tour à tour à venir, en cours, terminée, et elle reste
|
||||
déléguée tout du long. En faire une cinquième valeur aurait créé une exclusion mutuelle fausse — on
|
||||
ne pourrait plus dire d'une phase déléguée qu'elle est bloquée, ce qui est précisément la situation
|
||||
qu'on veut voir venir de loin.
|
||||
|
||||
Le modèle avait déjà le patron : **`milestone` est un booléen à côté de `status`**, pas un statut. Un
|
||||
jalon peut être `todo` ou `done` sans que cela pose la moindre question. `fixed` suit exactement le
|
||||
même chemin, et les deux se combinent librement — un jalon à date imposée est le cas le plus courant
|
||||
des deux.
|
||||
|
||||
**À ne pas confondre avec `blocked`**, dont il est le voisin immédiat dans un formulaire :
|
||||
`blocked` dit *ça n'avance pas*, `fixed` dit *cette date ne m'appartient pas*. Une phase peut être
|
||||
les deux, l'une ou l'autre, ou aucune. Le libellé retenu — « date imposée » plutôt que « fixe » —
|
||||
sert d'abord à cela : il nomme la cause, là où « fixe » n'aurait nommé que l'effet, et six mois plus
|
||||
tard c'est la cause qu'on cherche en relisant.
|
||||
|
||||
### Le verrou est souple
|
||||
|
||||
Une phase à date imposée **se glisse toujours seule**, à la souris comme aux flèches. Seul le
|
||||
décalage de son projet l'épargne. « Imposée » veut donc dire *indépendante du projet*, et non
|
||||
*immuable* : quand l'hébergeur déplace son créneau, on déplace la barre, sans rien avoir à décocher.
|
||||
|
||||
Le verrou dur avait été envisagé — barre non glissable, dates saisies au panneau — au motif qu'on
|
||||
marque une phase pour la protéger d'un geste accidentel. Il ajoutait une friction permanente pour un
|
||||
risque occasionnel, et il aurait fait diverger cette case de son modèle, `milestone`, qui n'empêche
|
||||
rien non plus.
|
||||
|
||||
Corollaire : un projet dont toutes les phases sont terminées **ou** imposées n'offre aucune prise, et
|
||||
sa barre cumulative le dit dans son infobulle. C'est le comportement déjà écrit pour les projets
|
||||
entièrement clos ; il n'a pas eu à changer, seule la liste des phases emportées s'est resserrée.
|
||||
|
||||
### Ce que ça donne à l'œil
|
||||
|
||||
Deux **taquets** verticaux aux extrémités de la barre, comme les butées d'une pièce qui ne coulisse
|
||||
plus ; un **cercle** pour un jalon, qui n'a pas d'extrémités où en poser. La marque se cumule avec
|
||||
les quatre textures de statut au lieu de leur disputer la place — c'est bien une phase à venir, en
|
||||
cours ou bloquée, qui se trouve en plus tenue par le dehors.
|
||||
|
||||
Elle se pose en `box-shadow` interne, donc sans toucher à la géométrie : la barre garde exactement la
|
||||
largeur de ses dates. Sur une phase de deux jours, les taquets occupent presque toute la barre et la
|
||||
texture de statut disparaît ; c'est accepté, une fenêtre de maintenance de deux jours se lit de toute
|
||||
façon à son infobulle.
|
||||
|
||||
### Le format passe en version 6
|
||||
|
||||
Un champ ajouté n'y obligerait pas — la v5 se relit sans encombre. Ce qui y oblige, c'est le sens du
|
||||
numéro : le validateur reconstruit chaque phase champ par champ et laisse tomber ce qu'il ne connaît
|
||||
pas. Sans incrément, un binaire antérieur ouvrirait un fichier v6 sans broncher et en effacerait
|
||||
toutes les dates imposées à la première sauvegarde — les phases concernées se remettant alors à
|
||||
suivre le décalage de leur projet, en silence. C'est exactement le genre de perte que ce numéro
|
||||
existe pour empêcher.
|
||||
|
||||
La migration ne devine rien : toute phase héritée reçoit `false`. Rien dans les données ne permettrait
|
||||
d'inférer laquelle était déléguée, et un faux positif ici immobiliserait une phase sans qu'on
|
||||
comprenne pourquoi.
|
||||
|
||||
Au passage, `donneesInitiales` dans `main.go` a été remis d'aplomb : le serveur écrivait encore
|
||||
`version 4` pour un planning vide, deux versions en retard. Sans conséquence — le validateur accepte
|
||||
un fichier plus ancien et le remonte — mais un fichier neuf se déclarait d'avant le cycle de vie.
|
||||
|
||||
Reference in New Issue
Block a user