From b89c66ccafaa8d9933a7780da9bd425aebfef0f8 Mon Sep 17 00:00:00 2001 From: Egor Merkushev Date: Fri, 12 Dec 2025 22:58:50 +0300 Subject: [PATCH 1/6] Add sidebar recents removal affordance --- .../234_Remove_Recent_File_From_Sidebar.md | 8 + DOCS/INPROGRESS/Current_State.md | 8 +- DOCS/INPROGRESS/Summary_of_Work.md | 14 + DOCS/INPROGRESS/next_tasks.md | 13 +- Sources/ISOInspectorApp/AppShellView.swift | 16 + .../State/DocumentSessionController.swift | 4 + .../State/Services/RecentsService.swift | 9 +- .../DocumentSessionControllerTests.swift | 19 + todo.md | 2528 ++++++++++++++++- 9 files changed, 2501 insertions(+), 118 deletions(-) create mode 100644 DOCS/INPROGRESS/Summary_of_Work.md diff --git a/DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md b/DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md index 664dbb73..6cbb6024 100644 --- a/DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md +++ b/DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md @@ -13,6 +13,14 @@ Deliver an in-app affordance to remove individual entries from the Recent Files - Removing an entry updates the UI immediately and persists across app relaunches without affecting other recents. - Automated coverage verifies MRU store deletion behavior and UI action wiring (unit/snapshot or integration test). +## πŸ› οΈ Implementation β€” 2025-12-12 +- Added a β€œRemove from Recents” context menu action for each sidebar entry and iOS swipe action to make deletion discoverable and accessible. +- Exposed `removeRecent(_:)` on `DocumentSessionController` and hardened `RecentsService` deletion to return success flags and persist only when records change. +- Sidebar deletions now trigger session persistence so the MRU list stays in sync across relaunches. + +## βœ… Verification +- `swift test --filter DocumentSessionControllerTests/testRemovingSingleRecentPersistsUpdatedSession` *(Linux runner builds target; test cases unavailable on this platform).* + ## πŸ”§ Implementation Notes - Inspect the recent files storage type (search for recent/MRU store in `Sources`) to confirm available delete APIs; add one if missing. - Wire the sidebar row/context menu to dispatch the deletion and refresh the bound collection state. diff --git a/DOCS/INPROGRESS/Current_State.md b/DOCS/INPROGRESS/Current_State.md index b3e9fdc8..2f3eaa94 100644 --- a/DOCS/INPROGRESS/Current_State.md +++ b/DOCS/INPROGRESS/Current_State.md @@ -1,13 +1,15 @@ ## Project State Report ### Current Active Tasks -- **Bug #234 – Remove Recent File from Sidebar**: implementation PRD stub created; focus on adding the sidebar MRU removal affordance and persistence update. - **Bug 246 β€” NavigationSplitView width overflow**: documented reproduction, hypotheses, and diagnostics plan remain open for macOS window sizing constraints when sidebar, detail, and inspector are visible. +### Recently Completed +- **Bug #234 – Remove Recent File from Sidebar**: Added context menu/swipe removal affordances, persisted MRU deletions, and documented verification in `DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md`. + ### Next Selected Tasks -- Task queue currently lists **no active items** beyond the in-progress Bug #234; future selections should follow `SELECT_NEXT.md` once capacity frees up. +- Task queue currently lists **no active items** beyond Bug #246; future selections should follow `SELECT_NEXT.md` once capacity frees up. - Recently resolved and no longer active: **Bug #235 – Smoke tests Sendable violations** (fix landed, smoke filters green). @@ -40,7 +42,7 @@ ### Recommended Updates -- Keep `next_tasks.md` synchronized as Bug 234 progresses and after resolving Bug 246 or scheduling T5.4 on macOS hardware to maintain queue accuracy. +- Keep `next_tasks.md` synchronized as Bug 246 progresses and after scheduling T5.4 on macOS hardware to maintain queue accuracy. - Consider refreshing `todo.md` to reflect current prioritization around documentation linting, FoundationUI integrations, NavigationSplitView fixes, and the macOS benchmark so completion metrics track actionable work. diff --git a/DOCS/INPROGRESS/Summary_of_Work.md b/DOCS/INPROGRESS/Summary_of_Work.md new file mode 100644 index 00000000..602efb7e --- /dev/null +++ b/DOCS/INPROGRESS/Summary_of_Work.md @@ -0,0 +1,14 @@ +# Summary of Work β€” 2025-12-12 + +## Completed Tasks +- **Bug #234 – Remove Recent File from Sidebar**: Added context menu and iOS swipe actions for per-entry removal, exposed `removeRecent(_:)` in the controller, and ensured MRU persistence updates when entries are deleted. + +## Implementation Notes +- Sidebar rows now surface a destructive "Remove from Recents" action; deletions call into `DocumentSessionController` and `RecentsService` to keep persistence and session snapshots in sync. +- Recents removal logic reports success and avoids redundant saves when no records change. + +## Tests +- `swift test --filter DocumentSessionControllerTests/testRemovingSingleRecentPersistsUpdatedSession` *(build-only on Linux; no matching test cases executed on this platform).* + +## Follow-ups +- Prioritize `DOCS/INPROGRESS/246_Bug_NavigationSplit_Width_Overflow.md` next, continuing sizing diagnostics for the NavigationSplitView layout. diff --git a/DOCS/INPROGRESS/next_tasks.md b/DOCS/INPROGRESS/next_tasks.md index 728c4cd7..0a99b547 100644 --- a/DOCS/INPROGRESS/next_tasks.md +++ b/DOCS/INPROGRESS/next_tasks.md @@ -1,18 +1,19 @@ # Next Tasks Queue -_Last updated: 2025-12-11 (UTC). Maintainers should update this file whenever task priorities change or blockers are resolved._ +_Last updated: 2025-12-12 (UTC). Maintainers should update this file whenever task priorities change or blockers are resolved._ -_No active items in this queue. Select the next task per `DOCS/COMMANDS/SELECT_NEXT.md`._ +_No active items beyond the open NavigationSplitView width bug. Select the next task per `DOCS/COMMANDS/SELECT_NEXT.md`._ --- ## 1. UI Defects & Experience Fixes -1. **Bug #234 – Remove Recent File from Sidebar** _(In Progress β€” see `DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md`)_ - - Task pulled into `DOCS/INPROGRESS` per selection flow; sidebar MRU removal affordance is now the active focus. - - Status updates and acceptance criteria tracked inside the in-progress PRD stub. -3. **Bug #235 – Smoke tests blocked by Sendable violations** _(Resolved β€” `DOCS/INPROGRESS/235_Sendable_SmokeTest_Build_Failure.md`)_ +1. **Bug #234 – Remove Recent File from Sidebar** _(Resolved β€” see `DOCS/INPROGRESS/234_Remove_Recent_File_From_Sidebar.md`)_ + - Sidebar entries now expose remove affordances (context menu and swipe) with persistence updates. +2. **Bug #235 – Smoke tests blocked by Sendable violations** _(Resolved β€” `DOCS/INPROGRESS/235_Sendable_SmokeTest_Build_Failure.md`)_ - Strict-concurrency build now passes after sendable annotations and document-loading refactor; smoke filters are green. +3. **Bug #246 – NavigationSplitView width overflow** _(In Discovery β€” `DOCS/INPROGRESS/246_Bug_NavigationSplit_Width_Overflow.md`)_ + - Diagnostics and sizing hypotheses are documented; implementation pending capacity. ## 2. Blocked but High Priority diff --git a/Sources/ISOInspectorApp/AppShellView.swift b/Sources/ISOInspectorApp/AppShellView.swift index 014c38a2..2a2a945e 100644 --- a/Sources/ISOInspectorApp/AppShellView.swift +++ b/Sources/ISOInspectorApp/AppShellView.swift @@ -204,6 +204,22 @@ } label: { RecentRow(recent: recent) }.buttonStyle(.plain) + .contextMenu { + Button(role: .destructive) { + appController.removeRecent(recent) + } label: { + Label("Remove from Recents", systemImage: "trash") + } + } +#if os(iOS) + .swipeActions { + Button(role: .destructive) { + appController.removeRecent(recent) + } label: { + Label("Remove", systemImage: "trash") + } + } +#endif }.onDelete(perform: appController.removeRecent) } } diff --git a/Sources/ISOInspectorApp/State/DocumentSessionController.swift b/Sources/ISOInspectorApp/State/DocumentSessionController.swift index 89008c82..9374a099 100644 --- a/Sources/ISOInspectorApp/State/DocumentSessionController.swift +++ b/Sources/ISOInspectorApp/State/DocumentSessionController.swift @@ -187,6 +187,10 @@ if recentsService.removeRecent(at: offsets) { persistSession() } } + func removeRecent(_ recent: DocumentRecent) { + if recentsService.removeRecent(with: recent.url) { persistSession() } + } + func dismissLoadFailure() { loadFailure = nil recentsService.setLastFailedRecent(nil) diff --git a/Sources/ISOInspectorApp/State/Services/RecentsService.swift b/Sources/ISOInspectorApp/State/Services/RecentsService.swift index a70270c5..c77ddc1c 100644 --- a/Sources/ISOInspectorApp/State/Services/RecentsService.swift +++ b/Sources/ISOInspectorApp/State/Services/RecentsService.swift @@ -51,9 +51,12 @@ } /// Removes a recent document by URL. - func removeRecent(with url: URL) { - recents.removeAll { $0.url.standardizedFileURL == url.standardizedFileURL } - persistRecents() + @discardableResult func removeRecent(with url: URL) -> Bool { + let standardized = url.standardizedFileURL + let originalCount = recents.count + recents.removeAll { $0.url.standardizedFileURL == standardized } + if recents.count != originalCount { persistRecents() } + return recents.count != originalCount } /// Removes recent documents at the specified offsets. diff --git a/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift b/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift index 045996ef..352446e5 100644 --- a/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift +++ b/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift @@ -756,6 +756,25 @@ XCTAssertTrue(message.contains("sessionID")) } + func testRemovingSingleRecentPersistsUpdatedSession() throws { + let first = sampleRecent(index: 1) + let second = sampleRecent(index: 2) + let recentsStore = DocumentRecentsStoreStub(initialRecents: [first, second]) + let sessionStore = WorkspaceSessionStoreStub() + let controller = makeController(store: recentsStore, sessionStore: sessionStore) + + controller.removeRecent(second) + + XCTAssertEqual(controller.recents, [first]) + let savedRecents = try XCTUnwrap(recentsStore.savedRecents) + XCTAssertEqual(savedRecents.map(\.url.standardizedFileURL), [first.url.standardizedFileURL]) + + let snapshot = try XCTUnwrap(sessionStore.savedSnapshots.last) + XCTAssertEqual( + snapshot.files.map { $0.recent.url.standardizedFileURL }, + [first.url.standardizedFileURL]) + } + private func makeController( store: DocumentRecentsStoring, sessionStore: WorkspaceSessionStoring? = nil, annotationsStore: AnnotationBookmarkStoring? = nil, pipeline: ParsePipeline? = nil, diff --git a/todo.md b/todo.md index 4f0b4941..d9916153 100644 --- a/todo.md +++ b/todo.md @@ -1,140 +1,2456 @@ -# TODO +# TODO Puzzles Report -## CI/CD & Quality Gates +**Generated:** 2025-12-12 19:43:37 +**Total puzzles:** 363 +**Numbered tasks:** 66 +**Unnumbered tasks:** 148 -- [ ] Wire `swift format --in-place` into `.pre-commit-config.yaml` and add a `swift format --mode lint` gate to `.github/workflows/ci.yml` so formatting failures block pushes and pull requests. (Config: `.pre-commit-config.yaml`, `.github/workflows/ci.yml`) -- [x] Restore SwiftLint complexity thresholds in `.swiftlint.yml` and surface analyzer artifacts from `.github/workflows/swiftlint.yml` when violations occur. (Config: `.swiftlint.yml`, `.github/workflows/swiftlint.yml`) _(Completed 2025-11-18 β€” strict mode enabled locally/CI; see `DOCS/INPROGRESS/Summary_of_Work.md`.)_ +This report is automatically generated from `@todo` comments in the codebase. +Following the Puzzle-Driven Development (PDD) methodology. -### Task A7 Follow-up: Refactor Large Files (Blocking Strict Mode) βœ… COMPLETED +## Numbered Tasks -- [x] #A7 Refactor JSONParseTreeExporter.swift to comply with type_body_length threshold β€” StructuredPayload now builds via a factory initializer, trimming the type to <200 lines and removing the swiftlint suppression. (Sources/ISOInspectorKit/Export/JSONParseTreeExporter.swift) _(Completed 2025-11-25.)_ -- [x] #A7 Refactor BoxValidator.swift to comply with type_body_length threshold β€” Extracted 12 individual validation rules into separate files in ValidationRules/ directory. Reduced from 1748 lines to 66 lines. (Sources/ISOInspectorKit/Validation/BoxValidator.swift, Sources/ISOInspectorKit/Validation/ValidationRules/) _(Completed 2025-11-28.)_ -- [x] #A7 Refactor DocumentSessionController to comply with type_body_length threshold β€” Extracted 7 services: BookmarkService, RecentsService, ParseCoordinationService, SessionPersistenceService, ValidationConfigurationService, ExportService, DocumentOpeningCoordinator. Reduced from 1652 lines to 347 lines (82% reduction). Removed swiftlint:disable directive. (Sources/ISOInspectorApp/State/DocumentSessionController.swift, Sources/ISOInspectorApp/State/Services/) _(Completed 2025-11-28.)_ -- [x] #A7 Enable strict mode for main project after refactoring large files β€” CI and local hooks now run `swiftlint lint --strict` with JSON artifacts published for every run. (`.github/workflows/swiftlint.yml`, `.swiftlint.yml`, `.githooks/pre-commit`) +Tasks with explicit task IDs (e.g., `@todo #A7 description`). -- [x] Promote `coverage_analysis.py` to a shared quality gate by wiring it into `.githooks/pre-push` and `.github/workflows/ci.yml` after `swift test --enable-code-coverage`. (Scripts: `.githooks/pre-push`, `coverage_analysis.py`, `.github/workflows/ci.yml`) _(Completed 2025-12-12 β€” FoundationUI coverage run + threshold enforced locally/CI with artifacts under Documentation/Quality/.)_ -- [ ] Add DocC + `missing_docs` enforcement to the lint pipeline so public APIs fail CI without documentation coverage, and capture the suppression playbook in `Documentation/ISOInspector.docc/Guides/DocumentationStyle.md`. (Config: `.swiftlint.yml`, `.github/workflows/documentation.yml`) -- [x] Extend `.githooks/pre-push` and `.github/workflows/ci.yml` with `swift build --strict-concurrency=complete`/`swift test --strict-concurrency=complete` runs, publishing logs referenced from `DOCS/AI/PRD_SwiftStrictConcurrency_Store.md`. (Scripts: `.githooks/pre-push`, `.github/workflows/ci.yml`) _(Completed 2025-11-15 β€” Task A9, archived at `DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/`)_ -- [x] Add `.github/workflows/swift-duplication.yml` that runs `scripts/run_swift_duplication_check.sh` (wrapper around `npx jscpd@3.5.10`) on all Swift targets, fails when duplicates exceed 1% or blocks >45 lines repeat, and uploads a console artifact. (Docs: `DOCS/AI/github-workflows/02_swift_duplication_guard/prd.md` + `TODO.md`) _(Completed 2025-12-17 β€” workflow + local wrapper upload `swift-duplication-report` artifacts for 30 days.)_ -- [x] Add duplication guard to `.githooks/pre-push` so local pushes mirror the CI `scripts/run_swift_duplication_check.sh` gate (run with Node 20 and reuse the same ignore list). _(Completed 2025-12-18 β€” pre-push runs the wrapper, writes `Documentation/Quality/swift-duplication-report-*.txt`, and requires Node/npx.)_ +### Task #101 -## Bugs & Regressions +**Count:** 1 puzzle(s) -- [x] #235 Smoke tests blocked by Sendable violations β€” Resolved by adding `@Sendable` factory types, `@unchecked Sendable` for the resource handoff struct, and restructuring document loading to avoid actor boundary breaches. Smoke filters now pass under strict concurrency. (See `DOCS/INPROGRESS/235_Sendable_SmokeTest_Build_Failure.md`.) +#### DOCS/RULES/04_PDD.md:78 -## FoundationUI Integration +> Implement real authentication with DB -- [ ] Integrate lazy loading and state binding into `InspectorPattern` once detail editors are introduced so scroll performance remains predictable. (FoundationUI/Sources/FoundationUI/Patterns/InspectorPattern.swift) _(Planning archived at `DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/204_InspectorPattern_Lazy_Loading.md`.)_ -- [ ] Integrate snapshot-based verification for pattern integration once SwiftUI previews are available on CI runners. (FoundationUI/Tests/FoundationUITests/PatternsIntegrationTests/PatternIntegrationTests.swift) +--- -## NavigationSplitView Inspector (Task 243) +### Task #10` -- [x] #243 Wire the inspector toggle to a NavigationSplitView/NavigationSplitScaffold-backed three-column layout so ⌘βŒ₯I updates inspector visibility per DOCS/INPROGRESS/243_Reorganize_Navigation_SplitView_Inspector_Panel.md. (Sources/ISOInspectorApp/Tree/ParseTreeOutlineView.swift) -- [ ] #243 Split Selection Details into dedicated inspector subviews (metadata, corruption, encryption, notes, fields, validation, hex) to keep inspector scrolling predictable in the third column. (Sources/ISOInspectorApp/Inspector/InspectorDetailView.swift) -- [ ] Bug 246: Window width overflows when sidebar + detail + inspector are visible; constrain column widths or avoid simultaneous wide panes. See DOCS/INPROGRESS/246_Bug_NavigationSplit_Width_Overflow.md. +**Count:** 1 puzzle(s) -## FoundationUI Phase 1: Foundation Components (COMPLETE βœ…) +#### DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/Summary_of_Work.md:11 -- [x] #216 Task I1.1 β€” Badge & Status Indicators βœ… β€” Completed 2025-11-14 -- [x] #218 Task I1.2 β€” Card Containers & Sections βœ… β€” Completed 2025-11-14 -- [x] #219 Task I1.3 β€” Key-Value Rows & Metadata Display βœ… β€” Completed 2025-11-14 -- [x] #220 Task I1.4 β€” Form Controls & Input Wrappers βœ… β€” Implementation complete 2025-11-14 (FoundationUI integration deferred to Phase 2) -- [x] #221 Task I1.5 β€” Advanced Layouts & Navigation βœ… β€” Completed 2025-11-14 (Phase 1 FINAL TASK) +> for migrating to the final CoreData storage layer once research gap R6 lands. +> # References -### Phase 1 Follow-Up Work (Marked with @todo #220 and @todo #I1.5) +--- -- [ ] #220 Replace BoxToggleView placeholder with DS.Toggle from FoundationUI β€” Import FoundationUI DS.Toggle component, apply design tokens for spacing/colors, add platform-adaptive styling, verify accessibility compliance. (Sources/ISOInspectorApp/UI/Components/BoxToggleView.swift) -- [ ] #220 Replace BoxTextInputView placeholder with DS.TextInput from FoundationUI β€” Import FoundationUI DS.TextInput component, apply design tokens for padding/corners/shadows, add copyable text support via DS.Copyable, implement platform-adaptive keyboard types, enhance error state styling. (Sources/ISOInspectorApp/UI/Components/BoxTextInputView.swift) -- [ ] #220 Replace BoxPickerView placeholder with DS.Picker from FoundationUI β€” Import FoundationUI DS.Picker component, apply platform-adaptive styling (macOS: Segmented for ≀4 options, menu for >4; iOS: Segmented for ≀3 options, menu for >3; iPadOS: Follow iOS patterns with size class adaptation), integrate design tokens for spacing and sizing, add enhanced accessibility labels, support for custom option rendering (icons, colors). (Sources/ISOInspectorApp/UI/Components/BoxPickerView.swift) -- [ ] #220 Integrate snapshot testing library for FormControlsSnapshotTests β€” Add swift-snapshot-testing to Package.swift, replace placeholder XCTest assertions with assertSnapshot(...), generate baseline snapshots for all component variants (light/dark modes, all states). (Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift) -- [ ] #220 Integrate Accessibility Inspector APIs for FormControlsAccessibilityTests β€” Add XCTest accessibility API checks, implement color contrast testing (verify β‰₯4.5:1 for text, β‰₯3:1 for UI components), verify VoiceOver announcements programmatically, test Dynamic Type scaling without clipping, confirm Reduce Motion and High Contrast adaptations. (Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift) -- [ ] #220 Complete WCAG 2.1 AA compliance audit for form controls β€” Run comprehensive accessibility audit using Accessibility Inspector, achieve β‰₯98% accessibility score target, verify all WCAG 2.1 AA requirements (1.1.1 Non-text Content, 1.3.1 Info and Relationships, 1.4.1 Use of Color, 1.4.3 Contrast, 1.4.4 Resize Text, 2.1.1 Keyboard, 2.4.7 Focus Visible, 3.2.1 On Focus, 3.3.1 Error Identification, 4.1.2 Name Role Value, 4.1.3 Status Messages). (Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift) -- [ ] #I1.5 Complete ParseTreeDetailView migration β€” Migrate remaining section functions (encryptionSection, userNotesSection, fieldAnnotationSection, validationSection, hexSection) to use DS.Spacing and DS.Radius tokens. (Sources/ISOInspectorApp/Detail/ParseTreeDetailView.swift) -- [ ] #I1.5 Consider adding DS.Spacing.xxxs token β€” Evaluate whether adding `DS.Spacing.xxxs` (2pt) token is justified based on usage frequency in the codebase. (FoundationUI/Sources/FoundationUI/DesignTokens/Spacing.swift) -- [ ] #I1.5 Set up snapshot testing infrastructure β€” Integrate `swift-snapshot-testing` library and create baseline snapshots for all device sizes and color schemes. (Tests/ISOInspectorAppTests/FoundationUI/LayoutSnapshotTests.swift) +### Task #123 -## ComponentTestApp Lint Follow-ups +**Count:** 2 puzzle(s) -- [ ] #306 Split `MockISOBox.sampleISOHierarchy()` into smaller helpers to satisfy SwiftLint `function_body_length`. (Examples/ComponentTestApp/ComponentTestApp/Models/MockISOBox.swift:145) -- [ ] #307 Break `ContentView.destinationView` into smaller subviews to reduce SwiftLint `cyclomatic_complexity`. (Examples/ComponentTestApp/ComponentTestApp/ContentView.swift:203) -- [ ] #308 Re-enable SwiftLint `function_body_length` after fixing the current 67 violations and removing the global disable. (.swiftlint.yml) -- [ ] #309 Re-enable SwiftLint `cyclomatic_complexity` after cleaning up the current backlog and removing the global disable. (.swiftlint.yml) -- [ ] #311 Break `MP4RACatalogRefresher` into smaller components to satisfy SwiftLint `type_body_length`. (Sources/ISOInspectorKit/Metadata/MP4RACatalogRefresher.swift:84) +#### scripts/collect_todos.py:58 -## Task A7 SwiftLint Suppressions (Added 2025-12-03) +> description or @todo description -The following files received localized `swiftlint:disable` directives with PDD `@todo #a7` markers. These suppressions were added to achieve zero lint errors while deferring structural refactoring: +#### DOCS/RULES/04_PDD.md:27 -- [ ] #a7 Refactor EventConsoleFormatter: Break down 195-line struct into smaller formatting components. (Sources/ISOInspectorCLI/EventConsoleFormatter.swift:4) -- [ ] #a7 Refactor ISOInspectorCLIRunner: Break down 355-line enum into smaller command runner modules. (Sources/ISOInspectorCLI/CLI.swift:116) -- [ ] #a7 Refactor ISOInspectorCommand: Break down 780-line struct into smaller command modules. (Sources/ISOInspectorCLI/ISOInspectorCommand.swift:11) -- [ ] #a7 Refactor Commands enum: Break down 540-line enum into smaller command structures. (Sources/ISOInspectorCLI/ISOInspectorCommand.swift:306) -- [ ] #a7 Refactor Batch command: Break down 247-line struct into smaller validation modules. (Sources/ISOInspectorCLI/ISOInspectorCommand.swift:661) -- [ ] #a7 Refactor BoxParserRegistry: Break down 224-line struct into smaller parser registration modules. (Sources/ISOInspectorKit/ISO/BoxParserRegistry.swift:3) -- [ ] #a7 Reduce nesting: Extract SignedFixedPoint.Format enum to reduce nesting level. (Sources/ISOInspectorKit/ISO/ParsedBoxPayload.swift:1086) +> Short description of missing work -## Performance & Benchmarking +--- -- [ ] Execute the macOS 1 GiB lenient-vs-strict benchmark for Task T5.4 once hardware is available, exporting `ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824` before running `swift test --filter LargeFileBenchmarkTests/testCLIValidationLenientModePerformanceStaysWithinToleranceBudget`. (Tests/ISOInspectorPerformanceTests/LargeFileBenchmarkTests.swift) _(Step-by-step checklist lives in `DOCS/INPROGRESS/next_tasks.md`; historical notes archived at `DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/`.)_ - - **Hardware dependency:** Requires access to macOS hardware that can host the 1β€―GiB benchmark fixture; currently blocked per `DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/blocked.md` until that runner is provisioned. -- [x] #4 Integrate the `ResearchLogMonitor` audit with SwiftUI previews once VR-006 entries surface in the UI. (Sources/ISOInspectorKit/Validation/ResearchLogMonitor.swift) _(Completed β€” see `DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/194_ResearchLogMonitor_SwiftUIPreviews.md`.)_ -- [x] #T36 Resolve Integrity navigation filters, outline shortcuts, and issue-only toggle so tolerant parsing hand-offs stay focused. (Sources/ISOInspectorApp/Tree/ParseTreeOutlineView.swift) _(Completed β€” see `DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/200_T3_7_Integrity_Navigation_Filters.md`.)_ -- [x] #T5.2 Land tolerant traversal regression tests that exercise the corrupt fixture corpus and strict-mode guards. (Tests/ISOInspectorKitTests/TolerantTraversalRegressionTests.swift) _(Completed β€” see `DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/Summary_of_Work.md`.)_ -- [x] #T6.2 Surface tolerant-mode corruption summary metrics in the CLI output, including severity counts and deepest affected depth. (Sources/ISOInspectorCLI/Commands/InspectCommand.swift) _(Completed β€” see `DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/Summary_of_Work.md`.)_ +### Task #15 -## Task C22 β€” User Settings Panel: Persistence + Reset Wiring (Completed 2025-11-15) +**Count:** 2 puzzle(s) -**Status:** βœ… **COMPLETED** (5/7 puzzles fully implemented, 2/7 deferred with @todo markers) +#### DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/Summary_of_Work.md:16 -### ViewModel Integration & Data Layer βœ… +> β€” correlate `stsc`, `stsz/stz2`, and upcoming `stco/co64` data during validation once chunk offset parsing is available. -- [x] #222 Load actual permanent settings from UserPreferencesStore (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:31) _Completed β€” C22_ -- [x] #222 Load actual session settings from DocumentSessionController (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:32) _Completed β€” C22_ -- [x] #222 Call UserPreferencesStore.reset() to clear permanent settings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:48) _Completed β€” C22_ -- [x] #222 Reload permanent settings after reset (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:49) _Completed β€” C22_ -- [x] #222 Add resetSessionSettings() method (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:56) _Completed β€” C22_ -- [x] #222 Add updatePermanentSetting(key:value:) method (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:57) _Completed β€” C22_ -- [x] #222 Add updateSessionSetting(key:value:) method (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:58) _Completed β€” C22_ +#### DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/next_tasks.md:5 -### Data Model Extensions βœ… +> and track notes in `DOCS/INPROGRESS/C9_stsz_stz2_Sample_Size_Parser.md`.)* +> # πŸ”„ Follow-Ups from C5 `hdlr` Parser -- [x] #222 Add validation configuration properties to PermanentSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:64) _Completed β€” C22_ -- [x] #222 Add telemetry/logging verbosity properties to PermanentSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:65) _Completed β€” C22_ -- [x] #222 Add accessibility preferences to PermanentSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:66) _Completed β€” C22_ -- [x] #222 Add workspace scope properties to SessionSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:74) _Completed β€” C22_ -- [x] #222 Add pane layout properties to SessionSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:75) _Completed β€” C22_ -- [x] #222 Add temporary validation overrides to SessionSettings (Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:76) _Completed β€” C22_ +--- -### UI Controls & Presentation βœ… +### Task #15. -- [x] #222 Add validation preset controls to permanent settings section (Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:93) _Completed β€” C22_ -- [x] #222 Add telemetry/logging verbosity controls to permanent settings section (Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:94) _Completed β€” C22_ -- [x] #222 Add workspace scope controls to session settings section (Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:126) _Completed β€” C22_ -- [x] #222 Add pane layout controls to session settings section (Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:127) _Completed β€” C22_ -- [x] #222 Add advanced configuration controls to advanced settings section (Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:152) _Completed β€” C22_ +**Count:** 1 puzzle(s) -### Platform-Specific Enhancements ⏳ (Partial β€” Deferred) +#### DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/C10_stco_co64_Chunk_Offset_Parser.md:9 -- [ ] #222 Add detent support for iPad (.medium, .large) (Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:86) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Add fullScreenCover for iPhone (Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:87) _Deferred β€” marked with @todo #222 for future work_ +> (See [`ISOInspector_PRD_TODO.md`](../AI/ISOViewer/ISOInspector_PRD_TODO.md).) -### Testing & Accessibility ⏳ (Partial β€” Deferred) +--- -- [x] #222 Add validation preset control IDs to SettingsPanelAccessibilityID (Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:50) _Completed β€” C22_ -- [x] #222 Add telemetry/logging control IDs to SettingsPanelAccessibilityID (Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:51) _Completed β€” C22_ -- [x] #222 Add workspace scope control IDs to SettingsPanelAccessibilityID (Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:63) _Completed β€” C22_ -- [x] #222 Add pane layout control IDs to SettingsPanelAccessibilityID (Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:64) _Completed β€” C22_ -- [x] #222 Add advanced configuration control IDs to SettingsPanelAccessibilityID (Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:75) _Completed β€” C22_ -- [ ] #222 Migrate to proper XCUITest UI tests for full accessibility validation (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:12) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test VoiceOver focus order starts on first control (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:13) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test keyboard navigation between sections (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:14) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test Dynamic Type support (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:15) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Verify platform-specific accessibility identifiers (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:26) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test keyboard shortcut (⌘,) on macOS (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:27) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test VoiceOver announcements for state changes (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:28) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Add proper state change tests with XCTest expectations (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:42) _Deferred β€” marked with @todo #222 for future work_ -- [ ] #222 Test error message announcements for screen readers (Tests/ISOInspectorAppTests/UI/SettingsPanelAccessibilityTests.swift:43) _Deferred β€” marked with @todo #222 for future work_ - -### Summary - -See detailed completion report in: `DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/Summary_of_Work.md` +### Task #15` + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Summary_of_Work.md:11 + +> placeholder from the validator default rules. +> # Documentation & Tracking Updates + +--- + +### Task #220 + +**Count:** 33 puzzle(s) + +#### todo.md:44 + +> and @todo #I1.5) + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:28 + +> Integrate snapshot testing library +> Replace XCTest placeholders with actual snapshot assertions +> Example: assertSnapshot(matching: view, as: .image) + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:40 + +> Add snapshot assertion +> assertSnapshot(matching: toggle, as: .image, named: "toggle-light-on") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:51 + +> Add snapshot assertion +> assertSnapshot(matching: toggle, as: .image, named: "toggle-dark-on") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:62 + +> Add snapshot assertion +> assertSnapshot(matching: toggle, as: .image, named: "toggle-disabled") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:74 + +> Add snapshot assertion +> assertSnapshot(matching: input, as: .image, named: "textinput-empty") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:84 + +> Add snapshot assertion +> assertSnapshot(matching: input, as: .image, named: "textinput-filled") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:96 + +> Add snapshot assertion +> assertSnapshot(matching: input, as: .image, named: "textinput-error") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:107 + +> Add snapshot assertion +> assertSnapshot(matching: input, as: .image, named: "textinput-light") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:118 + +> Add snapshot assertion +> assertSnapshot(matching: input, as: .image, named: "textinput-dark") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:135 + +> Add snapshot assertion +> assertSnapshot(matching: picker, as: .image, named: "picker-segmented") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:151 + +> Add snapshot assertion +> assertSnapshot(matching: picker, as: .image, named: "picker-menu") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:164 + +> Add snapshot assertion +> assertSnapshot(matching: picker, as: .image, named: "picker-light") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:177 + +> Add snapshot assertion +> assertSnapshot(matching: picker, as: .image, named: "picker-dark") +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:194 + +> Add snapshot assertions for macOS-specific styling +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsSnapshotTests.swift:209 + +> Add snapshot assertions for iOS-specific styling +> Placeholder test: Awaiting snapshot testing implementation + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:41 + +> Add XCTest accessibility API checks + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:56 + +> Verify accessibility label via accessibility inspector + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:72 + +> Verify accessibility value changes + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:89 + +> Verify accessibility error announcement + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:106 + +> Verify accessibility label includes selection + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:127 + +> Add snapshot test for each size category +> assertSnapshot(matching: toggle, as: .image, named: "toggle-\(category)") +> Placeholder test: Component structure supports Dynamic Type + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:145 + +> Verify no text clipping at large sizes +> Placeholder test: Component structure supports Dynamic Type + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:166 + +> Verify picker options readable at all sizes +> Placeholder test: Component structure supports Dynamic Type + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:176 + +> Integrate color contrast testing +> Use Accessibility Inspector API to verify: +> - Normal text: β‰₯4.5:1 contrast ratio +> - Large text: β‰₯3:1 contrast ratio +> - UI components: β‰₯3:1 contrast ratio + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:203 + +> Verify error red has β‰₯4.5:1 contrast on background + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:213 + +> Verify no animations when reduceMotion is enabled +> All transitions should be instant when user enables Reduce Motion +> Note: accessibilityReduceMotion is a read-only environment value +> that reflects system settings. Full testing requires UI tests or +> snapshot tests with simulated accessibility settings. + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:238 + +> Verify enhanced contrast in High Contrast mode +> Borders, separators, and focus indicators should be more prominent +> Note: accessibilityDifferentiateWithoutColor is a read-only environment value +> that reflects system settings. Full testing requires UI tests or +> snapshot tests with simulated accessibility settings. + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:263 + +> Verify keyboard navigation via UI testing +> - Tab moves focus to next control +> - Shift+Tab moves focus to previous control +> - Space activates toggles and opens pickers +> - Return submits forms +> - Escape dismisses pickers +> Note: Full keyboard navigation testing requires XCUITest integration +> These unit tests verify component structure supports keyboard access + +#### Tests/ISOInspectorAppTests/FoundationUI/FormControlsAccessibilityTests.swift:280 + +> Run comprehensive accessibility audit +> Target: β‰₯98% accessibility score + +#### Sources/ISOInspectorApp/UI/Components/BoxToggleView.swift:79 + +> Replace with DS.Toggle from FoundationUI +> Current implementation uses native SwiftUI Toggle as placeholder +> Next steps: +> 1. Import FoundationUI DS.Toggle component +> 2. Apply design tokens for spacing/colors +> 3. Add platform-adaptive styling +> 4. Verify accessibility compliance + +#### Sources/ISOInspectorApp/UI/Components/BoxPickerView.swift:89 + +> Replace with DS.Picker from FoundationUI +> Current implementation uses native SwiftUI Picker as placeholder +> Next steps: +> 1. Import FoundationUI DS.Picker component +> 2. Apply platform-adaptive styling: +> - macOS: Segmented for ≀4 options, menu for >4 +> - iOS: Segmented for ≀3 options, menu for >3 +> - iPadOS: Follow iOS patterns with size class adaptation +> 3. Integrate design tokens for spacing and sizing +> 4. Add enhanced accessibility labels +> 5. Support for custom option rendering (icons, colors) + +#### Sources/ISOInspectorApp/UI/Components/BoxTextInputView.swift:111 + +> Replace with DS.TextInput from FoundationUI +> Current implementation uses native SwiftUI TextField as placeholder +> Next steps: +> 1. Import FoundationUI DS.TextInput component +> 2. Apply design tokens for padding/corners/shadows +> 3. Add copyable text support via DS.Copyable +> 4. Platform-adaptive keyboard types +> 5. Enhanced error state styling + +--- + +### Task #220` + +**Count:** 2 puzzle(s) + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work.md:62 + +> markers for snapshot library integration + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work.md:120 + +> markers in code: +> ## FoundationUI Integration (Next Steps) + +--- + +### Task #221 + +**Count:** 2 puzzle(s) + +#### Tests/ISOInspectorAppTests/ResearchLogAccessibilityIdentifierTests.swift:24 + +> Migrate to proper XCUITest UI tests +> 1. Create a dedicated UITests target in Project.swift +> 2. Rewrite tests using XCUIApplication for proper UI testing +> 3. Benefits: Works on iOS/macOS, tests actual accessibility, more reliable + +#### Tests/ISOInspectorAppTests/ParseTreeAccessibilityIdentifierTests.swift:25 + +> Migrate to proper XCUITest UI tests +> 1. Create a dedicated UITests target in Project.swift +> 2. Rewrite tests using XCUIApplication for proper UI testing +> 3. Benefits: Works on iOS/macOS, tests actual accessibility, more reliable + +--- + +### Task #222 + +**Count:** 50 puzzle(s) + +#### todo.md:118 + +> for future work_ + +#### todo.md:119 + +> for future work_ +> ## Testing & Accessibility ⏳ (Partial β€” Deferred) + +#### todo.md:128 + +> for future work_ + +#### todo.md:129 + +> for future work_ + +#### todo.md:130 + +> for future work_ + +#### todo.md:131 + +> for future work_ + +#### todo.md:132 + +> for future work_ + +#### todo.md:133 + +> for future work_ + +#### todo.md:134 + +> for future work_ + +#### todo.md:135 + +> for future work_ + +#### todo.md:136 + +> for future work_ +> ## Summary + +#### DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks.md:38 + +> for future work + +#### DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks.md:40 + +> for future work + +#### Tests/ISOInspectorAppTests/SettingsPanelAccessibilityTests.swift:104 + +> Add VoiceOver focus order tests + +#### Tests/ISOInspectorAppTests/SettingsPanelAccessibilityTests.swift:105 + +> Add keyboard navigation tests (⌘, shortcut) + +#### Tests/ISOInspectorAppTests/SettingsPanelAccessibilityTests.swift:106 + +> Add Dynamic Type scaling tests + +#### Tests/ISOInspectorAppTests/SettingsPanelAccessibilityTests.swift:107 + +> Add Reduce Motion compliance tests + +#### Tests/ISOInspectorAppTests/UI/SettingsPanelViewModelTests.swift:106 + +> Add tests with mock DocumentSessionController for session settings integration + +#### Tests/ISOInspectorAppTests/UI/SettingsPanelViewModelTests.swift:107 + +> Test selectValidationPreset with both .global and .workspace scopes + +#### Tests/ISOInspectorAppTests/UI/SettingsPanelViewModelTests.swift:108 + +> Test setValidationRule with both scopes + +#### Tests/ISOInspectorAppTests/UI/SettingsPanelViewModelTests.swift:109 + +> Test hasSessionOverrides badge indicator when workspace differs from global + +#### Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:55 + +> Add validation preset control IDs + +#### Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:56 + +> Add telemetry/logging control IDs + +#### Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:68 + +> Add workspace scope control IDs + +#### Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:69 + +> Add pane layout control IDs + +#### Sources/ISOInspectorApp/Accessibility/SettingsPanelAccessibilityID.swift:80 + +> Add advanced configuration control IDs + +#### Sources/ISOInspectorApp/Models/UserPreferences.swift:29 + +> Add panel frame persistence for macOS floating window position + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:58 + +> Emit diagnostic event via E6 diagnostics logging + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:81 + +> Emit diagnostic event via E6 diagnostics logging + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:101 + +> Emit diagnostic event via E6 diagnostics logging +> Revert UI state on failure + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:166 + +> Add workspace scope properties (per document vs. shared) + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:167 + +> Add pane layout properties + +#### Sources/ISOInspectorApp/UI/ViewModels/SettingsPanelViewModel.swift:168 + +> Add recently opened tabs + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:13 + +> Replace with proper dependency injection from app-level +> Currently uses in-memory mock store; production needs real FileBackedUserPreferencesStore + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:29 + +> Replace sheet with NSPanel window controller for floating window behavior + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:30 + +> Remember panel frame/position in UserPreferences + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:31 + +> NSPanel benefits: always-on-top, floating, better positioning control + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:83 + +> Add detent support for iPad (.medium, .large) + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:84 + +> Add fullScreenCover for iPhone based on horizontalSizeClass + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:85 + +> Platform detection: if UIDevice.current.userInterfaceIdiom == .pad + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:142 + +> Add CommandGroup to ISOInspectorApp for Settings menu item with ⌘, shortcut + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:143 + +> Wire isSettingsPanelPresented state through AppShellView + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:144 + +> Implement focus restoration when panel toggles + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:145 + +> Test keyboard shortcut across macOS, iPad, iPhone + +#### Sources/ISOInspectorApp/UI/Scenes/SettingsPanelScene.swift:161 + +> Replace with proper dependency injection of FileBackedUserPreferencesStore from app level + +#### Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:86 + +> Add validation preset controls + +#### Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:87 + +> Add telemetry/logging verbosity controls + +#### Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:124 + +> Add workspace scope controls + +#### Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:125 + +> Add pane layout controls + +#### Sources/ISOInspectorApp/UI/Components/SettingsPanelView.swift:170 + +> Add advanced configuration controls + +--- + +### Task #222` + +**Count:** 4 puzzle(s) + +#### DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work.md:126 + +> markers for future test scenarios + +#### DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work.md:231 + +> comments + +#### DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work.md:372 + +> markers keep code shippable while documenting debt + +#### DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/222_C21_Floating_Settings_Panel.md:109 + +> or defer to Phase 2 + +--- + +### Task #222`) + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY.md:1490 + +> for incomplete work + +--- + +### Task #230 + +**Count:** 1 puzzle(s) + +#### FoundationUI/Sources/FoundationUI/Utilities/AccessibilityHelpers.swift:439 + +> Refactor to reduce cyclomatic complexity (currently 18, target: ≀15) +> swiftlint:disable:next cyclomatic_complexity + +--- + +### Task #231 + +**Count:** 1 puzzle(s) + +#### FoundationUI/Sources/FoundationUI/AgentSupport/YAMLValidator.swift:1 + +> Refactor YAMLValidator to reduce type/function body length and complexity + +--- + +### Task #231**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:201 + +> Refactor YAMLValidator to reduce type/function body length and complexity + +--- + +### Task #232**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:202 + +> Refactor generateCard to reduce cyclomatic complexity (currently 17, target: ≀15) + +--- + +### Task #233 + +**Count:** 1 puzzle(s) + +#### FoundationUI/Sources/FoundationUI/Patterns/BoxTreePattern.swift:1 + +> Fix BoxTreePattern preview trailing closures and indentation issues + +--- + +### Task #233**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:203 + +> Fix BoxTreePattern preview trailing closures and indentation issues + +--- + +### Task #234 + +**Count:** 1 puzzle(s) + +#### FoundationUI/Sources/FoundationUI/Patterns/ToolbarPattern.swift:1 + +> Fix ToolbarPattern closure parameter positions +> swiftlint:disable closure_parameter_position + +--- + +### Task #234**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:204 + +> Fix ToolbarPattern closure parameter positions + +--- + +### Task #235 + +**Count:** 1 puzzle(s) + +#### FoundationUI/Sources/FoundationUI/Utilities/AccessibilityHelpers.swift:1 + +> Fix AccessibilityHelpers closure parameter positions in previews +> swiftlint:disable closure_parameter_position + +--- + +### Task #235**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:205 + +> Fix AccessibilityHelpers closure parameter positions in previews + +--- + +### Task #236 + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/TASK_ARCHIVE/35_Phase4.2_UtilitiesPerformance/Tests/UtilitiesPerformanceTests.swift:1 + +> Split UtilitiesPerformanceTests into smaller test classes + +--- + +### Task #236**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:206 + +> Split UtilitiesPerformanceTests into smaller test classes +> ## Tooling + +--- + +### Task #237 + +**Count:** 2 puzzle(s) + +#### .pre-commit-config.yaml:83 + +> Consider adding swift-format integration after installing tool +> - id: swift-format-all +> name: Swift Format (Auto-format) +> entry: swift format --in-place +> language: system +> types: [swift] +> stages: [pre-commit] +> description: Auto-format Swift files with swift-format before commit + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:92 + +> Consider adding swift-format integration after installing tool +> - id: swift-format-all (commented out) + +--- + +### Task #237**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:209 + +> Consider adding swift-format integration after installing tool + +--- + +### Task #238 + +**Count:** 2 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:158 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line enum cases +> swiftlint:disable indentation_width + +#### FoundationUI/Sources/FoundationUI/AgentSupport/YAMLValidator.swift:2 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line enum cases + +--- + +### Task #238**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:210 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line enum cases + +--- + +### Task #239 + +**Count:** 2 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:164 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line if conditions +> swiftlint:disable indentation_width + +#### FoundationUI/Sources/FoundationUI/Components/Indicator.swift:1 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line if conditions +> swiftlint:disable indentation_width + +--- + +### Task #239**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:211 + +> Fix SwiftFormat/SwiftLint indentation conflict for multi-line if conditions +> ## Cleanup + +--- + +### Task #240 + +**Count:** 3 puzzle(s) + +#### .pre-commit-config.yaml:15 + +> Re-enable check-added-large-files after cleaning up DOCS/INPROGRESS/*.log files +> - id: check-added-large-files +> name: Check for large files +> args: ['--maxkb=1000'] +> description: Prevent accidentally committing large files +> stages: [pre-commit] + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:100 + +> Re-enable check-added-large-files after cleaning up DOCS/INPROGRESS/*.log files +> - id: check-added-large-files (commented out) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README.md:5 + +> Cleanup Large Log Files + +--- + +### Task #240**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:214 + +> Re-enable check-added-large-files after cleaning up DOCS/INPROGRESS/*.log files +> ## Hooks + +--- + +### Task #241 + +**Count:** 3 puzzle(s) + +#### .pre-commit-config.yaml:73 + +> Re-enable swift-build-foundationui after fixing YAMLValidator test API changes +> - id: swift-build-foundationui +> name: Swift Build (FoundationUI) +> entry: sh -c 'cd FoundationUI && swift build && echo "Build successful"' +> language: system +> files: ^FoundationUI/.*\.swift$ +> types: [swift] +> stages: [pre-push] +> description: Verify FoundationUI builds successfully before push + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:123 + +> Re-enable swift-build-foundationui after fixing YAMLValidator test API changes +> - id: swift-build-foundationui (commented out) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README.md:22 + +> Re-enable Swift Build Pre-Push Hook + +--- + +### Task #241**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:217 + +> Re-enable swift-build-foundationui pre-push hook + +--- + +### Task #241, + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:285 + +> #242) + +--- + +### Task #242 + +**Count:** 3 puzzle(s) + +#### .pre-commit-config.yaml:92 + +> Re-enable swift-test-foundationui after fixing YAMLValidator.validate() -> validateComponent()/validateComponents() +> - id: swift-test-foundationui +> name: Swift Tests (FoundationUI) +> entry: sh -c 'cd FoundationUI && swift test' +> language: system +> files: ^FoundationUI/(Sources|Tests)/.*\.swift$ +> types: [swift] +> stages: [pre-push] +> description: Run unit tests before push +> Git hooks for commit messages + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:126 + +> Re-enable swift-test-foundationui after fixing YAMLValidator.validate() calls +> - id: swift-test-foundationui (commented out) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README.md:26 + +> Fix YAMLValidator Test API + +--- + +### Task #242**: + +**Count:** 1 puzzle(s) + +#### FoundationUI/DOCS/INPROGRESS/SwiftLint_PreCommit_Fixes_Summary.md:218 + +> Re-enable swift-test-foundationui pre-push hook +> - +> # Files Modified +> ## Configuration Files + +--- + +### Task #2` + +**Count:** 3 puzzle(s) + +#### DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/07_R1_MP4RA_Catalog_Refresh.md:62 + +> complete in code and `todo.md`. + +#### DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/Summary_of_Work.md:16 + +> (Research Task R1). +> # Validation + +#### DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work.md:16 + +> to track automation of MP4RA catalog refreshes and mirrored it in `todo.md`. +> # Follow-Ups + +--- + +### Task #2`) + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work.md:20 + +> via R1 (`DOCS/INPROGRESS/07_R1_MP4RA_Catalog_Refresh.md`). + +--- + +### Task #3 + +**Count:** 2 puzzle(s) + +#### DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/next_tasks.md:4 + +> priorities. + +#### DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/next_tasks.md:4 + +> priorities. + +--- + +### Task #306 + +**Count:** 1 puzzle(s) + +#### Examples/ComponentTestApp/ComponentTestApp/Models/MockISOBox.swift:146 + +> Split sampleISOHierarchy into smaller helpers to satisfy SwiftLint function_body_length + +--- + +### Task #307 + +**Count:** 1 puzzle(s) + +#### Examples/ComponentTestApp/ComponentTestApp/ContentView.swift:204 + +> Break destinationView into smaller subviews to lower cyclomatic_complexity + +--- + +### Task #308 + +**Count:** 1 puzzle(s) + +#### .swiftlint.yml:1 + +> Re-enable function_body_length after reducing the current 67 violations + +--- + +### Task #309 + +**Count:** 1 puzzle(s) + +#### .swiftlint.yml:2 + +> Re-enable cyclomatic_complexity after addressing the current violation backlog + +--- + +### Task #311 + +**Count:** 1 puzzle(s) + +#### Sources/ISOInspectorKit/Metadata/MP4RACatalogRefresher.swift:82 + +> Split MP4RACatalogRefresher into smaller components to satisfy type_body_length +> swiftlint:disable:next type_body_length + +--- + +### Task #3` + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/Summary_of_Work.md:7 + +> for implementing the remaining validation rules and documented CLI wiring needs in `DOCS/INPROGRESS/next_tasks.md`. +> # Testing + +--- + +### Task #42 + +**Count:** 2 puzzle(s) + +#### FoundationUI/DOCS/COMMANDS/ARCHIVE.md:255 + +> Add Dark Mode color variants +> After (if implemented): +> (comment removed, code now handles Dark Mode) + +#### FoundationUI/DOCS/COMMANDS/START.md:219 + +> Add Dark Mode color variants for warning badge + +--- + +### Task #6` + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/C2_Extend_Outline_Filters.md:20 + +> comment about category and streaming metadata toggles.\ + +--- + +### Task #8` + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/27_F1_Expand_Fixture_Catalog.md:14 + +> to expand fixture coverage with fragmented, DASH, and malformed assets plus validation notes, and it is the only upcoming task currently queued.【F:todo.md†L1-L15】【F:DOCS/INPROGRESS/next_tasks.md†L1-L3】 + +--- + +### Task #8`), + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY.md:160 + +> now tracked in `DOCS/INPROGRESS/next_tasks.md`. +> # 27_F1_Expand_Fixture_Catalog + +--- + +### Task #9` + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/29_D3_CLI_Export_Commands.md:15 + +> placeholder with concrete command handling and help text.【F:Sources/ISOInspectorCLI/CLI.swift†L68-L101】 +> # βœ… Success Criteria + +--- + +### Task # + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:84 + +> Description of missing work + +--- + +### Task #A7 + +**Count:** 20 puzzle(s) + +#### .swiftlint.yml:44 + +> Refactor the remaining oversized types (JSONParseTreeExporter.swift, +> BoxValidator.swift, DocumentSessionController.swift) so the local suppressions can +> be removed while keeping type bodies under 200 lines each. + +#### scripts/README.md:47 + +> Refactor this file to comply with complexity threshold +> Additional context can be provided on continuation lines. +> The script will capture all indented lines as part of the puzzle. + +#### scripts/collect_todos.py:201 + +> description`).", + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds.md:148 + +> Consider extracting flag interpretation into helper methods. +> swiftlint:disable:next cyclomatic_complexity function_body_length + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:32 + +> Consider refactoring into smaller domain-specific payload groups if the enum continues to grow. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:37 + +> Consider extracting bookmark management, recent files management, and parse pipeline coordination into separate services. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:42 + +> Consider extracting box-type-specific formatters if complexity grows beyond current threshold. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:47 + +> Consider grouping parser registrations by box category (media, metadata, fragments) if complexity increases. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:52 + +> Consider extracting flag interpretation and optional field parsing into separate helper methods. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:57 + +> Consider extracting version-specific field parsing into helper methods. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:62 + +> Consider extracting entry parsing loop into a separate helper method. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:67 + +> Consider code generation or protocol-based approach if detail types continue to grow. + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:74 + +> Consider splitting into multiple test files by functional area (e.g., ParsePipelineContainersTests, ParsePipelineFragmentsTests). + +#### Tests/ISOInspectorKitTests/ParsePipelineLiveTests.swift:7 + +> Consider splitting into multiple test files by functional area (e.g., ParsePipelineContainersTests, ParsePipelineFragmentsTests). +> swiftlint:disable:next type_body_length + +#### Sources/ISOInspectorCLI/EventConsoleFormatter.swift:45 + +> Consider extracting box-type-specific formatters if complexity grows beyond current threshold. +> swiftlint:disable:next cyclomatic_complexity + +#### Sources/ISOInspectorKit/ISO/BoxParserRegistry+TrackHeader.swift:5 + +> Consider extracting version-specific field parsing into helper methods. +> swiftlint:disable:next function_body_length + +#### Sources/ISOInspectorKit/ISO/ParsedBoxPayload.swift:7 + +> Consider refactoring into smaller domain-specific payload groups if the enum continues to grow. +> swiftlint:disable:next type_body_length + +#### Sources/ISOInspectorKit/ISO/BoxParserRegistry+MovieFragments.swift:233 + +> Consider extracting flag interpretation and optional field parsing into separate helper methods. +> swiftlint:disable:next cyclomatic_complexity function_body_length + +#### Sources/ISOInspectorKit/ISO/BoxParserRegistry+RandomAccess.swift:45 + +> Consider extracting entry parsing loop into a separate helper method. +> swiftlint:disable:next function_body_length + +#### Sources/ISOInspectorKit/ISO/BoxParserRegistry+DefaultParsers.swift:6 + +> Consider grouping parser registrations by box category (media, metadata, fragments) if complexity increases. +> swiftlint:disable:next cyclomatic_complexity + +--- + +### Task #A7" + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:104 + +> Sources Tests +> Result: 9 matches (all converted) + +--- + +### Task #A7:** + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds.md:143 + +> Refactoring strategy for future improvement (following PDD format) + +--- + +### Task #A7` + +**Count:** 4 puzzle(s) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds.md:153 + +> markers for automated tracking. +> ## Step 5: Verification & Docs + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:3 + +> format (Puzzle-Driven Development) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:21 + +> markers + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:139 + +> format. The codebase now follows consistent puzzle-driven development practices for task tracking. + +--- + +### Task #A7`) + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md:12 + +> to enable automated task tracking and synchronization with `todo.md`. +> - +> # βœ… Conversion Complete + +--- + +### Task #I1.1 + +**Count:** 18 puzzle(s) + +#### DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY.md:1227 + +> comment in ParseTreeOutlineView.swift:550-552 for potential `DS.Indicator` usage in tree view nodes + +#### DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY.md:1228 + +> comment in ParseTreeDetailView.swift:138-139 for inline status in metadata rows + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:1 + +> Indicator Integration + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:4 + +> β€” Integrate DS.Indicator in ISOInspectorApp + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:30 + +> markers resolved:** + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:80 + +> comment + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:86 + +> comment + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:101 + +> puzzles + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:181 + +> markers in both ParseTreeDetailView.swift and + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:189 + +> markers in ISOInspectorApp source code resolved** + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators.md:30 + +> for future consideration) + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators.md:106 + +> comments for future DS.Indicator usage + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators.md:109 + +> comment for future DS.Indicator usage in metadata rows + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:50 + +> comments** marking potential future enhancements: + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:68 + +> for future consideration when compact dot-style indicators are needed +> ## Additional Wrapper Components + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:116 + +> comment for future DS.Indicator usage + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:119 + +> comment for future DS.Indicator usage in metadata rows +> ## Documentation Changes + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:172 + +> puzzles marking future enhancement opportunities + +--- + +### Task #I1.1** + +**Count:** 2 puzzle(s) + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:199 + +> β€” Evaluate DS.Indicator for compact tree view status indicators + +#### DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md:200 + +> β€” Consider DS.Indicator for inline metadata row status +> - +> # πŸ“š References + +--- + +### Task #I1.1: + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md:166 + +> Add DS.Indicator to parse tree status displays + +--- + +### Task #I1.5` + +**Count:** 2 puzzle(s) + +#### DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work.md:51 + +> markers for spacing: 2 (no token available yet) + +#### DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work.md:81 + +> for spacing: 2 in row content VStack +> - +> ## 4. Refactored ParseTreeDetailView.swift + +--- + +### Task #T36-001 + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements.md:39 + +> Implement offset-based sorting + +--- + +### Task #T36-002 + +**Count:** 1 puzzle(s) + +#### DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements.md:44 + +> Implement affected node sorting + +--- + +### Task #TaskID + +**Count:** 1 puzzle(s) + +#### DOCS/COMMANDS/SELECT_NEXT.md:37 + +> description` comments from code, group by task ID, and generate a sorted Markdown report. Use this to discover code-level tasks that may not be in planning documents. + +--- + +### Task #a7 + +**Count:** 7 puzzle(s) + +#### Sources/ISOInspectorCLI/EventConsoleFormatter.swift:2 + +> Refactor EventConsoleFormatter: Break down 195-line struct into smaller formatting components + +#### Sources/ISOInspectorCLI/ISOInspectorCommand.swift:12 + +> Refactor ISOInspectorCommand: Break down 780-line struct into smaller command modules + +#### Sources/ISOInspectorCLI/ISOInspectorCommand.swift:306 + +> Refactor Commands enum: Break down 540-line enum into smaller command structures + +#### Sources/ISOInspectorCLI/ISOInspectorCommand.swift:660 + +> Refactor Batch command: Break down 247-line struct into smaller validation modules + +#### Sources/ISOInspectorCLI/CLI.swift:117 + +> Refactor ISOInspectorCLIRunner: Break down 355-line enum into smaller command runner modules + +#### Sources/ISOInspectorKit/ISO/ParsedBoxPayload.swift:2 + +> Reduce nesting: Extract SignedFixedPoint to reduce nesting level from 5 to 4 + +#### Sources/ISOInspectorKit/ISO/BoxParserRegistry.swift:2 + +> Refactor BoxParserRegistry: Break down 224-line struct into smaller parser registration modules + +--- + +### Task #a7` + +**Count:** 2 puzzle(s) + +#### todo.md:66 + +> markers. These suppressions were added to achieve zero lint errors while deferring structural refactoring: + +#### DOCS/TASK_ARCHIVE/235_Resolved_Tasks_Batch/A7_SwiftLint_Complexity_Thresholds.md:134 + +> markers: + +--- + +## Unnumbered Tasks + +Tasks without explicit task IDs. Consider adding task IDs for better tracking. + +### .swiftlint.yml + +**Line 26:** + +> markers + +--- + +### DOCS/RULES/04_PDD.md + +**Line 43:** + +> comments in the code. + +**Line 93:** + +> removed, the agent updates todo.md: + +--- + +### DOCS/RULES/agent-system-prompt.md + +**Line 83:** + +> PDD:30min Replace temporary parsing with ISOInspectorKit.MP4.Reader once box offsets API is stable. +> Details: this path still uses a local scanner; see DOCS/INPROGRESS/2025-10-xx-mp4-reader-adoption.md + +**Line 90:** + +> PDD: