Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
4e71a36
docs(audit): add design audit report 2026-07-10
lynnswap Jul 10, 2026
899a87d
docs(audit): correct CodexKit design findings
lynnswap Jul 10, 2026
baabd19
build(package): pin remote CodexKit resolution
lynnswap Jul 10, 2026
ad0e208
docs(architecture): approve rearchitecture design
lynnswap Jul 10, 2026
9a10d28
refactor(package): import CodexKit products directly
lynnswap Jul 10, 2026
128b42c
refactor(review): consume typed terminal outcomes
lynnswap Jul 10, 2026
bdae8ef
refactor(review-ui): adopt legal turn snapshot states
lynnswap Jul 10, 2026
dc91702
test(review-ui): evaluate mutating projection before require
lynnswap Jul 10, 2026
bb8795a
fix(review): preserve runtime stop invariants
lynnswap Jul 10, 2026
0e01b09
fix(review): preserve typed terminal failures
lynnswap Jul 10, 2026
d340249
test(app-server): use current-v2 item fixtures
lynnswap Jul 10, 2026
ebbcedb
docs(architecture): preserve deprecation notice schema
lynnswap Jul 10, 2026
55cecc6
docs(architecture): clarify connection ownership
lynnswap Jul 10, 2026
1ab844d
docs(architecture): pin transport lifecycle contracts
lynnswap Jul 10, 2026
ea5bb9f
docs(architecture): define bounded thread event ownership
lynnswap Jul 10, 2026
37bb94e
docs(architecture): bound thread terminal delivery
lynnswap Jul 11, 2026
c4005c9
refactor(app-server): align consumers with bounded events
lynnswap Jul 11, 2026
a001ff3
refactor(auth): adopt stock login lifecycle
lynnswap Jul 11, 2026
f3aec28
refactor(auth): centralize account registry ownership
lynnswap Jul 11, 2026
fc2d903
refactor(auth): harden durable account transitions
lynnswap Jul 11, 2026
261586d
fix(review-ui): use live chat state for context actions
lynnswap Jul 11, 2026
e9e52b6
refactor(review-ui): consume immutable chat observations
lynnswap Jul 11, 2026
f20b5e1
refactor(review-ui): adopt typed current-v2 preview events
lynnswap Jul 11, 2026
6ef0717
fix(preview): preserve streaming after chat actions
lynnswap Jul 12, 2026
1ca382c
docs(architecture): refine rearchitecture contracts
lynnswap Jul 12, 2026
146affa
fix(review-monitor): stop preview store on termination
lynnswap Jul 12, 2026
ee013a4
refactor(review): centralize lifecycle ownership
lynnswap Jul 12, 2026
1e96a90
docs(review): clarify retention source invariant
lynnswap Jul 12, 2026
1505795
refactor(host): centralize runtime session ownership
lynnswap Jul 12, 2026
5853f3e
refactor(auth): install login session before async binding
lynnswap Jul 12, 2026
c4330f7
refactor(auth): derive account mutations from disk state
lynnswap Jul 12, 2026
0847dfb
build(deps): pin subscription lifecycle fix
lynnswap Jul 12, 2026
66894ca
build(deps): pin login cancellation fix
lynnswap Jul 12, 2026
55bfa95
build(deps): pin required message identity
lynnswap Jul 12, 2026
d799daa
refactor(testing): require explicit review attempt plans
lynnswap Jul 12, 2026
c1ca75a
docs(architecture): unify review cleanup result
lynnswap Jul 12, 2026
97f07bb
test(api): freeze TextTransitions interfaces
lynnswap Jul 12, 2026
ab871bb
build(deps): pin canonical review cleanup
lynnswap Jul 12, 2026
40ec4ff
ci(api): verify TextTransitions interfaces
lynnswap Jul 12, 2026
07c422e
test(api): normalize generated interfaces
lynnswap Jul 12, 2026
780ea09
refactor(api): close review core surface
lynnswap Jul 12, 2026
94f3644
refactor(ui): narrow review composition surface
lynnswap Jul 12, 2026
345a56a
refactor(review): centralize worker clock
lynnswap Jul 12, 2026
f7d7b66
refactor(testing): use preview content factory
lynnswap Jul 12, 2026
ec389b5
build(deps): pin routing and login fixes
lynnswap Jul 12, 2026
9643aee
refactor(auth): own account runtime transitions
lynnswap Jul 12, 2026
5de5b77
refactor(host): extract runtime and account owners
lynnswap Jul 12, 2026
c9c073f
build(deps): pin structured server shutdown fix
lynnswap Jul 13, 2026
5ebe062
build(review-monitor): pin structured server shutdown fix
lynnswap Jul 13, 2026
3f32a77
fix(mcp): remove redundant log metadata
lynnswap Jul 13, 2026
a51e258
build(deps): pin CodexKit lifecycle fixes
lynnswap Jul 13, 2026
3be09bb
fix(host): retain restart ownership during teardown
lynnswap Jul 13, 2026
c80f082
build: advance CodexKit revision
lynnswap Jul 13, 2026
9ecea63
build: advance CodexKit revision
lynnswap Jul 13, 2026
ca05e65
build: advance CodexKit revision
lynnswap Jul 13, 2026
45f325c
fix(review-ui): stabilize persisted review presentation
lynnswap Jul 13, 2026
fd0a472
fix
lynnswap Jul 28, 2026
4eddf5e
fix(review-ui): consume normalized rollout companions
lynnswap Jul 28, 2026
3c37d5b
fix(ui): refresh review presentation after turn moves
lynnswap Jul 28, 2026
d20750c
build(deps): pin merged CodexKit review fixes
lynnswap Jul 28, 2026
9fff09c
fix(review): address PR feedback and shard CI
lynnswap Jul 28, 2026
5608208
ci(test): shard host test suite
lynnswap Jul 28, 2026
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
204 changes: 164 additions & 40 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@ concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DEVELOPER_DIR: /Applications/Xcode_26.6.0.app/Contents/Developer
EXPECTED_XCODE_VERSION_LINE: Xcode 26.6
EXPECTED_XCODE_BUILD_LINE: Build version 17F113

