Repository navigation
chore(l10n): remove proven-orphan keys and relabel live stale keys in both catalogs - #1093
Merged
Merged
Conversation
… both catalogs Sudoku catalog: delete 14 keys, each proven unreferenced by the three-check proof (interpolated form, dynamic key construction, whole-repo non-Swift consumers). Relabel 37 live keys from `extractionState: stale` to `manual`, including `Elapsed time %@` and `Solved in %@`, which are referenced by string interpolation. Minesweeper catalog: relabel 5 keys to `manual`. Four of them (`gc.minesweeper.leaderboard.*.daily.title`, `iap.minesweeper.remove_ads.description`) are built by ASCRegister rather than app code, so they now carry a do-not-delete comment. Regenerate the SudokuAppCompositionTests fixture via `gen:l10n_fixture`. `scan:l10n` now fails on any `stale` entry, so an unproven orphan label cannot come back. Closes #1086 Part of #1014 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Owner
Author
|
PM review record: dual CR + fresh-context acceptance; merging at
|
wei18
added a commit
that referenced
this pull request
Sep 15, 2026
Merge origin/main (c2959d0) into session/brisk-stork-isio. Main advanced by two commits after the first #1080 merge (68f840a): - aeb80f0 test(sudoku): freeze the session clock in the Ready-window test (#1092) - c2959d0 chore(l10n): remove proven-orphan keys and relabel live stale keys in both catalogs (#1093) A read-only `git merge-tree` dry run was clean. The five files main touched (both app catalogs, the SudokuAppCompositionTests L10n fixture, BoardLeaveOrPauseStateTests.swift, mise-tasks/scan/l10n) do not overlap with any file this branch changes. L10n check: this branch adds no localized string literals. None of the 14 Sudoku keys #1093 removed is referenced by branch-added code. part of #1024 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Both catalogs are now at
extractionState: stale= 0.scan:l10ngates that count, so an unproven "orphan" label cannot come back.stale→manual.stale→manual.Elapsed time %@,Solved in %@.gc.minesweeper.leaderboard.{easy,medium,hard}.daily.title,iap.minesweeper.remove_ads.description. These 4 now carry a catalogcommentsaying they are read by ASCRegister and must not be deleted.mise run gen:l10n_fixture.Closes #1086
part of #1014 · follow-up of #1025 / #1085
Group A proof (run at
728ef191= origin/main)How each check was run:
rg -Fon the literal text around each format specifier or digit.error\.\\\(,\\\(x\)\.(title|body|action)",gc\.minesweeper,leaderboard\.\\\(,\\\(x\)\.daily,"iap\.\\\(,\\\(x\)\.description".localized.*\\\(in error/toast/Game Center/alert/banner paths: 0 hits.App/andPackages/:LocalizedStringKey(var),LocalizationValue(var),LocalizedStringResource(stringLiteral:),localizedString(forKey:).difficulty.rawValue.capitalized(Easy/Medium/Hard), MinesweepernameKey(Beginner/Intermediate/Expert), andUserFacingError.messageKey=error.userFacing.<rawCode>.body(TelemetryKit/UserFacingError.swift:50).rg -F --no-ignore --hiddenover the whole repo, excluding only.git/,.build/and__Snapshots__/(1445 files). Run both case-sensitive and-i. Self-definitions (the 2 catalogs and the fixture) are not counted.Elapsed time %@SudokuUI/Board/BoardView+AccessibilityHeader.swift:103.accessibilityLabel("Elapsed time \(elapsedLabel)")Solved in %@SudokuUI/Completion/CompletionView.swift:53Text("Solved in \(elapsedLabel)")gc.minesweeper.leaderboard.{easy,medium,hard}.daily.title(3)Config.swift:93titleKey: "\(keyPrefix).\(difficulty).daily.title", with keyPrefixgc.minesweeper.leaderboard(:55) and difficulties easy/medium/hard (:88).main.swiftexpectedXCStringsKeysrequires them forvalidate/plan/apply --xcstrings <catalog> --app minesweeperASCRegister/Strings/gc-strings.xcstrings.patch:75/86/97(paste-in source)iap.minesweeper.remove_ads.descriptionConfig+Types.swift:201"iap.\(shortId).description", with shortIdminesweeper.remove_ads(perConfigConsistencyTests:165). Required byexpectedXCStringsKeys.docs/app-store/metadata/minesweeper/iap/remove-ads.yaml:20names the Minesweeper catalog as the sourceerror.gameCenter.not_authenticated.{action,title},error.persistence.icloud_unavailable.{action,body,title},error.puzzleStore.generator_failed.{action,body,title}(8)error.\(builder anywhere; the only builder produceserror.userFacing.*.L10nTests.swift:53(errorKeysFollowConvention) filters catalog keys by prefix, and the set stays non-empty because the 5error.userFacing.*.bodykeys remain.not_authenticatedandicloud_unavailableappear only in comments (L10nTests.swift:55-56)-Fand-i)3 puzzles todaypuzzles today: 16 hits, all docs/designs, docs/v1 mockup, docs/test-plans, DesignPreviewKitAccount / languageSettingsView.swift:1comment "Account / Statistics / …" is different text)Global / friendsMixed difficulty poolGlobalLeaderboardView_Designs.swift:12-i: 87, all.globalscopes and proseCompletedLivePrivateCKGateway"completed" is a CloudKit query field)"Completed",'Completed',>Completed<,: Completed): 0. Bare-F: 904, all identifiers and prose (isCompleted,seedCompletedDaily, GC achievement copy "Completed your first…")DesignPreviewKit (
docs/designs/code) is a standalone package with its ownPackage.swift. Nothing outsidedocs/andmeetings/references it (rg: 0 hits).Evidence
Splice verifier. It asserts that the removed set equals the list, and that every other entry is identical except
extractionState;commentmay additionally change only on the 4 ASC keys.Independent base-vs-head check. It compares parsed key sets and per-entry field diffs,
git show origin/main:<path>against the working tree:Heads-up:
git diffshows+245insertions because git re-anchors hunks after large block deletions. The parsed diff above is the source of truth.Stale count and duplicate-key check:
mise run scan:l10n:Negative proof of the new stale check. One Minesweeper key was set back to
stale, the gate ran, and the file was restored:swift test --package-path Packages/SudokuKit --filter L10n:Notes
Config.leaderboards(for: .minesweeper)titleKey,IAPProduct.descriptionKey), so they stay accurate when line numbers move.Packages/AppMonetizationKit,Packages/GameAppKit,Project.swift, anyPackage.swift,TodayTabHost,LiveRouteFactory*.🤖 Generated with Claude Code