Skip to content

Prepare OST release readiness checks#4

Merged
9bow merged 16 commits into
mainfrom
develop
May 23, 2026
Merged

Prepare OST release readiness checks#4
9bow merged 16 commits into
mainfrom
develop

Conversation

@9bow
Copy link
Copy Markdown
Owner

@9bow 9bow commented May 17, 2026

Summary

  • Adds production release readiness checks for the CLI-built macOS app, including stricter build, packaging, entitlement, Info.plist, and ZIP validation.
  • Documents the manual QA flow for permissions, first launch, language packs, translation fallback, overlays, session history, diagnostics, packaging, and human-owned Developer ID notarization.
  • Hardens runtime behavior around capture startup, permission handling, speech restarts, translation session lifecycle, online fallback policy, settings changes, overlay windows, and session history persistence.
  • Keeps the multilingual README set aligned with the current build, permissions, fallback translation, and manual QA guidance.

Verification

  • ./test.sh
  • ./build.sh --typecheck
  • ./build.sh
  • git diff --check
  • Packaging smoke test from docs/manual-qa.md
  • Latest local ZIP SHA-256 during packaging smoke: d3af25ee780f69ee843cb306b9437a4b3abe4e380d956f2819c7ab2a78a7b663

Manual QA Still Required

  • First-run Screen Recording and System Audio Recording permission prompts on a real macOS user state.
  • Speech Recognition permission prompt and real transcription with system audio.
  • Apple Translation language-pack readiness and translation session behavior.
  • Online fallback translation behavior with real network conditions, if enabled.
  • Developer ID signing, notarization, stapling, and Gatekeeper launch verification by the release owner with Apple Developer credentials.

9bow added 16 commits February 21, 2026 17:38
…pending new content

When SFSpeechRecognizer reformulates text by prepending new content before
already-consumed text, the previous code showed the full reformulated text
(including already-finalized content) as liveText.

- Detect when currentText ends with lastConsumedPartial (suffix match)
- Show only the new prefix portion as liveText and update lastConsumedPartial
- Add stripLeadingPunctuation() helper to remove leading commas/whitespace
  from liveText and all subtitle entry commits
Default values updated to match preferred configuration:
- Font size: 24pt -> 20pt
- Background opacity: 70% -> 50%
- Subtitle expiry: 10s -> 20s
- Speech pause: 2.0s -> 3.0s
- Display mode: combined -> split
- Overlay lock: true -> false (both windows)

FontSettingsView live preview now reflects the active display mode:
- Split mode: two side-by-side boxes (Recognition | Translation)
- Combined mode: single box with original and translated text
Temporarily lower the session window level to .normal before showing
the save panel, then restore the original level after it closes.
- SessionHistoryView: handle export write errors with do/catch,
  AppLogger, and NSAlert instead of silently ignoring via try?
- AppState: remove lastConsumedPartial override in suffix-strip branch
  to prevent newPart (live unconsumed text) from being silently dropped
- AppState: use .whitespacesAndNewlines in stripLeadingPunctuation
  to also remove leading newlines
- FontSettingsView: gate split-mode preview panes on showOriginalText
  and showTranslation toggles for accurate visibility reflection
- Replace "Recognition" with "Transcription" throughout UI
- Move on-device recognition toggle from Debug to Languages tab
- Add version display in About tab from Bundle info
- Update Display Mode descriptions to use Transcription/Translation
- Simplify overlay window section titles for split mode
- Add SFSpeechRecognizerDelegate for availability monitoring
- Periodically recreate recognizer to prevent resource exhaustion
- Use taskGeneration counter to filter stale callbacks
- Add retry mechanism (3 attempts, 2s delay) for restart failures
- Replace DispatchQueue.main.asyncAfter with Task-based delay
- Fix thread safety in SystemAudioCapture with lock-protected properties
- Reconfigure translation source on auto-detected language change
- Invalidate translation session on capture stop
- Add HTTP status check in fallback Google Translate API
- Guard auto-scroll with isAtBottom check in all overlay views
- Only auto-scroll when user is at bottom or overlay is locked
# Conflicts:
#	OST/Sources/App/AppState.swift
#	OST/Sources/App/OSTApp.swift
#	OST/Sources/Audio/SystemAudioCapture.swift
#	OST/Sources/Settings/UserSettings.swift
#	OST/Sources/Speech/SpeechRecognizer.swift
#	OST/Sources/Translation/TranslationService.swift
#	OST/Sources/UI/FontSettingsView.swift
#	OST/Sources/UI/LanguagePickerView.swift
#	OST/Sources/UI/RecognitionOverlayView.swift
#	OST/Sources/UI/SessionHistoryView.swift
#	OST/Sources/UI/SubtitleView.swift
#	OST/Sources/UI/TranslationOverlayView.swift
@9bow 9bow marked this pull request as ready for review May 17, 2026 07:19
@9bow 9bow requested a review from Copilot May 17, 2026 07:19
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR prepares OST for release readiness by hardening packaging/build validation, documenting a manual QA flow, and making numerous runtime/UX fixes around capture startup, permissions, speech restarts, translation session lifecycle, online fallback policy, settings changes, overlay windows, and session history persistence. Version is rolled back from 1.0.0 to 0.0.4 to reflect that public release still requires human-owned Developer ID notarization.

