Repository navigation
Conversation
HemSoft
left a comment
There was a problem hiding this comment.
Cross-model review (Claude Opus 5.5 via T3)
Reviewed head f0c55bd64105933322c1b9c49cb09865c3e9c566 against base and merge-base 53e53837981121ab3a13986ed5630b9ce52d0b67. Model: Claude Opus 5.5 (claude-opus-5-5), requested effort xhigh. This is a placement-constrained Laptop fallback for the connected Codex reviewer. It is neither an SFL PASS nor a formal approval.
Assessment: changes needed (1 finding).
P1: Two other SwiftPM test targets still use the removed GoogleUsageMetricCatalog, so both named swift test commands still fail to compile
Remaining references at this head:
CodexUsageTests/CodexCreditsPoolTests.swift#L112-L113,#L182,#L185GrokAuthTests/CursorSpendingRegressionTests.swift#L95
Proof:
- #557 renamed the type to
ProviderMetricCatalog(CodexBarIOS/Models/ProviderMetricCatalog.swift#L4).git grep -n GoogleUsageMetricCatalog f0c55bdreturns only the five call sites above. No declaration or typealias exists anywhere in the repository. Package.swiftdeclares both directories as SwiftPM test targets (CodexUsageTestsat L48,GrokAuthTestsat L96) with no excludes. Neither file is inCodexBarIOS.xcodeproj, so only SwiftPM compiles them. That explains why the Xcode suites passed.swift test --filterfilters only when tests run. It still builds every test target in the package, which is the premise of #562.- Hosted run 42950113108 (workflow_dispatch at this head) confirms the failure. In the
SwiftPM smoke testsjob,Run metric tile SwiftPM regressionsconcludedfailureandRun Claude reset SwiftPM regressionswas skipped.MetricTileContentTestsnow compiles, so the fixture change itself works. The build then stops atGrokAuthTests/CursorSpendingRegressionTests.swift:95:32: error: cannot find 'GoogleUsageMetricCatalog' in scopeanderror: fatalError. The build stopped before compilingCodexUsageTests, so the four references there are a second failure the log does not show yet.
Impact: acceptance criteria 1 and 3 of #562 remain unmet, and so does this PR's criterion "Named metric tile and Claude reset tests execute successfully at this head". The new opt-in steps at .github/workflows/ci.yml L254–L260 fail whenever swiftpm_regressions=true. The changelog entry at CHANGELOG.md L63–L66 ("Restore filtered SwiftPM test compilation") and Closes #562 would record and close a fix that has not landed.
Correction: change the five GoogleUsageMetricCatalog. references to ProviderMetricCatalog.. The signatures of metrics(for:result:missingReason:) and layoutCopyMetricIDs(for:result:) are unchanged (L29–L61), so this restores no Google code. To verify, rerun both named swift test commands at the new head and confirm the selected tests execute with zero failures, not only that they compile.
Verified
- Fixture:
ProviderMetricTileContent.resolvepasses.unavailableUsage(reason)through unchanged (CodexBarIOS/Models/ProviderMetricTileContent.swiftL18–L19). The synthetic custom string therefore gives the same coverage as the retired"Disabled"value. All four reason categories and the assertion remain. - Google removal is preserved. The diff changes only the fixture string,
ci.ymlandCHANGELOG.md, and restores no Gemini, Antigravity or Google catalog, auth, endpoint or migration code. No SwiftPM target references another symbol #557 removed (verifiedGoogleSubject,linkedGoogleAccountIDs,.gemini,.antigravity, or the Gemini and Antigravity services). - Automatic CI is unchanged. The new steps are in the dispatch-only
smoke-testsjob and are also gated onworkflow_dispatch && inputs.swiftpm_regressions(defaultfalse). Theaccount-menu-comparisoncondition change applies only underworkflow_dispatch. No trigger, matrix, retry, timeout or automatic job changed. On the PR event, only SwiftLint ran and every other job was skipped (run 42950091348). python -m unittest discover -s scripts/tests -p test_ci_policy.py -vpassed 4 tests in a local rerun. SwiftLint concludedSUCCESSfor this head in run 42950091348.- The six most recent completed manual
SwiftPM smoke testsjobs took about 2–3 minutes each, which leaves room for the two added steps within the 15-minute timeout.
Limits
- This review ran no Swift build or test locally (Windows laptop, no Mac use). The compile failure comes from inspection and the hosted log above.
- At review time, run 42950113108 was still in progress overall. Only the smoke job had completed, and it failed.
- No live provider, account, install or release operation took place.
Review finding addressedThe first Laptop cross-model review identified the same five remaining stale catalog calls as the failed hosted compilation. All five are replaced by the retained ProviderMetricCatalog in 89d9956 with every assertion unchanged. The original finding is retained as old-head evidence. Fresh exact-head independent review and hosted run 42951199605 are pending; no clean review or test pass is claimed yet. |
HemSoft
left a comment
There was a problem hiding this comment.
Cross-model review (Claude Opus 5.5 via T3)
Reviewed head 89d9956ad271941991658238df60703a4796062d against base and merge-base 53e53837981121ab3a13986ed5630b9ce52d0b67. Model: Claude Opus 5.5 (claude-opus-5-5), effort xhigh. This is the placement-constrained Laptop fallback for the connected Codex reviewer. It is neither an SFL PASS nor a formal approval. The review covers the complete diff, not only the second commit.
Assessment: changes needed (1 finding).
P1: The ci.yml edits break two pinned workflow-hash tests, and the release gate runs one of them
Neither test was updated in this PR.
scripts/tests/test_ui_release_shards.py#L166-L168.test_manual_notifier_permission_and_full_workflow_scopehashes all ofci.ymlminus the notifier step and expects0c10b64a…c357.scripts/tests/manual/test_automatic_cost.py#L205-L219.test_removing_only_cost_mode_restores_complete_prior_workflowexpectsa42e96c0…df89.
Both hashes include bytes this PR changes. That covers the new input (ci.yml#L20-L23), the two smoke steps (#L254-L260) and the comparison condition (#L524).
The first test is part of the release gate. ci.yml#L295-L297 runs python3 -m unittest scripts.tests.test_ui_release_shards -v in iOS UI journeys (iphone, original-1) before any UI work. The failure fails that shard and then Full iOS UI validation, which AGENTS.md treats as a release blocker. Run 42951199605 can't show this. Comparison mode skips the UI families.
Proof. I ran each command at both SHAs from GitHub tarballs in disposable directories on Mini, with Python 3.14.4:
| Command | Base 53e5383 |
Head 89d9956 |
|---|---|---|
python3 -m unittest scripts.tests.test_ui_release_shards -v |
10 run, OK | 10 run, 1 failure: '71e478372406a8e2c475c0d6af314c0084e887550c65ffbd1897d907bfe3eb72' != '0c10b64a…c357' |
python3 -m unittest discover -s scripts/tests/manual -p test_automatic_cost.py -k test_removing_only_cost_mode_restores_complete_prior_workflow -v |
1 run, OK | 1 failure: 'c939b1ed55948e2e0cdaf617bee22124809928b4b3801af7605d0189cdec5156' != 'a42e96c0…df89' |
python3 -m unittest discover -s scripts/tests -p test_ci_policy.py -v |
4 run, OK | 4 run, OK |
I also wrote a separate script that reimplements both transforms. Run on the raw ci.yml blobs (LF), it gave the same four hashes.
Correction: make the fix in this PR. One option is to extend both restore transforms so they also strip the swiftpm_regressions input, its two steps and && !inputs.swiftpm_regressions. Then each test still recovers the workflow its comment describes. The other is to re-pin both hashes on purpose and update those comments. To verify, rerun the first two commands above. The release-gate module must pass 10 of 10.
Verified
- The f0c55bd finding from review 5853228084 is fixed. No Swift source still names
GoogleUsageMetricCatalog. No SwiftPM target uses any other declaration that #557 removed. I checked every removed declaration name against all SwiftPM target directories. - The five
ProviderMetricCatalogcalls do the same work as before. #557 renamed the type and dropped the Google cases,setupDescriptionandmissingSourceConfigurations. The.codexand.cursorpaths throughmetrics,cursorMetricsandlayoutCopyMetricIDshave identical bodies. - Every fixture assertion stays.
ProviderMetricTileContent.resolvepasses.unavailableUsage(reason)through unchanged (L18-L19). The synthetic reason therefore covers the same path as the retired"Disabled"value. All four reasons are still exercised. - Named tests executed at this head. In run 42951199605, job
SwiftPM smoke tests(130296721422), the metric tile filter ran 13 tests with 0 failures, includingtestUnavailableReasonRemainsDistinctFromReportedValues. TheClaudeUsageResetfilter ran 20 tests in 4 suites with 0 failures. The log shows no compiler errors or warnings. The two steps took 49 s and 25 s, and the job took 3 min 24 s of its 15-minute limit. - Google removal holds. The diff touches three test files,
ci.ymlandCHANGELOG.md, and restores no Google code. - Automatic CI did not change. The
swiftlintjob block is byte-identical to base. On the PR event (run 42951176401), only SwiftLint ran (success, 52 s) and every other job was skipped. The new steps sit in the dispatch-only smoke job and also requireinputs.swiftpm_regressions, which defaults tofalse. - The changelog entry sits under 2.0.1 Unreleased, Developer Experience, and matches the change.
Limits
- No local Swift build and no Mac use. Swift results come from hosted logs.
CodexCreditsPoolTestsandCursorSpendingRegressionTestscompile at this head, but neither filter runs them. Their equivalence rests on inspection.- Run 42951199605 at posting time: SwiftLint, Strict concurrency, watchOS tests and SwiftPM smoke tests succeeded. iOS tests is still in progress.
- No provider, account, install, release or CI-rerun operations.
Workflow-pin review finding addressedCommit ffab46d deliberately updates the two complete-workflow SHA-256 pins to include the approved opt-in manual SwiftPM invocation, with comments explaining the new pinned scope. Hash equality assertions remain strict; no checks or assertions were removed. The notifier script hash and automatic-job controls are unchanged. Exact-head Mini checks: Previous-head hosted smoke executed 13 metric tile tests and 20 Claude reset tests successfully. Exact-head replacement validation at ffab46d: https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42952974281, pending. Independent exact-head review pending. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Didn't find any major issues. 🎉 Verified:
Commands ran on Mini (Linux, Python 3.14.4, Node 24.22.1) against GitHub tarballs of both SHAs in a disposable directory:
The five errors are Limits: I didn't build or test Swift locally or use a Mac. The exact-head dispatch, run 42952974281, was still running when I posted. SwiftLint and watchOS tests had passed, and the smoke, iOS and strict-concurrency jobs were in progress. This review claims no exact-head Swift test result. I performed no provider, account, install, release or CI-dispatch operation. |
Baseline iOS validation failures and test-only repairExact-head run 42952974281 failed iOS tests: 1109 tests executed, three test methods failed with nine assertions. SwiftLint, strict concurrency, watchOS and smoke all passed. The smoke job executed 13 metric tile and 20 Claude reset tests with zero failures at ffab46d. No merge over this failed run. The failing tests and their production sources are byte-identical to base 53e5383. Reset inventory assertions expected the messages replaced by #561 for non-selected grants. Commit 25d2181 checks the shipped selected-reset limitation for both non-selected rows and retains the two original reason assertions in a separate test selecting an unusable grant. No arbitrary-grant or Fable behavior is changed. The two billing tests failed at page readiness and session completion; diagnostics show unresponsive WebContent processes. They previously loaded unattached WKWebViews, and the save test selected a synthetic account immediately after starting navigation. 25d2181 attaches these fixtures to a simulator window and waits for each provider document before account selection. Existing timeout bounds, success/account-isolation assertions and production auth remain unchanged. This is a test-only repair under the assigned CI-repair scope, awaiting hosted proof, not a claim the timing issue is already resolved. Failed diagnostics retained on Mini: /tmp/ios562-ffab46d-ios-diagnostics, /tmp/ios562-ffab46d-failed.log, /tmp/ios562-ffab46d-smoke.log. Replacement exact-head run: https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42955812990. New independent review pending. No test skip or assertion relaxation added; no provider operation or real Mac used. |
HemSoft
left a comment
There was a problem hiding this comment.
Cross-model review (Claude Opus 5.5 via T3)
Reviewed head 25d218128f6ab938925ed25f77a9bdaca6b7c391 against base and merge-base 53e53837981121ab3a13986ed5630b9ce52d0b67, which is still the main tip. Model: Claude Opus 5.5 (claude-opus-5-5), effort xhigh, run on Laptop. This request limits placement to Home or Laptop, which rules out SFL and hosted Codex, so this review is the Laptop fallback. It is neither an SFL PASS nor a formal approval. It covers all 9 changed files, with a focus on the new commit 25d2181.
Assessment: no blocking code findings; one P3. Merge stays blocked until the iOS tests job in run 42955812990 passes.
P3 (plausible, from inspection): the replacement billing session is probably not hosted in the window
CodexBarIOSTests/SubscriptionBillingTests.swift#L871 runs window.rootViewController?.view = replacement.webView. UIKit adds the root view controller's view to the window when rootViewController is set or the window becomes visible. Both already happened in hostBillingWebView at L885-L895. Reassigning view on a controller that is already on screen does not move the new view into the window. If that holds, the replacement web view runs unhosted, as it did at base, and the first session's invalidated web view stays in the window. I couldn't run UIKit here, so this comes from reading the code. Nothing in the test checks replacement.webView.window, so the PR's "including replacement session" claim is unverified.
The impact is limited. In failed run 42952974281 the replacement half passed while unhosted: ffab46d L869-L871 did not fail. L872 failed only because the first half never saved.
Fix: host the replacement through the helper, for example let replacementWindow = try hostBillingWebView(replacement.webView) with its own defer { replacementWindow.isHidden = true }. Also add XCTAssertNotNil(webView.window) at the end of hostBillingWebView. To verify, the next iOS tests run should pass that assertion for both sessions.
Timing hypothesis
- The billing failures are intermittent, not deterministic.
SubscriptionBillingTests.swift,SubscriptionBillingSignInView.swift, andProviderSettingsViewModel.swiftare byte-identical betweene00cbd6and this base. The only change between them is #561's Claude-reset fixture inUITestFixtures.swift. Hosted run 42807023756 ate00cbd6passed iOS tests with the same unhosted web views. So one green run at this head is consistent with the fix working, and also with the flake simply passing this time. It cannot attribute the fix by itself. - The wrong-account failure is a WebContent launch-latency failure. It failed at its existing load wait (base L732 and L736). The retained
xcodebuild.logshows the test starting at about 03:43:50. It then logsWebContent process (0x1171280c0) took 13.846741 seconds to launchat 03:44:04, which is beyond the unchanged 10 s bound at L941. Hosting in the window is the only change to this test. WebKit documents that web views outside a window are throttled or suspended (WKPreferences.inactiveSchedulingPolicy), which supports the hypothesis for work after launch. The log does not show that visibility shortens process launch. If launch takes more than 10 s again, this test will still fail. - The save test had no ordering race. If
chooseSyntheticAccountruns while the page is loading, the manual check returns early.didFinishthen callsinspectCookies(manual: false)inside the discovery window, which captures the cookie and completes (SubscriptionBillingSignInView.swift#L110-L114,#L189-L205). The first-half failure lined up with WebContent PID 17314 becoming unresponsive. The new readiness waits at L860 and L874 therefore help with diagnosis: a failure now shows whether the page never loaded or verification never finished. If the change fixes anything, it is the hosting. The waits also stop this test from covering the path where the cookie is set before the first load finishes. Coverage changed there, but no assertion was weakened.
Verified
- Teardown and isolation hold. Defers run in reverse order: the window is hidden before
session.invalidate(),viewModel.cancelSubscriptionBillingSignIn(), and removal of the defaults suite. The window is a local and is released when the test returns.testBillingRecoveryProductionViewHostEvidence(L1032-L1038) already uses the samemakeKeyAndVisibleplus hide-on-defer pattern. Each session keeps its own non-persistent website data store (SubscriptionBillingSignInView.swift#L47). TheMemorySecretStoreand UUID defaults suite are unchanged. All save, mismatch, and account-binding assertions remain (L863-L867, L877-L881). No timeout increase and no new skip; theXCTSkipUnlessat L856 predates this PR. - The reset copy test matches shipped #561 behavior and is not weakened. For a current grant that is not selected,
ClaudeUsageResetInventoryView.swift#L110-L116shows the selected-reset limitation before therequiresLimitbranch. The label dump in the failed log has exactly two copies (Limited and Disabled), and the new exactcount == 2at L397 is stricter than the oldcontainschecks. The newtestSelectedResetExplainsItsLimitOrDisabledState(L404) selects a grant withisUsableNow: false. In that caseredeemableGrantis nil (ClaudeUsageResetInventory.swift#L52-L55), so both original reason strings render and no action button appears. This matchesClaudeUsageUITests.swift#L32-L35. The helper's new parameter defaults totrue, so existing callers are unchanged. No Fable or arbitrary-grant behavior changed. - The new commit is test-only.
git diff ffab46d 25d2181touches only these two Swift test files. Across the full PR diff, no production, project,Package.swift, widget, or watch source changed.git grep GoogleUsageMetricCatalog -- '*.swift'at head returns nothing. - Workflow and pins.
ci.ymlis unchanged since the cleanffab46dreview (comment 6786289193); that review's pin re-derivation still applies. The opt-in steps are gated onworkflow_dispatch && inputs.swiftpm_regressions, and account-menu comparison is gated on!inputs.swiftpm_regressions. No automatic trigger, matrix, retry, or timeout changed. The PR run 42955798493 at head ran SwiftLint (success) and skipped every other job.
Commands run
- Laptop (read-only checkout):
git status --short(clean),git diff 53e5383 25d2181,git diff --stat ffab46d 25d2181,git diff --stat e00cbd6 53e5383,git grep GoogleUsageMetricCatalog 25d2181 -- '*.swift', plus source reads. - Mini, disposable
/tmp/ios562-review-25d2181fromgit archive 25d2181:python3 -m unittest scripts.tests.test_ui_release_shards scripts.tests.test_ci_policy scripts.tests.manual.test_automatic_cost.CostControls.test_removing_only_cost_mode_preserves_pinned_remaining_workflow -v→ 15 passed (log/tmp/ios562-review-25d2181-python.log). - Mini
ghasHemSoft: PR, issue, review and ruleset reads; job logs for run 42955812990. The retained failure evidence (/tmp/ios562-ffab46d-ios-diagnostics/pro-native/ios/xcodebuild.log,summary.log,/tmp/ios562-ffab46d-failed.log) was read and not modified.
Current-head CI (exact SHA 25d2181, not a merge commit)
- Required
SwiftLint(ruleset, strict): success in 42955798493 and 42955812990. - Dispatch 42955812990: Strict concurrency, watchOS tests and SwiftPM smoke tests passed. The smoke job ran
swift test --filter MetricTileContentRegressionTests(13 tests, 0 failures) andswift test --filter ClaudeUsageReset(20 tests, 0 failures). iOS tests: still in progress at 04:08Z (started 03:57:38Z). No iOS result is claimed, including for the two billing tests or the new reset test.
Limits
- I did not run Xcode, the iOS simulator, a real Mac, or live providers. Nothing about UIKit or WebKit runtime behavior was reproduced here.
- No CI was dispatched. No edits, checkouts, branches, approvals, thread resolutions, or merges were made.
- The billing fix can only be confirmed by repeated passing iOS runs. A single run has a sample size of one.
- Council review not required.
R4 event and current ownershipR4 completed with one P3 (review 5853734292). Commit 65881b4 hosts the replacement billing WKWebView in its own simulator window and asserts non-nil window attachment for every helper-created fixture. No timeout, production auth or assertions were relaxed. Existing hosted run 42955812990 remains in progress at 25d2181, registered to the same Laptop thread mcp:launch:0f1262cae9ebb5ff9f14d909465d58bc8b5e96c28dff439f3236780b99ff6e83. Preserve its final outcome before further validation. No duplicate run or review has been launched; the next exact-head review/validation will be for the changed head, after this actual run event. The matching central claim is retained; source delivery only, no release or live auth. Next trigger: existing run completion or PR event. |
Preceding validation succeeded; exact-head qualification startedRun 42955812990 finished SUCCESS at 25d2181 with all five quality jobs passing. UI journeys, full UI aggregate and account-menu capture were intentionally skipped by the manual comparison-plus-SwiftPM route. This is the first completed green iOS result after the baseline test-only repairs; it does not prove that intermittent WebKit startup failures are eliminated. Current PR head is 65881b4. Its only later change fixes R4 P3 with a separate window for the replacement view and a window-attachment assertion. Fresh actual hosted run https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42960321799 and one new independent Laptop review qualify this changed head. Neither is a duplicate of the completed preceding run/review. Claim remains chief-dispatch-0c08ab71-ios562. No merge or release yet. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Didn't find any major issues. 🎉 Verified
Non-blocking note, not a finding: the PR body still calls 42955812990 the "Replacement exact-head run", doesn't mention Commands
Current-head CI (exact SHA, not a merge commit), as of 04:44Z
Limits
|
New iOS failure diagnosed and fixture hostedRun 42960321799 at 65881b4 failed only SubscriptionBillingTests.testGrokUsesItsCapturedCookieSetRatherThanClaudeSessionKey: verification completion remained empty after page readiness, with three assertions reported from that method. The reset test and previously repaired billing tests passed. Four other quality jobs passed, including all 13 metric tile and 20 reset SwiftPM tests. Failed logs/artifacts are retained on Mini at /tmp/ios562-65881b4-failed.log and /tmp/ios562-65881b4-ios-diagnostics. Commit 83e1264 hosts that remaining Grok fixture with the same asserted simulator-window helper, preserving the captured-cookie set, completion and exactly-two-request assertions. It adds failure diagnostics for verification state, request count and synthetic message. No production/auth/timeout/skip change. This is a test-fidelity correction and not a proven elimination of intermittent WebKit stalls. Exact-head replacement validation https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42961997119 and fresh independent Laptop review are pending. Prior clean review is earlier-head evidence only. No merge over the failed run. |
Current-head validation remains blockedRun 42961997119 at current head 83e1264 completed FAILURE. SwiftLint, strict concurrency, watchOS and SwiftPM smoke passed, including 13 metric tile and 20 Claude reset tests. All billing tests and reset-copy tests passed. iOS executed 1110 tests and failed only DashboardAndSettingsTests.testWatchSnapshotCoordinatorClearsPausedAccountsWhenFreeResolvesBeforeInitialResults: its one-second publication expectation expired, followed by three unchanged snapshot assertions. That test and its production code are unchanged from base. This is not evidence that the issue562 fix regressed watch behavior, nor permission to merge over the failed job. Retained Mini evidence: /tmp/ios562-83e1264-failed.log and /tmp/ios562-83e1264-ios-diagnostics/pro-native/ios/{xcodebuild.log,summary.log}. No timeout increase, assertion relaxation, skip or retry was made. Existing R6 reviewer has an active continuation for this exact head and has not posted a verdict. Wait for that actual review event before selecting the next bounded repair. No duplicate run/review/timer. Product claim remains owned by this Laptop worker. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Didn't find any major issues. 🎉 I found no P1, P2 or P3 code findings. Merge is still blocked on validation. Exact-head run 42961997119 failed Exact-head validation
Hosting hypothesis challengeThe R5 failure log (run 42960321799,
If the failure comes back, the new message tells these cases apart:
The assertions on exactly two requests, the captured cookie set and completion are unchanged. Verified
PR body needs a refresh before merge (not a code defect)
Commands and limits
|
Authorized issue564 diagnostic continuationSame Laptop worker and claim now explicitly own test-only issue564 as the blocker to issue562. Duplicate/evidence check reuses #564. Commit f766923 instruments the original one-second expectation with synchronous access-emission/state evidence and a main-actor task-entry witness. It adds a synchronous explicit-publication control that preserves unresolved retention and free-transition clearing, snapshot counts, force flags, account isolation and secrets. Production behavior and deadlines are unchanged. This is diagnostic instrumentation, not a claimed repair or established scheduler cause. Hypotheses: missing/superseded access subscription; unexpected fixture state; delayed task execution. Trace [ios564-transition] distinguishes synchronous emission/commit, main-actor entry, sender publication and wait return. Current diagnostic hosted run: https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42965056884. It runs the named method, control and full affected suite through the existing manual runner. Earlier failure and ordinary receipt remain immutable. Independent Laptop exact-head review pending. No sleep/retry-for-green, timeout increase, skip or automatic-CI change. Issue564 is referenced, not claimed fixed. No merge or release. Same owner retains diagnosis, final validation/review/merge/safe sync/cleanup and matching claim release. |
First diagnostic result and matched controlRun42965056884 at f766923 failed only the original watch transition expectation. The trace shows one resolved-Free emission at3.16ms, committed state at3.17ms, main-actor witness at3.28ms, then sender publication at1.6606s and wait return at1.6606s. The other snapshot assertions passed once publication arrived. The synchronous direct-publication control passed. Four other quality jobs and the named SwiftPM suites passed. This rules out a missing transition or incorrect Free state in this sample. It does not distinguish timer wakeup from later actor interference, and no repair is claimed. Original diagnostics retained at /tmp/ios564-f766923-diagnostics and /tmp/ios564-f766923-failed.log on Mini. Commit1e97206a5d03d323d211786ea1c836ed02bcaed2 adds a matched zero-coalescing-delay control. Both named tests call the same helper with the same one-second wait, event trace, startup retention, account/secret isolation, snapshot count and force assertions. The original5ms case remains intact. Only the injected fixture coalescing duration differs. This is a counter-control experiment, not a retry-for-green or claimed test fix. Existing manual hosted run https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42966503947 qualifies both cases and full affected suite. Old-head review was stopped as superseded; fresh current-head independent Laptop review is pending. No production behavior/deadline/automatic-CI change. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2. One P3 about what the new control can show. Merge stays blocked by #564. P3: One zero-delay pass can't show that the stall comes from the timer
Only one outcome is informative:
The f766923 evidence already points beyond the fixture timer:
Risk: a single green zero run invites switching the fixture to Fix (test-only, same deadline, no sleeps or retries):
Instrumentation order and lifetime (verified)
Earlier #562 repairs (re-verified at this head)
Delivery state (read once, no polling)
Commands and limits
|
R8 diagnostic limitation acceptedR8 comment6788179991 is accepted: the zero-delay test is a duration-only control, not a separate scheduler path. One zero pass with one timed failure cannot establish causation for an intermittent stall. No such result will be treated as a fix. The f766923 wait itself returned after its deadline, and real shared WatchConnectivity sender logs are possible interference evidence, not a proved cause. Run42966503947 is still executing iOS tests; all four other quality jobs passed. Preserve that actual outcome before another diagnostic dispatch. If the trace remains insufficient, add global-executor and main-queue witnesses to distinguish the unobserved interval, keeping all original deadlines/assertions intact. No source edit, duplicate run or new review started in response to R8. |
Executor-witness diagnostic after the duration controlRun42966503947 at1e97206 completed FAILURE. Both watch transition cases passed:5ms published at12.22ms; zero published at3.91ms. This supplies no causal contrast and is not a fix. The ordinary iOS suite passed all1112 tests. Failure occurred later in native-commerce:22 of25 tests failed with StoreKit verification/purchase errors. This distinct unchanged commerce failure is retained, not bypassed or repaired under the test-only564 allocation. Four other quality jobs passed. Artifacts retained on Mini: /tmp/ios564-1e97206-diagnostics and /tmp/ios564-1e97206-failed.log. R8 limitation accepted: duration-only passes do not identify a cause; earlier real shared WatchConnectivity publications are possible interference, not proof. Head3b1628a64b734badef2e5d5c34108b2840ea1215 adds thread-safe immediate trace records for a detached global-executor entry, a main-queue callback, one synthetic5ms timer on the global executor, and its return to MainActor. The timer is a one-shot witness, not a wait/retry used to satisfy an assertion. The original one-second expectations,5ms case,zero-duration control and every snapshot/account/force assertion remain. No production source or automatic CI changes. New evidence run https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42970337329 uses the existing manual runner. Root cause and safe test-only repair are still unestablished; neither a passing sample nor added probes close564. Fresh independent exact-head Laptop review pending. Same claim/owner; no merge or release. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2. One P3: in the 3 ms–1.66 s gap, the new witnesses can't tell the main thread from the global executor. #564's root cause is not established, and merge stays blocked. P3: A late global timer leaves the main thread unobserved, and the timer runs at a different priority
Risk: the next failing sample may still not show which executor stalled, and an on-time witness at the other priority could be misread as "timer path healthy". This is the R8 P3 reading risk, narrowed. It is not a product defect. Fix (test-only, same 1 s deadline and assertions, nothing awaited, no retries):
Reading one sample at this head
In a passing zero-delay sample, the timer events will usually be missing. The test finishes at about 4.6 ms, and the Verified in the delta
Earlier #562 work (re-verified at this head)
Delivery state (read once, no polling)
Commands and limits
|
R9 probe correction, awaiting existing runR9 P3 is addressed in e4ee11e: the detached witness now uses Task.currentPriority, and an independent DispatchQueue.main.asyncAfter 5ms sample no longer depends on that global timer. The trace includes a wall-clock anchor, priority and timer cancellation. Records are buffered under the existing lock and printed after the original expectation returns, reducing output in the measured interval. No deadline/assertion/production change; no established564 repair. Run42970337329 at preceding head3b1628a remains in progress with iOS pending and the other four quality jobs passed. Preserve its actual completion evidence before dispatching the corrected diagnostic. No replacement run or review started yet. Fresh exact-head hosted qualification and independent review will be required for e4ee11e; R9 is earlier-head provenance only. Same Laptop claim/owner retained. |
Preserved prior outcome; corrected probes now qualifyingRun42970337329 at3b1628a completed FAILURE in native-commerce StoreKitProSubscriptionTests.testBillingGraceMapsVerifiedStatusAndKeepsAccess. Ordinary iOS and both watch cases passed. The5ms case published at74.79ms; zero at37.96ms. These passing samples do not establish cause or repair564. Prior R9 limitations remain: witnesses had unmatched priority and no independent delayed main-queue sample. Logs/artifacts retained at /tmp/ios564-3b1628a-failed.log and /tmp/ios564-3b1628a-diagnostics. Currenthead e4ee11e fixes that probe design only: inherited test priority, independent main-queue5ms timer, buffered trace, wall anchor and cancellation record. Newactualrun https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42974788943 now qualifies that changed head and gathers the corrected evidence. This is not an unchanged rerun for green. Same original1s deadline and assertions. Native-commerce behavior remains unmodified and its failures cannot be bypassed. Fresh independent Laptop exact-head review pending. Same claim/owner; no merge, release or established564 fix. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2. One P3: the new cancellation record never reaches the output. The R9 P3 is addressed. A failing sample at this head can now tell a blocked main thread from a late cooperative-pool timer and from a delay specific to the coordinator. #564's root cause is not established, the exact-head run is still in progress, and merge stays blocked. P3: The cancellation record is written after the trace is printed
Impact: low. A failing sample is unaffected, because cancellation can only happen after the print. "Timer not due yet" and "timer late" can still be told apart by comparing Fix (test-only): remove the cancellation record and correct the two claims, or note in #564 that a missing timer is read against the R9 fix (verified)
Reading one failing sample at this head"On time" means within a few ms of commit + 5 ms. A probe missing before
Lifetimes and sendability (inspection)
Earlier work (re-verified at this head)
Delivery state (read once at about 06:53Z, no polling)
Commands and limits
|
R10 trace limitation acceptedR10 comment6789390070 is accepted. The timer-cancellation record cannot appear in the printed trace because cancellation occurs in teardown after printing. Earlier descriptions in comments6788735081 and6789114618 overstated that output. Cancellation is not an available diagnostic signal at this head and is not used in any cause inference. Remove that unused record during diagnostic cleanup; do not await the witness before printing. The per-line printing in3b1628a also perturbed main-thread timing. Its74.79ms and37.96ms values are probe-affected passing samples, not evidence of production latency or a causal comparison. The earlier f7669231.66s failure used one print after the wait and remains original failure evidence. Current e4ee11e buffers records until after the unchanged wait. Run42974788943 remains in progress with only iOS pending; the other four jobs passed. Preserve its actual completion before another source revision or hosted diagnostic. No duplicate run/review or readiness claim. |
Diagnostic retention repaired after cancellationRun 42974788943 at e4ee11e was cancelled during native-germany after the ordinary iOS phase. Diagnostics upload then failed with ENOENT on the in-progress xcresult Staging testmanagerd.log. No iOS artifact was published. The compact corrected watch trace is therefore unavailable; no exact-head watch pass, cause or repair is inferred. Other four quality jobs passed. Retained Mini job log: /tmp/ios564-e4ee11e-ios-job.log. Head 2f09173 repairs this evidence path only: the existing manual runner emits bounded synthetic ios564 trace lines immediately after ordinary iOS xcodebuild returns, before later commerce phases and artifact upload. Full test/gate execution, deadlines, cancellation, failure handling and automatic workloads remain intact. Three counter-controls prove later failure cannot erase emitted output, unrelated log lines are excluded, and oversize/missing diagnostics are rejected. All 54 affected manual-runner, CI-policy and shard Python tests passed on Mini. R10's unobservable cancellation record is removed; nothing waits for the witness before printing. Current diagnostic run: https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42983035068. Fresh independent Laptop review pending. The underlying #564 cause and any safe test-only synchronization repair remain unestablished. No deadline increase, skip, relaxed assertion, protected commerce modification or unchanged retry-for-green. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2. One P3: no test runs the new trace hook inside P3: The trace hook in
|
R11 integration finding addressed with mutation proofCommit06aab1b043ae1eb4ed37fb626f3f1b92d29b0540 adds two RunnerCommandFailureTests that execute phase('ios') with OS process calls mocked. They assert trace output before result inspection/later failure and preserve xcodebuild65 when trace emission fails. On Mini the full affected Python suite passes. Deleting the phase hook makes the first new test fail; changing its error precedence to overwrite exit65 makes the second fail. Exact-head source, both mutations and logs retained at /tmp/ios564-06aab1b-proof-4m613gg5. This corrects the earlier helper-only proof limitation. Run42983035068 at preceding2f09173 remains the registered hosted attempt. Preserve its actual completion before a new dispatch. Currenthead changes only test coverage. Fresh independent exact-head Laptop review is requested; no current-head hosted pass is claimed. The e4ee11e job reached its existing45-minute limit, then upload failed on the changingxcresult stagingfile. That was timeout cancellation, not a human cancellation. No deadline increase, automaticwork change, skippedgate or retry-forgreen. Issue564 cause and repair remain unestablished. Sameowner/claim, no merge/release. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2. One P3: a test gap. R11's P3 is fixed for both seams it named: hook removal and exit-65 masking. #564's root cause is not established. No hosted run has qualified this head, and merge stays blocked. P3: No test covers a trace error failing an ordinary phase that otherwise passedAt
Proof: mutant M3 replaces L613 with Impact: low. The code at this head is correct by inspection, and stdout stays bounded under M3 because the emitter raises before printing a 9th line. What's unguarded is the fail-closed outcome. A later edit could let a missing, unreadable or over-bound diagnostic pass the ordinary iOS phase, and the error would show only in Fix (test-only, in the manual-only module): add a third
|
| Mutant | Edit | Result |
|---|---|---|
| M1 | delete the 6-line hook | new test 1 FAIL, new test 2 ERROR |
| M2 | failure = PhaseFailure(…) (trace error overwrites 65) |
new test 2 FAIL |
| M3 | trace error no longer fails the phase | 57/57 pass (the P3) |
| M4 | hook moved after result inspection | new test 1 FAIL |
| M5 | trace printed to stderr | new test 1 and helper test FAIL |
| M6 | hook only when xcodebuild failed | new test 1 FAIL |
| M7 | hook only when xcodebuild passed | new test 2 ERROR |
| M8 | invert the ios shared-Pro discovery gate |
both new tests ERROR |
| M9 | line bound 8192 → 9000 | new test 2 ERROR, helper FAIL |
| M10 | count bound 8 → 9 | helper FAIL |
Parent proof (/tmp/ios564-06aab1b-proof-4m613gg5): source/scripts matches my exact-head copy apart from __pycache__. Its two mutant diffs are exactly M1 and M2, and its logs show the expected targeted failures. My full-suite runs reproduce both.
Unchanged since R11 (re-checked at this head)
- Delta scope:
git diff --stat 2f09173 06aab1btouches onlyscripts/tests/test_pro_release_validation.py. The runner hook, workflow, CHANGELOG and Swift tests are as R11 reviewed them. - Watch case:
DashboardAndSettingsTests.swift#L2479-L2490keepstimeout: 1. The seven post-wait assertions are textually identical to base L2438-L2444, and the stricteraccessEvents == 1remains. There is no skip, retry or deadline change. - Remove stale Google catalog reference from metric tile tests #562:
git grep GoogleUsageMetricCatalogfinds 0 matches at head and 6 at base.- Compared with base, no production source,
Package.swiftor Xcode project changed. - The reset-copy test follows the precedence in the unchanged
ClaudeUsageResetInventoryView.swift(L110-L115).
- Automatic CI: the
swiftlintjob still runs onlytest_ci_policy.py. The new Python tests run only in the dispatch-onlyiOS testsjob.
Delivery state (read once at about 08:14Z; no polling)
- Ruleset: the only required check is
SwiftLint(strict), which passed at06aab1bin PR run 42984807250. Other jobs were skipped onpull_request. There is no formal review at this head and there are 0 review threads. - Manual run 42983035068 at the preceding
2f09173: SwiftLint, strict concurrency, watchOS tests and SwiftPM smoke passed.iOS testshas been in progress since 07:59:05Z. I claim no result for it. No hosted run exists at06aab1b, so this head needs fresh qualification later. - PR body: still names
2f09173as the current diagnostic head and cites "all 54 affected Python tests". That refresh is the parent's to make; I don't count it as a code defect. The native-commerce red results are separate, and this review doesn't assess or excuse them.
Commands and limits
- Laptop, read-only shared checkout (clean before and after,
HEAD06aab1b):git diffbase...head (12 files),git diff 2f09173 06aab1b,git grepandgit showsource reads. - Mini, as
HemSoft(checked withgh api user): read the PR, all comments, reviews, GraphQL threads, Remove stale Google catalog reference from metric tile tests #562, Diagnose intermittent watch snapshot transition test timeout #564, themainrules, the head check runs and run 42983035068, once each. - Mini, disposable copies:
git -c core.autocrlf=false archiveof head into/tmp/review-563-06aab1b-FhqXcZ/src. The runner and test file SHA-256 values match the git blobs. Python 3.14.4.python3 -m unittest scripts.tests.test_pro_release_validation scripts.tests.test_ui_release_shards scripts.tests.test_ci_policy scripts.tests.manual.test_automatic_cost.CostControls.test_removing_only_cost_mode_preserves_pinned_remaining_workflow: 57 OK. At base, the three modules give 51 OK.- M1–M10 via
mutate.pyin that directory, one log per mutant. - The full manual cost module gives 16 tests with 5
sw_verserrors at both head and base. This is a Linux limitation, not a pass.
- Limits:
- No Xcode, Swift tests, simulator, real Mac, auth, provider, account, signing, install, release, App Store Connect, pricing or CI dispatch.
- I didn't wait for or poll
iOS tests, so I have no exact-head trace or watch result.
R12 missing success-path failure control addressedHead9b7061966c2f38991b90a7153ffdb34e804c2873 adds the requested realphase('ios') case: successful xcodebuild plus nine trace lines must produce PhaseFailure1,receipt exit1,recordedwatchTransitionTraceError and exactlyone test invocation. It also asserts the original xcodecommand exited0. The full affected Python suite passes on Mini. All three mutations now fail their matching integration tests: deletedhook, maskedprimary65, and recorded-but-suppressedtracefailure. Source/mutations/logs retained at /tmp/ios564-9b70619-proof-i_dft55y. Fresh independent current-head review is running. No new hosted attempt was dispatched: run42983035068 atpreceding2f09173 remains the actual bound attempt. Preserve its final trace/outcome first. Currenthead only changes Python test coverage; no qualified564cause or repair is claimed, and it still needs applicable fresh hosted qualification after that outcome. No timeout/gate/assertion/production/automaticCI change. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Didn't find any major issues. 🎉 Assessment: no P1, P2 or P3. R12's P3 is fixed, and every earlier finding is still fixed or still an accepted limitation. #564's root cause is not established. No hosted run has qualified this head, so I make no readiness claim and merge stays blocked. R12 fix (verified)
The setup still patches only I ran each mutant in a fresh copy of the exact head under the full 58-test command. Numbering follows R12's table.
The parent's proof at Earlier findings (re-checked at this head)
Delivery state (read once at 08:25Z, no polling)
Commands and limits
|
Bounded diagnosis outcome: repair not establishedSame Laptop worker retains claim chief-dispatch-0c08ab71-ios562 and PR563 at9b7061966c2f38991b90a7153ffdb34e804c2873. R13 independent Laptop Claude Opus5.5 xhigh review is clean (comment6790980500), and the reviewed Python command passed58 tests. Required SwiftLint passed. No hosted run exists for this current test-only-coverage head. The completed diagnostic run42983035068 at2f09173 is FAILURE. Its ordinary iOS phase passed1112of1112 tests with0skips. The corrected watch probes are now retained in the job log:5ms case state committed2.57ms, independentmain timer8.90ms, globaltimer8.95ms, snapshot9.03ms; zero case snapshot4.22ms. These are healthy samples and do not explain the original f766923 publication at1.66seconds. There is no evidence-backed synchronization correction to apply under the no-deadline/no-assertion-relaxation/test-only limits. #564 remains open and is not claimed repaired. The job failed later in unchanged native-commerce:23of25 passed, two failed (StoreKit billinggrace and exactrenewalmetadata). Protected commerce/release behavior was not modified. No red failure was bypassed and no unchanged retry-forgreen was dispatched. Current-head hosted qualification remains pending rather than inferred from older source-equivalent Swift. The156MBartifact download first failed on Mini tmpfsquota; retry used a newly created owner-specific Mini disk directory, not another validation run. Complete evidence now retained at /home/franz/ios562-0c08ab71-evidence-RzPKpy/run42983035068. Earlier failures, controls and mutationproofs remain retained under their recorded Mini paths. Cancellation42974788943 was the existing45minute joblimit followed by xcresultuploadENOENT, not human cancellation. No merge/main delivery/sync/cleanup/claimrelease/absence proof is claimed. The branch/worktree remain clean and retained; all original release/auth/account/device/production/automaticCI prohibitions hold. The same Laptop worker remains owner of every unfinished item. No run or reviewer is pending, no newtimer or replacementowner. Next useful trigger requires a qualified failing watch sample with the corrected probes or a scoped decision about the independent protected native-commerce blocker. Further identical validation solely for green is prohibited. Report this evidence/scope boundary to both requesting sweeps; neither is asked to take over PR/CI. |
Scoped commerce continuationReused original claim and ownership; new defining issue #565 passed the evidence/duplicate check. #564 is accepted as DIAGNOSIS UNQUALIFIED and remains OPEN. A watch synchronization fix is not a requirement of this diagnostic tranche; all actual validation failures still block merge. Head 8f61f17 addresses the renewal test's oracle seam: the existing production mapper is exposed internally by removing only its private modifier, with no executable mapping change. The test feeds it the same verified Apple Status used for every exact metadata assertion, rather than comparing two separate SDK reads. A separate source.snapshot integration check remains. Epoch diagnostics distinguish the exact-payload mapping from an independently signed read; no tolerance or expected-value substitution is added. Grace remains diagnostic: native SDK status updates and fixture retry/grace/rate readbacks are captured before purchase and at timeout, alongside the existing service trace. All original 75-second bounds, grace/access assertions, 25 cases, product configuration and account/transaction isolation remain. This separates SDK generation/fixture state from mapping/delivery before any grace repair claim. Actual hosted manual run https://github.com/hemsoft-dev/codexbar-ios/actions/runs/42990740217 is registered to this Laptop thread. Fresh independent Laptop review pending. No production purchase/entitlement/billing-grace/renewal behavior, live operation, release or automatic CI change. |
Cross-model review (Claude Opus 5.5 via T3)Reviewed head Assessment: no P1 or P2, two P3s. The renewal-metadata change keeps the intended exact-mapping contract. The grace change is diagnosis only and repairs nothing. Run 42990740217 has not finished, so this head is not qualified and merge stays blocked. P3-1. The renewal test no longer checks metadata through
|
R14 findings addressed at 23232c1P3-1 is fixed in P3-2 had already been corrected while R14 was running: the live body names #565 and the visibility-only production-file edit. It is refreshed again for this head and makes no exact-head qualification claim.
Fresh exact-head Laptop review R15 is requested. The existing run 42990740217 at 8f61f17 is left to finish; no duplicate dispatch or rerun is started. Its actual completion event will drive the next diagnosis or changed-head qualification. #564 remains OPEN, DIAGNOSIS UNQUALIFIED. Merge remains blocked. |
Cross-model review (Claude Opus 5.5 via T3)Review R15 of head Assessment: no P1, P2 or P3 findings at this head. R14 P3-1 is fixed. The grace change still only diagnoses and repairs nothing. No hosted manual run has qualified this head, so merge stays blocked. R14 P3-1 fix (verified by inspection)
#565 delta at 8f61f17 (re-checked)
Observations, not findings
Earlier work at this head
Delivery state (each item read once, no polling)
Commands and limits
|
Summary
Repair #562's stale Google catalog test references, retain the bounded #564 watch diagnosis, and qualify the two native-commerce fixture failures tracked by #565. Google support stays removed. All original metric unavailable/setup/custom/empty assertions remain.
Five stale catalog calls use the retained ProviderMetricCatalog. Named SwiftPM tests run through an opt-in manual-only input; strict workflow pins cover that intentional change. Automatic CI workloads, triggers, matrices, retries and timeouts are unchanged. Reset-copy and three billing-window fixture corrections preserve their existing account, cookie and request assertions.
The renewal-metadata test now compares the production mapper with the same verified native payload, preserving every exact-value assertion. The separate source snapshot checks all nine stable fields exactly against the mapper output; its signature timestamp is logged independently. The existing mapper becomes internal for @testable access; its executable code is unchanged. Billing-grace adds bounded native-status and fixture readback diagnostics; it does not claim a grace repair.
Acceptance Criteria
Definition of Done
Validation
Current head:
23232c123c26111c383d9f89b4f82b25528f7bbe. No manual dispatch has run at this head yet; the preceding diagnostic run is being preserved until its actual completion event.ui_validation_mode=account-menu-comparisonandswiftpm_regressions=true. At8f61f17, result pending; no current-head hosted pass is claimed. Actual completion is registered to this Laptop thread.9b70619. Its Python command passed 58 tests; integration mutations caught missing trace emission, masked exit 65 and ignored trace failure after successful xcodebuild.2f09173: FAILURE. Ordinary iOS passed 1112/1112, zero skips. Native-commerce passed 23/25 and failed billing grace plus exact renewal metadata. Other four quality jobs passed, including 13 metric tile and 20 Claude reset tests. This failed result is retained and not superseded by ordinary-test successes.signedAtdiffered between independently read status payloads despite the same printed second. The corrected oracle uses one verified Status for both expected values and mapper input; separate-read epochs are diagnostic, with no tolerance or changed expected values.f766923: Free state and actor witness within 3.3 ms, publication at 1.66 seconds. Later corrected healthy probes do not explain it. Per-line printing perturbed3b1628a; those timings are not production-latency evidence. Diagnose intermittent watch snapshot transition test timeout #564 remains open and DIAGNOSIS UNQUALIFIED.Risks and remaining gates
Not ready to merge. Current-head hosted qualification is pending; the exact-head R15 review is clean. The grace failure remains diagnostic, not fixed; any current-head red result must be investigated. The accepted #564 diagnostic tranche does not require inventing a watch synchronization repair, and it does not waive red checks.
All 25 native-commerce cases, exact grace/access and renewal-metadata assertions, account/transaction isolation, synthetic product configuration and existing deadlines remain. No skip, retry-for-green, deadline increase, assertion relaxation or production behavior change. No real Mac, live provider/auth/account/reset/purchase, signing, installation, release, TestFlight, ASC or pricing operation. Full Linux cost-suite
sw_verserrors remain a platform limit, not passes.The same Laptop worker retains claim
chief-dispatch-0c08ab71-ios562and every unfinished delivery item. No merge, main sync, cleanup or claim release is claimed.Council: not required for this bounded test/fixture correction and diagnosis.
Closes #562
Refs #564
Refs #565