Repository navigation
feat(console): an owner or an admin reads « Last seen » on Members (FRU-247) - #315
Conversation
There was a problem hiding this comment.
Score de confiance : 3/5 · members/seen request as well as the member list, so a slow or hanging seen route blocks the whole table. The route itself is not in the diff, so its owner-or-admin check and its date format are unverified.
🔍 Une revue plus poussée est conseillée : Vérifier que la route /console/workspaces/:id/members/seen du worker ne renvoie les jours qu'aux propriétaires et administrateurs, et qu'elle ne renvoie qu'un jour sans heure, comme le promet seenOn.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,006 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Reply to the lite review of « Le tableau des membres attend la route seen » (P1): right, fixed in
|
There was a problem hiding this comment.
Score de confiance : 4/5 · GET /console/workspaces/<id>/members/seen existe et n'est ouverte qu'aux propriétaires et administrateurs ; ce diff n'en contient pas la moindre trace.
🔍 Une revue plus poussée est conseillée : Vérifier dans apps/worker que la route members/seen existe et refuse les membres et les invités, car elle expose quand chaque compte a été vu pour la dernière fois.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,007 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
On the checks and the lite review of e2e failed on one test that this PR does not touch. « Route members/seen absente du diff » (P2): the route is in the base of this PR, and it holds what the finding asks. In
A worker without the route answers |
f6fc1d0 to
00f9831
Compare
There was a problem hiding this comment.
Score de confiance : 3/5 · …/members/seen que la PR n'ajoute pas et dont le contrôle d'accès côté worker n'est pas visible ; le reste du changement est correct.
🔍 Une revue plus poussée est conseillée : Vérifier dans le worker que la route members/seen existe et refuse les lectures aux non-admins, car une fuite de dates de connexion entre membres serait un défaut de sécurité.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,006 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Rebased by hand on the base updated by fru-authfix ( |
|
Reply to the lite review of |
|
@sakuga-review review balanced |
There was a problem hiding this comment.
Score de confiance : 3/5 ·
Niveau balanced · anthropic/claude-sonnet-5.5 · 0,105 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Reply to the balanced review of 1. « Réponse seen tardive appliquée à un autre workspace » (P1): right for a read made again, fixed in
2. « Pas de remise à asking lors d'une relecture » (P2): right, fixed in the same commit. A read made again sets the days to « asking »: the days shown before are taken away while the next ones are read, in the room they keep. Nothing of a row moves, as the test « the table does not wait for « Last seen » » measures. Locally: |
There was a problem hiding this comment.
Score de confiance : 4/5 ·
🔍 Une revue plus poussée est conseillée : Vérifier la route worker GET /console/workspaces/:id/members/seen : elle doit refuser les rôles membre et invité et ne renvoyer que les comptes de l'organisation demandée.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,006 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
For the next review: since the balanced of |
|
@sakuga-review review balanced |
There was a problem hiding this comment.
Score de confiance : 3/5 ·
Niveau balanced · anthropic/claude-sonnet-5.5 · 0,103 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Reply to the balanced review of « Lecture seen non invalidée quand le rôle ou le workspace change » (P2): the case cannot happen while the screen is mounted. Nothing changed.
|
78b5d09 to
1a7feda
Compare
|
Rebased by hand on #307 as fru-authfix put it on |
1a7feda to
c60252f
Compare
There was a problem hiding this comment.
Score de confiance : 3/5 · refuses qui semble absent du type Worker.
🔍 Une revue plus poussée est conseillée : Vérifier que la route GET /console/workspaces//members/seen du worker refuse les comptes qui ne sont ni propriétaire ni administrateur de l'espace de travail, car ce diff ne montre que la console.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,007 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Rebased by hand on #307 as fru-authfix put it on Locally on the stack (with #316): console unit tests 119; |
|
Reply to the lite review of
|
…RU-247) The last column of the table is « Last seen » for an owner or an admin, read from …/members/seen (FRU-249): a day of UTC and never an hour, « Today », « Yesterday », « 3 days ago », then the day, and « Not seen yet » for who was not seen since it came. It is read with the members, so the table is drawn once with it and nothing of a row moves when the day arrives. Who else reads the screen, or a worker that refuses the days, gets the day somebody joined, as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…RU-247) Found by the lite review: with Promise.all, a slow …/members/seen held the whole table, up to the 15 s of a call. The members are drawn as soon as they are read, and the days come on their own. The cell of a day keeps the room of « Not seen yet », so a day that arrives moves nothing of the row. The test holds the days, sees the five rows, releases them, and measures « Remove » and « Cancel »: it fails when the table waits. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…the read made after (FRU-247) Found by the balanced review: …/members/seen was not tied to its read. When the members were read again (an invitation whose message did not leave, a cancelled invitation that was gone), a late answer of the read before replaced the days of the one after. Each read now has its number, and only the answer of the last one is taken; the days shown are taken away while the next ones are read. The test holds the first days, reads again, then releases them: it fails on the head before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
c60252f to
961c59b
Compare
There was a problem hiding this comment.
Score de confiance : 4/5 · members/seen n'est pas visible dans cette PR, et le test « les jours d'une lecture ancienne » réfère à un champ refuses absent du type Worker, ce qui peut casser le typecheck.
🔍 Une revue plus poussée est conseillée : Vérifier que la route worker members/seen refuse bien les lectures aux membres et aux invités, et que la date de dernière connexion d'un collègue n'est exposée qu'aux propriétaires et administrateurs.
Commentez @sakuga-review review balanced (environ 5 centimes) ou @sakuga-review review heavy (10 centimes à 1 dollar).
Niveau lite · anthropic/claude-haiku-5.5 · 0,007 $ · Le résumé, le diagramme et la liste des constats sont à la fin de la description de la PR.
|
Rebased by hand on Locally with #316 and #331 on top: console unit tests 123; |
|
Reply to the lite review of |
For Mathieu, with its route. Stacked on #307 (FRU-249, the days of « Last seen »), itself on #299: merge them first. The screen is not critical by itself, but it shows a new piece of data, chosen under Q7.
Mathieu's decision on Q7, 2026-10-13: a short label of the browser per session, and « Last seen » visible to owners and admins only. The route of #307, read in its code:
GET /console/workspaces/<id>/members/seenanswers{seen: {<accountId>: "YYYY-MM-DD"}}(a day of UTC) to an owner or an admin, and403 forbiddento the others. A member absent fromseenwas not seen since it came.What changes
Promise.allheld the table up to the 15 s of a call). The cell of a day keeps the room of « Not seen yet », so a day that arrives moves nothing of a row: « Remove » and « Cancel » stay where they are (the rule of fix(console): « Sign out » does not move when the list of the browsers arrives (FRU-248) #294–fix(console): a read made again keeps the rows of Members on the screen (FRU-271) #296).Gaps with the mockup
Captures in
agent-coord/scratch/fru-sf-workspace/fru-247-seen/(they cannot be uploaded):members-last-seenandmembers-joined-member, in English and French,-1440.pngand-390.png. The rest of the screen is unchanged since #268 and #296.French added
« Yesterday » and « {count} days ago » are on
main(#302).Proof
e2e/console-members.spec.ts, four new tests, on stubs:seenleaves « Joined ».Locally:
console-members21,console-invitation13,console-confirm4,console-narrow5.Not verified
The worker of #307 itself (stubs only, read from its code); Firefox, Safari, a screen reader.
🤖 Generated with Claude Code
Sakuga Review · Score de confiance : 4/5
Mergeable après vérification : la fonction « Last seen » est cohérente côté console, mais la route worker
members/seenn'est pas visible dans cette PR, et le test « les jours d'une lecture ancienne » réfère à un champrefusesabsent du typeWorker, ce qui peut casser le typecheck.🔍 Une revue plus poussée est conseillée : Vérifier que la route worker
members/seenrefuse bien les lectures aux membres et aux invités, et que la date de dernière connexion d'un collègue n'est exposée qu'aux propriétaires et administrateurs.Commentez
@sakuga-review review balanced(environ 5 centimes) ou@sakuga-review review heavy(10 centimes à 1 dollar).Constats
refusesabsent du type Workere2e/console-members.spec.ts:1Le test « les jours d'une lecture ancienne » écrit
worker.refuses = { status: 503, ... }sur un objet de typeWorker, qui ne déclare pas ce champ. Le typecheck échoue, et si le stub ne lit pas ce champ, le chemin « mail-unavailable » n'est jamais déclenché et le test ne prouve rien. Correction : Passer le refus parWorldau moment deworkerWith, ou déclarer le champ dansWorkeret le lire dans le stub de l'invitation.Résumé
La PR ajoute la colonne « Last seen » de la page Members, lue pour un propriétaire ou un administrateur via
GET …/members/seen, en parallèle de la liste des membres. Les jours d'une lecture ancienne sont écartés, et la cellule garde sa largeur pour que rien ne bouge dans une ligne. J'ai relu seenOn, read, Row et les nouvelles clés de traduction, qui existent toutes dans messages.fr.ts. Je n'ai pas pu contrôler la route worker ni son autorisation, ni le comportement réel du stub de test.Diagramme
%%{init: {'theme': 'neutral'}}%% flowchart LR A["members.tsx read()"] --> B["call members/seen"] A --> C["call list-members"] B --> D["setSeen si lecture courante"] D --> E["Row lastOf -› seenOn"]Non relu
/console/workspaces/:id/members/seenn'est pas dans le diff ni dans le Context ; son contrôle d'autorisation (propriétaire ou admin seulement, membre de l'espace) et sa réponse pour un compte sans droit ne sont pas vérifiésseenOnhors de cette page ne sont pas visibles ; l'export d'une fonction non-route depuis un module de route peut gêner le rechargement à chaudheldet delateravec le double effet React en développement n'a pas pu être vérifié sans l'exécuterRevues (7) · Dernier commit relu : fix(console): the days of a read made before do... · Niveau
lite·anthropic/claude-haiku-5.5· 0,007 $