Changes:

  • Hardened build (build.sh) and CI to enforce ad-hoc signing, entitlement parity, Info.plist keys, ZIP validation, and strict-concurrency warnings-as-errors.
  • Significant refactor of runtime: TranslationService generations + fallback policy, opt-in online fallback, capture lifecycle generations in OSTApp/AppState, SessionRecorder per-entry IDs and atomic-save, SystemAudioCapture sendable buffer wrapper and permission preflight, Settings safeXxx clamping, overlay window clamping/locking.
  • Documentation updates: README (en/ko/zh/ja), CLAUDE.md, new AGENTS.md, new docs/manual-qa.md, PR/issue templates, CI release job.

Reviewed changes

Copilot reviewed 36 out of 38 changed files in this pull request and generated no comments.

Show a summary per file
File Description
README.md / README.ko.md / README.zh.md / README.ja.md Update disclaimer, permissions, defaults, troubleshooting, build/test docs
project.yml Swift version "5", version 0.0.4
OST/Resources/Info.plist Add NSAudioCaptureUsageDescription, version 0.0.4
OST/Sources/UI/*.swift safeXxx settings clamping; translation status surface; lock defaults; recovery actions
OST/Sources/UI/SessionHistoryView.swift Confirm dialog for clear, displayedSession lookup
OST/Sources/UI/OverlayWindow.swift Move resetFrame logic to WindowManager; clampToScreen with finite checks
OST/Sources/UI/LogViewerView.swift Smart auto-scroll
OST/Sources/UI/LanguagePickerView.swift Availability state with installed/supported/unsupported; online fallback toggle
OST/Sources/Translation/TranslationConfig.swift Availability state enum; same-language pair detection
OST/Sources/Translation/TranslationService.swift Generations, error type, online fallback gating, waitForSessionReady
OST/Sources/Speech/SpeechRecognizer.swift Cleanup on start failure; preserve finalized text; safer restart retries
OST/Sources/Settings/UserSettings.swift Sanitization + clamped accessors; default overlays locked
OST/Sources/Audio/SystemAudioCapture.swift AudioSampleBuffer wrapper, CG preflight, stream identity checks
OST/Sources/App/WindowManager.swift Display-mode tracking; clamped reset; settings callbacks; isReleasedWhenClosed=false
OST/Sources/App/SessionRecorder.swift Entry IDs, update/clear translations, discard empty session, robust load/save
OST/Sources/App/OSTApp.swift Capture lifecycle generations, runtime settings/language change handlers, recovery actions
OST/Sources/App/AppState.swift startingCapture state, robust generation guards, refresh translations, common-mode timers
OST/Sources/Accessibility/AccessibilityManager.swift Mark @MainActor
docs/manual-qa.md New manual QA checklist
build.sh, CLAUDE.md, AGENTS.md Strict concurrency, framework link checks, plist asserts, entitlements parity
.github/workflows/build.yml PR/main triggers, ZIP validation, separate release job
.github/pull_request_template.md, ISSUE_TEMPLATE/* New PR template, expanded bug/feature templates
.gitignore Ignore test/release artifacts

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 36 out of 38 changed files in this pull request and generated no new comments.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 36 out of 38 changed files in this pull request and generated no new comments.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 36 out of 38 changed files in this pull request and generated no new comments.

@9bow 9bow requested a review from Copilot May 17, 2026 07:27
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 36 out of 38 changed files in this pull request and generated no new comments.

@9bow 9bow requested a review from Copilot May 17, 2026 07:29
@9bow 9bow requested review from Copilot and removed request for Copilot May 17, 2026 07:32
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@9bow 9bow merged commit 7c2cd4d into main May 23, 2026
42 of 48 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.

2 participants