Skip to content

chore: stabilize local CI parity#1048

Open
mimeding wants to merge 8 commits into
osaurus-ai:mainfrom
mimeding:codex/a0-local-ci-stabilization
Open

chore: stabilize local CI parity#1048
mimeding wants to merge 8 commits into
osaurus-ai:mainfrom
mimeding:codex/a0-local-ci-stabilization

Conversation

@mimeding
Copy link
Copy Markdown
Contributor

@mimeding mimeding commented May 7, 2026

Readiness Block

Local CI parity: PASS (commit: 71fd60d)
GitHub CI status: PASS (headRefOid: 71fd60d)
Merge state: CLEAN
Known gaps: none

Reviewer Summary

What this PR adds: Local CI helper scripts plus timeout/test isolation hardening needed for repeatable Codex PR gates.
What it depends on: current origin/main at 5c398c58.
What depends on it: Later stabilization, supersession, and branch-agent phases in the v2 execution plan.
New public API surface: scripts/codex/local-ci.sh, scripts/codex/pr-worktree.sh; no app API.
New tests: Tool timeout fixture hardening in ToolRegistryTimeoutTests, sandbox install lock stabilization, and a debug test guard that keeps chat history off the production keychain when no test root is set.
Test corpus: none.
Local gate: PASS @ 71fd60df657294c84b8ef9cb800f3f8cd5a2c2dd.
Risk: Medium, broad SwiftLint cleanup plus timeout scheduling behavior.
Out of scope: Merging downstream bugfix/document-stack PRs.

Business reason

Observed locally on May 7, 2026: origin/main at 30c6522036346047f40deac3d6fbc8f263e272b8 did not satisfy the mission-required local CI gate because strict SwiftLint reported existing violations before any PR work could safely proceed. This blocked safe execution of the broader stabilization plan: every stale or conflicted PR would have spent maintainer attention and GitHub Actions minutes before Codex could prove the branch locally.

This PR makes the A0 local-first workflow repeatable. It gives every later branch the same local gate, isolates PR worktrees, removes stale-green ambiguity, and fixes the timeout/test isolation issues that made the first A0 remote test-core run fail. Landing this first reduces cascading red for the downstream bugfix and document-stack PRs.

Coding rationale

  • The local CI scripts intentionally live under scripts/codex/ so the workflow is explicit, reviewable, and reusable without changing app runtime behavior.
  • The broad SwiftLint cleanup is concentrated in this parent PR so downstream rebases do not each rediscover the same style drift.
  • ToolRegistry.runToolBody uses unstructured tasks plus an actor latch because Swift task groups wait for children to drain; that was the failure mode when a non-cooperative tool body ignored cancellation and the timeout envelope could not return within budget.
  • ToolRegistryTimeoutTests uses a cancellation-unaware slow fixture on purpose, so regressions that accidentally wait for timed-out tool bodies are caught locally and in Xcode CI.
  • ChatHistoryDatabase.open() stays in-memory only for debug test runs without an explicit OsaurusPaths.overrideRoot, preventing accidental production keychain/DB access while preserving explicit temp-root storage coverage.
  • Workspace package pins are aligned so SwiftPM and Xcode resolve the same dependency graph, especially Containerization 0.32.0.

