@cat-factory/app 0.117.0 → 0.119.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -111,6 +111,44 @@ describe('workspace store refresh ordering', () => {
111
111
  // The fresh snapshot won and the stale one was discarded: the spawned card survives.
112
112
  expect(board.getBlock('spawned')).toBeDefined()
113
113
  })
114
+
115
+ // Regression for the SECOND clobber axis: a refresh vs an interleaved live `upsert`. The
116
+ // `refreshSeq` guard above only orders refreshes against each OTHER — it does nothing when a
117
+ // single refresh's (slow) fetch overlaps a targeted live event. A run's status transitions
118
+ // (…→ in_progress → pr_ready/done) arrive as `execution`-event `board.upsert`s; a refresh whose
119
+ // snapshot was FETCHED while the block was still `in_progress` must not, on resolving later,
120
+ // replace that block back to the stale status. This was the reliable-under-CI-latency e2e
121
+ // timeout where a run never showed a terminal `data-status`. The board store now stamps each
122
+ // live upsert and `refresh()` captures a baseline before its fetch so the newer live state wins.
123
+ it('a refresh started before a live upsert does not clobber the newer live status', async () => {
124
+ const frame = block('f1')
125
+ const task = block('t1', { level: 'task', parentId: 'f1', status: 'in_progress' })
126
+ let resolveRefresh!: (s: WorkspaceSnapshot) => void
127
+ const getWorkspace = vi
128
+ .fn()
129
+ // 1) switchTo — the task is mid-run (`in_progress`).
130
+ .mockResolvedValueOnce(snapshot('ws1', [frame, task]))
131
+ // 2) a refresh whose fetch is in flight while a live terminal event lands.
132
+ .mockReturnValueOnce(new Promise<WorkspaceSnapshot>((r) => (resolveRefresh = r)))
133
+ vi.stubGlobal('useApi', () => ({ getWorkspace }))
134
+
135
+ const ws = useWorkspaceStore()
136
+ const board = useBoardStore()
137
+ await ws.switchTo('ws1')
138
+ expect(board.getBlock('t1')?.status).toBe('in_progress')
139
+
140
+ // A refresh starts (captures the board baseline; its snapshot still shows `in_progress`).
141
+ const pass = ws.refresh()
142
+ // A live execution event lands mid-fetch: the run reached terminal, so the block is `done`.
143
+ board.upsert(block('t1', { level: 'task', parentId: 'f1', status: 'done' }))
144
+ expect(board.getBlock('t1')?.status).toBe('done')
145
+ // The now-stale refresh resolves with its older `in_progress` snapshot.
146
+ resolveRefresh(snapshot('ws1', [frame, block('t1', { level: 'task', parentId: 'f1' })]))
147
+ await pass
148
+
149
+ // The live terminal status survives — the stale refresh did NOT clobber it back.
150
+ expect(board.getBlock('t1')?.status).toBe('done')
151
+ })
114
152
  })
115
153
 
116
154
  // Cold-open waterfall flattening (app-startup initiative, item 8): `init()` fetches the persisted
@@ -85,8 +85,13 @@ export const useWorkspaceStore = defineStore(
85
85
  () => workspaces.value.find((w) => w.id === workspaceId.value) ?? null,
86
86
  )
87
87
 