jobs:
package-tests:
name: Package Tests (macOS)
api-contract:
name: API Contract (macOS)
runs-on: macos-26
timeout-minutes: 10
env:
XCODE_MAJOR: '26'
steps:
- name: Check out repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
Expand All @@ -36,49 +39,170 @@ jobs:
- name: Verify GitHub Actions pinning
run: ruby scripts/verify-github-actions-pinning.rb

- name: Resolve latest stable Xcode
- name: Verify pinned Xcode
run: scripts/verify-ci-xcode.sh

- name: Verify TextTransitions public API
run: scripts/verify-text-transitions-api.sh

package-build:
name: Package Test Build (macOS)
runs-on: macos-26
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Verify pinned Xcode
id: toolchain
run: scripts/verify-ci-xcode.sh

- name: Restore SwiftPM build cache
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: .build
key: spm-build-v1-debug-swiftbuild-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved') }}-${{ github.sha }}
restore-keys: |
spm-build-v1-debug-swiftbuild-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved') }}-

- name: Restore source modification times
run: scripts/restore-source-mtimes.sh

- name: Build package tests
run: swift build --build-tests --build-system swiftbuild

package-tests:
name: Package Tests (macOS, ${{ matrix.shard }})
needs: package-build
runs-on: macos-26
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
- shard: CodexReviewKitTests
filter: CodexReviewKitTests
skip: ''
- shard: CodexReviewAppServerTests
filter: CodexReviewAppServerTests
skip: ''
- shard: CodexReviewMCPServerTests
filter: CodexReviewMCPServerTests
skip: ''
- shard: CodexReviewHostTests-a-d
filter: '^CodexReviewHostTests\.CodexReviewHostTests/liveStore[A-D]'
skip: ''
- shard: CodexReviewHostTests-e-j
filter: '^CodexReviewHostTests\.CodexReviewHostTests/liveStore[E-J]'
skip: ''
- shard: CodexReviewHostTests-k-r
filter: '^CodexReviewHostTests\.CodexReviewHostTests/liveStore[K-R]'
skip: ''
- shard: CodexReviewHostTests-remaining
filter: '^CodexReviewHostTests\.'
skip: '^CodexReviewHostTests\.CodexReviewHostTests/liveStore[A-R]'
- shard: ReviewUITests
filter: ReviewUITests
skip: ''
- shard: remaining
filter: ''
skip: 'CodexReviewKitTests|CodexReviewAppServerTests|CodexReviewMCPServerTests|CodexReviewHostTests|ReviewUITests'
steps:
- name: Check out repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Verify pinned Xcode
id: toolchain
run: scripts/verify-ci-xcode.sh