Technical change

  • Adds scripts/codex/local-ci.sh to run the local CI parity sequence from the mission brief.
  • Adds an optional xcodebuild test -scheme OsaurusCoreTests parity path to scripts/codex/local-ci.sh; it defaults on and can be skipped with OSAURUS_RUN_XCODE_CORE_TESTS=0 when documenting a local Xcode toolchain failure.
  • Adds scripts/codex/pr-worktree.sh to create isolated /tmp/osaurus-wt/<task-id> worktrees with non-interactive fetch behavior.
  • Applies SwiftLint cleanup across existing Swift sources so swiftlint lint --strict --config .swiftlint.yml passes on the A0 branch.
  • Disables three high-churn legacy policy rules in .swiftlint.yml: multiple_closures_with_trailing_closure, inclusive_language, and discouraged_optional_boolean.
  • Reworks SandboxInstallLockTests.sameAgent_runsSequentially to assert same-agent serialization with an explicit gate instead of relying on async let scheduling order.
  • Updates ToolRegistry.runToolBody to race tool execution and timeout with unstructured tasks plus an actor result latch so timeout envelopes can return without waiting for a cancelled tool body to drain.
  • Hardens ToolRegistryTimeoutTests so the slow fixture is cancellation-unaware and the wall-clock window still catches draining implementations while tolerating Xcode full-suite scheduler latency observed in remote test-core.
  • Keeps ChatHistoryDatabase.open() in-memory during debug tests when no OsaurusPaths.overrideRoot is set, preventing accidental production keychain/DB access while preserving explicit temp-root storage tests.

Linked issues

No issue number was identified for this A0 infrastructure PR. Relates to the mission brief section "Phase A0 - Stabilize main".

Local CI parity

  • swiftlint lint --strict --config .swiftlint.yml: PASS
  • find scripts -name '*.sh' -print0 | xargs -0 shellcheck --severity=warning: PASS
  • touched shell scripts shellcheck: PASS
  • swift build --package-path Packages/OsaurusCore: PASS
  • swift test --package-path Packages/OsaurusCore: PASS (1,749 tests, 0 failures)
  • Xcode package resolution for OsaurusCoreTests: PASS
  • xcodebuild test -workspace osaurus.xcworkspace -scheme OsaurusCoreTests ...: PASS (TEST SUCCEEDED)
  • xcodebuild build -workspace osaurus.xcworkspace -scheme osaurus ...: PASS (BUILD SUCCEEDED)
  • swift build --package-path Packages/OsaurusCLI: PASS
  • swift test --package-path Packages/OsaurusCLI: PASS (44 XCTest tests + 0 Swift Testing tests, 0 failures)

GitHub CI

  • shellcheck: PASS
  • swiftlint: PASS
  • test-cli: PASS (1m20s)
  • test-core: PASS (17m04s)
  • update_release_draft: PASS

Risk and rollback

The main risks are review noise from the broad SwiftLint cleanup and the timeout implementation detail: a non-cooperative timed-out tool body may continue unwinding briefly in the background after the caller receives the timeout envelope. Rebase repair also aligns the workspace package pins with Packages/OsaurusCore/Package.resolved so SwiftPM and Xcode both use Containerization 0.32.0. Rollback is to revert this PR; the helper scripts are isolated under scripts/codex/, and the behavioral fix is confined to ToolRegistry.runToolBody.

Fidelity / compatibility notes

N/A - this is not a file-I/O PR. No new third-party dependency was added.

@mimeding
Copy link
Copy Markdown
Contributor Author

mimeding commented May 7, 2026

A0 status update (2026-05-07T16:38Z): local parity is green via scripts/codex/local-ci.sh attempt 6 with the local Xcode-core gap documented in the PR body, and remote checks are green: swiftlint, shellcheck, test-cli, test-core, update_release_draft. This PR is ready for human review/merge. I did not launch Tier 1 because the mission forbids agent merges and downstream work must start from green origin/main.

@tpae tpae requested a review from Copilot May 7, 2026 18:25
tpae
tpae previously approved these changes May 7, 2026
Copy link
Copy Markdown
Contributor

@tpae tpae left a comment

Choose a reason for hiding this comment

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

This looks good to me

Copy link
Copy Markdown
Contributor

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 aims to restore “local CI parity” by adding local helper scripts, making SwiftLint strict mode pass on the branch, and fixing/hardening the tool-timeout race behavior that was failing in test-core.

Changes:

  • Added scripts/codex/local-ci.sh and scripts/codex/pr-worktree.sh to standardize local CI and isolated worktree workflows.
  • Updated tool-timeout implementation (ToolRegistry.runToolBody) and hardened related tests (ToolRegistryTimeoutTests, SandboxInstallLockTests).
  • Applied broad SwiftLint-driven cleanup across Swift sources and adjusted .swiftlint.yml to disable a few high-churn rules.