88
- /** Push a snapshot into the data stores. */
89
- function hydrate(snapshot: WorkspaceSnapshot) {
88
+ /**
89
+ * Push a snapshot into the data stores. `boardSince` (captured BEFORE this snapshot's fetch)
90
+ * lets the board store preserve any block live-`upsert`ed while the fetch was in flight, so a
91
+ * slower refresh can't clobber a newer live status (see `useBoardStore().hydrate`). Omitted by
92
+ * fresh loads (init/switch/create), where there is no in-flight-upsert race to guard.
93
+ */
94
+ function hydrate(snapshot: WorkspaceSnapshot, boardSince?: number) {
90
95
  // A change of active board (or the first load) — drop the per-block caches that are
91
96
  // NOT part of the snapshot (reviews, brainstorm/consensus sessions, the GitHub
92
97
  // projection) so a switched-to board never shows the previous one's stale state.
@@ -116,7 +121,7 @@ export const useWorkspaceStore = defineStore(
116
121
  const i = workspaces.value.findIndex((w) => w.id === snapshot.workspace.id)
117
122
  if (i >= 0) workspaces.value[i] = snapshot.workspace
118
123
  else workspaces.value.unshift(snapshot.workspace)
119
- useBoardStore().hydrate(snapshot.blocks)
124
+ useBoardStore().hydrate(snapshot.blocks, boardSince)
120
125
  useBoardStore().hydrateArchived(snapshot.archivedServices ?? [])
121
126
  usePipelinesStore().hydrate(snapshot.pipelines, snapshot.pipelineCatalogVersions)
122
127
  useExecutionStore().hydrate(snapshot.executions, snapshot.workspace.id)
@@ -291,11 +296,17 @@ export const useWorkspaceStore = defineStore(
291
296
  const targetId = workspaceId.value
292
297
  if (!targetId) return
293
298
  const seq = ++refreshSeq
299
+ // Capture the board's live-upsert baseline BEFORE the fetch: any block upserted by a live
300
+ // event while this (potentially slow) snapshot is in flight is newer than the snapshot, so
301
+ // `hydrate` must NOT clobber it back. The `refreshSeq` guard below only orders refreshes
302
+ // against each OTHER — this guards a refresh against an interleaved live upsert (e.g. a
303
+ // run's terminal status landing mid-fetch), the coherence hazard under CI latency.
304
+ const boardSince = useBoardStore().hydrateBaseline()
294
305
  const snapshot = await api.getWorkspace(targetId)
295
306
  // A newer refresh was issued (or the active board switched) while this fetch was in flight —
296
307
  // discard this older/staler result so it can't clobber the newer hydrate.
297
308
  if (seq !== refreshSeq || workspaceId.value !== targetId) return
298
- hydrate(snapshot)
309
+ hydrate(snapshot, boardSince)
299
310
  }
300
311
 
301
312
  /** The active workspace id, or throw if the app isn't bootstrapped yet. */
@@ -38,6 +38,12 @@ export type {
38
38
  ForkDecisionStatus,
39
39
  ForkChoice,
40
40
  ForkDecisionStepState,
41
+ PrReviewStepState,
42
+ PrReviewFinding,
43
+ PrReviewSlice,
44
+ PrReviewSeverity,
45
+ PrReviewCategory,
46
+ PrReviewResolution,
41
47
  GateFailingCheck,
42
48
  GateAttempt,
43
49
  GateStepState,
@@ -1697,7 +1697,8 @@
1697
1697
  "followup_pending": "Als gelesen markieren",
1698
1698
  "initiative": "Als gelesen markieren",
1699
1699
  "markRead": "Als gelesen markieren",
1700
- "fork_decision_pending": "Als gelesen markieren"
1700
+ "fork_decision_pending": "Als gelesen markieren",
1701
+ "pr_review_ready": "Als gelesen markieren"
1701
1702
  }
1702
1703
  },
1703
1704
  "aiProvidersBanner": {
@@ -3923,6 +3924,7 @@
3923
3924
  "release_regression": "Release-Regression",
3924
3925
  "human_test_ready": "Bereit für manuelle Tests",
3925
3926
  "visual_confirmation_ready": "Bereit für visuelle Bestätigung",
3927
+ "pr_review_ready": "PR-Review-Befunde",
3926
3928
  "initiative": "Initiativen-Updates"
3927
3929
  },
3928
3930
  "role": {
@@ -4702,5 +4704,50 @@
4702
4704
  "empty": {
4703
4705
  "title": "Nichts zu entscheiden"
4704
4706
  }
4707
+ },
4708
+ "prReview": {
4709
+ "title": "PR-Review",
4710
+ "titleWithBlock": "PR-Review: {title}",
4711
+ "subtitle": "Wähle die Befunde aus, die bearbeitet werden sollen.",
4712
+ "openPr": "PR öffnen",
4713
+ "summaryLabel": "Zusammenfassung:",
4714
+ "noFindings": "Keine Befunde – der Pull Request sieht sauber aus.",
4715
+ "unsliced": "Sonstige",
4716
+ "selectAll": "Alle auswählen",
4717
+ "clear": "Zurücksetzen",
4718
+ "selectedCount": "{count} ausgewählt",
4719
+ "finish": "Review abschließen",
4720
+ "fix": "Ausgewählte beheben",
4721
+ "post": "Als Kommentare posten",
4722
+ "suggestedFix": "Lösungsvorschlag:",
4723
+ "line": "Zeile {line}",
4724
+ "reviewing": {
4725
+ "title": "Pull Request wird geprüft…",
4726
+ "hint": "Der Diff wird in zusammenhängende Teile zerlegt und einzeln geprüft."
4727
+ },
4728
+ "fixing": {
4729
+ "title": "Ausgewählte Befunde werden behoben…",
4730
+ "hint": "Ein Fixer committet Änderungen für die ausgewählten Befunde auf den Pull-Request-Branch."
4731
+ },
4732
+ "posting": {
4733
+ "title": "Review-Kommentare werden gepostet…",
4734
+ "hint": "Die ausgewählten Befunde werden als Inline-Kommentare im Pull Request veröffentlicht."
4735
+ },
4736
+ "severity": {
4737
+ "blocker": "Blocker",
4738
+ "high": "Hoch",
4739
+ "medium": "Mittel",
4740
+ "low": "Niedrig",
4741
+ "nit": "Kleinigkeit"
4742
+ },
4743
+ "category": {
4744
+ "correctness": "Korrektheit",
4745
+ "security": "Sicherheit",
4746
+ "performance": "Performance",
4747
+ "maintainability": "Wartbarkeit",
4748
+ "style": "Stil",
4749
+ "test": "Tests",
4750
+ "other": "Sonstiges"
4751
+ }
4705
4752
  }
4706
4753
  }
@@ -1626,7 +1626,8 @@
1626
1626
  "followup_pending": "Mark read",
1627
1627
  "initiative": "Mark read",
1628
1628
  "markRead": "Mark read",
1629
- "fork_decision_pending": "Mark read"
1629
+ "fork_decision_pending": "Mark read",
1630
+ "pr_review_ready": "Mark read"
1630
1631
  }
