Discover projects
1@1island/Public project

Rocket Up

A live Fractal execution graph shared by 1island.

16 graph tasks Updated 7/28/2026, 5:45:26 PM

Execution

Project graph

.fractal v1
Live execution graphrocket-up.fractal
main
Voice promptBuild a simple iOS app called Rocket Up featuring a picture of a rocket.
Wave 0sequential
0.1queued
Lead PRD and architecture approvedruns after dependencies

The lead-authored .fractal/lead-prd.json and validated task DAG are ready.

Wave 1parallel
1.1queued
Implement launch animation state machinewave-1 · runs together

Create `Sources/RocketUpCore/LaunchAnimationModel.swift` in the workspace root's Swift package. Import Foundation only (no UIKit) so it stays platform-agnostic. Implement a public final class `LaunchAnimationModel: ObservableObject` (import Combine or use SwiftUI's ObservableObject via `import SwiftUI` guarded to Foundation-safe usage — prefer `import Combine`). Public API: `enum Phase: Equatable { case idle, launching, flying }`; `@Published private(set) var phase: Phase` starting `.idle`; `@Published private(set) var progress: Double` in 0...1 starting 0; computed `var verticalOffset: Double` returning the rocket's vertical translation in normalized screen-height units — 0 when idle, and for launching/flying an ease-in curve `-(progress * progress) * flightDistance` with `public let flightDistance: Double = 1.5`, so offset decreases monotonically from 0 to -1.5 as progress goes 0 → 1; computed `var isFlameVisible: Bool` true only when phase != .idle and progress < 1; `func launch()` which transitions idle → launching (no-op in other phases); `func setProgress(_ value: Double)` which clamps to 0...1, updates progress, and moves phase to `.flying` when progress >= 1 while launching; `func reset()` returning to `.idle` with progress 0. All behavior must be synchronous and deterministic (no Timers inside the model — the view drives progress) so it is fully unit-testable. Add doc comments explaining the normalized-offset convention (negative = upward, units of screen heights). REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

1.2queued
Implement vector rocket artwork as SwiftUI shapeswave-1 · runs together

Create `Sources/RocketUpCore/RocketShape.swift` in the workspace root's Swift package. Import SwiftUI. Implement public SwiftUI `Shape` structs, each with a public init and a `path(in rect: CGRect) -> Path`: `RocketBodyShape` (rounded capsule-like fuselage occupying roughly the middle 40% width and 55% height of the rect), `NoseConeShape` (curved cone atop the body), `FinShape` with a `side: HorizontalEdge`-style parameter (public enum `FinSide { case left, right }`) drawing a swept triangular fin at the body's lower left/right, `WindowShape` (circular porthole centered on the upper body, ~15% of rect width), and `FlameShape` (teardrop exhaust flame below the body). Also implement a public composite `RocketShape: Shape` whose `path(in:)` unions the body, nose cone, both fins, and window paths (flame excluded so it can animate independently). All geometry must be computed proportionally from `rect` (no hard-coded absolute coordinates) so the rocket scales to any frame, and every shape must return a non-empty path whose bounding box is contained within `rect`. Additionally create `Sources/RocketUpCore/RocketPalette.swift` with a public enum `RocketPalette` exposing static SwiftUI `Color` values: `body` (silver/white), `accent` (red for nose cone and fins), `window` (light blue), `flame` (orange), `skyTop` (deep blue), `skyBottom` (light blue) — defined from RGB literals, no asset catalog. Add doc comments describing each shape. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

1.3queued
Scaffold Swift package workspace, Makefile, and READMEwave-1 · runs together

In the workspace root, create the project skeleton for the Rocket Up iOS app. Create `Package.swift` (swift-tools-version 5.9) defining a package named `RocketUpCore` with platforms `[.iOS(.v16), .macOS(.v13)]`, one library target `RocketUpCore` (path `Sources/RocketUpCore`), and one test target `RocketUpCoreTests` (path `Tests/RocketUpCoreTests`, depends on RocketUpCore). Create empty directory placeholders by writing `Sources/RocketUpCore/AppInfo.swift` containing a public enum `AppInfo` with static let constants: `title = "Rocket Up"`, `rocketAccessibilityLabel = "Rocket"`, `rocketAccessibilityIdentifier = "rocket-image"`, `launchButtonTitle = "Launch"`. Create a `Makefile` with targets: `test` (runs `swift test`), `generate` (runs `xcodegen generate`), `build-ios` (runs `xcodebuild -project RocketUp.xcodeproj -scheme RocketUp -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build`). Create `.gitignore` (ignore `.build/`, `*.xcodeproj`, `DerivedData/`, `.DS_Store`) and `README.md` describing the app, the RocketUpCore package layout, and how to run `make test`, `make generate`, `make build-ios`. Do not create the app target or artwork files; other tasks own those. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

Wave 2parallel
2.1queued
Build the SwiftUI app entry point and rocket screenwave-2 · runs together

Create the iOS app source files under `App/Sources/` in the workspace root, importing the local `RocketUpCore` package. Create `App/Sources/RocketUpApp.swift` with `@main struct RocketUpApp: App` whose body is a `WindowGroup { ContentView() }`. Create `App/Sources/ContentView.swift`: a single screen with a full-bleed vertical `LinearGradient` background from `RocketPalette.skyTop` to `RocketPalette.skyBottom`; the title `Text(AppInfo.title)` in a large rounded bold font near the top; a `RocketView` centered, sized ~200x280pt; and a prominent `Button(AppInfo.launchButtonTitle)` near the bottom. Create `App/Sources/RocketView.swift`: composes the RocketUpCore shapes — `RocketBodyShape` filled with `RocketPalette.body`, `NoseConeShape` and both `FinShape(side: .left)` / `FinShape(side: .right)` filled with `RocketPalette.accent`, `WindowShape` filled with `RocketPalette.window`, and `FlameShape` filled with `RocketPalette.flame` shown only when the model's `isFlameVisible` is true — in a `ZStack`, with `.accessibilityLabel(AppInfo.rocketAccessibilityLabel)` and `.accessibilityIdentifier(AppInfo.rocketAccessibilityIdentifier)` applied to the composed rocket. Wire behavior in ContentView: hold `@StateObject private var model = LaunchAnimationModel()`; tapping the Launch button (or the rocket itself via `.onTapGesture`) calls `model.launch()` then animates `model.setProgress(1)` inside `withAnimation(.easeIn(duration: 1.5))`; the rocket's vertical position uses `.offset(y: model.verticalOffset * screenHeight)` via `GeometryReader`, so the rocket flies up and off screen; when phase becomes `.flying`, after a 0.8s delay (`DispatchQueue.main.asyncAfter` or `Task.sleep`) call `model.reset()` inside `withAnimation` so the rocket returns for another launch, and while flying the button reads "Again!" state driven by `model.phase`. Include a `#Preview` for ContentView. Use only SwiftUI and RocketUpCore — no other dependencies. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

2.2queued
Write XCTest suite for artwork, app info, and launch modelwave-2 · runs together

Create the XCTest suite under `Tests/RocketUpCoreTests/` in the workspace root, importing XCTest, SwiftUI, and `@testable import RocketUpCore`. Create `Tests/RocketUpCoreTests/RocketShapeTests.swift`: for a rect of 200x300, assert that `RocketShape`, `RocketBodyShape`, `NoseConeShape`, `FinShape(side: .left)`, `FinShape(side: .right)`, `WindowShape`, and `FlameShape` each return a path where `path.isEmpty == false` and `rect.insetBy(dx: -1, dy: -1).contains(path.boundingRect)`; also assert the composite RocketShape's bounding rect is at least 30% of the rect's width and 50% of its height (it is a substantial illustration, not a sliver), and that geometry scales: the bounding rect for a 400x600 rect is ~2x the 200x300 one in each dimension (accuracy 1.0). Create `Tests/RocketUpCoreTests/AppInfoTests.swift`: assert `AppInfo.title == "Rocket Up"`, `AppInfo.rocketAccessibilityLabel == "Rocket"`, `AppInfo.rocketAccessibilityIdentifier == "rocket-image"`, `AppInfo.launchButtonTitle == "Launch"`. In the same file add `testContentViewUsesAppInfoConstants`: locate `App/Sources/ContentView.swift` and `App/Sources/RocketView.swift` relative to the package root using `#filePath` (walk up from the test file to the directory containing `Package.swift`), read their contents with `String(contentsOfFile:)`, and assert ContentView's source contains `AppInfo.title` and RocketView's source contains both `rocketAccessibilityLabel` and `rocketAccessibilityIdentifier` — skip with `XCTSkip` only if the files are absent. Create `Tests/RocketUpCoreTests/LaunchAnimationModelTests.swift`: assert initial state (`phase == .idle`, `progress == 0`, `verticalOffset == 0`, `isFlameVisible == false`); after `launch()` phase is `.launching` and flame is visible; `setProgress` values 0.0, 0.25, 0.5, 0.75, 1.0 produce strictly decreasing `verticalOffset` ending at `-1.5` (accuracy 0.0001), i.e. at least one full screen height upward; at progress 1 phase is `.flying`; `setProgress` clamps inputs -1 and 2 into 0...1; `launch()` while flying is a no-op; `reset()` restores `.idle`, progress 0, offset 0. These tests are the executable verification of acceptance criteria AC-1, AC-2, and AC-3. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

