Status: Draft for product review
Owner: Product Manager
Feature: Apptag 7.0 Smart Start
Source request: /Users/ar/Downloads/需求-数据初始化-标签的智能整理.md
When a new user opens TagLauncher for the first time, the app should use a bundled local catalog to classify installed Mac apps into useful tags and seed short app notes where available.
The user should feel that TagLauncher already understands many common apps, instead of asking them to build every tag from zero.
We now have several valuable research datasets, but they are not yet one production-ready catalog:
If these stay separate, implementation will be fragile: matching may be inconsistent, duplicate apps may appear, one app may receive conflicting tags, notes may not be localized, and the product may not know which source should win.
This PRD defines the final catalog requirements before Coder starts implementation.
Canonical source files currently available in the repo:
| Source | Path | Current Rows | Role |
|---|---|---|---|
| Expanded 5000 master | Research/SmartStart/MacCommonApps_CandidateTop5000_Master.csv |
5000 | Main tag baseline |
| Persona unique apps | Research/SmartStart/PersonaTopApps/MacPersonaTopApps_Unique.csv |
478 | Adds curated notes and validates high-value profession apps |
| Game list | Research/SmartStart/game.csv |
200 | Adds/strengthens game coverage |
| Top 1000 review | Research/SmartStart/AppDefaultTags_Review.csv |
962 | Legacy manually reviewed fallback/verification |
| Apple default apps | Apptag/AppleDefaultAppNotes.swift |
code source | Apple app notes and uncommon/familiar distinction |
Note: the external request mentions MacCommonAppsCandidateTop5000Master.csv; the actual current repo file is MacCommonApps_CandidateTop5000_Master.csv.
The PM-required review table must use these core columns:
Name
normalizedName
defaultTag
bundleIdentifier
defaultNote-ZH
Requirements:
Name is the user-recognizable app name.normalizedName is required for every row and must never be blank.defaultTag is a pipe-separated list of stable tag IDs, for example design|productivity.bundleIdentifier is preferred for matching. If unknown, the CSV value must be null.defaultNote-ZH is optional. If present, it must be at most 80 Unicode characters.For production use, localized notes must also exist. The physical representation can be one CSV with additional columns or a generated JSON resource, but the final product must support note lookup by current app language.
Supported note languages must match current localization files:
ar
ar-Najdi
cs
da
de
en
es
fr
id
it
ja
ko
ms
nb
nl
nn
no
pl
pt-BR
ro
ru
sr-Cyrl
sv
th
tr
uk
vi
zh-Hans
zh-Hant
If a note exists in Chinese, every supported language must have a corresponding localized note before release. Each localized note must respect the same 80-character limit.
defaultTag must use stable tag IDs, not localized display names.
Allowed stable tag IDs are the Smart Start IDs already defined by the data contract, including:
browser
communication
productivity
file-management
transfer
development
design
writing
media
video
audio
picture-photo
utilities
system
system-enhancement
entertainment
game
finance
education
ai-tools
security
other
Rules:
other is allowed only as a last resort.other should be removed.other count.The merge must be deterministic.
Recommended precedence:
defaultNote-ZH when it has a note.game and entertainment tags to existing rows, or create a new row if missing.Tag merge behavior:
other is removed when stronger tags exist.Note merge behavior:
The final catalog must not contain duplicate apps.
Deduplication identity order:
bundleIdentifier, if present and not null.normalizedName.When two rows share the same identity:
Name, usually the common product name.Ambiguous cases:
All localized notes must be product-quality short copy, not literal awkward translations.
Rules:
On first install / fresh user state:
normalizedName.defaultTag values.Important behavior:
Existing-user behavior:
Product accepts the catalog generation work when:
normalizedName is non-empty for every row.null.defaultTag contains only approved stable IDs.other count is reported.defaultNote-ZH be renamed to defaultNote-zh-Hans in production, while preserving the PM review column name?other count should block release?