1631
1632
  },
1632
1633
  "aiProvidersBanner": {
@@ -3072,6 +3073,7 @@
3072
3073
  "release_regression": "Release regression",
3073
3074
  "human_test_ready": "Ready for human testing",
3074
3075
  "visual_confirmation_ready": "Ready for visual confirmation",
3076
+ "pr_review_ready": "PR review findings",
3075
3077
  "initiative": "Initiative updates"
3076
3078
  },
3077
3079
  "role": {
@@ -4828,5 +4830,50 @@
4828
4830
  "empty": {
4829
4831
  "title": "Nothing to decide"
4830
4832
  }
4833
+ },
4834
+ "prReview": {
4835
+ "title": "PR review",
4836
+ "titleWithBlock": "PR review: {title}",
4837
+ "subtitle": "Select the findings to act on.",
4838
+ "openPr": "Open PR",
4839
+ "summaryLabel": "Summary:",
4840
+ "noFindings": "No findings — the pull request looks clean.",
4841
+ "unsliced": "Other",
4842
+ "selectAll": "Select all",
4843
+ "clear": "Clear",
4844
+ "selectedCount": "{count} selected",
4845
+ "finish": "Finish review",
4846
+ "fix": "Fix selected",
4847
+ "post": "Post as comments",
4848
+ "suggestedFix": "Suggested fix:",
4849
+ "line": "line {line}",
4850
+ "reviewing": {
4851
+ "title": "Reviewing the pull request…",
4852
+ "hint": "Slicing the diff into cohesive chunks and reviewing each one."
4853
+ },
4854
+ "fixing": {
4855
+ "title": "Fixing the selected findings…",
4856
+ "hint": "A fixer is committing changes for the selected findings onto the pull request branch."
4857
+ },
4858
+ "posting": {
4859
+ "title": "Posting review comments…",
4860
+ "hint": "Publishing the selected findings as inline comments on the pull request."
4861
+ },
4862
+ "severity": {
4863
+ "blocker": "Blocker",
4864
+ "high": "High",
4865
+ "medium": "Medium",
4866
+ "low": "Low",
4867
+ "nit": "Nit"
4868
+ },
4869
+ "category": {
4870
+ "correctness": "Correctness",
4871
+ "security": "Security",
4872
+ "performance": "Performance",
4873
+ "maintainability": "Maintainability",
4874
+ "style": "Style",
4875
+ "test": "Tests",
4876
+ "other": "Other"
4877
+ }
4831
4878
  }
4832
4879
  }
@@ -1560,7 +1560,8 @@
1560
1560
  "followup_pending": "Marcar como leída",
1561
1561
  "initiative": "Marcar como leída",
1562
1562
  "markRead": "Marcar como leída",
1563
- "fork_decision_pending": "Marcar como leído"
1563
+ "fork_decision_pending": "Marcar como leído",
1564
+ "pr_review_ready": "Marcar como leída"
1564
1565
  },
1565
1566
  "toast": {
1566
1567
  "acted": "Marcado como resuelto",
@@ -2979,6 +2980,7 @@
2979
2980
  "release_regression": "Regresion de version",
2980
2981
  "human_test_ready": "Listo para pruebas humanas",
2981
2982
  "visual_confirmation_ready": "Listo para confirmacion visual",
2983
+ "pr_review_ready": "Hallazgos de revisión de PR",
2982
2984
  "initiative": "Actualizaciones de la iniciativa"
2983
2985
  },
2984
2986
  "role": {
@@ -4690,5 +4692,50 @@
4690
4692
  "empty": {
4691
4693
  "title": "Nada que decidir"
4692
4694
  }
4695
+ },
4696
+ "prReview": {
4697
+ "title": "Revisión de PR",
4698
+ "titleWithBlock": "Revisión de PR: {title}",
4699
+ "subtitle": "Selecciona los hallazgos sobre los que actuar.",
4700
+ "openPr": "Abrir PR",
4701
+ "summaryLabel": "Resumen:",
4702
+ "noFindings": "Sin hallazgos: el pull request parece correcto.",
4703
+ "unsliced": "Otros",
4704
+ "selectAll": "Seleccionar todo",
4705
+ "clear": "Limpiar",
4706
+ "selectedCount": "{count} seleccionados",
4707
+ "finish": "Finalizar revisión",
4708
+ "fix": "Corregir seleccionados",
4709
+ "post": "Publicar como comentarios",
4710
+ "suggestedFix": "Corrección sugerida:",
4711
+ "line": "línea {line}",
4712
+ "reviewing": {
4713
+ "title": "Revisando el pull request…",
4714
+ "hint": "Dividiendo el diff en bloques coherentes y revisando cada uno."
4715
+ },
4716
+ "fixing": {
4717
+ "title": "Corrigiendo los hallazgos seleccionados…",
4718
+ "hint": "Un corrector está confirmando cambios para los hallazgos seleccionados en la rama del pull request."
4719
+ },
4720
+ "posting": {
4721
+ "title": "Publicando comentarios de revisión…",
4722
+ "hint": "Publicando los hallazgos seleccionados como comentarios en línea en el pull request."
4723
+ },
4724
+ "severity": {
4725
+ "blocker": "Bloqueante",
4726
+ "high": "Alta",
4727
+ "medium": "Media",
4728
+ "low": "Baja",
4729
+ "nit": "Menor"
4730
+ },
4731
+ "category": {
4732
+ "correctness": "Corrección",
4733
+ "security": "Seguridad",
4734
+ "performance": "Rendimiento",
4735
+ "maintainability": "Mantenibilidad",
4736
+ "style": "Estilo",
4737
+ "test": "Pruebas",
4738
+ "other": "Otros"
4739
+ }
4693
4740
  }
4694
4741
  }
@@ -1560,7 +1560,8 @@
1560
1560
  "followup_pending": "Marquer comme lu",