- name: Restore built package tests
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: .build
key: spm-build-v1-debug-swiftbuild-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved') }}-${{ github.sha }}
fail-on-cache-miss: true

- name: Run package test shard
env:
TEST_FILTER: ${{ matrix.filter }}
TEST_SKIP: ${{ matrix.skip }}
run: |
xcode_app="$(ruby <<'RUBY'
xcode_major = ENV.fetch("XCODE_MAJOR")
candidates = Dir["/Applications/Xcode_#{xcode_major}*.app"].select { |path| File.directory?(path) }

def pre_release_xcode_path?(path)
labels = [path, File.realpath(path)].map { |candidate| File.basename(candidate).downcase }
labels.any? do |label|
label.match?(/beta|release[ _-]?candidate|(?:^|[_. -])rc(?:$|[_. -])/)
end
end

candidates = candidates.reject do |path|
pre_release_xcode_path?(path)
end

def version_components(path)
version = File.basename(path)[/Xcode_(\d+(?:\.\d+)*)/, 1]
version.to_s.split(".").map(&:to_i)
end

selected = candidates.max_by { |path| version_components(path) }
abort("No stable Xcode #{xcode_major} installation found") unless selected
puts selected
RUBY
)"
echo "DEVELOPER_DIR=${xcode_app}/Contents/Developer" >> "$GITHUB_ENV"
echo "Resolved Xcode: ${xcode_app}"

- name: Show Xcode environment
args=(
--skip-build
--build-system swiftbuild
--no-parallel
)
[[ -z "$TEST_FILTER" ]] || args+=(--filter "$TEST_FILTER")
[[ -z "$TEST_SKIP" ]] || args+=(--skip "$TEST_SKIP")
swift test "${args[@]}"

monitor-build:
name: ReviewMonitor Test Build (macOS)
runs-on: macos-26
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Verify pinned Xcode
id: toolchain
run: scripts/verify-ci-xcode.sh

- name: Restore ReviewMonitor build cache
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: .ci-build/review-monitor-derived-data
key: review-monitor-build-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved', 'Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/**') }}-${{ github.sha }}
restore-keys: |
review-monitor-build-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved', 'Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/**') }}-

- name: Restore source modification times
run: scripts/restore-source-mtimes.sh

- name: Build ReviewMonitor tests
run: |
xcodebuild -version
xcodebuild -showsdks
xcodebuild build-for-testing \
-project Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj \
-scheme CodexReviewMonitor \
-destination 'platform=macOS,arch=arm64' \
-derivedDataPath .ci-build/review-monitor-derived-data \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO

monitor-tests:
name: ReviewMonitor Tests (macOS)
needs: monitor-build
runs-on: macos-26
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false

- name: Verify pinned Xcode
id: toolchain
run: scripts/verify-ci-xcode.sh

- name: Run Swift package tests
run: swift test --build-system swiftbuild --no-parallel
- name: Restore built ReviewMonitor tests
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: .ci-build/review-monitor-derived-data
key: review-monitor-build-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.toolchain.outputs.cache-id }}-${{ hashFiles('Package.swift', 'Package.resolved', 'Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj/**') }}-${{ github.sha }}
fail-on-cache-miss: true

- name: Run monitor app tests
- name: Run ReviewMonitor tests
run: |
xcodebuild test \
xcodebuild test-without-building \
-project Tools/ReviewMonitor/CodexReviewMonitor.xcodeproj \
-scheme CodexReviewMonitor \
-destination 'platform=macOS,arch=arm64' \
-derivedDataPath .ci-build/review-monitor-derived-data \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO
Loading