2.3done
Verify.Launch Model.Harnesswave-2 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

2.4done
Verify.Rocket Artwork.Harnesswave-2 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

2.5done
Verify.Scaffold Workspace.Harnesswave-2 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

Wave 3parallel
3.1queued
Review UI code for accessibility, polish, and PRD fidelitywave-3 · runs together

Read `App/Sources/RocketUpApp.swift`, `App/Sources/ContentView.swift`, `App/Sources/RocketView.swift`, `Sources/RocketUpCore/RocketShape.swift`, `Sources/RocketUpCore/RocketPalette.swift`, `Sources/RocketUpCore/LaunchAnimationModel.swift`, and `Sources/RocketUpCore/AppInfo.swift` in the workspace root. Verify against the PRD in `fractal-plan.json`: (1) the screen shows the title 'Rocket Up' and a centered rocket composed of body, nose cone, two fins, window, and conditional flame; (2) the rocket carries accessibility label "Rocket" and identifier "rocket-image", and the Launch button has an accessible title; (3) the launch tap animates the rocket upward using LaunchAnimationModel.verticalOffset and resets so it can be launched repeatedly; (4) all colors come from RocketPalette and all user-facing strings from AppInfo (no stray hard-coded duplicates); (5) no dead code, force-unwraps of optionals that can fail, or platform-unsafe API in RocketUpCore (it must compile for both iOS and macOS for `swift test`). Directly fix any small violations you find in those files (string/constant mismatches, missing accessibility modifiers, macOS-incompatible API in the package). Write your findings and every change made to `review-notes.md` in the workspace root.

3.2done
Verify.App Ui.Harnesswave-3 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

3.3done
Verify.Unit Tests.Harnesswave-3 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

3.4queued
Define XcodeGen project for the iOS app targetwave-3 · runs together

Create `project.yml` in the workspace root for XcodeGen defining project `RocketUp`: options `bundleIdPrefix: com.fractal`, `deploymentTarget: { iOS: '16.0' }`; a `packages:` entry referencing the local RocketUpCore package at path `.`; one iOS application target `RocketUp` with `sources: [App/Sources]`, dependency on the `RocketUpCore` package product, and settings `GENERATE_INFOPLIST_FILE: YES`, `INFOPLIST_KEY_UILaunchScreen_Generation: YES`, `PRODUCT_BUNDLE_IDENTIFIER: com.fractal.rocketup`, `CURRENT_PROJECT_VERSION: 1`, `MARKETING_VERSION: 1.0`, `INFOPLIST_KEY_CFBundleDisplayName: Rocket Up`, `TARGETED_DEVICE_FAMILY: '1'`, `SWIFT_VERSION: '5.9'`, and code signing disabled for simulator builds (`CODE_SIGNING_ALLOWED: NO` in debug). Also define a scheme `RocketUp` that builds the RocketUp target. Verify the `Makefile`'s `generate` and `build-ios` targets (created by the scaffold task) match this project/scheme naming — edit the Makefile if they diverge. Update `README.md`'s build section if the actual commands differ from what it documents. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.

Wave 4parallel
4.1done
Run native test suite and iOS build to verify acceptance criteriawave-4 · runs together

From the workspace root, run the repository's native test suite: `swift test` (equivalently `make test`). All tests in RocketUpCoreTests must pass — they verify acceptance criteria AC-1 (RocketShape and its component shapes produce non-empty, in-bounds, substantial vector paths), AC-2 (AppInfo title is 'Rocket Up' and the accessibility constants are referenced by ContentView/RocketView), and AC-3 (LaunchAnimationModel drives the rocket monotonically upward to at least one screen height and resets). If any test fails, fix the implementation source (not the assertions, unless an assertion contradicts the PRD in `fractal-plan.json`) and re-run until green. Then verify AC-4: run `make generate && make build-ios`; if `xcodegen` or an iOS Simulator SDK is unavailable on this host, fall back to `swift build` and record the exact commands, outputs, and the AC-4 gap. Write a final `verification-report.md` in the workspace root listing each acceptance criterion AC-1 through AC-4, the exact command used to check it, and PASS/FAIL/SKIPPED with evidence (test counts, build exit status). The task fails unless `swift test` exits 0.