1561
1561
  "initiative": "Marquer comme lu",
1562
1562
  "markRead": "Marquer comme lu",
1563
- "fork_decision_pending": "Marquer comme lu"
1563
+ "fork_decision_pending": "Marquer comme lu",
1564
+ "pr_review_ready": "Marquer comme lu"
1564
1565
  },
1565
1566
  "toast": {
1566
1567
  "acted": "Marqué comme traité",
@@ -2979,6 +2980,7 @@
2979
2980
  "release_regression": "Regression de version",
2980
2981
  "human_test_ready": "Pret pour les tests humains",
2981
2982
  "visual_confirmation_ready": "Pret pour la confirmation visuelle",
2983
+ "pr_review_ready": "Points de revue de PR",
2982
2984
  "initiative": "Mises a jour de l'initiative"
2983
2985
  },
2984
2986
  "role": {
@@ -4690,5 +4692,50 @@
4690
4692
  "empty": {
4691
4693
  "title": "Rien à décider"
4692
4694
  }
4695
+ },
4696
+ "prReview": {
4697
+ "title": "Revue de PR",
4698
+ "titleWithBlock": "Revue de PR : {title}",
4699
+ "subtitle": "Sélectionnez les points à traiter.",
4700
+ "openPr": "Ouvrir la PR",
4701
+ "summaryLabel": "Résumé :",
4702
+ "noFindings": "Aucun point relevé — la pull request semble propre.",
4703
+ "unsliced": "Autres",
4704
+ "selectAll": "Tout sélectionner",
4705
+ "clear": "Effacer",
4706
+ "selectedCount": "{count} sélectionné(s)",
4707
+ "finish": "Terminer la revue",
4708
+ "fix": "Corriger la sélection",
4709
+ "post": "Publier en commentaires",
4710
+ "suggestedFix": "Correction suggérée :",
4711
+ "line": "ligne {line}",
4712
+ "reviewing": {
4713
+ "title": "Revue de la pull request…",
4714
+ "hint": "Découpage du diff en blocs cohérents et revue de chacun."
4715
+ },
4716
+ "fixing": {
4717
+ "title": "Correction des points sélectionnés…",
4718
+ "hint": "Un correcteur valide des modifications pour les points sélectionnés sur la branche de la pull request."
4719
+ },
4720
+ "posting": {
4721
+ "title": "Publication des commentaires de revue…",
4722
+ "hint": "Publication des points sélectionnés en commentaires en ligne sur la pull request."
4723
+ },
4724
+ "severity": {
4725
+ "blocker": "Bloquant",
4726
+ "high": "Élevée",
4727
+ "medium": "Moyenne",
4728
+ "low": "Faible",
4729
+ "nit": "Mineur"
4730
+ },
4731
+ "category": {
4732
+ "correctness": "Exactitude",
4733
+ "security": "Sécurité",
4734
+ "performance": "Performance",
4735
+ "maintainability": "Maintenabilité",
4736
+ "style": "Style",
4737
+ "test": "Tests",
4738
+ "other": "Autre"
4739
+ }
4693
4740
  }
4694
4741
  }
@@ -1560,7 +1560,8 @@
1560
1560
  "followup_pending": "סמן כנקרא",
1561
1561
  "initiative": "סמן כנקרא",
1562
1562
  "markRead": "סמן כנקרא",
1563
- "fork_decision_pending": "סמן כנקרא"
1563
+ "fork_decision_pending": "סמן כנקרא",
1564
+ "pr_review_ready": "סמן כנקרא"
1564
1565
  },
1565
1566
  "toast": {
1566
1567
  "acted": "סומן כטופל",
@@ -2990,6 +2991,7 @@
2990
2991
  "release_regression": "רגרסיית שחרור",
2991
2992
  "human_test_ready": "מוכן לבדיקה אנושית",
2992
2993
  "visual_confirmation_ready": "מוכן לאישור חזותי",
2994
+ "pr_review_ready": "ממצאי בדיקת PR",
2993
2995
  "initiative": "עדכוני יוזמה"
2994
2996
  },