Reviewed changes

Copilot reviewed 185 out of 186 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
scripts/codex/pr-worktree.sh New helper script to create task-specific git worktrees.
scripts/codex/local-ci.sh New local CI parity runner (SwiftLint, ShellCheck, SPM + optional Xcode tests, app build, CLI tests).
Packages/OsaurusRepository/ToolsPaths.swift SwiftLint formatting/access-modifier ordering.
Packages/OsaurusRepository/Tests/OsaurusRepositoryTests/PluginInstallManagerTests.swift SwiftLint formatting.
Packages/OsaurusRepository/PluginSpec.swift SwiftLint formatting.
Packages/OsaurusRepository/PluginInstallManager.swift Minor loop/where refactor (SwiftLint-style).
Packages/OsaurusRepository/MinisignVerifier.swift SwiftLint formatting.
Packages/OsaurusRepository/CentralRepositoryManager.swift Minor loop/where refactor + SwiftLint formatting.
Packages/OsaurusCore/Views/WhatsNew/WhatsNewView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Watcher/WatchersView.swift SwiftLint formatting + optional nil default cleanup.
Packages/OsaurusCore/Views/Voice/VoiceView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Voice/AudioSettingsTab.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Toast/ToastContainerView.swift Init modifier order + SwiftLint suppression for notification observer removal.
Packages/OsaurusCore/Views/Theme/ThemesView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Theme/ThemeEditorView.swift SwiftLint formatting + discardable-let cleanup.
Packages/OsaurusCore/Views/SlashCommand/SlashCommandsView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Settings/SlashCommandsSettingsSection.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Settings/ServerView.swift Formatting + safer Data appends for multipart body.
Packages/OsaurusCore/Views/Settings/RemoteProviderEditSheet.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Settings/ProvidersView.swift SwiftLint formatting + access modifier tweak on testConnection().
Packages/OsaurusCore/Views/Settings/PermissionsView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Settings/DirectoryPickerView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Settings/ConfigurationView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Schedule/SchedulesView.swift SwiftLint formatting + optional nil default cleanup.
Packages/OsaurusCore/Views/Sandbox/SandboxView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Plugin/ToolsManagerView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Plugin/ToolPermissionView.swift Changed Data→String conversion for pretty JSON display.
Packages/OsaurusCore/Views/Plugin/PluginsView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Plugin/PluginConfigView.swift SwiftLint formatting + minor loop/where refactor.
Packages/OsaurusCore/Views/Onboarding/OnboardingWalkthroughView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Onboarding/OnboardingFields.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Onboarding/OnboardingConfigureAIView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Model/ModelRowView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Model/ModelPickerTableRepresentable.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Model/ModelDownloadView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Model/ModelDetailView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Memory/MemoryView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Memory/MemoryComponents.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Management/ManagerHeader.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Insights/InsightsView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Insights/InsightsDetailPane.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Common/TableView.swift SwiftLint formatting (unused indices).
Packages/OsaurusCore/Views/Common/SharedHeaderComponents.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Common/SettingsEmptyState.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Common/NotchWindowController.swift Init modifier order + SwiftLint suppression for notification observer removal.
Packages/OsaurusCore/Views/Common/NotchView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Common/GlassBackground.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Common/CodeBlockView.swift SwiftLint suppression for discardable let + bounds.contains.
Packages/OsaurusCore/Views/Chat/StreamingMarkdownBalancer.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Chat/SelectableTextView.swift SwiftLint formatting + bounds.contains + minor formatting.
Packages/OsaurusCore/Views/Chat/PromptQueue.swift Access-modifier ordering.
Packages/OsaurusCore/Views/Chat/NativeToolCallGroupView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Chat/NativeMessageCellView.swift Removed redundant override + pattern-match simplification + formatting.
Packages/OsaurusCore/Views/Chat/NativeMarkdownView.swift bounds.contains + SwiftLint formatting.
Packages/OsaurusCore/Views/Chat/NativeChartView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Chat/NativeBlockViews.swift bounds.contains + SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/NativeArtifactCardView.swift SwiftLint formatting.
Packages/OsaurusCore/Views/Chat/MessageThreadView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/MessageTableRepresentable.swift SwiftLint formatting + minor loop/where refactors.
Packages/OsaurusCore/Views/Chat/MarkdownMessageView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/MarkdownImageView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/FloatingInputCard.swift SwiftLint formatting + narrowed helper visibility + discardable-let suppression.
Packages/OsaurusCore/Views/Chat/EditableTextView.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/DocumentChip.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/ChatView.swift SwiftLint formatting + discardable-let suppression.
Packages/OsaurusCore/Views/Chat/ChatSessionSidebar.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Chat/ChatEmptyState.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Views/Agent/CapabilitiesTableRepresentable.swift SwiftLint formatting + minor loop/where refactor.
Packages/OsaurusCore/Views/Agent/AgentsView.swift SwiftLint formatting + helper signature formatting.
Packages/OsaurusCore/Utils/StringCleaning.swift SwiftLint formatting.
Packages/OsaurusCore/Utils/StreamingDeltaProcessor.swift SwiftLint formatting.
Packages/OsaurusCore/Utils/OsaurusPaths.swift Access-modifier ordering + SwiftLint formatting.
Packages/OsaurusCore/Tools/ToolRegistry.swift Timeout race refactor using unstructured tasks + actor latch.
Packages/OsaurusCore/Tools/ToolEnvelope.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/ShareArtifactTool.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/SchemaValidator.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/SandboxPluginTool.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/RenderChartTool.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Tools/OsaurusTool.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/MCPProviderTool.swift SwiftLint formatting.
Packages/OsaurusCore/Tools/BuiltinSandboxTools.swift SwiftLint formatting (function signature braces).
Packages/OsaurusCore/Tools/AgentLoopTools.swift SwiftLint formatting.
Packages/OsaurusCore/Tests/Tool/ToolRegistryTimeoutTests.swift Hardened timeout test fixture to be cancellation-unaware + timing adjustments.
Packages/OsaurusCore/Tests/Sandbox/SandboxInstallLockTests.swift Reworked serialization test to use an explicit gate instead of scheduling assumptions.
Packages/OsaurusCore/Storage/StorageMigrator.swift SwiftLint formatting / conditional simplification.
Packages/OsaurusCore/Storage/PluginDatabase.swift SwiftLint formatting.
Packages/OsaurusCore/Storage/MemoryDatabase.swift Placeholder generation refactor (indices instead of enumerated).
Packages/OsaurusCore/Storage/ChatHistoryDatabase.swift Minor loop/where refactor.
Packages/OsaurusCore/Services/Voice/TranscriptionCleanupService.swift SwiftLint formatting.
Packages/OsaurusCore/Services/UpdaterService.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Services/Tool/ToolSearchService.swift SwiftLint formatting.
Packages/OsaurusCore/Services/SystemMonitorService.swift SwiftLint formatting (discarded values).
Packages/OsaurusCore/Services/Sandbox/SandboxManager.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Services/Provider/RemoteToolDetection.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Provider/RemoteProviderService.swift SSE parsing formatting + changed UTF-8 decoding behavior.
Packages/OsaurusCore/Services/Provider/RemoteProviderKeychain.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Provider/OpenAICodexOAuthService.swift SwiftLint formatting (function signature braces).
Packages/OsaurusCore/Services/Plugin/PluginRepositoryService.swift latestVersion selection refactor using max().
Packages/OsaurusCore/Services/Plugin/PluginHostAPI+SessionPersistence.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Plugin/PluginHostAPI.swift Access-modifier ordering + UTF-8 decode behavior change in jsonString.
Packages/OsaurusCore/Services/NotificationService.swift Init modifier order.
Packages/OsaurusCore/Services/ModelRuntime/RollingTokenRate.swift SwiftLint formatting.
Packages/OsaurusCore/Services/ModelRuntime/MLXErrorRecovery.swift SwiftLint formatting.
Packages/OsaurusCore/Services/ModelRuntime.swift Access-modifier ordering + SwiftLint formatting + minor loop/where refactors.
Packages/OsaurusCore/Services/ModelDownloadService.swift SwiftLint formatting (remove redundant = nil) + closure formatting.
Packages/OsaurusCore/Services/Memory/MemoryService.swift SwiftLint formatting.
Packages/OsaurusCore/Services/MCP/MCPServerManager.swift UTF-8 decode behavior change.
Packages/OsaurusCore/Services/MCP/MCPProviderKeychain.swift SwiftLint formatting.
Packages/OsaurusCore/Services/LocalReasoningCapability.swift Access-modifier ordering + SwiftLint formatting.
Packages/OsaurusCore/Services/LocalGenerationDefaults.swift Access-modifier ordering.
Packages/OsaurusCore/Services/Keychain/ToolSecretsKeychain.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Inference/ModelService.swift UTF-8 decode behavior change.
Packages/OsaurusCore/Services/Inference/MLXService.swift Access-modifier ordering.
Packages/OsaurusCore/Services/Inference/FoundationModelService.swift SwiftLint formatting + minor control-flow tweak.
Packages/OsaurusCore/Services/HuggingFaceService.swift Minor loop/where refactor + SwiftLint formatting.
Packages/OsaurusCore/Services/GitHubSkillService.swift SwiftLint formatting.
Packages/OsaurusCore/Services/DirectoryPickerService.swift Access-modifier ordering.
Packages/OsaurusCore/Services/Context/PreflightCompanions.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Context/PreflightCapabilitySearch.swift Visibility tightening (fileprivateprivate) + SwiftLint formatting.
Packages/OsaurusCore/Services/Context/ClipboardService.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Context/CapabilitySearchHealth.swift Access-modifier ordering.
Packages/OsaurusCore/Services/Chat/SystemPromptComposer.swift UTF-8 decode behavior change + SwiftLint formatting.
Packages/OsaurusCore/Services/Chat/ContextSizeClass.swift SwiftLint formatting.
Packages/OsaurusCore/Services/Chat/ChatEngine.swift Removed explicit Sendable conformance + SwiftLint formatting.
Packages/OsaurusCore/Services/Chat/AgentNameDetector.swift Minor loop/where refactor.
Packages/OsaurusCore/Networking/ServerController.swift Minor loop/where refactor + pattern-match simplification + UTF-8 decode behavior change.
Packages/OsaurusCore/Networking/RelayTunnelManager.swift Minor loop/where refactor.
Packages/OsaurusCore/Networking/OsaurusServer.swift Removed explicit Sendable conformance + SwiftLint formatting.
Packages/OsaurusCore/Networking/HTTPRequestParse.swift UTF-8 decode behavior change for request-log text.
Packages/OsaurusCore/Networking/HostAPIBridgeServer.swift SwiftLint formatting.
Packages/OsaurusCore/Networking/BonjourBrowser.swift Init modifier order.
Packages/OsaurusCore/Networking/BonjourAdvertiser.swift Init modifier order + access-modifier ordering in delegate methods.
Packages/OsaurusCore/Models/Tool/ToolConfiguration.swift Minor loop/where refactor.
Packages/OsaurusCore/Models/Configuration/ServerConfiguration.swift Simplified raw values for enum cases.
Packages/OsaurusCore/Models/Configuration/RemoteProviderConfiguration.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Configuration/ModelMetadataParser.swift Minor loop/where refactor + SwiftLint formatting.
Packages/OsaurusCore/Models/Configuration/ModelInfo.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Configuration/MLXModel.swift Minor loop/where refactor + SwiftLint formatting.
Packages/OsaurusCore/Models/Chat/SharedArtifact.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Chat/SessionSource.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Chat/ResponseWriters.swift SwiftLint formatting (closure formatting).
Packages/OsaurusCore/Models/Chat/RequestLog.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Chat/InternalMessage.swift Removed redundant initializer.
Packages/OsaurusCore/Models/Chat/ContentBlock.swift SwiftLint formatting (function signature braces) + minor formatting.
Packages/OsaurusCore/Models/Chat/ChatTurn.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Models/API/OpenResponsesAPI.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Models/API/OpenAIAPI.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Models/API/AnthropicAPI.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Models/Agent/SkillStore.swift SwiftLint formatting.
Packages/OsaurusCore/Models/Agent/Skill.swift SwiftLint formatting.
Packages/OsaurusCore/Managers/WindowManager.swift Init modifier order.
Packages/OsaurusCore/Managers/WatcherManager.swift Access-modifier ordering.
Packages/OsaurusCore/Managers/SpeechService.swift Access-modifier ordering + SwiftLint formatting + small control-flow tweak.
Packages/OsaurusCore/Managers/ScheduleManager.swift Access-modifier ordering + SwiftLint formatting.
Packages/OsaurusCore/Managers/PluginActivityManager.swift topActivity selection refactor using max(by:).
Packages/OsaurusCore/Managers/Plugin/SandboxPluginManager.swift SwiftLint formatting.
Packages/OsaurusCore/Managers/Plugin/SandboxPluginLibrary.swift SwiftLint formatting.
Packages/OsaurusCore/Managers/Plugin/PluginManager.swift Minor loop/where refactors + max(by:) for versions + access-modifier ordering.
Packages/OsaurusCore/Managers/Model/ModelManager.swift SwiftLint formatting + access-modifier ordering + minor loop/where refactors.
Packages/OsaurusCore/Managers/MCPProviderManager.swift Access-modifier ordering + SwiftLint formatting.
Packages/OsaurusCore/Managers/InsightsService.swift Access-modifier ordering.
Packages/OsaurusCore/Managers/InferenceProgressManager.swift SwiftLint formatting (remove redundant = nil).
Packages/OsaurusCore/Managers/Chat/ChatWindowState.swift Access-modifier ordering + SwiftLint formatting.
Packages/OsaurusCore/Managers/Chat/ChatWindowManager.swift Init modifier order.
Packages/OsaurusCore/Managers/BlockMemoizer.swift SwiftLint formatting.
Packages/OsaurusCore/Managers/BackgroundTaskManager.swift SwiftLint formatting.
Packages/OsaurusCore/Folder/FolderTools.swift Minor loop/where refactors + SwiftLint formatting.
Packages/OsaurusCore/Folder/FolderContextService.swift Access-modifier ordering for nonisolated globals + property.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Services/AppControl.swift Minor loop/where refactor.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsUpgrade.swift latest selection refactor using max().
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsUninstall.swift SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsSearch.swift latest selection refactor using max().
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsPackage.swift Minor loop/where refactor + SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsOutdated.swift available selection refactor using max().
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsList.swift SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsInstall.swift SwiftLint formatting (remove redundant = nil) + minor loop/where refactor.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsDev.swift Access-modifier ordering + first(where:) cleanup + SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Tools/ToolsCreate.swift SwiftLint whitespace cleanup in templates/docs.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Show.swift SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Serve.swift SwiftLint formatting + removed trailing space in prompt string.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Run.swift SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/Pull.swift SwiftLint formatting.
Packages/OsaurusCLI/Sources/OsaurusCLICore/Commands/MCPCommand.swift UTF-8 decode behavior change.
App/osaurusUITests/osaurusUITestsLaunchTests.swift Updated override syntax (class varstatic var).
.swiftlint.yml Disabled additional rules to stabilize strict lint gate.

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