4.2done
Verify.Xcode Project.Harnesswave-4 · runs together

Re-run the acceptance suite against the produced artifact; fail if any test fails.

Wave 5sequential
5.1done
Lead acceptance review and closeoutruns after dependencies

Review the finished implementation against .fractal/lead-prd.json. Inspect the changes and verification evidence, run any final checks needed, then write .fractal/closeout.json with schema fractal.closeout.v1, status approved, a non-empty summary, an acceptance array containing every PRD acceptance id with passed=true and concrete evidence, and a risks array. Do not approve if any criterion is unsupported.

Contribute

Open work

6 visible tasks
app_ui
Build the SwiftUI app entry point and rocket screenWave 2 · parallelCreate the iOS app source files under `App/Sources/` in the workspace root, importing the local `RocketUpCore` package. Create `App/Sources/RocketUpApp.swift` with `@main struct RocketUpApp: App` whose body is a `WindowGroup { ContentView() }`. Create `App/Sources/ContentView.swift`: a single screen with a full-bleed vertical `LinearGradient` background from `RocketPalette.skyTop` to `RocketPalette.skyBottom`; the title `Text(AppInfo.title)` in a large rounded bold font near the top; a `RocketView` centered, sized ~200x280pt; and a prominent `Button(AppInfo.launchButtonTitle)` near the bottom. Create `App/Sources/RocketView.swift`: composes the RocketUpCore shapes — `RocketBodyShape` filled with `RocketPalette.body`, `NoseConeShape` and both `FinShape(side: .left)` / `FinShape(side: .right)` filled with `RocketPalette.accent`, `WindowShape` filled with `RocketPalette.window`, and `FlameShape` filled with `RocketPalette.flame` shown only when the model's `isFlameVisible` is true — in a `ZStack`, with `.accessibilityLabel(AppInfo.rocketAccessibilityLabel)` and `.accessibilityIdentifier(AppInfo.rocketAccessibilityIdentifier)` applied to the composed rocket. Wire behavior in ContentView: hold `@StateObject private var model = LaunchAnimationModel()`; tapping the Launch button (or the rocket itself via `.onTapGesture`) calls `model.launch()` then animates `model.setProgress(1)` inside `withAnimation(.easeIn(duration: 1.5))`; the rocket's vertical position uses `.offset(y: model.verticalOffset * screenHeight)` via `GeometryReader`, so the rocket flies up and off screen; when phase becomes `.flying`, after a 0.8s delay (`DispatchQueue.main.asyncAfter` or `Task.sleep`) call `model.reset()` inside `withAnimation` so the rocket returns for another launch, and while flying the button reads "Again!" state driven by `model.phase`. Include a `#Preview` for ContentView. Use only SwiftUI and RocketUpCore — no other dependencies. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.
ReadyClaim task
launch_model
Implement launch animation state machineWave 1 · parallelCreate `Sources/RocketUpCore/LaunchAnimationModel.swift` in the workspace root's Swift package. Import Foundation only (no UIKit) so it stays platform-agnostic. Implement a public final class `LaunchAnimationModel: ObservableObject` (import Combine or use SwiftUI's ObservableObject via `import SwiftUI` guarded to Foundation-safe usage — prefer `import Combine`). Public API: `enum Phase: Equatable { case idle, launching, flying }`; `@Published private(set) var phase: Phase` starting `.idle`; `@Published private(set) var progress: Double` in 0...1 starting 0; computed `var verticalOffset: Double` returning the rocket's vertical translation in normalized screen-height units — 0 when idle, and for launching/flying an ease-in curve `-(progress * progress) * flightDistance` with `public let flightDistance: Double = 1.5`, so offset decreases monotonically from 0 to -1.5 as progress goes 0 → 1; computed `var isFlameVisible: Bool` true only when phase != .idle and progress < 1; `func launch()` which transitions idle → launching (no-op in other phases); `func setProgress(_ value: Double)` which clamps to 0...1, updates progress, and moves phase to `.flying` when progress >= 1 while launching; `func reset()` returning to `.idle` with progress 0. All behavior must be synchronous and deterministic (no Timers inside the model — the view drives progress) so it is fully unit-testable. Add doc comments explaining the normalized-offset convention (negative = upward, units of screen heights). REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.
ReadyClaim task
lead_plan
Lead PRD and architecture approvedWave 0 · sequentialThe lead-authored .fractal/lead-prd.json and validated task DAG are ready.
ReadyClaim task
quality_review
Review UI code for accessibility, polish, and PRD fidelityWave 3 · parallelRead `App/Sources/RocketUpApp.swift`, `App/Sources/ContentView.swift`, `App/Sources/RocketView.swift`, `Sources/RocketUpCore/RocketShape.swift`, `Sources/RocketUpCore/RocketPalette.swift`, `Sources/RocketUpCore/LaunchAnimationModel.swift`, and `Sources/RocketUpCore/AppInfo.swift` in the workspace root. Verify against the PRD in `fractal-plan.json`: (1) the screen shows the title 'Rocket Up' and a centered rocket composed of body, nose cone, two fins, window, and conditional flame; (2) the rocket carries accessibility label "Rocket" and identifier "rocket-image", and the Launch button has an accessible title; (3) the launch tap animates the rocket upward using LaunchAnimationModel.verticalOffset and resets so it can be launched repeatedly; (4) all colors come from RocketPalette and all user-facing strings from AppInfo (no stray hard-coded duplicates); (5) no dead code, force-unwraps of optionals that can fail, or platform-unsafe API in RocketUpCore (it must compile for both iOS and macOS for `swift test`). Directly fix any small violations you find in those files (string/constant mismatches, missing accessibility modifiers, macOS-incompatible API in the package). Write your findings and every change made to `review-notes.md` in the workspace root.
ReadyClaim task
rocket_artwork
Implement vector rocket artwork as SwiftUI shapesWave 1 · parallelCreate `Sources/RocketUpCore/RocketShape.swift` in the workspace root's Swift package. Import SwiftUI. Implement public SwiftUI `Shape` structs, each with a public init and a `path(in rect: CGRect) -> Path`: `RocketBodyShape` (rounded capsule-like fuselage occupying roughly the middle 40% width and 55% height of the rect), `NoseConeShape` (curved cone atop the body), `FinShape` with a `side: HorizontalEdge`-style parameter (public enum `FinSide { case left, right }`) drawing a swept triangular fin at the body's lower left/right, `WindowShape` (circular porthole centered on the upper body, ~15% of rect width), and `FlameShape` (teardrop exhaust flame below the body). Also implement a public composite `RocketShape: Shape` whose `path(in:)` unions the body, nose cone, both fins, and window paths (flame excluded so it can animate independently). All geometry must be computed proportionally from `rect` (no hard-coded absolute coordinates) so the rocket scales to any frame, and every shape must return a non-empty path whose bounding box is contained within `rect`. Additionally create `Sources/RocketUpCore/RocketPalette.swift` with a public enum `RocketPalette` exposing static SwiftUI `Color` values: `body` (silver/white), `accent` (red for nose cone and fins), `window` (light blue), `flame` (orange), `skyTop` (deep blue), `skyBottom` (light blue) — defined from RGB literals, no asset catalog. Add doc comments describing each shape. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.
ReadyClaim task
scaffold_workspace
Scaffold Swift package workspace, Makefile, and READMEWave 1 · parallelIn the workspace root, create the project skeleton for the Rocket Up iOS app. Create `Package.swift` (swift-tools-version 5.9) defining a package named `RocketUpCore` with platforms `[.iOS(.v16), .macOS(.v13)]`, one library target `RocketUpCore` (path `Sources/RocketUpCore`), and one test target `RocketUpCoreTests` (path `Tests/RocketUpCoreTests`, depends on RocketUpCore). Create empty directory placeholders by writing `Sources/RocketUpCore/AppInfo.swift` containing a public enum `AppInfo` with static let constants: `title = "Rocket Up"`, `rocketAccessibilityLabel = "Rocket"`, `rocketAccessibilityIdentifier = "rocket-image"`, `launchButtonTitle = "Launch"`. Create a `Makefile` with targets: `test` (runs `swift test`), `generate` (runs `xcodegen generate`), `build-ios` (runs `xcodebuild -project RocketUp.xcodeproj -scheme RocketUp -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build`). Create `.gitignore` (ignore `.build/`, `*.xcodeproj`, `DerivedData/`, `.DS_Store`) and `README.md` describing the app, the RocketUpCore package layout, and how to run `make test`, `make generate`, `make build-ios`. Do not create the app target or artwork files; other tasks own those. REPAIR: a previous attempt did NOT succeed at `verify.app_ui.harness` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly. REPAIR: a previous attempt did NOT succeed at `run_tests` (it failed verification, or the agent got stuck / timed out). Read any error output and fix the implementation and tests so the whole suite passes. If the earlier approach was slow, blocking, interactive, or hung, SIMPLIFY it: avoid long-running or interactive operations and produce a minimal, correct version quickly.
ReadyClaim task