2995
2997
  "role": {
@@ -4701,5 +4703,50 @@
4701
4703
  "empty": {
4702
4704
  "title": "אין מה להחליט"
4703
4705
  }
4706
+ },
4707
+ "prReview": {
4708
+ "title": "בדיקת PR",
4709
+ "titleWithBlock": "בדיקת PR: {title}",
4710
+ "subtitle": "בחר את הממצאים לטיפול.",
4711
+ "openPr": "פתח PR",
4712
+ "summaryLabel": "סיכום:",
4713
+ "noFindings": "אין ממצאים — בקשת המשיכה נראית תקינה.",
4714
+ "unsliced": "אחר",
4715
+ "selectAll": "בחר הכול",
4716
+ "clear": "נקה",
4717
+ "selectedCount": "{count} נבחרו",
4718
+ "finish": "סיים בדיקה",
4719
+ "fix": "תקן נבחרים",
4720
+ "post": "פרסם כהערות",
4721
+ "suggestedFix": "תיקון מוצע:",
4722
+ "line": "שורה {line}",
4723
+ "reviewing": {
4724
+ "title": "בודק את בקשת המשיכה…",
4725
+ "hint": "מחלק את ההבדלים לקטעים לכידים ובודק כל אחד."
4726
+ },
4727
+ "fixing": {
4728
+ "title": "מתקן את הממצאים שנבחרו…",
4729
+ "hint": "מתקן מבצע commit לשינויים עבור הממצאים שנבחרו אל ענף בקשת המשיכה."
4730
+ },
4731
+ "posting": {
4732
+ "title": "מפרסם הערות בדיקה…",
4733
+ "hint": "מפרסם את הממצאים שנבחרו כהערות מוטבעות בבקשת המשיכה."
4734
+ },
4735
+ "severity": {
4736
+ "blocker": "חוסם",
4737
+ "high": "גבוה",
4738
+ "medium": "בינוני",
4739
+ "low": "נמוך",
4740
+ "nit": "זניח"
4741
+ },
4742
+ "category": {
4743
+ "correctness": "נכונות",
4744
+ "security": "אבטחה",
4745
+ "performance": "ביצועים",
4746
+ "maintainability": "תחזוקתיות",
4747
+ "style": "סגנון",
4748
+ "test": "בדיקות",
4749
+ "other": "אחר"
4750
+ }
4704
4751
  }
4705
4752
  }
@@ -1697,7 +1697,8 @@
1697
1697
  "followup_pending": "Segna come letto",
1698
1698
  "initiative": "Segna come letto",
1699
1699
  "markRead": "Segna come letto",
1700
- "fork_decision_pending": "Segna come letto"
1700
+ "fork_decision_pending": "Segna come letto",
1701
+ "pr_review_ready": "Segna come letto"
1701
1702
  }
1702
1703
  },
1703
1704
  "aiProvidersBanner": {
@@ -3923,6 +3924,7 @@
3923
3924
  "release_regression": "Regressione della release",
3924
3925
  "human_test_ready": "Pronto per il test umano",
3925
3926
  "visual_confirmation_ready": "Pronto per la conferma visiva",
3927
+ "pr_review_ready": "Rilievi revisione PR",
3926
3928
  "initiative": "Aggiornamenti dell'iniziativa"
3927
3929
  },