Comment on lines +413 to +438
let race = ToolBodyRaceResult()
let bodyTask = Task {
do {
let result = try await tool.execute(argumentsJSON: argumentsJSON)
await race.resolve(result)
} catch is CancellationError {
// Cancelled because the timeout branch won.
} catch {
await race.resolve(ToolEnvelope.fromError(error, tool: toolName))
}
group.addTask {
let nanos = UInt64(timeoutSeconds * 1_000_000_000)
do {
try await Task.sleep(nanoseconds: nanos)
} catch {
// Cancelled because the body finished first — yield
// the sentinel so the caller's first non-sentinel
// result wins.
return cancelledSentinel
}
return timeoutEnvelope
}
let timeoutTask = Task {
let nanos = UInt64(max(0, timeoutSeconds) * 1_000_000_000)
do {
try await Task.sleep(nanoseconds: nanos)
} catch {
// Cancelled because the body branch won.
return
}
await race.resolve(timeoutEnvelope)
}

let result = await race.wait()
bodyTask.cancel()
timeoutTask.cancel()
return result
Comment on lines 463 to 467
// Decode the line as UTF-8. SSE field names and the optional space after
// the colon are ASCII; lossy decoding is safe for any non-UTF-8 bytes
// that would only appear inside the value portion.
// swiftlint:disable:next optional_data_string_conversion
let lineStr = String(decoding: line, as: UTF8.self)
let lineStr = String(bytes: line, encoding: .utf8) ?? ""

Comment on lines 32 to 36
var bodyCopy = body
let bytes = bodyCopy.readBytes(length: bodyCopy.readableBytes) ?? []
let data = Data(bytes)
return ParsedBody(data: data, text: String(decoding: data, as: UTF8.self))
return ParsedBody(data: data, text: String(bytes: data, encoding: .utf8) ?? "")
}
Comment on lines +25 to +32
WORKTREE="$WORKTREE_ROOT/$TASK_ID"

