From d5b3fb031d5cfc97b46f269d362407fe2886b53e Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Wed, 23 Sep 2026 14:15:34 +0000
Subject: [PATCH 01/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EC=A0=91?=
=?UTF-8?q?=EA=B7=BC=EC=84=B1=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84?=
=?UTF-8?q?=ED=95=9C=20PracticeProgress=20=ED=88=B4=ED=8C=81=20=EA=B5=90?=
=?UTF-8?q?=EC=B2=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../features/workspace/PracticeProgress.tsx | 45 ++++++++++---------
1 file changed, 25 insertions(+), 20 deletions(-)
diff --git a/apps/desktop/src/features/workspace/PracticeProgress.tsx b/apps/desktop/src/features/workspace/PracticeProgress.tsx
index d10ca94c0..e5338b6b3 100644
--- a/apps/desktop/src/features/workspace/PracticeProgress.tsx
+++ b/apps/desktop/src/features/workspace/PracticeProgress.tsx
@@ -1,6 +1,7 @@
import { memo, useCallback } from "react";
import { Minus, Plus } from "lucide-react";
import { createTranslator, detectPreferredLocale } from "../../i18n";
+import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip";
/** Documented. */
interface PracticeProgressProps {
@@ -49,16 +50,18 @@ function PracticeProgressComponent({ progress = 0, onChange }: PracticeProgressP
-
+
+
+
+
+ {t("decreasePracticeProgressLabel")}
+
-
+
+ = 100 ? "true" : undefined}
+ className="flex size-8 items-center justify-center rounded-full border border-white/10 bg-white/5 text-slate-300 transition-colors hover:bg-white/10 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 aria-disabled:cursor-not-allowed aria-disabled:opacity-50"
+ aria-label={t("increasePracticeProgressLabel")}
+ >
+
+
+ {t("increasePracticeProgressLabel")}
+
);
From c89cfd95b50b3550c1ae878f19ee4eb07a4a5b2f Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Wed, 23 Sep 2026 23:18:47 +0900
Subject: [PATCH 02/11] preserve(ui): remove weaker duplicate PracticeProgress
source
Restore the protected PracticeProgress blob so this generated lane does not become a second accessibility writer. Canonical #1226 already owns the stronger Tooltip, persistent boundary description, 44 CSS px target, slider interaction envelope, and focused interaction evidence. Retain this generated commit in ancestry for provenance until protected succession satisfies PR-0.
Signed-off-by: Seongho Bae
---
.../features/workspace/PracticeProgress.tsx | 45 +++++++++----------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/apps/desktop/src/features/workspace/PracticeProgress.tsx b/apps/desktop/src/features/workspace/PracticeProgress.tsx
index e5338b6b3..d10ca94c0 100644
--- a/apps/desktop/src/features/workspace/PracticeProgress.tsx
+++ b/apps/desktop/src/features/workspace/PracticeProgress.tsx
@@ -1,7 +1,6 @@
import { memo, useCallback } from "react";
import { Minus, Plus } from "lucide-react";
import { createTranslator, detectPreferredLocale } from "../../i18n";
-import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip";
/** Documented. */
interface PracticeProgressProps {
@@ -50,18 +49,16 @@ function PracticeProgressComponent({ progress = 0, onChange }: PracticeProgressP
-
-
-
-
- {t("decreasePracticeProgressLabel")}
-
+
-
- = 100 ? "true" : undefined}
- className="flex size-8 items-center justify-center rounded-full border border-white/10 bg-white/5 text-slate-300 transition-colors hover:bg-white/10 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 aria-disabled:cursor-not-allowed aria-disabled:opacity-50"
- aria-label={t("increasePracticeProgressLabel")}
- >
-
-
- {t("increasePracticeProgressLabel")}
-
+
);
From 5dddae405105be3ead8edb2ccc511d6038e3c35a Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Wed, 23 Sep 2026 22:29:35 +0000
Subject: [PATCH 03/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EC=A0=91?=
=?UTF-8?q?=EA=B7=BC=EC=84=B1=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84?=
=?UTF-8?q?=ED=95=9C=20PracticeProgress=20=ED=88=B4=ED=8C=81=20=EA=B5=90?=
=?UTF-8?q?=EC=B2=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../features/workspace/PracticeProgress.tsx | 45 ++++++++++---------
1 file changed, 25 insertions(+), 20 deletions(-)
diff --git a/apps/desktop/src/features/workspace/PracticeProgress.tsx b/apps/desktop/src/features/workspace/PracticeProgress.tsx
index d10ca94c0..e5338b6b3 100644
--- a/apps/desktop/src/features/workspace/PracticeProgress.tsx
+++ b/apps/desktop/src/features/workspace/PracticeProgress.tsx
@@ -1,6 +1,7 @@
import { memo, useCallback } from "react";
import { Minus, Plus } from "lucide-react";
import { createTranslator, detectPreferredLocale } from "../../i18n";
+import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip";
/** Documented. */
interface PracticeProgressProps {
@@ -49,16 +50,18 @@ function PracticeProgressComponent({ progress = 0, onChange }: PracticeProgressP
-
+
+
+
+
+ {t("decreasePracticeProgressLabel")}
+
-
+
+ = 100 ? "true" : undefined}
+ className="flex size-8 items-center justify-center rounded-full border border-white/10 bg-white/5 text-slate-300 transition-colors hover:bg-white/10 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 aria-disabled:cursor-not-allowed aria-disabled:opacity-50"
+ aria-label={t("increasePracticeProgressLabel")}
+ >
+
+
+ {t("increasePracticeProgressLabel")}
+
);
From 091128c7892db4b25f30f8692c9239548e031378 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Thu, 24 Sep 2026 12:04:23 +0900
Subject: [PATCH 04/11] repair(ui): restore #1260 preservation boundary
Keep fresh generated PracticeProgress Tooltip rewrite in ancestry while restoring the protected zero-delta tree. Canonical #1226 remains the stronger product owner for visible labeling, persistent boundary descriptions, 44px interaction targets, and focused Tooltip evidence.
Signed-off-by: Seongho Bae
---
.../features/workspace/PracticeProgress.tsx | 45 +++++++++----------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/apps/desktop/src/features/workspace/PracticeProgress.tsx b/apps/desktop/src/features/workspace/PracticeProgress.tsx
index e5338b6b3..d10ca94c0 100644
--- a/apps/desktop/src/features/workspace/PracticeProgress.tsx
+++ b/apps/desktop/src/features/workspace/PracticeProgress.tsx
@@ -1,7 +1,6 @@
import { memo, useCallback } from "react";
import { Minus, Plus } from "lucide-react";
import { createTranslator, detectPreferredLocale } from "../../i18n";
-import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip";
/** Documented. */
interface PracticeProgressProps {
@@ -50,18 +49,16 @@ function PracticeProgressComponent({ progress = 0, onChange }: PracticeProgressP
-
-
-
-
- {t("decreasePracticeProgressLabel")}
-
+
-
- = 100 ? "true" : undefined}
- className="flex size-8 items-center justify-center rounded-full border border-white/10 bg-white/5 text-slate-300 transition-colors hover:bg-white/10 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 aria-disabled:cursor-not-allowed aria-disabled:opacity-50"
- aria-label={t("increasePracticeProgressLabel")}
- >
-
-
- {t("increasePracticeProgressLabel")}
-
+
);
From 6f2331c56c1c409ba8c6288bf1d9f2d1d4f0fa1a Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 24 Sep 2026 03:33:53 +0000
Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20PR=20=ED=8F=90?=
=?UTF-8?q?=EA=B8=B0=20=ED=99=95=EC=9D=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 1d8224c5a..6a0853944 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,9 +1275,7 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, (
- workflow_name
- )
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 37cff27a558cbe8b6d133c4d6e5835283c4c05ff Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Thu, 24 Sep 2026 13:02:26 +0900
Subject: [PATCH 06/11] preserve(ui): remove recurring foreign formatter drift
Restore the protected tree so this zero-delta PracticeProgress provenance lane does not take ownership of #1176's Ruff-only supply-chain formatting. Canonical product semantics remain with #1226 and reusable Slider ownership remains with #1188. Preserve intervening generated commits in ancestry until protected succession satisfies PR-0.
Signed-off-by: Seongho Bae
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 6a0853944..1d8224c5a 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,7 +1275,9 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, (
+ workflow_name
+ )
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 625baa0ae0e6bac65bd564907d7eafc75caa3f38 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 24 Sep 2026 10:57:28 +0000
Subject: [PATCH 07/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20PR=20=ED=8F=90?=
=?UTF-8?q?=EA=B8=B0=20=ED=99=95=EC=9D=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 1d8224c5a..6a0853944 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,9 +1275,7 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, (
- workflow_name
- )
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 16c97db90b49e611912fef23579e518c6272c5f3 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Thu, 24 Sep 2026 19:59:05 +0900
Subject: [PATCH 08/11] repair(ui): keep PracticeProgress provenance zero-delta
Remove the recurring foreign Ruff formatter delta from the PracticeProgress preservation lane. Keep the intervening generated commit in ancestry and restore the protected develop tree so #1176 remains the single formatter owner and #1226 remains the canonical PracticeProgress owner.
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 6a0853944..1d8224c5a 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,7 +1275,9 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, (
+ workflow_name
+ )
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 1d67f3e866ac1916cc534ef990c6759c32c35abd Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 24 Sep 2026 18:56:57 +0000
Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20PR=20=ED=8F=90?=
=?UTF-8?q?=EA=B8=B0=20=ED=99=95=EC=9D=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 1d8224c5a..6a0853944 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,9 +1275,7 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, (
- workflow_name
- )
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 3a34265849ce30bcd05b049985fdde645a734086 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Fri, 25 Sep 2026 04:04:16 +0900
Subject: [PATCH 10/11] preserve(ui): restore PracticeProgress single-writer
boundary
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 6a0853944..1d8224c5a 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,7 +1275,9 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, (
+ workflow_name
+ )
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")
From 9c3540613395b6a1765131850b35386d6d529f91 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Fri, 25 Sep 2026 15:22:37 +0000
Subject: [PATCH 11/11] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20PR=20=ED=8F=90?=
=?UTF-8?q?=EA=B8=B0=20=ED=99=95=EC=9D=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
services/analysis-engine/tests/test_supply_chain_policy.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py
index 1d8224c5a..6a0853944 100644
--- a/services/analysis-engine/tests/test_supply_chain_policy.py
+++ b/services/analysis-engine/tests/test_supply_chain_policy.py
@@ -1275,9 +1275,7 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None:
workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8")
assert "concurrency:" in workflow, workflow_name
assert "cancel-in-progress: false" in workflow, workflow_name
- assert "contents: read" in workflow or "permissions: read-all" in workflow, (
- workflow_name
- )
+ assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name
assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8")