3928
3930
  "role": {
@@ -4702,5 +4704,50 @@
4702
4704
  "empty": {
4703
4705
  "title": "Nulla da decidere"
4704
4706
  }
4707
+ },
4708
+ "prReview": {
4709
+ "title": "Revisione PR",
4710
+ "titleWithBlock": "Revisione PR: {title}",
4711
+ "subtitle": "Seleziona i rilievi su cui intervenire.",
4712
+ "openPr": "Apri PR",
4713
+ "summaryLabel": "Riepilogo:",
4714
+ "noFindings": "Nessun rilievo — la pull request sembra pulita.",
4715
+ "unsliced": "Altro",
4716
+ "selectAll": "Seleziona tutto",
4717
+ "clear": "Cancella",
4718
+ "selectedCount": "{count} selezionati",
4719
+ "finish": "Concludi revisione",
4720
+ "fix": "Correggi selezionati",
4721
+ "post": "Pubblica come commenti",
4722
+ "suggestedFix": "Correzione suggerita:",
4723
+ "line": "riga {line}",
4724
+ "reviewing": {
4725
+ "title": "Revisione della pull request…",
4726
+ "hint": "Suddivisione del diff in blocchi coerenti e revisione di ciascuno."
4727
+ },
4728
+ "fixing": {
4729
+ "title": "Correzione dei rilievi selezionati…",
4730
+ "hint": "Un fixer sta effettuando il commit delle modifiche per i rilievi selezionati sul branch della pull request."
4731
+ },
4732
+ "posting": {
4733
+ "title": "Pubblicazione dei commenti di revisione…",
4734
+ "hint": "Pubblicazione dei rilievi selezionati come commenti inline sulla pull request."
4735
+ },
4736
+ "severity": {
4737
+ "blocker": "Bloccante",
4738
+ "high": "Alta",
4739
+ "medium": "Media",
4740
+ "low": "Bassa",
4741
+ "nit": "Minore"
4742
+ },
4743
+ "category": {
4744
+ "correctness": "Correttezza",
4745
+ "security": "Sicurezza",
4746
+ "performance": "Prestazioni",
4747
+ "maintainability": "Manutenibilità",
4748
+ "style": "Stile",
4749
+ "test": "Test",
4750
+ "other": "Altro"
4751
+ }
4705
4752
  }
4706
4753
  }
@@ -1560,7 +1560,8 @@
1560
1560
  "followup_pending": "既読にする",
1561
1561
  "initiative": "既読にする",
1562
1562
  "markRead": "既読にする",
1563
- "fork_decision_pending": "既読にする"
1563
+ "fork_decision_pending": "既読にする",
1564
+ "pr_review_ready": "既読にする"
1564
1565
  },
1565
1566
  "toast": {
1566
1567
  "acted": "対応済みにしました",
@@ -2991,6 +2992,7 @@
2991
2992
  "release_regression": "リリースリグレッション",
2992
2993
  "human_test_ready": "人手テスト準備完了",
2993
2994
  "visual_confirmation_ready": "ビジュアル確認準備完了",
2995
+ "pr_review_ready": "PRレビューの指摘",
2994
2996
  "initiative": "イニシアチブの更新"
2995
2997
  },
2996
2998
  "role": {
@@ -4702,5 +4704,50 @@
4702
4704
  "empty": {
4703
4705
  "title": "決定する項目はありません"
4704
4706
  }
4707
+ },
4708
+ "prReview": {
4709
+ "title": "PRレビュー",
4710
+ "titleWithBlock": "PRレビュー: {title}",
4711
+ "subtitle": "対応する指摘を選択してください。",
4712
+ "openPr": "PRを開く",
4713
+ "summaryLabel": "概要:",
4714
+ "noFindings": "指摘はありません。プルリクエストは問題なさそうです。",
4715
+ "unsliced": "その他",
4716
+ "selectAll": "すべて選択",
4717
+ "clear": "クリア",
4718
+ "selectedCount": "{count}件選択中",
4719
+ "finish": "レビューを完了",
4720
+ "fix": "選択項目を修正",
4721
+ "post": "コメントとして投稿",
4722
+ "suggestedFix": "修正案:",
4723
+ "line": "{line}行目",
4724
+ "reviewing": {
4725
+ "title": "プルリクエストをレビュー中…",
4726
+ "hint": "差分をまとまりのある単位に分割し、各単位をレビューしています。"
4727
+ },
4728
+ "fixing": {
4729
+ "title": "選択した指摘を修正中…",
4730
+ "hint": "フィクサーが選択した指摘の変更をプルリクエストのブランチにコミットしています。"
4731
+ },
4732
+ "posting": {
4733
+ "title": "レビューコメントを投稿中…",
4734
+ "hint": "選択した指摘をプルリクエストのインラインコメントとして公開しています。"
4735
+ },
4736
+ "severity": {
4737
+ "blocker": "ブロッカー",
4738
+ "high": "高",
4739
+ "medium": "中",
4740
+ "low": "低",
4741
+ "nit": "軽微"
4742
+ },
4743
+ "category": {
4744
+ "correctness": "正確性",
4745
+ "security": "セキュリティ",
4746
+ "performance": "パフォーマンス",
4747
+ "maintainability": "保守性",
4748
+ "style": "スタイル",
4749
+ "test": "テスト",
4750
+ "other": "その他"
4751
+ }
4705
4752
  }
