From 369c8f03db2f6d507697ab2296db5e6f81c8cd1e Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sat, 27 Jun 2026 17:15:11 +0800
Subject: [PATCH] Reduce SmartStart default categories to thirteen
---
src/Scripts/smartstart_default_categories_qa.sh | 20 +++++----
src/Apptag/SmartCategorization/SmartCategory.swift | 8 ++--
src/CHANGELOG.md | 8 ++++
src/Apptag/Info.plist | 4 +-
src/Docs/Requirements/2026-06-27-smartstart-category-simplification.md | 33 ++++++++++------
src/Apptag/SmartCategorization/SmartStartService.swift | 3 -
CODEGRAPH.md | 6 +-
src/Apptag/AppleDefaultAppCatalog.swift | 3 -
8 files changed, 51 insertions(+), 34 deletions(-)
diff --git a/CODEGRAPH.md b/CODEGRAPH.md
index e8ede11..b03aae7 100644
--- a/CODEGRAPH.md
+++ b/CODEGRAPH.md
@@ -95,8 +95,8 @@
- `src/Apptag/SmartCategorization/SmartCategory.swift`
- 内置智能分类定义。
- - `SmartCategoryDefaults.orderedIDs` 是 SmartStart 默认初始化标签事实源;当前默认方案为 15 个标签。
- - `SmartCategoryID.smartStartDefaultCategoryID` 负责把旧细分 catalog 分类归并到 15 个默认标签;这是新 SmartStart 写入前的归并,不做老用户旧标签自动迁移。
+ - `SmartCategoryDefaults.orderedIDs` 是 SmartStart 默认初始化标签事实源;当前默认方案为 13 个标签。
+ - `SmartCategoryID.smartStartDefaultCategoryID` 负责把旧细分 catalog 分类归并到 13 个默认标签;`finance` 和 `other` 返回 nil,回到未分类;这是新 SmartStart 写入前的归并,不做老用户旧标签自动迁移。
- `src/Apptag/SmartCategorization/SmartCategorizationDraft.swift`
- 智能分类草稿、默认备注 provenance、未分配应用和 warning 模型。
- `src/Apptag/SmartCategorization/SmartStartService.swift`
@@ -148,7 +148,7 @@
- `src/Scripts/smart_category_localization_qa.sh`
- SmartCategory/default system tag 初始化标签 29 语种本地化检查;禁止非英文语言包直接复制英文标签,保留 `PDF`、`DevOps` 等技术通用词例外。
- `src/Scripts/smartstart_default_categories_qa.sh`
- - SmartStart 默认初始化标签检查;验证 15 个默认分类、catalog 分类归并入口、首次 starter tags 和关键多语言目标文案。
+ - SmartStart 默认初始化标签检查;验证 13 个默认分类、catalog 分类归并入口、`finance` / `other` 回未分类、首次 starter tags 和关键多语言目标文案。
- `src/Scripts/quick_search_app_name_qa.sh`
- Quick Search 应用显示名回归。
- `src/Scripts/quick_search_system_app_qa.sh`
diff --git a/src/Apptag/AppleDefaultAppCatalog.swift b/src/Apptag/AppleDefaultAppCatalog.swift
index 1a9f1ea..2857be9 100644
--- a/src/Apptag/AppleDefaultAppCatalog.swift
+++ b/src/Apptag/AppleDefaultAppCatalog.swift
@@ -126,8 +126,7 @@
guard let entry = entry(for: app) else { return nil }
let categoryIDs = entry.defaultTag
.compactMap { SmartCategoryID(rawValue: $0) }
- .filter { $0 != .other }
- .map(\.smartStartDefaultCategoryID)
+ .compactMap(\.smartStartDefaultCategoryID)
guard !categoryIDs.isEmpty else { return nil }
return AppleDefaultCategorization(
canonicalName: entry.canonicalName,
diff --git a/src/Apptag/Info.plist b/src/Apptag/Info.plist
index 33c96c9..479ca9a 100644
--- a/src/Apptag/Info.plist
+++ b/src/Apptag/Info.plist
@@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>8.1.3</string>
+ <string>8.1.4</string>
<key>CFBundleVersion</key>
- <string>20260627.1605</string>
+ <string>20260627.1643</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
diff --git a/src/Apptag/SmartCategorization/SmartCategory.swift b/src/Apptag/SmartCategorization/SmartCategory.swift
index dac8b71..4fc10f0 100644
--- a/src/Apptag/SmartCategorization/SmartCategory.swift
+++ b/src/Apptag/SmartCategorization/SmartCategory.swift
@@ -249,7 +249,7 @@
}
}
- var smartStartDefaultCategoryID: SmartCategoryID {
+ var smartStartDefaultCategoryID: SmartCategoryID? {
switch self {
case .pdf, .productivity, .writing:
return .office
@@ -262,6 +262,8 @@
return .design
case .media, .video, .audio, .game:
return .entertainment
+ case .finance, .other:
+ return nil
default:
return self
}
@@ -301,9 +303,7 @@
.design,
.picturePhoto,
.entertainment,
- .finance,
- .education,
- .other
+ .education
]
static let definitions: [SmartCategoryDefinition] = orderedIDs.map {
diff --git a/src/Apptag/SmartCategorization/SmartStartService.swift b/src/Apptag/SmartCategorization/SmartStartService.swift
index c1451d4..b919ac4 100644
--- a/src/Apptag/SmartCategorization/SmartStartService.swift
+++ b/src/Apptag/SmartCategorization/SmartStartService.swift
@@ -528,8 +528,7 @@
let entries = base.entries.compactMap { entry -> SmartStartCatalogEntry? in
let tagIDs = entry.defaultTag
.compactMap { SmartCategoryID(rawValue: $0) }
- .filter { $0 != .other }
- .map(\.smartStartDefaultCategoryID)
+ .compactMap(\.smartStartDefaultCategoryID)
guard !tagIDs.isEmpty else { return nil }
return SmartStartCatalogEntry(
diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md
index 3571b68..00d040c 100644
--- a/src/CHANGELOG.md
+++ b/src/CHANGELOG.md
@@ -2,6 +2,14 @@
## [Unreleased]
+## [8.1.4] — 2026-06-27
+
+- 继续精简 SmartStart 智能初始化默认分类:新用户 / 重置智能初始化方案后的默认标签从 15 个收敛为 13 个
+- `Finance / 财务` 和 `Other / 其他` 不再作为默认智能初始化标签;catalog 中命中这两类的应用会回到未分类,不会被强行归入其它标签
+- 保持不做老用户迁移:已有用户的旧标签和手动分类关系不扫描、不改名、不删除
+- 更新 `Scripts/smartstart_default_categories_qa.sh`,防止 `finance` / `other` 重新进入默认标签或 catalog 归一化结果
+- 版本号更新为 `8.1.4`,Build 更新为 `20260627.1643`
+
## [8.1.3] — 2026-06-27
- 精简 SmartStart 智能初始化默认分类:新用户 / 重置智能初始化方案后的默认标签从 39 个收敛为 15 个,降低初次使用时的分类冗余
diff --git a/src/Docs/Requirements/2026-06-27-smartstart-category-simplification.md b/src/Docs/Requirements/2026-06-27-smartstart-category-simplification.md
index c7208b2..81412b3 100644
--- a/src/Docs/Requirements/2026-06-27-smartstart-category-simplification.md
+++ b/src/Docs/Requirements/2026-06-27-smartstart-category-simplification.md
@@ -2,11 +2,11 @@
日期:2026-06-27
-状态:产品已确认 `network-tools` 归入 `System Tools / 系统工具`;确认 `system-tools` 的用户可见名称采用 `System Tools / 系统工具`;确认 `office`、`PDF`、`writing` 合并为 `Office & Docs / 办公文档`;确认 `Video / Audio / Games` 合并进 `Entertainment / 影音娱乐`,最终默认智能分类为 15 个。
+状态:产品已确认 `network-tools` 归入 `System Tools / 系统工具`;确认 `system-tools` 的用户可见名称采用 `System Tools / 系统工具`;确认 `office`、`PDF`、`writing` 合并为 `Office & Docs / 办公文档`;确认 `Video / Audio / Games` 合并进 `Entertainment / 影音娱乐`;确认 `Finance / 财务` 和 `Other / 其他` 回到未分类,最终默认智能分类为 13 个。
## 1. 本轮目标
-用户反馈当前智能初始化使用 39 个默认标签,过于冗余。本方案把默认标签精简为 15 个,并明确合并关系、最终标签列表与后续落地注意事项。
+用户反馈当前智能初始化使用 39 个默认标签,过于冗余。本方案把默认标签精简为 13 个,并明确合并关系、最终标签列表与后续落地注意事项。
## 2. 当前 39 个初始化标签
@@ -139,6 +139,16 @@
- 合并后能进一步降低默认标签数量,避免新用户第一屏出现过多细分分类。
- `Entertainment / 影音娱乐`作为总标签更适合默认初始化;如果用户需要细分,可后续手动拆分。
+### 改动 6:Finance / Other 回到未分类
+
+`Finance / 财务` 和 `Other / 其他` 不再作为默认智能初始化标签。
+
+确认理由:
+
+- 财务类 App 对普通用户并非高频默认分类,默认展示会增加标签冗余。
+- `Other / 其他` 本质上不是智能分类结果,而是“无法确定分类”的兜底状态,应该回到未分类。
+- 本轮仍不做老用户迁移;已有用户手动创建或历史保留的财务 / 其他标签不自动删除、不改名、不迁移。
+
## 4. 命名确认
### System Tools
@@ -167,11 +177,11 @@
当前:39 个默认标签。
-合并后:15 个默认标签。
+合并后:13 个默认标签。
-减少:24 个标签。
+减少:26 个标签。
-## 6. 最终 15 个默认标签列表
+## 6. 最终 13 个默认标签列表
以下列表按“尽量保留原始顺序 + 合并项放在首次出现位置”的原则排列。
@@ -189,9 +199,7 @@
| 10 | `design` | Design | 设计 | 原 17、18、19、20 |
| 11 | `picture-photo` | Photos | 图片 | 原 25 |
| 12 | `entertainment` | Entertainment | 影音娱乐 | 原 22、23、24、34、35 |
-| 13 | `finance` | Finance | 财务 | 原 36 |
-| 14 | `education` | Education | 学习 | 原 37 |
-| 15 | `other` | Other | 其他 | 原 39 |
+| 13 | `education` | Education | 学习 | 原 37 |
## 7. 完整合并映射表
@@ -232,24 +240,25 @@
| 33 | `network-tools` | 网络工具 | `system-enhancement` | 系统工具 |
| 34 | `entertainment` | 影音娱乐 | `entertainment` | 影音娱乐 |
| 35 | `game` | 游戏 | `entertainment` | 影音娱乐 |
-| 36 | `finance` | 财务 | `finance` | 财务 |
+| 36 | `finance` | 财务 | 未分类 | 不创建默认标签 |
| 37 | `education` | 学习 | `education` | 学习 |
| 38 | `security` | 安全 | `system-enhancement` | 系统工具 |
-| 39 | `other` | 其他 | `other` | 其他 |
+| 39 | `other` | 其他 | 未分类 | 不创建默认标签 |
## 8. 后续落地建议
如果产品确认这版列表,建议后续实现按低风险路径做:
-1. 调整 `SmartCategoryDefaults.orderedIDs`,把 39 个默认标签压缩为 15 个。
+1. 调整 `SmartCategoryDefaults.orderedIDs`,把 39 个默认标签压缩为 13 个。
2. 复用既有 `SmartCategoryID.office`、`SmartCategoryID.development`、`SmartCategoryID.design`、`SmartCategoryID.systemEnhancement` 作为合并目标。
3. 建立旧 category id 到新 category id 的映射表,SmartStart 匹配结果统一归并后再写入标签。
4. 29 个语言包中将 `system-enhancement` 的用户可见文案改为 `System Tools / 系统工具`对应语义,将 `office` 改为 `Office & Docs / 办公文档`对应语义,将 `picture-photo` 简化为 `Photos / 图片`对应语义。
5. QA 覆盖:
- - 新用户智能初始化最终标签数是 15。
+ - 新用户智能初始化最终标签数是 13。
- 合并来源 app 进入正确目标标签。
- 第 33 项 `network-tools`归入 `system-enhancement`,不重复创建标签。
- `office`、`PDF`、`writing`都归入 `Office & Docs / 办公文档`。
+ - `finance` 和 `other` 不生成默认标签,命中后回到未分类。
- 新默认智能分类结果中 29 语种没有旧细分标签残留、没有英文兜底污染。
- 老用户已有标签保持原样;本轮不做旧 39 标签自动迁移。
diff --git a/src/Scripts/smartstart_default_categories_qa.sh b/src/Scripts/smartstart_default_categories_qa.sh
index 73984e7..2c790b4 100755
--- a/src/Scripts/smartstart_default_categories_qa.sh
+++ b/src/Scripts/smartstart_default_categories_qa.sh
@@ -51,9 +51,7 @@
"design",
"picturePhoto",
"entertainment",
- "finance",
"education",
- "other",
]
EXPECTED_RAW_IDS = {
@@ -69,10 +67,10 @@
"design",
"picture-photo",
"entertainment",
- "finance",
"education",
- "other",
}
+
+DROP_RAW_IDS = {"finance", "other"}
MERGE_MAP = {
"PDF": "office",
@@ -159,6 +157,8 @@
"case .font, .uiPrototyping, .threeDCAD, .diagramming:",
"case .media, .video, .audio, .game:",
"return .entertainment",
+ "case .finance, .other:",
+ "return nil",
]
missing_snippets = [snippet for snippet in required_mapping_snippets if snippet not in swift]
if missing_snippets:
@@ -166,7 +166,7 @@
for path in [smartstart, apple_catalog]:
text = path.read_text(encoding="utf-8")
- if ".map(\\.smartStartDefaultCategoryID)" not in text:
+ if ".compactMap(\\.smartStartDefaultCategoryID)" not in text:
fail(f"{path.name} must normalize catalog category IDs through smartStartDefaultCategoryID")
starter_match = re.search(
@@ -181,7 +181,9 @@
if legacy_starter_cases:
fail("starterCategoryIDs contains non-default categories: " + ", ".join(sorted(legacy_starter_cases)))
-def normalize(raw: str) -> str:
+def normalize(raw):
+ if raw in DROP_RAW_IDS:
+ return None
return MERGE_MAP.get(raw, raw)
for catalog_path in [smartstart_base, apple_base]:
@@ -189,9 +191,9 @@
unexpected = {}
for entry in catalog.get("entries", []):
for raw in entry.get("defaultTag", []):
- if raw == "other":
- continue
normalized = normalize(raw)
+ if normalized is None:
+ continue
if normalized not in EXPECTED_RAW_IDS:
unexpected.setdefault(raw, normalized)
if unexpected:
@@ -206,6 +208,6 @@
print(
"PASS SmartStart default categories: "
f"{len(EXPECTED_ORDERED_CASES)} defaults, catalog IDs normalized, "
- "starter tags restricted, target labels checked"
+ "finance/other uncategorized, starter tags restricted, target labels checked"
)
PY
--
Gitblit v1.9.3