Remove dead code found by full Periphery audit; add scan config + advisory CI (#1410)

Periphery 3.7.4 audit of both schemes (macOS + iOS, intersected so
platform-specific code is never touched), with test targets indexed and
the share extension built. 277 dead declarations removed or demoted:
dead forwarding wrappers (ChatViewModel+Nostr/+PrivateChat), removed-
feature remnants (autocomplete command suggestions, back-swipe tuning,
MediaSendError, GeohashParticipantTracker), unused Tor dormancy
bindings, assign-only properties, unused parameters (renamed to _), and
redundant public accessibility. 13 orphaned localization keys deleted
across all 29 locales (old pre-#1392 location-notes UI, app_info
warnings).

Two real tests were flagged as unused because they never ran: Swift
Testing methods missing @Test (NostrProtocolTests.
testAckRoundTripNIP44V2_Delivered, NotificationStreamAssemblerTests.
testAssemblesCompressedLargeFrame). Re-armed both; they pass.

Deliberately kept, now recorded in .periphery.baseline.json: iOS-only
code invisible to the CI macOS scan, C FFI signatures, keep-alive
NWPathMonitor reference, InboundEventKey.eventID (dedup semantics),
wifiBulk capability bit (reserved for Wi-Fi bulk work, used by
BitFoundation package tests), and the String secureClear cluster
(exercised by package tests).

New: .periphery.yml config and an advisory Dead Code CI job (mirrors
the SwiftLint precedent from #1361) that fails on findings not in the
committed baseline.

Verified: full macOS app suite, BitFoundation (119) and BitLogger (13)
package tests green; periphery scan --strict exits clean.

Co-authored-by: jack <jackjackbits@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jack
2026-07-08 11:24:19 +02:00
committed by GitHub
co-authored by jack Claude Fable 5
parent d5cf64f99e
commit ef848857b7
102 changed files with 137 additions and 3712 deletions
-1
View File
@@ -8,7 +8,6 @@
import Foundation
import BitFoundation
@testable import bitchat
final class MockBLEBus {
private var registry: [PeerID: MockBLEService] = [:]
-62
View File
@@ -48,10 +48,6 @@ final class MockBLEService: NSObject {
set { myNickname = newValue }
}
var nickname: String {
return myNickname
}
var peerID: PeerID {
return myPeerID
}
@@ -62,12 +58,6 @@ final class MockBLEService: NSObject {
self.bus = bus
}
// MARK: - Methods matching BLEService
func setNickname(_ nickname: String) {
self.myNickname = nickname
}
// MARK: - In-memory test bus (for E2E/Integration)
/// Registers this instance on first use.
@@ -92,10 +82,6 @@ final class MockBLEService: NSObject {
return connectedPeers.contains(peerID)
}
func peerNickname(peerID: String) -> String? {
"MockPeer_\(peerID)"
}
func getPeerNicknames() -> [PeerID: String] {
var nicknames: [PeerID: String] = [:]
for peer in connectedPeers {
@@ -103,10 +89,6 @@ final class MockBLEService: NSObject {
}
return nicknames
}
func getPeers() -> [PeerID: String] {
return getPeerNicknames()
}
/// Keep local echo synchronous so Swift Testing confirmations observe it deterministically.
private func deliverLocalEcho(_ message: BitchatMessage) {
@@ -155,14 +137,6 @@ final class MockBLEService: NSObject {
}
}
func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {
// Tests currently ignore file transfer flows; keep stub for protocol conformance.
}
func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {
// Tests currently ignore file transfer flows; keep stub for protocol conformance.
}
func sendPrivateMessage(_ content: String, to recipientPeerID: PeerID, recipientNickname: String, messageID: String) {
let message = BitchatMessage(
id: messageID,
@@ -209,39 +183,6 @@ final class MockBLEService: NSObject {
}
}
func sendFavoriteNotification(to peerID: String, isFavorite: Bool) {
// Mock implementation
}
func sendReadReceipt(_ receipt: ReadReceipt, to peerID: String) {
// Mock implementation
}
func sendBroadcastAnnounce() {
// Mock implementation
}
func getPeerFingerprint(_ peerID: String) -> String? {
return nil
}
func getNoiseSessionState(for peerID: String) -> LazyHandshakeState {
return .none
}
func triggerHandshake(with peerID: String) {
// Mock implementation
}
func emergencyDisconnectAll() {
connectedPeers.removeAll()
delegate?.didUpdatePeerList([])
}
func getFingerprint(for peerID: String) -> String? {
return nil
}
// MARK: - Test Helper Methods
func simulateConnectedPeer(_ peerID: PeerID) {
@@ -314,9 +255,6 @@ final class MockBLEService: NSObject {
}
}
// Backward compatibility for older tests
typealias MockSimplifiedBluetoothService = MockBLEService
// MARK: - Helpers
extension MockBLEService {
+3 -22
View File
@@ -11,18 +11,11 @@ import BitFoundation
@testable import bitchat
final class MockIdentityManager: SecureIdentityStateManagerProtocol {
private let keychain: KeychainManagerProtocol
private var blockedFingerprints: Set<String> = []
private var blockedNostrPubkeys: Set<String> = []
private var socialIdentities: [String: SocialIdentity] = [:]
init(_ keychain: KeychainManagerProtocol) {
self.keychain = keychain
}
func loadIdentityCache() {}
func saveIdentityCache() {}
init(_: KeychainManagerProtocol) {}
func forceSave() {}
@@ -45,12 +38,6 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol {
}
}
func getFavorites() -> Set<String> {
Set()
}
func setFavorite(_ fingerprint: String, isFavorite: Bool) {}
func isFavorite(fingerprint: String) -> Bool {
false
}
@@ -99,9 +86,7 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol {
}
func registerEphemeralSession(peerID: PeerID, handshakeState: HandshakeState) {}
func updateHandshakeState(peerID: PeerID, state: HandshakeState) {}
func clearAllIdentityData() {}
func removeEphemeralSession(peerID: PeerID) {}
@@ -139,10 +124,6 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol {
!(vouchesByVouchee[fingerprint] ?? []).isEmpty
}
func effectiveTrustLevel(for fingerprint: String) -> TrustLevel {
socialIdentities[fingerprint]?.trustLevel ?? .unknown
}
func lastVouchBatchSent(to fingerprint: String) -> Date? {
vouchBatchSentAt[fingerprint]
}
-3
View File
@@ -26,9 +26,6 @@ final class MockTransport: Transport {
var myNickname: String = "TestUser"
private let peerSnapshotSubject = CurrentValueSubject<[TransportPeerSnapshot], Never>([])
var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> {
peerSnapshotSubject.eraseToAnyPublisher()
}
// MARK: - Recording Properties (for test assertions)