4706
4753
  }
@@ -1560,7 +1560,8 @@
1560
1560
  "followup_pending": "Oznacz jako przeczytane",
1561
1561
  "initiative": "Oznacz jako przeczytane",
1562
1562
  "markRead": "Oznacz jako przeczytane",
1563
- "fork_decision_pending": "Oznacz jako przeczytane"
1563
+ "fork_decision_pending": "Oznacz jako przeczytane",
1564
+ "pr_review_ready": "Oznacz jako przeczytane"
1564
1565
  },
1565
1566
  "toast": {
1566
1567
  "acted": "Oznaczono jako obsłużone",
@@ -2979,6 +2980,7 @@
2979
2980
  "release_regression": "Regresja wydania",
2980
2981
  "human_test_ready": "Gotowe do testow przez czlowieka",
2981
2982
  "visual_confirmation_ready": "Gotowe do potwierdzenia wizualnego",
2983
+ "pr_review_ready": "Uwagi z przeglądu PR",
2982
2984
  "initiative": "Aktualizacje inicjatywy"
2983
2985
  },
2984
2986
  "role": {
@@ -4690,5 +4692,50 @@
4690
4692
  "empty": {
4691
4693
  "title": "Nie ma czego decydować"
4692
4694
  }
4695
+ },
4696
+ "prReview": {
4697
+ "title": "Przegląd PR",
4698
+ "titleWithBlock": "Przegląd PR: {title}",
4699
+ "subtitle": "Wybierz uwagi, którymi chcesz się zająć.",
4700
+ "openPr": "Otwórz PR",
4701
+ "summaryLabel": "Podsumowanie:",
4702
+ "noFindings": "Brak uwag — pull request wygląda dobrze.",
4703
+ "unsliced": "Inne",
4704
+ "selectAll": "Zaznacz wszystko",
4705
+ "clear": "Wyczyść",
4706
+ "selectedCount": "Wybrano: {count}",
4707
+ "finish": "Zakończ przegląd",
4708
+ "fix": "Napraw wybrane",
4709
+ "post": "Opublikuj jako komentarze",
4710
+ "suggestedFix": "Sugerowana poprawka:",
4711
+ "line": "wiersz {line}",
4712
+ "reviewing": {
4713
+ "title": "Przeglądanie pull requesta…",
4714
+ "hint": "Dzielenie zmian na spójne części i przeglądanie każdej z nich."
4715
+ },
4716
+ "fixing": {
4717
+ "title": "Naprawianie wybranych uwag…",
4718
+ "hint": "Fixer zatwierdza zmiany dla wybranych uwag w gałęzi pull requesta."
4719
+ },
4720
+ "posting": {
4721
+ "title": "Publikowanie komentarzy przeglądu…",
4722
+ "hint": "Publikowanie wybranych uwag jako komentarzy w treści pull requesta."
4723
+ },
4724
+ "severity": {
4725
+ "blocker": "Blokujące",
4726
+ "high": "Wysokie",
4727
+ "medium": "Średnie",
4728
+ "low": "Niskie",
4729
+ "nit": "Drobiazg"
4730
+ },
4731
+ "category": {
4732
+ "correctness": "Poprawność",
4733
+ "security": "Bezpieczeństwo",
4734
+ "performance": "Wydajność",
4735
+ "maintainability": "Utrzymywalność",
4736
+ "style": "Styl",
4737
+ "test": "Testy",
4738
+ "other": "Inne"
4739
+ }
4693
4740
  }
4694
4741
  }