Skip to content

triage bot: how-to lane staleness governance + notifications FAQ (PP-4831)#1309

Merged
mauricecarrier7 merged 4 commits into
developfrom
feat/pp-4831-howto-governance
Jul 22, 2026
Merged

triage bot: how-to lane staleness governance + notifications FAQ (PP-4831)#1309
mauricecarrier7 merged 4 commits into
developfrom
feat/pp-4831-howto-governance

Conversation

@mauricecarrier7

Copy link
Copy Markdown
Contributor

Implements PP-4831. Offshoot of PP-4825.

Why

A how-to answer names UI ("go to Settings → Libraries") and has no fix version to expire against, so it goes stale silently when the app's navigation moves — exactly what happened with the Palace-icon → Settings library-switch reroute in PP-4825. A wrong how-to is worse than a wrong bug card: it's an authoritative-sounding falsehood about the product. This adds the governance to catch that automatically, plus one new FAQ.

What changed

  • KBEntry gains ui_surface (the screen a how-to depends on) + reviewed_at (when the answer was last verified). Nil for known-issue entries.
  • All four how-to entries are now anchored + dated; the switch/add-library answers point at settings-libraries.
  • Staleness lint (HowToGovernanceTests) = a UI-surface change log (surface → last-changed date) + a check that fails any how-to whose reviewed_at predates its surface's change. When the UI moves, you bump that surface's date; any answer not re-verified since then fails until a human re-checks it and bumps reviewed_at. settings-libraries is dated to the reroute day; the answers were re-reviewed the same day, so they pass — and the teeth are proven on the real catalog (rolling a review date back fails with the exact drift message).
  • New FAQ HT-004 notifications (hold-ready + due-soon reminders — enable notifications; from HelpSpot 18103), with a benchmark case.

Product note (FAQ growth)

