fix(verify): disclose skipped cross-checks and report URL schemes per platform - #3
Merged
Merged
Conversation
… platform verify silently degraded to local-only checks when it could not fetch the dashboard config (unauthenticated, or a project selected without credentials) and still printed a bare green PASS, so a passing run could coexist with deep linking being unverified. It now emits an explicit skip notice, surfaces it in the default report, and qualifies the result as PARTIAL unless every check ran. Also fixes the iOS/Android URL scheme checks printing the pooled scheme union (iOS + Android combined for Flutter) under each platform header; they now read the per-platform lists, so an iOS-only scheme is no longer reported under Android and vice versa. - add skippedCount/hasSkipped to VerificationReport - emit a skip result whenever the dashboard cross-check does not run, including the project-selected-but-no-credentials case that previously added none - default report: show skipped count, a NOT VERIFIED section, and PARTIAL status - ios/android validators read iosUrlSchemes/androidUrlSchemes, not urlSchemes - tests: guards against cross-platform scheme pooling and a silent green PASS
This was referenced Sep 6, 2026
The PR treated every skipped check as 'NOT VERIFIED', so a fully authenticated, correctly configured project read as PARTIAL whenever an optional probe could not run - no booted simulator, no adb, or a managed Expo project with no native dirs. That is the common CI case, and crying wolf on every run erodes the PARTIAL signal the disclosure fix introduced. Add VerificationResult.blocksFullVerification and mark only the checks that actually verify deep linking and were not performed - the dashboard cross-check, and an aborted project selection. The report now: - lists blocking skips under 'NOT VERIFIED' and optional ones under 'SKIPPED (optional - did not affect the result)'; - downgrades to PARTIAL only when incompleteCount > 0 (report.isPartial), noting optional skips on an otherwise green PASS; - adds summary.incomplete and a top-level partial flag to the JSON. Optional runtime/managed-Expo skips keep the default (non-blocking).
Two accuracy fixes in the dashboard cross-check skip path: - The skip message said 'Not authenticated' whenever effectiveProjectId was null, but that also happens for a signed-in user when no project exists, the selection was cancelled/invalid, or the project fetch failed. Gate the wording on hasCredentials and add a distinct 'signed in, but no project resolved' case with the right remediation. - The dashboard upload set passed = !hasErrors, so a partial run (a check that would actually verify deep linking was skipped) uploaded passed:true while the console said NOT a full verification. Set passed = !hasErrors && !isPartial so it matches the verdict; the separate partial flag still distinguishes the two.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Reported by a developer integrating
flutter_ulink_sdk(domainabrezo.shared.ly) who sawulink verify(v1.3.1) print a green PASS on a project whose deep-link setup had never actually been cross-checked.Two distinct issues, both confirmed against the code:
Silent green PASS. The AASA / assetlinks / dashboard cross-checks were not removed in v1.3.1 — they are gated on a successful authenticated project-config fetch. On an unauthenticated run (or a project selected without credentials) they are skipped, but the default report never counted or displayed skipped checks, so it printed a bare
✓ PASSED. A green run was therefore compatible with deep linking being completely unverified.URL schemes pooled across platforms. For a Flutter project the parser keeps correct per-platform lists but also builds a combined
urlSchemesunion.IosValidatorandAndroidValidatorprinted that union under both platform headers, soverify -vshowed an iOS-only scheme under Android and vice versa. (The actual scheme matching was already per-platform-correct — this was display only.)Changes
VerificationReport: addskippedCount/hasSkipped.verify: emit an explicit skip result whenever the dashboard cross-check does not run — now including the project-selected-but-no-credentials case, which previously produced no notice at all.NOT VERIFIEDsection (what was not checked and why), and a qualifiedPARTIALstatus. A clean✓ PASSEDis now reserved for a run with zero skips. Verbose report and JSON summary made consistent.IosValidator/AndroidValidator: readiosUrlSchemes/androidUrlSchemesinstead of the pooledurlSchemes.Behaviour (bare
ulink verify, unauthenticated, real Flutter project)Not addressed here (follow-ups)
IosParser._extractVariableFromPbxprojstill resolvesPRODUCT_BUNDLE_IDENTIFIERglobally ("first non-Test match in file order"), so in a multi-target project (app + extensions + tests) it can still resolve to an extension's id. Needs a target-scoped resolver; tracked separately.0(incomplete, not failed) to avoid breakingcurl … | ulink verifysmoke tests and unauthenticated CI. A--strictflag to exit non-zero on skips can be a separate change.Testing
dart analyze lib testclean.dart test— 296 pass (4 new guards).