case "$TASK_ID" in
*..* | /* | *//* | '')
echo "Invalid task id: $TASK_ID" >&2
exit 2
;;
esac
@mimeding mimeding force-pushed the codex/a0-local-ci-stabilization branch from ba6b954 to 544a860 Compare May 8, 2026 21:55
Michael Meding added 8 commits May 10, 2026 00:04
Adds scripts/codex local CI and worktree helpers for Phase A0 orchestration.

Applies SwiftLint cleanup needed for strict lint on origin/main 30c6522, with scoped disables for legacy policy rules.

Fixes SandboxInstallLockTests to assert same-agent serialization without relying on async scheduling order.

Local verification: scripts/codex/local-ci.sh PASS (attempt 3, 2026-05-07T15:20:18Z).
@mimeding mimeding force-pushed the codex/a0-local-ci-stabilization branch from 544a860 to 71fd60d Compare May 10, 2026 03:17
@mimeding
Copy link
Copy Markdown
Contributor Author

@tpae quick nudge: #1048 has been refreshed on current origin/main (5c398c58) and is ready for maintainer review/merge.

Business rationale: this is the A0 parent PR that makes the local-first gate repeatable before spending GitHub Actions minutes or maintainer attention on the downstream stack. It also fixes the timeout/test isolation issues that made the first A0 remote test-core run fail, so later bugfix/document-stack PRs do not cascade red.

Coding rationale: the scripts are isolated under scripts/codex/; the broad SwiftLint cleanup is concentrated here to reduce downstream rebase churn; ToolRegistry.runToolBody now returns timeout envelopes without waiting for cancellation-unaware tool bodies to drain; and debug tests no longer touch production chat-history keychain/DB state when no explicit temp root is set.

Evidence: local parity PASS at 71fd60df657294c84b8ef9cb800f3f8cd5a2c2dd; GitHub CI PASS on the same SHA (shellcheck, swiftlint, test-cli, test-core, Release Drafter); merge state CLEAN; known gaps: none. Downstream work is intentionally parked until this lands.

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.

3 participants