Several "common questions" the ticket listed — loan period, borrow limit, hold window — have library-specific answers (they vary per library's config), so they're poor canned FAQs; better routed to the library than answered with a hardcoded number. This adds the one clearly-universal entry (notifications); the rest want a product call before authoring.

Verification

TriageBotCore package suite 248/248 green via swift test; drift lint teeth-proven on the real catalog. No classifier/reducer/escalation change (that's PP-4832).

⚠️ Stacked / do not merge yet

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

🧪 Unit Test Results

📊 View Full Interactive Report

❌ 4 TESTS FAILED

7966 tests | 7827 passed | 4 failed | 133 skipped | ⏱️ 16m 43s | 📊 98.3% | 📈 46.0% coverage

Tests by Class — 909 classes, 4 with failures
Class Tests Passed Failed Duration
✅ AccessLintComplianceTests 11 11 0 12ms
✅ AccessibilityAnnouncementCenterTests 20 20 0 1.65s
✅ AccessibilityLabelTests 9 9 0 69ms
✅ AccessibilityPreferencesTests 26 26 0 1.55s
✅ AccessibilityServiceTests 11 11 0 303ms
✅ AccountAuthDocCarryoverTests 5 5 0 290ms
✅ AccountAuthSurfaceHostsTests 7 7 0 58ms
✅ AccountAwareNetworkTests 10 10 0 106ms
✅ AccountDetailCredentialStateTests 7 0 0 52ms
✅ AccountDetailPINVisibilityTests 25 0 0 1.36s
✅ AccountDetailSignOutConfirmationTests 2 0 0 143ms
✅ AccountDetailViewModelGapTests 1 1 0 78ms
✅ AccountDetailViewModelLeakTests 1 1 0 325ms
✅ AccountDetailViewModelSignedInDerivationTests 5 0 0 457ms
✅ AccountDetailViewModelTests 19 0 0 210ms
✅ AccountDetailsAuthenticationIsBrowserBasedTests 10 10 0 210ms
✅ AccountDetailsNeedsAuthAggregateTests 10 10 0 94ms
✅ AccountDetailsURLTests 17 17 0 582ms
✅ AccountModelGapTests 9 9 0 811ms
✅ AccountModelTests 20 20 0 187ms
✅ AccountProfileDocumentTests 3 3 0 9ms
✅ AccountStateMachineTests 10 10 0 145ms
✅ AccountSwitchCleanupTests 8 8 0 536ms
✅ AccountSwitchIntegrationTests 8 8 0 84ms
✅ AccountSwitchLifecycleTests 9 0 0 113ms
✅ AccountsManagerAccountIndexTests 7 7 0 120ms
✅ AccountsManagerCacheReadTests 4 4 0 627ms
✅ AccountsManagerCacheTests 16 16 0 237ms
✅ AccountsManagerCancellationTests 5 5 0 575ms
✅ AccountsManagerFirstRunDecodeTests 3 3 0 343ms
✅ AccountsManagerGapTests 3 3 0 52ms
✅ AccountsManagerHelpersTests 12 12 0 1.03s
✅ AccountsManagerIsolationLintTests 4 4 0 1.62s
✅ AccountsManagerLaunchSnapshotTests 13 13 0 3.91s
✅ AccountsManagerStateMachineWiringTests 16 16 0 3.18s
✅ AccountsManagerTests 51 48 0 9.40s
✅ ActiveSessionsViewModelTests 12 12 0 295ms
✅ AdobeActivationTests 6 6 0 20ms
✅ AdobeCertificateGapTests 7 7 0 600ms
✅ AdobeDRMCharacterizationTests 21 21 0 625ms
✅ AdobeDRMErrorGapTests 3 3 0 815ms
✅ AdobeDRMHandlerTests 12 12 0 105ms
✅ AdobeDRMServiceGapTests 2 2 0 71ms
✅ AlertModelCoverageTests 6 6 0 4ms
✅ AlertModelRetryTests 7 7 0 520ms
✅ AlertModelTests 2 2 0 53ms
✅ AlertPresentationRawGuardLintTests 6 6 0 25ms
✅ AlertUtilsTests 20 20 0 472ms
✅ AnnotationContractTests 3 3 0 5ms
✅ AnnotationDeviceIDTests 2 2 0 6ms
✅ AnnotationPostResponseContractTests 1 1 0 1ms
✅ AnnouncementChainTests 5 5 0 9ms
✅ AnnouncementTests 3 3 0 4ms
✅ AnonymousBorrowBaselineFixtureTests 13 13 0 98ms
✅ AnonymousBorrowCandidateFixtureTests 6 6 0 23ms
✅ AnonymousBorrowDeltaTests 2 2 0 149ms
✅ AppContainerAudiobookFactoryTests 3 3 0 46ms
✅ AppContainerAuthCoordinatorRegistrationTests 3 3 0 35ms
✅ AppContainerImageLoaderInjectionTests 4 4 0 40ms
✅ AppContainerIsolationLintTests 7 7 0 1.39s
✅ AppContainerResetTests 5 5 0 805ms
✅ AppContainerTests 4 4 0 423ms
✅ AppContainerWithSignInModalSheetPresenterTests 2 2 0 3ms
✅ AppHealthViewModelTests 8 8 0 188ms
✅ AppLaunchTrackerExtendedTests 16 16 0 1.44s
✅ AppLaunchTrackerTests 10 10 0 243ms
✅ AppLaunchTrackerWiringTests 2 2 0 180ms
✅ AppRatingServiceOverrideTests 3 3 0 12ms
✅ AppRatingServiceTests 9 9 0 79ms
✅ AppRouteTests 5 5 0 12ms
✅ AppTabHostMiniPlayerIntegrationTests 6 6 0 203ms
✅ AppTabHostViewBadgeCountTests 10 10 0 28ms
✅ AppTabRouterCoverageTests 4 4 0 8ms
✅ AppTabRouterGapTests 3 3 0 68ms
✅ ArrayExtensionsTests 6 6 0 39ms
✅ AudioBookmarkGapTests 6 6 0 64ms
✅ AudioEngineWrapperTests 8 8 0 114ms
✅ AudioInterruptionLogicTests 6 6 0 8ms
✅ AudioSessionActivatorTests 8 8 0 84ms
✅ AudiobookAccessibilityTests 7 7 0 94ms
✅ AudiobookBackgroundAudioTests 2 2 0 33ms
✅ AudiobookBookmarkBusinessLogicConcurrencyTests 3 3 0 73ms
✅ AudiobookBookmarkBusinessLogicPositionWriteTests 6 6 0 100ms
✅ AudiobookBookmarkBusinessLogicTests 21 21 0 4.22s
✅ AudiobookChapterTOCNormalizationTests 6 6 0 295ms
✅ AudiobookColdLoadRecoveryTests 4 4 0 157ms
✅ AudiobookCrossVendorSmokeTests 4 4 0 157ms
✅ AudiobookDataManagerEmptyQueueTests 1 1 0 44ms
✅ AudiobookDataManagerErrorHandlingTests 5 5 0 1.16s
✅ AudiobookDataManagerModelsTests 20 20 0 901ms
✅ AudiobookDataManagerNetworkSyncTests 5 5 0 107ms
✅ AudiobookDataManagerSaveTests 4 4 0 12ms
✅ AudiobookDataManagerStoreRecoveryTests 5 5 0 128ms
✅ AudiobookFileLoggerTests 14 14 0 283ms
✅ AudiobookFirstOpenHangTests 14 14 0 2.69s
✅ AudiobookLoadFailureSAMLReauthTests 10 10 0 538ms
✅ AudiobookLoaderDispatchTests 7 7 0 115ms
✅ AudiobookLoaderFinalizeBuildTests 11 11 0 1.14s
✅ AudiobookLoaderOPDSShapeMatrixTests 8 0 0 107ms
✅ AudiobookLoaderPredicateTests 11 11 0 511ms
✅ AudiobookLoaderTests 2 2 0 69ms
✅ AudiobookMorphingPlayerViewTests 10 10 0 159ms
✅ AudiobookNetworkValidationTests 3 3 0 3ms
✅ AudiobookOpenStateRaceTests 3 3 0 206ms
✅ AudiobookPhoneAlertContentTests 3 3 0 16ms
✅ AudiobookPlaybackStateTests 3 3 0 53ms
✅ AudiobookPlaybackTests 26 26 0 4.96s
✅ AudiobookPlaytimesLifecycleTests 6 6 0 299ms
✅ AudiobookPositionAdapterContractTests 3 3 0 722ms
✅ AudiobookPositionPolicyValidatorTests 14 14 0 608ms
✅ AudiobookPositionRestoreTests 18 18 0 934ms
✅ AudiobookSAMLReauthTests 6 6 0 143ms
✅ AudiobookSessionErrorDescriptionTests 4 4 0 30ms
✅ AudiobookSessionErrorExtTests 4 4 0 3ms
✅ AudiobookSessionErrorTests 3 3 0 5ms
✅ AudiobookSessionManagerErrorMappingTests 6 6 0 6ms
✅ AudiobookSessionManagerFlagGatePresentationTests 4 4 0 193ms
✅ AudiobookSessionManagerPresenterMigrationTests 10 10 0 155ms
✅ AudiobookSessionManagerShutdownTests 12 12 0 1.55s
✅ AudiobookSessionPresenterTests 31 31 0 311ms
✅ AudiobookSessionStateTests 6 6 0 68ms
✅ AudiobookSessionStateTransitionTests 22 22 0 227ms
✅ AudiobookSkipIntervalSettingsTests 7 7 0 34ms
✅ AudiobookSleepTimerIntegrationTests 5 5 0 177ms
✅ AudiobookStorageLocationTests 3 3 0 40ms
✅ AudiobookTOCTests 18 18 0 129ms
✅ AudiobookTimeEntryTests 6 6 0 64ms
✅ AudiobookTimeTrackerEdgeTests 8 8 0 238ms
✅ AudiobookTimeTrackerLifecycleTests 5 5 0 1.10s
✅ AudiobookTimeTrackerTests 9 9 0 494ms
✅ AudiobookTrackCompletionTests 2 2 0 487ms
✅ AudiobookTypeRoutingTests 5 5 0 73ms
✅ AudiobookVendorAdapterTests 5 5 0 20ms
✅ AudiobookmarkTests 4 4 0 30ms
✅ AuthCoordinatorTelemetryTests 5 5 0 188ms
✅ AuthDecisionEventEmissionTests 7 7 0 20ms
✅ AuthDocumentContractTests 2 2 0 8ms
✅ AuthDocumentVariantsContractTests 5 5 0 40ms
✅ AuthErrorCategoryTests 12 12 0 48ms
✅ AuthErrorProblemDocSeamTests 6 6 0 323ms
✅ AuthFlowSecurityTests 3 0 0 40ms
✅ AuthReducerTests 21 21 0 394ms
✅ AuthTypeTests 7 7 0 209ms
✅ AuthenticationTests 16 16 0 145ms
✅ BackgroundDownloadHandlerTests 28 28 0 145ms
✅ BackgroundListenerTests 2 2 0 10ms
✅ BackgroundSessionRoutingTests 6 6 0 56ms
✅ BackupExclusionMigrationTests 3 3 0 54ms
✅ BadgeDefinitionTests 33 33 0 311ms
✅ BadgeServiceTests 16 16 0 305ms
✅ BadgeUnlockPhaseTests 4 4 0 6ms
✅ BadgesViewModelTests 14 14 0 96ms
✅ BasicAuthEmptyCredentialTests 4 4 0 342ms
✅ BearerTokenAdapterTests 5 4 0 42ms
✅ BearerTokenFulfillFlowTests 4 4 0 83ms
✅ BearerTokenRefreshTests 4 4 0 4ms
✅ BearerTokenResponseDetectionTests 7 7 0 185ms
✅ BeginningPositionPolicyTests 8 8 0 911ms
✅ BookAvailabilityFormatterTests 18 18 0 270ms
✅ BookButtonMapperHoldReadyTests 10 10 0 55ms
✅ BookButtonMapperTests 21 21 0 431ms
✅ BookButtonMapperViewModelTests 18 18 0 57ms
✅ BookButtonStateTests 8 8 0 136ms
✅ BookButtonTypeMetaTests 4 4 0 11ms
✅ BookButtonTypeTests 13 13 0 78ms
✅ BookCellModelActionTests 18 18 0 800ms
✅ BookCellModelCacheInvalidationTests 9 9 0 2.14s
✅ BookCellModelCachePrefetchSafetyTests 9 9 0 215ms
✅ BookCellModelCacheTests 22 22 0 3.50s
✅ BookCellModelComputedPropertyTests 19 19 0 114ms
✅ BookCellModelOfflineTests 9 9 0 172ms
✅ BookCellModelRegistryBindingTests 4 4 0 135ms
✅ BookCellModelStateTests 16 16 0 232ms
✅ BookCellModelStreamingHTMLTests 2 2 0 363ms
✅ BookCellStateComprehensiveTests 14 14 0 2.00s
✅ BookContentResetServiceTests 2 2 0 7ms
✅ BookDetailMetadataHydrationTests 6 6 0 67ms
✅ BookDetailViewModelAudiobookDismissTests 1 1 0 26ms
✅ BookDetailViewModelTests 91 91 0 2.44s
✅ BookFileManagerSideloadResolutionTests 4 4 0 907ms
✅ BookFileManagerTests 8 8 0 133ms
✅ BookListViewAccessibilityTests 9 9 0 400ms
✅ BookPreviewTests 4 4 0 27ms
✅ BookRegistryStoreTests 26 26 0 747ms
✅ BookRegistrySyncReadinessTests 3 2 0 653ms
✅ BookRegistrySyncReentrancyTests 6 6 0 177ms
✅ BookRegistrySyncSideloadExemptionTests 2 0 0 163ms
✅ BookRegistrySyncTests 35 30 0 903ms
✅ BookReturnCleverReauthTests 1 1 0 192ms
❌ BookReturnServiceAuthCoordinatorTests 5 4 1 5.48s
✅ BookReturnServiceContractTests 9 9 0 1.82s
✅ BookReturnServiceTests 16 16 0 720ms
✅ BookServiceAudiobookOpenTests 2 2 0 531ms
✅ BookSignInRedirectHandlerTests 8 8 0 331ms
✅ BookStateIntegrationTests 8 8 0 387ms
✅ BookmarkBusinessLogicExtendedTests 6 6 0 629ms
✅ BookmarkDeletionLogTests 3 3 0 248ms
✅ BookmarkDeviceIdMatchingTests 3 3 0 1.22s
✅ BookmarkExistenceTests 4 4 0 37.74s
✅ BookmarkManagerTests 24 24 0 1.13s
✅ BookmarkSortingTests 1 1 0 49ms
✅ BookmarkSyncTests 3 3 0 278ms
✅ BorrowAndDownloadIntegrationTests 7 7 0 2.03s
✅ BorrowErrorMessageTests 13 13 0 184ms
✅ BorrowErrorPresenterTests 6 6 0 91ms
✅ BorrowOperationAuthCoordinatorTests 6 6 0 220ms
✅ BorrowOperationCleverReauthTests 2 2 0 401ms
✅ BorrowOperationContractTests 8 8 0 718ms
✅ BorrowOperationStreamingHTMLTests 3 3 0 50ms
✅ BorrowOperationTests 13 13 0 588ms
✅ BorrowOperationTimeoutTests 3 3 0 204ms
✅ BorrowReducerContractTests 2 2 0 17ms
✅ BorrowReducerCoreContractTests 12 12 0 120ms
✅ BorrowReducerTests 21 21 0 1.49s
✅ BundledRegistrySnapshotTests 5 5 0 131ms
✅ ButtonStateMonotonicClampTests 10 10 0 2.42s
✅ ButtonStateTests 16 16 0 147ms
✅ ButtonStyleTypeTests 2 2 0 174ms
✅ C64ConversionTests 6 6 0 6ms
✅ CarPlayAudiobookBridgePresenterMigrationTests 2 2 0 27ms
✅ CarPlayAuthHelperReadinessTests 3 3 0 251ms
✅ CarPlayChapterListTests 3 3 0 11ms
✅ CarPlayIntegrationTests 2 2 0 25ms
✅ CarPlayLibraryRefreshTests 3 3 0 10ms
✅ CarPlayNowPlayingTemplateTests 4 4 0 520ms
✅ CarPlayOpenAppAlertTests 6 6 0 128ms
✅ CarPlayPlaybackErrorTests 8 8 0 925ms
✅ CarPlayTests 12 12 0 69ms
✅ CarPlayTimeTrackingTests 3 3 0 110ms
✅ CatalogAPIDedupeTests 3 3 0 433ms
✅ CatalogAPIEntryPointTests 1 1 0 1ms
✅ CatalogAccessibilityTests 8 8 0 36ms
❌ CatalogCacheKeyAndIsolationTests 12 11 1 2m 1s
✅ CatalogCacheMetadataExactBoundaryTests 4 4 0 206ms
✅ CatalogCacheMetadataTests 21 21 0 33ms
✅ CatalogFeedModelTests 4 4 0 96ms
✅ CatalogFilterGroupModelTests 17 17 0 301ms
✅ CatalogFilterModelTests 17 17 0 276ms
✅ CatalogFilterServiceTests 29 29 0 180ms
✅ CatalogFilterTests 1 1 0 <1ms
✅ CatalogLaneAssemblyTests 7 7 0 562ms
✅ CatalogLaneModelStructTests 20 20 0 453ms
✅ CatalogLaneModelTests 3 3 0 8ms
✅ CatalogLaneMoreFilterStateTests 8 8 0 420ms
✅ CatalogLaneMoreViewModelTests 43 43 0 452ms
✅ CatalogLaneRowViewAccessibilityTests 11 11 0 68ms
✅ CatalogLaneSortingTests 5 5 0 67ms
✅ CatalogLoadIntegrationTests 6 6 0 42ms
✅ CatalogOPDS2NegotiationTests 12 12 0 152ms
✅ CatalogPreloaderTests 6 6 0 126ms
✅ CatalogProblemDocumentTests 6 6 0 74ms
✅ CatalogRepositoryCoreTests 9 9 0 156ms
✅ CatalogRepositoryStaleWhileRevalidateTests 12 12 0 437ms
✅ CatalogRepositoryTests 19 19 0 315ms
✅ CatalogSearchViewModelRegistryUpdateTests 5 5 0 87ms
✅ CatalogSearchViewModelTests 67 67 0 5.16s
✅ CatalogSelectorsTests 2 2 0 5ms
✅ CatalogSortServiceTests 14 14 0 103ms
✅ CatalogStateTests 7 7 0 71ms
✅ CatalogViewContinueRowsIntegrationTests 3 3 0 29ms
✅ CatalogViewModelStateMachineTests 19 19 0 1.43s
✅ ChaosFaultInjectionTests 5 5 0 42ms
✅ ChapterChangeDetectorTests 5 5 0 23ms
✅ ChapterTOCNormalizerTests 7 7 0 123ms
✅ CirculationAnalyticsTests 4 4 0 348ms
✅ ColdStartResumeIntegrationTests 10 10 0 1.06s
✅ ColorExtensionTests 5 5 0 142ms
✅ ConcurrentBookStateTests 3 3 0 87ms
✅ ConcurrentDownloadStateTests 3 3 0 53ms
✅ ConcurrentTokenRefreshTests 2 2 0 78ms
✅ ContinueRowSectionTests 6 6 0 2.10s
✅ ContinuousPlaybackTrackingTests 3 3 0 1.63s
✅ CookiePersistenceTests 10 10 0 1.04s
✅ CrawlStateTests 16 16 0 284ms
✅ CrawlableFeedAnalysisTests 17 17 0 1.54s
✅ CrawlerFallbackTests 12 12 0 73ms
✅ CredentialEdgeCaseTests 6 6 0 584ms
✅ CredentialPrivacyTests 4 4 0 6ms
✅ CredentialPromptCoordinatorTests 4 4 0 94ms
✅ CredentialSnapshotInvalidationTests 5 0 0 132ms
✅ CrossDeviceBookmarkSyncTests 12 12 0 239ms
✅ CrossDeviceSyncE2ETests 5 5 0 1.28s
✅ CrossDomain401Tests 8 8 0 11ms
✅ CrossFormatMappingTests 14 14 0 121ms
✅ DPLAErrorTests 3 3 0 23ms
✅ DRMAdversarialTests 4 1 0 103ms
✅ DRMFulfilledPublicationTests 6 6 0 23ms
✅ DataBase64Tests 3 3 0 34ms
✅ DataReceptionComparisonTests 2 2 0 61ms
✅ DateExtensionTests 9 9 0 54ms
✅ DateFormattingTests 4 4 0 63ms
✅ Date_NYPLAdditionsTests 7 7 0 810ms
✅ DebugSettingsForceSkeletonsTests 4 4 0 12ms
✅ DebugSettingsGapTests 4 4 0 520ms
✅ DebugSettingsTests 31 31 0 740ms
✅ DefaultCatalogAPITests 31 31 0 839ms
✅ DefaultRecentlyReadingServiceTests 13 13 0 29ms
✅ DeriveInitialStateTests 4 4 0 79ms
✅ DeveloperSettingsEngineeringTierTests 4 4 0 7ms
✅ DeveloperSettingsViewModelOverrideTests 3 0 0 388ms
✅ DeviceLogCollectorGapTests 2 2 0 7ms
✅ DeviceLogCollectorTests 13 13 0 172ms
✅ DeviceOrientationTests 7 7 0 48ms
✅ DeviceSpecificErrorMonitorTests 11 11 0 38ms
✅ DictionaryExtensionsTests 5 5 0 5ms
✅ DiskBudgetManagerTests 7 7 0 19ms
✅ DiskBudgetTests 2 2 0 41ms
✅ DownloadAlertPresenterTests 8 8 0 147ms
✅ DownloadAnnouncementServiceTests 12 12 0 43ms
✅ DownloadAuthRetryHandlerAuthCoordinatorTests 6 6 0 2.63s
✅ DownloadAuthRetryHandlerTaskLifecycleTests 4 4 0 430ms
✅ DownloadAuthRetryHandlerTests 17 17 0 2.26s
✅ DownloadCancellationHandlerTests 5 5 0 155ms
✅ DownloadCompleteMomentTests 6 6 0 514ms
✅ DownloadCompletionParserTests 9 9 0 168ms
✅ DownloadCoordinatorIntegrationTests 10 10 0 223ms
✅ DownloadCoordinatorTests 11 11 0 663ms
✅ DownloadDiskSpaceTests 2 2 0 2ms
✅ DownloadErrorInfoTests 3 3 0 24ms
✅ DownloadErrorRecoveryPolicyTests 11 11 0 1.44s
✅ DownloadErrorRecoveryTests 3 3 0 25ms
✅ DownloadFreeSpaceExhaustionTests 11 11 0 459ms
✅ DownloadInfoTests 5 5 0 13ms
✅ DownloadIntegrityTests 10 10 0 306ms
✅ DownloadOnlyOnWiFiTests 10 10 0 592ms
✅ DownloadPersistenceStoreTests 5 5 0 104ms
✅ DownloadProgressPublisherCoreTests 19 19 0 1.04s
✅ DownloadProgressPublisherTests 2 2 0 70ms
✅ DownloadQueueIntegrationTests 3 3 0 54ms
✅ DownloadQueueOrchestratorTests 9 9 0 391ms
✅ DownloadRMSDKHandoffTests 1 1 0 2ms
✅ DownloadReconciliationLaunchOrderContractTests 2 2 0 214ms
✅ DownloadReconciliationTests 17 17 0 357ms
✅ DownloadRedirectTests 7 7 0 196ms
✅ DownloadResumeAfterKillTests 7 7 0 1.19s
✅ DownloadSlotManagementTests 5 5 0 54ms
✅ DownloadStartCoordinatorContractTests 5 5 0 616ms
✅ DownloadStartCoordinatorTests 9 9 0 188ms
✅ DownloadStartDispatcherContractTests 12 12 0 71ms
✅ DownloadStartDispatcherTests 26 26 0 360ms
✅ DownloadStartReducerContractTests 24 24 0 1.68s
✅ DownloadStateMachineIntegrationTests 15 15 0 654ms
✅ DownloadStateMachineTests 5 5 0 101ms
✅ DownloadStateManagerTests 16 16 0 403ms
✅ DownloadTaskLifecycleServiceTests 9 9 0 112ms
✅ DownloadTaskPersistenceTests 14 14 0 174ms
✅ DownloadThrottlingServiceTests 10 10 0 122ms
✅ DownloadTransferRetryTests 6 6 0 2.93s
✅ DownloadWatchdogTests 3 3 0 72ms
✅ EPUBKeyCommandsPP4289Tests 4 4 0 16ms
✅ EPUBModuleTests 4 4 0 27ms
✅ EPUBPositionTests 10 10 0 60ms
✅ EPUBSearchViewModelTests 18 18 0 212ms
✅ EPUBToolbarToggleTests 11 11 0 416ms
✅ EffectBoundaryTests 6 6 0 20ms
✅ EmailAddressTests 16 16 0 88ms
✅ EpubSampleFactoryTests 5 5 0 52ms
✅ ErrorActivityTrackerTests 12 12 0 217ms
✅ ErrorDetailTests 12 12 0 1.17s
✅ ErrorDetailViewControllerGapTests 3 3 0 57ms
✅ ErrorDetailViewControllerTests 14 14 0 156ms
✅ ErrorLogExporterTests 5 5 0 133ms
✅ ExecutorNetworkHermeticityTests 1 1 0 23ms
✅ ExpiredLoanStringsTests 5 5 0 39ms
✅ FacetEnumTests 3 3 0 6ms
✅ FacetToolbarAccessibilityTests 5 5 0 13ms
✅ FacetViewModelLogoDelegateTests 4 4 0 191ms
✅ FacetViewModelTests 18 18 0 7.15s
✅ FetchManifestWithBearerTokenLCPSafetyTests 1 1 0 6ms
✅ FetchManifestWithBearerTokenTests 9 9 0 69ms
✅ FetchOpenAccessManifestLCPSafetyTests 4 4 0 6ms
✅ FileURLGenerationTests 3 3 0 123ms
✅ FindawayChapterStatusGuardTests 1 1 0 3ms
✅ FindawaySavedVsPlayedTests 1 1 0 47ms
✅ FloatTPPAdditionsTests 5 5 0 523ms
✅ FocusIndicationTests 7 7 0 10ms
✅ FontManagerTests 17 17 0 203ms
✅ ForceResetTests 6 6 0 70ms
✅ GeneralCacheClearOnUpdateTests 3 3 0 10ms
✅ GeneralCacheTests 20 20 0 379ms
✅ GroupEnumTests 1 1 0 4ms
✅ HTMLTextViewTests 70 70 0 14.86s
✅ HoldNotificationClassificationTests 2 2 0 9ms
✅ HoldsBadgeCountTests 9 9 0 728ms
✅ HoldsBookViewModelTests 8 8 0 383ms
✅ HoldsReducerTests 11 11 0 49ms
✅ HoldsSyncFailureTests 12 12 0 235ms
✅ HoldsViewModelTests 23 23 0 3.75s
✅ HostFailureTrackerTests 2 2 0 9ms
✅ ImageCacheContinuationTests 1 1 0 81ms
✅ ImageCacheTypeTests 1 1 0 6ms
✅ ImageCoverKeyUnificationTests 2 2 0 32ms
✅ ImageLoaderTests 14 14 0 233ms
✅ InflightFeedFetchesTimeoutTests 4 4 0 10.51s
✅ IntExtensionsTests 4 4 0 95ms
✅ IsReaderActiveTrackingModifierTests 4 4 0 56ms
✅ KeyboardNavigationFKATests 11 11 0 119ms
✅ KeyboardNavigationHandlerTests 16 16 0 409ms
✅ KeyboardVoiceOverTests 5 5 0 66ms
✅ LCPAcquisitionPredicateTests 4 4 0 18ms
✅ LCPAdapterTests 8 8 0 72ms
✅ LCPAudiobookURLSchemeTests 4 4 0 6ms
✅ LCPAudiobooksTests 21 21 0 213ms
✅ LCPBotanCRLGuardTests 5 5 0 7ms
✅ LCPCharacterizationTests 31 31 0 434ms
✅ LCPClientTests 8 8 0 455ms
✅ LCPFulfillmentHandlerTests 8 8 0 18.17s
✅ LCPKeychainMigrationTests 3 3 0 774ms
✅ LCPLibraryServiceTests 20 20 0 265ms
✅ LCPLicenseDocumentDetectionTests 5 5 0 13ms
✅ LCPLicenseFilePathTests 3 3 0 39ms
✅ LCPOrphanedDownloadRegistryTests 4 4 0 643ms
✅ LCPPDFAcquisitionPredicateTests 5 5 0 616ms
✅ LCPPDFDiskExtractTests 5 5 0 74ms
✅ LCPPDFOpenProgressTests 13 13 0 296ms
✅ LCPPassphraseReadinessTests 2 2 0 12ms
✅ LCPSessionIdentifierTests 3 3 0 10ms
✅ LegacySAMLProblemDocumentPropagationTests 7 7 0 751ms
✅ LibrariesSectionViewModelTests 16 16 0 66ms
✅ LibraryCatalogMergerTests 9 9 0 51ms
✅ LibraryRegistryCrawlerTests 15 15 0 1.38s
✅ LicensesServiceTests 4 4 0 19ms
✅ LiveCrawlableParsingTest 4 0 0 55ms
✅ LoanEvictionPolicyTests 13 13 0 2.70s
✅ LoanRenewalServiceTests 9 9 0 141ms
✅ LocalBookContentServiceTests 7 7 0 288ms
✅ LocalFileAdapterTests 6 5 0 865ms
✅ LogTests 13 13 0 1.02s
✅ LoginKeyboardTests 8 8 0 34ms
✅ MainActorHelpersTests 22 22 0 690ms
✅ MappedCatalogBridgeTests 3 3 0 8ms
✅ MappedCatalogModelTests 11 11 0 412ms
✅ MockBackendExpiredCredentialsTests 3 3 0 51ms
✅ MockBackendHoldsTests 3 3 0 82ms
✅ MockBackendIntegrationTests 4 4 0 511ms
✅ MockBackendLoanLimitTests 2 2 0 116ms
✅ MockBackendRouteMatchingTests 4 4 0 344ms
✅ MockBackendServerDownTests 1 1 0 17ms
✅ MockIsolationLintTests 5 5 0 1.87s
✅ MultiLibraryTokenIsolationTests 14 14 0 9.05s
✅ MyBooksDownloadCenterAccountIdThreadingTests 7 7 0 397ms
✅ MyBooksDownloadCenterAdeptGapTests 3 3 0 8ms
✅ MyBooksDownloadCenterConcurrencyTests 22 22 0 888ms
✅ MyBooksDownloadCenterEvictionTests 7 7 0 178ms
✅ MyBooksDownloadCenterOfflineTests 8 8 0 126ms
✅ MyBooksDownloadSessionInvalidationTests 3 3 0 9ms
✅ MyBooksSimplifiedBearerTokenTests 17 17 0 887ms
✅ MyBooksViewModelBooksPublisherTests 3 3 0 69ms
✅ MyBooksViewModelConcurrencyTests 4 4 0 295ms
✅ MyBooksViewModelDownloadStateTests 3 3 0 17ms
✅ MyBooksViewModelEmptyArrayTests 3 3 0 25ms
✅ MyBooksViewModelEmptyStateTests 4 4 0 44ms
✅ MyBooksViewModelExtendedTests 15 15 0 122ms
✅ MyBooksViewModelFacetIntegrationTests 4 4 0 7ms
✅ MyBooksViewModelFacetPublisherTests 5 5 0 20ms
✅ MyBooksViewModelFilterSortInteractionTests 2 2 0 8ms
✅ MyBooksViewModelFilterTests 9 9 0 532ms
✅ MyBooksViewModelGuardConditionsTests 2 2 0 108ms
✅ MyBooksViewModelLargeDatasetTests 2 2 0 391ms
✅ MyBooksViewModelLoadAccountTests 2 2 0 73ms
✅ MyBooksViewModelLoginStateTests 4 4 0 351ms
✅ MyBooksViewModelMultipleAuthorSortingTests 3 3 0 25ms
✅ MyBooksViewModelNotificationTests 4 4 0 328ms
✅ MyBooksViewModelOfflineFilteringTests 3 3 0 129ms
✅ MyBooksViewModelPublisherTests 7 7 0 82ms
✅ MyBooksViewModelSearchEdgeCaseTests 6 6 0 207ms
✅ MyBooksViewModelSearchQueryTests 3 3 0 253ms
✅ MyBooksViewModelSortPersistenceTests 3 3 0 40ms
✅ MyBooksViewModelSortingIntegrationTests 5 5 0 274ms
✅ MyBooksViewModelSortingTests 6 6 0 119ms
✅ MyBooksViewModelStateTransitionTests 3 3 0 320ms
✅ MyBooksViewModelUIBindingTests 3 3 0 89ms
✅ NSErrorAdditionsTests 7 7 0 17ms
✅ NSNotificationTPPTests 3 3 0 9ms
✅ NavigationCoordinatorTests 18 18 0 61ms
✅ NavigationFreezePreventionTests 5 5 0 36ms
✅ NetworkCacheClearRoutingTests 3 3 0 109ms
✅ NetworkExecutorCredentialGuardTests 8 8 0 144ms
✅ NetworkExecutorResponseRegressionTests 4 4 0 57ms
✅ NetworkExecutorTaskTypeTests 3 3 0 176ms
✅ NetworkOfflineDetectionTests 3 3 0 6ms
✅ NetworkQueueTests 11 11 0 210ms
✅ NetworkRequestQueueTests 2 2 0 10.20s
✅ NetworkRetryLogicTests 7 7 0 125ms
✅ NetworkTimeoutTests 2 2 0 3ms
✅ NotificationEventTypeContractTests 7 7 0 270ms
✅ NotificationPayloadContractTests 10 10 0 22ms
✅ NotificationServiceStateMachineTests 9 9 0 1.14s
✅ NotificationServiceTests 16 16 0 242ms
✅ NotificationServiceTokenTests 13 13 0 37ms
✅ NotificationSyncThrottleTests 5 5 0 66ms
✅ NotificationTokenDataTests 4 4 0 1.39s
✅ NotificationTokenRegistrationTests 10 10 0 21ms
✅ NowPlayingCoordinatorBackgroundTests 6 6 0 1.49s
✅ NowPlayingCoordinatorTests 19 19 0 694ms
✅ OAuthSAMLRedirectRegressionTests 4 4 0 2.55s
✅ OIDCAuthDocumentParsingTests 4 4 0 226ms
✅ OIDCAuthTypeTests 5 5 0 15ms
✅ OIDCAuthenticationPropertyTests 8 8 0 270ms
✅ OIDCCallbackEdgeCaseTests 9 9 0 1.99s
✅ OIDCCallbackHandlingTests 5 5 0 273ms
✅ OIDCCallbackSchemeTests 3 3 0 184ms
✅ OIDCIsolationRegressionTests 6 6 0 328ms
✅ OIDCLoginRoutingTests 3 3 0 1.05s
✅ OIDCMakeRequestTests 3 3 0 461ms
✅ OIDCNSCodingTests 1 1 0 42ms
✅ OIDCNetworkLayer401Tests 5 5 0 152ms
✅ OIDCReauthOnExpiredTokenTests 5 5 0 128ms
✅ OIDCRedirectURIConstructionTests 6 6 0 873ms
✅ OIDCRegressionTests 9 9 0 493ms
✅ OIDCSelectedAuthenticationTests 2 2 0 85ms
✅ OIDCSignOutRegressionTests 6 6 0 1.94s
✅ OIDCTokenRefreshRegressionTests 6 6 0 290ms
✅ OIDCUpdateUserAccountTests 5 5 0 177ms
✅ OIDCViewModelRegressionTests 1 1 0 57ms
✅ OIDCViewModelSignInTests 2 2 0 46ms
✅ OPDS1BorrowEntryContractTests 4 4 0 10ms
✅ OPDS1CatalogGroupedContractTests 3 3 0 20ms
✅ OPDS1HoldEntriesContractTests 4 4 0 28ms
✅ OPDS1LoansFeedContractTests 6 6 0 36ms
✅ OPDS1ParsingTests 34 34 0 5.45s
✅ OPDS1RevokeResponseContractTests 2 2 0 9ms
✅ OPDS2AuthenticationDocumentTests 18 18 0 152ms
✅ OPDS2AvailabilityTests 4 4 0 256ms
✅ OPDS2BookBridgeTests 44 44 0 591ms
✅ OPDS2BorrowResponseContractTests 3 3 0 5ms
✅ OPDS2CatalogWiringTests 21 21 0 1.69s
✅ OPDS2CatalogsFeedTests 3 3 0 681ms
✅ OPDS2ContributorTests 2 2 0 96ms
✅ OPDS2EmptyFeedContractTests 1 1 0 5ms
✅ OPDS2FeedContractTests 4 4 0 614ms
✅ OPDS2FeedParsingTests 11 11 0 227ms
✅ OPDS2FeedTests 14 14 0 45ms
✅ OPDS2FullMetadataTests 4 4 0 47ms
✅ OPDS2FullPublicationTests 13 13 0 52ms
✅ OPDS2IntegrationTests 18 18 0 439ms
✅ OPDS2LinkArrayTests 5 5 0 47ms
✅ OPDS2LinkComputedPropertyTests 20 20 0 354ms
✅ OPDS2LinkRelTests 1 1 0 <1ms
✅ OPDS2LinkTests 2 2 0 86ms
✅ OPDS2ParsingTests 38 38 0 486ms
✅ OPDS2PublicationExtendedTests 53 53 0 341ms
✅ OPDS2PublicationImageTests 6 6 0 18ms
✅ OPDS2PublicationNarratorTests 3 3 0 79ms
✅ OPDS2PublicationTests 2 2 0 56ms
✅ OPDS2SamlIDPTests 6 6 0 237ms
✅ OPDS2SearchResultsContractTests 3 3 0 16ms
✅ OPDS2SubjectTests 2 2 0 30ms
✅ OPDS2SupportingTypesTests 5 5 0 99ms
✅ OPDSAcquisitionPathExpandedTests 15 15 0 158ms
✅ OPDSFeedCacheTests 14 14 0 646ms
✅ OPDSFeedMigrationTests 11 11 0 143ms
✅ OPDSFeedParsingTests 2 2 0 65ms
✅ OPDSFeedServiceStateMachineTests 3 3 0 180ms
✅ OPDSFeedServiceTests 2 2 0 71ms
✅ OPDSFormatTests 13 13 0 92ms
✅ OPDSParserCoreTests 4 4 0 34ms
✅ OPDSParserTests 4 4 0 8ms
✅ OPDSParsingTests 57 57 0 1.98s
✅ OfflineActionTests 29 29 0 1.39s
✅ OfflineQueueCoordinatorTests 11 11 0 1.64s
✅ OfflineQueueServiceExtendedTests 13 13 0 5.37s
✅ OfflineQueueServiceTests 17 17 0 6.91s
✅ OpenAccessAdapterTests 13 13 0 455ms
✅ OverdriveDeferredFulfillmentTests 6 6 0 8ms
✅ OverdriveDownloadHandlerTests 9 9 0 145ms
✅ OverdriveFulfillmentTests 25 24 0 1.37s
✅ PDFExtensionsTests 20 20 0 1.42s
✅ PDFKitThumbnailProviderTests 5 5 0 28ms
✅ PDFReaderTests 12 12 0 119ms
✅ PDFSearchEmptyStateTests 4 4 0 7ms
✅ PP3596RegressionTests 3 3 0 640ms
❌ Palace 2 1 1 <1ms
✅ PalaceCheckPropertyTests 8 8 0 116ms
✅ PalaceErrorCategoryTests 20 20 0 1.41s
✅ PalaceErrorExtendedTests 23 23 0 305ms
✅ PalaceErrorTests 11 11 0 2.25s
✅ PalaceHapticTests 4 4 0 8ms
✅ PalaceMotionTests 11 11 0 110ms
✅ PalacePDFViewTests 12 12 0 288ms
✅ PalacePressableButtonStyleTests 6 6 0 47ms
✅ PalaceTestSetupObservationTests 4 4 0 15.12s
✅ PalaceWiringTestCaseTests 4 4 0 27ms
✅ ParserFuzzTests 4 4 0 20.20s
✅ PatronProfileContractTests 4 4 0 17ms
✅ PerformanceMonitorTests 14 14 0 233ms
✅ PerformanceReportTests 14 14 0 704ms
✅ PersistentLoggerTests 9 9 0 954ms
✅ PlaybackBootstrapperAudioSessionTests 2 2 0 40ms
✅ PlaybackBootstrapperTests 8 8 0 227ms
✅ PlaybackFailureRecordTests 5 5 0 10ms
✅ PlaybackOpenPolicyTests 7 7 0 191ms
✅ PlaybackRateTests 18 18 0 37ms
✅ PlaybackTrackingRegressionTests 5 5 0 687ms
✅ PoolResponsivenessProbeTests 5 4 0 11.64s
✅ PositionPersistenceLogicTests 6 6 0 202ms
✅ PositionPersistenceTests 2 2 0 69ms
✅ PositionSyncServiceTests 13 13 0 1.28s
✅ PositionSyncTests 5 5 0 155ms
✅ PositionWriterContractTests 6 6 0 82ms
✅ PostUpdateMigrationTests 5 5 0 50ms
✅ ProblemDocumentContractTests 4 4 0 61ms
✅ ProblemDocumentLoanExpiryTests 5 5 0 92ms
✅ ProblemDocumentTests 12 12 0 87ms
✅ ProblemReportEmailTests 8 8 0 5.64s
✅ RatingCardMotionGateTests 5 5 0 50ms
✅ RatingEligibilityPolicyTests 17 17 0 807ms
✅ RatingEngagementTrackerTests 9 9 0 286ms
✅ RatingFeedbackPresenterTests 3 3 0 3ms
✅ RatingPromptPresenterTests 15 15 0 305ms
✅ ReachabilityTests 10 10 0 109ms
✅ Reader2BookmarkContractTests 3 3 0 1.43s
✅ Reader2PositionAdapterContractTests 4 3 0 397ms
✅ Reader2PositionResumeContractTests 3 3 0 144ms
✅ ReaderAccessibilityTests 7 7 0 5ms
✅ ReaderChromeToggleFadeTests 3 3 0 16ms
✅ ReaderEditingActionsTests 5 5 0 9ms
✅ ReaderErrorTests 5 5 0 8ms
✅ ReaderNavBarVoiceOverTests 2 2 0 6ms
✅ ReaderServicePDFRouteTests 3 3 0 4ms
✅ ReaderServiceSyncTests 3 3 0 69ms
✅ ReaderThemeTests 24 24 0 575ms
✅ ReadingPositionTests 22 22 0 1.34s
✅ ReadingSessionTrackerTests 13 13 0 235ms
✅ ReadingStatsServiceTests 12 12 0 364ms
✅ ReadingStatsStoreTests 9 9 0 56ms
✅ RedirectHandlingIntegrationTests 4 4 0 69ms
✅ RedirectPolicyTests 9 9 0 88ms
✅ RegistryFileRecoveryTests 21 21 0 92ms
✅ RemoteFeatureFlagsGapTests 4 4 0 28ms
✅ RemoteFeatureFlagsSideLoadingTests 5 5 0 62ms
✅ RemoteFeatureFlagsTests 21 21 0 892ms
✅ ResourcePropertiesLengthTests 3 3 0 11ms
✅ RetryClassificationTests 17 17 0 108ms
✅ ReturnFlowTests 1 1 0 2ms
✅ ReturnReducerContractTests 16 16 0 102ms
✅ RightsManagementDetectionTests 5 5 0 105ms
✅ RightsManagementDispatcherTests 10 10 0 646ms
✅ RuntimeQuiescenceGateTests 11 10 0 1.11s
✅ RuntimeQuiescenceLintTests 5 5 0 832ms
✅ SAMLCookieSyncTests 5 5 0 97ms
✅ SAMLLogoutCallbackDetectionTests 4 4 0 48ms
✅ SAMLLogoutLinkParsingTests 5 5 0 90ms
✅ SAMLLogoutURLTests 4 4 0 449ms
✅ SAMLPlusBiblioBoardExpirationTests 8 8 0 1.22s
✅ SEMigrationsTests 6 6 0 78ms
✅ SafeDictionaryTests 21 21 0 1.19s
✅ SamplePlayerErrorTests 5 5 0 13ms
✅ SampleTypeTests 8 8 0 23ms
✅ SceneDelegateTests 1 1 0 1ms
✅ ScopedResetTests 9 9 0 78ms
✅ SearchAccessibilityTests 11 11 0 27ms
✅ SearchFlowIntegrationTests 8 8 0 520ms
✅ SettingsViewModelComputedPropertyTests 6 6 0 292ms
✅ SettingsViewModelEdgeCaseTests 7 7 0 143ms
✅ SettingsViewModelGapTests 1 1 0 2ms
✅ SettingsViewModelSyncTests 14 14 0 258ms
✅ SettingsViewModelTests 33 33 0 1.85s
✅ SideloadBoundaryTests 6 6 0 130ms
✅ SideloadImportContractTests 1 1 0 104ms
✅ SideloadedBookManagerTests 17 17 0 4.99s
✅ SideloadedBookRegistryTests 14 14 0 205ms
✅ SideloadedLaneBridgeTests 6 6 0 670ms
✅ SideloadedLaneViewModelTests 7 7 0 181ms
✅ SignInFormPresentationTests 3 3 0 6ms
✅ SignInModalLifecycleTests 9 9 0 766ms
✅ SignInModalPredicateTests 3 3 0 5ms
✅ SignInModalSAMLOIDCTests 6 6 0 25ms
✅ SignInOAuthErrorPropagationTests 8 8 0 865ms
✅ SignInToReadFlowIntegrationTests 5 5 0 1.25s
✅ SignInWebSheetIntegrationTests 3 3 0 43.38s
✅ SignInWebSheetViewModelTests 31 31 0 101ms
✅ SignOutCacheClearingTests 3 3 0 26ms
✅ SingletonResetRegistryTests 5 5 0 847ms
✅ SkeletonTests 22 22 0 162ms
✅ StatsViewModelTests 10 10 0 762ms
✅ StatusAnnouncementTests 22 22 0 102ms
✅ StopPositionSaveTests 2 2 0 3ms
✅ StoreTests 5 5 0 204ms
✅ StreamingReaderPresentationContractTests 1 1 0 31ms
✅ StreamingReaderProgressStoreTests 7 7 0 105ms
✅ StreamingReaderViewControllerScrollRestoreTests 12 12 0 1.03s
✅ StreamingReaderViewModelTests 9 9 0 34ms
✅ StringExtensionTests 8 8 0 58ms
✅ StringExtensionsTests 3 3 0 149ms
✅ StringHTMLEntitiesTests 7 7 0 5ms
✅ StringNYPLAdditionsTests 4 4 0 18ms
✅ String_NYPLAdditionsTests 4 4 0 4ms
✅ SupportSectionDecisionTests 5 5 0 525ms
✅ SyncConflictResolutionTests 3 3 0 2ms
✅ SyncDeletionGuardTests 5 5 0 9ms
✅ SyncDeletionRatioTests 6 6 0 57ms
✅ SyncPermissionTests 5 5 0 49ms
✅ TPPAccountAuthStateEnumTests 5 5 0 9ms
✅ TPPAccountListDataSourceTests 3 3 0 298ms
✅ TPPAdobeActivationSkipTests 6 6 0 305ms
✅ TPPAgeCheckCompletionTests 5 5 0 361ms
✅ TPPAgeCheckIsValidTests 5 5 0 14ms
✅ TPPAgeCheckStateMachineTests 4 4 0 780ms
✅ TPPAgeCheckTests 6 6 0 1.85s
✅ TPPAgeCheckVerifyDecisionTests 5 5 0 97ms
✅ TPPAlertUtilsTests 45 45 0 1.37s
✅ TPPAnnotationsHermeticTests 15 15 0 262ms
✅ TPPAnnotationsOverrideTests 4 4 0 432ms
✅ TPPAnnotationsTests 29 29 0 1.02s
✅ TPPAnnouncementManagerTests 3 3 0 5ms
✅ TPPAuthDocumentContractTests 3 3 0 38ms
✅ TPPBackgroundExecutorTests 3 3 0 29ms
✅ TPPBadgeImageGapTests 2 2 0 21ms
✅ TPPBaseReaderViewControllerInitialLocationTests 10 10 0 94ms
✅ TPPBasicAuthTests 11 11 0 284ms
✅ TPPBookAccessibilityLabelTests 8 8 0 148ms
✅ TPPBookAuthorCoverageTests 3 3 0 61ms
✅ TPPBookAuthorTests 6 6 0 62ms
✅ TPPBookBearerTokenTests 9 8 0 193ms
✅ TPPBookButtonsStateTests 7 7 0 21ms
✅ TPPBookContentMetadataFilesHelperTests 9 9 0 17ms
✅ TPPBookContentTypeConverterStreamingHTMLTests 2 2 0 3ms
✅ TPPBookContentTypeConverterTests 4 4 0 1.80s
✅ TPPBookContentTypeExtendedTests 4 4 0 16ms
✅ TPPBookContentTypeTests 14 14 0 36ms
✅ TPPBookCoverRegistryTests 17 17 0 2.11s
✅ TPPBookCreationTests 7 7 0 99ms
✅ TPPBookExtensionsTests 21 21 0 666ms
✅ TPPBookIsDRMProtectedTests 9 9 0 781ms
✅ TPPBookLocationCoverageTests 7 7 0 7ms
✅ TPPBookLocationEdgeCaseTests 27 27 0 154ms
✅ TPPBookLocationKeyTests 3 3 0 29ms
✅ TPPBookLocationTests 11 11 0 91ms
✅ TPPBookModelGapTests 4 4 0 19ms
✅ TPPBookRegistryAsyncReadinessTests 3 3 0 325ms
✅ TPPBookRegistryAtomicWriteTests 7 7 0 606ms
✅ TPPBookRegistryBookRetrievalTests 7 7 0 549ms
✅ TPPBookRegistryBookmarkTests 7 7 0 268ms
✅ TPPBookRegistryCorruptedDataTests 5 5 0 44ms
✅ TPPBookRegistryDataTests 4 4 0 687ms
✅ TPPBookRegistryDependencyTests 4 4 0 76ms
✅ TPPBookRegistryFulfillmentIdTests 4 4 0 1.62s
✅ TPPBookRegistryLargeCorpusTests 5 5 0 1m 14s
✅ TPPBookRegistryLoadReentrancyTests 2 2 0 32ms
✅ TPPBookRegistryLocationTests 4 4 0 2.13s
✅ TPPBookRegistryMigrationTests 16 16 0 6.29s
✅ TPPBookRegistryMutationContractTests 10 10 0 232ms
✅ TPPBookRegistryPersistenceTests 10 10 0 3.18s
✅ TPPBookRegistryProcessingTests 2 2 0 574ms
✅ TPPBookRegistryPublisherTests 6 6 0 119ms
✅ TPPBookRegistryRecordPersistenceTests 3 3 0 183ms
✅ TPPBookRegistryRecordTests 10 10 0 89ms
✅ TPPBookRegistryStateConcurrencyTests 2 2 0 64ms
✅ TPPBookRegistryStateManagementTests 11 11 0 2.55s
✅ TPPBookRegistryThreadSafetyTests 3 3 0 204ms
✅ TPPBookRegistryUpdateAndRemoveTests 1 1 0 294ms
✅ TPPBookRequiresAdobeDRMTests 6 6 0 7ms
✅ TPPBookSerializationTests 13 13 0 49ms
✅ TPPBookStateInitializationTests 4 4 0 5ms
✅ TPPBookStateTests 4 4 0 125ms
✅ TPPBookTests 98 98 0 2.98s
✅ TPPBookmarkDeletionLogTests 11 11 0 195ms
✅ TPPBookmarkFactoryInitTests 2 2 0 5ms
✅ TPPBookmarkFactoryServerAnnotationEdgeCaseTests 5 5 0 638ms
✅ TPPBookmarkFactoryTests 15 15 0 3.14s
✅ TPPBookmarkR3ConversionTests 5 5 0 22ms
✅ TPPBookmarkR3LocationTests 13 13 0 95ms
✅ TPPBookmarkSpecTests 1 1 0 <1ms
✅ TPPCachingTests 3 3 0 7ms
✅ TPPCapturedCredentialsTests 5 5 0 1.14s
✅ TPPConfigurationCustomRegistryTests 16 16 0 223ms
✅ TPPConfigurationTests 22 22 0 213ms
✅ TPPContentTypeTests 9 9 0 195ms
✅ TPPCredentialConcurrencyTests 3 3 0 8ms
✅ TPPCredentialIsolationE2ETests 5 0 0 133ms
✅ TPPCredentialPersistenceTests 6 6 0 757ms
✅ TPPCredentialSnapshotCoherenceTests 3 0 0 19ms
✅ TPPCredentialSnapshotTests 8 8 0 53ms
✅ TPPCredentialsCoverageTests 9 9 0 146ms
✅ TPPCredentialsTests 26 26 0 285ms
✅ TPPCrossLibrarySignOutTests 6 6 0 352ms
✅ TPPDRMFailureCredentialPreservationTests 4 4 0 662ms
✅ TPPErrorLoggerTests 27 27 0 2.40s
✅ TPPIdleSignOutRegressionTests 13 13 0 13.01s
✅ TPPJWKConversionTest 1 1 0 19ms
✅ TPPKeychainManagerTests 5 5 0 119ms
✅ TPPLastReadPositionPosterTests 13 13 0 61ms
✅ TPPLastReadPositionSynchronizerIntegrationTests 5 5 0 242ms
✅ TPPLastReadPositionSynchronizerTests 23 23 0 73ms
✅ TPPLastReadPositionSynchronizer_BehaviorDocumentationTests 5 5 0 46ms
✅ TPPLastReadPositionSynchronizer_BookLocationTests 9 9 0 92ms
✅ TPPLastReadPositionSynchronizer_ConcurrencyTests 3 3 0 427ms
✅ TPPLastReadPositionSynchronizer_ReadiumBookmarkTests 9 9 0 119ms
✅ TPPLastReadPositionSynchronizer_SyncLogicTests 10 10 0 174ms
✅ TPPLastReadPositionSynchronizer_WriterDelegationTests 4 4 0 382ms
✅ TPPLoginNoActivationTests 3 3 0 91ms
✅ TPPMainThreadCheckerTests 4 4 0 24ms
✅ TPPMigrationManagerTests 15 15 0 846ms
✅ TPPNetworkExecutorAPITests 14 14 0 1.11s
✅ TPPNetworkExecutorConcurrencyTests 4 4 0 301ms
✅ TPPNetworkExecutorStubbedTests 17 17 0 293ms
✅ TPPNetworkExecutorTests 3 3 0 88ms
✅ TPPNetworkResponderAuthCoordinatorTests 5 5 0 267ms
✅ TPPNetworkResponderSizeLimitTests 5 5 0 220ms
✅ TPPNetworkResponderTests 12 12 0 134ms
✅ TPPOPDSAcquisitionPathTests 5 5 0 11ms
✅ TPPOPDSEntryTests 5 5 0 15ms
✅ TPPOPDSFeedTests 3 3 0 100ms
✅ TPPOPDSGroupSwiftTests 3 3 0 30ms
✅ TPPOPDSLinkTests 7 7 0 14ms
✅ TPPOpenSearchDescriptionExpandedTests 10 10 0 40ms
✅ TPPOpenSearchDescriptionTests 1 1 0 116ms
✅ TPPPDFDocumentMetadataTests 15 15 0 171ms
✅ TPPPDFDocumentTests 8 8 0 750ms
✅ TPPPDFLocationCoverageTests 7 7 0 8ms
✅ TPPPDFLocationTests 10 10 0 92ms
✅ TPPPDFPageBookmarkTests 9 9 0 85ms
✅ TPPPDFPageTests 5 5 0 6ms
✅ TPPPDFReaderModeTests 6 6 0 7ms
✅ TPPPDFReaderSearchBindingTests 3 3 0 4ms
✅ TPPPerAccountIsolationTests 8 0 0 192ms
✅ TPPPreferredAuthSelectionTests 8 8 0 477ms
✅ TPPProblemDocumentCacheManagerTests 12 12 0 207ms
✅ TPPProblemDocumentTests 21 21 0 222ms
✅ TPPReaderAppearanceTests 4 4 0 71ms
✅ TPPReaderBlockNavigationTests 12 12 0 60ms
✅ TPPReaderBookmarksBusinessLogicTests 12 12 0 476ms
✅ TPPReaderBookmarksReadinessTests 2 2 0 100ms
✅ TPPReaderFontTests 4 4 0 16ms
✅ TPPReaderFootnoteAccessibilityTests 16 16 0 614ms
✅ TPPReaderPageListBusinessLogicTests 27 27 0 416ms
✅ TPPReaderPositionReportTests 10 10 0 79ms
✅ TPPReaderPreferencesLoadTests 3 3 0 19ms
✅ TPPReaderSettingsTests 28 28 0 19.05s
✅ TPPReaderTOCBusinessLogicTests 15 15 0 158ms
✅ TPPReaderTOCFlattenTests 2 2 0 126ms
✅ TPPReadiumBookmarkLocationMatchingTests 5 5 0 10ms
✅ TPPReadiumBookmarkTests 23 23 0 196ms
✅ TPPReauthenticatorMockTests 2 2 0 2ms
✅ TPPReauthenticatorTests 4 4 0 153ms
✅ TPPReturnPromptHelperTests 5 5 0 56ms
✅ TPPSAMLCookieExpirationTests 7 7 0 87ms
✅ TPPSAMLFlowTests 10 10 0 167ms
✅ TPPSAMLReauthFlowTests 2 2 0 323ms
✅ TPPSAMLRegressionTests 4 4 0 168ms
✅ TPPSAMLSignInTests 26 26 0 2.55s
✅ TPPSAMLStateIsolationTests 4 4 0 187ms
✅ TPPSAMLStateMachineTests 6 6 0 2.34s
❌ TPPSettingsTests 6 5 1 2m 1s
✅ TPPSignInAdobeSkipTests 14 14 0 578ms
✅ TPPSignInAuthStateTransitionTests 3 3 0 125ms
✅ TPPSignInBusinessLogicExtendedTests 58 58 0 12.96s
✅ TPPSignInBusinessLogicOAuthTests 11 11 0 378ms
✅ TPPSignInBusinessLogicSignOutTests 11 11 0 1.05s
✅ TPPSignInBusinessLogicStateMachineTests 10 10 0 403ms
✅ TPPSignInBusinessLogicTests 18 18 0 1.35s
✅ TPPSignInBusinessLogicTokenFlowTests 3 3 0 295ms
✅ TPPSignInBusinessLogicValidationCallbackOrderTests 2 2 0 1.48s
✅ TPPSignInErrorHandlingTests 2 2 0 50ms
✅ TPPSignInProfileDocEdgeCaseTests 3 3 0 885ms
✅ TPPSignedInStateProviderTests 3 3 0 4ms
✅ TPPUserAccountAuthStateTests 6 6 0 6ms
✅ TPPUserAccountConcurrencyTests 1 1 0 3ms
✅ TPPUserAccountGapTests 4 4 0 11ms
✅ TPPUserAccountIsolationLintTests 3 3 0 806ms
✅ TPPUserAccountTestFactoryTests 7 0 0 644ms
✅ TPPUserFriendlyErrorTests 11 11 0 144ms
✅ TPPUserNotificationsTests 10 10 0 108ms
✅ TPPXMLSwiftTests 16 16 0 137ms
✅ TPPXMLTests 3 3 0 23ms
✅ TabBarModernizationTests 8 8 0 12ms
✅ TearDownRequiredLintTests 5 5 0 2.22s
✅ TestAppContainerFactoryTests 5 5 0 200ms
✅ TestTargetHermeticityRegressionTests 4 3 0 56.81s
✅ TimeEntryTests 3 3 0 1.25s
✅ TokenRefreshAndRetryQueueTests 9 9 0 1.54s
✅ TokenRefreshIntegrationTests 2 2 0 58ms
✅ TokenRefreshInterceptorAuthCoordinatorTests 8 8 0 188ms
✅ TokenRefreshInterceptorTests 24 24 0 429ms
✅ TokenRefreshOnForegroundTests 10 10 0 2.94s
✅ TokenRefreshTests 25 25 0 304ms
✅ TokenRefreshWatchdogTests 5 5 0 124ms
✅ TokenRequestCredentialGuardTests 13 13 0 321ms
✅ TokenRequestTests 11 11 0 179ms
✅ TokenResponseTests 21 21 0 83ms
✅ TriageBotKeyAdminTests 4 4 0 145ms
✅ TypographyPresetTests 21 21 0 438ms
✅ TypographyServiceTests 31 31 0 941ms
✅ TypographySettingsViewModelTests 27 27 0 1.84s
✅ UIAlertCACommitGuardTests 9 9 0 2.90s
✅ UIColor_NYPLAdditionsTests 1 1 0 2ms
✅ URLBackupExclusionTests 3 3 0 6ms
✅ URLExtensionTests 16 16 0 257ms
✅ URLExtensionsTests 11 11 0 163ms
✅ URLRequestExtensionsCoverageTests 3 3 0 15ms
✅ URLRequestExtensionsTests 11 11 0 713ms
✅ URLRequestNYPLAdditionsTests 11 11 0 1.87s
✅ URLRequest_NYPLTests 1 1 0 <1ms
✅ URLResponseAuthenticationTests 10 10 0 103ms
✅ URLResponseNYPLTests 14 14 0 75ms
✅ URLSessionCredentialStorageTests 3 3 0 5ms
✅ URLSessionStubbingResetTests 2 2 0 11ms
✅ URLTypeTests 2 2 0 10ms
✅ URLValidationTests 5 5 0 66ms
✅ UnifiedOPDSServiceStateMachineTests 2 2 0 117ms
✅ UserAccountPublisherAuthStateTests 5 5 0 257ms
✅ UserAccountPublisherTests 14 14 0 536ms
✅ UserAccountValidationTests 11 11 0 2.32s
✅ UserDefaultsIsolationLintTests 2 2 0 843ms
✅ UserProfileDocumentTests 7 7 0 88ms
✅ UserRetryTrackerTests 10 10 0 12ms
✅ XCTestCase_testUserDefaultsTests 3 3 0 115ms
✅ iPadOnMacRMSDKGuardTests 7 7 0 297ms
Failed Tests (click to expand)
Palace.PalaceTests
BookReturnServiceAuthCoordinatorTests.First Run
CatalogCacheKeyAndIsolationTests.testConcurrentStaleReads_BackgroundRefreshDoesNotPoisonNeighborKey
TPPSettingsTests.testUseBetaLibraries_postsNotification

📊 Testing Coverage Breakdown

Unit Test Line Coverage (testable surfaces): 46.0%

Total coverage incl. UI/lifecycle: 45.0% (17 files excluded from testable denominator — see scripts/coverage-exclude.json)

Target Lines Covered
Palace.app 45.0%

Why two coverage numbers? Testable coverage subtracts files that can't be exercised from xcodebuild — SwiftUI views, UIKit VCs, lifecycle (see scripts/coverage-exclude.json) — so raising it means more testable logic is tested, not that we shipped less UI. Total coverage is kept for continuity. The excluded paths are covered by simdrive E2E journeys (see chaos-replay-on-pr.yml).

📈 Trends

Test count change: +7966

⚠️ New Failures
BookReturnServiceAuthCoordinatorTests.First Run
CatalogCacheKeyAndIsolationTests.testConcurrentStaleReads_BackgroundRefreshDoesNotPoisonNeighborKey
Palace.PalaceTests
TPPSettingsTests.testUseBetaLibraries_postsNotification

🔗 Interactive HTML Report | CI Run Details

📦 Downloadable Artifacts
Artifact Description
test-report 📄 Markdown + HTML reports
test-data 📊 JSON data for tooling
test-results 🔍 Full xcresult (open in Xcode)

@mauricecarrier7
mauricecarrier7 changed the base branch from feat/pp-4825-triage-corpus-generalhelp to develop July 21, 2026 14:29
…P-4831)

A how_to answer names UI ("go to Settings → Libraries") and has no fix version to
expire against, so it goes stale silently when the app's navigation moves — exactly
the Palace-icon → Settings reroute we just did. This adds the governance to catch that.

- KBEntry gains `ui_surface` (the screen a how_to depends on) + `reviewed_at` (when
  the answer was last verified). Both nil for known_issue entries.
- All four how_to entries are now anchored + dated; HT-003 switch-library and the
  add-library answers point at `settings-libraries`.
- HowToGovernanceTests adds a UI-surface CHANGE LOG (surface → last-changed date) and
  a staleness lint: any how_to whose `reviewed_at` predates its surface's last-changed
  date fails — the screen moved and nobody re-checked the directions. `settings-libraries`
  is dated 2026-07-20 (today's reroute); the answers were re-reviewed the same day, so
  they pass — had they not been, the lint would have caught it. Teeth proven on the real
  catalog: rolling a review date back to before the change fails with the drift message.
- New FAQ entry HT-2026-004-notifications (hold-ready + due-soon reminders — enable
  notifications; from HelpSpot 18103), with a benchmark case.

Note on FAQ growth: several "common questions" (loan period, borrow limit, hold window)
have LIBRARY-SPECIFIC answers (they vary per library's config), so they're poor canned
FAQs — better routed to the library than answered with a hardcoded number. v1 adds the
universal one (notifications); the rest want product input before authoring.

TriageBotCore suite 248/248 green via `swift test`.

**Scope:** TriageBotCore local package only — KBEntry anchor/date fields, catalog
metadata + one new how_to entry, governance tests. No classifier/reducer/escalation
change (that's PP-4832). No app/DRM/sign-in code.

**Not done:** branched off the unmerged PP-4825 branch; re-stack after #1305 + PP-4825
land. Applying the UI anchor to known_issue text (which can also drift) is deferred.
Holding PR until tomorrow per request — pushed for backup only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mauricecarrier7
mauricecarrier7 force-pushed the feat/pp-4831-howto-governance branch from 8588eff to 16c72c6 Compare July 21, 2026 14:38
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

🏗️ CodeAtlas Ledger Analysis

✅ All Checks Passed


♿ Accessibility (via AccessLint)

💡 Static analysis against WCAG 2.1 AA guidelines for iOS accessibility.

No accessibility issues detected


🧪 Test Coverage (via QAAtlas)

⚠️ No coverage data available - QAAtlas requires an OpenAI API key.
Set OPENAI_API_KEY in repository secrets to enable AI-powered test coverage analysis.


🏛️ Architecture Analysis

Metric Value ℹ️ What This Means
Components 12 Distinct modules/layers detected in your codebase
Dependency Cycles 0 Circular dependencies (A→B→C→A). Goal: 0
Layer Violations 1 Dependencies that break architectural boundaries
Hotspots 0 Files with high complexity + frequent changes
Avg Coupling 1.00 How interconnected modules are (lower is better, <1.0 is good)

🔍 Reachability Analysis

💡 Detects code that cannot be reached from entry points (dead code).

No dead code detected


📊 0 files analyzed | 📦 Download Full Report

Powered by CodeAtlas Ledger
• Accessibility: AccessLint

t and others added 3 commits July 21, 2026 15:49
…steer (PP-4831)

David Wilcox's product call on the deferred library-specific FAQs: answer them
generically (option b) with a helpful pointer, rather than hardcode a number
that's wrong for most patrons. Three new how_to entries, each anchored to the
existing `my-books` UI surface and reviewed 2026-07-21:

- HT-2026-005-hold-pickup-window — "How long you have to pick up a ready hold
  varies by library and distributor. When your hold is ready, Palace shows the
  exact 'pick up by' date right on it…"
- HT-2026-006-borrow-limit — "The number of titles you can borrow at once is set
  by your library, so it varies. If you've reached the limit, returning a title
  you've finished frees up a slot…"
- HT-2026-007-loan-length — "Loan length is set by your library, so it varies —
  you'll see the due date on each title when you borrow it. Palace can't extend
  or renew a loan in the app…"

Renewals (HT-2026-001) unchanged — David confirmed the existing answer is
accurate. Loan-length keywords deliberately avoid renewals' "renew/extend/keep
longer" set so the two don't compete.

Each entry gets its shouldMatch benchmark cases in ResponseQualityTests (so the
every-entry-has-a-benchmark gate passes and precision/recall keep exercising
them). Full TriageBotCore suite green (261/261), incl. HowToGovernance,
CatalogSchemaLint (nested-keyword), and per-kind precision/recall.

**Scope:** three how_to corpus entries + their benchmark cases. No classifier,
reducer, or governance-schema changes; reuses the existing `my-books` anchor so
no change-log edit is needed.

**Not done:** other FAQ topics named in PP-4831 (send-to-Kindle/formats, adding
a library card) — separate follow-ups.

**Deferred:** none.
@mauricecarrier7
mauricecarrier7 merged commit d465a6b into develop Jul 22, 2026
3 of 4 checks passed
mauricecarrier7 added a commit that referenced this pull request Jul 22, 2026
…s/Kindle (#1322)

Closes out the two FAQ topics from PP-4831's acceptance criteria not yet built
(holds + borrow limits shipped in #1309). Both answers product-confirmed:

- HT-2026-008-add-library-card — "To add your library card, open Settings →
  Libraries. If your library isn't listed yet, add it there first, then tap it
  and sign in with your library card number (barcode) and PIN…" Anchored to
  settings-libraries; keywords avoid the switch-library set.
- HT-2026-009-formats-kindle — confirmed NOT supported: "Palace isn't connected
  to Kindle — there's no 'send to Kindle' step. You read your borrowed books
  right in the Palace app…" Anchored to my-books. Keywords use "to kindle" /
  "on kindle" (not the nested "send to kindle" variants) so natural phrasings
  like "send my book to Kindle" match without tripping the nested-keyword lint.

Both carry reviewed_at 2026-07-22 and reuse existing UI-surface anchors, so no
change-log edit. shouldMatch benchmark cases added for each. Full TriageBotCore
suite green (283/283) — HowToGovernance, schema lint, per-kind precision/recall.

**Scope:** two how_to corpus entries + their benchmark cases.

**Not done:** none of PP-4831's named FAQ topics remain after this.

**Deferred:** none.

Co-authored-by: t <t@t.io>
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.

1 participant