Skip to content

New release - #50

Merged
Ivan-LB merged 8 commits into
mainfrom
dev
Sep 29, 2026
Merged

Ivan-LB merged 8 commits into
mainfrom
dev

Conversation

@Ivan-LB

@Ivan-LB Ivan-LB commented Sep 29, 2026

Copy link
Copy Markdown
Owner

Summary

  • <bullet 1: what changed>
  • <bullet 2>

Why

Test plan

  • xcodebuild build -scheme Savely -destination 'platform=iOS Simulator,name=iPhone 16 Pro'
  • xcodebuild test -scheme Savely -destination 'platform=iOS Simulator,name=iPhone 16 Pro'
  • Manual: <steps to verify visually / functionally>

Risks

<anything reviewer should look at closely — migrations, networking changes, etc.>

Checklist

  • Branch named with approved prefix (feature/, fix/, refactor/, chore/, ci/, release/, hotfix/)
  • Commits follow Conventional Commits
  • No hardcoded user-facing strings (all routed through Strings.swift)
  • No secrets staged (Config.plist, GoogleService-Info.plist, .env*)
  • CLAUDE.md / knowledge files updated if a new invariant emerged
  • Tests added or updated for behavior changes

Ivan-LB and others added 8 commits September 28, 2026 19:23
…on Pro

Config.plist sat in Copy Bundle Resources, so whatever key was on disk at
archive time shipped inside the IPA (1.0's key was revoked 2026-08-19).
The file stays on disk and gitignored for local dev; it is simply no longer
a build input.

- Drop the Resources build-phase entry (file reference kept).
- Retire the placeholder-plist steps in ci.yml and ci_post_clone.sh; a
  clean checkout now builds without it.
- ci_post_clone.sh keeps one gate: refuse any archive with
  FeatureFlags.tipsEnabled = true, since Tips has no safe key source yet.
- New invariant: gotchas.yaml#config-plist-never-bundled, CLAUDE.md §3.
- Pending Xcode change: SUPPORTS_MACCATALYST and the "Designed for
  iPhone/iPad" on Mac and Vision Pro destinations set to NO, plus Xcode's
  re-sort of the PBXBuildFile/PBXFileReference sections.
Savely 1.0 makes no network calls (Tips is flagged off), but Info.plist
still declared an App Transport Security exception for openai.com, visible
to App Review and at odds with the "Data Not Collected" privacy answers.
ITSAppUsesNonExemptEncryption stays; it is load-bearing for upload.

The leftover GoogleService-Info.plist was deleted locally (gitignored, never
bundled). The Firebase project itself is still open, owner-only; see
docs/plans/dead-api-records.md.
testPreviewFootage walks the seeded app at human pace (home, goal, expense,
payday auto-move, goal again, trend, privacy, receipt) while
`simctl io recordVideo` captures it, and prints BRAGMARK lines with
timestamps and tap centers so an editor can cut scenes and draw touch
indicators. It also answers the first-launch notification prompt.
Mexico is Savely's primary market; 1.0 shipped with 139 of 368 catalog keys
untranslated and several screens building English in code.

- Catalog: every live key translated (134 added, 267 newly translated),
  69 existing values normalized to the product voice (tú, sentence case,
  no exclamation marks), 51 stale keys from removed features deleted, es-419
  plural forms added. Keys kept in Xcode's order.
- Hardcoded strings routed through Strings.swift: goal pace status
  (On track / Behind / 1+ year / /wk), the dashboard greeting, quick-add
  sheet, the auto-move banner (AttributedString(localized:)), trackers,
  goal flows, reports and PDF, achievements, notifications, receipt review,
  profile, view-model errors. Display dates use Date.FormatStyle
  ("Lunes · 28 de septiembre"), with a sentenceCased helper.
- Money tab: "Income" as a title/segment gets its own key so Spanish reads
  "Ingresos" next to "Gastos"; a single income stays "Ingreso".
- Persisted identifiers stay English: ExpenseCategory/IncomeSource gain
  storageKey (stored) vs displayName (shown); the payday deposit note is the
  constant GoalDeposits.autoMoveNote. Old rows keep matching; new tests in
  CategoryPersistenceTests cover the round trip. GoalPaceTests pins en_US
  instead of assuming the simulator's region.
- Knowledge: gotchas.yaml#persisted-identifiers-never-localized,
  localization.md documents es-419 and the CI gate.
scripts/check-l10n.py (python3 stdlib) runs as the Localization completeness step after SwiftLint. It lists any live key without a translated es-419 value (plural variations included) and any translation whose format specifiers differ from the source.
chore: stop bundling Config.plist, drop dead API records
feat(l10n): complete Latin-American Spanish (es-419)
@Ivan-LB
Ivan-LB merged commit 0efd98f into main Sep 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant