Files

187 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Swiftblade — Swift Specialist LoRA
Adapter codename: `swiftblade`
Agent: `build-swift`
Base model: Qwen/Qwen3.5-27B
## Objective
Teach the model Swift/Apple-idiomatic code generation aligned with the build-swift
agent's system prompt. The adapter should internalize:
- Swift 6 strict concurrency (`@Sendable`, `sending`, `@MainActor`)
- SwiftUI first, UIKit only when necessary
- `guard` for early exits, proper optional binding
- Value types over reference types where appropriate
- `URLSession` for networking (no Alamofire)
- swift build → swift test verification cycle
- Architecture detection (MVVM, TCA, MV)
## Current Status
build-swift currently runs on `anthropic/claude-sonnet-4-6` as a quality backstop.
The swiftblade adapter is intended as a local replacement, but deployment depends
on evaluation results. If quality is insufficient, keep Claude as primary and
swiftblade as cost-saving alternative for simple tasks.
## Data Sources
### Session extraction (~2040 examples)
Swift sessions are rare. Classify by:
- File paths: `.swift`, `Package.swift`, `*.xcodeproj`, `project.yml`
- Bash commands: `swift build`, `swift test`, `xcodebuild`, `swift-format`
- Error patterns: swiftc diagnostics, `error:`, `cannot convert`, `protocol conformance`
### Git repo mining (~3060 examples)
Target repos:
- `madcat-os/madcat-apple` — iOS/macOS app
- Any Swift packages in madcat-os org
Extract patterns:
- SwiftUI view implementations
- `@Observable` / `ObservableObject` view model patterns
- async/await networking with `URLSession`
- Swift Package Manager configuration
- Actor-based state isolation
### Synthetic (~80150 examples)
Swift is the most synthetic-heavy adapter:
- Swift 6 concurrency: actors, `@Sendable`, `TaskGroup`, structured concurrency
- SwiftUI: `@State`, `@Binding`, `@Environment`, custom modifiers
- Navigation: `NavigationStack`, `NavigationSplitView`, navigation paths
- Data flow: `@Observable` macro (Swift 5.9+), `@Bindable`
- Platform-specific: `#available`, multi-platform targets
- Swift Testing framework (`@Test`, `#expect`, `@Suite`) vs XCTest
- Combine → async/await migration patterns
- Widget/extension development
## Example Format
```json
{
"messages": [
{
"role": "system",
"content": "<build-swift agent system prompt>"
},
{
"role": "user",
"content": "Add a settings view with toggle for dark mode and notification preferences"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "glob",
"arguments": {"pattern": "Sources/**/*.swift"}
}
}
]
},
{
"role": "tool",
"content": "<file list showing existing views>"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "read",
"arguments": {"filePath": "Sources/Views/ContentView.swift"}
}
}
]
},
{
"role": "tool",
"content": "<existing SwiftUI view pattern>"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "write",
"arguments": {
"filePath": "Sources/Views/SettingsView.swift",
"content": "import SwiftUI\n\nstruct SettingsView: View {\n @AppStorage(\"darkMode\") private var darkMode = false\n ..."
}
}
}
]
},
{
"role": "tool",
"content": "File written"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "bash",
"arguments": {"command": "swift build 2>&1"}
}
}
]
},
{
"role": "tool",
"content": "Build complete!"
},
{
"role": "assistant",
"content": "SettingsView created. Uses `@AppStorage` for persistence, `Toggle` for dark mode and notifications. Follows existing MVVM pattern. Builds clean."
}
]
}
```
## Evaluation Criteria
1. `swift build` passes with no warnings
2. Swift 6 concurrency: correct `@Sendable`, actor isolation
3. SwiftUI-first (no UIKit unless justified)
4. Proper optional handling (`guard let`, `if let`, no force-unwrap)
5. Value types where appropriate
6. Architecture matches project (MVVM/TCA/MV detection)
7. Tool call sequence: explore → read patterns → implement → build → test
## Training Config Overrides
```python
MAX_SEQ = 8192
LR = 5e-5
```
## Estimated Size
- 100200 examples (mostly synthetic)
- ~0.8M tokens
- Training time: ~1 hr on H100
- Adapter size: ~305 MB
## Risk: Quality Gap vs Claude
Claude Sonnet excels at Swift due to Apple's partnership data. Swiftblade on
Qwen3.5-27B may underperform on:
- Complex generics and associated types
- Protocol-oriented design patterns
- Platform-specific API knowledge (Core Data, CloudKit, etc.)
Mitigation: keep Claude as fallback, use swiftblade for simpler tasks (UI,
boilerplate, tests). Evaluate before full switchover.