Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions PitcherPlantApp/ReleaseNotes/v0.2.0-beta.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
### Build

PitcherPlant v0.2.0-beta is a beta-channel release focused on audit hardening, report review performance, native macOS polish, and release workflow reliability.

- Version: 0.2.0-beta
- Release tag: v0.2.0-beta
- Channel: beta / RC channel through `appcast-beta`
- Update feed: `https://github.com/D1a0y1bb/PitcherPlant/releases/download/appcast-beta/appcast.xml`
- GitHub Release behavior: published as a pre-release and not promoted to GitHub Latest
- Distribution target: ad-hoc signed GitHub beta artifacts when Developer ID secrets are not available
- Notarization: not notarized in the current ad-hoc beta distribution path

### User-Facing Changes

#### Workspace and Navigation

- Adds and refines the workspace route map entry so reviewers can scan workspace flow and navigation context from the main window.
- Polishes the workspace dashboard status cards for clearer audit state, report state, and review progress scanning.
- Refines the native main toolbar and sidebar styling while keeping the app on the standard macOS window and source-list structure.
- Simplifies the workspace map entry after review so the navigation surface stays focused on actionable workspace state.

#### Settings

- Redesigns the Settings window toward a more native macOS preferences layout.
- Improves settings row spacing, field alignment, path controls, and visual hierarchy.
- Expands localization coverage for settings, workspace, reports, updates, and validation messages.
- Keeps settings presentation consistent with the main app shell instead of reintroducing older custom window chrome patterns.

#### Reports and Inspector

- Report Inspector image previews now decode asynchronously through a thumbnail cache.
- Large code snippets and diffs are rendered through actor-backed caches so switching report rows is less likely to block the UI.
- Report row rendering is tied to the selected row identity to avoid showing stale attachments while cached work is still resolving.
- Cross-batch evidence selection now uses the real composite row ID, which keeps table selection aligned with the visible evidence row.

### Audit and Data Safety

#### Report Output

- Report filename templates now reject empty names, `..` path traversal components, `/`, `\`, and path-shaped templates before writing files.
- `AuditRunner` uses the same report filename validation before report output is written.
- Report template names such as `team..1-{dir}-{date}.html` remain valid because only actual path traversal components are rejected.

#### Evidence Bundle Export

- Evidence Bundle export now writes to a temporary ZIP first and replaces the destination only after the archive is complete.
- Exporting to a directory path is rejected without deleting existing content.
- Existing files are no longer removed before a successful replacement is ready.

#### Fingerprint Packages

- Fingerprint package import now enforces JSON size limits.
- ZIP fingerprint entries have per-entry size limits.
- Fingerprint packages have a record count limit before import.
- Oversized packages fail early instead of consuming unbounded memory or database work.

#### PDF and Document Handling

- Zero-page PDFs now return an empty embedded-image result instead of failing the image extraction path.
- Existing Office and document ingestion limits remain in place for archive entry safety.

#### Local Assistant Commands

- Local helper commands now execute from background tasks instead of blocking UI-facing code paths.
- Helper processes launch in their own process group.
- Cancellation and timeout cleanup terminate child processes, including children that outlive the parent shell.
- Termination waits no longer use blocking `Thread.sleep` loops.

### Updates and Release Pipeline

#### Beta Appcast Safety

- Release workflow runs are serialized so beta appcast publishing cannot overlap with another release run.
- Beta and RC builds use the fixed `appcast-beta` URL instead of GitHub Latest.
- The workflow validates that the local appcast points at the current beta or RC tag before upload.
- The workflow validates the uploaded `appcast-beta` asset after upload.
- Older beta or RC tags are refused when the existing beta channel already points at a newer prerelease.

#### Silent Update State

- Silent update check failures preserve the existing `availableUpdate` state.
- A transient network or feed failure no longer clears the left-side update prompt when an update was already detected.

#### CI and Artifact Uploads

- GitHub Actions artifact upload now uses `actions/upload-artifact@v7.0.1`, which runs on Node.js 24.
- CI no longer repeats the full Swift test suite through the flaky SwiftPM `swiftpm-testing` runner on GitHub-hosted macOS.
- SwiftPM still builds the package and test targets through `swift build --build-tests`.
- The full test gate remains the Xcode test step.
- The duplicate `swift test --parallel` lightweight smoke step was removed after repeated GitHub runner timeouts.

### Validation

Validation completed before preparing this release included:

- `git diff --check`
- `ruby -e 'require "yaml"; YAML.load_file(".github/workflows/ci.yml"); YAML.load_file(".github/workflows/release.yml")'`
- `ruby -e 'require "json"; JSON.parse(File.read("PitcherPlantApp/Resources/Localizable.xcstrings"))'`
- beta appcast workflow shell syntax check with `bash -n`
- `swift build --package-path PitcherPlantApp --build-tests`
- `xcodebuild -project PitcherPlantApp/PitcherPlantApp.xcodeproj -scheme PitcherPlantApp -destination 'platform=macOS' test`
- GitHub CI on `master` after the CI stabilization change
- Release workflow dry-runs for beta-channel packaging and appcast generation
- Verification that the generated beta appcast URL uses `appcast-beta`
- Verification that older beta tags are refused before replacing a newer `appcast-beta` asset

### Distribution Notes

- This is a beta release. It is intended for validating the native macOS audit workflow before a stable release.
- Public artifacts may be ad-hoc signed and not notarized when Developer ID signing secrets are not used.
- The expected release assets are ZIP, DMG, Sparkle appcast, xcarchive ZIP, dSYM archive, and SHA-256 checksums.
- The DMG contains `PitcherPlant.app` and an Applications drag-and-drop shortcut.
- macOS Gatekeeper may require Control-click > Open, System Settings > Privacy & Security > Open Anyway, or removing quarantine for local testing.
- Sparkle automatic update installation requires clients that already contain the Sparkle EdDSA public key. Older builds without that key may need a manual install before automatic beta updates can be tested.

### Known Notes

- The app remains macOS 26+ only.
- The current beta distribution path does not represent Apple Developer ID notarized distribution.
- Some Swift compiler warnings related to older macOS APIs may still appear in logs, but they do not block the current beta build or test flow.